The following enumerated type definitions packs to one byte as expected in C, but not in C++: typedef enum __attribute__ ((packed)) { ZERO = 0, ONE, TWO } my_enum_t; The enum will pack as expected if using -fshort-enums, but that doesn't allow me to pack on a per-enum basis. Neither will the above enum pack as a packed member in a structure or as a member in a packed structure. Test case to follow.
Created attachment 18196 [details] test case Built without warnings, to try to make sure I'm not doing something marginal: gcc -Wall -Wextra -pedantic -lstdc++ -0 size size.c size.gcc
I now see that the following syntax packs as expected: typedef enum { ZERO = 0, ONE, TWO } __attribute__ ((packed)) my_enum_t; I have been unable to find a concise definition of how attributes are supposed to be used with types in either the Type-Attributes or Attribute-Syntax sections of the GCC manual. I guess this location for the attribute is a bit more logical in the sense that the type isn't "complete" until the closing brace. It remains unclear whether both attribute locations are supposed to be supported in both C and C++ or not. Either way, it's certainly not clear from the docs.
Fixed for GCC 6.
Author: jason Date: Thu Jan 21 20:26:09 2016 New Revision: 232702 URL: https://gcc.gnu.org/viewcvs?rev=232702&root=gcc&view=rev Log: PR c++/40751 PR c++/64987 * decl.c (copy_type_enum): Respect TYPE_USER_ALIGN. Added: trunk/gcc/testsuite/g++.dg/cpp0x/alignas5.C Modified: trunk/gcc/cp/ChangeLog trunk/gcc/cp/decl.c