From: Jakub Jelinek Date: Fri, 30 Jan 2026 10:00:41 +0000 (+0100) Subject: openmp: Handle asm goto in diagnose_sb_2 [PR123876] X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=de23c4ad41319525077da03ecbabf41efbf9a3b3;p=thirdparty%2Fgcc.git openmp: Handle asm goto in diagnose_sb_2 [PR123876] 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. 2026-01-30 Jakub Jelinek PR middle-end/123876 * omp-low.cc (diagnose_sb_2): Handle GIMPLE_ASM. * gcc.dg/gomp/pr123876.c: New test. --- diff --git a/gcc/omp-low.cc b/gcc/omp-low.cc index 1444ff4ca43..270a9abee33 100644 --- a/gcc/omp-low.cc +++ b/gcc/omp-low.cc @@ -15480,6 +15480,19 @@ diagnose_sb_2 (gimple_stmt_iterator *gsi_p, bool *handled_ops_p, } break; + case GIMPLE_ASM: + { + gasm *asm_stmt = as_a (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; diff --git a/gcc/testsuite/gcc.dg/gomp/pr123876.c b/gcc/testsuite/gcc.dg/gomp/pr123876.c new file mode 100644 index 00000000000..984c2dcdb6a --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/pr123876.c @@ -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:; + } +}