diff options
author | Raphael Isemann <teemperor@gmail.com> | 2019-10-30 14:50:35 +0100 |
---|---|---|
committer | Raphael Isemann <teemperor@gmail.com> | 2019-10-30 14:53:35 +0100 |
commit | ba7bde65dcfff543cefc1de9adcda7f503ffffde (patch) | |
tree | ac185817e0abbd9585596a375b099aa117d18d4d | |
parent | 43144ffa91a2c250cab453b6abd2d1913db3e4d4 (diff) | |
download | bcm5719-llvm-ba7bde65dcfff543cefc1de9adcda7f503ffffde.tar.gz bcm5719-llvm-ba7bde65dcfff543cefc1de9adcda7f503ffffde.zip |
[ASTImporter] Add support for BuiltinTemplateDecl
Summary:
That decl kind is currently not implemented. BuiltinTemplateDecl is for decls that are hardcoded in the
ASTContext, so we can import them like we do other builtin decls by just taking the equivalent
decl from the target ASTContext.
Reviewers: martong, a.sidorin, shafik
Reviewed By: martong, shafik
Subscribers: rnkovacs, kristina, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D69566
-rw-r--r-- | clang/lib/AST/ASTImporter.cpp | 16 | ||||
-rw-r--r-- | clang/test/Import/builtin-template/Inputs/S.cpp | 16 | ||||
-rw-r--r-- | clang/test/Import/builtin-template/test.cpp | 30 |
3 files changed, 62 insertions, 0 deletions
diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index 54acca7dc62..9477e414cf5 100644 --- 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 @@ namespace clang { ExpectedDecl VisitUsingDirectiveDecl(UsingDirectiveDecl *D); ExpectedDecl VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D); ExpectedDecl VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D); + ExpectedDecl VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D); Expected<ObjCTypeParamList *> ImportObjCTypeParamList(ObjCTypeParamList *list); @@ -4464,6 +4466,20 @@ ExpectedDecl ASTNodeImporter::VisitUnresolvedUsingTypenameDecl( 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 index 00000000000..d5c9a9ae030 --- /dev/null +++ b/clang/test/Import/builtin-template/Inputs/S.cpp @@ -0,0 +1,16 @@ +template <class T, T... I> +struct Seq { + static constexpr T PackSize = sizeof...(I); +}; + +template <typename T, T N> +using MakeSeq = __make_integer_seq<Seq, T, N>; + + +using SizeT = decltype(sizeof(int)); + +template <SizeT i, typename ...T> +using TypePackElement = __type_pack_element<i, T...>; + +template <int i> +struct X; diff --git a/clang/test/Import/builtin-template/test.cpp b/clang/test/Import/builtin-template/test.cpp new file mode 100644 index 00000000000..3ae7b53e9d4 --- /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: <invalid sloc> +// CHECK-SEQ-SAME: implicit +// CHECK-SEQ-SAME: __make_integer_seq + +// CHECK-PACK: BuiltinTemplateDecl +// CHECK-PACK-SAME: <invalid sloc> +// CHECK-PACK-SAME: implicit +// CHECK-PACK-SAME: __type_pack_element + +void expr() { +#ifdef SEQ + typedef MakeSeq<int, 3> M1; + M1 m1; + typedef MakeSeq<long, 4> 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 +} |