Index: lib/AST/ASTImporter.cpp =================================================================== --- lib/AST/ASTImporter.cpp +++ lib/AST/ASTImporter.cpp @@ -68,10 +68,11 @@ QualType VisitRecordType(const RecordType *T); QualType VisitEnumType(const EnumType *T); QualType VisitAttributedType(const AttributedType *T); - // FIXME: TemplateTypeParmType + QualType VisitTemplateTypeParmType(const TemplateTypeParmType *T); // FIXME: SubstTemplateTypeParmType QualType VisitTemplateSpecializationType(const TemplateSpecializationType *T); QualType VisitElaboratedType(const ElaboratedType *T); + QualType VisitInjectedClassNameType(const InjectedClassNameType *T); // FIXME: DependentNameType // FIXME: DependentTemplateSpecializationType QualType VisitObjCInterfaceType(const ObjCInterfaceType *T); @@ -1797,6 +1798,18 @@ ToModifiedType, ToEquivalentType); } +QualType ASTNodeImporter::VisitTemplateTypeParmType(const TemplateTypeParmType *T) { + TemplateTypeParmDecl *ToDecl + = dyn_cast_or_null(Importer.Import(T->getDecl())); + if (!ToDecl) + return QualType(); + + return Importer.getToContext().getTemplateTypeParmType(T->getDepth(), + T->getIndex(), + T->isParameterPack(), + ToDecl); +} + QualType ASTNodeImporter::VisitTemplateSpecializationType( const TemplateSpecializationType *T) { TemplateName ToTemplate = Importer.Import(T->getTemplateName()); @@ -1838,6 +1851,15 @@ ToQualifier, ToNamedType); } +QualType ASTNodeImporter::VisitInjectedClassNameType(const InjectedClassNameType *T) { + CXXRecordDecl *ToDecl + = dyn_cast_or_null(Importer.Import(T->getDecl())); + if (!ToDecl) + return QualType(); + + return Importer.getToContext().getTagDeclType(ToDecl); +} + QualType ASTNodeImporter::VisitObjCInterfaceType(const ObjCInterfaceType *T) { ObjCInterfaceDecl *Class = dyn_cast_or_null(Importer.Import(T->getDecl())); @@ -4279,7 +4301,7 @@ if (DTemplated->isCompleteDefinition() && !D2Templated->isCompleteDefinition()) { - // FIXME: Import definition! + ImportDefinition(DTemplated, D2Templated); } return D2; Index: test/ASTMerge/Inputs/class-template1.cpp =================================================================== --- test/ASTMerge/Inputs/class-template1.cpp +++ test/ASTMerge/Inputs/class-template1.cpp @@ -32,3 +32,17 @@ struct X0 { int member; }; + +template +class X7 { + V var; + void f(T t) { } + V g(T t) { return t; } +}; + +template +class X8 { + typedef X8 x; + X8() { } + int var; +}; Index: test/ASTMerge/Inputs/class-template2.cpp =================================================================== --- test/ASTMerge/Inputs/class-template2.cpp +++ test/ASTMerge/Inputs/class-template2.cpp @@ -33,3 +33,17 @@ struct X0 { float member; }; + +template +class X7 { + V var; + void f(T t) { } + V g(T t) { return t; } +}; + +template +class X8 { + typedef X8 x; + X8() { } + int var; +};