[PATCH] D75844: [clang] Set begin loc on GNU attribute parsed attrs

Aaron Ballman via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Apr 8 13:03:05 PDT 2020


aaron.ballman added a comment.

In D75844#1951915 <https://reviews.llvm.org/D75844#1951915>, @tbaeder wrote:

> Sorry for taking so long but it seems like I've went down a rabbit hole a bit. My previous patch sets the range in `parseGNUAttributes()` unconditionally, but that seems to trigger cases such as
>
>   // FixItLoc = possible correct location for the attributes
>   void ProhibitAttributes(ParsedAttributesWithRange &Attrs,
>                           SourceLocation FixItLoc = SourceLocation()) {
>     if (Attrs.Range.isInvalid())
>       return;
>     DiagnoseProhibitedAttributes(Attrs.Range, FixItLoc);
>     Attrs.clear();
>   }
>   
>
> in Parser.h. Because now the attributes have a valid range, clang emits lots of errors where it previously did not.
>
> Do you have a suggestion of what to do here, should I rather go back to a more local fix for the issue?


I think we rely on an invalid attribute range in quite a few places. IIRC, part of what makes this hard is a construct like: `[[]] int i;` where there is an attribute list but no actual attributes. We need to be able to prohibit the presence of an attribute list in some places (even if there are no attribute supplied). So we use the attribute range source location because looking for attribute is insufficient. (Note, this isn't specific to C++-style attributes, so it's a general mechanism we use across attribute styles).

That said, if `parseGNUAttributes()` only sets the range after having parsed the `__attribute__` keyword, I wouldn't expect any additional diagnostics when prohibiting attributes, so it's not clear to me what's going on.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D75844/new/

https://reviews.llvm.org/D75844





More information about the cfe-commits mailing list