llvm/clang/test/Modules/merge-concepts-redefinition-error.cpp

// 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