+2017-12-11 Thomas Schwinge <thomas@codesourcery.com>
+
+ PR c++/83301
+
+ Backport trunk r243377:
+ 2016-12-07 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/78692
+ * cgraph.c (cgraph_edge::redirect_call_stmt_to_callee): Set lhs
+ var to lhs of new_stmt right before noreturn handling rather than to
+ lhs of e->call_stmt early.
+
2017-12-04 Sebastian Peryt <sebastian.peryt@intel.com>
H.J. Lu <hongjiu.lu@intel.com>
cgraph_edge *e = this;
tree decl = gimple_call_fndecl (e->call_stmt);
- tree lhs = gimple_call_lhs (e->call_stmt);
gcall *new_stmt;
gimple_stmt_iterator gsi;
bool skip_bounds = false;
gimple_call_set_fntype (new_stmt, TREE_TYPE (e->callee->decl));
/* If the call becomes noreturn, remove the LHS if possible. */
+ tree lhs = gimple_call_lhs (new_stmt);
if (lhs
&& (gimple_call_flags (new_stmt) & ECF_NORETURN)
&& (VOID_TYPE_P (TREE_TYPE (gimple_call_fntype (new_stmt)))
+2017-12-11 Thomas Schwinge <thomas@codesourcery.com>
+
+ PR c++/83301
+
+ Backport trunk r243377:
+ 2016-12-07 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/78692
+ * g++.dg/torture/pr78692.C: New test.
+
2017-12-04 Sebastian Peryt <sebastian.peryt@intel.com>
H.J. Lu <hongjiu.lu@intel.com>
--- /dev/null
+// PR c++/78692
+
+int a;
+void *b;
+extern "C" {
+struct C {
+ virtual int d ();
+};
+struct E {
+ virtual int operator () (int, const void *, int) = 0;
+};
+class F {
+ int g ();
+ int h;
+ E &i;
+};
+struct : C, E {
+ int operator () (int, const void *, int) { throw int(); }
+} j;
+
+int
+F::g ()
+{
+ a = i (h, b, 0);
+}
+}