Message ID | AM4PR07MB157101EF27A6DA225D3789E8E4670@AM4PR07MB1571.eurprd07.prod.outlook.com |
---|---|
State | New |
Headers | show |
Ping.. For this patch: https://gcc.gnu.org/ml/gcc-patches/2016-04/msg02069.html Thanks Bernd. On 04/30/16 07:54, Bernd Edlinger wrote: > Hi, > > this was already posted in february, but has not yet been reviewed, so I thought > it is time now to post it again... > > As a follow-up for Jakub's c/69669 fix, I'd like to have the enum mode also honored > in C++ code, because the mode attribute now finally really works in C, but it is > completely and silently(!) ignored by C++ code, which results in incompatible > code. > > So I duplicated what is done in c/c-decl.c also in cp/decl.c. That worked > immediately, except that it is not possible to explicitly check the "mode" > attribute in the TYPE_ATTRIBUTES (enumtype) because that attribute > is never copied to the type, and the original attribute list is not available > here. That should be OK, as this check was added to fix pr52085 which > does not apply here, because C++ does not support enum forward > declarations. > > If that patch is not appropriate for stage 4, I would at least want to emit > an attribute directive ignored warning in c++ mode. I think that could > be done in handle_mode_attribute. But fixing that feature is cooler. > > > Boot-strapped and regression tested on x86_64-pc-linux-gnu. > Ok for trunk and gcc-6 branch? > > > Thanks > Bernd. >
Ping... On 07.05.2016 11:54 Bernd Edlinger wrote: > Ping.. > > For this patch: https://gcc.gnu.org/ml/gcc-patches/2016-04/msg02069.html > > Thanks > Bernd. >
OK. Jason
Index: gcc/cp/decl.c =================================================================== --- gcc/cp/decl.c (Revision 233176) +++ gcc/cp/decl.c (Arbeitskopie) @@ -13310,6 +13310,19 @@ finish_enum_value_list (tree enumtype) use_short_enum = flag_short_enums || lookup_attribute ("packed", TYPE_ATTRIBUTES (enumtype)); + /* If the precision of the type was specified with an attribute and it + was too small, give an error. Otherwise, use it. */ + if (TYPE_PRECISION (enumtype)) + { + if (precision > TYPE_PRECISION (enumtype)) + error ("specified mode too small for enumeral values"); + else + { + use_short_enum = true; + precision = TYPE_PRECISION (enumtype); + } + } + for (itk = (use_short_enum ? itk_char : itk_int); itk != itk_none; itk++) Index: gcc/testsuite/c-c++-common/pr69669.c =================================================================== --- gcc/testsuite/c-c++-common/pr69669.c (Revision 233176) +++ gcc/testsuite/c-c++-common/pr69669.c (Arbeitskopie) @@ -1,5 +1,6 @@ /* PR c/69669 */ /* { dg-do compile } */ +/* { dg-options "-fdump-rtl-final" } */ enum __attribute__((mode(QI))) E { F = 1 }; @@ -8,3 +9,5 @@ foo (enum E *x, int y) { *x = (enum E) y; } + +/* { dg-final { scan-rtl-dump-times "mem:QI" 1 "final" } } */