Index: include/clang/AST/QualTypeNames.h =================================================================== --- include/clang/AST/QualTypeNames.h +++ include/clang/AST/QualTypeNames.h @@ -72,6 +72,7 @@ /// \param[in] WithGlobalNsPrefix - If true, then the global namespace /// specifier "::" will be prepended to the fully qualified name. std::string getFullyQualifiedName(QualType QT, const ASTContext &Ctx, + const PrintingPolicy &Policy, bool WithGlobalNsPrefix = false); /// \brief Generates a QualType that can be used to name the same type Index: lib/AST/QualTypeNames.cpp =================================================================== --- lib/AST/QualTypeNames.cpp +++ lib/AST/QualTypeNames.cpp @@ -450,14 +450,9 @@ return QT; } -std::string getFullyQualifiedName(QualType QT, - const ASTContext &Ctx, +std::string getFullyQualifiedName(QualType QT, const ASTContext &Ctx, + const PrintingPolicy &Policy, bool WithGlobalNsPrefix) { - PrintingPolicy Policy(Ctx.getPrintingPolicy()); - Policy.SuppressScope = false; - Policy.AnonymousTagLocations = false; - Policy.PolishForDeclaration = true; - Policy.SuppressUnwrittenScope = true; QualType FQQT = getFullyQualifiedType(QT, Ctx, WithGlobalNsPrefix); return FQQT.getAsString(Policy); } Index: unittests/Tooling/QualTypeNamesTest.cpp =================================================================== --- unittests/Tooling/QualTypeNamesTest.cpp +++ unittests/Tooling/QualTypeNamesTest.cpp @@ -26,9 +26,13 @@ std::string ExpectedName = ExpectedQualTypeNames.lookup(VD->getNameAsString()); if (ExpectedName != "") { - std::string ActualName = - TypeName::getFullyQualifiedName(VD->getType(), *Context, - WithGlobalNsPrefix); + PrintingPolicy Policy(Context->getPrintingPolicy()); + Policy.SuppressScope = false; + Policy.AnonymousTagLocations = true; + Policy.PolishForDeclaration = true; + Policy.SuppressUnwrittenScope = true; + std::string ActualName = TypeName::getFullyQualifiedName( + VD->getType(), *Context, Policy, WithGlobalNsPrefix); if (ExpectedName != ActualName) { // A custom message makes it much easier to see what declaration // failed compared to EXPECT_EQ. @@ -217,6 +221,26 @@ " }\n" "}\n" ); + + TypeNameVisitor PrintingPolicy; + PrintingPolicy.ExpectedQualTypeNames["a"] = "short"; + PrintingPolicy.ExpectedQualTypeNames["un_in_st_1"] = + "union (anonymous struct at input.cc:1:1)::(anonymous union at " + "input.cc:2:31)"; + PrintingPolicy.ExpectedQualTypeNames["b"] = "short"; + PrintingPolicy.ExpectedQualTypeNames["un_in_st_2"] = + "union (anonymous struct at input.cc:1:1)::(anonymous union at " + "input.cc:5:31)"; + PrintingPolicy.ExpectedQualTypeNames["anon_st"] = + "struct (anonymous struct at input.cc:1:1)"; + PrintingPolicy.runOver(R"(struct { + union { + short a; + } un_in_st_1; + union { + short b; + } un_in_st_2; + } anon_st;)"); } } // end anonymous namespace