re PR c++/77545 (ICE on valid C++11 code: in potential_constant_expression_1, at...
authorMarek Polacek <polacek@redhat.com>
Wed, 4 Jan 2017 17:47:04 +0000 (17:47 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Wed, 4 Jan 2017 17:47:04 +0000 (17:47 +0000)
PR c++/77545
PR c++/77284
* constexpr.c (potential_constant_expression_1): Handle CLEANUP_STMT.

* g++.dg/cpp0x/range-for32.C: New test.
* g++.dg/cpp0x/range-for33.C: New test.

From-SVN: r244062

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

index 71aada7970c5b5dbe6ca5fa750d8cb56b1d0f89e..48061a02f8b13f60e6f7d6c53db1f4ba082d6079 100644 (file)
@@ -1,3 +1,9 @@
+2017-01-04  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/77545
+       PR c++/77284
+       * constexpr.c (potential_constant_expression_1): Handle CLEANUP_STMT.
+
 2017-01-04  Nathan Sidwell  <nathan@acm.org>
 
        PR c++/66735
index 1e83b0b0b86dc1c98c7afbc5db1c665a0439d4bd..a3dec6884abef73ee9b9313370693ac958b8fb58 100644 (file)
@@ -5661,6 +5661,7 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict,
       /* We can see these in statement-expressions.  */
       return true;
 
+    case CLEANUP_STMT:
     case EMPTY_CLASS_EXPR:
       return false;
 
index 8ad30173c77ac49d5be5adc8efe79e975e46216f..d8ff32fb05e52ac1c0b73c79c84d1d00456cf631 100644 (file)
@@ -1,3 +1,10 @@
+2017-01-04  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/77545
+       PR c++/77284
+       * g++.dg/cpp0x/range-for32.C: New test.
+       * g++.dg/cpp0x/range-for33.C: New test.
+
 2017-01-04  David Malcolm  <dmalcolm@redhat.com>
 
        * gcc.dg/Wmissing-braces-fixits.c: New test case.
diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for32.C b/gcc/testsuite/g++.dg/cpp0x/range-for32.C
new file mode 100644 (file)
index 0000000..375a707
--- /dev/null
@@ -0,0 +1,16 @@
+// PR c++/77545
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wno-pedantic" }
+
+template < typename T > struct A
+{
+  A ();
+  ~A ();
+  T t;
+};
+
+void f (A < int > a)
+{
+  for (auto x : (A<int>[]) { a })
+    ;
+}
diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for33.C b/gcc/testsuite/g++.dg/cpp0x/range-for33.C
new file mode 100644 (file)
index 0000000..206f36e
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/77284
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+struct A
+{
+  ~A () {}
+};
+
+void foo (A & v)
+{
+  for (A a : { v }) {};
+}