diff mbox

PR 62121 (Segmentation fault in ipa-devirt.c:997)

Message ID 20141005025112.GC16241@kam.mff.cuni.cz
State New
Headers show

Commit Message

Jan Hubicka Oct. 5, 2014, 3:51 a.m. UTC
Hi,
this is 4.9 version of patch fixing ICE on ipa-devirt.c:997.
The problem is that we get TYPE_SIZE NUll but code does not expect it.

Honza

	PR ipa/62121
	* ipa-devirt.c (restrict_to_inner_class): Do not ICE when type is
	unknown.

	* g++.dg/torture/pr62121.C: New testcase.
diff mbox

Patch

Index: ipa-devirt.c
===================================================================
--- ipa-devirt.c	(revision 215893)
+++ ipa-devirt.c	(working copy)
@@ -994,7 +994,8 @@  give_up:
   if ((TREE_CODE (type) != RECORD_TYPE
        || !TYPE_BINFO (type)
        || !polymorphic_type_binfo_p (TYPE_BINFO (type)))
-      && (TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST
+      && (!TYPE_SIZE (type)
+	  || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST
 	  || (offset + tree_to_uhwi (TYPE_SIZE (expected_type)) <=
 	      tree_to_uhwi (TYPE_SIZE (type)))))
     return true;
Index: testsuite/g++.dg/torture/pr62121.C
===================================================================
--- testsuite/g++.dg/torture/pr62121.C	(revision 0)
+++ testsuite/g++.dg/torture/pr62121.C	(revision 0)
@@ -0,0 +1,12 @@ 
+// { dg-do compile }
+class A
+{
+  virtual double operator()();
+};
+class B : A
+{
+public:
+  double operator()();
+};
+extern B a[];
+int b = a[0]();