giulianobelinassi created this revision. Herald added a project: All. giulianobelinassi requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Previously clang AST prints the following declaration: int fun_var_unused() { int x __attribute__((unused)) = 0; return x; } as: int fun_var_unused() { int x = 0 __attribute__((unused)); return x; } which is rejected by C/C++ parser. This patch modifies the logic to print as the first example. Fixes: https://github.com/llvm/llvm-project/issues/59973 Signed-off-by: Giuliano Belinassi <gbelina...@suse.de> Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D141714 Files: clang/lib/AST/DeclPrinter.cpp clang/test/AST/ast-print-attr.c clang/test/AST/ast-print-pragmas.cpp Index: clang/test/AST/ast-print-pragmas.cpp =================================================================== --- clang/test/AST/ast-print-pragmas.cpp +++ clang/test/AST/ast-print-pragmas.cpp @@ -92,8 +92,9 @@ #ifdef MS_EXT #pragma init_seg(compiler) +/* FIXME: Trying to compile the output source results in compilation error. */ // MS-EXT: #pragma init_seg (.CRT$XCC){{$}} -// MS-EXT-NEXT: int x = 3 __declspec(thread); +// MS-EXT-NEXT: int x __declspec(thread) = 3; int __declspec(thread) x = 3; #endif //MS_EXT Index: clang/test/AST/ast-print-attr.c =================================================================== --- clang/test/AST/ast-print-attr.c +++ clang/test/AST/ast-print-attr.c @@ -32,3 +32,9 @@ // CHECK: void fun_holds(int *a) __attribute__((ownership_holds(fun_holds, 1))); void fun_holds(int *a) __attribute__((ownership_holds(fun_holds, 1))); + +// CHECK: int fun_var_unused() { +// CHECK-NEXT: int x __attribute__((unused)) = 0; +// CHECK-NEXT: return x; +// CHECK-NEXT: } +int fun_var_unused() { int x __attribute__((unused)) = 0; return x; } Index: clang/lib/AST/DeclPrinter.cpp =================================================================== --- clang/lib/AST/DeclPrinter.cpp +++ clang/lib/AST/DeclPrinter.cpp @@ -891,6 +891,7 @@ D->getIdentifier()) ? D->getIdentifier()->deuglifiedName() : D->getName()); + prettyPrintAttributes(D); Expr *Init = D->getInit(); if (!Policy.SuppressInitializers && Init) { bool ImplicitInit = false; @@ -919,7 +920,6 @@ Out << ")"; } } - prettyPrintAttributes(D); } void DeclPrinter::VisitParmVarDecl(ParmVarDecl *D) {
Index: clang/test/AST/ast-print-pragmas.cpp =================================================================== --- clang/test/AST/ast-print-pragmas.cpp +++ clang/test/AST/ast-print-pragmas.cpp @@ -92,8 +92,9 @@ #ifdef MS_EXT #pragma init_seg(compiler) +/* FIXME: Trying to compile the output source results in compilation error. */ // MS-EXT: #pragma init_seg (.CRT$XCC){{$}} -// MS-EXT-NEXT: int x = 3 __declspec(thread); +// MS-EXT-NEXT: int x __declspec(thread) = 3; int __declspec(thread) x = 3; #endif //MS_EXT Index: clang/test/AST/ast-print-attr.c =================================================================== --- clang/test/AST/ast-print-attr.c +++ clang/test/AST/ast-print-attr.c @@ -32,3 +32,9 @@ // CHECK: void fun_holds(int *a) __attribute__((ownership_holds(fun_holds, 1))); void fun_holds(int *a) __attribute__((ownership_holds(fun_holds, 1))); + +// CHECK: int fun_var_unused() { +// CHECK-NEXT: int x __attribute__((unused)) = 0; +// CHECK-NEXT: return x; +// CHECK-NEXT: } +int fun_var_unused() { int x __attribute__((unused)) = 0; return x; } Index: clang/lib/AST/DeclPrinter.cpp =================================================================== --- clang/lib/AST/DeclPrinter.cpp +++ clang/lib/AST/DeclPrinter.cpp @@ -891,6 +891,7 @@ D->getIdentifier()) ? D->getIdentifier()->deuglifiedName() : D->getName()); + prettyPrintAttributes(D); Expr *Init = D->getInit(); if (!Policy.SuppressInitializers && Init) { bool ImplicitInit = false; @@ -919,7 +920,6 @@ Out << ")"; } } - prettyPrintAttributes(D); } void DeclPrinter::VisitParmVarDecl(ParmVarDecl *D) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits