Index: lib/AST/ASTImporter.cpp =================================================================== --- lib/AST/ASTImporter.cpp +++ lib/AST/ASTImporter.cpp @@ -77,6 +77,7 @@ QualType VisitTemplateSpecializationType(const TemplateSpecializationType *T); QualType VisitElaboratedType(const ElaboratedType *T); // FIXME: DependentNameType + QualType VisitPackExpansionType(const PackExpansionType *T); // FIXME: DependentTemplateSpecializationType QualType VisitObjCInterfaceType(const ObjCInterfaceType *T); QualType VisitObjCObjectType(const ObjCObjectType *T); @@ -149,6 +150,7 @@ Decl *VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias); Decl *VisitTypedefDecl(TypedefDecl *D); Decl *VisitTypeAliasDecl(TypeAliasDecl *D); + Decl *VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D); Decl *VisitLabelDecl(LabelDecl *D); Decl *VisitEnumDecl(EnumDecl *D); Decl *VisitRecordDecl(RecordDecl *D); @@ -265,6 +267,7 @@ Expr *VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E); Expr *VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *CE); Expr *VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E); + Expr *VisitPackExpansionExpr(PackExpansionExpr *E); Expr *VisitCXXNewExpr(CXXNewExpr *CE); Expr *VisitCXXDeleteExpr(CXXDeleteExpr *E); Expr *VisitCXXConstructExpr(CXXConstructExpr *E); @@ -767,6 +770,16 @@ ToQualifier, ToNamedType); } +QualType ASTNodeImporter::VisitPackExpansionType(const PackExpansionType *T) { + QualType Pattern = Importer.Import(T->getPattern()); + assert(!Pattern.isNull()); + if (Pattern.isNull()) + return QualType(); + + return Importer.getToContext().getPackExpansionType(Pattern, + T->getNumExpansions()); +} + QualType ASTNodeImporter::VisitObjCInterfaceType(const ObjCInterfaceType *T) { ObjCInterfaceDecl *Class = dyn_cast_or_null(Importer.Import(T->getDecl())); @@ -1487,6 +1500,64 @@ return VisitTypedefNameDecl(D, /*IsAlias=*/true); } +Decl *ASTNodeImporter::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) { + // Import the major distinguishing characteristics of this typedef. + DeclContext *DC, *LexicalDC; + DeclarationName Name; + SourceLocation Loc; + NamedDecl *ToD; + if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) + return nullptr; + if (ToD) + return ToD; + + // If this typedef is not in block scope, determine whether we've + // seen a typedef with the same name (that we can merge with) or any + // other entity by that name (which name lookup could conflict with). + if (!DC->isFunctionOrMethod()) { + SmallVector ConflictingDecls; + unsigned IDNS = Decl::IDNS_Ordinary; + SmallVector FoundDecls; + DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); + for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { + if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) + continue; + if (TypeAliasTemplateDecl *FoundAlias = + dyn_cast(FoundDecls[I])) + return Importer.Imported(D, FoundAlias); + ConflictingDecls.push_back(FoundDecls[I]); + } + + if (!ConflictingDecls.empty()) { + Name = Importer.HandleNameConflict(Name, DC, IDNS, + ConflictingDecls.data(), + ConflictingDecls.size()); + if (!Name) + return nullptr; + } + } + + TemplateParameterList *Params = ImportTemplateParameterList( + D->getTemplateParameters()); + assert(Params); + if (!Params) + return nullptr; + + NamedDecl *TemplDecl = cast(Importer.Import(D->getTemplatedDecl())); + assert(TemplDecl); + if (!TemplDecl) + return nullptr; + + TypeAliasTemplateDecl *ToAlias = TypeAliasTemplateDecl::Create( + Importer.getToContext(), DC, Loc, Name, Params, TemplDecl); + + ToAlias->setAccess(D->getAccess()); + ToAlias->setLexicalDeclContext(LexicalDC); + Importer.Imported(D, ToAlias); + LexicalDC->addDeclInternal(ToAlias); + return ToD; +} + Decl *ASTNodeImporter::VisitLabelDecl(LabelDecl *D) { // Import the major distinguishing characteristics of this label. DeclContext *DC, *LexicalDC; @@ -5180,6 +5251,23 @@ return ToMTE; } +Expr *ASTNodeImporter::VisitPackExpansionExpr(PackExpansionExpr *E) { + QualType T = Importer.Import(E->getType()); + if (T.isNull()) { + assert(false); + return nullptr; + } + + Expr *Pattern = Importer.Import(E->getPattern()); + if (!Pattern) { + assert(false); + return nullptr; + } + return new (Importer.getToContext()) PackExpansionExpr( + T, Pattern, Importer.Import(E->getEllipsisLoc()), + E->getNumExpansions()); +} + Expr *ASTNodeImporter::VisitCXXNewExpr(CXXNewExpr *CE) { QualType T = Importer.Import(CE->getType()); if (T.isNull())