[cfe-dev] Type source info for function template instances.

Enea Zaffanella zaffanella at cs.unipr.it
Thu Feb 18 15:17:54 PST 2010


Hello.

In our client application, we need to visit all instantiations of 
template declarations. While at it, we were surprised to notice that the 
instantiations of function template declarations are provided with a 
TypeSourceInfo object that seems to be an exact copy of the one found in 
the corresponding templated decl.

In fact, method VisitFunctionDecl() in SemaTemplateInstantiationDecl.cpp 
does the following:

   FunctionDecl *Function =
     FunctionDecl::Create(SemaRef.Context, DC, D->getLocation(),
                          D->getDeclName(), T, D->getTypeSourceInfo(),
                          D->getStorageClass(),
                          D->isInlineSpecified(),
                          D->hasWrittenPrototype());

so that in the instantiated function,
the function type T has been modified by instantiation
   QualType T = SubstFunctionType(D, Params);
but the type source info D->getTypeSourceInfo() is passed unmodified.

Apparently, this is different from what is done by other instantiating 
visitors, such as those for VarDecl and FieldDecl. For instance, for the 
case of VarDecl, we have the following:

   // Do substitution on the type of the declaration
   TypeSourceInfo *DI = SemaRef.SubstType(D->getTypeSourceInfo(),
                                          TemplateArgs,
                                          D->getTypeSpecStartLoc(),
                                          D->getDeclName());
   // Build the instantiated declaration
   VarDecl *Var = VarDecl::Create(SemaRef.Context, Owner,
                                  D->getLocation(), D->getIdentifier(),
                                  DI->getType(), DI,
                                  D->getStorageClass());

Are these different behaviors really meant?
If so, for what reasons?


We have tried a tentative implementation change (attached for your 
convenience) where we also compute the instantiation for the type source 
info of all kinds of functions (i.e., including CXXMethodDecl).
This passes all but 2 of the clang tests:

Failing Tests (2):
     Clang :: CXX/dcl.dcl/dcl.spec/dcl.type/dcl.type.elab/p3.cpp
     Clang :: SemaTemplate/instantiate-expr-2.cpp

   Expected Passes    : 2019
   Expected Failures  : 14
   Unexpected Failures: 2

The first failure is a difference in the expected output;
the second one is an assertion failing.

We would like to hear your opinion on the thing above.

Regards,
Enea Zaffanella.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Subst-Function-TInfo.patch
Type: text/x-patch
Size: 3319 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20100219/d1613883/attachment.bin>


More information about the cfe-dev mailing list