From: Richard Smith Date: Fri, 9 Mar 2012 08:16:22 +0000 (+0000) Subject: Literal operators can't have default arguments. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a9e88b2549add9766382c70d270dfd89fa33f7cf;p=clang Literal operators can't have default arguments. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152394 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index a5a597bdb9..fadcdf9d36 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -4758,6 +4758,8 @@ def err_operator_delete_param_type : Error< // C++ literal operators def err_literal_operator_outside_namespace : Error< "literal operator %0 must be in a namespace or global scope">; +def err_literal_operator_default_argument : Error< + "literal operator cannot have a default argument">; // FIXME: This diagnostic sucks def err_literal_operator_params : Error< "parameter declaration for literal operator %0 is not valid">; diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 4d7310a146..32284968c9 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -9389,6 +9389,19 @@ FinishedParams: return true; } + // A parameter-declaration-clause containing a default argument is not + // equivalent to any of the permitted forms. + for (FunctionDecl::param_iterator Param = FnDecl->param_begin(), + ParamEnd = FnDecl->param_end(); + Param != ParamEnd; ++Param) { + if ((*Param)->hasDefaultArg()) { + Diag((*Param)->getDefaultArgRange().getBegin(), + diag::err_literal_operator_default_argument) + << (*Param)->getDefaultArgRange(); + break; + } + } + StringRef LiteralName = FnDecl->getDeclName().getCXXLiteralIdentifier()->getName(); if (LiteralName[0] != '_') { diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index e74e6d5e12..fac3b7f383 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -10911,13 +10911,6 @@ ExprResult Sema::BuildLiteralOperatorCall(LookupResult &R, bool HadMultipleCandidates = (CandidateSet.size() > 1); - // FIXME: Reject default arguments in literal operator definitions. We're not - // supposed to treat this as ambiguous: - // - // int operator"" _x(const char *p); - // int operator"" _x(const char *p, size_t n = 0); - // int k = 123_x; - // Perform overload resolution. This will usually be trivial, but might need // to perform substitutions for a literal operator template. OverloadCandidateSet::iterator Best; diff --git a/test/CXX/over/over.oper/over.literal/p3.cpp b/test/CXX/over/over.oper/over.literal/p3.cpp index 0b5323b473..674ace9aee 100644 --- a/test/CXX/over/over.oper/over.literal/p3.cpp +++ b/test/CXX/over/over.oper/over.literal/p3.cpp @@ -37,3 +37,4 @@ char operator "" _a(volatile wchar_t *, size_t); // expected-error {{parameter}} char operator "" _a(char16_t *, size_t); // expected-error {{parameter}} char operator "" _a(const char32_t *, size_t, bool = false); // expected-error {{parameter}} char operator "" _a(const char *, signed long); // expected-error {{parameter}} +char operator "" _a(const char *, size_t = 0); // expected-error {{default argument}}