Don't constant-fold when pretty-printing alignment attribute. This fixes a

potential crasher -- Context is sometimes a null reference (!!) here.

llvm-svn: 162007
This commit is contained in:
Richard Smith 2012-08-16 02:43:29 +00:00
parent 04390a63c8
commit 52f04a2e8f
5 changed files with 16 additions and 7 deletions

View File

@ -105,7 +105,8 @@ public:
virtual bool isLateParsed() const { return false; }
// Pretty print this attribute.
virtual void printPretty(llvm::raw_ostream &OS, ASTContext &C) const = 0;
virtual void printPretty(llvm::raw_ostream &OS,
const PrintingPolicy &Policy) const = 0;
// Implement isa/cast/dyncast/etc.
static bool classof(const Attr *) { return true; }

View File

@ -195,8 +195,8 @@ void DeclPrinter::prettyPrintAttributes(Decl *D) {
if (D->hasAttrs()) {
AttrVec &Attrs = D->getAttrs();
for (AttrVec::const_iterator i=Attrs.begin(), e=Attrs.end(); i!=e; ++i) {
Attr *A = *i;
A->printPretty(Out, Context);
Attr *A = *i;
A->printPretty(Out, Policy);
}
}
}

View File

@ -181,7 +181,7 @@ void StmtPrinter::VisitAttributedStmt(AttributedStmt *Node) {
first = false;
}
// TODO: check this
(*it)->printPretty(OS, Context);
(*it)->printPretty(OS, Policy);
}
OS << "]] ";
PrintStmt(Node->getSubStmt(), 0);

View File

@ -22,6 +22,10 @@
// CHECK-LIST-NEXT: test_namespace::TheClass
// CHECK-LIST-NEXT: test_namespace::TheClass::theMethod
// CHECK-LIST-NEXT: x
//
// RUN: clang-check -ast-dump -ast-dump-filter test_namespace::TheClass::n "%s" -- 2>&1 | FileCheck -check-prefix CHECK-ATTR %s
// CHECK-ATTR: test_namespace
// CHECK-ATTR-NEXT: int n __attribute__((aligned(1 + 1
namespace test_namespace {
@ -30,6 +34,7 @@ public:
int theMethod(int x) {
return x + x;
}
int n __attribute__((aligned(1+1)));
};
}

View File

@ -349,7 +349,9 @@ namespace {
<< "Type(), Record);\n";
}
void writeValue(raw_ostream &OS) const {
OS << "\" << get" << getUpperName() << "(Ctx) << \"";
OS << "\";\n"
<< " " << getLowerName() << "Expr->printPretty(OS, 0, Policy);\n"
<< " OS << \"";
}
};
@ -728,7 +730,8 @@ void EmitClangAttrClass(RecordKeeper &Records, raw_ostream &OS) {
OS << " }\n\n";
OS << " virtual " << R.getName() << "Attr *clone (ASTContext &C) const;\n";
OS << " virtual void printPretty(llvm::raw_ostream &OS, ASTContext &Ctx) const;\n";
OS << " virtual void printPretty(llvm::raw_ostream &OS,"
<< " const PrintingPolicy &Policy) const;\n";
for (ai = Args.begin(); ai != ae; ++ai) {
(*ai)->writeAccessors(OS);
@ -786,7 +789,7 @@ void EmitClangAttrImpl(RecordKeeper &Records, raw_ostream &OS) {
OS << ");\n}\n\n";
OS << "void " << R.getName() << "Attr::printPretty("
<< "llvm::raw_ostream &OS, ASTContext &Ctx) const {\n";
<< "llvm::raw_ostream &OS, const PrintingPolicy &Policy) const {\n";
if (Spellings.begin() != Spellings.end()) {
std::string Spelling = (*Spellings.begin())->getValueAsString("Name");
OS << " OS << \" __attribute__((" << Spelling;