xref: /llvm-project/clang/test/C/C23/n2836_n2939.c (revision 50c81128de8616117118564eff22cf508cba7848)
1 // RUN: %clang_cc1 -x c -std=c2x -fsyntax-only -verify %s
2 // RUN: %clang_cc1 -x c -std=c2x -E -DPP_ONLY=1 %s | FileCheck %s --strict-whitespace
3 
4 /* WG14 N2836: Clang 15
5  *   Identifier Syntax using Unicode Standard Annex 31
6  */
7 
8 /* WG14 N2939: Clang 15
9  *   Identifier Syntax Fixes
10  */
11 
12 // Some of the tests below are derived from clang/test/Lexer/unicode.c.
13 
14 // This file contains Unicode characters; please do not "fix" them!
15 
16 // No diagnostics for pragma directives.
17 #pragma mark ¡Unicode!
18 
19 // lone non-identifier characters are allowed in preprocessing.
20 #define COPYRIGHT Copyright © 2012
21 #define XSTR(X) #X
22 #define STR(X) XSTR(X)
23 
24 static const char *copyright = STR(COPYRIGHT); // no-warning
25 // CHECK: static const char *copyright = "Copyright © {{2012}}";
26 
27 #if PP_ONLY
28 COPYRIGHT
29 // CHECK: Copyright © {{2012}}
30 #endif
31 
32 // The characters in the following identifiers are no longer valid as either
33 // start or continuation characters as of C23. These are taken from section 1
34 // of N2836.
35 extern int \N{CONSTRUCTION WORKER};  // expected-error {{expected identifier or '('}}
36 extern int X\N{CONSTRUCTION WORKER}; // expected-error {{character <U+1F477> not allowed in an identifier}}
37 extern int \U0001F477;  // expected-error {{expected identifier or '('}}
38 extern int X\U0001F477; // expected-error {{character <U+1F477> not allowed in an identifier}}
39 extern int ��;  // expected-error {{unexpected character <U+1F477>}} \
40                 // expected-warning {{declaration does not declare anything}}
41 extern int X��; // expected-error {{character <U+1F477> not allowed in an identifier}}
42 extern int ��;  // expected-error {{unexpected character <U+1F550>}} \
43                 // expected-warning {{declaration does not declare anything}}
44 extern int X��; // expected-error {{character <U+1F550> not allowed in an identifier}}
45 extern int ��;  // expected-error {{unexpected character <U+1F480>}} \
46                 // expected-warning {{declaration does not declare anything}}
47 extern int X��; // expected-error {{character <U+1F480> not allowed in an identifier}}
48 extern int ��;  // expected-error {{unexpected character <U+1F44A>}} \
49                 // expected-warning {{declaration does not declare anything}}
50 extern int X��; // expected-error {{character <U+1F44A> not allowed in an identifier}}
51 extern int ��;  // expected-error {{unexpected character <U+1F680>}} \
52                 // expected-warning {{declaration does not declare anything}}
53 extern int X��; // expected-error {{character <U+1F680> not allowed in an identifier}}
54 extern int ��;  // expected-error {{unexpected character <U+1F600>}} \
55                 // expected-warning {{declaration does not declare anything}}
56 extern int X��; // expected-error {{character <U+1F600> not allowed in an identifier}}
57 
58 // The characters in the following identifiers are not allowed as start
59 // characters, but are allowed as continuation characters.
60 extern int \N{ARABIC-INDIC DIGIT ZERO}; // expected-error {{expected identifier or '('}}
61 extern int X\N{ARABIC-INDIC DIGIT ZERO};
62 extern int \u0661; // expected-error {{expected identifier or '('}}
63 extern int X\u0661;
64 extern int ٢;  // expected-error {{character <U+0662> not allowed at the start of an identifier}} \\
65                // expected-warning {{declaration does not declare anything}}
66 extern int X٠;
67 
68 // The characters in the following identifiers are not valid start or
69 // continuation characters in the standard, but are accepted as a conforming
70 // extension.
71 extern int \N{SUPERSCRIPT ZERO};  // expected-error {{expected identifier or '('}}
72 extern int X\N{SUPERSCRIPT ZERO}; // expected-warning {{mathematical notation character <U+2070> in an identifier is a Clang extension}}
73 extern int \u00B9;  // expected-error {{expected identifier or '('}}
74 extern int X\u00B9; // expected-warning {{mathematical notation character <U+00B9> in an identifier is a Clang extension}}
75 extern int ²;  // expected-error {{character <U+00B2> not allowed at the start of an identifier}} \\
76                // expected-warning {{declaration does not declare anything}}
77 extern int X²; // expected-warning {{mathematical notation character <U+00B2> in an identifier is a Clang extension}}
78 extern int \N{PARTIAL DIFFERENTIAL};  // expected-warning {{mathematical notation character <U+2202> in an identifier is a Clang extension}}
79 extern int X\N{PARTIAL DIFFERENTIAL}; // expected-warning {{mathematical notation character <U+2202> in an identifier is a Clang extension}}
80 extern int \u2207;  // expected-warning {{mathematical notation character <U+2207> in an identifier is a Clang extension}}
81 extern int X\u2207; // expected-warning {{mathematical notation character <U+2207> in an identifier is a Clang extension}}
82 extern int ∞;  // expected-warning {{mathematical notation character <U+221E> in an identifier is a Clang extension}}
83 extern int X∞; // expected-warning {{mathematical notation character <U+221E> in an identifier is a Clang extension}}
84