cxx11-user-defined-literals.cpp revision a121eb3af061a9402aa88630a0eb535d92962e2c
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} 144