summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2011-06-29 17:15:16 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2011-06-29 17:15:16 +0000
commit97092f3f3eef4398e4eec93ad1f3f85b96e0fcbb (patch)
treebb678288bc202fc58cc3ade3c24f2021d924c3bb /gcc
parentb3b681fb6d4cc61812402cd10a9a1622e7c3a55e (diff)
downloadgcc-97092f3f3eef4398e4eec93ad1f3f85b96e0fcbb.tar.gz
PR c++/49520
* semantics.c (constexpr_fn_retval): Handle CLEANUP_POINT_EXPR here. (massage_constexpr_body): Not here. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@175658 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/cp-tree.def2
-rw-r--r--gcc/cp/semantics.c5
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-using2.C18
5 files changed, 29 insertions, 3 deletions
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 <jason@redhat.com>
+ 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 <jason@redhat.com>
+ 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<typename T>
+struct traits
+{
+ static constexpr bool f() { return true; }
+
+ static constexpr bool g()
+ {
+ using x::foo;
+ return f() && noexcept(foo());
+ }
+};
+
+template struct traits<int>;