[PATCH] D84136: [clangd] Fix visitation of ConceptSpecializationExpr in constrained-parameter
Nathan Ridge via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sun Jul 26 19:58:46 PDT 2020
nridge updated this revision to Diff 280771.
nridge marked an inline comment as done.
nridge added a comment.
Spun off the source-location issue to D84613 <https://reviews.llvm.org/D84613>.
Some other review comments remain to be addressed.
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
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
@@ -405,6 +405,11 @@
}
TEST_F(TargetDeclTest, Concept) {
+ Flags.push_back("-std=c++20");
+
+ // FIXME: Should we truncate the pretty-printed form of a concept decl
+ // somewhere?
+
Code = R"cpp(
template <typename T>
concept Fooable = requires (T t) { t.foo(); };
@@ -414,12 +419,31 @@
t.foo();
}
)cpp";
- Flags.push_back("-std=c++20");
EXPECT_DECLS(
"ConceptSpecializationExpr",
- // FIXME: Should we truncate the pretty-printed form of a concept decl
- // somewhere?
{"template <typename T> concept Fooable = requires (T t) { t.foo(); };"});
+
+ // 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) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D84136.280771.patch
Type: text/x-patch
Size: 2255 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200727/b37253cb/attachment.bin>
More information about the cfe-commits
mailing list