https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105646
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Summary|g++ does not raise "xxx is |g++ does not raise "xxx may |used uninitialized" warning |be used uninitialized" |under some conditions |warning on dead code when | |optimizing Last reconfirmed| |2022-08-19 Component|c++ |tree-optimization Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org Ever confirmed|0 |1 Status|UNCONFIRMED |ASSIGNED --- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- The issue is that for f3() we'd emit a may-uninitialized warning because f1() could have thrown and thus v3{v3} is only executed conditionally. For f2() v2{v2} is always executed (when f2 is entered). The late diagnostic pass that would emit may-uninitialized warnings doesn't get to see the v3{v3} initialization because it was removed as dead code. When not optimizing we choose to diagnose may-uninit before eliminating v3{v3}. Confirmed. Not sure if we want to fix this. We eventually might use a different predicate than post-domination for whether a stmt is considered always executed (ignoring EH and abnormal control flow). Greedily following "fallthru" edges might work for this, also implementing the unreachable edge honoring the ??? comment says. I have a patch.