// RUN: %clang_cc1 -x c -std=c2x -fsyntax-only -verify %s
// RUN: %clang_cc1 -x c -std=c2x -E -DPP_ONLY=1 %s | FileCheck %s --strict-whitespace
/* WG14 N2836: Clang 15
* Identifier Syntax using Unicode Standard Annex 31
*/
/* WG14 N2939: Clang 15
* Identifier Syntax Fixes
*/
// Some of the tests below are derived from clang/test/Lexer/unicode.c.
// This file contains Unicode characters; please do not "fix" them!
// No diagnostics for pragma directives.
#pragma mark ยกUnicode!
// lone non-identifier characters are allowed in preprocessing.
#define COPYRIGHT Copyright ยฉ 2012
#define XSTR(X) #X
#define STR(X) XSTR(X)
static const char *copyright = STR(COPYRIGHT); // no-warning
// CHECK: static const char *copyright = "Copyright ยฉ {{2012}}";
#if PP_ONLY
COPYRIGHT
// CHECK: Copyright ยฉ {{2012}}
#endif
// The characters in the following identifiers are no longer valid as either
// start or continuation characters as of C23. These are taken from section 1
// of N2836.
extern int \N{CONSTRUCTION WORKER}; // expected-error {{expected identifier or '('}}
extern int X\N{CONSTRUCTION WORKER}; // expected-error {{character <U+1F477> not allowed in an identifier}}
extern int \U0001F477; // expected-error {{expected identifier or '('}}
extern int X\U0001F477; // expected-error {{character <U+1F477> not allowed in an identifier}}
extern int ๐ท; // expected-error {{unexpected character <U+1F477>}} \
// expected-warning {{declaration does not declare anything}}
extern int X๐ท; // expected-error {{character <U+1F477> not allowed in an identifier}}
extern int ๐; // expected-error {{unexpected character <U+1F550>}} \
// expected-warning {{declaration does not declare anything}}
extern int X๐; // expected-error {{character <U+1F550> not allowed in an identifier}}
extern int ๐; // expected-error {{unexpected character <U+1F480>}} \
// expected-warning {{declaration does not declare anything}}
extern int X๐; // expected-error {{character <U+1F480> not allowed in an identifier}}
extern int ๐; // expected-error {{unexpected character <U+1F44A>}} \
// expected-warning {{declaration does not declare anything}}
extern int X๐; // expected-error {{character <U+1F44A> not allowed in an identifier}}
extern int ๐; // expected-error {{unexpected character <U+1F680>}} \
// expected-warning {{declaration does not declare anything}}
extern int X๐; // expected-error {{character <U+1F680> not allowed in an identifier}}
extern int ๐; // expected-error {{unexpected character <U+1F600>}} \
// expected-warning {{declaration does not declare anything}}
extern int X๐; // expected-error {{character <U+1F600> not allowed in an identifier}}
// The characters in the following identifiers are not allowed as start
// characters, but are allowed as continuation characters.
extern int \N{ARABIC-INDIC DIGIT ZERO}; // expected-error {{expected identifier or '('}}
extern int X\N{ARABIC-INDIC DIGIT ZERO};
extern int \u0661; // expected-error {{expected identifier or '('}}
extern int X\u0661;
extern int ูข; // expected-error {{character <U+0662> not allowed at the start of an identifier}} \\
// expected-warning {{declaration does not declare anything}}
extern int Xู ;
// The characters in the following identifiers are not valid start or
// continuation characters in the standard, but are accepted as a conforming
// extension.
extern int \N{SUPERSCRIPT ZERO}; // expected-error {{expected identifier or '('}}
extern int X\N{SUPERSCRIPT ZERO}; // expected-warning {{mathematical notation character <U+2070> in an identifier is a Clang extension}}
extern int \u00B9; // expected-error {{expected identifier or '('}}
extern int X\u00B9; // expected-warning {{mathematical notation character <U+00B9> in an identifier is a Clang extension}}
extern int ยฒ; // expected-error {{character <U+00B2> not allowed at the start of an identifier}} \\
// expected-warning {{declaration does not declare anything}}
extern int Xยฒ; // expected-warning {{mathematical notation character <U+00B2> in an identifier is a Clang extension}}
extern int \N{PARTIAL DIFFERENTIAL}; // expected-warning {{mathematical notation character <U+2202> in an identifier is a Clang extension}}
extern int X\N{PARTIAL DIFFERENTIAL}; // expected-warning {{mathematical notation character <U+2202> in an identifier is a Clang extension}}
extern int \u2207; // expected-warning {{mathematical notation character <U+2207> in an identifier is a Clang extension}}
extern int X\u2207; // expected-warning {{mathematical notation character <U+2207> in an identifier is a Clang extension}}
extern int โ; // expected-warning {{mathematical notation character <U+221E> in an identifier is a Clang extension}}
extern int Xโ; // expected-warning {{mathematical notation character <U+221E> in an identifier is a Clang extension}}