[clang] c43f8c7 - Add PrintingPolicy overload to APValue::printPretty. NFC.

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Tue Nov 10 14:49:14 PST 2020


Author: Richard Smith
Date: 2020-11-10T14:48:56-08:00
New Revision: c43f8c772886ff081aaaf94ddb70da58d545a4c0

URL: https://github.com/llvm/llvm-project/commit/c43f8c772886ff081aaaf94ddb70da58d545a4c0
DIFF: https://github.com/llvm/llvm-project/commit/c43f8c772886ff081aaaf94ddb70da58d545a4c0.diff

LOG: Add PrintingPolicy overload to APValue::printPretty. NFC.

Added: 
    

Modified: 
    clang/include/clang/AST/APValue.h
    clang/include/clang/AST/PrettyPrinter.h
    clang/lib/AST/APValue.cpp

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/AST/APValue.h b/clang/include/clang/AST/APValue.h
index 4c063ca00d7b..d921a106b9f1 100644
--- a/clang/include/clang/AST/APValue.h
+++ b/clang/include/clang/AST/APValue.h
@@ -395,6 +395,9 @@ class APValue {
   void dump(raw_ostream &OS, const ASTContext &Context) const;
 
   void printPretty(raw_ostream &OS, const ASTContext &Ctx, QualType Ty) const;
+  void printPretty(raw_ostream &OS, const PrintingPolicy &Policy, QualType Ty,
+                   const ASTContext *Ctx = nullptr) const;
+
   std::string getAsString(const ASTContext &Ctx, QualType Ty) const;
 
   APSInt &getInt() {

diff  --git a/clang/include/clang/AST/PrettyPrinter.h b/clang/include/clang/AST/PrettyPrinter.h
index 616647f44430..dfd5851bb30d 100644
--- a/clang/include/clang/AST/PrettyPrinter.h
+++ b/clang/include/clang/AST/PrettyPrinter.h
@@ -56,8 +56,8 @@ struct PrintingPolicy {
         AnonymousTagLocations(true), SuppressStrongLifetime(false),
         SuppressLifetimeQualifiers(false),
         SuppressTemplateArgsInCXXConstructors(false), Bool(LO.Bool),
-        Restrict(LO.C99), Alignof(LO.CPlusPlus11), UnderscoreAlignof(LO.C11),
-        UseVoidForZeroParams(!LO.CPlusPlus),
+        Nullptr(LO.CPlusPlus11), Restrict(LO.C99), Alignof(LO.CPlusPlus11),
+        UnderscoreAlignof(LO.C11), UseVoidForZeroParams(!LO.CPlusPlus),
         SplitTemplateClosers(!LO.CPlusPlus11), TerseOutput(false),
         PolishForDeclaration(false), Half(LO.Half),
         MSWChar(LO.MicrosoftExt && !LO.WChar), IncludeNewlines(true),
@@ -171,6 +171,10 @@ struct PrintingPolicy {
   /// doesn't actually have 'bool', because, e.g., it is defined as a macro).
   unsigned Bool : 1;
 
+  /// Whether we should use 'nullptr' rather than '0' as a null pointer
+  /// constant.
+  unsigned Nullptr : 1;
+
   /// Whether we can use 'restrict' rather than '__restrict'.
   unsigned Restrict : 1;
 

diff  --git a/clang/lib/AST/APValue.cpp b/clang/lib/AST/APValue.cpp
index 266421ce82e3..f8df221f5705 100644
--- a/clang/lib/AST/APValue.cpp
+++ b/clang/lib/AST/APValue.cpp
@@ -620,6 +620,11 @@ static double GetApproxValue(const llvm::APFloat &F) {
 
 void APValue::printPretty(raw_ostream &Out, const ASTContext &Ctx,
                           QualType Ty) const {
+  printPretty(Out, Ctx.getPrintingPolicy(), Ty, &Ctx);
+}
+
+void APValue::printPretty(raw_ostream &Out, const PrintingPolicy &Policy,
+                          QualType Ty, const ASTContext *Ctx) const {
   // There are no objects of type 'void', but values of this type can be
   // returned from functions.
   if (Ty->isVoidType()) {
@@ -649,10 +654,10 @@ void APValue::printPretty(raw_ostream &Out, const ASTContext &Ctx,
   case APValue::Vector: {
     Out << '{';
     QualType ElemTy = Ty->castAs<VectorType>()->getElementType();
-    getVectorElt(0).printPretty(Out, Ctx, ElemTy);
+    getVectorElt(0).printPretty(Out, Policy, ElemTy, Ctx);
     for (unsigned i = 1; i != getVectorLength(); ++i) {
       Out << ", ";
-      getVectorElt(i).printPretty(Out, Ctx, ElemTy);
+      getVectorElt(i).printPretty(Out, Policy, ElemTy, Ctx);
     }
     Out << '}';
     return;
@@ -674,12 +679,12 @@ void APValue::printPretty(raw_ostream &Out, const ASTContext &Ctx,
     LValueBase Base = getLValueBase();
     if (!Base) {
       if (isNullPointer()) {
-        Out << (Ctx.getLangOpts().CPlusPlus11 ? "nullptr" : "0");
+        Out << (Policy.Nullptr ? "nullptr" : "0");
       } else if (IsReference) {
-        Out << "*(" << InnerTy.stream(Ctx.getPrintingPolicy()) << "*)"
+        Out << "*(" << InnerTy.stream(Policy) << "*)"
             << getLValueOffset().getQuantity();
       } else {
-        Out << "(" << Ty.stream(Ctx.getPrintingPolicy()) << ")"
+        Out << "(" << Ty.stream(Policy) << ")"
             << getLValueOffset().getQuantity();
       }
       return;
@@ -688,11 +693,11 @@ void APValue::printPretty(raw_ostream &Out, const ASTContext &Ctx,
     if (!hasLValuePath()) {
       // No lvalue path: just print the offset.
       CharUnits O = getLValueOffset();
-      CharUnits S = Ctx.getTypeSizeInChars(InnerTy);
+      CharUnits S = Ctx ? Ctx->getTypeSizeInChars(InnerTy) : CharUnits::Zero();
       if (!O.isZero()) {
         if (IsReference)
           Out << "*(";
-        if (O % S) {
+        if (S.isZero() || O % S) {
           Out << "(char*)";
           S = CharUnits::One();
         }
@@ -704,16 +709,15 @@ void APValue::printPretty(raw_ostream &Out, const ASTContext &Ctx,
       if (const ValueDecl *VD = Base.dyn_cast<const ValueDecl*>())
         Out << *VD;
       else if (TypeInfoLValue TI = Base.dyn_cast<TypeInfoLValue>()) {
-        TI.print(Out, Ctx.getPrintingPolicy());
+        TI.print(Out, Policy);
       } else if (DynamicAllocLValue DA = Base.dyn_cast<DynamicAllocLValue>()) {
         Out << "{*new "
-            << Base.getDynamicAllocType().stream(Ctx.getPrintingPolicy()) << "#"
+            << Base.getDynamicAllocType().stream(Policy) << "#"
             << DA.getIndex() << "}";
       } else {
         assert(Base.get<const Expr *>() != nullptr &&
                "Expecting non-null Expr");
-        Base.get<const Expr*>()->printPretty(Out, nullptr,
-                                             Ctx.getPrintingPolicy());
+        Base.get<const Expr*>()->printPretty(Out, nullptr, Policy);
       }
 
       if (!O.isZero()) {
@@ -734,15 +738,14 @@ void APValue::printPretty(raw_ostream &Out, const ASTContext &Ctx,
     if (const ValueDecl *VD = Base.dyn_cast<const ValueDecl*>()) {
       Out << *VD;
     } else if (TypeInfoLValue TI = Base.dyn_cast<TypeInfoLValue>()) {
-      TI.print(Out, Ctx.getPrintingPolicy());
+      TI.print(Out, Policy);
     } else if (DynamicAllocLValue DA = Base.dyn_cast<DynamicAllocLValue>()) {
-      Out << "{*new "
-          << Base.getDynamicAllocType().stream(Ctx.getPrintingPolicy()) << "#"
+      Out << "{*new " << Base.getDynamicAllocType().stream(Policy) << "#"
           << DA.getIndex() << "}";
     } else {
       const Expr *E = Base.get<const Expr*>();
       assert(E != nullptr && "Expecting non-null Expr");
-      E->printPretty(Out, nullptr, Ctx.getPrintingPolicy());
+      E->printPretty(Out, nullptr, Policy);
     }
 
     ArrayRef<LValuePathEntry> Path = getLValuePath();
@@ -754,7 +757,8 @@ void APValue::printPretty(raw_ostream &Out, const ASTContext &Ctx,
         const Decl *BaseOrMember = Path[I].getAsBaseOrMember().getPointer();
         if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(BaseOrMember)) {
           CastToBase = RD;
-          ElemTy = Ctx.getRecordType(RD);
+          // Leave ElemTy referring to the most-derived class. The actual type
+          // doesn't matter except for array types.
         } else {
           const ValueDecl *VD = cast<ValueDecl>(BaseOrMember);
           Out << ".";
@@ -766,7 +770,7 @@ void APValue::printPretty(raw_ostream &Out, const ASTContext &Ctx,
       } else {
         // The lvalue must refer to an array.
         Out << '[' << Path[I].getAsArrayIndex() << ']';
-        ElemTy = Ctx.getAsArrayType(ElemTy)->getElementType();
+        ElemTy = ElemTy->castAsArrayTypeUnsafe()->getElementType();
       }
     }
 
@@ -781,11 +785,11 @@ void APValue::printPretty(raw_ostream &Out, const ASTContext &Ctx,
     return;
   }
   case APValue::Array: {
-    const ArrayType *AT = Ctx.getAsArrayType(Ty);
+    const ArrayType *AT = Ty->castAsArrayTypeUnsafe();
     QualType ElemTy = AT->getElementType();
     Out << '{';
     if (unsigned N = getArrayInitializedElts()) {
-      getArrayInitializedElt(0).printPretty(Out, Ctx, ElemTy);
+      getArrayInitializedElt(0).printPretty(Out, Policy, ElemTy, Ctx);
       for (unsigned I = 1; I != N; ++I) {
         Out << ", ";
         if (I == 10) {
@@ -793,7 +797,7 @@ void APValue::printPretty(raw_ostream &Out, const ASTContext &Ctx,
           Out << "...";
           break;
         }
-        getArrayInitializedElt(I).printPretty(Out, Ctx, ElemTy);
+        getArrayInitializedElt(I).printPretty(Out, Policy, ElemTy, Ctx);
       }
     }
     Out << '}';
@@ -810,7 +814,7 @@ void APValue::printPretty(raw_ostream &Out, const ASTContext &Ctx,
         assert(BI != CD->bases_end());
         if (!First)
           Out << ", ";
-        getStructBase(I).printPretty(Out, Ctx, BI->getType());
+        getStructBase(I).printPretty(Out, Policy, BI->getType(), Ctx);
         First = false;
       }
     }
@@ -819,7 +823,7 @@ void APValue::printPretty(raw_ostream &Out, const ASTContext &Ctx,
         Out << ", ";
       if (FI->isUnnamedBitfield()) continue;
       getStructField(FI->getFieldIndex()).
-        printPretty(Out, Ctx, FI->getType());
+        printPretty(Out, Policy, FI->getType(), Ctx);
       First = false;
     }
     Out << '}';
@@ -829,7 +833,7 @@ void APValue::printPretty(raw_ostream &Out, const ASTContext &Ctx,
     Out << '{';
     if (const FieldDecl *FD = getUnionField()) {
       Out << "." << *FD << " = ";
-      getUnionValue().printPretty(Out, Ctx, FD->getType());
+      getUnionValue().printPretty(Out, Policy, FD->getType(), Ctx);
     }
     Out << '}';
     return;


        


More information about the cfe-commits mailing list