The GNU-style aligned attribute has an optional expression, but the generated pretty...
authorAaron Ballman <aaron@aaronballman.com>
Fri, 1 Aug 2014 13:49:00 +0000 (13:49 +0000)
committerAaron Ballman <aaron@aaronballman.com>
Fri, 1 Aug 2014 13:49:00 +0000 (13:49 +0000)
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
clang/utils/TableGen/ClangAttrEmitter.cpp

index 382f0d3..8ac4960 100644 (file)
@@ -39,3 +39,6 @@ int rvarr(int n, int a[restrict static n]) {
   return a[2];
 }
 
+typedef struct {
+  int f;
+} T __attribute__ ((__aligned__));
index 0f0f89e..45e9e02 100644 (file)
@@ -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") {