Correct handling of enum attributes with g++
authorjsg <jsg@openbsd.org>
Wed, 7 Oct 2015 10:26:23 +0000 (10:26 +0000)
committerjsg <jsg@openbsd.org>
Wed, 7 Oct 2015 10:26:23 +0000 (10:26 +0000)
commit26cf605ac021cb49566b375e773978e4ad305ae6
tree6b3bba1ac880ef6a0a098da34ce01e95fb28737f
parent6a2322845436dc420316c65f14883a96dd9a047c
Correct handling of enum attributes with g++

gcc and g++ can currently have different ideas on the size of a
packed enum type:

enum __attribute__((packed)) foo { a = 0, b};

gcc: 1
g++: 4

enum foo { a = 0, b} __attribute__((packed));

gcc: 1
g++: 1

The first format is actually the preferred one according to the
documentation.
https://gcc.gnu.org/onlinedocs/gcc-4.2.1/gcc/Type-Attributes.html
g++ will accept the first format and silently not actually choose a
smaller size.

This was responsible for memory corruption with recent versions
of Mesa where c and c++ code share a header with a packed enum type.

The problem was reported in
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=39219
and fixed in gcc >= 4.3.6 in rev 144284.
This was after the switch from gplv2 but it's a trivial one line change.

ok guenther@ deraadt@ kettenis@
gnu/gcc/gcc/cp/parser.c