From 099c1527f6088305fc253e9598685faa85544a8e Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Fri, 10 May 2024 18:13:47 +0200 Subject: [PATCH] [AST] Print the separator "," for template arguments in ConceptReference::print (#91750) --- clang/lib/AST/ASTConcept.cpp | 6 +- clang/unittests/AST/CMakeLists.txt | 1 + clang/unittests/AST/ConceptPrinterTest.cpp | 57 +++++++++++++++++++ .../gn/secondary/clang/unittests/AST/BUILD.gn | 1 + 4 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 clang/unittests/AST/ConceptPrinterTest.cpp diff --git a/clang/lib/AST/ASTConcept.cpp b/clang/lib/AST/ASTConcept.cpp index b3ec99448b3e13..0387fc9f6aec2d 100644 --- a/clang/lib/AST/ASTConcept.cpp +++ b/clang/lib/AST/ASTConcept.cpp @@ -15,6 +15,7 @@ #include "clang/AST/ASTContext.h" #include "clang/AST/PrettyPrinter.h" #include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/StringExtras.h" using namespace clang; @@ -106,9 +107,12 @@ void ConceptReference::print(llvm::raw_ostream &OS, ConceptName.printName(OS, Policy); if (hasExplicitTemplateArgs()) { OS << "<"; + llvm::ListSeparator Sep(", "); // FIXME: Find corresponding parameter for argument - for (auto &ArgLoc : ArgsAsWritten->arguments()) + for (auto &ArgLoc : ArgsAsWritten->arguments()) { + OS << Sep; ArgLoc.getArgument().print(Policy, OS, /*IncludeType*/ false); + } OS << ">"; } } diff --git a/clang/unittests/AST/CMakeLists.txt b/clang/unittests/AST/CMakeLists.txt index 54765e36db008b..29d2b39cff8b15 100644 --- a/clang/unittests/AST/CMakeLists.txt +++ b/clang/unittests/AST/CMakeLists.txt @@ -24,6 +24,7 @@ add_clang_unittest(ASTTests CommentLexer.cpp CommentParser.cpp CommentTextTest.cpp + ConceptPrinterTest.cpp DataCollectionTest.cpp DeclPrinterTest.cpp DeclTest.cpp diff --git a/clang/unittests/AST/ConceptPrinterTest.cpp b/clang/unittests/AST/ConceptPrinterTest.cpp new file mode 100644 index 00000000000000..bd1f6bbfa5658e --- /dev/null +++ b/clang/unittests/AST/ConceptPrinterTest.cpp @@ -0,0 +1,57 @@ +//===- unittests/AST/ConceptPrinterTest.cpp --- Concept printer tests -----===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "ASTPrint.h" +#include "clang/AST/ASTConcept.h" +#include "clang/AST/ASTContext.h" +#include "clang/AST/ExprConcepts.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" +#include "clang/Tooling/Tooling.h" +#include "llvm/ADT/SmallString.h" +#include "gtest/gtest.h" + +using namespace clang; +using namespace ast_matchers; +using namespace tooling; + +namespace { + +static void PrintConceptReference(raw_ostream &Out, const ASTContext *Context, + const ConceptSpecializationExpr *T, + PrintingPolicyAdjuster PolicyAdjuster) { + assert(T && T->getConceptReference() && + "Expected non-null concept reference"); + + PrintingPolicy Policy = Context->getPrintingPolicy(); + if (PolicyAdjuster) + PolicyAdjuster(Policy); + T->getConceptReference()->print(Out, Policy); +} + +::testing::AssertionResult +PrintedConceptMatches(StringRef Code, const std::vector &Args, + const StatementMatcher &NodeMatch, + StringRef ExpectedPrinted) { + return PrintedNodeMatches( + Code, Args, NodeMatch, ExpectedPrinted, "", PrintConceptReference); +} +const internal::VariadicDynCastAllOfMatcher + conceptSpecializationExpr; +} // unnamed namespace + +TEST(ConceptPrinter, ConceptReference) { + std::string Code = R"cpp( + template concept D = true; + template + requires D + void g(T); + )cpp"; + auto Matcher = conceptSpecializationExpr().bind("id"); + + ASSERT_TRUE(PrintedConceptMatches(Code, {"-std=c++20"}, Matcher, "D")); +} diff --git a/llvm/utils/gn/secondary/clang/unittests/AST/BUILD.gn b/llvm/utils/gn/secondary/clang/unittests/AST/BUILD.gn index 1fb3d621275ed7..f66e86ad938bdd 100644 --- a/llvm/utils/gn/secondary/clang/unittests/AST/BUILD.gn +++ b/llvm/utils/gn/secondary/clang/unittests/AST/BUILD.gn @@ -32,6 +32,7 @@ unittest("ASTTests") { "CommentLexer.cpp", "CommentParser.cpp", "CommentTextTest.cpp", + "ConceptPrinterTest.cpp", "DataCollectionTest.cpp", "DeclPrinterTest.cpp", "DeclTest.cpp",