1b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith// RUN: %clang_cc1 -std=c++11 -verify %s -fms-extensions -triple x86_64-apple-darwin9.0.0
2b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith
3b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithusing size_t = decltype(sizeof(int));
4b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithenum class LitKind {
5b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith  Char, WideChar, Char16, Char32,
6b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith  CharStr, WideStr, Char16Str, Char32Str,
736f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith  Integer, Floating, Raw, Template
8b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith};
9b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithconstexpr LitKind operator"" _kind(char p) { return LitKind::Char; }
10b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithconstexpr LitKind operator"" _kind(wchar_t p) { return LitKind::WideChar; }
11b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithconstexpr LitKind operator"" _kind(char16_t p) { return LitKind::Char16; }
12b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithconstexpr LitKind operator"" _kind(char32_t p) { return LitKind::Char32; }
13b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithconstexpr LitKind operator"" _kind(const char *p, size_t n) { return LitKind::CharStr; }
14b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithconstexpr LitKind operator"" _kind(const wchar_t *p, size_t n) { return LitKind::WideStr; }
15b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithconstexpr LitKind operator"" _kind(const char16_t *p, size_t n) { return LitKind::Char16Str; }
16b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithconstexpr LitKind operator"" _kind(const char32_t *p, size_t n) { return LitKind::Char32Str; }
17b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithconstexpr LitKind operator"" _kind(unsigned long long n) { return LitKind::Integer; }
18b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithconstexpr LitKind operator"" _kind(long double n) { return LitKind::Floating; }
1936f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithconstexpr LitKind operator"" _kind2(const char *p) { return LitKind::Raw; }
2036f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithtemplate<char ...Cs> constexpr LitKind operator"" _kind3() { return LitKind::Template; }
21b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith
22b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithstatic_assert('x'_kind == LitKind::Char, "");
23b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithstatic_assert(L'x'_kind == LitKind::WideChar, "");
24b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithstatic_assert(u'x'_kind == LitKind::Char16, "");
25b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithstatic_assert(U'x'_kind == LitKind::Char32, "");
26b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithstatic_assert("foo"_kind == LitKind::CharStr, "");
27b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithstatic_assert(u8"foo"_kind == LitKind::CharStr, "");
28b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithstatic_assert(L"foo"_kind == LitKind::WideStr, "");
29b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithstatic_assert(u"foo"_kind == LitKind::Char16Str, "");
30b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithstatic_assert(U"foo"_kind == LitKind::Char32Str, "");
31b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithstatic_assert(194_kind == LitKind::Integer, "");
32b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithstatic_assert(0377_kind == LitKind::Integer, "");
33b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithstatic_assert(0x5ffc_kind == LitKind::Integer, "");
34b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithstatic_assert(.5954_kind == LitKind::Floating, "");
35b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithstatic_assert(1._kind == LitKind::Floating, "");
36b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithstatic_assert(1.e-2_kind == LitKind::Floating, "");
37b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smithstatic_assert(4e6_kind == LitKind::Floating, "");
3836f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithstatic_assert(4e6_kind2 == LitKind::Raw, "");
3936f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithstatic_assert(4e6_kind3 == LitKind::Template, "");
4036f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith
4136f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithconstexpr const char *fractional_digits_impl(const char *p) {
4236f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith  return *p == '.' ? p + 1 : *p ? fractional_digits_impl(p + 1) : 0;
4336f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith}
4436f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithconstexpr const char *operator"" _fractional_digits(const char *p) {
4536f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith  return fractional_digits_impl(p) ?: p;
4636f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith}
4736f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithconstexpr bool streq(const char *p, const char *q) {
4836f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith  return *p == *q && (!*p || streq(p+1, q+1));
4936f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith}
5036f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith
5136f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithstatic_assert(streq(143.97_fractional_digits, "97"), "");
5236f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithstatic_assert(streq(0x786_fractional_digits, "0x786"), "");
5336f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithstatic_assert(streq(.4_fractional_digits, "4"), "");
5436f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithstatic_assert(streq(4._fractional_digits, ""), "");
5536f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithstatic_assert(streq(1e+97_fractional_digits, "1e+97"), "");
5636f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithstatic_assert(streq(0377_fractional_digits, "0377"), "");
5736f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithstatic_assert(streq(0377.5_fractional_digits, "5"), "");
5836f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith
5936f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithint operator"" _ambiguous(char); // expected-note {{candidate}}
6036f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithnamespace N {
6136f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith  void *operator"" _ambiguous(char); // expected-note {{candidate}}
6236f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith}
6336f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithusing namespace N;
6436f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithint k = 'x'_ambiguous; // expected-error {{ambiguous}}
6536f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith
6636f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithint operator"" _deleted(unsigned long long) = delete; // expected-note {{here}}
6736f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithint m = 42_deleted; // expected-error {{attempt to use a deleted}}
6836f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith
6936f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithnamespace Using {
7036f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith  namespace M {
7136f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith    int operator"" _using(char);
7236f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith  }
7336f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith  int k1 = 'x'_using; // expected-error {{no matching literal operator for call to 'operator "" _using'}}
7436f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith
7536f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith  using M::operator "" _using;
7636f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith  int k2 = 'x'_using;
7736f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith}
7836f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith
7936f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithnamespace AmbiguousRawTemplate {
8036f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith  int operator"" _ambig1(const char *); // expected-note {{candidate}}
8136f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith  template<char...> int operator"" _ambig1(); // expected-note {{candidate}}
8236f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith
8336f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith  int k1 = 123_ambig1; // expected-error {{call to 'operator "" _ambig1' is ambiguous}}
8436f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith
8536f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith  namespace Inner {
8636f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith    template<char...> int operator"" _ambig2(); // expected-note 3{{candidate}}
8736f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith  }
8836f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith  int operator"" _ambig2(const char *); // expected-note 3{{candidate}}
8936f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith  using Inner::operator"" _ambig2;
9036f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith
9136f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith  int k2 = 123_ambig2; // expected-error {{call to 'operator "" _ambig2' is ambiguous}}
9236f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith
9336f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith  namespace N {
9436f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith    using Inner::operator"" _ambig2;
9536f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith
9636f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith    int k3 = 123_ambig2; // ok
9736f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith
9836f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith    using AmbiguousRawTemplate::operator"" _ambig2;
9936f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith
10036f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith    int k4 = 123_ambig2; // expected-error {{ambiguous}}
10136f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith
10236f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith    namespace M {
10336f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith
10436f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith      template<char...> int operator"" _ambig2();
10536f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith
10636f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith      int k5 = 123_ambig2; // ok
10736f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith    }
10836f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith
10936f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith    int operator"" _ambig2(unsigned long long);
11036f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith
11136f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith    int k6 = 123_ambig2; // ok
11236f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith    int k7 = 123._ambig2; // expected-error {{ambiguous}}
11336f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith  }
11436f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith}
11536f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith
11636f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithconstexpr unsigned mash(unsigned a) {
11736f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith return 0x93ae27b5 * ((a >> 13) | a << 19);
11836f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith}
11936f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithtemplate<typename=void> constexpr unsigned hash(unsigned a) { return a; }
12036f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithtemplate<char C, char...Cs> constexpr unsigned hash(unsigned a) {
12136f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith return hash<Cs...>(mash(a ^ mash(C)));
12236f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith}
12336f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithtemplate<typename T, T v> struct constant { constexpr static T value = v; };
12436f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithtemplate<char...Cs> constexpr unsigned operator"" _hash() {
12536f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith  return constant<unsigned, hash<Cs...>(0)>::value;
12636f5cfe4df32af6c5fe01228102512996f566f9dRichard Smith}
12736f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithstatic_assert(0x1234_hash == 0x103eff5e, "");
12836f5cfe4df32af6c5fe01228102512996f566f9dRichard Smithstatic_assert(hash<'0', 'x', '1', '2', '3', '4'>(0) == 0x103eff5e, "");
1293a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smith
1303a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smith// Functions and literal suffixes go in separate namespaces.
1313a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smithnamespace Namespace {
1323a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smith  template<char...> int operator"" _x();
1333a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smith  int k = _x(); // expected-error {{undeclared identifier '_x'}}
1343a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smith
1353a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smith  int _y(unsigned long long);
1363a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smith  int k2 = 123_y; // expected-error {{no matching literal operator for call to 'operator "" _y'}}
1373a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smith}
138a121eb3af061a9402aa88630a0eb535d92962e2cRichard Smith
139a121eb3af061a9402aa88630a0eb535d92962e2cRichard Smithnamespace PR14950 {
140a121eb3af061a9402aa88630a0eb535d92962e2cRichard Smith  template<...> // expected-error {{expected template parameter}}
141a121eb3af061a9402aa88630a0eb535d92962e2cRichard Smith  int operator"" _b(); // expected-error {{no function template matches function template specialization}}
142a121eb3af061a9402aa88630a0eb535d92962e2cRichard Smith  int main() { return 0_b; } // expected-error {{no matching literal operator for call to 'operator "" _b'}}
143a121eb3af061a9402aa88630a0eb535d92962e2cRichard Smith}
144651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
145651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace bad_names {
146651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<char...> int operator""_x();
147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
148651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> void f() {
149651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    class T:: // expected-error {{anonymous class}} expected-warning {{does not declare anything}}
150651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        operator // expected-error {{expected identifier}}
151651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            ""_q<'a'>;
152651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
153651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    T::template operator""_q<'a'>(); // expected-error {{non-namespace scope 'T::' cannot have a literal operator member}} expected-error +{{}}
154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    T::template operator""_q<'a'>::X; // expected-error {{non-namespace scope 'T::' cannot have a literal operator member}} expected-error +{{}}
155651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    T::operator""_q<'a'>(); // expected-error {{non-namespace scope 'T::' cannot have a literal operator member}} expected-error +{{}}
156651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    typename T::template operator""_q<'a'> a; // expected-error {{non-namespace scope 'T::' cannot have a literal operator member}} expected-error +{{}}
157651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    typename T::operator""_q(""); // expected-error +{{}} expected-note {{to match}}
158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    T::operator""_q(""); // expected-error {{non-namespace scope 'T::' cannot have a literal operator member}}
159651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
160651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bad_names::operator""_x<'a', 'b', 'c'>();
161651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
162651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
163651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct S {};
164651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void g() {
165651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    S::operator""_q(); // expected-error {{non-namespace scope 'S::' cannot have a literal operator member}}
166651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
167651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
168