aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2017-06-09 09:35:05 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2017-06-09 09:35:05 +0000
commit6ba856d450119e438b62d944e646e929f16da4c6 (patch)
tree72f1ea66f9a815cdd2ed027a0dcf236080f5fff8 /gcc
parent903c723b9d931abb6de044135c3bd4f44559fca7 (diff)
downloadgcc-6ba856d450119e438b62d944e646e929f16da4c6.zip
gcc-6ba856d450119e438b62d944e646e929f16da4c6.tar.gz
gcc-6ba856d450119e438b62d944e646e929f16da4c6.tar.bz2
re PR ipa/81007 (ICE with virtual function in broken class)
2017-06-09 Richard Biener <rguenther@suse.de> PR middle-end/81007 * ipa-polymorphic-call.c (ipa_polymorphic_call_context::restrict_to_inner_class): Skip FIELD_DECLs with error_mark_node type. * passes.def (all_lowering_passes): Run pass_build_cgraph_edges last again. * g++.dg/pr81007.C: New testcase. From-SVN: r249051
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/ipa-polymorphic-call.c3
-rw-r--r--gcc/passes.def2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/pr81007.C15
5 files changed, 32 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d61dc3e..3990200 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2017-06-09 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/81007
+ * ipa-polymorphic-call.c
+ (ipa_polymorphic_call_context::restrict_to_inner_class):
+ Skip FIELD_DECLs with error_mark_node type.
+ * passes.def (all_lowering_passes): Run pass_build_cgraph_edges
+ last again.
+
2017-06-09 Martin Liska <mliska@suse.cz>
* predict.c (struct branch_predictor): New struct.
diff --git a/gcc/ipa-polymorphic-call.c b/gcc/ipa-polymorphic-call.c
index abbcfbf..6b9f821 100644
--- a/gcc/ipa-polymorphic-call.c
+++ b/gcc/ipa-polymorphic-call.c
@@ -267,7 +267,8 @@ ipa_polymorphic_call_context::restrict_to_inner_class (tree otr_type,
{
for (fld = TYPE_FIELDS (type); fld; fld = DECL_CHAIN (fld))
{
- if (TREE_CODE (fld) != FIELD_DECL)
+ if (TREE_CODE (fld) != FIELD_DECL
+ || TREE_TYPE (fld) == error_mark_node)
continue;
pos = int_bit_position (fld);
diff --git a/gcc/passes.def b/gcc/passes.def
index beb350b..25e9d97 100644
--- a/gcc/passes.def
+++ b/gcc/passes.def
@@ -42,9 +42,9 @@ along with GCC; see the file COPYING3. If not see
NEXT_PASS (pass_build_cfg);
NEXT_PASS (pass_warn_function_return);
NEXT_PASS (pass_expand_omp);
- NEXT_PASS (pass_build_cgraph_edges);
NEXT_PASS (pass_sprintf_length, false);
NEXT_PASS (pass_walloca, /*strict_mode_p=*/true);
+ NEXT_PASS (pass_build_cgraph_edges);
TERMINATE_PASS_LIST (all_lowering_passes)
/* Interprocedural optimization passes. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4c577de..c661a14 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-06-09 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/81007
+ * g++.dg/pr81007.C: New testcase.
+
2017-06-09 Jakub Jelinek <jakub@redhat.com>
* gcc.target/i386/mpx/hard-reg-1-nov.c (mpx_test): Use "esp"
diff --git a/gcc/testsuite/g++.dg/pr81007.C b/gcc/testsuite/g++.dg/pr81007.C
new file mode 100644
index 0000000..87d7d40
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr81007.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct A
+{
+ A p; // { dg-error "incomplete" }
+ virtual void foo();
+};
+
+struct B : A {};
+
+void bar(B& b)
+{
+ b.foo();
+}