https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82914

Eric Gallager <egallager at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |egallager at gcc dot gnu.org

--- Comment #3 from Eric Gallager <egallager at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #2)
> (In reply to Paul Eggert from comment #1)
> > (In reply to Paul Eggert from comment #0)
> > 
> > Sorry, but my example in comment #0 (although it illustrates a bug) doesn't
> > illustrate the bug that crashed GCC. Here's a better example:
> > 
> >   struct t { long mem; };
> >   __attribute__ ((aligned (2))) struct t a;
> >   struct __attribute__ ((aligned (2))) t b;
> >   struct t __attribute__ ((aligned (2))) c;
> >   struct t d __attribute__ ((aligned (2)));
> > 
> > This compiles into:
> > 
> >     .comm   a,8,2
> >     .comm   b,8,8
> >     .comm   c,8,2
> >     .comm   d,8,2
> > 
> > Here, only 'b' is aligned correctly. The variables a, c, and d have an
> > alignment of only 2, but they should have an alignment of 8 because
> > __attribute__ ((aligned (8))) is documented to never decrease the alignment
> > of a structure, only to increase it. The GCC 7.2 documentation
> > <https://gcc.gnu.org/onlinedocs/gcc-7.2.0/gcc/Common-Variable-Attributes.
> > html> says, "When used on a struct, or struct member, the 'aligned'
> > attribute can only increase the alignment; in order to decrease it, the
> > 'packed' attribute must be specified as well."
> 
> I think this applies to types but not to variables.  IIRC there's no packed
> attribute for variables:
> 
> int a __attribute__((aligned(2),packed));
> > gcc-7 -S t.c
> t.c:1:1: warning: ‘packed’ attribute ignored [-Wattributes]
>  int a __attribute__((aligned(2),packed));
>  ^~~
> 
> so yes, for type definitions you should need packed to decrease alignment
> but for variable declarations aligned is taken literally.
> 
> You are not using aligned on a 'struct or struct member' but on the variable
> in all but (b).

You'd still think there'd be a diagnostic from -Wattributes for the aligned
attribute, too, not just the packed one...

Reply via email to