[prev in list] [next in list] [prev in thread] [next in thread]
List: gcc-patches
Subject: Re: [PATCH v2] c++: Check attributes on friend declarations [PR99032]
From: Franz Sirl <franz.sirl-kernel () lauterbach ! com>
Date: 2021-05-18 17:35:52
Message-ID: ffa777b1-077f-c6ea-9999-d7a1ed28538a () lauterbach ! com
[Download RAW message or body]
Am 2021-05-14 um 00:08 schrieb Marek Polacek via Gcc-patches:
> On Wed, May 12, 2021 at 08:27:18PM -0400, Jason Merrill wrote:
>> On 5/12/21 8:03 PM, Marek Polacek wrote:
>>> diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
>>> index 89f874a32cc..2bcefb619aa 100644
>>> --- a/gcc/cp/decl2.c
>>> +++ b/gcc/cp/decl2.c
>>> @@ -1331,6 +1331,20 @@ any_dependent_type_attributes_p (tree attrs)
>>> return false;
>>> }
>>> +/* True if ATTRS contains any attribute that requires a type. */
>>
>> Let's invert this to check if ATTRS contains any attribute that does *not*
>> require a type, and would therefore apply to the decl.
>
> Sounds good, done. Now I don't need to check *attrlist.
> I've also fixed up the xfail thing in my new test.
>
> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?
>
> -- >8 --
> This patch implements [dcl.attr.grammar]/5: "If an attribute-specifier-seq
> appertains to a friend declaration ([class.friend]), that declaration shall
> be a definition."
>
> This restriction applies to C++11-style attributes as well as GNU
> attributes with the exception that we allow GNU attributes that require
> a type, such as vector_size to continue accepting code as in attrib63.C.
> There are various forms of friend declarations, we have friend
> templates, C++11 extended friend declarations, and so on. In some cases
> we already ignore the attribute and warn that it was ignored. But
> certain cases weren't diagnosed, and with this patch we'll give a hard
> error. I tried hard not to emit both a warning and error and I think it
> worked out.
>
> Jason provided the cp_parser_decl_specifier_seq hunk to detect using
> standard attributes in the middle of decl-specifiers, which is invalid.
>
> Co-authored-by: Jason Merrill <jason@redhat.com>
>
> gcc/cp/ChangeLog:
>
> PR c++/99032
> * cp-tree.h (any_non_type_attribute_p): Declare.
> * decl.c (grokdeclarator): Diagnose when an attribute appertains to
> a friend declaration that is not a definition.
> * decl2.c (any_non_type_attribute_p): New.
> * parser.c (cp_parser_decl_specifier_seq): Diagnose standard attributes
> in the middle of decl-specifiers.
> (cp_parser_elaborated_type_specifier): Diagnose when an attribute
> appertains to a friend declaration that is not a definition.
> (cp_parser_member_declaration): Likewise.
>
Hi,
I haven't investigated it in detail yet, but it seems this change breaks
building Qt-based (tested with Qt-5.12.7) applications. Sample error
output with trunk@r12+876 -std=gnu++14:
/usr/include/qt5/QtCore/qvariant.h:470:33: error: attribute appertains
to a friend declaration that is not a definition
friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QVariant &);
^~~~~~~~
For GCC Q_CORE_EXPORT is defined (via Q_DECL_EXPORT) to
__attribute__((visibility("default"))) AFAICS.
As this error seemingly cannot be turned into a warning, it's probably
quite a problem for many people.
regards,
Franz
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic