diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2012-03-09 08:16:22 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2012-03-09 08:16:22 +0000 |
commit | 768ceccc75f06329c7a68bebf9dc59c6dd81b3de (patch) | |
tree | 3ce58acea5a13e7c37a944cda85010cc4f0edf21 /clang/lib | |
parent | edfe2ec429deadfc099ac1205e78f7a920cdd37c (diff) | |
download | bcm5719-llvm-768ceccc75f06329c7a68bebf9dc59c6dd81b3de.tar.gz bcm5719-llvm-768ceccc75f06329c7a68bebf9dc59c6dd81b3de.zip |
Literal operators can't have default arguments.
llvm-svn: 152394
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 13 | ||||
-rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 7 |
2 files changed, 13 insertions, 7 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 4d7310a146e..32284968c90 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/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/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index e74e6d5e126..fac3b7f3839 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/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; |