| // RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++03 -Wfour-char-constants -fsyntax-only -verify=cxx03,expected %s |
| // RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -Wfour-char-constants -fsyntax-only -verify=cxx,expected %s |
| // RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++17 -Wfour-char-constants -fsyntax-only -verify=cxx,expected %s |
| // RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++20 -Wfour-char-constants -fsyntax-only -verify=cxx,expected %s |
| // RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c11 -x c -Wfour-char-constants -fsyntax-only -verify=c11,expected %s |
| // RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c2x -x c -Wfour-char-constants -fsyntax-only -verify=c2x,expected %s |
| |
| #ifndef __cplusplus |
| typedef __WCHAR_TYPE__ wchar_t; |
| typedef __CHAR16_TYPE__ char16_t; |
| typedef __CHAR32_TYPE__ char32_t; |
| #endif |
| |
| int a = 'ab'; // expected-warning {{multi-character character constant}} |
| int b = '\xFF\xFF'; // expected-warning {{multi-character character constant}} |
| int c = 'APPS'; // expected-warning {{multi-character character constant}} |
| |
| char d = '⌘'; // expected-error {{character too large for enclosing character literal type}} |
| char e = '\u2318'; // expected-error {{character too large for enclosing character literal type}} |
| |
| #if !defined(__cplusplus) || __cplusplus > 201100L |
| #ifdef __cplusplus |
| auto f = '\xE2\x8C\x98'; // expected-warning {{multi-character character constant}} |
| #endif |
| |
| char16_t g = u'ab'; // expected-error {{Unicode character literals may not contain multiple characters}} |
| char16_t h = u'\U0010FFFD'; // expected-error {{character too large for enclosing character literal type}} |
| |
| wchar_t i = L'ab'; // expected-error {{wide character literals may not contain multiple characters}} |
| |
| wchar_t j = L'\U0010FFFD'; |
| |
| char32_t k = U'\U0010FFFD'; |
| |
| char l = 'Ø'; // expected-error {{character too large for enclosing character literal type}} |
| char m = '👿'; // expected-error {{character too large for enclosing character literal type}} |
| |
| char32_t n = U'ab'; // expected-error {{Unicode character literals may not contain multiple characters}} |
| char16_t o = '👽'; // expected-error {{character too large for enclosing character literal type}} |
| |
| char16_t p[2] = u"\U0000FFFF"; |
| char16_t q[2] = u"\U00010000"; |
| #ifdef __cplusplus |
| // expected-error@-2 {{too long}} |
| #endif |
| |
| // UTF-8 character literal code point ranges. |
| #if __cplusplus >= 201703L || __STDC_VERSION__ >= 201710L |
| _Static_assert(u8'\U00000000' == 0x00, ""); // c11-error {{universal character name refers to a control character}} |
| _Static_assert(u8'\U0000007F' == 0x7F, ""); // c11-error {{universal character name refers to a control character}} |
| _Static_assert(u8'\U00000080', ""); // c11-error {{universal character name refers to a control character}} |
| // cxx-error@-1 {{character too large for enclosing character literal type}} |
| // c2x-error@-2 {{character too large for enclosing character literal type}} |
| _Static_assert((unsigned char)u8'\xFF' == (unsigned char)0xFF, ""); |
| #endif |
| |
| // UTF-8 string literal code point ranges. |
| _Static_assert(u8"\U00000000"[0] == 0x00, ""); // c11-error {{universal character name refers to a control character}} |
| _Static_assert(u8"\U0000007F"[0] == 0x7F, ""); // c11-error {{universal character name refers to a control character}} |
| _Static_assert((unsigned char)u8"\U00000080"[0] == (unsigned char)0xC2, ""); // c11-error {{universal character name refers to a control character}} |
| _Static_assert((unsigned char)u8"\U00000080"[1] == (unsigned char)0x80, ""); // c11-error {{universal character name refers to a control character}} |
| _Static_assert((unsigned char)u8"\U000007FF"[0] == (unsigned char)0xDF, ""); |
| _Static_assert((unsigned char)u8"\U000007FF"[1] == (unsigned char)0xBF, ""); |
| _Static_assert((unsigned char)u8"\U00000800"[0] == (unsigned char)0xE0, ""); |
| _Static_assert((unsigned char)u8"\U00000800"[1] == (unsigned char)0xA0, ""); |
| _Static_assert((unsigned char)u8"\U00000800"[2] == (unsigned char)0x80, ""); |
| _Static_assert(u8"\U0000D800"[0], ""); // expected-error {{invalid universal character}} |
| _Static_assert(u8"\U0000DFFF"[0], ""); // expected-error {{invalid universal character}} |
| _Static_assert((unsigned char)u8"\U0000FFFF"[0] == (unsigned char)0xEF, ""); |
| _Static_assert((unsigned char)u8"\U0000FFFF"[1] == (unsigned char)0xBF, ""); |
| _Static_assert((unsigned char)u8"\U0000FFFF"[2] == (unsigned char)0xBF, ""); |
| _Static_assert((unsigned char)u8"\U00010000"[0] == (unsigned char)0xF0, ""); |
| _Static_assert((unsigned char)u8"\U00010000"[1] == (unsigned char)0x90, ""); |
| _Static_assert((unsigned char)u8"\U00010000"[2] == (unsigned char)0x80, ""); |
| _Static_assert((unsigned char)u8"\U00010000"[3] == (unsigned char)0x80, ""); |
| _Static_assert((unsigned char)u8"\U0010FFFF"[0] == (unsigned char)0xF4, ""); |
| _Static_assert((unsigned char)u8"\U0010FFFF"[1] == (unsigned char)0x8F, ""); |
| _Static_assert((unsigned char)u8"\U0010FFFF"[2] == (unsigned char)0xBF, ""); |
| _Static_assert((unsigned char)u8"\U0010FFFF"[3] == (unsigned char)0xBF, ""); |
| _Static_assert(u8"\U00110000"[0], ""); // expected-error {{invalid universal character}} |
| |
| #if !defined(__STDC_UTF_16__) |
| #error __STDC_UTF_16__ is not defined. |
| #endif |
| #if __STDC_UTF_16__ != 1 |
| #error __STDC_UTF_16__ has the wrong value. |
| #endif |
| |
| // UTF-16 character literal code point ranges. |
| _Static_assert(u'\U00000000' == 0x0000, ""); // c11-error {{universal character name refers to a control character}} |
| _Static_assert(u'\U0000D800', ""); // expected-error {{invalid universal character}} |
| _Static_assert(u'\U0000DFFF', ""); // expected-error {{invalid universal character}} |
| _Static_assert(u'\U0000FFFF' == 0xFFFF, ""); |
| _Static_assert(u'\U00010000', ""); // expected-error {{character too large for enclosing character literal type}} |
| |
| // UTF-16 string literal code point ranges. |
| _Static_assert(u"\U00000000"[0] == 0x0000, ""); // c11-error {{universal character name refers to a control character}} |
| _Static_assert(u"\U0000D800"[0], ""); // expected-error {{invalid universal character}} |
| _Static_assert(u"\U0000DFFF"[0], ""); // expected-error {{invalid universal character}} |
| _Static_assert(u"\U0000FFFF"[0] == 0xFFFF, ""); |
| _Static_assert(u"\U00010000"[0] == 0xD800, ""); |
| _Static_assert(u"\U00010000"[1] == 0xDC00, ""); |
| _Static_assert(u"\U0010FFFF"[0] == 0xDBFF, ""); |
| _Static_assert(u"\U0010FFFF"[1] == 0xDFFF, ""); |
| _Static_assert(u"\U00110000"[0], ""); // expected-error {{invalid universal character}} |
| |
| #if !defined(__STDC_UTF_32__) |
| #error __STDC_UTF_32__ is not defined. |
| #endif |
| #if __STDC_UTF_32__ != 1 |
| #error __STDC_UTF_32__ has the wrong value. |
| #endif |
| |
| // UTF-32 character literal code point ranges. |
| _Static_assert(U'\U00000000' == 0x00000000, ""); // c11-error {{universal character name refers to a control character}} |
| _Static_assert(U'\U0010FFFF' == 0x0010FFFF, ""); |
| _Static_assert(U'\U00110000', ""); // expected-error {{invalid universal character}} |
| |
| // UTF-32 string literal code point ranges. |
| _Static_assert(U"\U00000000"[0] == 0x00000000, ""); // c11-error {{universal character name refers to a control character}} |
| _Static_assert(U"\U0000D800"[0], ""); // expected-error {{invalid universal character}} |
| _Static_assert(U"\U0000DFFF"[0], ""); // expected-error {{invalid universal character}} |
| _Static_assert(U"\U0010FFFF"[0] == 0x0010FFFF, ""); |
| _Static_assert(U"\U00110000"[0], ""); // expected-error {{invalid universal character}} |
| |
| #endif // !defined(__cplusplus) || __cplusplus > 201100L |
| |
| _Static_assert('\u0024' == '$', ""); |
| _Static_assert('\u0040' == '@', ""); |
| _Static_assert('\u0060' == '`', ""); |
| |
| _Static_assert('\u0061' == 'a', ""); // c11-error {{character 'a' cannot be specified by a universal character name}} \ |
| // cxx03-error {{character 'a' cannot be specified by a universal character name}} |
| _Static_assert('\u0000' == '\0', ""); // c11-error {{universal character name refers to a control character}} \ |
| // cxx03-error {{universal character name refers to a control character}} |