[AST] Print the separator "," for template arguments in ConceptReference::print (#91750)
This commit is contained in:
parent
ef71c79d85
commit
099c1527f6
@ -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 << ">";
|
||||
}
|
||||
}
|
||||
|
@ -24,6 +24,7 @@ add_clang_unittest(ASTTests
|
||||
CommentLexer.cpp
|
||||
CommentParser.cpp
|
||||
CommentTextTest.cpp
|
||||
ConceptPrinterTest.cpp
|
||||
DataCollectionTest.cpp
|
||||
DeclPrinterTest.cpp
|
||||
DeclTest.cpp
|
||||
|
57
clang/unittests/AST/ConceptPrinterTest.cpp
Normal file
57
clang/unittests/AST/ConceptPrinterTest.cpp
Normal file
@ -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>"));
|
||||
}
|
@ -32,6 +32,7 @@ unittest("ASTTests") {
|
||||
"CommentLexer.cpp",
|
||||
"CommentParser.cpp",
|
||||
"CommentTextTest.cpp",
|
||||
"ConceptPrinterTest.cpp",
|
||||
"DataCollectionTest.cpp",
|
||||
"DeclPrinterTest.cpp",
|
||||
"DeclTest.cpp",
|
||||
|
Loading…
x
Reference in New Issue
Block a user