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

Aaron Ballman aaron at aaronballman.com
Mon Apr 27 15:31:12 PDT 2015


Author: aaronballman
Date: Mon Apr 27 17:31:12 2015
New Revision: 235931

URL: http://llvm.org/viewvc/llvm-project?rev=235931&view=rev
Log:
Check whether the operand to a noexcept expression is valid or not. Fixes PR15842.

Added:
    cfe/trunk/test/SemaCXX/cxx0x-noexcept-expression.cpp
Modified:
    cfe/trunk/lib/Sema/SemaExprCXX.cpp

Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=235931&r1=235930&r2=235931&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Mon Apr 27 17:31:12 2015
@@ -5791,6 +5791,16 @@ ExprResult Sema::BuildCXXMemberCallExpr(
 
 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

Added: cfe/trunk/test/SemaCXX/cxx0x-noexcept-expression.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx0x-noexcept-expression.cpp?rev=235931&view=auto
==============================================================================
--- cfe/trunk/test/SemaCXX/cxx0x-noexcept-expression.cpp (added)
+++ cfe/trunk/test/SemaCXX/cxx0x-noexcept-expression.cpp Mon Apr 27 17:31:12 2015
@@ -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));
+  }
+};





More information about the cfe-commits mailing list