https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105537
--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> --- So the issue is that finish_options consistently produces the flag_var_tracking = flag_var_tracking_assignments = -1 state but for the toplev.cc invocation via decode_options we then override this from process_options with 0 in /* We know which debug output will be used so we can set flag_var_tracking and flag_var_tracking_uninit if the user has not specified them. */ if (debug_info_level < DINFO_LEVEL_NORMAL || !dwarf_debuginfo_p () || debug_hooks->var_location == do_nothing_debug_hooks.var_location) { ... flag_var_tracking = 0; flag_var_tracking_uninit = 0; flag_var_tracking_assignments = 0; } but that's only done once. I'll note that finish_options has /* One could use EnabledBy, but it would lead to a circular dependency. */ if (!opts_set->x_flag_var_tracking_uninit) opts->x_flag_var_tracking_uninit = opts->x_flag_var_tracking; but before the -1 setting but after resetting flag_var_tracking to false for < DINFO_LEVEL_NORMAL.