1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++14 %s 2*67e74705SXin Li 3*67e74705SXin Li #include <stddef.h> 4*67e74705SXin Li 5*67e74705SXin Li struct tag { 6*67e74705SXin Li void operator "" _tag_bad (const char *); // expected-error {{literal operator 'operator""_tag_bad' must be in a namespace or global scope}} 7*67e74705SXin Li friend void operator "" _tag_good (const char *); 8*67e74705SXin Li }; 9*67e74705SXin Li 10*67e74705SXin Li namespace ns { void operator "" _ns_good (const char *); } 11*67e74705SXin Li 12*67e74705SXin Li // Check extern "C++" declarations 13*67e74705SXin Li extern "C++" void operator "" _extern_good (const char *); 14*67e74705SXin Li extern "C++" { void operator "" _extern_good (const char *); } 15*67e74705SXin Li fn()16*67e74705SXin Livoid fn () { void operator "" _fn_good (const char *); } 17*67e74705SXin Li 18*67e74705SXin Li // One-param declarations (const char * was already checked) 19*67e74705SXin Li void operator "" _good (char); 20*67e74705SXin Li void operator "" _good (wchar_t); 21*67e74705SXin Li void operator "" _good (char16_t); 22*67e74705SXin Li void operator "" _good (char32_t); 23*67e74705SXin Li void operator "" _good (unsigned long long); 24*67e74705SXin Li void operator "" _good (long double); 25*67e74705SXin Li 26*67e74705SXin Li // Two-param declarations 27*67e74705SXin Li void operator "" _good (const char *, size_t); 28*67e74705SXin Li void operator "" _good (const wchar_t *, size_t); 29*67e74705SXin Li void operator "" _good (const char16_t *, size_t); 30*67e74705SXin Li void operator "" _good (const char32_t *, size_t); 31*67e74705SXin Li 32*67e74705SXin Li // Check typedef and array equivalences 33*67e74705SXin Li void operator "" _good (const char[]); 34*67e74705SXin Li typedef const char c; 35*67e74705SXin Li void operator "" _good (c*); 36*67e74705SXin Li 37*67e74705SXin Li // Check extra cv-qualifiers 38*67e74705SXin Li void operator "" _cv_good (volatile const char *, const size_t); // expected-error {{invalid literal operator parameter type 'const volatile char *', did you mean 'const char *'?}} 39*67e74705SXin Li 40*67e74705SXin Li // Template declaration 41*67e74705SXin Li template <char...> void operator "" _good (); 42*67e74705SXin Li 43*67e74705SXin Li template <typename...> void operator "" _invalid(); // expected-error {{template parameter list for literal operator must be either 'char...' or 'typename T, T...'}} 44*67e74705SXin Li template <wchar_t...> void operator "" _invalid(); // expected-error {{template parameter list for literal operator must be either 'char...' or 'typename T, T...'}} 45*67e74705SXin Li template <unsigned long long...> void operator "" _invalid(); // expected-error {{template parameter list for literal operator must be either 'char...' or 'typename T, T...'}} 46*67e74705SXin Li 47*67e74705SXin Li _Complex float operator""if(long double); // expected-warning {{reserved}} test_if_1()48*67e74705SXin Li_Complex float test_if_1() { return 2.0f + 1.5if; }; test_if_2()49*67e74705SXin Livoid test_if_2() { "foo"if; } // expected-error {{no matching literal operator for call to 'operator""if'}} 50