mirror of
https://github.com/intel/llvm.git
synced 2026-01-24 08:30:34 +08:00
Literal operators can't have default arguments.
llvm-svn: 152394
This commit is contained in:
@@ -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">;
|
||||
|
||||
@@ -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] != '_') {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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}}
|
||||
|
||||
Reference in New Issue
Block a user