From fadb1a1ebf2d161f9eb94ab634c62db8bc5cad3d Mon Sep 17 00:00:00 2001 From: wuhuiquan Date: Fri, 13 Oct 2023 14:52:11 +0800 Subject: [PATCH 1/4] [Trait] add comparison function. Now we can compare trait types. trait F* b = NULL; trait F* c = NULL; if (b == c) {}; if (b != c) {}; --- clang/include/clang/Sema/Sema.h | 12 +- clang/lib/Sema/SemaBSCTrait.cpp | 200 ++++++++++++++++-- clang/lib/Sema/SemaExpr.cpp | 15 +- ...ait_pointer_compare_no_impl_point_type.cbs | 23 ++ .../trait_pointer_compare_no_impl_type.cbs | 21 ++ .../trait_pointer_assign_null.cbs | 32 +++ .../trait_pointer_compare_null.cbs | 44 ++++ .../trait_pointer_compare_null_point.cbs | 52 +++++ .../trait_pointer_compare_other_point.cbs | 53 +++++ .../trait_pointer_compare_trait.cbs | 58 +++++ .../trait_pointer_reassign_null.cbs | 48 +++++ 11 files changed, 528 insertions(+), 30 deletions(-) create mode 100644 clang/test/BSC/Negative/Trait/GenericTrait/trait_pointer_compare_no_impl_point_type.cbs/trait_pointer_compare_no_impl_point_type.cbs create mode 100644 clang/test/BSC/Negative/Trait/GenericTrait/trait_pointer_compare_no_impl_type/trait_pointer_compare_no_impl_type.cbs create mode 100644 clang/test/BSC/Positive/Trait/r3/trait_pointer_assign_null.cbs/trait_pointer_assign_null.cbs create mode 100644 clang/test/BSC/Positive/Trait/r3/trait_pointer_compare_null/trait_pointer_compare_null.cbs create mode 100644 clang/test/BSC/Positive/Trait/r3/trait_pointer_compare_null_point/trait_pointer_compare_null_point.cbs create mode 100644 clang/test/BSC/Positive/Trait/r3/trait_pointer_compare_other_point/trait_pointer_compare_other_point.cbs create mode 100644 clang/test/BSC/Positive/Trait/r3/trait_pointer_compare_trait/trait_pointer_compare_trait.cbs create mode 100644 clang/test/BSC/Positive/Trait/r3/trait_pointer_reassign_null/trait_pointer_reassign_null.cbs diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 6fa228bbac24..b1762e70fc12 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -7529,10 +7529,18 @@ public: void ActOnFinishCXXNonNestedClass(); RecordDecl *ActOnDesugarVtableRecord(TraitDecl *TD); RecordDecl *ActOnDesugarTraitRecord(TraitDecl *TD, RecordDecl *TraitVtableRD); + bool IsTraitExpr(Expr *Expr); + ExprResult ActOnTraitReassignNull(Scope *S, SourceLocation TokLoc, + BinaryOperatorKind Opc, Expr *LHSExpr, + Expr *RHSExpr); + ExprResult ActOnTraitReassign(Scope *S, SourceLocation TokLoc, - BinaryOperatorKind Opc, RecordDecl *RD, - Expr *LHSExpr, Expr *RHSExpr); + BinaryOperatorKind Opc, Expr *LHSExpr, + Expr *RHSExpr); + ExprResult ActOnTraitCompare(Scope *S, SourceLocation TokLoc, + BinaryOperatorKind Opc, Expr *LHSExpr, + Expr *RHSExpr); void ActOnReenterCXXMethodParameter(Scope *S, ParmVarDecl *Param); unsigned ActOnReenterTemplateScope(Decl *Template, llvm::function_ref EnterScope); diff --git a/clang/lib/Sema/SemaBSCTrait.cpp b/clang/lib/Sema/SemaBSCTrait.cpp index 85b04a608897..40ddc23eaf20 100644 --- a/clang/lib/Sema/SemaBSCTrait.cpp +++ b/clang/lib/Sema/SemaBSCTrait.cpp @@ -602,32 +602,46 @@ VarDecl *Sema::ActOnDesugarTraitInstance(Decl *D) { Diag(UO->getBeginLoc(), diag::err_type_has_not_impl_trait) << OriginQT << T; return nullptr; } + + bool ExpIsNullPointer = + exp->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNull); T = PT->getPointeeType().getCanonicalType(); VarDecl *LookupVar = TD->getTypeImpledVarDecl(T); - if (!LookupVar) { + if (!LookupVar && !ExpIsNullPointer) { Diag(UO->getBeginLoc(), diag::err_type_has_not_impl_trait) << OriginQT << T; return nullptr; } - QualType VoidPT = Context.getPointerType(Context.VoidTy); - ImplicitCastExpr *TraitData = - ImplicitCastExpr::Create(Context, VoidPT, - /* CastKind=*/CK_BitCast, - /* Expr=*/UO, - /* CXXCastPath=*/nullptr, - /* ExprValueKind=*/VK_PRValue, - /* FPFeatures */ FPOptionsOverride()); - - QualType VtableTy = LookupVar->getType(); - QualType VtablePT = Context.getPointerType(VtableTy); - DeclRefExpr *VtableRef = DeclRefExpr::Create( - Context, NestedNameSpecifierLoc(), SourceLocation(), LookupVar, false, - SourceLocation(), VtableTy, VK_LValue); - UnaryOperator *UOVtable = UnaryOperator::Create( - Context, VtableRef, UO_AddrOf, VtablePT, VK_PRValue, OK_Ordinary, - SourceLocation(), false, FPOptionsOverride()); - - std::vector Exprs = {TraitData, UOVtable}; + std::vector Exprs; + if (ExpIsNullPointer) { + // trait I *a = NULL; + QualType VtableTy = Context.getRecordType(TD->getVtable()); + QualType VtablePT = Context.getPointerType(VtableTy); + ImplicitCastExpr *TraitVtable = + ImplicitCastExpr::Create(Context, VtablePT, CK_BitCast, UO, nullptr, + VK_PRValue, FPOptionsOverride()); + Exprs = {UO, TraitVtable}; + } else { + QualType VoidPT = Context.getPointerType(Context.VoidTy); + ImplicitCastExpr *TraitData = + ImplicitCastExpr::Create(Context, VoidPT, + /* CastKind=*/CK_BitCast, + /* Expr=*/UO, + /* CXXCastPath=*/nullptr, + /* ExprValueKind=*/VK_PRValue, + /* FPFeatures */ FPOptionsOverride()); + + QualType VtableTy = LookupVar->getType(); + QualType VtablePT = Context.getPointerType(VtableTy); + DeclRefExpr *VtableRef = DeclRefExpr::Create( + Context, NestedNameSpecifierLoc(), SourceLocation(), LookupVar, false, + SourceLocation(), VtableTy, VK_LValue); + UnaryOperator *UOVtable = UnaryOperator::Create( + Context, VtableRef, UO_AddrOf, VtablePT, VK_PRValue, OK_Ordinary, + SourceLocation(), false, FPOptionsOverride()); + Exprs = {TraitData, UOVtable}; + } + MutableArrayRef initExprs = MutableArrayRef(Exprs); ExprResult TraitInit = ActOnInitList(SourceLocation(), initExprs, SourceLocation()); @@ -669,15 +683,54 @@ TraitDecl *Sema::TryDesugarTrait(QualType T) { return TD; } +// trait F* f = &b; +// f = NULL; +ExprResult Sema::ActOnTraitReassignNull(Scope *S, SourceLocation TokLoc, + BinaryOperatorKind Opc, Expr *LHSExpr, + Expr *RHSExpr) { + Expr *Bin1 = nullptr; + Expr *Bin2 = nullptr; + RecordDecl *RD = + dyn_cast(LHSExpr->getType().getCanonicalType())->getDecl(); + for (RecordDecl::field_iterator I = RD->field_begin(), E = RD->field_end(); + I != E; ++I) { + Expr *NewLHSExpr = BuildMemberExpr( + LHSExpr, false, SourceLocation(), NestedNameSpecifierLoc(), + SourceLocation(), *I, DeclAccessPair::make(*I, I->getAccess()), false, + DeclarationNameInfo(), I->getType(), VK_LValue, OK_Ordinary); + if (Bin1 == nullptr) { + Bin1 = BuildBinOp(S, TokLoc, Opc, NewLHSExpr, RHSExpr) + .get(); // f.data = NULL; + } else { + Bin2 = BuildBinOp(S, TokLoc, Opc, NewLHSExpr, RHSExpr) + .get(); // f.vtable = NULL; + } + } + + return BuildBinOp(S, TokLoc, BO_Comma, Bin1, Bin2); +} + // Handling reassignments of variable types with trait pointers: -// trait F* f = &a; +// trait F* f = &b; // f = &a; ExprResult Sema::ActOnTraitReassign(Scope *S, SourceLocation TokLoc, - BinaryOperatorKind Opc, RecordDecl *RD, - Expr *LHSExpr, Expr *RHSExpr) { + BinaryOperatorKind Opc, Expr *LHSExpr, + Expr *RHSExpr) { Expr *Bin1 = nullptr; Expr *Bin2 = nullptr; + if (RHSExpr->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNull)) { + return ActOnTraitReassignNull(S, TokLoc, Opc, LHSExpr, RHSExpr); + } + bool RHSIsPointerType = RHSExpr->getType()->isPointerType(); + if (!RHSIsPointerType) { + Diag(TokLoc, diag::err_type_has_not_impl_trait) + << LHSExpr->getType() << RHSExpr->getType(); + return ExprError(); + } + QualType T = RHSExpr->getType()->getPointeeType().getCanonicalType(); + RecordDecl *RD = + dyn_cast(LHSExpr->getType().getCanonicalType())->getDecl(); for (RecordDecl::field_iterator I = RD->field_begin(), E = RD->field_end(); I != E; ++I) { Expr *NewLHSExpr = BuildMemberExpr( @@ -693,6 +746,11 @@ ExprResult Sema::ActOnTraitReassign(Scope *S, SourceLocation TokLoc, TraitDecl *TD = RD->getDesugaredTraitDecl(); RecordDecl *LookupVtable = TD->getVtable(); VarDecl *LookupVar = TD->getTypeImpledVarDecl(T); + if (!LookupVar) { + Diag(TokLoc, diag::err_type_has_not_impl_trait) + << LHSExpr->getType() << RHSExpr->getType(); + return ExprError(); + } QualType VtableTy = Context.getRecordType(LookupVtable); if (LookupVtable->getDescribedClassTemplate()) VtableTy = @@ -715,3 +773,99 @@ ExprResult Sema::ActOnTraitReassign(Scope *S, SourceLocation TokLoc, return BuildBinOp(S, TokLoc, BO_Comma, Bin1, Bin2); // f.data = &a, f.vtable = &__int_trait_T; } + +bool Sema::IsTraitExpr(Expr *Expr) { + if (auto RT = dyn_cast(Expr->getType().getCanonicalType())) { + RecordDecl *RD = dyn_cast(RT->getDecl()); + return (RD && RD->getDesugaredTraitDecl()); + } + return false; +} + +ExprResult Sema::ActOnTraitCompare(Scope *S, SourceLocation TokLoc, + BinaryOperatorKind Opc, Expr *LHSExpr, + Expr *RHSExpr) { + // trait F* f = &a; + // trait F* e = &a; + // if (f == e) {}; + bool LHSIsTrait = IsTraitExpr(LHSExpr); + bool RHSIsTrait = IsTraitExpr(RHSExpr); + if (LHSIsTrait && RHSIsTrait) { + RecordDecl *LRD = + dyn_cast(LHSExpr->getType().getCanonicalType())->getDecl(); + for (RecordDecl::field_iterator I = LRD->field_begin(), + E = LRD->field_end(); + I != E; ++I) { + Expr *NewLHSExpr = BuildMemberExpr( + LHSExpr, false, SourceLocation(), NestedNameSpecifierLoc(), + SourceLocation(), *I, DeclAccessPair::make(*I, I->getAccess()), false, + DeclarationNameInfo(), I->getType(), VK_LValue, OK_Ordinary); + RecordDecl *RRD = + dyn_cast(RHSExpr->getType().getCanonicalType()) + ->getDecl(); + for (RecordDecl::field_iterator J = RRD->field_begin(), + F = RRD->field_end(); + J != F; ++J) { + Expr *NewRHSExpr = BuildMemberExpr( + RHSExpr, false, SourceLocation(), NestedNameSpecifierLoc(), + SourceLocation(), *J, DeclAccessPair::make(*J, J->getAccess()), + false, DeclarationNameInfo(), J->getType(), VK_LValue, OK_Ordinary); + if (I->getNameAsString() == "data" && J->getNameAsString() == "data") { + return BuildBinOp(S, TokLoc, Opc, NewLHSExpr, + NewRHSExpr); // f.data == e.data; + } + } + } + Diag(TokLoc, diag::err_typecheck_decl_incomplete_type) + << LHSExpr->getType(); + return ExprError(); + } + + RecordDecl *RD; + Expr *BaseTrait; + Expr *BaseExpr; + if (LHSIsTrait) { + RD = dyn_cast(LHSExpr->getType().getCanonicalType())->getDecl(); + BaseTrait = LHSExpr; + BaseExpr = RHSExpr; + } else if (RHSIsTrait) { + RD = dyn_cast(RHSExpr->getType().getCanonicalType())->getDecl(); + BaseTrait = RHSExpr; + BaseExpr = LHSExpr; + } else { + Diag(TokLoc, diag::err_typecheck_decl_incomplete_type) + << LHSExpr->getType(); + return ExprError(); + } + for (RecordDecl::field_iterator I = RD->field_begin(), E = RD->field_end(); + I != E; ++I) { + Expr *Expr = BuildMemberExpr( + BaseTrait, false, SourceLocation(), NestedNameSpecifierLoc(), + SourceLocation(), *I, DeclAccessPair::make(*I, I->getAccess()), false, + DeclarationNameInfo(), I->getType(), VK_LValue, OK_Ordinary); + if (I->getNameAsString() == "data") { + bool IsPointerType = BaseExpr->getType()->isPointerType(); + if (!IsPointerType) { + Diag(TokLoc, diag::err_type_has_not_impl_trait) + << BaseTrait->getType() << BaseExpr->getType(); + return ExprError(); + } + QualType T = BaseExpr->getType()->getPointeeType().getCanonicalType(); + TraitDecl *TD = RD->getDesugaredTraitDecl(); + VarDecl *LookupVar = TD->getTypeImpledVarDecl(T); + if (!LookupVar && !(T->isVoidType())) { + // If expr no ImplTraitDecl, Diagnose bad pointer comparisons. + Diag(TokLoc, diag::ext_typecheck_comparison_of_distinct_pointers) + << LHSExpr->getType() << RHSExpr->getType() + << LHSExpr->getSourceRange() << RHSExpr->getSourceRange(); + } + if (LHSIsTrait) { + return BuildBinOp(S, TokLoc, Opc, Expr, BaseExpr); // f.data == &a; + } else { + return BuildBinOp(S, TokLoc, Opc, BaseExpr, Expr); // &a == f.data; + } + } + } + Diag(TokLoc, diag::err_typecheck_decl_incomplete_type) << LHSExpr->getType(); + return ExprError(); +} \ No newline at end of file diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index a9742ac233de..d21174fefec5 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -15740,11 +15740,16 @@ ExprResult Sema::ActOnBinOp(Scope *S, SourceLocation TokLoc, DiagnoseBinOpPrecedence(*this, Opc, TokLoc, LHSExpr, RHSExpr); // Handling reassignments of variable types with trait pointers: - if (getLangOpts().BSC && LHSExpr->getType() != RHSExpr->getType()) { - if (auto RT = dyn_cast(LHSExpr->getType().getCanonicalType())) { - RecordDecl *RD = dyn_cast(RT->getDecl()); - if (RD && RD->getDesugaredTraitDecl()) - return ActOnTraitReassign(S, TokLoc, Opc, RD, LHSExpr, RHSExpr); + if (getLangOpts().BSC) { + bool LHSIsTrait = IsTraitExpr(LHSExpr); + bool RHSIsTrait = IsTraitExpr(RHSExpr); + if (LHSIsTrait || RHSIsTrait) { + if (Opc == BO_Assign && LHSIsTrait && !RHSIsTrait) { + return ActOnTraitReassign(S, TokLoc, Opc, LHSExpr, RHSExpr); + } + if (Opc == BO_EQ || Opc == BO_NE) { + return ActOnTraitCompare(S, TokLoc, Opc, LHSExpr, RHSExpr); + } } } diff --git a/clang/test/BSC/Negative/Trait/GenericTrait/trait_pointer_compare_no_impl_point_type.cbs/trait_pointer_compare_no_impl_point_type.cbs b/clang/test/BSC/Negative/Trait/GenericTrait/trait_pointer_compare_no_impl_point_type.cbs/trait_pointer_compare_no_impl_point_type.cbs new file mode 100644 index 000000000000..a7cd03b4ee3a --- /dev/null +++ b/clang/test/BSC/Negative/Trait/GenericTrait/trait_pointer_compare_no_impl_point_type.cbs/trait_pointer_compare_no_impl_point_type.cbs @@ -0,0 +1,23 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +trait Future { + int poll(This* this); +}; + +int int::poll(int* this) { + return *this; +} + +impl trait Future for int; + +int main() { + int a = 1; + trait Future *f = &a; + double b = 1.0; + double *x = &b; + if (x == f) { // expected-warning {{comparison of distinct pointer types ('double *' and 'struct __Trait_Future')}} + return 1; + } + + return 0; +} diff --git a/clang/test/BSC/Negative/Trait/GenericTrait/trait_pointer_compare_no_impl_type/trait_pointer_compare_no_impl_type.cbs b/clang/test/BSC/Negative/Trait/GenericTrait/trait_pointer_compare_no_impl_type/trait_pointer_compare_no_impl_type.cbs new file mode 100644 index 000000000000..b006c0e1ab89 --- /dev/null +++ b/clang/test/BSC/Negative/Trait/GenericTrait/trait_pointer_compare_no_impl_type/trait_pointer_compare_no_impl_type.cbs @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +trait Future { + int poll(This* this); +}; + +int int::poll(int* this) { + return *this; +} + +impl trait Future for int; + +int main() { + int d = 1; + trait Future *f = &d; + if (f == 1.0) { // expected-error {{expected a pointer type which has implemented 'struct __Trait_Future', found 'double'}} + return 1; + } + + return 0; +} diff --git a/clang/test/BSC/Positive/Trait/r3/trait_pointer_assign_null.cbs/trait_pointer_assign_null.cbs b/clang/test/BSC/Positive/Trait/r3/trait_pointer_assign_null.cbs/trait_pointer_assign_null.cbs new file mode 100644 index 000000000000..609bbe2bcb18 --- /dev/null +++ b/clang/test/BSC/Positive/Trait/r3/trait_pointer_assign_null.cbs/trait_pointer_assign_null.cbs @@ -0,0 +1,32 @@ +// RUN: %clang %s -o %t.output +// RUN: %t.output +// RUN: %clang -rewrite-bsc %s -o %t-rw.c +// RUN: FileCheck --input-file=%t-rw.c %s +// RUN: %clang %t-rw.c -o %t-rw.output +// RUN: %t-rw.output +// expected-no-diagnostics + +#include + +trait Future { + int poll(This* this); +}; + +int main() { + trait Future *f = NULL, *g = NULL; + return 0; +} + +// CHECK: struct __Trait_Future_Vtable { +// CHECK-NEXT: int (*poll)(void *); +// CHECK-NEXT: }; + +// CHECK: struct __Trait_Future { +// CHECK-NEXT: void *data; +// CHECK-NEXT: struct __Trait_Future_Vtable *vtable; +// CHECK-NEXT: }; + +// CHECK: int main(void) { +// CHECK-NEXT: struct __Trait_Future f_1 = {((void *)0), ((void *)0)}, g_1 = {((void *)0), ((void *)0)}; +// CHECK-NEXT: return 0; +// CHECK-NEXT: } diff --git a/clang/test/BSC/Positive/Trait/r3/trait_pointer_compare_null/trait_pointer_compare_null.cbs b/clang/test/BSC/Positive/Trait/r3/trait_pointer_compare_null/trait_pointer_compare_null.cbs new file mode 100644 index 000000000000..e4604a0f1599 --- /dev/null +++ b/clang/test/BSC/Positive/Trait/r3/trait_pointer_compare_null/trait_pointer_compare_null.cbs @@ -0,0 +1,44 @@ +// RUN: %clang %s -o %t.output +// RUN: %t.output +// RUN: %clang -rewrite-bsc %s -o %t-rw.c +// RUN: FileCheck --input-file=%t-rw.c %s +// RUN: %clang %t-rw.c -o %t-rw.output +// RUN: %t-rw.output +// expected-no-diagnostics + +#include + +trait F { + int foo(This* this); +}; + +int main() { + trait F* f = NULL; + if (f != NULL ) { + return 1; + } + if (f == NULL) { + return 0; + } + return 1; +} + +// CHECK: struct __Trait_F_Vtable { +// CHECK-NEXT: int (*foo)(void *); +// CHECK-NEXT: }; + +// CHECK: struct __Trait_F { +// CHECK-NEXT: void *data; +// CHECK-NEXT: struct __Trait_F_Vtable *vtable; +// CHECK-NEXT: }; + +// CHECK: int main(void) { +// CHECK-NEXT: struct __Trait_F f_1 = {((void *)0), ((void *)0)}; +// CHECK-NEXT: if (f_1.data != ((void *)0)) { +// CHECK-NEXT: return 1; +// CHECK-NEXT: } +// CHECK-NEXT: if (f_1.data == ((void *)0)) { +// CHECK-NEXT: return 0; +// CHECK-NEXT: } +// CHECK-NEXT: return 1; +// CHECK-NEXT: } \ No newline at end of file diff --git a/clang/test/BSC/Positive/Trait/r3/trait_pointer_compare_null_point/trait_pointer_compare_null_point.cbs b/clang/test/BSC/Positive/Trait/r3/trait_pointer_compare_null_point/trait_pointer_compare_null_point.cbs new file mode 100644 index 000000000000..4bb94ae39347 --- /dev/null +++ b/clang/test/BSC/Positive/Trait/r3/trait_pointer_compare_null_point/trait_pointer_compare_null_point.cbs @@ -0,0 +1,52 @@ +// RUN: %clang %s -o %t.output +// RUN: %t.output +// RUN: %clang -rewrite-bsc %s -o %t-rw.c +// RUN: FileCheck --input-file=%t-rw.c %s +// RUN: %clang %t-rw.c -o %t-rw.output +// RUN: %t-rw.output +// expected-no-diagnostics + +#include + +trait Future { + int poll(This* this); +}; + +int int::poll(int* this) { + return *this; +} + +impl trait Future for int; + +int main() { + int *c = NULL; + trait Future *f = NULL, *g = c; + if (f == g) { + return 0; + } + return 1; +} + +// CHECK: struct __Trait_Future_Vtable { +// CHECK-NEXT: int (*poll)(void *); +// CHECK-NEXT: }; + +// CHECK: struct __Trait_Future { +// CHECK-NEXT: void *data; +// CHECK-NEXT: struct __Trait_Future_Vtable *vtable; +// CHECK-NEXT: }; + +// CHECK: int int_poll(int *this) { +// CHECK-NEXT: return *this; +// CHECK-NEXT: } + +// CHECK: struct __Trait_Future_Vtable __int_trait_Future = {.poll = (int (*)(void *))int_poll}; + +// CHECK: int main(void) { +// CHECK-NEXT: int *c = ((void *)0); +// CHECK-NEXT: struct __Trait_Future f_1 = {((void *)0), ((void *)0)}, g_1 = {c, &__int_trait_Future}; +// CHECK-NEXT: if (f_1.data == g_1.data) { +// CHECK-NEXT: return 0; +// CHECK-NEXT: } +// CHECK-NEXT: return 1; +// CHECK-NEXT: } diff --git a/clang/test/BSC/Positive/Trait/r3/trait_pointer_compare_other_point/trait_pointer_compare_other_point.cbs b/clang/test/BSC/Positive/Trait/r3/trait_pointer_compare_other_point/trait_pointer_compare_other_point.cbs new file mode 100644 index 000000000000..778eef5b1662 --- /dev/null +++ b/clang/test/BSC/Positive/Trait/r3/trait_pointer_compare_other_point/trait_pointer_compare_other_point.cbs @@ -0,0 +1,53 @@ +// RUN: %clang %s -o %t.output +// RUN: %t.output +// RUN: %clang -rewrite-bsc %s -o %t-rw.c +// RUN: FileCheck --input-file=%t-rw.c %s +// RUN: %clang %t-rw.c -o %t-rw.output +// RUN: %t-rw.output +// expected-no-diagnostics + +trait Future { + int poll(This* this); +}; + +int int::poll(int* this) { + return *this; +} + +impl trait Future for int; + +int main() { + int d = 1; + trait Future *f = &d; + int *x = &d; + if (x == f) { + return 0; + } + + return 1; +} + +// CHECK: struct __Trait_Future_Vtable { +// CHECK-NEXT: int (*poll)(void *); +// CHECK-NEXT: }; + +// CHECK: struct __Trait_Future { +// CHECK-NEXT: void *data; +// CHECK-NEXT: struct __Trait_Future_Vtable *vtable; +// CHECK-NEXT: }; + +// CHECK: int int_poll(int *this) { +// CHECK-NEXT: return *this; +// CHECK-NEXT: } + +// CHECK: struct __Trait_Future_Vtable __int_trait_Future = {.poll = (int (*)(void *))int_poll}; + +// CHECK: int main(void) { +// CHECK-NEXT: int d = 1; +// CHECK-NEXT: struct __Trait_Future f_1 = {&d, &__int_trait_Future}; +// CHECK-NEXT: int *x = &d; +// CHECK-NEXT: if (x == f_1.data) { +// CHECK-NEXT: return 0; +// CHECK-NEXT: } +// CHECK-NEXT: return 1; +// CHECK-NEXT: } diff --git a/clang/test/BSC/Positive/Trait/r3/trait_pointer_compare_trait/trait_pointer_compare_trait.cbs b/clang/test/BSC/Positive/Trait/r3/trait_pointer_compare_trait/trait_pointer_compare_trait.cbs new file mode 100644 index 000000000000..4a50fd2b4b0c --- /dev/null +++ b/clang/test/BSC/Positive/Trait/r3/trait_pointer_compare_trait/trait_pointer_compare_trait.cbs @@ -0,0 +1,58 @@ +// RUN: %clang %s -o %t.output +// RUN: %t.output +// RUN: %clang -rewrite-bsc %s -o %t-rw.c +// RUN: FileCheck --input-file=%t-rw.c %s +// RUN: %clang %t-rw.c -o %t-rw.output +// RUN: %t-rw.output +// expected-no-diagnostics + +trait F { + int foo(This* this); +}; + +int int::foo(int *this) { + return 2; +}; + +impl trait F for int; + +int main() { + int a = 1; + trait F* f = &a; + trait F* e = &a; + if (f != e) { + return 1; + } + if (f == e) { + return 0; + } + return 1; +} + +// CHECK: struct __Trait_F_Vtable { +// CHECK-NEXT: int (*foo)(void *); +// CHECK-NEXT: }; + +// CHECK: struct __Trait_F { +// CHECK-NEXT: void *data; +// CHECK-NEXT: struct __Trait_F_Vtable *vtable; +// CHECK-NEXT: }; + +// CHECK: int int_foo(int *this) { +// CHECK-NEXT: return 2; +// CHECK-NEXT: } + +// CHECK: struct __Trait_F_Vtable __int_trait_F = {.foo = (int (*)(void *))int_foo}; + +// CHECK: int main(void) { +// CHECK-NEXT: int a = 1; +// CHECK-NEXT: struct __Trait_F f_1 = {&a, &__int_trait_F}; +// CHECK-NEXT: struct __Trait_F e_1 = {&a, &__int_trait_F}; +// CHECK-NEXT: if (f_1.data != e_1.data) { +// CHECK-NEXT: return 1; +// CHECK-NEXT: } +// CHECK-NEXT: if (f_1.data == e_1.data) { +// CHECK-NEXT: return 0; +// CHECK-NEXT: } +// CHECK-NEXT: return 1; +// CHECK-NEXT: } \ No newline at end of file diff --git a/clang/test/BSC/Positive/Trait/r3/trait_pointer_reassign_null/trait_pointer_reassign_null.cbs b/clang/test/BSC/Positive/Trait/r3/trait_pointer_reassign_null/trait_pointer_reassign_null.cbs new file mode 100644 index 000000000000..2ab503165c61 --- /dev/null +++ b/clang/test/BSC/Positive/Trait/r3/trait_pointer_reassign_null/trait_pointer_reassign_null.cbs @@ -0,0 +1,48 @@ +// RUN: %clang %s -o %t.output +// RUN: %t.output +// RUN: %clang -rewrite-bsc %s -o %t-rw.c +// RUN: FileCheck --input-file=%t-rw.c %s +// RUN: %clang %t-rw.c -o %t-rw.output +// RUN: %t-rw.output +// expected-no-diagnostics + +#include + +trait F { + int foo(This* this); +}; + +int int::foo(int *this) { + return 2; +}; + +impl trait F for int; + +int main() { + int a = 1; + trait F* f = &a; + f = NULL; + return 0; +} + +// CHECK: struct __Trait_F_Vtable { +// CHECK-NEXT: int (*foo)(void *); +// CHECK-NEXT: }; + +// CHECK: struct __Trait_F { +// CHECK-NEXT: void *data; +// CHECK-NEXT: struct __Trait_F_Vtable *vtable; +// CHECK-NEXT: }; + +// CHECK: int int_foo(int *this) { +// CHECK-NEXT: return 2; +// CHECK-NEXT: } + +// CHECK: struct __Trait_F_Vtable __int_trait_F = {.foo = (int (*)(void *))int_foo}; + +// CHECK: int main(void) { +// CHECK-NEXT: int a = 1; +// CHECK-NEXT: struct __Trait_F f_1 = {&a, &__int_trait_F}; +// CHECK-NEXT: f_1.data = ((void *)0) , f_1.vtable = ((void *)0); +// CHECK-NEXT: return 0; +// CHECK-NEXT: } \ No newline at end of file -- Gitee From b87d702be4dcce1b04673fbefbad1ea3f19b0315 Mon Sep 17 00:00:00 2001 From: jeanniely Date: Wed, 25 Oct 2023 02:20:12 +0000 Subject: [PATCH 2/4] [BSC] bugfix bsc tests for processing .c to .bsc * [BSC] bugfix bsc tests for processing .c to .bsc --- libcxx/utils/libcxx/test/format.py | 2 + llvm/utils/lit/lit/LitConfig.py | 3 +- llvm/utils/lit/lit/LitTestCase.py | 1 + llvm/utils/lit/lit/TestingConfig.py | 3 + llvm/utils/lit/lit/cl_arguments.py | 4 + llvm/utils/lit/lit/formats/BSCBlocklist.py | 429 +++++++++++++++++++++ llvm/utils/lit/lit/formats/base.py | 4 + llvm/utils/lit/lit/llvm/config.py | 5 +- llvm/utils/lit/lit/main.py | 8 + 9 files changed, 456 insertions(+), 3 deletions(-) mode change 100644 => 100755 libcxx/utils/libcxx/test/format.py mode change 100644 => 100755 llvm/utils/lit/lit/LitConfig.py mode change 100644 => 100755 llvm/utils/lit/lit/LitTestCase.py mode change 100644 => 100755 llvm/utils/lit/lit/TestingConfig.py mode change 100644 => 100755 llvm/utils/lit/lit/cl_arguments.py create mode 100644 llvm/utils/lit/lit/formats/BSCBlocklist.py mode change 100644 => 100755 llvm/utils/lit/lit/formats/base.py mode change 100644 => 100755 llvm/utils/lit/lit/llvm/config.py diff --git a/libcxx/utils/libcxx/test/format.py b/libcxx/utils/libcxx/test/format.py old mode 100644 new mode 100755 index 1892c5fcd371..1f0c06fc0ace --- a/libcxx/utils/libcxx/test/format.py +++ b/libcxx/utils/libcxx/test/format.py @@ -191,6 +191,8 @@ class CxxStandardLibraryTest(lit.formats.TestFormat): filepath = os.path.join(sourcePath, filename) if not os.path.isdir(filepath): + if litConfig.useBSC and filepath[-2:] != ".c": + continue if any([re.search(ext, filename) for ext in SUPPORTED_SUFFIXES]): yield lit.Test.Test(testSuite, pathInSuite + (filename,), localConfig) diff --git a/llvm/utils/lit/lit/LitConfig.py b/llvm/utils/lit/lit/LitConfig.py old mode 100644 new mode 100755 index d6287d06034f..d138f84e1ac6 --- a/llvm/utils/lit/lit/LitConfig.py +++ b/llvm/utils/lit/lit/LitConfig.py @@ -21,7 +21,7 @@ class LitConfig(object): """ def __init__(self, progname, path, quiet, - useValgrind, valgrindLeakCheck, valgrindArgs, + useValgrind, useBSC, valgrindLeakCheck, valgrindArgs, noExecute, debug, isWindows, order, params, config_prefix = None, maxIndividualTestTime = 0, @@ -33,6 +33,7 @@ class LitConfig(object): self.path = [str(p) for p in path] self.quiet = bool(quiet) self.useValgrind = bool(useValgrind) + self.useBSC = bool(useBSC) self.valgrindLeakCheck = bool(valgrindLeakCheck) self.valgrindUserArgs = list(valgrindArgs) self.noExecute = noExecute diff --git a/llvm/utils/lit/lit/LitTestCase.py b/llvm/utils/lit/lit/LitTestCase.py old mode 100644 new mode 100755 index 2e9b64953bd1..9ece046089af --- a/llvm/utils/lit/lit/LitTestCase.py +++ b/llvm/utils/lit/lit/LitTestCase.py @@ -47,6 +47,7 @@ def load_test_suite(inputs): path=[], quiet=False, useValgrind=False, + useBSC=False, valgrindLeakCheck=False, valgrindArgs=[], noExecute=False, diff --git a/llvm/utils/lit/lit/TestingConfig.py b/llvm/utils/lit/lit/TestingConfig.py old mode 100644 new mode 100755 index 55e2a764d8fa..923f2ac820a3 --- a/llvm/utils/lit/lit/TestingConfig.py +++ b/llvm/utils/lit/lit/TestingConfig.py @@ -85,6 +85,9 @@ class TestingConfig(object): if litConfig.valgrindLeakCheck: available_features.append('vg_leak') + if litConfig.useBSC: + available_features.append('bsc') + return TestingConfig(None, name = '', suffixes = set(), diff --git a/llvm/utils/lit/lit/cl_arguments.py b/llvm/utils/lit/lit/cl_arguments.py old mode 100644 new mode 100755 index 43bbd6fdaa96..dacdd6b34728 --- a/llvm/utils/lit/lit/cl_arguments.py +++ b/llvm/utils/lit/lit/cl_arguments.py @@ -98,6 +98,10 @@ def parse_args(): dest="useValgrind", help="Run tests under valgrind", action="store_true") + execution_group.add_argument("--bsc", + dest="useBSC", + help="Run tests under bsc", + action="store_true") execution_group.add_argument("--vg-leak", dest="valgrindLeakCheck", help="Check for memory leaks under valgrind", diff --git a/llvm/utils/lit/lit/formats/BSCBlocklist.py b/llvm/utils/lit/lit/formats/BSCBlocklist.py new file mode 100644 index 000000000000..1616685baf38 --- /dev/null +++ b/llvm/utils/lit/lit/formats/BSCBlocklist.py @@ -0,0 +1,429 @@ +bsc_failed_cases = [ + "arithmetic-fence-builtin.c", + "ast-dump-aarch64-sve-types.c", + "ast-dump-arm-attr.c", + "ast-dump-c-attr.c", + "ast-dump-decl-json.c", + "ast-dump-decl.c", + "ast-dump-funcs-multiversion.c", + "ast-dump-msp430-attr.c", + "ast-dump-openmp-begin-declare-variant_11.c", + "ast-dump-openmp-begin-declare-variant_13.c", + "ast-dump-openmp-begin-declare-variant_2.c", + "ast-dump-openmp-begin-declare-variant_3.c", + "ast-dump-openmp-begin-declare-variant_5.c", + "ast-dump-openmp-begin-declare-variant_6.c", + "ast-dump-openmp-begin-declare-variant_7.c", + "ast-dump-openmp-begin-declare-variant_8.c", + "ast-dump-openmp-begin-declare-variant_9.c", + "ast-dump-openmp-begin-declare-variant_addr_1.c", + "ast-dump-openmp-begin-declare-variant_nested.c", + "ast-dump-records.c", + "ast-dump-recovery.c", + "ast-dump-wasm-attr-export.c", + "ast-dump-wasm-attr-import.c", + "ast-print-record-decl.c", + "ast-print-vector-size-bool.c", + "c-casts.c", + "fixed_point.c", + "fixed_point_to_string.c", + "implicit-cast-dump.c", + "multistep-explicit-cast.c", + "variadic-promotion.c", + "test.c", + "PR49642.c", + "blocks-no-inline.c", + "bstring.c", + "casts.c", + "no-store-func-path-notes.c", + "exercise-ps.c", + "fields.c", + "index-type.c", + "inline-unique-reports.c", + "inline.c", + "malloc.c", + "nullability.c", + "plist-macros-with-expansion.c", + "std-c-library-functions-arg-weakdeps.c", + "std-c-library-functions-lookup.c", + "std-c-library-functions-vs-stream-checker.c", + "std-c-library-functions.c", + "string.c", + "svalbuilder-float-cast.c", + "svalbuilder-simplify-no-crash.c", + "symbol-reaper.c", + "transparent_union_bug.c", + "wstring.c", + "owned_err_c.c", + "owned_struct.c", + "trait_typedef.c", + "trait_typedef.c", + "modules-no-undeclared-includes.c", + "modules-pch-common-submodule.c", + "modules-pch-common-via-submodule.c", + "modules-pch-dangling.c", + "modules-pch.c", + "modules-symlink.c", + "bracket-decl.c", + "macros.c", + "member-access.c", + "pragma-macro-token-caching.c", + "stdin.c", + "tag.c", + "truncation.c", + "2002-07-14-MiscTests3.c", + "2002-07-31-SubregFailure.c", + "2002-10-12-TooManyArguments.c", + "2003-08-20-PrototypeMismatch.c", + "2005-01-02-ConstantInits.c", + "2005-01-02-VAArgError-ICE.c", + "2006-03-17-KnRMismatch.c", + "2007-01-06-KNR-Proto.c", + "2007-06-05-NoInlineAttribute.c", + "2008-05-19-AlwaysInline.c", + "2008-07-31-asm-labels.c", + "2009-05-22-callingconv.c", + "2009-06-14-anonymous-union-init.c", + "aix-constructor-attribute.c", + "aix-destructor-attribute.c", + "ppc64le-varargs-f128.c", + "riscv32-zbp.c", + "riscv64-zbp.c", + "wasm-export-name.c", + "bmi-builtins.c", + "ms-x86-intrinsics.c", + "pause.c", + "sse-builtins.c", + "sse2-builtins.c", + "x86_64-arguments.c", + "aarch64-mops.c", + "alloc-size.c", + "always_inline.c", + "annotations-global.c", + "annotations-var.c", + "arm-cmse-attr.c", + "arm-microsoft-intrinsics.c", + "arm64-microsoft-intrinsics.c", + "asm-goto.c", + "asm-label.c", + "asm.c", + "assume_attr.c", + "attr-btf_tag-disubprogram.c", + "attr-btf_type_tag-func.c", + "attr-btf_type_tag-var.c", + "attr-ifunc.c", + "attr-leaf.c", + "attr-naked.c", + "attr-nodebug.c", + "attribute_constructor.c", + "attributes.c", + "address-space-avr.c", + "blocks.c", + "builtin-redeclaration.c", + "call.c", + "callback_annotated.c", + "cast-emit.c", + "cfi-icall-cross-dso.c", + "cfi-icall.c", + "clang-sections-attribute.c", + "complex-libcalls.c", + "constructor-attribute.c", + "debug-info-scope.c", + "enable_if.c", + "exceptions-strictfp.c", + "exceptions.c", + "exprs.c", + "extend-arg-64.c", + "flip-dllimport.c", + "fold-const-declref.c", + "func-aligned.c", + "function-attributes.c", + "functions.c", + "implicit-arg.c", + "init-with-member-expr.c", + "init.c", + "inline-asm-immediate-ubsan.c", + "inline-asm-intel.c", + "instrument-functions.c", + "kr-func-promote.c", + "libcalls.c", + "mangle-ms.c", + "mangle-wasm-main-noproto.c", + "mangle.c", + "math-libcalls.c", + "memcpy-nobuiltin.c", + "microsoft-call-conv-x64.c", + "microsoft-call-conv.c", + "mozilla-ms-inline-asm.c", + "ms-barriers-intrinsics.c", + "ms-inline-asm-64.c", + "ms-intrinsics-cpuid.c", + "ms-intrinsics.c", + "ms-mm-align.c", + "ms-setjmp.c", + "overloadable-debug.c", + "overloadable.c", + "partial-reinitialization2.c", + "pass-object-size.c", + "patchable-function-entry.c", + "pr25786.c", + "pr9614.c", + "redefine_extname.c", + "stdcall-fastcall.c", + "stmtexpr-init.c", + "target-builtin-error-3.c", + "transparent-union-redecl.c", + "unique-internal-linkage-names-dwarf.c", + "variadic-null-win64.c", + "ve-abi.c", + "windows-seh-abnormal-exits.c", + "windows-seh-filter-inFinally.c", + "ast-printing.c", + "codegen.c", + "html-print.c", + "arc.c", + "arch-specific-libdir.c", + "ast.c", + "cc1-response-files.c", + "clang-translation.c", + "clang_f_opts.c", + "config-file3.c", + "crash-report-spaces.c", + "crash-report-with-asserts.c", + "darwin-debug-flags.c", + "darwin-dsymutil.c", + "darwin-verify-debug.c", + "debug-options.c", + "emit-reproducer.c", + "fsanitize.c", + "implicit-function-as-error.c", + "inhibit-downstream-commands.c", + "lto.c", + "myriad-toolchain.c", + "no-canonical-prefixes.c", + "no-integrated-as-win.c", + "output-file-cleanup.c", + "phases.c", + "program-path-priority.c", + "reloc-model.c", + "riscv-features.c", + "split-debug.c", + "stack-clash-protection.c", + "target-override.c", + "thinlto.c", + "thinlto_backend.c", + "unknown-arg.c", + "unknown-std.c", + "global_record.c", + "global_record_multifile.c", + "known_files_only.c", + "struct.c", + "fixit-eof-space.c", + "fixit-errors.c", + "ast-codegen.c", + "fixed_point_errors.c", + "ir-support.c", + "noderef.c", + "optimization-remark-new-pm.c", + "optimization-remark-with-hotness-new-pm.c", + "optimization-remark.c", + "print-header-includes.c", + "system-header-line-directive.c", + "verify.c", + "arm-cmse-header-ns.c", + "tgmath.c", + "create-libclang-completion-reproducer.c", + "create-libclang-parsing-reproducer.c", + "driver-test2.c", + "externstatic.c", + "block_cmt_end.c", + "conflict-marker.c", + "deprecate-macro.c", + "digraph.c", + "eof-conflict-marker.c", + "unicode.c", + "unsafe-macro.c", + "extensions.c", + "declare_mapper_messages.c", + "distribute_parallel_for_simd_misc_messages.c", + "distribute_simd_misc_messages.c", + "for_misc_messages.c", + "for_simd_misc_messages.c", + "master_taskloop_misc_messages.c", + "master_taskloop_simd_misc_messages.c", + "parallel_for_misc_messages.c", + "parallel_for_simd_misc_messages.c", + "parallel_master_taskloop_misc_messages.c", + "parallel_master_taskloop_simd_misc_messages.c", + "parallel_sections_misc_messages.c", + "sections_misc_messages.c", + "simd_misc_messages.c", + "single_misc_messages.c", + "target_parallel_for_misc_messages.c", + "target_parallel_for_simd_misc_messages.c", + "target_simd_misc_messages.c", + "target_teams_distribute_misc_messages.c", + "target_teams_distribute_parallel_for_misc_messages.c", + "target_teams_distribute_parallel_for_simd_misc_messages.c", + "target_teams_distribute_simd_misc_messages.c", + "taskloop_misc_messages.c", + "taskloop_simd_misc_messages.c", + "__va_list_tag-typedef.c", + "__va_list_tag.c", + "asm.c", + "chain-decls.c", + "chain-macro-override.c", + "cmdline-include.c", + "modified-header-error.c", + "pch-dir.c", + "pragma-weak-functional.c", + "pragma-weak.c", + "reloc.c", + "types.c", + "altivec-csk-bool.c", + "altivec.c", + "asm-goto.c", + "c2x-attributes.c", + "diag-crash.c", + "pragma-fenv_access.c", + "elifdef.c", + "if_warning.c", + "ifdef-recover.c", + "init-csky.c", + "init-mips.c", + "init-ppc.c", + "init-x86.c", + "init.c", + "macro_misc.c", + "macro_paste_msextensions.c", + "pragma-missing-string-token.c", + "pragma_module.c", + "suggest-typoed-directive.c", + "c-avoid-direct-call.c", + "c-linkage.c", + "__try.c", + "aarch64-tme-errors.c", + "address_spaces.c", + "alias-redefinition.c", + "alloc-size.c", + "annotate-type.c", + "arm-asm.c", + "arm-cmse.c", + "arm64-inline-asm.c", + "array-bounds-ptr-arith.c", + "array-parameter.c", + "asm-label.c", + "attr-alias-elf.c", + "attr-assume.c", + "attr-availability-ios.c", + "attr-availability-maccatalyst.c", + "attr-availability-square-brackets.c", + "attr-availability-tvos.c", + "attr-availability-watchos.c", + "attr-availability.c", + "attr-coldhot.c", + "attr-cpuspecific.c", + "attr-decl-after-definition.c", + "attr-deprecated.c", + "attr-disable-tail-calls.c", + "attr-enforce-tcb.c", + "attr-error.c", + "attr-likelihood.c", + "attr-malloc.c", + "attr-musttail.c", + "attr-ownership.c", + "attr-regparm.c", + "attr-section.c", + "attr-swiftcall.c", + "attr-target-mv.c", + "attr-type-safety.c", + "attr-unavailable-message.c", + "attr-wasm.c", + "bittest-intrinsics.c", + "block-args.c", + "block-call.c", + "block-literal.c", + "block-misc.c", + "block-return.c", + "builtin-align.c", + "builtin-cpu-supports.c", + "builtin-dump-struct.c", + "builtin-object-size.c", + "builtin-setjmp.c", + "builtins-aarch64.c", + "builtins-arm-exclusive.c", + "builtins-arm64-exclusive.c", + "builtins-arm64.c", + "builtins-microsoft-arm64.c", + "builtins-x86_64.c", + "builtins.c", + "crash-invalid-builtin.c", + "cxx-as-c.c", + "darwin-tls.c", + "decl-microsoft-call-conv.c", + "diagnose_if.c", + "empty1.c", + "enable_if.c", + "exprs.c", + "extern-redecl.c", + "fn-ptr-as-fn-prototype.c", + "format-strings.c", + "format-type-confusion.c", + "fp16-sema.c", + "function-redecl.c", + "function.c", + "implicit-builtin-decl.c", + "implicit-builtin-redecl.c", + "implicit-decl.c", + "implicit-ms-builtin-decl.c", + "incomplete-call.c", + "inline-asm-validate-riscv.c", + "internal_linkage.c", + "invalid-decl.c", + "invalid-struct-init.c", + "knr-def-call.c", + "logical-op-parentheses.c", + "member-reference.c", + "memset-invalid.c", + "merge-decls.c", + "non-null-warning.c", + "overload-arm-mve.c", + "overloadable.c", + "pr9812.c", + "pragma-weak.c", + "predefined-function.c", + "prototype-redecls.c", + "redefinition.c", + "return.c", + "sentinel-attribute.c", + "shift.c", + "static-array.c", + "stdcall-fastcall.c", + "switch.c", + "transparent-union.c", + "type-spec-struct-union.c", + "typo-correction.c", + "uninit-variables.c", + "unused-expr.c", + "varargs.c", + "vector-gcc-compat.c", + "vfprintf-invalid-redecl.c", + "vla.c", + "warn-absolute-value-header.c", + "warn-bad-function-cast.c", + "warn-deprecated-non-prototype.c", + "warn-missing-prototypes.c", + "warn-strict-prototypes.c", + "warn-string-conversion.c", + "warn-strncat-size.c", + "warn-tautological-compare.c", + "warn-unreachable.c", + "warn-unused-function.c", + "absolute-paths-symlinks.c", + "diag-macro-backtrace.c", + "openmp_seh.c", + "typeof.c", + "init-aarch64.c", + "nonnull.c", + "relative-path-errors.c", +] diff --git a/llvm/utils/lit/lit/formats/base.py b/llvm/utils/lit/lit/formats/base.py old mode 100644 new mode 100755 index b44a606e76a8..437a6f60c961 --- a/llvm/utils/lit/lit/formats/base.py +++ b/llvm/utils/lit/lit/formats/base.py @@ -3,6 +3,7 @@ import os import lit.Test import lit.util +from lit.formats.BSCBlocklist import bsc_failed_cases class TestFormat(object): pass @@ -21,6 +22,9 @@ class FileBasedTest(TestFormat): filepath = os.path.join(source_path, filename) if not os.path.isdir(filepath): + if litConfig.useBSC: + if filename[-2:] != ".c" or filename in bsc_failed_cases: + continue base,ext = os.path.splitext(filename) if ext in localConfig.suffixes: yield lit.Test.Test(testSuite, path_in_suite + (filename,), diff --git a/llvm/utils/lit/lit/llvm/config.py b/llvm/utils/lit/lit/llvm/config.py old mode 100644 new mode 100755 index 7dae83733f31..5156258eea9c --- a/llvm/utils/lit/lit/llvm/config.py +++ b/llvm/utils/lit/lit/llvm/config.py @@ -523,14 +523,15 @@ class LLVMConfig(object): self.config.available_features.add('clang') builtin_include_dir = self.get_clang_builtin_include_dir( self.config.clang) + bsc_args = ['-x', 'bsc'] if self.lit_config.useBSC else [] tool_substitutions = [ ToolSubst('%clang', command=self.config.clang, - extra_args=additional_flags), + extra_args=bsc_args+additional_flags), ToolSubst('%clang_analyze_cc1', command='%clang_cc1', extra_args=['-analyze', '%analyze', '-setup-static-analyzer']+additional_flags), ToolSubst('%clang_cc1', command=self.config.clang, - extra_args=['-cc1', '-internal-isystem', + extra_args=['-cc1']+bsc_args+['-internal-isystem', builtin_include_dir, '-nostdsysteminc'] + additional_flags), ToolSubst('%clang_cpp', command=self.config.clang, diff --git a/llvm/utils/lit/lit/main.py b/llvm/utils/lit/lit/main.py index 27bcef1b1d46..7865cab5d6fe 100755 --- a/llvm/utils/lit/lit/main.py +++ b/llvm/utils/lit/lit/main.py @@ -32,6 +32,7 @@ def main(builtin_params={}): path=opts.path, quiet=opts.quiet, useValgrind=opts.useValgrind, + useBSC=opts.useBSC, valgrindLeakCheck=opts.valgrindLeakCheck, valgrindArgs=opts.valgrindArgs, noExecute=opts.noExecute, @@ -98,6 +99,8 @@ def main(builtin_params={}): selected_tests = selected_tests[:opts.max_tests] + selected_tests = mark_bscexcluded(lit_config.useBSC, selected_tests) + mark_xfail(discovered_tests, opts) mark_excluded(discovered_tests, selected_tests) @@ -213,6 +216,11 @@ def mark_excluded(discovered_tests, selected_tests): for t in excluded_tests: t.setResult(result) +def mark_bscexcluded(useBSC, selected_tests): + res_list = selected_tests + if useBSC: + res_list = [i for i in selected_tests if "Clang-Unit :: " not in i.getFullName()] + return res_list def run_tests(tests, lit_config, opts, discovered_tests): workers = min(len(tests), opts.workers) -- Gitee From 930998270eb0ae063c6279a3dee6b6287f076e0d Mon Sep 17 00:00:00 2001 From: zzy Date: Fri, 27 Oct 2023 06:33:18 +0000 Subject: [PATCH 3/4] [BSC] update the location of some macros and support ENABLE_BSC=0 * [BSC] support compiling with -DENABLE_BSC=0 to get native clang * [BSC] update the location of some macros and BSC code --- clang/CMakeLists.txt | 18 +++- clang/include/clang/AST/ASTContext.h | 2 + clang/include/clang/AST/ASTDumper.h | 4 +- clang/include/clang/AST/ASTMutationListener.h | 2 +- .../clang/AST/BSC/BSCTypeProperties.td | 41 +++++++ clang/include/clang/AST/BSC/DeclBSC.h | 2 +- clang/include/clang/AST/BuiltinTypes.def | 2 +- clang/include/clang/AST/CMakeLists.txt | 10 +- clang/include/clang/AST/Decl.h | 2 +- clang/include/clang/AST/DeclCXX.h | 4 +- clang/include/clang/AST/PrettyPrinter.h | 4 +- clang/include/clang/AST/RecursiveASTVisitor.h | 4 +- clang/include/clang/AST/Stmt.h | 4 + clang/include/clang/AST/Type.h | 10 +- clang/include/clang/AST/TypeLoc.h | 2 +- clang/include/clang/AST/TypeProperties.td | 51 ++------- clang/include/clang/ASTMatchers/ASTMatchers.h | 2 +- clang/include/clang/Basic/BSC/BSCDeclNodes.td | 6 +- clang/include/clang/Basic/BSC/BSCTypeNodes.td | 2 + clang/include/clang/Basic/CMakeLists.txt | 6 +- clang/include/clang/Basic/DeclNodes.td | 7 +- .../clang/Basic/DiagnosticParseKinds.td | 2 + .../clang/Basic/DiagnosticSemaKinds.td | 2 + clang/include/clang/Basic/LangStandard.h | 2 +- clang/include/clang/Basic/Specifiers.h | 4 + clang/include/clang/Basic/StmtNodes.td | 4 +- clang/include/clang/Basic/TokenKinds.def | 6 +- clang/include/clang/Basic/TypeNodes.td | 7 +- clang/include/clang/Driver/BSC/BSCOptions.td | 4 + clang/include/clang/Driver/CMakeLists.txt | 2 +- clang/include/clang/Driver/Options.td | 9 +- .../include/clang/Frontend/FrontendOptions.h | 2 +- clang/include/clang/Parse/Parser.h | 8 +- .../clang/Rewrite/Frontend/ASTConsumers.h | 2 +- clang/include/clang/Sema/DeclSpec.h | 10 +- clang/include/clang/Sema/Sema.h | 26 ++++- clang/include/clang/Sema/TypoCorrection.h | 2 +- .../include/clang/Serialization/ASTBitCodes.h | 12 +-- clang/lib/AST/ASTContext.cpp | 8 +- clang/lib/AST/Decl.cpp | 11 +- clang/lib/AST/DeclBase.cpp | 2 +- clang/lib/AST/DeclCXX.cpp | 101 ++++++++++++++++++ clang/lib/AST/DeclPrinter.cpp | 8 +- clang/lib/AST/DeclTemplate.cpp | 2 +- clang/lib/AST/Expr.cpp | 6 +- clang/lib/AST/Mangle.cpp | 2 +- clang/lib/AST/RecordLayoutBuilder.cpp | 4 +- clang/lib/AST/Stmt.cpp | 4 +- clang/lib/AST/StmtPrinter.cpp | 4 +- clang/lib/AST/TypePrinter.cpp | 4 +- clang/lib/Driver/Driver.cpp | 2 + clang/lib/Driver/Types.cpp | 2 - clang/lib/Parse/ParseDecl.cpp | 18 +++- clang/lib/Parse/ParseDeclCXX.cpp | 9 +- clang/lib/Parse/ParseExprCXX.cpp | 22 ++-- clang/lib/Parse/ParseStmt.cpp | 4 +- clang/lib/Parse/ParseTemplate.cpp | 10 +- clang/lib/Parse/ParseTentative.cpp | 2 +- clang/lib/Parse/Parser.cpp | 6 +- clang/lib/Sema/SemaCXXScopeSpec.cpp | 4 +- clang/lib/Sema/SemaCast.cpp | 4 +- clang/lib/Sema/SemaDecl.cpp | 18 ++-- clang/lib/Sema/SemaDeclAttr.cpp | 6 +- clang/lib/Sema/SemaExpr.cpp | 20 ++-- clang/lib/Sema/SemaExprMember.cpp | 4 +- clang/lib/Sema/SemaOverload.cpp | 6 +- clang/lib/Sema/SemaTemplateInstantiate.cpp | 4 +- .../lib/Sema/SemaTemplateInstantiateDecl.cpp | 2 +- clang/lib/Sema/SemaType.cpp | 4 +- clang/lib/Sema/TreeTransform.h | 6 +- clang/lib/Serialization/ASTWriter.cpp | 2 +- clang/lib/Serialization/ASTWriterDecl.cpp | 6 +- 72 files changed, 388 insertions(+), 218 deletions(-) create mode 100644 clang/include/clang/AST/BSC/BSCTypeProperties.td create mode 100644 clang/include/clang/Basic/BSC/BSCTypeNodes.td create mode 100644 clang/include/clang/Driver/BSC/BSCOptions.td diff --git a/clang/CMakeLists.txt b/clang/CMakeLists.txt index a5ca6f69179c..ec2c836461d5 100644 --- a/clang/CMakeLists.txt +++ b/clang/CMakeLists.txt @@ -418,9 +418,21 @@ if (LLVM_COMPILER_IS_GCC_COMPATIBLE) endif() endif () -# We are building BSC version of clang -# Put -DENABLE_BSC=0 if you would like to remove BSC support -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DENABLE_BSC=1") +# Determine whether to build BSC version of clang +if(NOT DEFINED ENABLE_BSC) + set(ENABLE_BSC 1) +endif() + +if (ENABLE_BSC) + message("BSC is enabled") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DENABLE_BSC=1") + set(BSC_OPTION "-DBSC") +else() + message("BSC is disabled") + set(BSC_OPTION "") +endif() + +unset(ENABLE_BSC CACHE) # Determine HOST_LINK_VERSION on Darwin. set(HOST_LINK_VERSION) diff --git a/clang/include/clang/AST/ASTContext.h b/clang/include/clang/AST/ASTContext.h index cdf0c65d01a3..f05795a76f64 100644 --- a/clang/include/clang/AST/ASTContext.h +++ b/clang/include/clang/AST/ASTContext.h @@ -1620,6 +1620,8 @@ public: QualType getInjectedClassNameType(RecordDecl *Decl, QualType TST) const; QualType getInjectedTraitNameType(TraitDecl *Decl, QualType TST) const; + #else + QualType getInjectedClassNameType(CXXRecordDecl *Decl, QualType TST) const; #endif QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, diff --git a/clang/include/clang/AST/ASTDumper.h b/clang/include/clang/AST/ASTDumper.h index 3eef5ba450e4..18994b8dd00a 100644 --- a/clang/include/clang/AST/ASTDumper.h +++ b/clang/include/clang/AST/ASTDumper.h @@ -42,11 +42,9 @@ public: void VisitFunctionTemplateDecl(const FunctionTemplateDecl *D); void VisitClassTemplateDecl(const ClassTemplateDecl *D); - #if ENABLE_BSC - void VisitTraitTemplateDecl(const TraitTemplateDecl *D); - #endif void VisitVarTemplateDecl(const VarTemplateDecl *D); #if ENABLE_BSC + void VisitTraitTemplateDecl(const TraitTemplateDecl *D); void VisitCompoundStmt(const CompoundStmt *Node); #endif }; diff --git a/clang/include/clang/AST/ASTMutationListener.h b/clang/include/clang/AST/ASTMutationListener.h index 5dbe28190bcd..06aef2ef63c6 100644 --- a/clang/include/clang/AST/ASTMutationListener.h +++ b/clang/include/clang/AST/ASTMutationListener.h @@ -65,9 +65,9 @@ public: virtual void AddedCXXTemplateSpecialization(const ClassTemplateDecl *TD, const ClassTemplateSpecializationDecl *D) {} + #if ENABLE_BSC /// A template specialization (or partial one) was added to the /// template declaration. - #if ENABLE_BSC virtual void AddedCXXTemplateSpecialization(const TraitTemplateDecl *TD, const TraitTemplateSpecializationDecl *D) {} diff --git a/clang/include/clang/AST/BSC/BSCTypeProperties.td b/clang/include/clang/AST/BSC/BSCTypeProperties.td new file mode 100644 index 000000000000..b44a4a993dc2 --- /dev/null +++ b/clang/include/clang/AST/BSC/BSCTypeProperties.td @@ -0,0 +1,41 @@ +let Class = TraitType in { + def : Creator<[{ + auto trait = cast(declaration); + QualType result = ctx.getTraitType(trait); + if (dependent) + const_cast(result.getTypePtr()) + ->addDependence(TypeDependence::DependentInstantiation); + return result; + }]>; +} + +let Class = InjectedTraitNameType in { + def : Property<"declaration", DeclRef> { + // FIXME: drilling down to the canonical declaration is what the + // existing serialization code was doing, but it's not clear why. + let Read = [{ node->getDecl()->getCanonicalDecl() }]; + } + def : Property<"injectedSpecializationType", QualType> { + let Read = [{ node->getInjectedSpecializationType() }]; + } + + def : Creator<[{ + // FIXME: ASTContext::getInjectedTraitNameType is not currently suitable + // for AST reading, too much interdependencies. + const Type *T = nullptr; + auto typeDecl = cast(declaration); + for (auto *DI = typeDecl; DI; DI = DI->getPreviousDecl()) { + if (const Type *existing = DI->getTypeForDecl()) { + T = existing; + break; + } + } + if (!T) { + T = new (ctx, TypeAlignment) + InjectedTraitNameType(typeDecl, injectedSpecializationType); + for (auto *DI = typeDecl; DI; DI = DI->getPreviousDecl()) + DI->setTypeForDecl(T); + } + return QualType(T, 0); + }]>; +} \ No newline at end of file diff --git a/clang/include/clang/AST/BSC/DeclBSC.h b/clang/include/clang/AST/BSC/DeclBSC.h index a3c55b1ba824..e47e01713583 100644 --- a/clang/include/clang/AST/BSC/DeclBSC.h +++ b/clang/include/clang/AST/BSC/DeclBSC.h @@ -14,7 +14,7 @@ #ifndef LLVM_CLANG_AST_DECLBSC_H #define LLVM_CLANG_AST_DECLBSC_H -# if ENABLE_BSC +#if ENABLE_BSC #include "clang/AST/Decl.h" #include "clang/AST/DeclBase.h" diff --git a/clang/include/clang/AST/BuiltinTypes.def b/clang/include/clang/AST/BuiltinTypes.def index 251cee374314..a6ce927a070c 100644 --- a/clang/include/clang/AST/BuiltinTypes.def +++ b/clang/include/clang/AST/BuiltinTypes.def @@ -57,8 +57,8 @@ // void BUILTIN_TYPE(Void, VoidTy) -// This #if ENABLE_BSC +// This BUILTIN_TYPE(This, ThisTy) #endif diff --git a/clang/include/clang/AST/CMakeLists.txt b/clang/include/clang/AST/CMakeLists.txt index 3a6fddb02914..6239a6451cfe 100644 --- a/clang/include/clang/AST/CMakeLists.txt +++ b/clang/include/clang/AST/CMakeLists.txt @@ -18,15 +18,15 @@ clang_tablegen(AttrVisitor.inc -gen-clang-attr-ast-visitor SOURCE ../Basic/Attr.td TARGET ClangAttrVisitor) -clang_tablegen(StmtNodes.inc -gen-clang-stmt-nodes +clang_tablegen(StmtNodes.inc -gen-clang-stmt-nodes ${BSC_OPTION} SOURCE ../Basic/StmtNodes.td TARGET ClangStmtNodes) -clang_tablegen(DeclNodes.inc -gen-clang-decl-nodes +clang_tablegen(DeclNodes.inc -gen-clang-decl-nodes ${BSC_OPTION} SOURCE ../Basic/DeclNodes.td TARGET ClangDeclNodes) -clang_tablegen(TypeNodes.inc -gen-clang-type-nodes +clang_tablegen(TypeNodes.inc -gen-clang-type-nodes ${BSC_OPTION} SOURCE ../Basic/TypeNodes.td TARGET ClangTypeNodes) @@ -38,11 +38,11 @@ clang_tablegen(AbstractBasicWriter.inc -gen-clang-basic-writer SOURCE PropertiesBase.td TARGET ClangAbstractBasicWriter) -clang_tablegen(AbstractTypeReader.inc -gen-clang-type-reader +clang_tablegen(AbstractTypeReader.inc -gen-clang-type-reader ${BSC_OPTION} SOURCE TypeProperties.td TARGET ClangAbstractTypeReader) -clang_tablegen(AbstractTypeWriter.inc -gen-clang-type-writer +clang_tablegen(AbstractTypeWriter.inc -gen-clang-type-writer ${BSC_OPTION} SOURCE TypeProperties.td TARGET ClangAbstractTypeWriter) diff --git a/clang/include/clang/AST/Decl.h b/clang/include/clang/AST/Decl.h index 600c5c0cab06..65860f499565 100644 --- a/clang/include/clang/AST/Decl.h +++ b/clang/include/clang/AST/Decl.h @@ -3994,6 +3994,7 @@ public: APK_CanNeverPassInRegs }; + #if ENABLE_BSC /// The template or declaration that this declaration /// describes or was instantiated from, respectively. /// @@ -4003,7 +4004,6 @@ public: /// classes of class template specializations, this will be the /// MemberSpecializationInfo referring to the member class that was /// instantiated or specialized. - #if ENABLE_BSC llvm::PointerUnion TemplateOrInstantiation; #endif diff --git a/clang/include/clang/AST/DeclCXX.h b/clang/include/clang/AST/DeclCXX.h index 2c75d1fcf088..30e6be2fc566 100644 --- a/clang/include/clang/AST/DeclCXX.h +++ b/clang/include/clang/AST/DeclCXX.h @@ -451,6 +451,7 @@ private: return static_cast(*DD); } + #if !ENABLE_BSC /// The template or declaration that this declaration /// describes or was instantiated from, respectively. /// @@ -460,7 +461,6 @@ private: /// classes of class template specializations, this will be the /// MemberSpecializationInfo referring to the member class that was /// instantiated or specialized. - #if !ENABLE_BSC llvm::PointerUnion TemplateOrInstantiation; #endif @@ -1509,9 +1509,9 @@ public: /// destructors are marked noreturn. bool isAnyDestructorNoReturn() const { return data().IsAnyDestructorNoReturn; } + #if !ENABLE_BSC /// If the class is a local class [class.local], returns /// the enclosing function declaration. - #if !ENABLE_BSC const FunctionDecl *isLocalClass() const { if (const auto *RD = dyn_cast(getDeclContext())) return RD->isLocalClass(); diff --git a/clang/include/clang/AST/PrettyPrinter.h b/clang/include/clang/AST/PrettyPrinter.h index 8af68348adc2..14d2a2189da2 100644 --- a/clang/include/clang/AST/PrettyPrinter.h +++ b/clang/include/clang/AST/PrettyPrinter.h @@ -92,8 +92,8 @@ struct PrintingPolicy { UseVoidForZeroParams = false; } - /// Adjust this printing policy for rewriting BSC code to C doe. #if ENABLE_BSC + /// Adjust this printing policy for rewriting BSC code to C doe. void adjustForRewritingBSC() { Bool = false; RewriteBSC = true; @@ -316,8 +316,8 @@ struct PrintingPolicy { /// enumerator name or via cast of an integer. unsigned UseEnumerators : 1; - /// Whether rewriting BSC source code to C source code. #if ENABLE_BSC + /// Whether rewriting BSC source code to C source code. unsigned RewriteBSC : 1; /// Whether printing function declaration only while rewriting BSC source diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h index 81d4f66cefcf..42a90e475791 100644 --- a/clang/include/clang/AST/RecursiveASTVisitor.h +++ b/clang/include/clang/AST/RecursiveASTVisitor.h @@ -506,15 +506,13 @@ private: bool TraverseRecordHelper(RecordDecl *D); #if ENABLE_BSC bool TraverseTraitHelper(TraitDecl *D); + bool TraverseImplTraitHelper(ImplTraitDecl *D); #endif bool TraverseCXXRecordHelper(CXXRecordDecl *D); bool TraverseDeclaratorHelper(DeclaratorDecl *D); bool TraverseDeclContextHelper(DeclContext *DC); bool TraverseFunctionHelper(FunctionDecl *D); bool TraverseVarHelper(VarDecl *D); - #if ENABLE_BSC - bool TraverseImplTraitHelper(ImplTraitDecl *D); - #endif bool TraverseOMPExecutableDirective(OMPExecutableDirective *S); bool TraverseOMPLoopDirective(OMPLoopDirective *S); bool TraverseOMPClause(OMPClause *C); diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h index f95d3a626918..f828c650df7b 100644 --- a/clang/include/clang/AST/Stmt.h +++ b/clang/include/clang/AST/Stmt.h @@ -1431,6 +1431,10 @@ class CompoundStmt final SafeScopeSpecifier SafeSpec = SS_None, SourceLocation SafeLoc = SourceLocation()); explicit CompoundStmt(EmptyShell Empty) : Stmt(CompoundStmtClass, Empty), SafeSpec(SS_None), SafeLoc() {} + #else + CompoundStmt(ArrayRef Stmts, FPOptionsOverride FPFeatures, + SourceLocation LB, SourceLocation RB); + explicit CompoundStmt(EmptyShell Empty) : Stmt(CompoundStmtClass, Empty) {} #endif void setStmts(ArrayRef Stmts); diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index 6743c198ebac..f68295327567 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -864,10 +864,10 @@ public: /// Determine whether this type is const-qualified. bool isConstQualified() const; + #if ENABLE_BSC /// Determine whether this particular QualType instance has the /// "owned" qualifier set, without looking through typedefs that may have /// added "owned" at a different level. - #if ENABLE_BSC bool isLocalOwnedQualified() const { return (getLocalFastQualifiers() & Qualifiers::Owned); } @@ -2301,8 +2301,8 @@ public: /// Check if the type is the CUDA device builtin texture type. bool isCUDADeviceBuiltinTextureType() const; - /// Check if the type is the BSC future type. #if ENABLE_BSC + /// Check if the type is the BSC future type. bool isBSCFutureType() const; #endif @@ -4315,8 +4315,8 @@ public: /// spec. bool hasInstantiationDependentExceptionSpec() const; - // return true if any 'owned' here #if ENABLE_BSC + // return true if any 'owned' here bool hasOwnedRetOrParams() const; #endif @@ -5665,8 +5665,8 @@ enum TagTypeKind { /// The "enum" keyword. TTK_Enum - /// The "trait" keyword. #if ENABLE_BSC + /// The "trait" keyword. , TTK_Trait #endif }; @@ -5689,8 +5689,8 @@ enum ElaboratedTypeKeyword { /// The "enum" keyword introduces the elaborated-type-specifier. ETK_Enum, - /// The "trait" keyword introduces the elaborated-type-specifier. #if ENABLE_BSC + /// The "trait" keyword introduces the elaborated-type-specifier. ETK_Trait, #endif diff --git a/clang/include/clang/AST/TypeLoc.h b/clang/include/clang/AST/TypeLoc.h index f8c03796fff1..f0e9822ba60d 100644 --- a/clang/include/clang/AST/TypeLoc.h +++ b/clang/include/clang/AST/TypeLoc.h @@ -701,9 +701,9 @@ public: #endif }; +#if ENABLE_BSC /// Wrapper for source info for injected trait names of trait /// templates. -#if ENABLE_BSC class InjectedTraitNameTypeLoc : public InheritingConcreteTypeLoc< TypeSpecTypeLoc, InjectedTraitNameTypeLoc, InjectedTraitNameType> { diff --git a/clang/include/clang/AST/TypeProperties.td b/clang/include/clang/AST/TypeProperties.td index df01283476d7..99cecebb19d2 100644 --- a/clang/include/clang/AST/TypeProperties.td +++ b/clang/include/clang/AST/TypeProperties.td @@ -528,17 +528,6 @@ let Class = RecordType in { }]>; } -let Class = TraitType in { - def : Creator<[{ - auto trait = cast(declaration); - QualType result = ctx.getTraitType(trait); - if (dependent) - const_cast(result.getTypePtr()) - ->addDependence(TypeDependence::DependentInstantiation); - return result; - }]>; -} - let Class = ElaboratedType in { def : Property<"keyword", ElaboratedTypeKeyword> { let Read = [{ node->getKeyword() }]; @@ -574,7 +563,11 @@ let Class = InjectedClassNameType in { // FIXME: ASTContext::getInjectedClassNameType is not currently suitable // for AST reading, too much interdependencies. const Type *T = nullptr; + #if ENABLE_BSC auto typeDecl = cast(declaration); + #else + auto typeDecl = cast(declaration); + #endif for (auto *DI = typeDecl; DI; DI = DI->getPreviousDecl()) { if (const Type *existing = DI->getTypeForDecl()) { T = existing; @@ -591,37 +584,6 @@ let Class = InjectedClassNameType in { }]>; } -let Class = InjectedTraitNameType in { - def : Property<"declaration", DeclRef> { - // FIXME: drilling down to the canonical declaration is what the - // existing serialization code was doing, but it's not clear why. - let Read = [{ node->getDecl()->getCanonicalDecl() }]; - } - def : Property<"injectedSpecializationType", QualType> { - let Read = [{ node->getInjectedSpecializationType() }]; - } - - def : Creator<[{ - // FIXME: ASTContext::getInjectedTraitNameType is not currently suitable - // for AST reading, too much interdependencies. - const Type *T = nullptr; - auto typeDecl = cast(declaration); - for (auto *DI = typeDecl; DI; DI = DI->getPreviousDecl()) { - if (const Type *existing = DI->getTypeForDecl()) { - T = existing; - break; - } - } - if (!T) { - T = new (ctx, TypeAlignment) - InjectedTraitNameType(typeDecl, injectedSpecializationType); - for (auto *DI = typeDecl; DI; DI = DI->getPreviousDecl()) - DI->setTypeForDecl(T); - } - return QualType(T, 0); - }]>; -} - let Class = ParenType in { def : Property<"innerType", QualType> { let Read = [{ node->getInnerType() }]; @@ -974,3 +936,8 @@ let Class = DependentBitIntType in { return ctx.getDependentBitIntType(isUnsigned, numBitsExpr); }]>; } + +// BSC Extensions. +#ifdef BSC +include "clang/AST/BSC/BSCTypeProperties.td" +#endif diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h index db618f9defb8..1727a3639710 100644 --- a/clang/include/clang/ASTMatchers/ASTMatchers.h +++ b/clang/include/clang/ASTMatchers/ASTMatchers.h @@ -7748,6 +7748,7 @@ AST_MATCHER_P(FunctionDecl, hasExplicitSpecifier, internal::Matcher, return InnerMatcher.matches(*ES.getExpr(), Finder, Builder); } +#if ENABLE_BSC /// Matches function that are marked with the async keyword. /// /// Given @@ -7755,7 +7756,6 @@ AST_MATCHER_P(FunctionDecl, hasExplicitSpecifier, internal::Matcher, /// async void g(); /// \endcode /// functionDecl(isAsyncSpecified()) will match ::g(). -#if ENABLE_BSC AST_MATCHER(FunctionDecl, isAsyncSpecified) { return (dyn_cast(&Node))->isAsyncSpecified(); } diff --git a/clang/include/clang/Basic/BSC/BSCDeclNodes.td b/clang/include/clang/Basic/BSC/BSCDeclNodes.td index 2d9041ccd6bf..5d71f54cc335 100644 --- a/clang/include/clang/Basic/BSC/BSCDeclNodes.td +++ b/clang/include/clang/Basic/BSC/BSCDeclNodes.td @@ -1 +1,5 @@ -def BSCMethod : DeclNode; \ No newline at end of file +def Trait : DeclNode; + def TraitTemplateSpecialization : DeclNode; +def BSCMethod : DeclNode; +def ImplTrait : DeclNode; +def TraitTemplate : DeclNode; \ No newline at end of file diff --git a/clang/include/clang/Basic/BSC/BSCTypeNodes.td b/clang/include/clang/Basic/BSC/BSCTypeNodes.td new file mode 100644 index 000000000000..d43f1875c539 --- /dev/null +++ b/clang/include/clang/Basic/BSC/BSCTypeNodes.td @@ -0,0 +1,2 @@ +def TraitType : TypeNode, LeafType; +def InjectedTraitNameType : TypeNode, AlwaysDependent, LeafType; \ No newline at end of file diff --git a/clang/include/clang/Basic/CMakeLists.txt b/clang/include/clang/Basic/CMakeLists.txt index b930842ae8cf..63c29466f9c0 100644 --- a/clang/include/clang/Basic/CMakeLists.txt +++ b/clang/include/clang/Basic/CMakeLists.txt @@ -1,6 +1,6 @@ macro(clang_diag_gen component) clang_tablegen(Diagnostic${component}Kinds.inc - -gen-clang-diags-defs -clang-component=${component} + -gen-clang-diags-defs -clang-component=${component} ${BSC_OPTION} SOURCE Diagnostic.td TARGET ClangDiagnostic${component}) endmacro(clang_diag_gen) @@ -17,11 +17,11 @@ clang_diag_gen(Parse) clang_diag_gen(Refactoring) clang_diag_gen(Sema) clang_diag_gen(Serialization) -clang_tablegen(DiagnosticGroups.inc -gen-clang-diag-groups +clang_tablegen(DiagnosticGroups.inc -gen-clang-diag-groups ${BSC_OPTION} SOURCE Diagnostic.td TARGET ClangDiagnosticGroups) -clang_tablegen(DiagnosticIndexName.inc -gen-clang-diags-index-name +clang_tablegen(DiagnosticIndexName.inc -gen-clang-diags-index-name ${BSC_OPTION} SOURCE Diagnostic.td TARGET ClangDiagnosticIndexName) diff --git a/clang/include/clang/Basic/DeclNodes.td b/clang/include/clang/Basic/DeclNodes.td index 4c4f948f7816..cc11a3fe5714 100644 --- a/clang/include/clang/Basic/DeclNodes.td +++ b/clang/include/clang/Basic/DeclNodes.td @@ -32,8 +32,6 @@ def Named : DeclNode; def ClassTemplateSpecialization : DeclNode; def ClassTemplatePartialSpecialization : DeclNode; - def Trait : DeclNode; - def TraitTemplateSpecialization : DeclNode; def TemplateTypeParm : DeclNode; def Value : DeclNode; def EnumConstant : DeclNode; @@ -52,7 +50,6 @@ def Named : DeclNode; def MSProperty : DeclNode; def Function : DeclNode, DeclContext; def CXXDeductionGuide : DeclNode; - // def BSCMethod : DeclNode; def CXXMethod : DeclNode; def CXXConstructor : DeclNode; def CXXDestructor : DeclNode; @@ -65,13 +62,11 @@ def Named : DeclNode; def ParmVar : DeclNode; def Decomposition : DeclNode; def OMPCapturedExpr : DeclNode; - def ImplTrait : DeclNode; def NonTypeTemplateParm : DeclNode; def Template : DeclNode; def RedeclarableTemplate : DeclNode; def FunctionTemplate : DeclNode; def ClassTemplate : DeclNode; - def TraitTemplate : DeclNode; def VarTemplate : DeclNode; def TypeAliasTemplate : DeclNode; def TemplateTemplateParm : DeclNode