https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92106
--- Comment #4 from Marek Polacek <mpolacek at gcc dot gnu.org> --- (In reply to Jakub Jelinek from comment #3) > (In reply to Marek Polacek from comment #2) > > 9351 /* When returning address of a structured binding, if the > > structured > > 9352 binding is not a reference, continue normally, if it is a > > 9353 reference, recurse on the initializer of the structured > > 9354 binding. */ > > 9355 tree base = DECL_DECOMP_BASE (whats_returned); > > 9356 if (TYPE_REF_P (TREE_TYPE (base))) > > 9357 { > > 9358 tree init = DECL_INITIAL (base); > > 9359 return maybe_warn_about_returning_address_of_local > > (init); > > 9360 } > > > > init is null here and cp_fold crashes on that. > > I'd add > && DECL_INITIAL (base) > to line 9356. I'm testing the below -- wanted to lose the { }s and avoid using DECL_INITIAL twice. --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -9353,11 +9353,10 @@ maybe_warn_about_returning_address_of_local (tree retval) reference, recurse on the initializer of the structured binding. */ tree base = DECL_DECOMP_BASE (whats_returned); - if (TYPE_REF_P (TREE_TYPE (base))) - { - tree init = DECL_INITIAL (base); - return maybe_warn_about_returning_address_of_local (init); - } + tree init; + if (TYPE_REF_P (TREE_TYPE (base)) + && (init = DECL_INITIAL (base))) + return maybe_warn_about_returning_address_of_local (init); } bool w = false; auto_diagnostic_group d; > Maybe it would be better to add return nullptr; > to find if the range for loop has no iterations. Added -- it's not relevant to this bug.