// 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}}