https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121977
Bug ID: 121977 Summary: gomp/member-1.C ICE with -ftrivial-auto-var-init=zero Product: gcc Version: 16.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: jakub at gcc dot gnu.org Target Milestone: --- I'm working now on a patch for PR114457 which will kind of enable -ftrivial-auto-var-init=zero for -std=c++26 by default. I've run into ICE on g++.dg/gomp/member-1.C, which is also reproduceable on vanilla trunk with RUNTESTFLAGS="--target_board=unix\{,-ftrivial-auto-var-init=zero\} gomp.exp=member-1.C" FAIL: g++.dg/gomp/member-1.C -std=c++17 (internal compiler error: Segmentation fault) FAIL: g++.dg/gomp/member-1.C -std=c++17 (test for excess errors) FAIL: g++.dg/gomp/member-1.C -std=c++98 (internal compiler error: Segmentation fault) FAIL: g++.dg/gomp/member-1.C -std=c++98 (test for excess errors) FAIL: g++.dg/gomp/member-1.C -std=c++26 (internal compiler error: Segmentation fault) FAIL: g++.dg/gomp/member-1.C -std=c++26 (test for excess errors) >From what I can see, the difference between -ftrivial-auto-var-init=uninitialized and -ftrivial-auto-var-init=zero is that i = .DEFERRED_INIT (4, 2, &"i"[0]); stmt is added in the latter case to for_pre_body (and nothing otherwise), so gimple_seq *for_pre_p = (gimple_seq_empty_p (for_pre_body) ? pre_p : &for_pre_body); in the OMP_TASKLOOP handling then works differently too and in one case the D.2893 = a; stmt (where int a [value-expr: ((struct S *) this)->a]; ) is added to pre_p and therefore before the taskloop, while in the other case it is added to gimple_omp_for_pre_body of the taskloop. And in the latter case for some reason we ICE when trying to regimplify the stmt into D.2893 = ((struct S *) this)->a; - this is mapped to NULL.