xref: /llvm-project/clang/test/Modules/merge-concepts-redefinition-error.cpp (revision 59179d72b2e3d3b99ebc342374c9c797d526ac5d)
1*59179d72SIlya Biryukov // RUN: rm -rf %t
2*59179d72SIlya Biryukov // RUN: mkdir %t
3*59179d72SIlya Biryukov // RUN: split-file %s %t
4*59179d72SIlya Biryukov //
5*59179d72SIlya Biryukov // RUN: %clang_cc1 -xc++ -std=c++20 -fmodules -fmodule-name=library \
6*59179d72SIlya Biryukov // RUN:     -emit-module %t/modules.map \
7*59179d72SIlya Biryukov // RUN:     -o %t/module.pcm \
8*59179d72SIlya Biryukov // RUN:     -verify
9*59179d72SIlya Biryukov //
10*59179d72SIlya Biryukov //--- modules.map
11*59179d72SIlya Biryukov module "library" {
12*59179d72SIlya Biryukov 	export *
13*59179d72SIlya Biryukov 	module "concepts" {
14*59179d72SIlya Biryukov 		export *
15*59179d72SIlya Biryukov 		header "concepts.h"
16*59179d72SIlya Biryukov 	}
17*59179d72SIlya Biryukov 	module "conflicting" {
18*59179d72SIlya Biryukov 		export *
19*59179d72SIlya Biryukov 		header "conflicting.h"
20*59179d72SIlya Biryukov 	}
21*59179d72SIlya Biryukov }
22*59179d72SIlya Biryukov 
23*59179d72SIlya Biryukov //--- concepts.h
24*59179d72SIlya Biryukov #ifndef CONCEPTS_H_
25*59179d72SIlya Biryukov #define CONCEPTS_H_
26*59179d72SIlya Biryukov 
27*59179d72SIlya Biryukov template <class T>
28*59179d72SIlya Biryukov concept ConflictingConcept = true;
29*59179d72SIlya Biryukov 
30*59179d72SIlya Biryukov template <class T, class U>
31*59179d72SIlya Biryukov concept same_as = __is_same(T, U);
32*59179d72SIlya Biryukov 
33*59179d72SIlya Biryukov template<class T> concept truec = true;
34*59179d72SIlya Biryukov 
35*59179d72SIlya Biryukov int var;
36*59179d72SIlya Biryukov 
37*59179d72SIlya Biryukov #endif // SAMEAS_CONCEPTS_H
38*59179d72SIlya Biryukov 
39*59179d72SIlya Biryukov //--- conflicting.h
40*59179d72SIlya Biryukov #ifndef CONFLICTING_H
41*59179d72SIlya Biryukov #define CONFLICTING_H
42*59179d72SIlya Biryukov 
43*59179d72SIlya Biryukov #include "concepts.h"
44*59179d72SIlya Biryukov 
45*59179d72SIlya Biryukov template <class T, class U = int>
46*59179d72SIlya Biryukov concept ConflictingConcept = true; // expected-error {{redefinition of concept 'ConflictingConcept' with different template}}
47*59179d72SIlya Biryukov                                    // expected-note@* {{previous definition}}
48*59179d72SIlya Biryukov 
49*59179d72SIlya Biryukov int same_as; // expected-error {{redefinition of 'same_as' as different kind of symbol}}
50*59179d72SIlya Biryukov              // expected-note@* {{previous definition}}
51*59179d72SIlya Biryukov 
52*59179d72SIlya Biryukov template<class T> concept var = false; // expected-error {{redefinition of 'var' as different kind of symbol}}
53*59179d72SIlya Biryukov                                        // expected-note@* {{previous definition}}
54*59179d72SIlya Biryukov 
55*59179d72SIlya Biryukov template<class T> concept truec = true; // expected-error {{redefinition of 'truec'}}
56*59179d72SIlya Biryukov                                         // expected-note@* {{previous definition}}
57*59179d72SIlya Biryukov #endif // CONFLICTING_H
58