Skip to content
This repository was archived by the owner on Nov 1, 2021. It is now read-only.

Commit a9e88b2

Browse files
committed
Literal operators can't have default arguments.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152394 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 36f5cfe commit a9e88b2

File tree

4 files changed

+16
-7
lines changed

4 files changed

+16
-7
lines changed

Diff for: include/clang/Basic/DiagnosticSemaKinds.td

+2
Original file line numberDiff line numberDiff line change
@@ -4758,6 +4758,8 @@ def err_operator_delete_param_type : Error<
47584758
// C++ literal operators
47594759
def err_literal_operator_outside_namespace : Error<
47604760
"literal operator %0 must be in a namespace or global scope">;
4761+
def err_literal_operator_default_argument : Error<
4762+
"literal operator cannot have a default argument">;
47614763
// FIXME: This diagnostic sucks
47624764
def err_literal_operator_params : Error<
47634765
"parameter declaration for literal operator %0 is not valid">;

Diff for: lib/Sema/SemaDeclCXX.cpp

+13
Original file line numberDiff line numberDiff line change
@@ -9389,6 +9389,19 @@ bool Sema::CheckLiteralOperatorDeclaration(FunctionDecl *FnDecl) {
93899389
return true;
93909390
}
93919391

9392+
// A parameter-declaration-clause containing a default argument is not
9393+
// equivalent to any of the permitted forms.
9394+
for (FunctionDecl::param_iterator Param = FnDecl->param_begin(),
9395+
ParamEnd = FnDecl->param_end();
9396+
Param != ParamEnd; ++Param) {
9397+
if ((*Param)->hasDefaultArg()) {
9398+
Diag((*Param)->getDefaultArgRange().getBegin(),
9399+
diag::err_literal_operator_default_argument)
9400+
<< (*Param)->getDefaultArgRange();
9401+
break;
9402+
}
9403+
}
9404+
93929405
StringRef LiteralName
93939406
= FnDecl->getDeclName().getCXXLiteralIdentifier()->getName();
93949407
if (LiteralName[0] != '_') {

Diff for: lib/Sema/SemaOverload.cpp

-7
Original file line numberDiff line numberDiff line change
@@ -10911,13 +10911,6 @@ ExprResult Sema::BuildLiteralOperatorCall(LookupResult &R,
1091110911

1091210912
bool HadMultipleCandidates = (CandidateSet.size() > 1);
1091310913

10914-
// FIXME: Reject default arguments in literal operator definitions. We're not
10915-
// supposed to treat this as ambiguous:
10916-
//
10917-
// int operator"" _x(const char *p);
10918-
// int operator"" _x(const char *p, size_t n = 0);
10919-
// int k = 123_x;
10920-
1092110914
// Perform overload resolution. This will usually be trivial, but might need
1092210915
// to perform substitutions for a literal operator template.
1092310916
OverloadCandidateSet::iterator Best;

Diff for: test/CXX/over/over.oper/over.literal/p3.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,4 @@ char operator "" _a(volatile wchar_t *, size_t); // expected-error {{parameter}}
3737
char operator "" _a(char16_t *, size_t); // expected-error {{parameter}}
3838
char operator "" _a(const char32_t *, size_t, bool = false); // expected-error {{parameter}}
3939
char operator "" _a(const char *, signed long); // expected-error {{parameter}}
40+
char operator "" _a(const char *, size_t = 0); // expected-error {{default argument}}

0 commit comments

Comments
 (0)