1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 2a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt 3a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt#include <stddef.h> 4a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt 56cf750298d3621d8a10a6dd07fcee8e274b9d94dSean Huntstruct tag { 61155c42e7b1b4e401bb0a331a6d715d637958c75Douglas Gregor void operator "" _tag_bad (const char *); // expected-error {{literal operator 'operator "" _tag_bad' must be in a namespace or global scope}} 71155c42e7b1b4e401bb0a331a6d715d637958c75Douglas Gregor friend void operator "" _tag_good (const char *); 8a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt}; 9a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt 101155c42e7b1b4e401bb0a331a6d715d637958c75Douglas Gregornamespace ns { void operator "" _ns_good (const char *); } 116cf750298d3621d8a10a6dd07fcee8e274b9d94dSean Hunt 126cf750298d3621d8a10a6dd07fcee8e274b9d94dSean Hunt// Check extern "C++" declarations 131155c42e7b1b4e401bb0a331a6d715d637958c75Douglas Gregorextern "C++" void operator "" _extern_good (const char *); 141155c42e7b1b4e401bb0a331a6d715d637958c75Douglas Gregorextern "C++" { void operator "" _extern_good (const char *); } 156cf750298d3621d8a10a6dd07fcee8e274b9d94dSean Hunt 16e5658f0ab2a6f8fea258adb64edbb8485bb21deeRichard Smithvoid fn () { void operator "" _fn_good (const char *); } 176cf750298d3621d8a10a6dd07fcee8e274b9d94dSean Hunt 186cf750298d3621d8a10a6dd07fcee8e274b9d94dSean Hunt// One-param declarations (const char * was already checked) 191155c42e7b1b4e401bb0a331a6d715d637958c75Douglas Gregorvoid operator "" _good (char); 201155c42e7b1b4e401bb0a331a6d715d637958c75Douglas Gregorvoid operator "" _good (wchar_t); 211155c42e7b1b4e401bb0a331a6d715d637958c75Douglas Gregorvoid operator "" _good (char16_t); 221155c42e7b1b4e401bb0a331a6d715d637958c75Douglas Gregorvoid operator "" _good (char32_t); 231155c42e7b1b4e401bb0a331a6d715d637958c75Douglas Gregorvoid operator "" _good (unsigned long long); 241155c42e7b1b4e401bb0a331a6d715d637958c75Douglas Gregorvoid operator "" _good (long double); 25a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt 266cf750298d3621d8a10a6dd07fcee8e274b9d94dSean Hunt// Two-param declarations 271155c42e7b1b4e401bb0a331a6d715d637958c75Douglas Gregorvoid operator "" _good (const char *, size_t); 281155c42e7b1b4e401bb0a331a6d715d637958c75Douglas Gregorvoid operator "" _good (const wchar_t *, size_t); 291155c42e7b1b4e401bb0a331a6d715d637958c75Douglas Gregorvoid operator "" _good (const char16_t *, size_t); 301155c42e7b1b4e401bb0a331a6d715d637958c75Douglas Gregorvoid operator "" _good (const char32_t *, size_t); 31a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt 326cf750298d3621d8a10a6dd07fcee8e274b9d94dSean Hunt// Check typedef and array equivalences 331155c42e7b1b4e401bb0a331a6d715d637958c75Douglas Gregorvoid operator "" _good (const char[]); 346cf750298d3621d8a10a6dd07fcee8e274b9d94dSean Hunttypedef const char c; 351155c42e7b1b4e401bb0a331a6d715d637958c75Douglas Gregorvoid operator "" _good (c*); 36a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt 376cf750298d3621d8a10a6dd07fcee8e274b9d94dSean Hunt// Check extra cv-qualifiers 38b4a7b1e587a232c95d02a8ca10eeba60164fbba1Richard Smithvoid operator "" _cv_good (volatile const char *, const size_t); // expected-error {{parameter declaration for literal operator 'operator "" _cv_good' is not valid}} 39a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt 40b4a7b1e587a232c95d02a8ca10eeba60164fbba1Richard Smith// Template declaration 41b4a7b1e587a232c95d02a8ca10eeba60164fbba1Richard Smithtemplate <char...> void operator "" _good (); 42a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt 436cf750298d3621d8a10a6dd07fcee8e274b9d94dSean Hunt// FIXME: Test some invalid decls that might crop up. 445295b97d6a0117414a24d319d9a018191ec1d8e3Richard Smithtemplate <typename...> void operator "" _invalid(); // expected-error {{parameter declaration for literal operator 'operator "" _invalid' is not valid}} 45