forked from OSchip/llvm-project
Check whether the operand to a noexcept expression is valid or not. Fixes PR15842.
llvm-svn: 235931
This commit is contained in:
parent
ca5ad5fb6d
commit
edc8084751
|
@ -5791,6 +5791,16 @@ ExprResult Sema::BuildCXXMemberCallExpr(Expr *E, NamedDecl *FoundDecl,
|
|||
|
||||
ExprResult Sema::BuildCXXNoexceptExpr(SourceLocation KeyLoc, Expr *Operand,
|
||||
SourceLocation RParen) {
|
||||
// If the operand is an unresolved lookup expression, the expression is ill-
|
||||
// formed per [over.over]p1, because overloaded function names cannot be used
|
||||
// without arguments except in explicit contexts.
|
||||
ExprResult R = CheckPlaceholderExpr(Operand);
|
||||
if (R.isInvalid())
|
||||
return R;
|
||||
|
||||
// The operand may have been modified when checking the placeholder type.
|
||||
Operand = R.get();
|
||||
|
||||
if (ActiveTemplateInstantiations.empty() &&
|
||||
Operand->HasSideEffects(Context, false)) {
|
||||
// The expression operand for noexcept is in an unevaluated expression
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
||||
|
||||
void f(); // expected-note {{possible target for call}}
|
||||
void f(int); // expected-note {{possible target for call}}
|
||||
|
||||
void g() {
|
||||
bool b = noexcept(f); // expected-error {{reference to overloaded function could not be resolved; did you mean to call it with no arguments?}}
|
||||
bool b2 = noexcept(f(0));
|
||||
}
|
||||
|
||||
struct S {
|
||||
void g(); // expected-note {{possible target for call}}
|
||||
void g(int); // expected-note {{possible target for call}}
|
||||
|
||||
void h() {
|
||||
bool b = noexcept(this->g); // expected-error {{reference to non-static member function must be called; did you mean to call it with no arguments?}}
|
||||
bool b2 = noexcept(this->g(0));
|
||||
}
|
||||
};
|
Loading…
Reference in New Issue