1*f4a2713aSLionel Sambuc // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 2*f4a2713aSLionel Sambuc 3*f4a2713aSLionel Sambuc #include <stddef.h> 4*f4a2713aSLionel Sambuc 5*f4a2713aSLionel Sambuc struct tag { 6*f4a2713aSLionel Sambuc void operator "" _tag_bad (const char *); // expected-error {{literal operator 'operator "" _tag_bad' must be in a namespace or global scope}} 7*f4a2713aSLionel Sambuc friend void operator "" _tag_good (const char *); 8*f4a2713aSLionel Sambuc }; 9*f4a2713aSLionel Sambuc 10*f4a2713aSLionel Sambuc namespace ns { void operator "" _ns_good (const char *); } 11*f4a2713aSLionel Sambuc 12*f4a2713aSLionel Sambuc // Check extern "C++" declarations 13*f4a2713aSLionel Sambuc extern "C++" void operator "" _extern_good (const char *); 14*f4a2713aSLionel Sambuc extern "C++" { void operator "" _extern_good (const char *); } 15*f4a2713aSLionel Sambuc fn()16*f4a2713aSLionel Sambucvoid fn () { void operator "" _fn_good (const char *); } 17*f4a2713aSLionel Sambuc 18*f4a2713aSLionel Sambuc // One-param declarations (const char * was already checked) 19*f4a2713aSLionel Sambuc void operator "" _good (char); 20*f4a2713aSLionel Sambuc void operator "" _good (wchar_t); 21*f4a2713aSLionel Sambuc void operator "" _good (char16_t); 22*f4a2713aSLionel Sambuc void operator "" _good (char32_t); 23*f4a2713aSLionel Sambuc void operator "" _good (unsigned long long); 24*f4a2713aSLionel Sambuc void operator "" _good (long double); 25*f4a2713aSLionel Sambuc 26*f4a2713aSLionel Sambuc // Two-param declarations 27*f4a2713aSLionel Sambuc void operator "" _good (const char *, size_t); 28*f4a2713aSLionel Sambuc void operator "" _good (const wchar_t *, size_t); 29*f4a2713aSLionel Sambuc void operator "" _good (const char16_t *, size_t); 30*f4a2713aSLionel Sambuc void operator "" _good (const char32_t *, size_t); 31*f4a2713aSLionel Sambuc 32*f4a2713aSLionel Sambuc // Check typedef and array equivalences 33*f4a2713aSLionel Sambuc void operator "" _good (const char[]); 34*f4a2713aSLionel Sambuc typedef const char c; 35*f4a2713aSLionel Sambuc void operator "" _good (c*); 36*f4a2713aSLionel Sambuc 37*f4a2713aSLionel Sambuc // Check extra cv-qualifiers 38*f4a2713aSLionel Sambuc void operator "" _cv_good (volatile const char *, const size_t); // expected-error {{parameter declaration for literal operator 'operator "" _cv_good' is not valid}} 39*f4a2713aSLionel Sambuc 40*f4a2713aSLionel Sambuc // Template declaration 41*f4a2713aSLionel Sambuc template <char...> void operator "" _good (); 42*f4a2713aSLionel Sambuc 43*f4a2713aSLionel Sambuc // FIXME: Test some invalid decls that might crop up. 44*f4a2713aSLionel Sambuc template <typename...> void operator "" _invalid(); // expected-error {{parameter declaration for literal operator 'operator "" _invalid' is not valid}} 45