Commit bffc6270 by Martin Sebor Committed by Martin Sebor

PR c/86453 - error: type variant differs by TYPE_PACKED in free_lang_data since r255469

gcc/ChangeLog:

	PR c/86453
	* attribs.c (decl_attributes): Reject conflicting attributes before
	calling attribute handlers.

gcc/testsuite/ChangeLog:

	PR c/86453
	* c-c++-common/Wattributes.c: Adjust.
	* gcc.dg/Wattributes-10.c: New test.
	* g++.dg/Wattributes-3.C: Adjust.
	* gcc.dg/Wattributes-6.c: Adjust.
	* gcc.dg/pr18079.c: Adjust.
	* gcc.dg/torture/pr42363.c: Adjust.

From-SVN: r262596
parent d59442fa
2018-07-12 Martin Sebor <msebor@redhat.com>
PR c/86453
* attribs.c (decl_attributes): Reject conflicting attributes before
calling attribute handlers.
2018-07-12 Jan Hubicka <hubicka@ucw.cz> 2018-07-12 Jan Hubicka <hubicka@ucw.cz>
* dumpfile.c (gcc::dump_manager::get_dump_file_name): Add PART * dumpfile.c (gcc::dump_manager::get_dump_file_name): Add PART
......
...@@ -672,6 +672,35 @@ decl_attributes (tree *node, tree attributes, int flags, ...@@ -672,6 +672,35 @@ decl_attributes (tree *node, tree attributes, int flags,
bool no_add_attrs = false; bool no_add_attrs = false;
/* Check for exclusions with other attributes on the current
declation as well as the last declaration of the same
symbol already processed (if one exists). Detect and
reject incompatible attributes. */
bool built_in = flags & ATTR_FLAG_BUILT_IN;
if (spec->exclude
&& (flag_checking || !built_in))
{
/* Always check attributes on user-defined functions.
Check them on built-ins only when -fchecking is set.
Ignore __builtin_unreachable -- it's both const and
noreturn. */
if (!built_in
|| !DECL_P (*anode)
|| (DECL_FUNCTION_CODE (*anode) != BUILT_IN_UNREACHABLE
&& (DECL_FUNCTION_CODE (*anode)
!= BUILT_IN_UBSAN_HANDLE_BUILTIN_UNREACHABLE)))
{
bool no_add = diag_attr_exclusions (last_decl, *anode, name, spec);
if (!no_add && anode != node)
no_add = diag_attr_exclusions (last_decl, *node, name, spec);
no_add_attrs |= no_add;
}
}
if (no_add_attrs)
continue;
if (spec->handler != NULL) if (spec->handler != NULL)
{ {
int cxx11_flag = int cxx11_flag =
...@@ -695,33 +724,6 @@ decl_attributes (tree *node, tree attributes, int flags, ...@@ -695,33 +724,6 @@ decl_attributes (tree *node, tree attributes, int flags,
returned_attrs = chainon (ret, returned_attrs); returned_attrs = chainon (ret, returned_attrs);
} }
/* If the attribute was successfully handled on its own and is
about to be added check for exclusions with other attributes
on the current declation as well as the last declaration of
the same symbol already processed (if one exists). */
bool built_in = flags & ATTR_FLAG_BUILT_IN;
if (spec->exclude
&& !no_add_attrs
&& (flag_checking || !built_in))
{
/* Always check attributes on user-defined functions.
Check them on built-ins only when -fchecking is set.
Ignore __builtin_unreachable -- it's both const and
noreturn. */
if (!built_in
|| !DECL_P (*anode)
|| (DECL_FUNCTION_CODE (*anode) != BUILT_IN_UNREACHABLE
&& (DECL_FUNCTION_CODE (*anode)
!= BUILT_IN_UBSAN_HANDLE_BUILTIN_UNREACHABLE)))
{
bool no_add = diag_attr_exclusions (last_decl, *anode, name, spec);
if (!no_add && anode != node)
no_add = diag_attr_exclusions (last_decl, *node, name, spec);
no_add_attrs |= no_add;
}
}
/* Layout the decl in case anything changed. */ /* Layout the decl in case anything changed. */
if (spec->type_required && DECL_P (*node) if (spec->type_required && DECL_P (*node)
&& (VAR_P (*node) && (VAR_P (*node)
......
2018-07-12 Martin Sebor <msebor@redhat.com>
PR c/86453
* c-c++-common/Wattributes.c: Adjust.
* gcc.dg/Wattributes-10.c: New test.
* g++.dg/Wattributes-3.C: Adjust.
* gcc.dg/Wattributes-6.c: Adjust.
* gcc.dg/pr18079.c: Adjust.
* gcc.dg/torture/pr42363.c: Adjust.
2018-07-12 Julia Koval <julia.koval@intel.com> 2018-07-12 Julia Koval <julia.koval@intel.com>
* gcc.target/i386/avx512vl-vpclmulqdq-2.c: Remove 128bit * gcc.target/i386/avx512vl-vpclmulqdq-2.c: Remove 128bit
......
...@@ -39,13 +39,13 @@ PackedPacked { int i; }; ...@@ -39,13 +39,13 @@ PackedPacked { int i; };
aligned and packed on a function declaration. */ aligned and packed on a function declaration. */
void ATTR ((aligned (8), packed)) void ATTR ((aligned (8), packed))
faligned8_1 (void); /* { dg-warning ".packed. attribute ignored" } */ faligned8_1 (void); /* { dg-warning "ignoring attribute .packed. because it conflicts with attribute .aligned." } */
void ATTR ((aligned (8))) void ATTR ((aligned (8)))
faligned8_2 (void); /* { dg-message "previous declaration here" "" { xfail *-*-* } } */ faligned8_2 (void); /* { dg-message "previous declaration here" } */
void ATTR ((packed)) void ATTR ((packed))
faligned8_2 (void); /* { dg-warning ".packed. attribute ignored" } */ faligned8_2 (void); /* { dg-warning "ignoring attribute .packed. because it conflicts with attribute .aligned." } */
/* Exercise the handling of the mutually exclusive attributes /* Exercise the handling of the mutually exclusive attributes
always_inline and noinline (in that order). */ always_inline and noinline (in that order). */
......
...@@ -26,6 +26,8 @@ B::operator char () const { return 0; } ...@@ -26,6 +26,8 @@ B::operator char () const { return 0; }
ATTR ((__noinline__)) ATTR ((__noinline__))
B::operator int () const // { dg-warning "ignoring attribute .noinline. because it conflicts with attribute .always_inline." } B::operator int () const // { dg-warning "ignoring attribute .noinline. because it conflicts with attribute .always_inline." }
// { dg-warning "function might not be inlinable" "" { target *-*-* } .-1 }
{ {
return 0; return 0;
} }
...@@ -43,6 +45,7 @@ C::operator char () { return 0; } ...@@ -43,6 +45,7 @@ C::operator char () { return 0; }
ATTR ((__noinline__)) ATTR ((__noinline__))
C::operator short () // { dg-warning "ignoring attribute .noinline. because it conflicts with attribute .always_inline." } C::operator short () // { dg-warning "ignoring attribute .noinline. because it conflicts with attribute .always_inline." }
// { dg-warning "function might not be inlinable" "" { target *-*-* } .-1 }
{ return 0; } { return 0; }
inline ATTR ((__noinline__)) inline ATTR ((__noinline__))
......
/* PR middle-end/86453 - error: type variant differs by TYPE_PACKED in
free_lang_data since r255469
{ dg-do compile }
{ dg-options "-Wall -ftrack-macro-expansion=0" } */
#define A(expr) do { int a[1 - 2 * !(expr)]; (void)&a; } while (0)
struct S
{
int* __attribute__ ((aligned (16))) paligned;
int* __attribute__ ((packed)) ppacked; /* { dg-warning ".packed. attribute ignored for type .int \\\*." } */
int* __attribute__ ((aligned (16), packed)) qaligned; /* { dg-warning "ignoring attribute .packed. because it conflicts with attribute .aligned." } */
int* __attribute__ ((packed, aligned (16))) qpacked; /* { dg-warning ".packed. attribute ignored for type .int \\\*." } */
} s;
void test (void)
{
/* Verify that attributes reported ignored really are ignored
and not applied. */
A (__alignof__ (s.paligned) == 16);
A (__alignof__ (s.ppacked) < 16);
A (__alignof__ (s.qaligned) == 16);
A (__alignof__ (s.qpacked) == __alignof__ (s.paligned));
}
...@@ -39,13 +39,13 @@ PackedPacked { int i; }; ...@@ -39,13 +39,13 @@ PackedPacked { int i; };
aligned and packed on a function declaration. */ aligned and packed on a function declaration. */
void ATTR ((aligned (8), packed)) void ATTR ((aligned (8), packed))
faligned8_1 (void); /* { dg-warning ".packed. attribute ignored" } */ faligned8_1 (void); /* { dg-warning "ignoring attribute .packed. because it conflicts with attribute .aligned." } */
void ATTR ((aligned (8))) void ATTR ((aligned (8)))
faligned8_2 (void); /* { dg-message "previous declaration here" "" { xfail *-*-* } } */ faligned8_2 (void); /* { dg-message "previous declaration here" } */
void ATTR ((packed)) void ATTR ((packed))
faligned8_2 (void); /* { dg-warning ".packed. attribute ignored" } */ faligned8_2 (void); /* { dg-warning "ignoring attribute .packed. because it conflicts with attribute .aligned." } */
/* Exercise the handling of the mutually exclusive attributes /* Exercise the handling of the mutually exclusive attributes
always_inline and noinline (in that order). */ always_inline and noinline (in that order). */
......
...@@ -6,14 +6,14 @@ __attribute__ ((noinline)) ...@@ -6,14 +6,14 @@ __attribute__ ((noinline))
__attribute__ ((always_inline)) __attribute__ ((always_inline))
int int
fn1 (int r) fn1 (int r)
{ /* { dg-warning "attribute ignored due to conflict" } */ { /* { dg-warning "ignoring attribute .always_inline. because it conflicts with attribute .noinline." } */
return r & 4; return r & 4;
} }
__attribute__ ((noinline, always_inline)) __attribute__ ((noinline, always_inline))
int int
fn2 (int r) fn2 (int r)
{ /* { dg-warning "attribute ignored due to conflict" } */ { /* { dg-warning "ignoring attribute .always_inline. because it conflicts with attribute .noinline." } */
return r & 4; return r & 4;
} }
...@@ -21,13 +21,13 @@ __attribute__ ((always_inline)) ...@@ -21,13 +21,13 @@ __attribute__ ((always_inline))
__attribute__ ((noinline)) __attribute__ ((noinline))
inline int inline int
fn3 (int r) fn3 (int r)
{ /* { dg-warning "attribute ignored due to conflict" } */ { /* { dg-warning "ignoring attribute .noinline. because it conflicts with attribute .always_inline." } */
return r & 8; return r & 8;
} }
__attribute__ ((always_inline, noinline)) __attribute__ ((always_inline, noinline))
inline int inline int
fn4 (int r) fn4 (int r)
{ /* { dg-warning "attribute ignored due to conflict" } */ { /* { dg-warning "ignoring attribute .noinline. because it conflicts with attribute .always_inline." } */
return r & 8; return r & 8;
} }
...@@ -54,7 +54,11 @@ static int __attribute__ ((pure, const, noreturn)) ...@@ -54,7 +54,11 @@ static int __attribute__ ((pure, const, noreturn))
barf (void) { barf (void) {
/* { dg-warning "ignoring attribute .const." "const" { target *-*-* } .-1 } */ /* { dg-warning "ignoring attribute .const." "const" { target *-*-* } .-1 } */
/* { dg-warning "ignoring attribute .noreturn." "noreturn" { target *-*-* } .-2 } */ /* { dg-warning "ignoring attribute .noreturn." "noreturn" { target *-*-* } .-2 } */
} /* { dg-warning "does return" } */
/* The noreturn attribute is ignored so verify there is no warning
for returning from the function:
{ dg-bogus "does return" } */
}
static int __attribute__ ((pure, const)) static int __attribute__ ((pure, const))
bark (void) { /* { dg-warning "ignoring attribute .const." } */ bark (void) { /* { dg-warning "ignoring attribute .const." } */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment