@@ -1,3 +1,11 @@
+2020-01-15 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/93273
+ * tree-eh.c (sink_clobbers): If we already visited the destination
+ block do not defer insertion.
+ (pass_lower_eh_dispatch::execute): Maintain BB_VISITED for
+ the purpose of defered insertion.
+
2020-01-15 Richard Biener <rguenther@suse.de>
* alias.c (record_alias_subset): Avoid redundant work when
@@ -1,3 +1,8 @@
+2020-01-15 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/93273
+ * g++.dg/torture/pr93273.C: New testcase.
+
2020-01-15 Joseph Myers <joseph@codesourcery.com>
PR c/93072
new file mode 100644
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+void _setjmp(void *);
+struct S { ~S(); };
+void * (* fn)();
+void f();
+void g()
+{
+ S s;
+ _setjmp(fn());
+ []{ f(); }();
+}
@@ -3622,7 +3622,7 @@ sink_clobbers (basic_block bb,
gimple *first_sunk = NULL;
gimple *last_sunk = NULL;
- if (sunk)
+ if (sunk && !(succbb->flags & BB_VISITED))
dgsi = gsi_start (sunk[succbb->index]);
else
dgsi = gsi_after_labels (succbb);
@@ -3910,6 +3910,7 @@ pass_lower_eh_dispatch::execute (function *fun)
else if (!any_resx_to_process)
sink_clobbers (bb, NULL, &any_resx_to_process);
}
+ bb->flags &= ~BB_VISITED;
}
if (redirected)
{
@@ -3940,6 +3941,7 @@ pass_lower_eh_dispatch::execute (function *fun)
gsi_insert_seq_before (&gsi, sunk[bb->index], GSI_NEW_STMT);
sunk[bb->index] = NULL;
}
+ bb->flags |= BB_VISITED;
}
free (rpo);
free (sunk);