xref: /llvm-project/clang/unittests/AST/ConceptPrinterTest.cpp (revision 099c1527f6088305fc253e9598685faa85544a8e)
1*099c1527SHaojian Wu //===- unittests/AST/ConceptPrinterTest.cpp --- Concept printer tests -----===//
2*099c1527SHaojian Wu //
3*099c1527SHaojian Wu // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*099c1527SHaojian Wu // See https://llvm.org/LICENSE.txt for license information.
5*099c1527SHaojian Wu // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*099c1527SHaojian Wu //
7*099c1527SHaojian Wu //===----------------------------------------------------------------------===//
8*099c1527SHaojian Wu 
9*099c1527SHaojian Wu #include "ASTPrint.h"
10*099c1527SHaojian Wu #include "clang/AST/ASTConcept.h"
11*099c1527SHaojian Wu #include "clang/AST/ASTContext.h"
12*099c1527SHaojian Wu #include "clang/AST/ExprConcepts.h"
13*099c1527SHaojian Wu #include "clang/ASTMatchers/ASTMatchFinder.h"
14*099c1527SHaojian Wu #include "clang/Tooling/Tooling.h"
15*099c1527SHaojian Wu #include "llvm/ADT/SmallString.h"
16*099c1527SHaojian Wu #include "gtest/gtest.h"
17*099c1527SHaojian Wu 
18*099c1527SHaojian Wu using namespace clang;
19*099c1527SHaojian Wu using namespace ast_matchers;
20*099c1527SHaojian Wu using namespace tooling;
21*099c1527SHaojian Wu 
22*099c1527SHaojian Wu namespace {
23*099c1527SHaojian Wu 
PrintConceptReference(raw_ostream & Out,const ASTContext * Context,const ConceptSpecializationExpr * T,PrintingPolicyAdjuster PolicyAdjuster)24*099c1527SHaojian Wu static void PrintConceptReference(raw_ostream &Out, const ASTContext *Context,
25*099c1527SHaojian Wu                                   const ConceptSpecializationExpr *T,
26*099c1527SHaojian Wu                                   PrintingPolicyAdjuster PolicyAdjuster) {
27*099c1527SHaojian Wu   assert(T && T->getConceptReference() &&
28*099c1527SHaojian Wu          "Expected non-null concept reference");
29*099c1527SHaojian Wu 
30*099c1527SHaojian Wu   PrintingPolicy Policy = Context->getPrintingPolicy();
31*099c1527SHaojian Wu   if (PolicyAdjuster)
32*099c1527SHaojian Wu     PolicyAdjuster(Policy);
33*099c1527SHaojian Wu   T->getConceptReference()->print(Out, Policy);
34*099c1527SHaojian Wu }
35*099c1527SHaojian Wu 
36*099c1527SHaojian Wu ::testing::AssertionResult
PrintedConceptMatches(StringRef Code,const std::vector<std::string> & Args,const StatementMatcher & NodeMatch,StringRef ExpectedPrinted)37*099c1527SHaojian Wu PrintedConceptMatches(StringRef Code, const std::vector<std::string> &Args,
38*099c1527SHaojian Wu                       const StatementMatcher &NodeMatch,
39*099c1527SHaojian Wu                       StringRef ExpectedPrinted) {
40*099c1527SHaojian Wu   return PrintedNodeMatches<ConceptSpecializationExpr>(
41*099c1527SHaojian Wu       Code, Args, NodeMatch, ExpectedPrinted, "", PrintConceptReference);
42*099c1527SHaojian Wu }
43*099c1527SHaojian Wu const internal::VariadicDynCastAllOfMatcher<Stmt, ConceptSpecializationExpr>
44*099c1527SHaojian Wu     conceptSpecializationExpr;
45*099c1527SHaojian Wu } // unnamed namespace
46*099c1527SHaojian Wu 
TEST(ConceptPrinter,ConceptReference)47*099c1527SHaojian Wu TEST(ConceptPrinter, ConceptReference) {
48*099c1527SHaojian Wu   std::string Code = R"cpp(
49*099c1527SHaojian Wu     template <typename, typename> concept D = true;
50*099c1527SHaojian Wu     template<typename T, typename U>
51*099c1527SHaojian Wu     requires D<T, U>
52*099c1527SHaojian Wu     void g(T);
53*099c1527SHaojian Wu   )cpp";
54*099c1527SHaojian Wu   auto Matcher = conceptSpecializationExpr().bind("id");
55*099c1527SHaojian Wu 
56*099c1527SHaojian Wu   ASSERT_TRUE(PrintedConceptMatches(Code, {"-std=c++20"}, Matcher, "D<T, U>"));
57*099c1527SHaojian Wu }
58