forked from OSchip/llvm-project
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
This commit is contained in:
parent
2ef3cdd3d5
commit
c960f56ab0
|
@ -39,3 +39,6 @@ int rvarr(int n, int a[restrict static n]) {
|
|||
return a[2];
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
int f;
|
||||
} T __attribute__ ((__aligned__));
|
||||
|
|
|
@ -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") {
|
||||
|
|
Loading…
Reference in New Issue