Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[AST] Print the separator "," for template arguments in ConceptReference::print #91750

Merged
merged 2 commits into from
May 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion clang/lib/AST/ASTConcept.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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 << ">";
}
}
1 change: 1 addition & 0 deletions clang/unittests/AST/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ add_clang_unittest(ASTTests
CommentLexer.cpp
CommentParser.cpp
CommentTextTest.cpp
ConceptPrinterTest.cpp
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note: we probably want to update the gn build as well: https://github.com/llvm/llvm-project/tree/main/llvm/utils/gn

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done (we're not required to update gn build files, and there's a bot that can automate the porting).

DataCollectionTest.cpp
DeclPrinterTest.cpp
DeclTest.cpp
Expand Down
57 changes: 57 additions & 0 deletions clang/unittests/AST/ConceptPrinterTest.cpp
Original file line number Diff line number Diff line change
@@ -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>"));
}
1 change: 1 addition & 0 deletions llvm/utils/gn/secondary/clang/unittests/AST/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ unittest("ASTTests") {
"CommentLexer.cpp",
"CommentParser.cpp",
"CommentTextTest.cpp",
"ConceptPrinterTest.cpp",
"DataCollectionTest.cpp",
"DeclPrinterTest.cpp",
"DeclTest.cpp",
Expand Down
Loading