diff options
Diffstat (limited to 'clang/lib/AST')
-rw-r--r-- | clang/lib/AST/Expr.cpp | 7 | ||||
-rw-r--r-- | clang/lib/AST/StmtPrinter.cpp | 30 | ||||
-rw-r--r-- | clang/lib/AST/StmtSerialization.cpp | 14 |
3 files changed, 49 insertions, 2 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index eafa717d654..26260132e7c 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -395,7 +395,8 @@ Expr::isLvalueResult Expr::isLvalue(ASTContext &Ctx) const { if (cast<ArraySubscriptExpr>(this)->getBase()->getType()->isVectorType()) return cast<ArraySubscriptExpr>(this)->getBase()->isLvalue(Ctx); return LV_Valid; - case DeclRefExprClass: { // C99 6.5.1p2 + case DeclRefExprClass: + case QualifiedDeclRefExprClass: { // C99 6.5.1p2 const NamedDecl *RefdDecl = cast<DeclRefExpr>(this)->getDecl(); if (DeclCanBeLvalue(RefdDecl, Ctx)) return LV_Valid; @@ -638,7 +639,8 @@ bool Expr::hasGlobalStorage() const { return cast<ImplicitCastExpr>(this)->getSubExpr()->hasGlobalStorage(); case CompoundLiteralExprClass: return cast<CompoundLiteralExpr>(this)->isFileScope(); - case DeclRefExprClass: { + case DeclRefExprClass: + case QualifiedDeclRefExprClass: { const Decl *D = cast<DeclRefExpr>(this)->getDecl(); if (const VarDecl *VD = dyn_cast<VarDecl>(D)) return VD->hasGlobalStorage(); @@ -813,6 +815,7 @@ bool Expr::isIntegerConstantExpr(llvm::APSInt &Result, ASTContext &Ctx, return false; } case DeclRefExprClass: + case QualifiedDeclRefExprClass: if (const EnumConstantDecl *D = dyn_cast<EnumConstantDecl>(cast<DeclRefExpr>(this)->getDecl())) { Result = D->getInitVal(); diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp index 89a185d965d..679c8974975 100644 --- a/clang/lib/AST/StmtPrinter.cpp +++ b/clang/lib/AST/StmtPrinter.cpp @@ -13,6 +13,7 @@ //===----------------------------------------------------------------------===// #include "clang/AST/StmtVisitor.h" +#include "clang/AST/DeclCXX.h" #include "clang/AST/DeclObjC.h" #include "clang/AST/PrettyPrinter.h" #include "llvm/Support/Compiler.h" @@ -513,6 +514,35 @@ void StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) { OS << Node->getDecl()->getNameAsString(); } +void StmtPrinter::VisitQualifiedDeclRefExpr(QualifiedDeclRefExpr *Node) { + // FIXME: Should we keep enough information in QualifiedDeclRefExpr + // to produce the same qualification that the user wrote? + llvm::SmallVector<DeclContext *, 4> Contexts; + + NamedDecl *D = Node->getDecl(); + + // Build up a stack of contexts. + DeclContext *Ctx = 0; + if (ScopedDecl *SD = dyn_cast<ScopedDecl>(D)) + Ctx = SD->getDeclContext(); + else if (OverloadedFunctionDecl *Ovl = dyn_cast<OverloadedFunctionDecl>(D)) + Ctx = Ovl->getDeclContext(); + for (; Ctx; Ctx = Ctx->getParent()) + if (!Ctx->isTransparentContext()) + Contexts.push_back(Ctx); + + while (!Contexts.empty()) { + DeclContext *Ctx = Contexts.back(); + if (isa<TranslationUnitDecl>(Ctx)) + OS << "::"; + else if (ScopedDecl *SD = dyn_cast<ScopedDecl>(Ctx)) + OS << SD->getNameAsString() << "::"; + Contexts.pop_back(); + } + + OS << D->getNameAsString(); +} + void StmtPrinter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) { if (Node->getBase()) { PrintExpr(Node->getBase()); diff --git a/clang/lib/AST/StmtSerialization.cpp b/clang/lib/AST/StmtSerialization.cpp index f7c4cf9b937..02ccde3da26 100644 --- a/clang/lib/AST/StmtSerialization.cpp +++ b/clang/lib/AST/StmtSerialization.cpp @@ -249,6 +249,9 @@ Stmt* Stmt::Create(Deserializer& D, ASTContext& C) { case CXXTryStmtClass: return CXXTryStmt::CreateImpl(D, C); + + case QualifiedDeclRefExprClass: + return QualifiedDeclRefExpr::CreateImpl(D, C); } } @@ -1578,3 +1581,14 @@ CXXTryStmt::CreateImpl(llvm::Deserializer& D, ASTContext& C) { return new CXXTryStmt(TryLoc, Stmts[0], &Stmts[1], size - 1); } + +void QualifiedDeclRefExpr::EmitImpl(llvm::Serializer& S) const { + DeclRefExpr::EmitImpl(S); + S.Emit(NestedNameLoc); +} + +QualifiedDeclRefExpr* +QualifiedDeclRefExpr::CreateImpl(llvm::Deserializer& D, ASTContext& C) { + assert(false && "Cannot deserialize qualified decl references"); + return 0; +} |