diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -358,6 +358,8 @@ ExpectedType VisitDecltypeType(const DecltypeType *T); ExpectedType VisitUnaryTransformType(const UnaryTransformType *T); ExpectedType VisitAutoType(const AutoType *T); + ExpectedType VisitDeducedTemplateSpecializationType( + const DeducedTemplateSpecializationType *T); ExpectedType VisitInjectedClassNameType(const InjectedClassNameType *T); // FIXME: DependentDecltypeType ExpectedType VisitRecordType(const RecordType *T); @@ -1376,6 +1378,20 @@ ToTemplateArgs); } +ExpectedType ASTNodeImporter::VisitDeducedTemplateSpecializationType( + const DeducedTemplateSpecializationType *T) { + // FIXME: Make sure that the "to" context supports C++17! + Expected ToTemplateNameOrErr = import(T->getTemplateName()); + if (!ToTemplateNameOrErr) + return ToTemplateNameOrErr.takeError(); + ExpectedType ToDeducedTypeOrErr = import(T->getDeducedType()); + if (!ToDeducedTypeOrErr) + return ToDeducedTypeOrErr.takeError(); + + return Importer.getToContext().getDeducedTemplateSpecializationType( + *ToTemplateNameOrErr, *ToDeducedTypeOrErr, T->isDependentType()); +} + ExpectedType ASTNodeImporter::VisitInjectedClassNameType( const InjectedClassNameType *T) { Expected ToDeclOrErr = import(T->getDecl()); diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp --- a/clang/unittests/AST/ASTImporterTest.cpp +++ b/clang/unittests/AST/ASTImporterTest.cpp @@ -631,6 +631,15 @@ fieldDecl(hasType(dependentTemplateSpecializationType()))))))); } +TEST_P(ImportType, ImportDeducedTemplateSpecialization) { + MatchVerifier Verifier; + testImport("template " + "class C { public: C(T); };" + "C declToImport(123);", + Lang_CXX17, "", Lang_CXX17, Verifier, + varDecl(hasType(deducedTemplateSpecializationType()))); +} + const internal::VariadicDynCastAllOfMatcher sizeOfPackExpr;