]> granicus.if.org Git - clang/commitdiff
Check whether the operand to a noexcept expression is valid or not. Fixes PR15842.
authorAaron Ballman <aaron@aaronballman.com>
Mon, 27 Apr 2015 22:31:12 +0000 (22:31 +0000)
committerAaron Ballman <aaron@aaronballman.com>
Mon, 27 Apr 2015 22:31:12 +0000 (22:31 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@235931 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExprCXX.cpp
test/SemaCXX/cxx0x-noexcept-expression.cpp [new file with mode: 0644]

index b050c9330445b75bfa9737a4ab0e700b80dff8bc..bb67939ad89d96af7abcb4f9f77434e82ff2618c 100644 (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
diff --git a/test/SemaCXX/cxx0x-noexcept-expression.cpp b/test/SemaCXX/cxx0x-noexcept-expression.cpp
new file mode 100644 (file)
index 0000000..ba51365
--- /dev/null
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s\r
+\r
+void f(); // expected-note {{possible target for call}}\r
+void f(int); // expected-note {{possible target for call}}\r
+\r
+void g() {\r
+  bool b = noexcept(f); // expected-error {{reference to overloaded function could not be resolved; did you mean to call it with no arguments?}}\r
+  bool b2 = noexcept(f(0));\r
+}\r
+\r
+struct S {\r
+  void g(); // expected-note {{possible target for call}}\r
+  void g(int); // expected-note {{possible target for call}}\r
+\r
+  void h() {\r
+    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?}}\r
+    bool b2 = noexcept(this->g(0));\r
+  }\r
+};\r