From 084eca6a6fb66b26e4da3affbd577de9f733ae2b Mon Sep 17 00:00:00 2001 From: huangbowen <1374839799@qq.com> Date: Thu, 26 Jun 2025 20:56:21 +0800 Subject: [PATCH] [source2source] Fix inconsistent struct definition order in codegen across devices Previously, the topological sorting for struct definitions in the rewrite-bsc pipeline led to inconsistent output order across different devices and runs. This was caused by the use of unordered traversal (e.g., set or DFS stack) when selecting nodes with zero in-degree during sorting. This patch replaces the unordered traversal with a priority queue that orders nodes by their original source appearance order. This ensures that the generated C code remains topologically correct while preserving as much of the source definition order as possible. Additionally: - Updated affected test cases to reflect deterministic ordering - Added a new test case to verify the ordering stability This improves consistency and reproducibility of the generated C output. --- clang/lib/Frontend/Rewrite/RewriteBSC.cpp | 26 +++- .../rewrite_bsc_generic_12.cbs | 8 +- .../rewrite_bsc_generic_15.cbs | 13 +- .../rewrite_bsc_generic_7.cbs | 6 +- .../rewrite_bsc_generic_8.cbs | 8 +- ...rewrite_bsc_generic_struct_with_header.cbs | 12 +- .../rewrite_bsc_generic_with_header_2.cbs | 8 +- .../rewrite_bsc_generic_with_header_3.cbs | 12 +- .../rewrite_bsc_owned3/rewrite_bsc_owned3.cbs | 8 +- .../rewrite_bsc_type_dependency_3.cbs | 17 +-- .../rewrite_bsc_type_dependency_4.cbs | 4 +- .../rewrite_bsc_typedef.cbs | 8 +- .../rewrite_nest_stru_def_ord/test1.cbs | 129 ++++++++++++++++++ .../generic_trait_param.cbs | 9 +- .../OperatorOverload/Subscript/Subscript.cbs | 29 ++-- .../Positive/OperatorOverload/deref/deref.cbs | 62 +++++---- .../member_ref/member_ref.cbs | 73 +++++----- ...neric-owned-struct-as-param-destructor.cbs | 8 +- .../impl_trait_for_typedef.cbs | 8 +- .../trait_pointer_assign_and_compare_null.cbs | 11 +- .../trait_struct_instance.cbs | 11 +- 21 files changed, 314 insertions(+), 156 deletions(-) create mode 100644 clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_nest_stru_def_ord/test1.cbs diff --git a/clang/lib/Frontend/Rewrite/RewriteBSC.cpp b/clang/lib/Frontend/Rewrite/RewriteBSC.cpp index 35b3d00c23e1..cba38098948d 100644 --- a/clang/lib/Frontend/Rewrite/RewriteBSC.cpp +++ b/clang/lib/Frontend/Rewrite/RewriteBSC.cpp @@ -34,11 +34,15 @@ public: addNode(dependency); } - void addNode(RecordDecl *RD) { nodes.insert(RD); } + // recording appear index + void addNode(RecordDecl *RD) { + nodes.insert({RD, nodes.size()}); + } std::vector topologicalSort() { std::map inDegree; - for (RecordDecl *node : nodes) { + for (auto &entry : nodes) { + RecordDecl *node = entry.first; inDegree[node] = 0; } for (auto &entry : typeDependencyMap) { @@ -47,7 +51,13 @@ public: } } - std::queue zeroInDegree; + auto cmp = [this](RecordDecl *A, RecordDecl *B) { + return nodes.at(A) > nodes.at(B); + }; + + std::priority_queue, decltype(cmp)> + zeroInDegree(cmp); + for (auto &entry : inDegree) { if (entry.second == 0) { zeroInDegree.push(entry.first); @@ -56,7 +66,7 @@ public: std::vector sorted; while (!zeroInDegree.empty()) { - RecordDecl *current = zeroInDegree.front(); + RecordDecl *current = zeroInDegree.top(); zeroInDegree.pop(); sorted.push_back(current); @@ -81,7 +91,8 @@ private: // For a struct S, which has a field of struct T, the S depends on T, so we // use T as the key and add S to its value. std::map> typeDependencyMap; - std::set nodes; + // map to memo the appear index + std::map nodes; }; class TypeDependencyVisitor : public DeclVisitor { @@ -93,6 +104,9 @@ public: if (!RD->isThisDeclarationADefinition() || visited.count(RD)) return; + graph.addNode(RD); + visited.insert(RD); + // Traverse all fields to calculate type dependencies. for (FieldDecl *Field : RD->fields()) { QualType FieldType = Field->getType(); @@ -116,8 +130,6 @@ public: } } } - graph.addNode(RD); - visited.insert(RD); } void VisitClassTemplateDecl(ClassTemplateDecl *CTD) { diff --git a/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_12/rewrite_bsc_generic_12.cbs b/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_12/rewrite_bsc_generic_12.cbs index 5367e6d8159c..f4967a5083c1 100644 --- a/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_12/rewrite_bsc_generic_12.cbs +++ b/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_12/rewrite_bsc_generic_12.cbs @@ -82,6 +82,10 @@ int main() { return 0; } // CHECK-NEXT: int value; // CHECK-NEXT: }; // CHECK-EMPTY: +// CHECK-NEXT: struct B { +// CHECK-NEXT: struct A_int a; +// CHECK-NEXT: }; +// CHECK-EMPTY: // CHECK-NEXT: struct C { // CHECK-NEXT: struct A_int *a; // CHECK-NEXT: }; @@ -94,10 +98,6 @@ int main() { return 0; } // CHECK-NEXT: struct A_int *a; // CHECK-NEXT: }; // CHECK-EMPTY: -// CHECK-NEXT: struct B { -// CHECK-NEXT: struct A_int a; -// CHECK-NEXT: }; -// CHECK-EMPTY: // CHECK-NEXT: struct A_int a; // CHECK-EMPTY: // CHECK-NEXT: struct A_int *b; diff --git a/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_15/rewrite_bsc_generic_15.cbs b/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_15/rewrite_bsc_generic_15.cbs index fde8608314d5..14723d0f4e6d 100644 --- a/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_15/rewrite_bsc_generic_15.cbs +++ b/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_15/rewrite_bsc_generic_15.cbs @@ -24,18 +24,19 @@ int main() { return 0; } -// CHECK: struct S1 { + +// CHECK: struct S3_struct_S1_P { +// CHECK-NEXT: struct S1 *t; // CHECK-NEXT: }; // CHECK-EMPTY: -// CHECK-NEXT: struct S2 { +// CHECK-NEXT: struct S4_struct_S3_struct_S1_P { +// CHECK-NEXT: struct S3_struct_S1_P u; // CHECK-NEXT: }; // CHECK-EMPTY: -// CHECK-NEXT: struct S3_struct_S1_P { -// CHECK-NEXT: struct S1 *t; +// CHECK-NEXT: struct S1 { // CHECK-NEXT: }; // CHECK-EMPTY: -// CHECK-NEXT: struct S4_struct_S3_struct_S1_P { -// CHECK-NEXT: struct S3_struct_S1_P u; +// CHECK-NEXT: struct S2 { // CHECK-NEXT: }; // CHECK-EMPTY: // CHECK-NEXT: void test(struct S4_struct_S3_struct_S1_P s) { diff --git a/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_7/rewrite_bsc_generic_7.cbs b/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_7/rewrite_bsc_generic_7.cbs index e9d41780bf1f..67b6be95700a 100644 --- a/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_7/rewrite_bsc_generic_7.cbs +++ b/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_7/rewrite_bsc_generic_7.cbs @@ -43,13 +43,13 @@ int main() { // CHECK: struct B {}; // CHECK-EMPTY: -// CHECK-NEXT: struct Goo_struct_B_struct_B { +// CHECK-NEXT: struct Foo_struct_B { // CHECK-NEXT: struct B a; -// CHECK-NEXT: struct B b; // CHECK-NEXT: }; // CHECK-EMPTY: -// CHECK-NEXT: struct Foo_struct_B { +// CHECK-NEXT: struct Goo_struct_B_struct_B { // CHECK-NEXT: struct B a; +// CHECK-NEXT: struct B b; // CHECK-NEXT: }; // CHECK-EMPTY: // CHECK-NEXT: static struct Foo_struct_B max_struct_B(struct B a, struct Foo_struct_B foo); diff --git a/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_8/rewrite_bsc_generic_8.cbs b/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_8/rewrite_bsc_generic_8.cbs index a036ed665439..2f20367bec22 100644 --- a/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_8/rewrite_bsc_generic_8.cbs +++ b/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_8/rewrite_bsc_generic_8.cbs @@ -27,6 +27,10 @@ int main() {}; // CHECK: struct PollResult_int { // CHECK-NEXT: }; // CHECK-EMPTY: +// CHECK-NEXT: struct A { +// CHECK-NEXT: struct PollResult_int a; +// CHECK-NEXT: }; +// CHECK-EMPTY: // CHECK-NEXT: struct B { // CHECK-EMPTY: // CHECK-NEXT: }; @@ -35,8 +39,4 @@ int main() {}; // CHECK-NEXT: struct PollResult_int a; // CHECK-NEXT: }; // CHECK-EMPTY: -// CHECK-NEXT: struct A { -// CHECK-NEXT: struct PollResult_int a; -// CHECK-NEXT: }; -// CHECK-EMPTY: // CHECK-NEXT: int main() {} diff --git a/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_struct_with_header/rewrite_bsc_generic_struct_with_header.cbs b/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_struct_with_header/rewrite_bsc_generic_struct_with_header.cbs index 9ecb7682e0b4..2a94bbd0a96a 100644 --- a/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_struct_with_header/rewrite_bsc_generic_struct_with_header.cbs +++ b/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_struct_with_header/rewrite_bsc_generic_struct_with_header.cbs @@ -27,18 +27,18 @@ int main() { // CHECK-NEXT: int a; // CHECK-NEXT: }; // CHECK-EMPTY: -// CHECK-NEXT: struct LinkedList_struct_S { -// CHECK-NEXT: struct _BSC_ListNode_struct_S *head; -// CHECK-NEXT: struct _BSC_ListNode_struct_S *tail; -// CHECK-NEXT: size_t len; -// CHECK-NEXT: }; -// CHECK-EMPTY: // CHECK-NEXT: struct _BSC_ListNode_struct_S { // CHECK-NEXT: struct _BSC_ListNode_struct_S *next; // CHECK-NEXT: struct _BSC_ListNode_struct_S *prev; // CHECK-NEXT: struct S element; // CHECK-NEXT: }; // CHECK-EMPTY: +// CHECK-NEXT: struct LinkedList_struct_S { +// CHECK-NEXT: struct _BSC_ListNode_struct_S *head; +// CHECK-NEXT: struct _BSC_ListNode_struct_S *tail; +// CHECK-NEXT: size_t len; +// CHECK-NEXT: }; +// CHECK-EMPTY: // CHECK-NEXT: static struct _BSC_ListNode_struct_S *struct__BSC_ListNode_struct_S_new(struct S el); // CHECK-EMPTY: // CHECK-NEXT: static struct LinkedList_struct_S struct_LinkedList_struct_S_new(void); diff --git a/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_with_header_2/rewrite_bsc_generic_with_header_2.cbs b/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_with_header_2/rewrite_bsc_generic_with_header_2.cbs index bd5a9d760c7a..4089fcea9e3f 100644 --- a/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_with_header_2/rewrite_bsc_generic_with_header_2.cbs +++ b/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_with_header_2/rewrite_bsc_generic_with_header_2.cbs @@ -48,14 +48,14 @@ int main() { // CHECK-NEXT: struct G_int { // CHECK-NEXT: }; // CHECK-EMPTY: -// CHECK-NEXT: struct B { -// CHECK-NEXT: struct A **a; -// CHECK-NEXT: }; -// CHECK-EMPTY: // CHECK-NEXT: struct A { // CHECK-NEXT: struct G_int g; // CHECK-NEXT: }; // CHECK-EMPTY: +// CHECK-NEXT: struct B { +// CHECK-NEXT: struct A **a; +// CHECK-NEXT: }; +// CHECK-EMPTY: // CHECK-NEXT: static struct S_int_char *newS_int_char(int a); // CHECK-EMPTY: // CHECK-NEXT: struct S_int_char b; diff --git a/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_with_header_3/rewrite_bsc_generic_with_header_3.cbs b/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_with_header_3/rewrite_bsc_generic_with_header_3.cbs index b46d2e12d276..0aa8e71ed82c 100644 --- a/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_with_header_3/rewrite_bsc_generic_with_header_3.cbs +++ b/clang/test/BSC/Positive/Driver/rewrite-bsc/Generic/rewrite_bsc_generic_with_header_3/rewrite_bsc_generic_with_header_3.cbs @@ -85,16 +85,11 @@ int main() { // CHECK-NEXT: ANONDIGIT_END // CHECK-NEXT: }; // CHECK-EMPTY: -// CHECK-NEXT: struct UserHBSStruct { -// CHECK-NEXT: int a; -// CHECK-NEXT: int b; -// CHECK-NEXT: }; -// CHECK-EMPTY: // CHECK-NEXT: struct BSCGenericStruct_int { // CHECK-NEXT: int t; // CHECK-NEXT: }; // CHECK-EMPTY: -// CHECK-NEXT: struct CBSStruct { +// CHECK-NEXT: struct UserHBSStruct { // CHECK-NEXT: int a; // CHECK-NEXT: int b; // CHECK-NEXT: }; @@ -103,6 +98,11 @@ int main() { // CHECK-NEXT: TBSCGSI a; // CHECK-NEXT: }; // CHECK-EMPTY: +// CHECK-NEXT: struct CBSStruct { +// CHECK-NEXT: int a; +// CHECK-NEXT: int b; +// CHECK-NEXT: }; +// CHECK-EMPTY: // CHECK-NEXT: static struct BSCGenericStruct_int init_int(int t); // CHECK-EMPTY: // CHECK-NEXT: int x = 1; diff --git a/clang/test/BSC/Positive/Driver/rewrite-bsc/Ownership/rewrite_bsc_owned3/rewrite_bsc_owned3.cbs b/clang/test/BSC/Positive/Driver/rewrite-bsc/Ownership/rewrite_bsc_owned3/rewrite_bsc_owned3.cbs index 0cdf6c057da6..d25bc30c3301 100644 --- a/clang/test/BSC/Positive/Driver/rewrite-bsc/Ownership/rewrite_bsc_owned3/rewrite_bsc_owned3.cbs +++ b/clang/test/BSC/Positive/Driver/rewrite-bsc/Ownership/rewrite_bsc_owned3/rewrite_bsc_owned3.cbs @@ -104,6 +104,10 @@ int main() { // CHECK-NEXT: int **c; // CHECK-NEXT: }; // CHECK-EMPTY: +// CHECK-NEXT: struct D { +// CHECK-NEXT: struct C c; +// CHECK-NEXT: }; +// CHECK-EMPTY: // CHECK-NEXT: struct E { // CHECK-NEXT: int e; // CHECK-NEXT: }; @@ -120,10 +124,6 @@ int main() { // CHECK-NEXT: int * *h; // CHECK-NEXT: }; // CHECK-EMPTY: -// CHECK-NEXT: struct D { -// CHECK-NEXT: struct C c; -// CHECK-NEXT: }; -// CHECK-EMPTY: // CHECK-NEXT: int (a)(void); // CHECK-EMPTY: // CHECK-NEXT: int *(b)(void); diff --git a/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_type_dependency_3/rewrite_bsc_type_dependency_3.cbs b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_type_dependency_3/rewrite_bsc_type_dependency_3.cbs index 463355c70318..9075889113ee 100644 --- a/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_type_dependency_3/rewrite_bsc_type_dependency_3.cbs +++ b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_type_dependency_3/rewrite_bsc_type_dependency_3.cbs @@ -60,18 +60,19 @@ int main() { return 0; } -// CHECK: struct RawVec_int { -// CHECK-NEXT: int *ptr; -// CHECK-NEXT: int cap; -// CHECK-NEXT: }; -// CHECK-EMPTY: -// CHECK-NEXT: struct LinkedList_struct_Vec_int { +// CHECK: struct LinkedList_struct_Vec_int { // CHECK-NEXT: struct _BSC_ListNode_struct_Vec_int *head; // CHECK-NEXT: struct _BSC_ListNode_struct_Vec_int *tail; // CHECK-NEXT: int len; // CHECK-NEXT: }; // CHECK-EMPTY: +// CHECK-NEXT: struct RawVec_int { +// CHECK-NEXT: int *ptr; +// CHECK-NEXT: int cap; +// CHECK-NEXT: }; +// CHECK-EMPTY: // CHECK-NEXT: struct Vec_int { -// CHECK-NEXT: struct RawVec_int buf; +// CHECK-NEXT: struct RawVec_int buf; // CHECK-NEXT: int len; -// CHECK-NEXT: }; \ No newline at end of file +// CHECK-NEXT: }; + diff --git a/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_type_dependency_4/rewrite_bsc_type_dependency_4.cbs b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_type_dependency_4/rewrite_bsc_type_dependency_4.cbs index 861571bade9e..2fdc3c70e474 100644 --- a/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_type_dependency_4/rewrite_bsc_type_dependency_4.cbs +++ b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_type_dependency_4/rewrite_bsc_type_dependency_4.cbs @@ -32,13 +32,13 @@ int main() { // CHECK-EMPTY: // CHECK-NEXT: typedef struct EQueueFunc EQueueFunc; // CHECK-EMPTY: -// CHECK-NEXT: struct S {}; -// CHECK-EMPTY: // CHECK-NEXT: struct __Trait_F_int { // CHECK-NEXT: void *data; // CHECK-NEXT: struct __Trait_F_Vtable_int *vtable; // CHECK-NEXT: }; // CHECK-EMPTY: +// CHECK-NEXT: struct S {}; +// CHECK-EMPTY: // CHECK-NEXT: struct EQueueFunc { // CHECK-NEXT: pollFunc func; // CHECK-NEXT: }; diff --git a/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_typedef/rewrite_bsc_typedef.cbs b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_typedef/rewrite_bsc_typedef.cbs index 68e28ca2aaf8..374d92855ca5 100644 --- a/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_typedef/rewrite_bsc_typedef.cbs +++ b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_typedef/rewrite_bsc_typedef.cbs @@ -37,14 +37,14 @@ int main() { // CHECK-NEXT: struct S_int { // CHECK-NEXT: }; // CHECK-EMPTY: -// CHECK-NEXT: union _TD_MyUnion { -// CHECK-NEXT: int a; -// CHECK-NEXT: }; -// CHECK-EMPTY: // CHECK-NEXT: struct _TD_MyStruct { // CHECK-NEXT: struct S_int a; // CHECK-NEXT: }; // CHECK-EMPTY: +// CHECK-NEXT: union _TD_MyUnion { +// CHECK-NEXT: int a; +// CHECK-NEXT: }; +// CHECK-EMPTY: // CHECK-NEXT: int main() { // CHECK-NEXT: return 0; // CHECK-NEXT: } diff --git a/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_nest_stru_def_ord/test1.cbs b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_nest_stru_def_ord/test1.cbs new file mode 100644 index 000000000000..2ba778336efb --- /dev/null +++ b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_nest_stru_def_ord/test1.cbs @@ -0,0 +1,129 @@ +// 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 + + +struct A{ + int a; +}; + +struct B{ + struct A a; +}; + +struct C{ + struct A a; +}; + +struct D{ + struct A a; +}; + +struct E{ + struct A a; +}; + +struct F{ + struct A a; +}; + +struct G{ + struct A a; +}; + +struct H{ + struct A a; +}; + +struct I{ + struct A a; +}; + +struct J{ + struct A a; +}; + +struct K{ + struct A a; +}; + +struct L{ + struct A a; +}; + +struct M{ + struct A a; +}; + +struct out{ + struct A a; + struct B b; + struct C c; + struct D d; + struct E e; + struct F f ; + struct G g; + struct H h; + struct I i; + struct J j; + struct K k; + struct L l; + struct M m; +}; + +int main(){ + struct out o = {}; + return 0; +} +// CHECK: struct A{ +// CHECK-NEXT: int a; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct B{ +// CHECK-NEXT: struct A a; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct C{ +// CHECK-NEXT: struct A a; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct D{ +// CHECK-NEXT: struct A a; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct E{ +// CHECK-NEXT: struct A a; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct F{ +// CHECK-NEXT: struct A a; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct G{ +// CHECK-NEXT: struct A a; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct H{ +// CHECK-NEXT: struct A a; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct I{ +// CHECK-NEXT: struct A a; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct J{ +// CHECK-NEXT: struct A a; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct K{ +// CHECK-NEXT: struct A a; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct L{ +// CHECK-NEXT: struct A a; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct M{ +// CHECK-NEXT: struct A a; +// CHECK-NEXT: }; \ No newline at end of file diff --git a/clang/test/BSC/Positive/Generic/GenericTypeMethods/generic_trait_param/generic_trait_param.cbs b/clang/test/BSC/Positive/Generic/GenericTypeMethods/generic_trait_param/generic_trait_param.cbs index b6ed2af0da12..32480f6861c3 100644 --- a/clang/test/BSC/Positive/Generic/GenericTypeMethods/generic_trait_param/generic_trait_param.cbs +++ b/clang/test/BSC/Positive/Generic/GenericTypeMethods/generic_trait_param/generic_trait_param.cbs @@ -24,15 +24,14 @@ int main() { struct A::foo(&s, future); return 0; } - -// CHECK: struct A_void_P { -// CHECK-NEXT: }; -// CHECK-EMPTY: -// CHECK-NEXT: struct __Trait_Future_void_P { +// CHECK: struct __Trait_Future_void_P { // CHECK-NEXT: void *data; // CHECK-NEXT: struct __Trait_Future_Vtable_void_P *vtable; // CHECK-NEXT: }; // CHECK-EMPTY: +// CHECK-NEXT: struct A_void_P { +// CHECK-NEXT: }; +// CHECK-EMPTY: // CHECK-NEXT: static void struct_A_void_P_foo(struct A_void_P *this, struct __Trait_Future_void_P future); // CHECK-EMPTY: // CHECK-NEXT: int main(void) { diff --git a/clang/test/BSC/Positive/OperatorOverload/Subscript/Subscript.cbs b/clang/test/BSC/Positive/OperatorOverload/Subscript/Subscript.cbs index b2630f15530d..54d8f7bd984e 100644 --- a/clang/test/BSC/Positive/OperatorOverload/Subscript/Subscript.cbs +++ b/clang/test/BSC/Positive/OperatorOverload/Subscript/Subscript.cbs @@ -182,41 +182,40 @@ int main() { // CHECK-NEXT: int a; // CHECK-NEXT: }; // CHECK-EMPTY: -// CHECK: struct G { -// CHECK-NEXT: int a; -// CHECK-NEXT: }; -// CHECK-EMPTY: -// CHECK: struct I { -// CHECK-NEXT: int a; +// CHECK: struct F { +// CHECK-NEXT: struct E e[10]; // CHECK-NEXT: }; // CHECK-EMPTY: -// CHECK: struct K { +// CHECK: struct G { // CHECK-NEXT: int a; // CHECK-NEXT: }; // CHECK-EMPTY: -// CHECK: struct Data_int { -// CHECK-NEXT: int data; -// CHECK-NEXT: }; -// CHECK-EMPTY: -// CHECK: struct F { -// CHECK-NEXT: struct E e[10]; -// CHECK-NEXT: }; -// CHECK-EMPTY: // CHECK: struct H { // CHECK-NEXT: struct G g[10]; // CHECK-NEXT: int b; // CHECK-NEXT: }; // CHECK-EMPTY: +// CHECK: struct I { +// CHECK-NEXT: int a; +// CHECK-NEXT: }; +// CHECK-EMPTY: // CHECK: struct J { // CHECK-NEXT: struct I i[10]; // CHECK-NEXT: int b; // CHECK-NEXT: }; +// CHECK: struct K { +// CHECK-NEXT: int a; +// CHECK-NEXT: }; // CHECK-EMPTY: // CHECK: struct L { // CHECK-NEXT: struct K g[10]; // CHECK-NEXT: int b; // CHECK-NEXT: }; // CHECK-EMPTY: +// CHECK: struct Data_int { +// CHECK-NEXT: int data; +// CHECK-NEXT: }; +// CHECK-EMPTY: // CHECK: struct DataArray_int { // CHECK-NEXT: struct Data_int array[10]; // CHECK-NEXT: }; diff --git a/clang/test/BSC/Positive/OperatorOverload/deref/deref.cbs b/clang/test/BSC/Positive/OperatorOverload/deref/deref.cbs index e73b847fa9c6..e1e98cefb1fc 100644 --- a/clang/test/BSC/Positive/OperatorOverload/deref/deref.cbs +++ b/clang/test/BSC/Positive/OperatorOverload/deref/deref.cbs @@ -167,33 +167,41 @@ int main() { // CHECK-NEXT: struct RcData_int; // CHECK-NEXT: struct Rc_int; // CHECK-NEXT: struct RcRecord_int; -// CHECK-DAG: struct E { -// CHECK-DAG-NEXT: int a; -// CHECK-DAG-NEXT: }; -// CHECK-DAG: struct G { -// CHECK-DAG-NEXT: int a; -// CHECK-DAG-NEXT: }; -// CHECK-DAG: struct I { -// CHECK-DAG-NEXT: int a; -// CHECK-DAG-NEXT: }; -// CHECK-DAG: struct Rc_int { -// CHECK-DAG-NEXT: struct RcData_int *ptr; -// CHECK-DAG-NEXT: }; -// CHECK-DAG: struct RcData_int { -// CHECK-DAG-NEXT: int data; -// CHECK-DAG-NEXT: }; -// CHECK-DAG: struct F { -// CHECK-DAG-NEXT: struct E e; -// CHECK-DAG-NEXT: }; -// CHECK-DAG: struct H { -// CHECK-DAG-NEXT: struct G g; -// CHECK-DAG-NEXT: int b; -// CHECK-DAG-NEXT: }; -// CHECK-DAG: struct J { -// CHECK-DAG-NEXT: struct I i; -// CHECK-DAG-NEXT: int b; -// CHECK-DAG-NEXT: }; -// CHECK: struct RcRecord_int { +// CHECK-NEXT: struct E { +// CHECK-NEXT: int a; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct F { +// CHECK-NEXT: struct E e; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct G { +// CHECK-NEXT: int a; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct H { +// CHECK-NEXT: struct G g; +// CHECK-NEXT: int b; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct I { +// CHECK-NEXT: int a; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct J { +// CHECK-NEXT: struct I i; +// CHECK-NEXT: int b; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct RcData_int { +// CHECK-NEXT: int data; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct Rc_int { +// CHECK-NEXT: struct RcData_int *ptr; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct RcRecord_int { // CHECK-NEXT: struct Rc_int rc; // CHECK-NEXT: }; // CHECK-EMPTY: diff --git a/clang/test/BSC/Positive/OperatorOverload/member_ref/member_ref.cbs b/clang/test/BSC/Positive/OperatorOverload/member_ref/member_ref.cbs index eb67c744f55a..c77da3b1ed94 100644 --- a/clang/test/BSC/Positive/OperatorOverload/member_ref/member_ref.cbs +++ b/clang/test/BSC/Positive/OperatorOverload/member_ref/member_ref.cbs @@ -224,41 +224,50 @@ int main(){ // CHECK-NEXT: struct RcData_int; // CHECK-NEXT: struct Rc_int; // CHECK-NEXT: struct RcRecord_int; -// CHECK-DAG: struct A { -// CHECK-DAG-NEXT: int m; -// CHECK-DAG-NEXT: }; -// CHECK-DAG: struct AP { -// CHECK-DAG-NEXT: struct A *a; -// CHECK-DAG-NEXT: }; -// CHECK-DAG-: struct B { -// CHECK-DAG--NEXT: int x; -// CHECK-DAG--NEXT: int y; -// CHECK-DAG--NEXT: }; -// CHECK-DAG: struct BP { -// CHECK-DAG-NEXT: struct A *a; -// CHECK-DAG-NEXT: struct B *b; -// CHECK-DAG-NEXT: }; -// CHECK-DAG: struct CP { -// CHECK-DAG-NEXT: struct A * a; -// CHECK-DAG-NEXT: }; -// CHECK-DAG: struct DP { -// CHECK-DAG-NEXT: struct A * a; -// CHECK-DAG-NEXT: }; -// CHECK-DAG: struct FP { -// CHECK-DAG-NEXT: struct A* a; -// CHECK-DAG-NEXT: }; -// CHECK-DAG: struct Rc_int { -// CHECK-DAG-NEXT: struct RcData_int *ptr; -// CHECK-DAG-NEXT: }; -// CHECK-DAG: struct RcData_int { -// CHECK-DAG-NEXT: int data; -// CHECK-DAG-NEXT: }; -// CHECK: struct GP { +// CHECK: struct A { +// CHECK-NEXT: int m; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct AP { +// CHECK-NEXT: struct A *a; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct B { +// CHECK-NEXT: int x; +// CHECK-NEXT: int y; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct BP { +// CHECK-NEXT: struct A *a; +// CHECK-NEXT: struct B *b; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct CP { +// CHECK-NEXT: struct A * a; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct DP { +// CHECK-NEXT: struct A * a; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct FP { +// CHECK-NEXT: struct A* a; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct GP { // CHECK-NEXT: struct FP fp; // CHECK-NEXT: }; // CHECK-EMPTY: -// CHECK: struct RcRecord_int { -// CHECK-NEXT: struct Rc_int rc; +// CHECK-NEXT: struct RcData_int { +// CHECK-NEXT: int data; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct Rc_int { +// CHECK-NEXT: struct RcData_int *ptr; +// CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: struct RcRecord_int { +// CHECK-NEXT: struct Rc_int rc; // CHECK-NEXT: }; // CHECK-EMPTY: // CHECK: static struct Rc_int struct_Rc_int_new(int data); diff --git a/clang/test/BSC/Positive/OwnedStruct/Destructor/generic-owned-struct-as-param-destructor.cbs b/clang/test/BSC/Positive/OwnedStruct/Destructor/generic-owned-struct-as-param-destructor.cbs index ab549a9435a9..5763ccebeb25 100644 --- a/clang/test/BSC/Positive/OwnedStruct/Destructor/generic-owned-struct-as-param-destructor.cbs +++ b/clang/test/BSC/Positive/OwnedStruct/Destructor/generic-owned-struct-as-param-destructor.cbs @@ -57,14 +57,14 @@ int main(void) { // CHECK: struct A_int { // CHECK-NEXT: }; // CHECK-EMPTY: -// CHECK-NEXT: struct C_int { -// CHECK-NEXT: int elem; -// CHECK-NEXT: }; -// CHECK-EMPTY: // CHECK-NEXT: struct B_int { // CHECK-NEXT: struct A_int a; // CHECK-NEXT: }; // CHECK-EMPTY: +// CHECK-NEXT: struct C_int { +// CHECK-NEXT: int elem; +// CHECK-NEXT: }; +// CHECK-EMPTY: // CHECK-NEXT: static void struct_A_int_D( struct A_int this); // CHECK-EMPTY: // CHECK-NEXT: static void struct_B_int_D( struct B_int this); diff --git a/clang/test/BSC/Positive/Trait/GenericTrait/impl_trait_for_typedef/impl_trait_for_typedef.cbs b/clang/test/BSC/Positive/Trait/GenericTrait/impl_trait_for_typedef/impl_trait_for_typedef.cbs index a271bfa1aed2..53308ae155d2 100644 --- a/clang/test/BSC/Positive/Trait/GenericTrait/impl_trait_for_typedef/impl_trait_for_typedef.cbs +++ b/clang/test/BSC/Positive/Trait/GenericTrait/impl_trait_for_typedef/impl_trait_for_typedef.cbs @@ -29,10 +29,6 @@ int main() { // CHECK: typedef struct S MyS; // CHECK-EMPTY: -// CHECK-NEXT: struct S{ -// CHECK-NEXT: int x; -// CHECK-NEXT: }; -// CHECK-EMPTY: // CHECK-NEXT: struct __Trait_F_Vtable_int { // CHECK-NEXT: int (*foo)(void *, int); // CHECK-NEXT: }; @@ -42,6 +38,10 @@ int main() { // CHECK-NEXT: struct __Trait_F_Vtable_int *vtable; // CHECK-NEXT: }; // CHECK-EMPTY: +// CHECK-NEXT: struct S{ +// CHECK-NEXT: int x; +// CHECK-NEXT: }; +// CHECK-EMPTY: // CHECK-NEXT: int struct_S_foo(struct S *this, int a) { // CHECK-NEXT: return this->x + a; // CHECK-NEXT: } diff --git a/clang/test/BSC/Positive/Trait/GenericTrait/trait_pointer_assign_and_compare_null/trait_pointer_assign_and_compare_null.cbs b/clang/test/BSC/Positive/Trait/GenericTrait/trait_pointer_assign_and_compare_null/trait_pointer_assign_and_compare_null.cbs index a66a87968edd..4d2d4dd5ba4e 100644 --- a/clang/test/BSC/Positive/Trait/GenericTrait/trait_pointer_assign_and_compare_null/trait_pointer_assign_and_compare_null.cbs +++ b/clang/test/BSC/Positive/Trait/GenericTrait/trait_pointer_assign_and_compare_null/trait_pointer_assign_and_compare_null.cbs @@ -26,14 +26,13 @@ int main() { } return 1; } - -// CHECK: struct __Trait_Future_int { -// CHECK-NEXT: void *data; -// CHECK-NEXT: struct __Trait_Future_Vtable_int *vtable; +// CHECK: struct __Trait_Future_Vtable_int { +// CHECK-NEXT: int (*poll)(void *); // CHECK-NEXT: }; // CHECK-EMPTY: -// CHECK-NEXT: struct __Trait_Future_Vtable_int { -// CHECK-NEXT: int (*poll)(void *); +// CHECK-NEXT: struct __Trait_Future_int { +// CHECK-NEXT: void *data; +// CHECK-NEXT: struct __Trait_Future_Vtable_int *vtable; // CHECK-NEXT: }; // CHECK-EMPTY: // CHECK-NEXT: int main(void) { diff --git a/clang/test/BSC/Positive/Trait/GenericTrait/trait_struct_instance/trait_struct_instance.cbs b/clang/test/BSC/Positive/Trait/GenericTrait/trait_struct_instance/trait_struct_instance.cbs index feaace46bbe1..d9be813f7fba 100644 --- a/clang/test/BSC/Positive/Trait/GenericTrait/trait_struct_instance/trait_struct_instance.cbs +++ b/clang/test/BSC/Positive/Trait/GenericTrait/trait_struct_instance/trait_struct_instance.cbs @@ -27,11 +27,8 @@ int main() { return b - 10; } -// CHECK: struct S { -// CHECK-NEXT: int c; -// CHECK-NEXT: }; -// CHECK-EMPTY: -// CHECK-NEXT: struct __Trait_Future_Vtable_struct_S { + +// CHECK: struct __Trait_Future_Vtable_struct_S { // CHECK-NEXT: struct S (*poll)(void *, struct S); // CHECK-NEXT: }; // CHECK-EMPTY: @@ -40,6 +37,10 @@ int main() { // CHECK-NEXT: struct __Trait_Future_Vtable_struct_S *vtable; // CHECK-NEXT: }; // CHECK-EMPTY: +// CHECK-NEXT: struct S { +// CHECK-NEXT: int c; +// CHECK-NEXT: }; +// CHECK-EMPTY: // CHECK-NEXT: struct S int_poll(int *this, struct S a) { // CHECK-NEXT: return a; // CHECK-NEXT: } -- Gitee