Bug 40751 - G++ never packs typedef'd enums
Summary: G++ never packs typedef'd enums
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.3.2
: P3 normal
Target Milestone: 6.0
Assignee: Jason Merrill
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2009-07-14 19:02 UTC by Bryce Schober
Modified: 2016-01-21 20:26 UTC (History)
2 users (show)

See Also:
Host: i486-linux-gnu
Target: i486-linux-gnu
Build: i486-linux-gnu
Known to work:
Known to fail:
Last reconfirmed: 2016-01-21 00:00:00


Attachments
test case (589 bytes, application/gzip)
2009-07-14 19:09 UTC, Bryce Schober
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Bryce Schober 2009-07-14 19:02:25 UTC
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.
Comment 1 Bryce Schober 2009-07-14 19:09:39 UTC
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
Comment 2 Bryce Schober 2009-07-14 22:31:28 UTC
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.
Comment 3 Jason Merrill 2016-01-21 20:26:46 UTC
Fixed for GCC 6.
Comment 4 Jason Merrill 2016-01-21 20:26:47 UTC
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