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