diff options
author | Tom Stellard <thomas.stellard@amd.com> | 2015-05-05 16:00:41 +0000 |
---|---|---|
committer | Tom Stellard <thomas.stellard@amd.com> | 2015-05-05 16:00:41 +0000 |
commit | 23436bb05f9213cf80af68d5663aad58a4729029 (patch) | |
tree | daae13ef1ff5d18983144b69edaa60407337b79b | |
parent | 512e243a601b2c88ddd49dcc0e2e764d2797deaa (diff) | |
download | llvm-23436bb05f9213cf80af68d5663aad58a4729029.zip llvm-23436bb05f9213cf80af68d5663aad58a4729029.tar.gz llvm-23436bb05f9213cf80af68d5663aad58a4729029.tar.bz2 |
Merging r235931:
------------------------------------------------------------------------
r235931 | aaron | 2015-04-27 18:31:12 -0400 (Mon, 27 Apr 2015) | 2 lines
Check whether the operand to a noexcept expression is valid or not. Fixes PR15842.
------------------------------------------------------------------------
llvm-svn: 236502
-rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 10 | ||||
-rw-r--r-- | clang/test/SemaCXX/cxx0x-noexcept-expression.cpp | 19 |
2 files changed, 29 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 3e2a2de..a92b7ac 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -5705,6 +5705,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/clang/test/SemaCXX/cxx0x-noexcept-expression.cpp b/clang/test/SemaCXX/cxx0x-noexcept-expression.cpp new file mode 100644 index 0000000..ba51365 --- /dev/null +++ b/clang/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));
+ }
+};
|