Skip to content

Clang does not check for ODR violations when merging concepts from different modules #56310

Closed
@ilya-biryukov

Description

@ilya-biryukov

For this code:

// module.map
module "foo" {
  export * 
  header "foo.h"
}
module "bar" {
  export * 
  header "bar.h"
}

// foo.h
template <class T> concept A = true;

// bar.h
template <class T> concept A = false;

// foo.cpp
// clang -std=c++20 -fmodules -fimplicit-modules -fmodule-map-file=module.map foo.cpp
#include "foo.h"
#include "bar.h"

template <class T> void foo() requires A<T> {}
void main() { foo<int>(); }

Expected: compiling the code produces an error as concept A is defined differently in two consumed modules, therefore it produces an ODR violation.
Actual: no error about ODR violation. Depending on the chosen concept a call to foo<int>() either succeeds or fails.

Metadata

Metadata

Assignees

Labels

clang:frontendLanguage frontend issues, e.g. anything involving "Sema"clang:modulesC++20 modules and Clang Header ModulesconceptsC++20 concepts

Type

No type

Projects

Status

No status

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions