Hi!

We weren't handling asm goto in diagnose_sb_2, so could ICE
on invalid code instead of diagnosing it as invalid.

Note, for C++ the FE already diagnoses that instead of deferring
it will omp-low.cc.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux,
committed to trunk so far.

2026-01-30  Jakub Jelinek  <[email protected]>

        PR middle-end/123876
        * omp-low.cc (diagnose_sb_2): Handle GIMPLE_ASM.

        * gcc.dg/gomp/pr123876.c: New test.

--- gcc/omp-low.cc.jj   2026-01-02 09:56:10.280334607 +0100
+++ gcc/omp-low.cc      2026-01-29 21:42:32.430421095 +0100
@@ -15480,6 +15480,19 @@ diagnose_sb_2 (gimple_stmt_iterator *gsi
       }
       break;
 
+    case GIMPLE_ASM:
+      {
+       gasm *asm_stmt = as_a <gasm *> (stmt);
+       for (unsigned i = 0; i < gimple_asm_nlabels (asm_stmt); ++i)
+         {
+           tree lab = TREE_VALUE (gimple_asm_label_op (asm_stmt, i));
+           n = splay_tree_lookup (all_labels, (splay_tree_key) lab);
+           if (n && diagnose_sb_0 (gsi_p, context, (gimple *) n->value))
+             break;
+         }
+      }
+      break;
+
     case GIMPLE_RETURN:
       diagnose_sb_0 (gsi_p, context, NULL);
       break;
--- gcc/testsuite/gcc.dg/gomp/pr123876.c.jj     2026-01-29 21:49:00.854958955 
+0100
+++ gcc/testsuite/gcc.dg/gomp/pr123876.c        2026-01-29 21:48:36.918357183 
+0100
@@ -0,0 +1,69 @@
+/* PR middle-end/123876 */
+
+void
+foo ()
+{
+lab:
+#pragma omp simd
+  for (int i = 0; i < 4; i++)
+    asm goto ("" : : : : lab);                 /* { dg-error "invalid branch 
to/from OpenMP structured block" } */
+#pragma omp for
+  for (int i = 0; i < 4; i++)
+   asm goto ("" : : : : lab);                  /* { dg-error "invalid branch 
to/from OpenMP structured block" } */
+#pragma omp parallel
+  asm goto ("" : : : : lab);                   /* { dg-error "invalid branch 
to/from OpenMP structured block" } */
+}
+
+void
+bar ()
+{
+lab3:
+#pragma omp simd
+  for (int i = 0; i < 4; i++)
+    {
+    lab1:
+    lab2:
+      asm goto ("" : : : : lab1, lab2, lab3);  /* { dg-error "invalid branch 
to/from OpenMP structured block" } */
+    }
+#pragma omp for
+  for (int i = 0; i < 4; i++)
+    {
+    lab4:
+    lab5:
+      asm goto ("" : : : : lab4, lab5, lab3);  /* { dg-error "invalid branch 
to/from OpenMP structured block" } */
+    }
+#pragma omp parallel
+  {
+  lab6:
+  lab7:
+    asm goto ("" : : : : lab6, lab7, lab3);    /* { dg-error "invalid branch 
to/from OpenMP structured block" } */
+  }
+}
+
+void
+baz ()
+{
+#pragma omp simd
+  for (int i = 0; i < 4; i++)
+    {
+    lab1:
+    lab2:
+      asm goto ("" : : : : lab1, lab2, lab3);
+    lab3:;
+    }
+#pragma omp for
+  for (int i = 0; i < 4; i++)
+    {
+    lab4:
+    lab5:
+      asm goto ("" : : : : lab4, lab5, lab6);
+    lab6:;
+    }
+#pragma omp parallel
+  {
+  lab7:
+  lab8:
+    asm goto ("" : : : : lab7, lab8, lab9);
+  lab9:;
+  }
+}

        Jakub

Reply via email to