This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/81756] New: type attributes silently ignored on type declarations
- From: "msebor at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Mon, 07 Aug 2017 16:51:04 +0000
- Subject: [Bug c/81756] New: type attributes silently ignored on type declarations
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81756
Bug ID: 81756
Summary: type attributes silently ignored on type declarations
Product: gcc
Version: 8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: msebor at gcc dot gnu.org
Target Milestone: ---
When the C11 _Alignas specifier is used on a struct declaration GCC issues a
helpful warning pointing out that the attribute is meaningless. The warning is
issued unconditionally with no option to control it. This should be corrected
and the warning should be enabled under a designated option (e.g., -Wattributes
or -Wignored-attributes).
However, when the equivalent attribute aligned is used the same way GCC
silently ignores it. It would help prevent subtle bugs to have GCC issue a
warning in this case to let the user know that the attribute has no effect.
The test case below illustrates the problem.
$ cat b.c && gcc -O2 -S -Wall -Wextra b.c
#define A(e) _Static_assert ((e), #e)
_Alignas (32) struct NotAligned; // ignored with warning (good)
struct NotAligned { long i; };
A (_Alignof (struct NotAligned) == _Alignof (long)); // passes
struct __attribute__ ((aligned (32))) // silently ignored
Aligned32;
struct Aligned32 { long i; };
A (_Alignof (struct Aligned32) == 32); // FAILS
b.c:3:22: warning: useless ‘_Alignas’ in empty declaration
_Alignas (32) struct NotAligned; // ignored with warning (good)
^~~~~~~~~~
b.c:1:14: error: static assertion failed: "_Alignof (struct Aligned32) == 32"
#define A(e) _Static_assert ((e), #e)
^~~~~~~~~~~~~~
b.c:15:1: note: in expansion of macro ‘A’
A (_Alignof (struct Aligned32) == 32); // FAILS
^