Skip to content

[clangd][modules] Clangd reports ODR violation when including iostream from (global module fragment of) two different modules #100924

Open
@alfaix

Description

@alfaix

Hey, I'm trying to get modules to work with clangd following this PR.

However, when I run clangd with the following files:

// b.cppm
module;
#include <iostream>
export module b;

export template <class T>
concept C = requires() {
  { T::foo } -> std::convertible_to<int>;
};

// c.cppm
module;

#include <iostream>

export module c;
import b;
class B {
public:
  static constexpr int foo = 1;
};

export template <class T>
  requires C<T>
class D {};

int main() { D<B> s; }

Put -std=c++23 -stdlib=libc++ and all the -fmodule things in compile_commands.json, clangd reports an ODR violation, saying the 2 definitions of std::error_category from the 2 includes are different: E[12:04:26.095] [module_odr_violation_missing_decl] Line 3: in included file: 'std::error_category::message' from module '' is not present in definition of 'std::error_category' in module 'b.<global>'

The setup is sensitive to small changes - e.g., removing std::convertible from the concept leads to the error disappearing. I put the repro in a small repo for convenience.

Tested with Ubuntu clang version 20.0.0 (++20240727042143+9a3e66e314e6-1~exp1~20240727042317.1828) straight out of apt.llvm.org snapshot repo.

Metadata

Metadata

Assignees

Labels

clang:modulesC++20 modules and Clang Header Modulesclangd

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions