HighCommander4 wrote:

> I am slightly suspicious of source locations pointing at `eof` in the AST in 
> the first place, even in invalid code. I wonder if we would be better off 
> just having an invalid source location there instead of pointing at `eof`.

I think in this case it's deliberate. If you look at the compiler error for the 
missing brace:

```c++
test.cpp:1:13: error: expected '}'
    1 | int main() {
      |             ^
test.cpp:1:12: note: to match this '{'
    1 | int main() {
      |            ^
```

you can see that the diagnostic location points to one character past the 
opening brace, which is the `eof` token. I'm not sure how else the diagnostic 
location could end up there.

> Asserting that `tok::eof` should not be passed to `spelledForExpandedToken` 
> and returning `nullopt` in `spelledForExpanded` looks like a reasonable 
> workaround until we fix this. (The semantics looks reasonable as we don't 
> really have a spelled token we can map `eof` back to).

What do you think about this as an alternative: if `spelledForExpanded` 
receives as input an expanded token range `[firstExpanded, lastExpanded]` where 
`lastExpanded` is the `eof` token, return the spelled tokens corresponding to 
`[firstExpanded, lastExpanded - 1]` instead? (In the case where the `eof` token 
is the only one in the range, we could return nullopt.)

This would have the advantage of gracefully handling AST nodes like this one 
whose end location is the `eof`, and return all the spelled tokens actually 
making up the node.

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

Reply via email to