[PR 70965] Schedule extra rebuild_cgraph_edges
authorMartin Jambor <mjambor@suse.cz>
Fri, 25 Nov 2016 09:49:19 +0000 (10:49 +0100)
committerMartin Jambor <jamborm@gcc.gnu.org>
Fri, 25 Nov 2016 09:49:19 +0000 (10:49 +0100)
2016-11-25  Martin Jambor  <mjambor@suse.cz>

PR tree-optimization/70965
* passes.def (pass_build_ssa_passes): Add pass_rebuild_cgraph_edges.

gcc/testsuite/
* g++.dg/pr70965.C: New test.

From-SVN: r242867

gcc/ChangeLog
gcc/passes.def
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/pr70965.C [new file with mode: 0644]

index 0878c30..1b18a47 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-25  Martin Jambor  <mjambor@suse.cz>
+
+       PR tree-optimization/70965
+       * passes.def (pass_build_ssa_passes): Add pass_rebuild_cgraph_edges.
+
 2016-11-24  James Greenahlgh  <james.greenhalgh@arm.com>
 
        PR target/78509
index 2a470a7..b730009 100644 (file)
@@ -56,6 +56,7 @@ along with GCC; see the file COPYING3.  If not see
   NEXT_PASS (pass_build_ssa_passes);
   PUSH_INSERT_PASSES_WITHIN (pass_build_ssa_passes)
       NEXT_PASS (pass_fixup_cfg);
+      NEXT_PASS (pass_rebuild_cgraph_edges);
       NEXT_PASS (pass_build_ssa);
       NEXT_PASS (pass_warn_nonnull_compare);
       NEXT_PASS (pass_ubsan);
index e710e4b..a345e9c 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-25  Martin Jambor  <mjambor@suse.cz>
+
+       PR tree-optimization/70965
+       * g++.dg/pr70965.C: New test.
+
 2016-11-25  Jakub Jelinek  <jakub@redhat.com>
            Andreas Schwab  <schwab@linux-m68k.org>
 
diff --git a/gcc/testsuite/g++.dg/pr70965.C b/gcc/testsuite/g++.dg/pr70965.C
new file mode 100644 (file)
index 0000000..d8a2c35
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -std=c++11" } */
+
+struct A {};
+struct B {};
+struct C { using p = int *; template <typename> using ra = A; };
+struct J : C { template <typename> struct K { typedef C::ra<int> o; }; };
+template <typename> struct D
+{
+  struct H : J::K<int>::o { H (J::p, A) : J::K<int>::o () {} };
+  H d;
+  D (const char *, const A &x = A ()) : d (0, x) {}
+};
+extern template class D<char>;
+enum L { M };
+struct F { virtual char *foo (); };
+template <class> struct I : B { static int foo (int) {} };
+struct G { typedef I<int> t; };
+void foo (int) { G::t::foo (0); }
+void bar (const D<char> &, const D<int> &, int, L);
+void baz () try { foo (0); } catch (F &e) { bar (e.foo (), "", 0, M); }