From 11324716c13e1bc1bb4f29088d82aa4c7f074a83 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 29 Jun 2011 13:15:16 -0400 Subject: [PATCH] re PR c++/49520 ([C++0x] using-declaration and operator&& confuses constexpr) PR c++/49520 * semantics.c (constexpr_fn_retval): Handle CLEANUP_POINT_EXPR here. (massage_constexpr_body): Not here. From-SVN: r175658 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/cp-tree.def | 2 +- gcc/cp/semantics.c | 5 +++-- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/cpp0x/constexpr-using2.C | 18 ++++++++++++++++++ 5 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-using2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 083d5459662..858ad8414d5 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2011-06-29 Jason Merrill + PR c++/49520 + * semantics.c (constexpr_fn_retval): Handle CLEANUP_POINT_EXPR here. + (massage_constexpr_body): Not here. + PR c++/49554 * semantics.c (lambda_proxy_type): New. (build_capture_proxy): Use it. diff --git a/gcc/cp/cp-tree.def b/gcc/cp/cp-tree.def index 12c01cb15f5..bb1b753c71b 100644 --- a/gcc/cp/cp-tree.def +++ b/gcc/cp/cp-tree.def @@ -207,7 +207,7 @@ DEFTREECODE (UNBOUND_CLASS_TEMPLATE, "unbound_class_template", tcc_type, 0) DEFTREECODE (USING_DECL, "using_decl", tcc_declaration, 0) /* A using directive. The operand is USING_STMT_NAMESPACE. */ -DEFTREECODE (USING_STMT, "using_directive", tcc_statement, 1) +DEFTREECODE (USING_STMT, "using_stmt", tcc_statement, 1) /* An un-parsed default argument. Holds a vector of input tokens and a vector of places where the argument was instantiated before diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index fb984d4799a..ad68a012d17 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -5657,6 +5657,9 @@ constexpr_fn_retval (tree body) return NULL_TREE; return error_mark_node; + case CLEANUP_POINT_EXPR: + return constexpr_fn_retval (TREE_OPERAND (body, 0)); + case USING_STMT: return NULL_TREE; @@ -5683,8 +5686,6 @@ massage_constexpr_body (tree fun, tree body) body = EH_SPEC_STMTS (body); if (TREE_CODE (body) == MUST_NOT_THROW_EXPR) body = TREE_OPERAND (body, 0); - if (TREE_CODE (body) == CLEANUP_POINT_EXPR) - body = TREE_OPERAND (body, 0); body = constexpr_fn_retval (body); } return body; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 522c41cac6b..d817d854cfb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2011-06-29 Jason Merrill + PR c++/49520 + * g++.dg/cpp0x/constexpr-using2.C: New. + * g++.dg/cpp0x/lambda/lambda-template3.C: New. PR c++/45923 diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-using2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-using2.C new file mode 100644 index 00000000000..6b282813e55 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-using2.C @@ -0,0 +1,18 @@ +// PR c++/49520 +// { dg-options -std=c++0x } + +namespace x { void foo(); } + +template +struct traits +{ + static constexpr bool f() { return true; } + + static constexpr bool g() + { + using x::foo; + return f() && noexcept(foo()); + } +}; + +template struct traits; -- 2.30.2