[cfe-dev] Ordering issue in Sema::ActOnStartOfFunctionDef

Christopher Lamb christopher.lamb at gmail.com
Fri Dec 21 10:02:04 PST 2007

I think I can explain what's causing the behavior in this FIXME from  
Sema::GetTypeForDeclarator() in case DeclaratorChunk::Function and  
what I'd like to do about it.

           // FIXME: We still apparently need the conversion in
           // Sema::ParseParamDeclarator(). This doesn't make any  
sense, since
           // it should be driving off the type being created here.

In Sema::ActOnStartOfFunctionDef
ActOnDeclarator() creates the FunctionType, with its (apparently  
immutable) argument type VLA. The FunctionType's argument type array  
is based on DeclaratorChunk::FunctionTypeInfo with the default  
conversions applied in GetTypeForDeclarator(), however the converted  
types are never propagated back into the FunctionTypeInfo. It is  
exactly these types in the FunctionTypeInfo, and not the  
FunctionType's argument type array, which ActOnParamDeclarator() uses  
to generate the types for it's ParmVarDecls.

The duplicated default conversions _could_ be eliminated by having  
Sema::GetTypeForDeclarator() update the FunctionTypeInfo, or by  
passing the FunctionType (or FunctionDecl) into ActOnParamDeclarator 
(). However, this is bad because it means that ActOnParamDeclarator()  
may not mutate the argument types in any way, which breaks address  
spaces at the least.

My proposal is for ActOnDeclarator() for the FunctionDecl to be moved  
after the loop over the parameter decls, which would allow  
ActOnParamDeclarator() to modify types (default conversions, address  
spaces, etc.) and update the FunctionTypeInfo object to by captured  
subsequently in the FunctionType.

Christopher Lamb

More information about the cfe-dev mailing list