re PR tree-optimization/58532 (bootstrap failure with BOOT_CFLAGS="-g -O3")
authorRichard Biener <rguenther@suse.de>
Mon, 30 Sep 2013 07:44:46 +0000 (07:44 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 30 Sep 2013 07:44:46 +0000 (07:44 +0000)
2013-09-30  Richard Biener  <rguenther@suse.de>

PR middle-end/58532
* tree-cfg.c (make_abnormal_goto_edges): Skip debug statements
before looking for setjmp-like calls.

* g++.dg/torture/pr58552.C: New testcase.

From-SVN: r203024

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr58552.C [new file with mode: 0644]
gcc/tree-cfg.c

index 9396389385736f356550140b11df23510817709a..abd42c5a9e73f7183c2da672a2e97f5778b4128a 100644 (file)
@@ -1,3 +1,9 @@
+2013-09-30  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/58532
+       * tree-cfg.c (make_abnormal_goto_edges): Skip debug statements
+       before looking for setjmp-like calls.
+
 2013-09-29  Iain Sandoe  <iain@codesourcery.com>
 
        PR target/10901
index 0543842af205a8102bcac73fa8d94b28e3dbd69f..e18391479f036dc16095995486de6339440c817f 100644 (file)
@@ -1,3 +1,8 @@
+2013-09-30  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/58532
+       * g++.dg/torture/pr58552.C: New testcase.
+
 2013-09-27  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        * gcc.target/powerpc/p8vector-ldst.c: New test for -mupper-regs-sf
diff --git a/gcc/testsuite/g++.dg/torture/pr58552.C b/gcc/testsuite/g++.dg/torture/pr58552.C
new file mode 100644 (file)
index 0000000..17c0d1c
--- /dev/null
@@ -0,0 +1,29 @@
+// { dg-do compile }
+// { dg-additional-options "-fcompare-debug" }
+
+extern void fancy_abort () __attribute__ ((__noreturn__));
+extern "C" {
+    struct __jmp_buf_tag { };
+    typedef struct __jmp_buf_tag jmp_buf[1];
+    extern int _setjmp (struct __jmp_buf_tag __env[1]) throw ();
+}
+extern void *gfc_state_stack;
+static jmp_buf eof_buf;
+static void push_state ()
+{
+  if (!gfc_state_stack)
+    fancy_abort ();
+}
+bool gfc_parse_file (void)
+{
+  int seen_program=0;
+  if (_setjmp (eof_buf))
+    return false;
+  if (seen_program)
+    goto duplicate_main;
+  seen_program = 1;
+  push_state ();
+  push_state ();
+duplicate_main:
+  return true;
+}
index be6618183406d4585cfb338eb982964d6ab74f9e..f0dd2bc50397963257cbead86a04da0bb01eb5c3 100644 (file)
@@ -1013,6 +1013,9 @@ make_abnormal_goto_edges (basic_block bb, bool for_call)
              break;
            }
        }
+      if (!gsi_end_p (gsi)
+         && is_gimple_debug (gsi_stmt (gsi)))
+       gsi_next_nondebug (&gsi);
       if (!gsi_end_p (gsi))
        {
          /* Make an edge to every setjmp-like call.  */