+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
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 =
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)
+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
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). */
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;
}
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__))
--- /dev/null
+/* 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));
+}
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). */
__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;
}
__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;
}
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." } */