From: Aaron Ballman Date: Mon, 27 Apr 2015 22:31:12 +0000 (+0000) Subject: Check whether the operand to a noexcept expression is valid or not. Fixes PR15842. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9fb3e5702c2d11d07ace482aa610b6853a663d44;p=clang Check whether the operand to a noexcept expression is valid or not. Fixes PR15842. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@235931 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index b050c93304..bb67939ad8 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -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 diff --git a/test/SemaCXX/cxx0x-noexcept-expression.cpp b/test/SemaCXX/cxx0x-noexcept-expression.cpp new file mode 100644 index 0000000000..ba51365d47 --- /dev/null +++ b/test/SemaCXX/cxx0x-noexcept-expression.cpp @@ -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)); + } +};