diff --git a/clang-tools-extra/clangd/unittests/HoverTests.cpp b/clang-tools-extra/clangd/unittests/HoverTests.cpp --- a/clang-tools-extra/clangd/unittests/HoverTests.cpp +++ b/clang-tools-extra/clangd/unittests/HoverTests.cpp @@ -523,7 +523,7 @@ )cpp", [](HoverInfo &HI) { HI.Name = "result"; - HI.Definition = "static constexpr int result = 1 + 2"; + HI.Definition = "static constexpr int result = a + b"; HI.Kind = index::SymbolKind::StaticProperty; HI.Type = "const int"; HI.NamespaceScope = ""; diff --git a/clang/lib/AST/DeclPrinter.cpp b/clang/lib/AST/DeclPrinter.cpp --- a/clang/lib/AST/DeclPrinter.cpp +++ b/clang/lib/AST/DeclPrinter.cpp @@ -341,7 +341,8 @@ SimpleInit = Init; if (SimpleInit) - SimpleInit->printPretty(Out, nullptr, Policy, Indentation); + SimpleInit->printPretty(Out, nullptr, Policy, Indentation, "\n", + &Context); else { for (unsigned I = 0; I != NumArgs; ++I) { assert(Args[I] != nullptr && "Expected non-null Expr"); @@ -350,7 +351,8 @@ if (I) Out << ", "; - Args[I]->printPretty(Out, nullptr, Policy, Indentation); + Args[I]->printPretty(Out, nullptr, Policy, Indentation, "\n", + &Context); } } } @@ -568,13 +570,14 @@ } static void printExplicitSpecifier(ExplicitSpecifier ES, llvm::raw_ostream &Out, - PrintingPolicy &Policy, - unsigned Indentation) { + PrintingPolicy &Policy, unsigned Indentation, + const ASTContext &Context) { std::string Proto = "explicit"; llvm::raw_string_ostream EOut(Proto); if (ES.getExpr()) { EOut << "("; - ES.getExpr()->printPretty(EOut, nullptr, Policy, Indentation); + ES.getExpr()->printPretty(EOut, nullptr, Policy, Indentation, "\n", + &Context); EOut << ")"; } EOut << " "; @@ -616,7 +619,7 @@ if (D->isConsteval()) Out << "consteval "; ExplicitSpecifier ExplicitSpec = ExplicitSpecifier::getFromDecl(D); if (ExplicitSpec.isSpecified()) - printExplicitSpecifier(ExplicitSpec, Out, Policy, Indentation); + printExplicitSpecifier(ExplicitSpec, Out, Policy, Indentation, Context); } PrintingPolicy SubPolicy(Policy); @@ -720,7 +723,7 @@ Proto += "("; llvm::raw_string_ostream EOut(Proto); FT->getNoexceptExpr()->printPretty(EOut, nullptr, SubPolicy, - Indentation); + Indentation, "\n", &Context); EOut.flush(); Proto += EOut.str(); Proto += ")"; @@ -744,7 +747,8 @@ if (Expr *TrailingRequiresClause = D->getTrailingRequiresClause()) { Out << " requires "; - TrailingRequiresClause->printPretty(Out, nullptr, SubPolicy, Indentation); + TrailingRequiresClause->printPretty(Out, nullptr, SubPolicy, Indentation, + "\n", &Context); } } else { Ty.print(Out, Policy, Proto); @@ -776,7 +780,8 @@ Out << ' '; if (D->getBody()) - D->getBody()->printPretty(Out, nullptr, SubPolicy, Indentation); + D->getBody()->printPretty(Out, nullptr, SubPolicy, Indentation, "\n", + &Context); } else { if (!Policy.TerseOutput && isa(*D)) Out << " {}"; @@ -821,7 +826,8 @@ if (D->isBitField()) { Out << " : "; - D->getBitWidth()->printPretty(Out, nullptr, Policy, Indentation); + D->getBitWidth()->printPretty(Out, nullptr, Policy, Indentation, "\n", + &Context); } Expr *Init = D->getInClassInitializer(); @@ -830,7 +836,7 @@ Out << " "; else Out << " = "; - Init->printPretty(Out, nullptr, Policy, Indentation); + Init->printPretty(Out, nullptr, Policy, Indentation, "\n", &Context); } prettyPrintAttributes(D); } @@ -895,7 +901,7 @@ PrintingPolicy SubPolicy(Policy); SubPolicy.SuppressSpecifiers = false; SubPolicy.IncludeTagDefinition = false; - Init->printPretty(Out, nullptr, SubPolicy, Indentation); + Init->printPretty(Out, nullptr, SubPolicy, Indentation, "\n", &Context); if ((D->getInitStyle() == VarDecl::CallInit) && !isa(Init)) Out << ")"; } @@ -909,7 +915,8 @@ void DeclPrinter::VisitFileScopeAsmDecl(FileScopeAsmDecl *D) { Out << "__asm ("; - D->getAsmString()->printPretty(Out, nullptr, Policy, Indentation); + D->getAsmString()->printPretty(Out, nullptr, Policy, Indentation, "\n", + &Context); Out << ")"; } @@ -920,10 +927,11 @@ void DeclPrinter::VisitStaticAssertDecl(StaticAssertDecl *D) { Out << "static_assert("; - D->getAssertExpr()->printPretty(Out, nullptr, Policy, Indentation); + D->getAssertExpr()->printPretty(Out, nullptr, Policy, Indentation, "\n", + &Context); if (StringLiteral *SL = D->getMessage()) { Out << ", "; - SL->printPretty(Out, nullptr, Policy, Indentation); + SL->printPretty(Out, nullptr, Policy, Indentation, "\n", &Context); } Out << ")"; } @@ -1110,8 +1118,8 @@ Visit(TD); else if (const auto *Concept = dyn_cast(D)) { Out << "concept " << Concept->getName() << " = " ; - Concept->getConstraintExpr()->printPretty(Out, nullptr, Policy, - Indentation); + Concept->getConstraintExpr()->printPretty(Out, nullptr, Policy, Indentation, + "\n", &Context); Out << ";"; } } @@ -1271,7 +1279,8 @@ if (OMD->getBody() && !Policy.TerseOutput) { Out << ' '; - OMD->getBody()->printPretty(Out, nullptr, Policy); + OMD->getBody()->printPretty(Out, nullptr, Policy, Indentation, "\n", + &Context); } else if (Policy.PolishForDeclaration) Out << ';'; @@ -1651,7 +1660,7 @@ Out << " : "; D->getType().print(Out, Policy); Out << " : "; - D->getCombiner()->printPretty(Out, nullptr, Policy, 0); + D->getCombiner()->printPretty(Out, nullptr, Policy, 0, "\n", &Context); Out << ")"; if (auto *Init = D->getInitializer()) { Out << " initializer("; @@ -1665,7 +1674,7 @@ case OMPDeclareReductionDecl::CallInit: break; } - Init->printPretty(Out, nullptr, Policy, 0); + Init->printPretty(Out, nullptr, Policy, 0, "\n", &Context); if (D->getInitializerKind() == OMPDeclareReductionDecl::DirectInit) Out << ")"; Out << ")"; @@ -1693,7 +1702,7 @@ } void DeclPrinter::VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D) { - D->getInit()->printPretty(Out, nullptr, Policy, Indentation); + D->getInit()->printPretty(Out, nullptr, Policy, Indentation, "\n", &Context); } void DeclPrinter::VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *TTP) { @@ -1727,6 +1736,7 @@ if (NTTP->hasDefaultArgument()) { Out << " = "; - NTTP->getDefaultArgument()->printPretty(Out, nullptr, Policy, Indentation); + NTTP->getDefaultArgument()->printPretty(Out, nullptr, Policy, Indentation, + "\n", &Context); } } diff --git a/clang/unittests/AST/DeclPrinterTest.cpp b/clang/unittests/AST/DeclPrinterTest.cpp --- a/clang/unittests/AST/DeclPrinterTest.cpp +++ b/clang/unittests/AST/DeclPrinterTest.cpp @@ -20,6 +20,7 @@ #include "clang/AST/ASTContext.h" #include "clang/ASTMatchers/ASTMatchFinder.h" +#include "clang/ASTMatchers/ASTMatchers.h" #include "clang/Tooling/Tooling.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringRef.h" @@ -1438,3 +1439,11 @@ namedDecl(hasName("Extension")).bind("id"), "@implementation <>(Extension)\n@end", /*AllowError=*/true)); } + +TEST(DeclPrinter, VarDeclWithInitializer) { + ASSERT_TRUE(PrintedDeclCXX17Matches( + "int a = 0x15;", namedDecl(hasName("a")).bind("id"), "int a = 21")); + ASSERT_TRUE(PrintedDeclCXX17Matches( + "int a = 0x15;", namedDecl(hasName("a")).bind("id"), "int a = 0x15", + [](PrintingPolicy &Policy) { Policy.ConstantsAsWritten = true; })); +}