nridge updated this revision to Diff 282807. nridge added a comment. Rebase on top of D85108 <https://reviews.llvm.org/D85108>
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D84136/new/ https://reviews.llvm.org/D84136 Files: clang-tools-extra/clangd/unittests/FindTargetTests.cpp clang/include/clang/AST/RecursiveASTVisitor.h clang/unittests/Tooling/CMakeLists.txt clang/unittests/Tooling/RecursiveASTVisitorTests/Concept.cpp
Index: clang/unittests/Tooling/RecursiveASTVisitorTests/Concept.cpp =================================================================== --- /dev/null +++ clang/unittests/Tooling/RecursiveASTVisitorTests/Concept.cpp @@ -0,0 +1,45 @@ +//===- unittest/Tooling/RecursiveASTVisitorTests/Concept.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 "clang/AST/ExprConcepts.h" + +using namespace clang; + +namespace { + +struct ConceptVisitor : ExpectedLocationVisitor<ConceptVisitor> { + bool VisitConceptSpecializationExpr(ConceptSpecializationExpr *E) { + ++ConceptSpecializationExprsVisited; + return true; + } + bool TraverseConceptReference(const ConceptReference &R) { + ++ConceptReferencesTraversed; + return true; + } + + int ConceptSpecializationExprsVisited = 0; + int ConceptReferencesTraversed = 0; +}; + +TEST(RecursiveASTVisitor, ConstrainedParameter) { + ConceptVisitor Visitor; + EXPECT_TRUE(Visitor.runOver("template <typename T> concept Fooable = true;\n" + "template <Fooable T> void bar(T);", + ConceptVisitor::Lang_CXX2a)); + // Check that we visit the "Fooable T" template parameter's TypeConstraint's + // ImmediatelyDeclaredConstraint, which is a ConceptSpecializationExpr. + EXPECT_EQ(1, Visitor.ConceptSpecializationExprsVisited); + // There are two ConceptReference objects in the AST: the base subobject + // of the ConceptSpecializationExpr, and the base subobject of the + // TypeConstraint itself. Check that we traverse both. + EXPECT_EQ(2, Visitor.ConceptReferencesTraversed); +} + +} // end anonymous namespace Index: clang/unittests/Tooling/CMakeLists.txt =================================================================== --- clang/unittests/Tooling/CMakeLists.txt +++ clang/unittests/Tooling/CMakeLists.txt @@ -30,6 +30,7 @@ RecursiveASTVisitorTests/Attr.cpp RecursiveASTVisitorTests/Callbacks.cpp RecursiveASTVisitorTests/Class.cpp + RecursiveASTVisitorTests/Concept.cpp RecursiveASTVisitorTests/ConstructExpr.cpp RecursiveASTVisitorTests/CXXBoolLiteralExpr.cpp RecursiveASTVisitorTests/CXXMemberCall.cpp Index: clang/include/clang/AST/RecursiveASTVisitor.h =================================================================== --- clang/include/clang/AST/RecursiveASTVisitor.h +++ clang/include/clang/AST/RecursiveASTVisitor.h @@ -1777,8 +1777,10 @@ // D is the "T" in something like "template<typename T> class vector;" if (D->getTypeForDecl()) TRY_TO(TraverseType(QualType(D->getTypeForDecl(), 0))); - if (const auto *TC = D->getTypeConstraint()) + if (const auto *TC = D->getTypeConstraint()) { + TRY_TO(TraverseStmt(TC->getImmediatelyDeclaredConstraint())); TRY_TO(TraverseConceptReference(*TC)); + } if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited()) TRY_TO(TraverseTypeLoc(D->getDefaultArgumentInfo()->getTypeLoc())); }) Index: clang-tools-extra/clangd/unittests/FindTargetTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/FindTargetTests.cpp +++ clang-tools-extra/clangd/unittests/FindTargetTests.cpp @@ -433,6 +433,28 @@ )cpp"; EXPECT_DECLS("ConceptSpecializationExpr", {"template <typename T> concept Fooable = true;"}); + + // constrained-parameter + Code = R"cpp( + template <typename T> + concept Fooable = true; + + template <[[Fooable]] T> + void bar(T t); + )cpp"; + EXPECT_DECLS("ConceptSpecializationExpr", + {"template <typename T> concept Fooable = true;"}); + + // partial-concept-id + Code = R"cpp( + template <typename T, typename U> + concept Fooable = true; + + template <[[Fooable]]<int> T> + void bar(T t); + )cpp"; + EXPECT_DECLS("ConceptSpecializationExpr", + {"template <typename T, typename U> concept Fooable = true;"}); } TEST_F(TargetDeclTest, FunctionTemplate) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits