From c960f56ab006a4c323d7d8e1f8722600a2bc28df Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Fri, 1 Aug 2014 13:49:00 +0000 Subject: [PATCH] The GNU-style aligned attribute has an optional expression, but the generated pretty printing logic was unaware of this. Fixed the pretty printing logic, and added a test to ensure it no longer asserts. Added a FIXME to the code about eliding the parenthesis when pretty printing such a construct. llvm-svn: 214513 --- clang/test/Sema/ast-print.c | 3 +++ clang/utils/TableGen/ClangAttrEmitter.cpp | 12 +++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/clang/test/Sema/ast-print.c b/clang/test/Sema/ast-print.c index 382f0d3..8ac4960 100644 --- a/clang/test/Sema/ast-print.c +++ b/clang/test/Sema/ast-print.c @@ -39,3 +39,6 @@ int rvarr(int n, int a[restrict static n]) { return a[2]; } +typedef struct { + int f; +} T __attribute__ ((__aligned__)); diff --git a/clang/utils/TableGen/ClangAttrEmitter.cpp b/clang/utils/TableGen/ClangAttrEmitter.cpp index 0f0f89e..45e9e02 100644 --- a/clang/utils/TableGen/ClangAttrEmitter.cpp +++ b/clang/utils/TableGen/ClangAttrEmitter.cpp @@ -486,9 +486,10 @@ namespace { } void writeValue(raw_ostream &OS) const override { OS << "\";\n"; - OS << " assert(is" << getLowerName() << "Expr && " << getLowerName() - << "Expr != nullptr);\n"; - OS << " " << getLowerName() << "Expr->printPretty(OS, 0, Policy);\n"; + // The aligned attribute argument expression is optional. + OS << " if (is" << getLowerName() << "Expr && " + << getLowerName() << "Expr)\n"; + OS << " " << getLowerName() << "Expr->printPretty(OS, 0, Policy);\n"; OS << " OS << \""; } void writeDump(raw_ostream &OS) const override { @@ -1120,6 +1121,11 @@ writePrettyPrintFunction(Record &R, continue; } + // FIXME: always printing the parenthesis isn't the correct behavior for + // attributes which have optional arguments that were not provided. For + // instance: __attribute__((aligned)) will be pretty printed as + // __attribute__((aligned())). The logic should check whether there is only + // a single argument, and if it is optional, whether it has been provided. if (!Args.empty()) OS << "("; if (Spelling == "availability") { -- 2.7.4