//===- unittest/Tooling/RecursiveASTVisitorTests/DeductionGuide.cpp -------===// // // 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 "TestVisitor.h" #include using namespace clang; namespace { class DeductionGuideVisitor : public ExpectedLocationVisitor { public: DeductionGuideVisitor(bool VisitImplicitCode) { ShouldVisitImplicitCode = VisitImplicitCode; ShouldVisitTemplateInstantiations = false; } bool VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *D) override { std::string Storage; llvm::raw_string_ostream Stream(Storage); D->print(Stream); Match(Storage, D->getLocation()); return true; } }; TEST(RecursiveASTVisitor, DeductionGuideNonImplicitMode) { DeductionGuideVisitor Visitor(/*ShouldVisitImplicitCode*/ false); // Verify that the synthezied deduction guide for alias is not visited in // RAV's implicit mode. Visitor.ExpectMatch("Foo(T) -> Foo", 11, 1); Visitor.DisallowMatch("Bar(T) -> Foo", 14, 1); EXPECT_TRUE(Visitor.runOver( R"cpp( template concept False = true; template struct Foo { Foo(T); }; template requires False Foo(T) -> Foo; template using Bar = Foo; Bar s(1); )cpp", DeductionGuideVisitor::Lang_CXX2a)); } TEST(RecursiveASTVisitor, DeductionGuideImplicitMode) { DeductionGuideVisitor Visitor(/*ShouldVisitImplicitCode*/ true); Visitor.ExpectMatch("Foo(T) -> Foo", 11, 1); Visitor.ExpectMatch("Bar(T) -> Foo", 14, 1); EXPECT_TRUE(Visitor.runOver( R"cpp( template concept False = true; template struct Foo { Foo(T); }; template requires False Foo(T) -> Foo; template using Bar = Foo; Bar s(1); )cpp", DeductionGuideVisitor::Lang_CXX2a)); } } // end anonymous namespace