]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/60474 (Crash in tree_class_check)
authorRichard Biener <rguenther@suse.de>
Mon, 10 Mar 2014 13:27:16 +0000 (13:27 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 10 Mar 2014 13:27:16 +0000 (13:27 +0000)
2014-03-10  Richard Biener  <rguenther@suse.de>

PR middle-end/60474
* tree.c (signed_or_unsigned_type_for): Handle OFFSET_TYPEs.

* g++.dg/torture/pr60474.C: New testcase.

From-SVN: r208451

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr60474.C [new file with mode: 0644]
gcc/tree.c

index b2ad2068b17c06dab3ad196d8fb84f3fed19deb7..25f0f44f4ba82bcd0c93c42c4206f11bc38b8125 100644 (file)
@@ -1,3 +1,8 @@
+2014-03-10  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/60474
+       * tree.c (signed_or_unsigned_type_for): Handle OFFSET_TYPEs.
+
 2014-03-08  Douglas B Rupp  <rupp@gnat.com>
 
        * config/vms/vms.opt (vms_float_format): New variable.
index 44e94c4b500717fb35d74a39a3bfe6261ba04201..0fc685160c5d70b3c8d8bf4698ad844393ebd86f 100644 (file)
@@ -1,3 +1,8 @@
+2014-03-10  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/60474
+       * g++.dg/torture/pr60474.C: New testcase.
+
 2014-03-09  Andreas Schwab  <schwab@linux-m68k.org>
 
        * g++.dg/cpp0x/alias-decl-debug-0.C: Move dg-skip after dg-do.
diff --git a/gcc/testsuite/g++.dg/torture/pr60474.C b/gcc/testsuite/g++.dg/torture/pr60474.C
new file mode 100644 (file)
index 0000000..4b9fbe6
--- /dev/null
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+struct Layer;
+template <typename> struct A
+{
+  Layer *m_fn1 ();
+  Layer &operator[](int p1) { return m_fn1 ()[p1]; }
+};
+struct Layer
+{
+};
+void fn1 (A<int> &p1, int Layer::*p2, int p3)
+{
+  for (int a = 0;; ++a, ++p3)
+    p1[p3].*p2 = p1[a].*p2;
+}
index d102d07c9b6b703637b2b0f21626811464428354..efee5e69cf2b5ed25c9fbbda01d94e83b7a8498a 100644 (file)
@@ -10588,7 +10588,8 @@ signed_or_unsigned_type_for (int unsignedp, tree type)
     }
 
   if (!INTEGRAL_TYPE_P (type)
-      && !POINTER_TYPE_P (type))
+      && !POINTER_TYPE_P (type)
+      && TREE_CODE (type) != OFFSET_TYPE)
     return NULL_TREE;
 
   return build_nonstandard_integer_type (TYPE_PRECISION (type), unsignedp);