diff --git a/clang/lib/AST/DeclPrinter.cpp b/clang/lib/AST/DeclPrinter.cpp index 533074ec34bcc7027814eb67d9ffc6e5681c0978..7dfd7c433ced6b1ab8e19207b9191d2fb6012d7c 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 0000000000000000000000000000000000000000..a18f0ec09da39eb7670970064372c3c1eee15599 --- /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