[PR c++/84968] reject stmt-exprs in noexcept constexprs
authorAlexandre Oliva <aoliva@redhat.com>
Wed, 28 Mar 2018 05:04:59 +0000 (05:04 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Wed, 28 Mar 2018 05:04:59 +0000 (05:04 +0000)
We reject extended statement-expressions in template parameters, so we
might as well reject them in constant expressions used in noexcept
specifications.

for  gcc/cp/ChangeLog

PR c++/84968
* tree.c (strip_typedefs_expr): Reject STATEMENT_LISTs.

for  gcc/testsuite/ChangeLog

PR c++/84968
* g++.dg/eh/pr84968.C: New.

From-SVN: r258913

gcc/cp/ChangeLog
gcc/cp/tree.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/eh/pr84968.C [new file with mode: 0644]

index 4c029815b138fb777a6c52c2252f818344ebaf10..23f5d3a7e1b6be2b97f93f5f87df5c0d8e993c60 100644 (file)
@@ -1,3 +1,8 @@
+2018-03-28  Alexandre Oliva <aoliva@redhat.com>
+
+       PR c++/84968
+       * tree.c (strip_typedefs_expr): Reject STATEMENT_LISTs.
+
 2018-03-27  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/85067
index 0355b9ed9c59baf8e17d2dc741d5cf48a6371a3f..e75c88d6e8f8d8375e5fc214a6d5d2efd69da4e4 100644 (file)
@@ -1788,6 +1788,10 @@ strip_typedefs_expr (tree t, bool *remove_attributes)
       error ("lambda-expression in a constant expression");
       return error_mark_node;
 
+    case STATEMENT_LIST:
+      error ("statement-expression in a constant expression");
+      return error_mark_node;
+
     default:
       break;
     }
index b195bd77bf5809db653e10a1797481ea7a3c92b1..929d4dd575ad050d14714e0b9ccbb064933695f5 100644 (file)
@@ -1,3 +1,8 @@
+2018-03-28  Alexandre Oliva <aoliva@redhat.com>
+
+       PR c++/84968
+       * g++.dg/eh/pr84968.C: New.
+
 2018-03-27  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        PR target/84914
diff --git a/gcc/testsuite/g++.dg/eh/pr84968.C b/gcc/testsuite/g++.dg/eh/pr84968.C
new file mode 100644 (file)
index 0000000..23c49f4
--- /dev/null
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+
+// { dg-options "" }
+
+union b;
+
+struct S {
+  template <typename>
+  void a()
+    try {
+    } catch (int ()
+            noexcept (({ union b a; true; }))) // { dg-error "constant" }
+  {
+  }
+};