re PR middle-end/87916 (ICE in dwarf2out_abstract_function, at dwarf2out.c:22479...
authorEric Botcazou <ebotcazou@adacore.com>
Thu, 8 Nov 2018 14:57:47 +0000 (14:57 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Thu, 8 Nov 2018 14:57:47 +0000 (14:57 +0000)
PR middle-end/87916
* cgraphclones.c (duplicate_thunk_for_node): Also set DECL_IGNORED_P.

From-SVN: r265916

gcc/ChangeLog
gcc/cgraphclones.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/pr87916.C [new file with mode: 0644]

index 46efe5d..c83df0b 100644 (file)
@@ -1,3 +1,8 @@
+2018-11-08  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR middle-end/87916
+       * cgraphclones.c (duplicate_thunk_for_node): Also set DECL_IGNORED_P.
+
 2018-11-08  David Malcolm  <dmalcolm@redhat.com>
 
        * cgraph.c: Include "selftest.h".
index e17959c..0fbc7a9 100644 (file)
@@ -321,6 +321,10 @@ duplicate_thunk_for_node (cgraph_node *thunk, cgraph_node *node)
                                                       "artificial_thunk");
   SET_DECL_ASSEMBLER_NAME (new_decl, DECL_NAME (new_decl));
 
+  /* We need to force DECL_IGNORED_P because the new thunk is created after
+     early debug was run.  */
+  DECL_IGNORED_P (new_decl) = 1;
+
   new_thunk = cgraph_node::create (new_decl);
   set_new_clone_decl_and_node_flags (new_thunk);
   new_thunk->definition = true;
index f6c36f3..63019e1 100644 (file)
@@ -1,3 +1,7 @@
+2018-11-08  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * g++.dg/other/pr87916.C: New test.
+
 2018-11-08  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/87929
diff --git a/gcc/testsuite/g++.dg/other/pr87916.C b/gcc/testsuite/g++.dg/other/pr87916.C
new file mode 100644 (file)
index 0000000..5c69478
--- /dev/null
@@ -0,0 +1,45 @@
+// PR middle-end/87916
+// Testcase by Martin Liška <marxin@gcc.gnu.org>
+
+// { dg-do compile }
+// { dg-options "-O2 -g" }
+// { dg-additional-options "-fPIC" { target fpic } }
+
+struct a {
+  virtual ~a();
+};
+template <typename b> class c {
+public:
+  class d {
+  public:
+    d(c);
+    b *operator->();
+  };
+};
+int e, f;
+class g {
+public:
+  class h {
+  public:
+    virtual void j(g &, int &, bool) = 0;
+  };
+  c<h> k();
+  int *l();
+  int *m();
+};
+int *g::l() try {
+  for (c<h>::d i(k());;)
+    i->j(*this, e, true);
+} catch (int) {
+  return 0;
+}
+int *g::m() try {
+  for (c<h>::d i(k());;)
+    i->j(*this, f, false);
+} catch (int) {
+  return 0;
+}
+struct n : a, g::h {
+  void o();
+  void j(g &, int &, bool) { o(); }
+};