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
