re PR c++/79822 (ICE with void statement expression)
authorJakub Jelinek <jakub@redhat.com>
Mon, 6 Mar 2017 15:43:51 +0000 (16:43 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 6 Mar 2017 15:43:51 +0000 (16:43 +0100)
PR c++/79822
* constexpr.c (cxx_eval_statement_list): Treat empty ({ }) like
({ (void) 0; }).

* g++.dg/cpp0x/constexpr-79822.C: New test.

From-SVN: r245925

gcc/cp/ChangeLog
gcc/cp/constexpr.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/constexpr-79822.C [new file with mode: 0644]

index fc9757b294b071bc9310dc0efd3c11135d7d1163..12d74a6702f30c5e02aa3073338991986e4cc9c3 100644 (file)
@@ -1,3 +1,9 @@
+2017-03-06  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/79822
+       * constexpr.c (cxx_eval_statement_list): Treat empty ({ }) like
+       ({ (void) 0; }).
+
 2017-03-06  Jason Merrill  <jason@redhat.com>
 
        Revert "Allow deduction guides to look into primary template."
index 81489570d282947e6ae97110c0a016b740fb7e95..f114da0d9a765d7d7dd2ac4e344c3b873086b666 100644 (file)
@@ -3725,8 +3725,9 @@ cxx_eval_statement_list (const constexpr_ctx *ctx, tree t,
 {
   tree_stmt_iterator i;
   tree local_target;
-  /* In a statement-expression we want to return the last value.  */
-  tree r = NULL_TREE;
+  /* In a statement-expression we want to return the last value.
+     For empty statement expression return void_node.  */
+  tree r = void_node;
   if (!jump_target)
     {
       local_target = NULL_TREE;
index 35eb8183e4362d4518fe006687acdbe2ec12d329..23adcd1884f7f5b913d6a2c29dbe2ba18d9addc8 100644 (file)
@@ -1,3 +1,8 @@
+2017-03-06  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/79822
+       * g++.dg/cpp0x/constexpr-79822.C: New test.
+
 2017-03-06  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/79894
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-79822.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-79822.C
new file mode 100644 (file)
index 0000000..6a72702
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/79822
+// { dg-do compile }
+// { dg-options "" }
+
+bool
+foo ()
+{
+  bool a = ({ }) && false;             // { dg-error "could not convert" }
+  bool b = ({ ; }) && false;           // { dg-error "could not convert" }
+  bool c = ({ (void) 1; }) && false;   // { dg-error "could not convert" }
+  return a && b && c;
+}