зеркало из https://github.com/microsoft/clang-1.git
Don't constant-fold when pretty-printing alignment attribute. This fixes a
potential crasher -- Context is sometimes a null reference (!!) here. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@162007 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
d01258641a
Коммит
0dae729a69
|
@ -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; }
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)));
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче