re PR middle-end/65003 (-fsection-anchors ICE)
authorJakub Jelinek <jakub@redhat.com>
Wed, 11 Feb 2015 15:09:48 +0000 (16:09 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 11 Feb 2015 15:09:48 +0000 (16:09 +0100)
PR middle-end/65003
* varasm.c (place_block_symbol): Assert that DECL_RTL of the
ultimate alias is MEM with SYMBOL_REF satisfying
SYMBOL_REF_HAS_BLOCK_INFO_P as its operand.  Don't pass the MEM
to place_block_symbol, but instead pass the SYMBOL_REF operand of it.

* g++.dg/opt/pr65003.C: New test.

From-SVN: r220625

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/pr65003.C [new file with mode: 0644]
gcc/varasm.c

index 482b12876daceba24001bbcfb5ea4a57d386aa37..0f05ee4a25a495c7bcdd90fbb528d53a231ed63d 100644 (file)
@@ -1,3 +1,11 @@
+2015-02-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/65003
+       * varasm.c (place_block_symbol): Assert that DECL_RTL of the
+       ultimate alias is MEM with SYMBOL_REF satisfying
+       SYMBOL_REF_HAS_BLOCK_INFO_P as its operand.  Don't pass the MEM
+       to place_block_symbol, but instead pass the SYMBOL_REF operand of it.
+
 2015-02-11  Thomas Schwinge  <thomas@codesourcery.com>
 
        * config/nvptx/mkoffload.c: Include "diagnostic.h" instead of
index bd508ec8e392aca87f96f47e89bc66bd76b02cd8..0cdaf456c1e482994827c9bfb18dcbd1903d4efc 100644 (file)
@@ -1,3 +1,8 @@
+2015-02-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/65003
+       * g++.dg/opt/pr65003.C: New test.
+
 2015-02-11  H.J. Lu  <hongjiu.lu@intel.com>
 
        * lib/target-supports.exp (check_effective_target_pie): Renamed
diff --git a/gcc/testsuite/g++.dg/opt/pr65003.C b/gcc/testsuite/g++.dg/opt/pr65003.C
new file mode 100644 (file)
index 0000000..5d131af
--- /dev/null
@@ -0,0 +1,31 @@
+// PR middle-end/65003
+// { dg-do compile }
+// { dg-options "-O2" }
+// { dg-additional-options "-fpic" { target fpic } }
+
+struct A
+{
+  void operator= (A &);
+  A ();
+};
+struct B
+{
+  A b;
+};
+struct C
+{
+  virtual bool foo (int &, bool) const;
+};
+struct D : virtual C
+{
+  bool foo (int &, bool) const;
+  B e;
+};
+struct F : D
+{
+  F (int &, const int &, const A &);
+  bool foo (int &, bool) const;
+};
+bool D::foo (int &, bool) const {}
+F::F (int &, const int &, const A &) {}
+bool F::foo (int &, bool) const {}
index eb65b1ff669fa2e150083f350b1126eff0f10620..3f62fca04de130353005240ca7d37fb851d3d64a 100644 (file)
@@ -7180,6 +7180,10 @@ place_block_symbol (rtx symbol)
        {
          rtx target = DECL_RTL (snode->ultimate_alias_target ()->decl);
 
+         gcc_assert (MEM_P (target)
+                     && GET_CODE (XEXP (target, 0)) == SYMBOL_REF
+                     && SYMBOL_REF_HAS_BLOCK_INFO_P (XEXP (target, 0)));
+         target = XEXP (target, 0);
          place_block_symbol (target);
          SYMBOL_REF_BLOCK_OFFSET (symbol) = SYMBOL_REF_BLOCK_OFFSET (target);
          return;