[Bug c/80400] New: missing -Wattributes on a invalid attribute packed on a typedef
msebor at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Apr 11 19:14:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80400
Bug ID: 80400
Summary: missing -Wattributes on a invalid attribute packed on
a typedef
Product: gcc
Version: 7.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: ---
The description of attribute packed in the GCC manual states that:
You may only specify the packed attribute attribute on the definition of an
enum, struct or union, not on a typedef that does not also define the
enumerated type, structure or union.
In most cases, GCC (in C mode) also issues a warning when the attribute is
specified on a typedef where it is ignored. However, when the attribute
appears after the struct keyword in the typedef GCC fails to issue the expected
warning. G++ has no such problem.
typedef struct __attribute__ ((packed)) S S1; // missing warning in C
$ (set -x && cat a.c && for lang in c c++; do gcc -S -Wall -Wextra -Wpedantic
-Wattributes -Wignored-attributes -x$lang a.c; done)
+ cat a.c
struct S { int i; char c; };
typedef __attribute__ ((packed)) struct S S0;
typedef struct __attribute__ ((packed)) S S1; // missing warning in C
typedef struct S __attribute__ ((packed)) S2;
typedef struct S S3 __attribute__ ((packed));
#if __cplusplus
# define A(e) static_assert(e, #e)
#else
# define A(e) _Static_assert(e, #e)
#endif
A (sizeof (S0) == 1);
A (sizeof (S1) == 1);
A (sizeof (S2) == 1);
A (sizeof (S3) == 1);
+ for lang in c c++
+ gcc -S -Wall -Wextra -Wpedantic -Wattributes -Wignored-attributes -xc a.c
a.c:3:41: warning: ‘packed’ attribute ignored [-Wattributes]
typedef __attribute__ ((packed)) struct S S0;
^
a.c:5:16: warning: ‘packed’ attribute ignored [-Wattributes]
typedef struct S __attribute__ ((packed)) S2;
^
a.c:6:16: warning: ‘packed’ attribute ignored [-Wattributes]
typedef struct S S3 __attribute__ ((packed));
^
a.c:11:16: error: static assertion failed: "sizeof (S0) == 1"
# define A(e) _Static_assert(e, #e)
^
a.c:14:1: note: in expansion of macro ‘A’
A (sizeof (S0) == 1);
^
a.c:11:16: error: static assertion failed: "sizeof (S1) == 1"
# define A(e) _Static_assert(e, #e)
^
a.c:15:1: note: in expansion of macro ‘A’
A (sizeof (S1) == 1);
^
a.c:11:16: error: static assertion failed: "sizeof (S2) == 1"
# define A(e) _Static_assert(e, #e)
^
a.c:16:1: note: in expansion of macro ‘A’
A (sizeof (S2) == 1);
^
a.c:11:16: error: static assertion failed: "sizeof (S3) == 1"
# define A(e) _Static_assert(e, #e)
^
a.c:17:1: note: in expansion of macro ‘A’
A (sizeof (S3) == 1);
^
+ for lang in c c++
+ gcc -S -Wall -Wextra -Wpedantic -Wattributes -Wignored-attributes -xc++ a.c
a.c:3:43: warning: ‘packed’ attribute ignored [-Wattributes]
typedef __attribute__ ((packed)) struct S S0;
^~
a.c:4:41: warning: attributes ignored on elaborated-type-specifier that is not
a forward declaration [-Wattributes]
typedef struct __attribute__ ((packed)) S S1;
^
a.c:5:43: warning: ‘packed’ attribute ignored [-Wattributes]
typedef struct S __attribute__ ((packed)) S2;
^~
a.c:6:44: warning: ‘packed’ attribute ignored [-Wattributes]
typedef struct S S3 __attribute__ ((packed));
^
a.c:9:16: error: static assertion failed: sizeof (S0) == 1
# define A(e) static_assert(e, #e)
^
a.c:14:1: note: in expansion of macro ‘A’
A (sizeof (S0) == 1);
^
a.c:9:16: error: static assertion failed: sizeof (S1) == 1
# define A(e) static_assert(e, #e)
^
a.c:15:1: note: in expansion of macro ‘A’
A (sizeof (S1) == 1);
^
a.c:9:16: error: static assertion failed: sizeof (S2) == 1
# define A(e) static_assert(e, #e)
^
a.c:16:1: note: in expansion of macro ‘A’
A (sizeof (S2) == 1);
^
a.c:9:16: error: static assertion failed: sizeof (S3) == 1
# define A(e) static_assert(e, #e)
^
a.c:17:1: note: in expansion of macro ‘A’
A (sizeof (S3) == 1);
^
More information about the Gcc-bugs
mailing list