mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-12 07:20:27 +08:00
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
This commit is contained in:
parent
d59442fae8
commit
bffc62707f
@ -1,3 +1,9 @@
|
||||
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>
|
||||
|
||||
* dumpfile.c (gcc::dump_manager::get_dump_file_name): Add PART
|
||||
|
@ -672,6 +672,35 @@ decl_attributes (tree *node, tree attributes, int flags,
|
||||
|
||||
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)
|
||||
{
|
||||
int cxx11_flag =
|
||||
@ -695,33 +724,6 @@ decl_attributes (tree *node, tree attributes, int flags,
|
||||
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. */
|
||||
if (spec->type_required && DECL_P (*node)
|
||||
&& (VAR_P (*node)
|
||||
|
@ -1,3 +1,13 @@
|
||||
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>
|
||||
|
||||
* gcc.target/i386/avx512vl-vpclmulqdq-2.c: Remove 128bit
|
||||
|
@ -39,13 +39,13 @@ PackedPacked { int i; };
|
||||
aligned and packed on a function declaration. */
|
||||
|
||||
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)))
|
||||
faligned8_2 (void); /* { dg-message "previous declaration here" "" { xfail *-*-* } } */
|
||||
faligned8_2 (void); /* { dg-message "previous declaration here" } */
|
||||
|
||||
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
|
||||
always_inline and noinline (in that order). */
|
||||
|
@ -26,6 +26,8 @@ B::operator char () const { return 0; }
|
||||
|
||||
ATTR ((__noinline__))
|
||||
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;
|
||||
}
|
||||
@ -43,6 +45,7 @@ C::operator char () { return 0; }
|
||||
|
||||
ATTR ((__noinline__))
|
||||
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; }
|
||||
|
||||
inline ATTR ((__noinline__))
|
||||
|
26
gcc/testsuite/gcc.dg/Wattributes-10.c
Normal file
26
gcc/testsuite/gcc.dg/Wattributes-10.c
Normal file
@ -0,0 +1,26 @@
|
||||
/* 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; };
|
||||
aligned and packed on a function declaration. */
|
||||
|
||||
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)))
|
||||
faligned8_2 (void); /* { dg-message "previous declaration here" "" { xfail *-*-* } } */
|
||||
faligned8_2 (void); /* { dg-message "previous declaration here" } */
|
||||
|
||||
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
|
||||
always_inline and noinline (in that order). */
|
||||
|
@ -6,14 +6,14 @@ __attribute__ ((noinline))
|
||||
__attribute__ ((always_inline))
|
||||
int
|
||||
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;
|
||||
}
|
||||
|
||||
__attribute__ ((noinline, always_inline))
|
||||
int
|
||||
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;
|
||||
}
|
||||
|
||||
@ -21,13 +21,13 @@ __attribute__ ((always_inline))
|
||||
__attribute__ ((noinline))
|
||||
inline int
|
||||
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;
|
||||
}
|
||||
|
||||
__attribute__ ((always_inline, noinline))
|
||||
inline int
|
||||
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;
|
||||
}
|
||||
|
@ -54,7 +54,11 @@ static int __attribute__ ((pure, const, noreturn))
|
||||
barf (void) {
|
||||
/* { dg-warning "ignoring attribute .const." "const" { target *-*-* } .-1 } */
|
||||
/* { 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))
|
||||
bark (void) { /* { dg-warning "ignoring attribute .const." } */
|
||||
|
Loading…
x
Reference in New Issue
Block a user