Index: lib/AST/ASTImporter.cpp =================================================================== --- lib/AST/ASTImporter.cpp +++ lib/AST/ASTImporter.cpp @@ -271,6 +271,7 @@ Expr *VisitCXXThisExpr(CXXThisExpr *E); Expr *VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E); Expr *VisitMemberExpr(MemberExpr *E); + Expr *VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E); Expr *VisitCallExpr(CallExpr *E); Expr *VisitInitListExpr(InitListExpr *E); Expr *VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E); @@ -6478,6 +6479,31 @@ E->getObjectKind()); } +Expr *ASTNodeImporter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) { + CXXRecordDecl *NamingClass = cast_or_null( + Importer.Import(E->getNamingClass())); + if (!NamingClass) + return nullptr; + + DeclarationNameInfo NameInfo(E->getName(), E->getNameLoc()); + ImportDeclarationNameLoc(E->getNameInfo(), NameInfo); + + UnresolvedSet<8> ToDecls; + for (UnresolvedLookupExpr::decls_iterator S = E->decls_begin(), + F = E->decls_end(); + S != F; ++S){ + if (NamedDecl *To = cast_or_null(Importer.Import(*S))) + ToDecls.addDecl(To); + else + return nullptr; + } + + return UnresolvedLookupExpr::Create(Importer.getToContext(), NamingClass, + E->getQualifierLoc(), NameInfo, + E->requiresADL(), E->isOverloaded(), + ToDecls.begin(), ToDecls.end()); +} + Expr *ASTNodeImporter::VisitCallExpr(CallExpr *E) { QualType T = Importer.Import(E->getType()); if (T.isNull()) Index: unittests/AST/ASTImporterTest.cpp =================================================================== --- unittests/AST/ASTImporterTest.cpp +++ unittests/AST/ASTImporterTest.cpp @@ -474,5 +474,25 @@ } +TEST(ImportExpr, ImportUnresolvedLookupExpr) { + MatchVerifier Verifier; + EXPECT_TRUE( + testImport( + "template int foo();" + "template void declToImport() {" + " ::foo;" + " ::template foo;" + "}", + Lang_CXX, "", Lang_CXX, Verifier, + functionTemplateDecl( + has( + functionDecl( + has( + compoundStmt( + has( + unresolvedLookupExpr())))))))); +} + + } // end namespace ast_matchers } // end namespace clang