forked from OSchip/llvm-project
[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
This commit is contained in:
parent
43144ffa91
commit
ba7bde65dc
|
@ -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) {
|
||||
|
|
|
@ -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;
|
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue