v.g.vassilev added inline comments.

================
Comment at: clang/lib/Parse/Parser.cpp:1033
+        !isDeclarationStatement(/*DisambiguatingWithExpression=*/true))
+      SingleDecl = ParseTopLevelStmtDecl();
+
----------------
There is a remaining challenge which probably could be addressed outside of 
this patch.

Consider this statement block:
```
int i =  12;
++i; 
i--;

template<typename T> struct A { };
```

Ideally we should model `++i; i--;` as a single `TopLevelStmtDecl` as the 
statement block is contiguous. That would require the creation of 2 AST nodes 
per block (one for the `TopLevelStmtDecl` and one for its conversion to 
`FunctionDecl`). This will give us also a nice property on the REPL side where 
the user could decide to squash multiple statements into a statement block to 
save on memory.

To do so, we will need to use `isDeclarationStatement` as a stop rule in 
`ParseTopLevelDecl`. In turn, this would mean that we should duplicate all of 
the switch cases described in the `ParseExternalDeclaration` function here. [We 
need teach  `isDeclarationStatement` everything we know about declarations, eg. 
it must tell us to stop when we see definition `struct A`].

The last version of this patch goes in the opposite direction, trying to 
minimize the code duplication (bloat?) by wrapping each global statement into a 
`TopLevelStmtDecl`, reusing the logic in `ParseExternalDeclaration`. However, 
we pay the price for 2 AST node allocations per global statement. That is a 
serious hit for people that want to control the parsing granularity of an 
interpreter.

I wonder if we can do something better hitting both requirements in some smart 
way I cannot see...


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

https://reviews.llvm.org/D127284

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

Reply via email to