Check whether the operand to a noexcept expression is valid or not. Fixes PR15842.

llvm-svn: 235931
This commit is contained in:
Aaron Ballman 2015-04-27 22:31:12 +00:00
parent ca5ad5fb6d
commit edc8084751
2 changed files with 29 additions and 0 deletions

View File

@ -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

View File

@ -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));
}
};