xref: /aosp_15_r20/external/clang/test/Preprocessor/ucn-allowed-chars.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -fsyntax-only -std=c99 -verify
2*67e74705SXin Li // RUN: %clang_cc1 %s -fsyntax-only -std=c11 -Wc99-compat -verify
3*67e74705SXin Li // RUN: %clang_cc1 %s -fsyntax-only -x c++ -std=c++03 -Wc++11-compat -verify
4*67e74705SXin Li // RUN: %clang_cc1 %s -fsyntax-only -x c++ -std=c++11 -Wc++98-compat -verify
5*67e74705SXin Li 
6*67e74705SXin Li // Identifier characters
7*67e74705SXin Li extern char a\u01F6; // C11, C++11
8*67e74705SXin Li extern char a\u00AA; // C99, C11, C++11
9*67e74705SXin Li extern char a\u0384; // C++03, C11, C++11
10*67e74705SXin Li extern char a\u0E50; // C99, C++03, C11, C++11
11*67e74705SXin Li extern char a\uFFFF; // none
12*67e74705SXin Li 
13*67e74705SXin Li 
14*67e74705SXin Li 
15*67e74705SXin Li 
16*67e74705SXin Li 
17*67e74705SXin Li // Identifier initial characters
18*67e74705SXin Li extern char \u0E50; // C++03, C11, C++11
19*67e74705SXin Li extern char \u0300; // disallowed initially in C11/C++11, always in C99/C++03
20*67e74705SXin Li extern char \u0D61; // C99, C11, C++03, C++11
21*67e74705SXin Li 
22*67e74705SXin Li 
23*67e74705SXin Li 
24*67e74705SXin Li 
25*67e74705SXin Li 
26*67e74705SXin Li 
27*67e74705SXin Li 
28*67e74705SXin Li // Disallowed everywhere
29*67e74705SXin Li #define A \u0000 // expected-error{{control character}}
30*67e74705SXin Li #define B \u001F // expected-error{{control character}}
31*67e74705SXin Li #define C \u007F // expected-error{{control character}}
32*67e74705SXin Li #define D \u009F // expected-error{{control character}}
33*67e74705SXin Li #define E \uD800 // C++03 allows UCNs representing surrogate characters!
34*67e74705SXin Li 
35*67e74705SXin Li 
36*67e74705SXin Li 
37*67e74705SXin Li 
38*67e74705SXin Li 
39*67e74705SXin Li 
40*67e74705SXin Li #if __cplusplus
41*67e74705SXin Li # if __cplusplus >= 201103L
42*67e74705SXin Li // C++11
43*67e74705SXin Li // expected-warning@7 {{using this character in an identifier is incompatible with C++98}}
44*67e74705SXin Li // expected-warning@8 {{using this character in an identifier is incompatible with C++98}}
45*67e74705SXin Li // expected-error@11 {{expected ';'}}
46*67e74705SXin Li // expected-error@19 {{expected unqualified-id}}
47*67e74705SXin Li // expected-error@33 {{invalid universal character}}
48*67e74705SXin Li 
49*67e74705SXin Li # else
50*67e74705SXin Li // C++03
51*67e74705SXin Li // expected-error@7 {{expected ';'}}
52*67e74705SXin Li // expected-error@8 {{expected ';'}}
53*67e74705SXin Li // expected-error@11 {{expected ';'}}
54*67e74705SXin Li // expected-error@19 {{expected unqualified-id}}
55*67e74705SXin Li // expected-warning@33 {{universal character name refers to a surrogate character}}
56*67e74705SXin Li 
57*67e74705SXin Li # endif
58*67e74705SXin Li #else
59*67e74705SXin Li # if __STDC_VERSION__ >= 201112L
60*67e74705SXin Li // C11
61*67e74705SXin Li // expected-warning@7 {{using this character in an identifier is incompatible with C99}}
62*67e74705SXin Li // expected-warning@9 {{using this character in an identifier is incompatible with C99}}
63*67e74705SXin Li // expected-error@11 {{expected ';'}}
64*67e74705SXin Li // expected-warning@18 {{starting an identifier with this character is incompatible with C99}}
65*67e74705SXin Li // expected-error@19 {{expected identifier}}
66*67e74705SXin Li // expected-error@33 {{invalid universal character}}
67*67e74705SXin Li 
68*67e74705SXin Li # else
69*67e74705SXin Li // C99
70*67e74705SXin Li // expected-error@7 {{expected ';'}}
71*67e74705SXin Li // expected-error@9 {{expected ';'}}
72*67e74705SXin Li // expected-error@11 {{expected ';'}}
73*67e74705SXin Li // expected-error@18 {{expected identifier}}
74*67e74705SXin Li // expected-error@19 {{expected identifier}}
75*67e74705SXin Li // expected-error@33 {{invalid universal character}}
76*67e74705SXin Li 
77*67e74705SXin Li # endif
78*67e74705SXin Li #endif
79