aaron.ballman added a comment.

In D64838#1592118 <https://reviews.llvm.org/D64838#1592118>, 
@Nathan-Huckleberry wrote:

> In D64838#1592111 <https://reviews.llvm.org/D64838#1592111>, @aaron.ballman 
> wrote:
>
> > In D64838#1589770 <https://reviews.llvm.org/D64838#1589770>, 
> > @Nathan-Huckleberry wrote:
> >
> > > The main problem that we have is that the `__attribute__` token always 
> > > causes the parser to read the line as a declaration. Then the declaration 
> > > parser handles reading the attributes list.
> > >
> > > This case demonstrates the problem:
> > >
> > >   void foo() {
> > >     __attribute__((address_space(0))) *x;
> > >   }
> > >
> > >
> > > If the attribute token is read beforehand this code just becomes `*x` and 
> > > is parsed as a dereference of an undefined variable when it should 
> > > actually be a declaration.
> > >
> > > Maybe the best solution is to pull the attributes parsing out to 
> > > `ParseStatementOrDeclaration` then pass those attributes through to 
> > > following functions. 
> > >  When the determination is made whether a line is a declaration or a 
> > > statement the attributes list can be looked at to determine if the 
> > > attributes are statement or declaration attributes and continue 
> > > accordingly. Maybe throwing a warning if mixing of declaration and 
> > > statement attributes occur.
> > >
> > > Does that sound like a good solution?
> >
> >
> > Please see the discussion in https://reviews.llvm.org/D63299#inline-564887 
> > -- if I understand your approach properly, this approach leads to spooky 
> > action at a distance, where the name of the attribute dictates whether 
> > something is a statement or a declaration. I'm not comfortable with that. 
> > There's no reason we could not have an attribute that is both a statement 
> > attribute and a declaration attribute, and how would *that* parse?
> >
> > I think this requires some deeper surgery in the parsing logic so that 
> > attributes do not impact whether something is treated as a declaration or a 
> > statement. The parser should parse attributes first, keep them around for a 
> > while, and attach them to either the decl or the statement at a later point.
>
>
> Any idea how to fix the problem in the code sample I gave? The addition of 
> the attributes token causes code to be read as a declaration and without the 
> token it is read as a unary operator.


I would start by trying to have 
`Parser::ParseStatementOrDeclarationAfterAttributes()` parse the GNU-style 
attributes if the `__attribute__` token is encountered, adding to the `Attrs`, 
and then retrying the loop.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D64838



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to