summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2012-03-09 08:16:22 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2012-03-09 08:16:22 +0000
commit768ceccc75f06329c7a68bebf9dc59c6dd81b3de (patch)
tree3ce58acea5a13e7c37a944cda85010cc4f0edf21 /clang/lib
parentedfe2ec429deadfc099ac1205e78f7a920cdd37c (diff)
downloadbcm5719-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.cpp13
-rw-r--r--clang/lib/Sema/SemaOverload.cpp7
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;
OpenPOWER on IntegriCloud