[PATCH] D155425: [include-cleaner] Record concept uses

Sam McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Jul 17 00:24:21 PDT 2023


sammccall created this revision.
sammccall added reviewers: kadircet, massberg.
Herald added a project: All.
sammccall requested review of this revision.
Herald added projects: clang, clang-tools-extra.
Herald added a subscriber: cfe-commits.

Most cases handled by adding VisitConceptReference to RecursiveASTVisitor
though it is incomplete.

Fixes https://github.com/llvm/llvm-project/issues/60702


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D155425

Files:
  clang-tools-extra/include-cleaner/lib/WalkAST.cpp
  clang-tools-extra/include-cleaner/unittests/WalkASTTest.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
@@ -457,6 +457,9 @@
   DEF_TRAVERSE_TMPL_INST(Function)
 #undef DEF_TRAVERSE_TMPL_INST
 
+  // FIXME: we should also provide VisitTypeConstraint.
+  // FIXME: VisitConceptReference is not yet called in constrained AutoTypeLoc.
+  bool VisitConceptReference(const ConceptReference *C) { return true; }
   bool TraverseTypeConstraint(const TypeConstraint *C);
 
   bool TraverseConceptRequirement(concepts::Requirement *R);
@@ -543,6 +546,7 @@
 template <typename Derived>
 bool RecursiveASTVisitor<Derived>::TraverseConceptReferenceHelper(
     const ConceptReference &C) {
+  TRY_TO(VisitConceptReference(&C));
   TRY_TO(TraverseNestedNameSpecifierLoc(C.getNestedNameSpecifierLoc()));
   TRY_TO(TraverseDeclarationNameInfo(C.getConceptNameInfo()));
   if (C.hasExplicitTemplateArgs())
@@ -1356,6 +1360,8 @@
 DEF_TRAVERSE_TYPELOC(AutoType, {
   TRY_TO(TraverseType(TL.getTypePtr()->getDeducedType()));
   if (TL.isConstrained()) {
+    // FIXME: should VisitConceptReference instead.
+    //        We don't store that node in the AST today.
     TRY_TO(TraverseNestedNameSpecifierLoc(TL.getNestedNameSpecifierLoc()));
     TRY_TO(TraverseDeclarationNameInfo(TL.getConceptNameInfo()));
     for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
Index: clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
===================================================================
--- clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
+++ clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
@@ -50,7 +50,7 @@
   Inputs.ExtraFiles["target.h"] = Target.code().str();
   Inputs.ExtraArgs.push_back("-include");
   Inputs.ExtraArgs.push_back("target.h");
-  Inputs.ExtraArgs.push_back("-std=c++17");
+  Inputs.ExtraArgs.push_back("-std=c++20");
   TestAST AST(Inputs);
   const auto &SM = AST.sourceManager();
 
@@ -510,5 +510,17 @@
   testWalk("enum class E : int {};", "enum class ^E : int ;");
 }
 
+TEST(WalkAST, Concepts) {
+  testWalk("template <class> concept $explicit^C = true;", "^C auto x = 1;");
+  testWalk("template <class> concept $explicit^C = true;", "bool x = ^C<int>;");
+  testWalk("template <class> concept $explicit^C = true;", "void X(^C auto);");
+  testWalk("template <class> concept $explicit^C = true;",
+           "template <^C T> int X;");
+  testWalk("template <class> concept $explicit^C = true;",
+           "template <^C auto T> int X;");
+  testWalk("template <class> concept $explicit^C = true;",
+           "template <class T> requires(^C<T>) int X;");
+}
+
 } // namespace
 } // namespace clang::include_cleaner
Index: clang-tools-extra/include-cleaner/lib/WalkAST.cpp
===================================================================
--- clang-tools-extra/include-cleaner/lib/WalkAST.cpp
+++ clang-tools-extra/include-cleaner/lib/WalkAST.cpp
@@ -249,6 +249,11 @@
     return true;
   }
 
+  bool VisitConceptReference(const ConceptReference *CR) {
+    report(CR->getConceptNameLoc(), CR->getNamedConcept());
+    return true;
+  }
+
   // TypeLoc visitors.
   void reportType(SourceLocation RefLoc, NamedDecl *ND) {
     // Reporting explicit references to types nested inside classes can cause
@@ -279,6 +284,13 @@
     return true;
   }
 
+  bool VisitAutoTypeLoc(AutoTypeLoc ATL) {
+    // FIXME: RAV should call VisitConceptReference here, but doesn't!
+    if (ATL.isConstrained())
+      report(ATL.getConceptNameLoc(), ATL.getNamedConcept());
+    return true;
+  }
+
   bool VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL) {
     reportType(TL.getTemplateNameLoc(),
                getMostRelevantTemplatePattern(TL.getTypePtr()));


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D155425.540879.patch
Type: text/x-patch
Size: 3839 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230717/cffd36d3/attachment.bin>


More information about the cfe-commits mailing list