On 04/04/2018 06:16 PM, Andreas Krebbel wrote:
> On 10/03/2017 12:23 AM, Jeff Law wrote:
>> On 09/20/2017 12:04 PM, Martin Sebor wrote:
>>> On 09/19/2017 03:00 PM, Joseph Myers wrote:
>>>> On Tue, 19 Sep 2017, Martin Sebor wrote:
>>>>
>>>>>> In general, the data structures where you need to ensure manually that if
>>>>>>
>>>>>> attribute A is listed in EXCL for B, then attribute B is also listed in
>>>>>> EXCL for A, seem concerning.  I'd expect either data structures that make
>>>>>>
>>>>>> such asymmetry impossible, or a self-test that verifies that the tables 
>>>>>> in
>>>>>>
>>>>>> use are in fact symmetric (unless there is some reason the symmetry is 
>>>>>> not
>>>>>>
>>>>>> in fact required and symmetric diagnostics still result from asymmetric
>>>>>> tables - in which case the various combinations and orderings of
>>>>>> gnu_inline and noinline definitely need tests to show that the 
>>>>>> diagnostics
>>>>>>
>>>>>> work).
>>>>>
>>>>> If I understand correctly what you're concerned about then I don't
>>>>> think there are any such cases in the updated version of the patch.
>>>>
>>>> I don't see how you ensure that it's not possible to have such asymmetry.
>>>> My point wasn't so much "there was a bug in the previous patch version" as
>>>>
>>>> "the choice of data structures for defining such exclusions is prone to
>>>> such bugs".  Which can be addressed either by using different data
>>>> structures (e.g. listing incompatible pairs in a single array) or by a
>>>> self-test to verify symmetry so a compiler with asymmetry doesn't build.
>>>
>>> Okay, that's a useful thing to add.  It exposed a couple of missing
>>> attribute exclusions that I had overlooked.  Thanks for the suggestion!
>>> Attached is an incremental diff with just these changes to make review
>>> easier and an updated patch.
>>>
>>> As an aside, there are a number of other possible logic errors in
>>> the attribute specifications that could be detected by self-tests.
>>> The one I ran into is misspelled attribute names.  The added test
>>> detects misspelled names in exclusions, but not in the main specs.
>>>
>>> Martin
>>>
>>> gcc-81544-1-inc.diff
>>>
>>>
>>
>>
>>> gcc-81544-1.diff
>>>
>>>
>>> PR c/81544 - attribute noreturn and warn_unused_result on the same function 
>>> accepted
>>>
>>> gcc/c/ChangeLog:
>>>
>>>     PR c/81544
>>>     * c-decl.c (c_decl_attributes): Look up existing declaration and
>>>     pass it to decl_attributes.
>>>
>>> gcc/c-family/ChangeLog:
>>>
>>>     PR c/81544
>>>     * c-attribs.c (attr_aligned_exclusions): New array.
>>>     (attr_alloc_exclusions, attr_cold_hot_exclusions): Same.
>>>     (attr_common_exclusions, attr_const_pure_exclusions): Same.
>>>     (attr_gnu_inline_exclusions, attr_inline_exclusions): Same.
>>>     (attr_noreturn_exclusions, attr_returns_twice_exclusions): Same.
>>>     (attr_warn_unused_result_exclusions): Same.
>>>     (handle_hot_attribute, handle_cold_attribute): Simplify.
>>>     (handle_const_attribute): Warn on function returning void.
>>>     (handle_pure_attribute): Same.
>>>     * c-warn.c (diagnose_mismatched_attributes): Simplify.
>>>
>>> gcc/ChangeLog:
>>>
>>>     PR c/81544
>>>     * attribs.c (empty_attribute_table): Initialize new member of
>>>     struct attribute_spec.
>>>     (decl_attributes): Add argument.  Handle mutually exclusive
>>>     combinations of attributes.
>>>     * attribs.h (decl_attributes): Add default argument.
>>>     * selftest.h (attribute_c_tests): Declare.
>>>     * selftest-run-tests.c (selftest::run_tests): Call attribute_c_tests.
>>>     * tree-core.h (attribute_spec::exclusions, exclude): New type and
>>>     member.
>>>     * doc/extend.texi (Common Function Attributes): Update const and pure.
>>>
>>> gcc/testsuite/ChangeLog:
>>>
>>>     PR c/81544
>>>     * c-c++-common/Wattributes-2.c: New test.
>>>     * c-c++-common/Wattributes.c: New test.
>>>     * c-c++-common/attributes-3.c: Adjust.
>>>     * gcc.dg/attr-noinline.c: Adjust.
>>>     * gcc.dg/pr44964.c: Same.
>>>     * gcc.dg/torture/pr42363.c: Same.
>>>     * gcc.dg/tree-ssa/ssa-ccp-2.c: Same.
>> OK.
>> jeff
>>
> 
> On targets enforcing a function alignment bigger than 4 bytes this triggers 
> an error instead:
> 
> +inline int ATTR ((aligned (4)))
> +finline_hot_noret_align (int);  /* { dg-warning "ignoring attribute .aligned 
> \\(4\\). because it
> conflicts with attribute .aligned \\(8\\)." } */
> 
> gcc/gcc/testsuite/c-c++-common/Wattributes.c:404:1: error: alignment for 
> 'finline_hot_noret_align'
> must be at least 8^M
>

diff --git a/gcc/testsuite/c-c++-common/Wattributes.c 
b/gcc/testsuite/c-c++-common/Wattributes.c
index 902bcb61c30..a260d018dcf 100644
--- a/gcc/testsuite/c-c++-common/Wattributes.c
+++ b/gcc/testsuite/c-c++-common/Wattributes.c
@@ -401,7 +401,8 @@ inline int ATTR ((warn_unused_result))
 finline_hot_noret_align (int);  /* { dg-warning "ignoring attribute 
.warn_unused_result. because it
conflicts with attribute .noreturn." } */

 inline int ATTR ((aligned (4)))
-finline_hot_noret_align (int);  /* { dg-warning "ignoring attribute .aligned 
\\(4\\). because it
conflicts with attribute .aligned \\(8\\)." } */
+  finline_hot_noret_align (int);  /* { dg-warning "ignoring attribute .aligned 
\\(4\\). because it
conflicts with attribute .aligned \\(8\\)." "" { target { ! s390*-*-* } } } */
+/* { dg-error "alignment for 'finline_hot_noret_align' must be at least 8" "" 
{ target s390*-*-* }
.-1 } */

 inline int ATTR ((aligned (8)))
 finline_hot_noret_align (int);

OK?

-Andreas-

Reply via email to