[clang] [AST] Print the separator "," for template arguments in ConceptReference::print (PR #91750)
Haojian Wu via cfe-commits
cfe-commits at lists.llvm.org
Fri May 10 07:35:02 PDT 2024
https://github.com/hokein created https://github.com/llvm/llvm-project/pull/91750
None
>From e7b23e02e9b4c98d9e24dd1debcdefada7a16004 Mon Sep 17 00:00:00 2001
From: Haojian Wu <hokein.wu at gmail.com>
Date: Fri, 10 May 2024 16:31:20 +0200
Subject: [PATCH] [AST] Print the separator , for template arguments in
ConceptReference::print
---
clang/lib/AST/ASTConcept.cpp | 8 ++-
clang/unittests/AST/CMakeLists.txt | 1 +
clang/unittests/AST/ConceptPrinterTest.cpp | 57 ++++++++++++++++++++++
3 files changed, 65 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 b3ec99448b3e1..6bef68fc87eea 100644
--- a/clang/lib/AST/ASTConcept.cpp
+++ b/clang/lib/AST/ASTConcept.cpp
@@ -106,9 +106,15 @@ void ConceptReference::print(llvm::raw_ostream &OS,
ConceptName.printName(OS, Policy);
if (hasExplicitTemplateArgs()) {
OS << "<";
+ bool First = true;
// FIXME: Find corresponding parameter for argument
- for (auto &ArgLoc : ArgsAsWritten->arguments())
+ for (auto &ArgLoc : ArgsAsWritten->arguments()) {
+ if (First)
+ First = false;
+ else
+ OS << ", ";
ArgLoc.getArgument().print(Policy, OS, /*IncludeType*/ false);
+ }
OS << ">";
}
}
diff --git a/clang/unittests/AST/CMakeLists.txt b/clang/unittests/AST/CMakeLists.txt
index 54765e36db008..29d2b39cff8b1 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 0000000000000..bd1f6bbfa5658
--- /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<std::string> &Args,
+ const StatementMatcher &NodeMatch,
+ StringRef ExpectedPrinted) {
+ return PrintedNodeMatches<ConceptSpecializationExpr>(
+ Code, Args, NodeMatch, ExpectedPrinted, "", PrintConceptReference);
+}
+const internal::VariadicDynCastAllOfMatcher<Stmt, ConceptSpecializationExpr>
+ conceptSpecializationExpr;
+} // unnamed namespace
+
+TEST(ConceptPrinter, ConceptReference) {
+ std::string Code = R"cpp(
+ template <typename, typename> concept D = true;
+ template<typename T, typename U>
+ requires D<T, U>
+ void g(T);
+ )cpp";
+ auto Matcher = conceptSpecializationExpr().bind("id");
+
+ ASSERT_TRUE(PrintedConceptMatches(Code, {"-std=c++20"}, Matcher, "D<T, U>"));
+}
More information about the cfe-commits
mailing list