On Fri, Dec 08, 2017 at 03:44:03PM +0100, Richard Biener wrote: > > The following fixes spurious uninit warnings for zero-sized arrays. > > Bootstrapped and tested on x86_64-unknown-linux-gnu, applied. > > Richard. > > 2017-12-08 Richard Biener <rguent...@suse.de> > > PR middle-end/81782 > * tree-ssa-uninit.c (warn_uninitialized_vars): Properly > handle accesses outside of zero-sized vars.
Is ref.max_size == -1 always guaranteeing no access before offset, only after it? What I fear is e.g. ARRAY_REF with non-constant index with base of MEM_REF with & of a middle of array or something similar? struct S { int x[64]; } foo; MEM_REF[&foo, 40][i] with negative i. Anyway, in this case it is about not printing a warning, so we can give up even if it is theoretically possible. > --- gcc/tree-ssa-uninit.c (revision 255499) > +++ gcc/tree-ssa-uninit.c (working copy) > @@ -296,8 +296,8 @@ warn_uninitialized_vars (bool warn_possi > variable. */ > if (DECL_P (base) > && ref.size != -1 > - && ref.max_size == ref.size > - && (ref.offset + ref.size <= 0 > + && ((ref.max_size == ref.size > + && ref.offset + ref.size <= 0) > || (ref.offset >= 0 > && DECL_SIZE (base) > && TREE_CODE (DECL_SIZE (base)) == INTEGER_CST Jakub