Clang indexing doesn't detect C++20 ConceptDecls

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view

Clang indexing doesn't detect C++20 ConceptDecls

Dimitry Andric via cfe-dev

I'm having trouble getting Clang's IndexingAction to detect
I have a minimum working example (reproduced below) that initializes
an IndexingAction and runs it over some test code that contains two
ConceptDecls. I've verified that the frontend "sees" these decls by
dumping the AST.

However, the IndexingAction is set up to print a simple message
when it encounters any kind of decl, and no such message is
printed when running over the aforementioned code. Ergo, it
seems like ConceptDecls are invisible to the IndexingAction,
whereas other decls are detected properly (clang::CXXRecordDecl,
clang::FunctionDecl, etc).

I've reproduced this problem in LLVM/Clang 11 and 12.

Any help is appreciated.


CMake build file:

cmake_minimum_required(VERSION 3.8)
project(concepts-test LANGUAGES CXX)

# Sources for the executable are specified at end of CMakeLists.txt
add_executable(concepts-test "")

# Enable C++20
set_property(TARGET concepts-test PROPERTY CXX_STANDARD 20)

# Libraries
find_package(Clang REQUIRED)
target_link_libraries(concepts-test PRIVATE
target_link_libraries(concepts-test PRIVATE LLVM)
target_include_directories(concepts-test SYSTEM PRIVATE ${LLVM_INCLUDE_DIRS} ${CLANG_INCLUDE_DIRS})

target_sources(concepts-test PRIVATE main.cpp)

Source code for main.cpp:

#include "clang/Tooling/Tooling.h"
#include "clang/Index/IndexDataConsumer.h"
#include "clang/Index/IndexingAction.h"
#include "clang/Index/IndexingOptions.h"
#include <cstdio>

class IndexDataConsumer : public clang::index::IndexDataConsumer {
  // Print a message to stdout if any kind of declaration is found
  bool handleDeclOccurrence(const clang::Decl*,
                            clang::index::IndexDataConsumer::ASTNodeInfo) override {
    printf("Found a decl occurrence\n");
    return true;

class IndexActionFactory : public clang::tooling::FrontendActionFactory {
  std::unique_ptr<clang::FrontendAction> create() override {
    // The most permissive set of indexing options possible
    clang::index::IndexingOptions opts;
    opts.IndexFunctionLocals           = true;
    opts.IndexImplicitInstantiation    = true;
    opts.IndexMacrosInPreprocessor     = true;
    opts.IndexParametersInDeclarations = true;
    opts.IndexTemplateParameters       = true;
    opts.SystemSymbolFilter            = clang::index::IndexingOptions::SystemSymbolFilterKind::None;
    IndexDataConsumer idx;
    return createIndexingAction(std::make_shared<IndexDataConsumer>(idx), opts);

int main() {
  const std::string code = R"(
    // Basic example of a concept
    template <typename T, typename U = T> concept Sumable = requires(T a, U b) {
      {a + b};
      {b + a};

    // Another basic example of a concept
    template<typename T>
    concept has_type_member = requires { typename T::type; };

  // Run the indexing action over the code above.
  // If any decl is found in the AST, the printf should fire.
  IndexActionFactory IndexFactory;
  clang::tooling::runToolOnCodeWithArgs(IndexFactory.create(), code, {"-std=c++20"});
  return 0;

cfe-dev mailing list
[hidden email]