From b42d2885f0f6ba8f2aad1995daa26774d1a52b1a Mon Sep 17 00:00:00 2001 From: zhangziyao Date: Tue, 23 Sep 2025 17:03:56 +0800 Subject: [PATCH] [source2source] fixed the bug of incorrect output when rewriting nested typedef decl --- clang/lib/AST/DeclPrinter.cpp | 8 +++-- .../rewrite_nested_typedef.cbs | 32 +++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_nested_typedef/rewrite_nested_typedef.cbs diff --git a/clang/lib/AST/DeclPrinter.cpp b/clang/lib/AST/DeclPrinter.cpp index 533074ec34bc..7dfd7c433ced 100644 --- a/clang/lib/AST/DeclPrinter.cpp +++ b/clang/lib/AST/DeclPrinter.cpp @@ -582,13 +582,15 @@ void DeclPrinter::VisitTypedefDecl(TypedefDecl *D) { QualType Ty = D->getTypeSourceInfo()->getType(); #if ENABLE_BSC // Handling anonymous struct/union/enum defined through typedef for rewriting - if (Context.getLangOpts().BSC) { - if (const RecordType *RT = D->getUnderlyingType()->getAs()) { + if (Policy.RewriteBSC) { + if (D->getUnderlyingType()->getAs()) { + // Just skip, do nothing + } else if (const RecordType *RT = D->getUnderlyingType()->getAs()) { RecordDecl *RD = RT->getDecl(); if (!RD->getIdentifier()) { if (RD->isStruct()) Out << "struct _TD_"; - if (RD->isUnion()) + else if (RD->isUnion()) Out << "union _TD_"; } } else if (const EnumType *ET = D->getUnderlyingType()->getAs()) { diff --git a/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_nested_typedef/rewrite_nested_typedef.cbs b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_nested_typedef/rewrite_nested_typedef.cbs new file mode 100644 index 000000000000..a18f0ec09da3 --- /dev/null +++ b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_nested_typedef/rewrite_nested_typedef.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 + +typedef struct { + int a; +} REQUEST, RESPONSE; + +typedef RESPONSE NEW_RESPONSE; + +void test() { + NEW_RESPONSE nr = {1}; +} + +int main(void) { + test(); + return 0; +} + +// CHECK: struct _TD_REQUEST; +// CHECK-NEXT: typedef struct _TD_REQUEST REQUEST; +// CHECK-EMPTY: +// CHECK-NEXT: typedef struct _TD_REQUEST RESPONSE; +// CHECK-EMPTY: +// CHECK-NEXT: typedef RESPONSE NEW_RESPONSE; +// CHECK-EMPTY: +// CHECK-NEXT: struct _TD_REQUEST { +// CHECK-NEXT: int a; +// CHECK-NEXT: }; \ No newline at end of file -- Gitee