xref: /aosp_15_r20/external/clang/test/FixIt/fixit-unicode.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // This file contains code and checks, that should work on any platform.
2*67e74705SXin Li // There's a set of additional checks for systems with proper support of UTF-8
3*67e74705SXin Li // on the standard output in fixit-unicode-with-utf8-output.c.
4*67e74705SXin Li 
5*67e74705SXin Li // RUN: not %clang_cc1 -fsyntax-only %s 2>&1 | FileCheck -strict-whitespace %s
6*67e74705SXin Li // RUN: not %clang_cc1 -fsyntax-only -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck -check-prefix=CHECK-MACHINE %s
7*67e74705SXin Li 
8*67e74705SXin Li struct Foo {
9*67e74705SXin Li   int bar;
10*67e74705SXin Li };
11*67e74705SXin Li 
12*67e74705SXin Li // PR13312
test1()13*67e74705SXin Li void test1() {
14*67e74705SXin Li   struct Foo foo;
15*67e74705SXin Li   foo.bar = 4216*67e74705SXin Li // CHECK: error: non-ASCII characters are not allowed outside of literals and identifiers
17*67e74705SXin Li // CHECK: {{^              \^}}
18*67e74705SXin Li // CHECK: error: expected ';' after expression
19*67e74705SXin Li // Make sure we emit the fixit right in front of the snowman.
20*67e74705SXin Li // CHECK: {{^              \^}}
21*67e74705SXin Li // CHECK: {{^              ;}}
22*67e74705SXin Li 
23*67e74705SXin Li // CHECK-MACHINE: fix-it:"{{.*}}":{[[@LINE-8]]:15-[[@LINE-8]]:18}:""
24*67e74705SXin Li // CHECK-MACHINE: fix-it:"{{.*}}":{[[@LINE-9]]:15-[[@LINE-9]]:15}:";"
25*67e74705SXin Li }
26*67e74705SXin Li 
27*67e74705SXin Li 
28*67e74705SXin Li int printf(const char *, ...);
test2()29*67e74705SXin Li void test2() {
30*67e74705SXin Li   printf("∆: %d", 1L);
31*67e74705SXin Li // CHECK: warning: format specifies type 'int' but the argument has type 'long'
32*67e74705SXin Li // Don't crash emitting a fixit after the delta.
33*67e74705SXin Li // CHECK:  printf("
34*67e74705SXin Li // CHECK: : %d", 1L);
35*67e74705SXin Li // Unfortunately, we can't actually check the location of the printed fixit,
36*67e74705SXin Li // because different systems will render the delta differently (either as a
37*67e74705SXin Li // character, or as <U+2206>.) The fixit should line up with the %d regardless.
38*67e74705SXin Li 
39*67e74705SXin Li // CHECK-MACHINE: fix-it:"{{.*}}":{[[@LINE-9]]:16-[[@LINE-9]]:18}:"%ld"
40*67e74705SXin Li }
41*67e74705SXin Li 
test3()42*67e74705SXin Li void test3() {
43*67e74705SXin Li   intssss = 42;
44*67e74705SXin Li   int a = กsss; // expected-error{{use of undeclared identifier 'กsss'; did you mean 'กssss'?}}
45*67e74705SXin Li // CHECK: {{^          \^}}
46*67e74705SXin Li // CHECK: {{^          [^ ]+ssss}}
47*67e74705SXin Li // CHECK-MACHINE: fix-it:"{{.*}}":{[[@LINE-3]]:11-[[@LINE-3]]:17}:"\340\270\201ssss"
48*67e74705SXin Li 
49*67e74705SXin Li   int ssss = 42;
50*67e74705SXin Li   int b = sss; // expected-error{{use of undeclared identifier 'ssกs'; did you mean 'ssกss'?}}
51*67e74705SXin Li // CHECK: {{^          \^}}
52*67e74705SXin Li // CHECK: {{^          ss.+ss}}
53*67e74705SXin Li // CHECK-MACHINE: fix-it:"{{.*}}":{[[@LINE-3]]:11-[[@LINE-3]]:17}:"ss\340\270\201ss"
54*67e74705SXin Li 
55*67e74705SXin Li   int s一二三 = 42;
56*67e74705SXin Li   int b一二三四五六七 = ss一二三; // expected-error{{use of undeclared identifier 'ss一二三'; did you mean 's一二三'?}}
57*67e74705SXin Li // CHECK-MACHINE: fix-it:"{{.*}}":{[[@LINE-1]]:32-[[@LINE-1]]:43}:"s\344\270\200\344\272\214\344\270\211"
58*67e74705SXin Li 
59*67e74705SXin Li 
60*67e74705SXin Li   int sssssssssก = 42;
61*67e74705SXin Li   int c = sssssssss; // expected-error{{use of undeclared identifier 'sssssssss'; did you mean 'sssssssssก'?}}
62*67e74705SXin Li // CHECK: {{^          \^}}
63*67e74705SXin Li // CHECK: {{^          sssssssss.+}}
64*67e74705SXin Li // CHECK-MACHINE: fix-it:"{{.*}}":{[[@LINE-3]]:11-[[@LINE-3]]:20}:"sssssssss\340\270\201"
65*67e74705SXin Li }
66