On Wed, Jun 17, 2015 at 12:10 AM, Jan Hubicka <hubi...@ucw.cz> wrote: >> >> PR middle-end/66325 >> >> * c-decl.c (start_enum): Set TYPE_PACKED consistently among type >> >> variants. >> >> Index: c-decl.c >> >> =================================================================== >> >> --- c-decl.c (revision 224250) >> >> +++ c-decl.c (working copy) >> >> @@ -7946,7 +7946,8 @@ >> >> the_enum->enum_overflow = 0; >> >> >> >> if (flag_short_enums) >> >> - TYPE_PACKED (enumtype) = 1; >> >> + for (tree v = TYPE_MAIN_VARIANT (enumtype); v ;v = TYPE_NEXT_VARIANT >> >> (v)) >> >> Though I wonder why flag_short_enums was not true when building the >> (main-)variant? > > What I believe happens is that there is forward declaration of enum that leads > to biuld incomplete enum type that has no packed flag set. Then we produce > a type variant and after that we complete the main variant, but do not update > the other variant. > > Actually looking into where the variant is updated, it happens in finish_enum > that copies many flags, perhaps it would make more sense to copy TYPE_PACKED > there?
Yes, it sounds like so. >> Looks like -fshort-enums is also 'Optimization', so the above is bogus for >> >> enum foo {x = 1 }; >> >> void __attribute__((optimize(short-enums))) foo() >> { >> const enum foo x = 1; >> } >> >> no? The main variant is correctly _not_ packed but now you make it >> packed as you reach foo ()? > > Perhaps it is defined as Optimization but it does not bind to uses of types: > > enum foo {a,b,c}; > __attribute__((optimize("short-enums"))) > main() > { > const enum foo x; > enum bar {a,b,c}; > printf ("%i %i\n",sizeof (x), sizeof(enum bar)); > } > > prints > 4 1 > > it depends when the main variant is finished. I wonder if there is any > practical value on support Optimization attribute for this kind of ABI > breaking > options. It may be easier to simply drop the Optimization flag completely > from > -fshort-enums and friends. > > -fshort-double ICEs at initialization time at least since 4.8.x > $ gcc t.c -fshort-double > <built-in>: internal compiler error: in layout_type, at stor-layout.c:2220 > 0xafe41b layout_type(tree_node*) > ../../gcc/stor-layout.c:2219 > > so I suggest dropping that flag completely. IIRC it "works" for -m32, but yes... Yes also to _not_ make ABI changing flags 'Optimization'. Richard. > Honza >> >> Richard. >> >> > Please fix the formatting here: no space before ;. >> > >> > Ok with that change. >> > >> > Marek