1*4b95a5a7SChuanqi Xu // RUN: rm -rf %t
2*4b95a5a7SChuanqi Xu // RUN: mkdir %t
3*4b95a5a7SChuanqi Xu // RUN: split-file %s %t
4*4b95a5a7SChuanqi Xu //
5*4b95a5a7SChuanqi Xu // RUN: %clang_cc1 -x c++ -std=c++20 -fmodules -fmodules-cache-path=%t -fmodule-map-file=%t/module.map %t/foo.cpp -verify
6*4b95a5a7SChuanqi Xu 
7*4b95a5a7SChuanqi Xu //--- module.map
8*4b95a5a7SChuanqi Xu module "foo" {
9*4b95a5a7SChuanqi Xu   export *
10*4b95a5a7SChuanqi Xu   header "foo.h"
11*4b95a5a7SChuanqi Xu }
12*4b95a5a7SChuanqi Xu module "bar" {
13*4b95a5a7SChuanqi Xu   export *
14*4b95a5a7SChuanqi Xu   header "bar.h"
15*4b95a5a7SChuanqi Xu }
16*4b95a5a7SChuanqi Xu 
17*4b95a5a7SChuanqi Xu //--- foo.h
18*4b95a5a7SChuanqi Xu template <class T>
19*4b95a5a7SChuanqi Xu concept A = true;
20*4b95a5a7SChuanqi Xu 
21*4b95a5a7SChuanqi Xu //--- bar.h
22*4b95a5a7SChuanqi Xu template <class T>
23*4b95a5a7SChuanqi Xu concept A = false;
24*4b95a5a7SChuanqi Xu 
25*4b95a5a7SChuanqi Xu //--- foo.cpp
26*4b95a5a7SChuanqi Xu #include "bar.h"
27*4b95a5a7SChuanqi Xu #include "foo.h"
28*4b95a5a7SChuanqi Xu 
foo()29*4b95a5a7SChuanqi Xu template <class T> void foo() requires A<T> {}  // expected-error 1+{{reference to 'A' is ambiguous}}
30*4b95a5a7SChuanqi Xu                                                 // expected-note@* 1+{{candidate found by name lookup}}
31*4b95a5a7SChuanqi Xu 
main()32*4b95a5a7SChuanqi Xu int main() {
33*4b95a5a7SChuanqi Xu   foo<int>();
34*4b95a5a7SChuanqi Xu   return 0;
35*4b95a5a7SChuanqi Xu }
36