xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/misc/misleading-bidirectional.cpp (revision 89a1d03e2b379e325daa5249411e414bbd995b5e)
1*89a1d03eSRichard // RUN: %check_clang_tidy %s misc-misleading-bidirectional %t
2*89a1d03eSRichard 
func(void)3*89a1d03eSRichard void func(void) {
4*89a1d03eSRichard   int admin = 0;
5*89a1d03eSRichard   /*‮ }⁦if(admin)⁩ ⁦ begin*/
6*89a1d03eSRichard   // CHECK-MESSAGES: :[[#@LINE-1]]:3: warning: comment contains misleading bidirectional Unicode characters [misc-misleading-bidirectional]
7*89a1d03eSRichard   const char msg[] = "‮⁦if(admin)⁩ ⁦tes";
8*89a1d03eSRichard   // CHECK-MESSAGES: :[[#@LINE-1]]:22: warning: string literal contains misleading bidirectional Unicode characters [misc-misleading-bidirectional]
9*89a1d03eSRichard }
10*89a1d03eSRichard 
all_fine(void)11*89a1d03eSRichard void all_fine(void) {
12*89a1d03eSRichard   char valid[] = "some‮valid‬sequence";
13*89a1d03eSRichard   /* EOL ends bidi‮ sequence
14*89a1d03eSRichard    * end it's fine to do so.
15*89a1d03eSRichard    * EOL ends ⁧isolate too
16*89a1d03eSRichard    */
17*89a1d03eSRichard }
18*89a1d03eSRichard 
invalid_utf_8(void)19*89a1d03eSRichard int invalid_utf_8(void) {
20*89a1d03eSRichard   bool isAdmin = false;
21*89a1d03eSRichard 
22*89a1d03eSRichard   // the comment below contains an invalid utf8 character, but should still be
23*89a1d03eSRichard   // processed.
24*89a1d03eSRichard 
25*89a1d03eSRichard   // CHECK-MESSAGES: :[[#@LINE+1]]:3: warning: comment contains misleading bidirectional Unicode characters [misc-misleading-bidirectional]
26*89a1d03eSRichard   /*€‮ } ⁦if (isAdmin)⁩ ⁦ begin admins only */
27*89a1d03eSRichard   return 1;
28*89a1d03eSRichard   /* end admins only ‮ { ⁦*/
29*89a1d03eSRichard   // CHECK-MESSAGES: :[[#@LINE-1]]:3: warning: comment contains misleading bidirectional Unicode characters [misc-misleading-bidirectional]
30*89a1d03eSRichard   return 0;
31*89a1d03eSRichard }
32*89a1d03eSRichard 
33*89a1d03eSRichard // CHECK-MESSAGES: :[[#@LINE+1]]:19: warning: string literal contains misleading bidirectional Unicode characters [misc-misleading-bidirectional]
34*89a1d03eSRichard char invalid1[] = "‮⁦‬⁩";
35*89a1d03eSRichard 
36*89a1d03eSRichard // Test that segment and paragraph separator correctly reset the state
37*89a1d03eSRichard char valid1[] = R"||(‮
38*89a1d03eSRichard ‮�‮‮)||";
39*89a1d03eSRichard 
40