https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108422
--- Comment #3 from Tobias Burnus <burnus at gcc dot gnu.org> --- FOR_EACH_VEC_ELT (*groups, i, grp) { if (grp->mark != PERMANENT) if (!omp_tsort_mapping_groups_1 (&cursor, groups, grpmap, grp)) return NULL; } first processes: map(to:*(const struct ._anon_0 *) __closure) map(firstprivate:__closure [pointer assign, bias: 0]) map(tofrom:*__closure->__a [len: 4]) map(always_pointer:__closure->__a [pointer assign, bias: 0]) map(to:*__closure) map(to:*(const struct ._anon_0 *) __closure) which then has: *innerp == grp in omp_tsort_mapping_groups_1. The next VEC has: (gdb) p debug(*grp.grp_start) map(tofrom:*__closure->__a [len: 4]) map(always_pointer:__closure->__a [pointer assign, bias: 0]) map(to:*__closure) map(to:*(const struct ._anon_0 *) __closure) But the inner one is again the previous one: (gdb) p debug(**innerp.grp_start) map(to:*(const struct ._anon_0 *) __closure) map(firstprivate:__closure [pointer assign, bias: 0]) map(tofrom:*__closure->__a [len: 4]) map(always_pointer:__closure->__a [pointer assign, bias: 0]) map(to:*__closure) map(to:*(const struct ._anon_0 *) __closure) where: (gdb) p (*innerp)->mark $78 = PERMANENT Untested patch: --- a/gcc/gimplify.cc +++ b/gcc/gimplify.cc @@ -9643 +9643 @@ omp_tsort_mapping_groups_1 (omp_mapping_group ***outlist, - if (innerp && *innerp != grp) + if (innerp && *innerp != grp && (*innerp)->mark != PERMANENT)