rjmccall wrote:

> > The upshot is that we don't (and shouldn't) ever late-parse at file 
> > context, which by design means we can't see stack-manipulating pragmas 
> > because they're all restricted to file context. In late parsing, we only 
> > ever observe and change the innermost state of the pragma stack, and so all 
> > we need to do is temporarily restore that innermost state to what it was 
> > when the tokens were originally captured, then restore it to its "live" 
> > value after the late parsing is complete. The rest of the stack is 
> > untouchable.
> 
> "shouldn't ever late parse at file context" is something I agree with when I 
> think about most language constructs, but as a counter-example, folks have 
> been agitating more and more for the ability for an attribute argument to 
> reference a subsequent declaration. e.g.,
> 
> ```
> void func(int *ptr [[attr(len)]], size_t len);
> 
> struct S {
>   int *Ptr [[attr(len)]];
>   int Len;
> };
> ```
> 
> and the likes. I can imagine someone wanting to extend that to:
> 
> ```
> int *GlobalArray [[attr(GlobalLen)]];
> int GlobalLen;
> ```
> 
> because reordering the globals may change other semantic behavior (like 
> initialization order for dynamic init). Should we perhaps add documentation 
> to the internals manual so we capture the issues with file-scope late parsing?

Yes, I think that'd be good.  To me, the right way of thinking about this kind 
of code is that it's not truly at file context — it's not really standalone, we 
just don't really have the `Decl` that it's part of yet.  For example, there's 
a lot of things you really shouldn't be able to write in a statement-expression 
in a global initializer, the bound of an array type, and so on, but our 
checking doesn't always prohibit them because e.g. there isn't a meaningful 
`DeclContext` we can put in `CurContext` that will reflect that this isn't 
really a local context.  (The way we solved this in Swift's AST is that a 
`DeclContext` doesn't have to be a `Decl`, and we lazily create an 
`Initializer` DC when processing other kinds of top-level expressions.)  This 
is a longstanding issue.

https://github.com/llvm/llvm-project/pull/70646
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to