[cfe-commits] Separate semantic checking of EnumConstantDecl from the action

Vassil Vassilev vasil.georgiev.vasilev at cern.ch
Sun Dec 4 02:34:15 PST 2011


Hi Doug,
   Sorry I didn't give the use case. I thought that this will be only 
benefit for the compiler.

   So in our use case (in cling) we want to allow stmts "on the global 
scope" like:
   [cling$] int i =0;
   [cling$] for(...) {
   ...
   There is no easy way how we can understand whether the user input was 
declaration or stmt.
So we wrap the input internally into void cling_unique_name { body of 
stmts and decls}
For non declstmts it's all fine. However, when we have declaration the 
user expects to be visible
from the other stmts (internally wrappers).

   In that case we create a SemaConsumer that extract the declarations 
on the global scope, i.e.
change the linkage and visibility and the declaration context and we 
re-register it in the as resolver
chain if needed. Before pulling the decl out we need to make sure that 
all the c/c++ semantic rules
for that decl hold at the new position. For example, are there clashing 
names etc. If there is
something wrong we want proper diagnostic for that. In that case, 
ideally, we don't want to create yet
another AST node, which will be dangling.

   Even if we create a new node directly at the new position the old 
node will shadow the new one. Eg:
[cling$] int i; i = 15; // transformed into void cling_unique_name{int 
i; i=15;}

   I really liked the interface Sema::CheckVariableDeclaration, 
Sema::CheckFunctionDeclaration and I maybe
concluded wrongly that's the idea of all the CheckXXX functions.

I think no AST node creating CheckXXX will be reused by the template 
instantiation subsystem.
Correct me if I am wrong but right now in 
TemplateDeclInstantiator::VisitEnumDecl clang
creates redundant EnumConstantDecl because the node is created by 
Sema::CheckEnumConstant.

   Maybe I am missing something but I don't understand how this could 
make it easier to create broken AST nodes.
I guess you say that because some of the node properties are determined 
only after semantic analysis.

Can't we work this around somehow? I am willing to do the rest of the work.

Vassil

On 12/03/2011 08:43 PM, Douglas Gregor wrote:
> On Nov 30, 2011, at 6:22 AM, Vassil Vassilev wrote:
>
>> Hi,
>>   The attached patch tries to split the semantic checking from the AST node creation.
>>   I think it is useful one to be able to check already created AST node. Do you think that
>> makes sense? Can that patch end up in clang's mainline?
>
> I don't understand why you want to split this. Within Sema, we often combine semantic analysis with AST building so that there is just one place in the code that is responsible for making sure that the AST node is built with all of its invariants satisfied. Splitting semantic analysis from AST building makes it easier to create broken nodes that will cause problems downstream.
>
> 	- Doug




More information about the cfe-commits mailing list