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>}}
18 extern "C++"_x
{} // expected-error {{user-defined suffix cannot be used here}}
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
31 #if 'x'_y - u'x'_z // expected-error 2{{character literal with user-defined suffix cannot be used in preprocessor constant expression}}
35 // A ud-suffix cannot be used on integer literals in preprocessor constant
37 #if 0_foo // expected-error {{integer literal with user-defined suffix cannot be used in preprocessor constant expression}}
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
{};
72 (void)"test"_id
"test" L
"test";
75 // Test source location for suffix is known
81 _no_such_suffix
// expected-error {{'operator""_no_such_suffix'}}
83 "and another suffix"_no_such_suffix
;
87 _no_such_suffix
; // expected-error {{'operator""_no_such_suffix'}}
91 _no_such_suffix
; // expected-error {{'operator""_no_such_suffix'}}
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.
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}}
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}}