balazske created this revision. Herald added subscribers: whisperity, martong, teemperor, gamesh411, Szelethus, dkrupp. Herald added a reviewer: a.sidorin. Herald added a reviewer: shafik. balazske requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D99188 Files: clang/lib/AST/ASTImporter.cpp clang/unittests/AST/ASTImporterTest.cpp Index: clang/unittests/AST/ASTImporterTest.cpp =================================================================== --- clang/unittests/AST/ASTImporterTest.cpp +++ clang/unittests/AST/ASTImporterTest.cpp @@ -631,6 +631,15 @@ fieldDecl(hasType(dependentTemplateSpecializationType()))))))); } +TEST_P(ImportType, ImportDeducedTemplateSpecialization) { + MatchVerifier<Decl> Verifier; + testImport("template <typename T>" + "class C { public: C(T); };" + "C declToImport(123);", + Lang_CXX17, "", Lang_CXX17, Verifier, + varDecl(hasType(deducedTemplateSpecializationType()))); +} + const internal::VariadicDynCastAllOfMatcher<Stmt, SizeOfPackExpr> sizeOfPackExpr; Index: clang/lib/AST/ASTImporter.cpp =================================================================== --- clang/lib/AST/ASTImporter.cpp +++ 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<TemplateName> 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<CXXRecordDecl *> ToDeclOrErr = import(T->getDecl());
Index: clang/unittests/AST/ASTImporterTest.cpp =================================================================== --- clang/unittests/AST/ASTImporterTest.cpp +++ clang/unittests/AST/ASTImporterTest.cpp @@ -631,6 +631,15 @@ fieldDecl(hasType(dependentTemplateSpecializationType()))))))); } +TEST_P(ImportType, ImportDeducedTemplateSpecialization) { + MatchVerifier<Decl> Verifier; + testImport("template <typename T>" + "class C { public: C(T); };" + "C declToImport(123);", + Lang_CXX17, "", Lang_CXX17, Verifier, + varDecl(hasType(deducedTemplateSpecializationType()))); +} + const internal::VariadicDynCastAllOfMatcher<Stmt, SizeOfPackExpr> sizeOfPackExpr; Index: clang/lib/AST/ASTImporter.cpp =================================================================== --- clang/lib/AST/ASTImporter.cpp +++ 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<TemplateName> 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<CXXRecordDecl *> ToDeclOrErr = import(T->getDecl());
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits