re PR c++/52672 (internal compiler error: in cxx_eval_indirect_ref, at cp/semantics...
authorMeador Inge <meadori@codesourcery.com>
Tue, 27 Mar 2012 18:08:13 +0000 (18:08 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 27 Mar 2012 18:08:13 +0000 (14:08 -0400)
PR c++/52672
* gcc/cp/semantics.c (cxx_fold_indirect_ref): Don't attempt to fold
stripped child trees that are not pointer types.

From-SVN: r185890

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

index 9cd2711e0a979de8372082783a86efb8a32d4627..0d9be4fa49d2fbc4bd73a920c03e8f54092a7f47 100644 (file)
@@ -1,3 +1,9 @@
+2012-03-27  Meador Inge  <meadori@codesourcery.com>
+
+       PR c++/52672
+       * semantics.c (cxx_fold_indirect_ref): Don't attempt to fold
+       stripped child trees that are not pointer types.
+
 2012-03-21  Jason Merrill  <jason@redhat.com>
 
        Implement return type deduction for normal functions with -std=c++1y.
index 6294e19af607aa6e45597f950079f5a89b28207d..65b771f1ee2ab5cf28d037e45f35f1435e38c000 100644 (file)
@@ -7202,7 +7202,8 @@ cxx_fold_indirect_ref (location_t loc, tree type, tree op0, bool *empty_base)
   sub = op0;
   STRIP_NOPS (sub);
   subtype = TREE_TYPE (sub);
-  gcc_assert (POINTER_TYPE_P (subtype));
+  if (!POINTER_TYPE_P (subtype))
+    return NULL_TREE;
 
   if (TREE_CODE (sub) == ADDR_EXPR)
     {
index 9fdb69d7e4d81214860d8581929f4670b9946419..9c69953e65c778615250e2080b1dcbceb35f4432 100644 (file)
@@ -1,3 +1,8 @@
+2012-03-27  Meador Inge  <meadori@codesourcery.com>
+
+       PR c++/52672
+       * g++.dg/cpp0x/constexpr-52672.C: New testcase.
+
 2012-03-27  Mike Stump  <mikestump@comcast.net>
 
        PR target/52665
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-52672.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-52672.C
new file mode 100644 (file)
index 0000000..9f87878
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/52672
+// { dg-do compile }
+// { dg-options "-std=c++11" }
+
+typedef unsigned long * ul_ptr;
+constexpr unsigned long a = *((ul_ptr)0x0); // { dg-error "" }
+constexpr unsigned long b = *((ul_ptr)(*((ul_ptr)0x0))); // { dg-error "" }
+constexpr unsigned long c = *((ul_ptr)*((ul_ptr)(*((ul_ptr)0x0)))); // { dg-error "" }