136 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++03 -Wfour-char-constants -fsyntax-only -verify=cxx03,expected %s2// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -Wfour-char-constants -fsyntax-only -verify=cxx,expected %s3// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++17 -Wfour-char-constants -fsyntax-only -verify=cxx,expected %s4// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++20 -Wfour-char-constants -fsyntax-only -verify=cxx,expected %s5// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c11 -x c -Wfour-char-constants -fsyntax-only -verify=c11,expected %s6// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c2x -x c -Wfour-char-constants -fsyntax-only -verify=c2x,expected %s7 8#ifndef __cplusplus9typedef __WCHAR_TYPE__ wchar_t;10typedef __CHAR16_TYPE__ char16_t;11typedef __CHAR32_TYPE__ char32_t;12#endif13 14int a = 'ab'; // expected-warning {{multi-character character constant}}15int b = '\xFF\xFF'; // expected-warning {{multi-character character constant}}16int c = 'APPS'; // expected-warning {{multi-character character constant}}17 18char d = '⌘'; // expected-error {{character too large for enclosing character literal type}}19char e = '\u2318'; // expected-error {{character too large for enclosing character literal type}}20 21#if !defined(__cplusplus) || __cplusplus > 201100L22#ifdef __cplusplus23auto f = '\xE2\x8C\x98'; // expected-warning {{multi-character character constant}}24#endif25 26char16_t g = u'ab'; // expected-error {{Unicode character literals may not contain multiple characters}}27char16_t h = u'\U0010FFFD'; // expected-error {{character too large for enclosing character literal type}}28 29wchar_t i = L'ab'; // expected-error {{wide character literals may not contain multiple characters}}30 31wchar_t j = L'\U0010FFFD';32 33char32_t k = U'\U0010FFFD';34 35char l = 'Ø'; // expected-error {{character too large for enclosing character literal type}}36char m = '👿'; // expected-error {{character too large for enclosing character literal type}}37 38char32_t n = U'ab'; // expected-error {{Unicode character literals may not contain multiple characters}}39char16_t o = '👽'; // expected-error {{character too large for enclosing character literal type}}40 41char16_t p[2] = u"\U0000FFFF";42char16_t q[2] = u"\U00010000";43#ifdef __cplusplus44// expected-error@-2 {{too long}}45#endif46 47// UTF-8 character literal code point ranges.48#if __cplusplus >= 201703L || __STDC_VERSION__ >= 201710L49_Static_assert(u8'\U00000000' == 0x00, ""); // c11-error {{universal character name refers to a control character}}50_Static_assert(u8'\U0000007F' == 0x7F, ""); // c11-error {{universal character name refers to a control character}}51_Static_assert(u8'\U00000080', ""); // c11-error {{universal character name refers to a control character}}52 // cxx-error@-1 {{character too large for enclosing character literal type}}53 // c2x-error@-2 {{character too large for enclosing character literal type}}54_Static_assert((unsigned char)u8'\xFF' == (unsigned char)0xFF, "");55#endif56 57// UTF-8 string literal code point ranges.58_Static_assert(u8"\U00000000"[0] == 0x00, ""); // c11-error {{universal character name refers to a control character}}59_Static_assert(u8"\U0000007F"[0] == 0x7F, ""); // c11-error {{universal character name refers to a control character}}60_Static_assert((unsigned char)u8"\U00000080"[0] == (unsigned char)0xC2, ""); // c11-error {{universal character name refers to a control character}}61_Static_assert((unsigned char)u8"\U00000080"[1] == (unsigned char)0x80, ""); // c11-error {{universal character name refers to a control character}}62_Static_assert((unsigned char)u8"\U000007FF"[0] == (unsigned char)0xDF, "");63_Static_assert((unsigned char)u8"\U000007FF"[1] == (unsigned char)0xBF, "");64_Static_assert((unsigned char)u8"\U00000800"[0] == (unsigned char)0xE0, "");65_Static_assert((unsigned char)u8"\U00000800"[1] == (unsigned char)0xA0, "");66_Static_assert((unsigned char)u8"\U00000800"[2] == (unsigned char)0x80, "");67_Static_assert(u8"\U0000D800"[0], ""); // expected-error {{invalid universal character}}68_Static_assert(u8"\U0000DFFF"[0], ""); // expected-error {{invalid universal character}}69_Static_assert((unsigned char)u8"\U0000FFFF"[0] == (unsigned char)0xEF, "");70_Static_assert((unsigned char)u8"\U0000FFFF"[1] == (unsigned char)0xBF, "");71_Static_assert((unsigned char)u8"\U0000FFFF"[2] == (unsigned char)0xBF, "");72_Static_assert((unsigned char)u8"\U00010000"[0] == (unsigned char)0xF0, "");73_Static_assert((unsigned char)u8"\U00010000"[1] == (unsigned char)0x90, "");74_Static_assert((unsigned char)u8"\U00010000"[2] == (unsigned char)0x80, "");75_Static_assert((unsigned char)u8"\U00010000"[3] == (unsigned char)0x80, "");76_Static_assert((unsigned char)u8"\U0010FFFF"[0] == (unsigned char)0xF4, "");77_Static_assert((unsigned char)u8"\U0010FFFF"[1] == (unsigned char)0x8F, "");78_Static_assert((unsigned char)u8"\U0010FFFF"[2] == (unsigned char)0xBF, "");79_Static_assert((unsigned char)u8"\U0010FFFF"[3] == (unsigned char)0xBF, "");80_Static_assert(u8"\U00110000"[0], ""); // expected-error {{invalid universal character}}81 82#if !defined(__STDC_UTF_16__)83#error __STDC_UTF_16__ is not defined.84#endif85#if __STDC_UTF_16__ != 186#error __STDC_UTF_16__ has the wrong value.87#endif88 89// UTF-16 character literal code point ranges.90_Static_assert(u'\U00000000' == 0x0000, ""); // c11-error {{universal character name refers to a control character}}91_Static_assert(u'\U0000D800', ""); // expected-error {{invalid universal character}}92_Static_assert(u'\U0000DFFF', ""); // expected-error {{invalid universal character}}93_Static_assert(u'\U0000FFFF' == 0xFFFF, "");94_Static_assert(u'\U00010000', ""); // expected-error {{character too large for enclosing character literal type}}95 96// UTF-16 string literal code point ranges.97_Static_assert(u"\U00000000"[0] == 0x0000, ""); // c11-error {{universal character name refers to a control character}}98_Static_assert(u"\U0000D800"[0], ""); // expected-error {{invalid universal character}}99_Static_assert(u"\U0000DFFF"[0], ""); // expected-error {{invalid universal character}}100_Static_assert(u"\U0000FFFF"[0] == 0xFFFF, "");101_Static_assert(u"\U00010000"[0] == 0xD800, "");102_Static_assert(u"\U00010000"[1] == 0xDC00, "");103_Static_assert(u"\U0010FFFF"[0] == 0xDBFF, "");104_Static_assert(u"\U0010FFFF"[1] == 0xDFFF, "");105_Static_assert(u"\U00110000"[0], ""); // expected-error {{invalid universal character}}106 107#if !defined(__STDC_UTF_32__)108#error __STDC_UTF_32__ is not defined.109#endif110#if __STDC_UTF_32__ != 1111#error __STDC_UTF_32__ has the wrong value.112#endif113 114// UTF-32 character literal code point ranges.115_Static_assert(U'\U00000000' == 0x00000000, ""); // c11-error {{universal character name refers to a control character}}116_Static_assert(U'\U0010FFFF' == 0x0010FFFF, "");117_Static_assert(U'\U00110000', ""); // expected-error {{invalid universal character}}118 119// UTF-32 string literal code point ranges.120_Static_assert(U"\U00000000"[0] == 0x00000000, ""); // c11-error {{universal character name refers to a control character}}121_Static_assert(U"\U0000D800"[0], ""); // expected-error {{invalid universal character}}122_Static_assert(U"\U0000DFFF"[0], ""); // expected-error {{invalid universal character}}123_Static_assert(U"\U0010FFFF"[0] == 0x0010FFFF, "");124_Static_assert(U"\U00110000"[0], ""); // expected-error {{invalid universal character}}125 126#endif // !defined(__cplusplus) || __cplusplus > 201100L127 128_Static_assert('\u0024' == '$', "");129_Static_assert('\u0040' == '@', "");130_Static_assert('\u0060' == '`', "");131 132_Static_assert('\u0061' == 'a', ""); // c11-error {{character 'a' cannot be specified by a universal character name}} \133 // cxx03-error {{character 'a' cannot be specified by a universal character name}}134_Static_assert('\u0000' == '\0', ""); // c11-error {{universal character name refers to a control character}} \135 // cxx03-error {{universal character name refers to a control character}}136