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