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 @@ -44,6 +44,7 @@ #include "clang/AST/TypeLoc.h" #include "clang/AST/TypeVisitor.h" #include "clang/AST/UnresolvedSet.h" +#include "clang/Basic/Builtins.h" #include "clang/Basic/ExceptionSpecificationType.h" #include "clang/Basic/FileManager.h" #include "clang/Basic/IdentifierTable.h" @@ -483,6 +484,7 @@ ExpectedDecl VisitUsingDirectiveDecl(UsingDirectiveDecl *D); ExpectedDecl VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D); ExpectedDecl VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D); + ExpectedDecl VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D); Expected ImportObjCTypeParamList(ObjCTypeParamList *list); @@ -4464,6 +4466,20 @@ return ToUsing; } +ExpectedDecl ASTNodeImporter::VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D) { + Decl* ToD = nullptr; + switch (D->getBuiltinTemplateKind()) { + case BuiltinTemplateKind::BTK__make_integer_seq: + ToD = Importer.getToContext().getMakeIntegerSeqDecl(); + break; + case BuiltinTemplateKind::BTK__type_pack_element: + ToD = Importer.getToContext().getTypePackElementDecl(); + break; + } + assert(ToD && "BuiltinTemplateDecl of unsupported kind!"); + Importer.MapImported(D, ToD); + return ToD; +} Error ASTNodeImporter::ImportDefinition( ObjCInterfaceDecl *From, ObjCInterfaceDecl *To, ImportDefinitionKind Kind) { diff --git a/clang/test/Import/builtin-template/Inputs/S.cpp b/clang/test/Import/builtin-template/Inputs/S.cpp new file mode 100644 --- /dev/null +++ b/clang/test/Import/builtin-template/Inputs/S.cpp @@ -0,0 +1,16 @@ +template +struct Seq { + static constexpr T PackSize = sizeof...(I); +}; + +template +using MakeSeq = __make_integer_seq; + + +using SizeT = decltype(sizeof(int)); + +template +using TypePackElement = __type_pack_element; + +template +struct X; diff --git a/clang/test/Import/builtin-template/test.cpp b/clang/test/Import/builtin-template/test.cpp new file mode 100644 --- /dev/null +++ b/clang/test/Import/builtin-template/test.cpp @@ -0,0 +1,30 @@ +// RUN: clang-import-test -dump-ast -import %S/Inputs/S.cpp -expression %s -Xcc -DSEQ | FileCheck --check-prefix=CHECK-SEQ %s +// RUN: clang-import-test -dump-ast -import %S/Inputs/S.cpp -expression %s -Xcc -DPACK | FileCheck --check-prefix=CHECK-PACK %s +// RUN: clang-import-test -dump-ast -import %S/Inputs/S.cpp -expression %s -Xcc -DPACK -Xcc -DSEQ | FileCheck --check-prefixes=CHECK-SEQ,CHECK-PACK %s + +// CHECK-SEQ: BuiltinTemplateDecl +// CHECK-SEQ-SAME: +// CHECK-SEQ-SAME: implicit +// CHECK-SEQ-SAME: __make_integer_seq + +// CHECK-PACK: BuiltinTemplateDecl +// CHECK-PACK-SAME: +// CHECK-PACK-SAME: implicit +// CHECK-PACK-SAME: __type_pack_element + +void expr() { +#ifdef SEQ + typedef MakeSeq M1; + M1 m1; + typedef MakeSeq M2; + M2 m2; + static_assert(M1::PackSize == 3, ""); + static_assert(M2::PackSize == 4, ""); +#endif + +#ifdef PACK + static_assert(__is_same(TypePackElement<0, X<0>>, X<0>), ""); + static_assert(__is_same(TypePackElement<0, X<0>, X<1>>, X<0>), ""); + static_assert(__is_same(TypePackElement<1, X<0>, X<1>>, X<1>), ""); +#endif +}