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 %t/A.cppm -I%t -emit-module-interface -o %t/A.pcm
6*4b95a5a7SChuanqi Xu// RUN: %clang_cc1 -x c++ -std=c++20 %t/B.cppm -I%t -emit-module-interface -o %t/B.pcm
7*4b95a5a7SChuanqi Xu// RUN: %clang_cc1 -x c++ -std=c++20 -fprebuilt-module-path=%t %t/foo.cpp -verify
8*4b95a5a7SChuanqi Xu
9*4b95a5a7SChuanqi Xu//--- foo.h
10*4b95a5a7SChuanqi Xutemplate <class T>
11*4b95a5a7SChuanqi Xuconcept A = true;
12*4b95a5a7SChuanqi Xu
13*4b95a5a7SChuanqi Xu//--- bar.h
14*4b95a5a7SChuanqi Xutemplate <class T>
15*4b95a5a7SChuanqi Xuconcept A = false;
16*4b95a5a7SChuanqi Xu
17*4b95a5a7SChuanqi Xu//--- A.cppm
18*4b95a5a7SChuanqi Xumodule;
19*4b95a5a7SChuanqi Xu#include "foo.h"
20*4b95a5a7SChuanqi Xuexport module A;
21*4b95a5a7SChuanqi Xuexport using ::A;
22*4b95a5a7SChuanqi Xu
23*4b95a5a7SChuanqi Xu//--- B.cppm
24*4b95a5a7SChuanqi Xumodule;
25*4b95a5a7SChuanqi Xu#include "bar.h"
26*4b95a5a7SChuanqi Xuexport module B;
27*4b95a5a7SChuanqi Xuexport using ::A;
28*4b95a5a7SChuanqi Xu
29*4b95a5a7SChuanqi Xu//--- foo.cpp
30*4b95a5a7SChuanqi Xuimport A;
31*4b95a5a7SChuanqi Xuimport B;
32*4b95a5a7SChuanqi Xu
33*4b95a5a7SChuanqi Xutemplate <class T> void foo() requires A<T> {}  // expected-error 1+{{reference to 'A' is ambiguous}}
34*4b95a5a7SChuanqi Xu                                                // expected-note@* 1+{{candidate found by name lookup}}
35*4b95a5a7SChuanqi Xu
36*4b95a5a7SChuanqi Xuint main() {
37*4b95a5a7SChuanqi Xu  foo<int>();
38*4b95a5a7SChuanqi Xu  return 0;
39*4b95a5a7SChuanqi Xu}
40