Add PR check to suggest alternatives to using undef (#118506)
[llvm-project.git] / clang / test / Parser / cxx11-user-defined-literals.cpp
blob27a7181bc9f9170eb8e851bda8ce9515809212ae
1 // RUN: %clang_cc1 -std=c++11 -verify %s -fms-extensions -triple x86_64-apple-darwin9.0.0
3 // A ud-suffix cannot be used on string literals in a whole bunch of contexts:
5 #include "foo"_bar // expected-error {{expected "FILENAME" or <FILENAME>}}
6 #line 1 "foo"_bar // expected-error {{user-defined suffix cannot be used here}}
7 # 1 "foo"_bar 1 // expected-error {{user-defined suffix cannot be used here}}
8 #ident "foo"_bar // expected-error {{user-defined suffix cannot be used here}}
9 _Pragma("foo"_bar) // expected-error {{user-defined suffix cannot be used here}}
10 #pragma comment(lib, "foo"_bar) // expected-error {{user-defined suffix cannot be used here}}
11 _Pragma("comment(lib, \"foo\"_bar)") // expected-error {{user-defined suffix cannot be used here}}
12 #pragma message "hi"_there // expected-error {{user-defined suffix cannot be used here}} expected-warning {{hi}}
13 #pragma push_macro("foo"_bar) // expected-error {{user-defined suffix cannot be used here}}
14 #if __has_warning("-Wan-island-to-discover"_bar) // expected-error {{user-defined suffix cannot be used here}}
15 #elif __has_include("foo"_bar) // expected-error {{expected "FILENAME" or <FILENAME>}}
16 #endif
18 extern "C++"_x {} // expected-error {{user-defined suffix cannot be used here}}
20 int f() {
21 asm("mov %eax, %rdx"_foo); // expected-error {{user-defined suffix cannot be used here}}
24 static_assert(true, "foo"_bar); // expected-error {{no matching literal operator for call to 'operator""_bar'}}
25 // expected-warning@-1 {{'static_assert' with a user-generated message is a C++26 extension}}
27 int cake() __attribute__((availability(macosx, unavailable, message = "is a lie"_x))); // expected-error {{user-defined suffix cannot be used here}}
29 // A ud-suffix cannot be used on character literals in preprocessor constant
30 // expressions:
31 #if 'x'_y - u'x'_z // expected-error 2{{character literal with user-defined suffix cannot be used in preprocessor constant expression}}
32 #error error
33 #endif
35 // A ud-suffix cannot be used on integer literals in preprocessor constant
36 // expressions:
37 #if 0_foo // expected-error {{integer literal with user-defined suffix cannot be used in preprocessor constant expression}}
38 #error error
39 #endif
41 // But they can appear in expressions.
42 constexpr char operator""_id(char c) { return c; }
43 constexpr wchar_t operator""_id(wchar_t c) { return c; }
44 constexpr char16_t operator""_id(char16_t c) { return c; }
45 constexpr char32_t operator""_id(char32_t c) { return c; }
47 using size_t = decltype(sizeof(int));
48 constexpr const char operator""_id(const char *p, size_t n) { return *p; }
49 constexpr const wchar_t operator""_id(const wchar_t *p, size_t n) { return *p; }
50 constexpr const char16_t operator""_id(const char16_t *p, size_t n) { return *p; }
51 constexpr const char32_t operator""_id(const char32_t *p, size_t n) { return *p; }
53 constexpr unsigned long long operator""_id(unsigned long long n) { return n; }
54 constexpr long double operator""_id(long double d) { return d; }
56 template<int n> struct S {};
57 S<"a"_id> sa;
58 S<L"b"_id> sb;
59 S<u8"c"_id> sc;
60 S<u"d"_id> sd;
61 S<U"e"_id> se;
63 S<'w'_id> sw;
64 S<L'x'_id> sx;
65 S<u'y'_id> sy;
66 S<U'z'_id> sz;
68 S<100_id> sn;
69 S<(int)1.3_id> sf;
71 void h() {
72 (void)"test"_id "test" L"test";
75 // Test source location for suffix is known
76 const char *p =
77 "foo\nbar" R"x(
78 erk
79 flux
80 )x" "eep\x1f"\
81 _no_such_suffix // expected-error {{'operator""_no_such_suffix'}}
82 "and a bit more"
83 "and another suffix"_no_such_suffix;
85 char c =
86 '\x14'\
87 _no_such_suffix; // expected-error {{'operator""_no_such_suffix'}}
89 int &r =
90 1234567\
91 _no_such_suffix; // expected-error {{'operator""_no_such_suffix'}}
93 int k =
94 1234567.89\
95 _no_such_suffix; // expected-error {{'operator""_no_such_suffix'}}
97 // Make sure we handle more interesting ways of writing a string literal which
98 // is "" in translation phase 7.
99 void operator "\
100 " _foo(unsigned long long); // ok
101 // expected-warning@-1{{identifier '_foo' preceded by whitespace in a literal operator declaration is deprecated}}
103 void operator R"xyzzy()xyzzy" _foo(long double); // ok
104 // expected-warning@-1{{identifier '_foo' preceded by whitespace in a literal operator declaration is deprecated}}
106 void operator"" "" R"()" "" _foo(const char *); // ok
107 // expected-warning@-1{{identifier '_foo' preceded by whitespace}}
109 void operator ""_no_space(const char *); // ok
111 // Ensure we diagnose the bad cases.
112 void operator "\0"_non_empty(const char *); // expected-error {{must be '""'}}
113 void operator L""_not_char(const char *); // expected-error {{cannot have an encoding prefix}}
114 void operator "" ""
115 U"" // expected-error {{cannot have an encoding prefix}}
116 ""_also_not_char(const char *);
117 void operator "" u8"" "\u0123" "hello"_all_of_the_things ""(const char*); // expected-error {{must be '""'}}
119 // Make sure we treat UCNs and UTF-8 as equivalent.
120 int operator""s(unsigned long long) {} // expected-note {{previous}}
121 int hundred_µs = 50_µs + 50_\u00b5s;
122 int operator""_\u00b5s(unsigned long long) {} // expected-error {{redefinition of 'operator""_µs'}}
124 int operator""_\U0000212B(long double) {} // expected-note {{previous}}
125 int hundred_Å = 50.0_Å + 50._\U0000212B;
126 int operator""_Å(long double) {} // expected-error {{redefinition of 'operator""_Å'}}
128 int operator""_𐀀(char) {} // expected-note {{previous}}
129 int 𐀀 = '4'_𐀀 + '2'_\U00010000;
130 int operator""_\U00010000(char) {} // expected-error {{redefinition of 'operator""_𐀀'}}
132 // These all declare the same function.
133 int operator""_℮""_\u212e""_\U0000212e""(const char*, size_t);
134 int operator""_\u212e""_\U0000212e""_℮""(const char*, size_t);
135 int operator""_\U0000212e""_℮""_\u212e""(const char*, size_t);
137 int operator""_\u{212f}(char);
138 int operator""_\N{SCRIPT SMALL E}(char);
140 int mix_ucn_utf8 = ""_℮""_\u212e""_\U0000212e"";
142 void operator""_℮""_ℯ(unsigned long long) {} // expected-error {{differing user-defined suffixes ('_℮' and '_ℯ') in string literal concatenation}}
143 void operator""_℮""_\u212f(unsigned long long) {} // expected-error {{differing user-defined suffixes ('_℮' and '_ℯ') in string literal concatenation}}
144 void operator""_\u212e""_ℯ(unsigned long long) {} // expected-error {{differing user-defined suffixes ('_℮' and '_ℯ') in string literal concatenation}}
145 void operator""_\u212e""_\u212f(unsigned long long) {} // expected-error {{differing user-defined suffixes ('_℮' and '_ℯ') in string literal concatenation}}
147 void operator""_℮""_℮(unsigned long long) {} // expected-note {{previous}}
148 void operator""_\u212e""_\u212e(unsigned long long) {} // expected-error {{redefinition}}
150 #define ¢ *0.01 // expected-error {{macro name must be an identifier}}
151 constexpr int operator""(long double d) { return d * 100; } // expected-error {{character <U+00A2> not allowed in an identifier}}
152 constexpr int operator""(unsigned long long n) { return n; } // expected-error {{character <U+00A2> not allowed in an identifier}}
153 static_assert(0.02== 2, ""); // expected-error 2{{character <U+00A2> not allowed in an identifier}}