https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78678
--- Comment #6 from rguenther at suse dot de <rguenther at suse dot de> --- On Tue, 2 May 2017, marxin at gcc dot gnu.org wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78678 > > --- Comment #5 from Martin Liška <marxin at gcc dot gnu.org> --- > I see, but what about comparing the access to TYPE_SIZE of a variable: > > diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c > index 5ebdcdfd796..d493b27f536 100644 > --- a/gcc/gimple-fold.c > +++ b/gcc/gimple-fold.c > @@ -6134,6 +6134,12 @@ fold_array_ctor_reference (tree type, tree ctor, > tree domain_type = NULL_TREE; > HOST_WIDE_INT inner_offset; > > + /* Accessing a ctor elements that actually points after a declaration is > + an undefined behavior. */ > + tree decl_size = TYPE_SIZE (TREE_TYPE (from_decl)); > + if (tree_fits_uhwi_p (decl_size) && offset >= tree_to_uhwi (decl_size)) > + return NULL; > + > /* Compute low bound and elt size. */ > if (TREE_CODE (TREE_TYPE (ctor)) == ARRAY_TYPE) > domain_type = TYPE_DOMAIN (TREE_TYPE (ctor)); > > It's completely untested patch. That's not going to work -- for constructors of constructors we adjust offset and thus offset is not from_decl-based.