| // RUN: rm -rf %t |
| // RUN: mkdir %t |
| // RUN: split-file %s %t |
| // |
| // RUN: %clang_cc1 -xc++ -std=c++20 -fmodules -fmodule-name=library \ |
| // RUN: -emit-module %t/modules.map \ |
| // RUN: -o %t/module.pcm \ |
| // RUN: -verify |
| // |
| //--- modules.map |
| module "library" { |
| export * |
| module "concepts" { |
| export * |
| header "concepts.h" |
| } |
| module "conflicting" { |
| export * |
| header "conflicting.h" |
| } |
| } |
| |
| //--- concepts.h |
| #ifndef CONCEPTS_H_ |
| #define CONCEPTS_H_ |
| |
| template <class T> |
| concept ConflictingConcept = true; |
| |
| template <class T, class U> |
| concept same_as = __is_same(T, U); |
| |
| template<class T> concept truec = true; |
| |
| int var; |
| |
| #endif // SAMEAS_CONCEPTS_H |
| |
| //--- conflicting.h |
| #ifndef CONFLICTING_H |
| #define CONFLICTING_H |
| |
| #include "concepts.h" |
| |
| template <class T, class U = int> |
| concept ConflictingConcept = true; // expected-error {{redefinition of concept 'ConflictingConcept' with different template}} |
| // expected-note@* {{previous definition}} |
| |
| int same_as; // expected-error {{redefinition of 'same_as' as different kind of symbol}} |
| // expected-note@* {{previous definition}} |
| |
| template<class T> concept var = false; // expected-error {{redefinition of 'var' as different kind of symbol}} |
| // expected-note@* {{previous definition}} |
| |
| template<class T> concept truec = true; // expected-error {{redefinition of 'truec'}} |
| // expected-note@* {{previous definition}} |
| #endif // CONFLICTING_H |