Discussion:
PR 62121 (Segmentation fault in ipa-devirt.c:997)
Jan Hubicka
2014-10-05 02:51:12 UTC
Permalink
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.
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]();

Loading...