xref: /llvm-project/clang/test/Modules/adl.cpp (revision 197f68da76b604748590485fb496fad5e007e485)
1*197f68daSRichard Smith // RUN: %clang_cc1 -fmodules -verify -fno-modules-error-recovery -fno-spell-checking %s
2*197f68daSRichard Smith // RUN: %clang_cc1 -fmodules -verify -fno-modules-error-recovery -DONLY_Y %s
3*197f68daSRichard Smith 
4*197f68daSRichard Smith #pragma clang module build a
5*197f68daSRichard Smith module a {
6*197f68daSRichard Smith   explicit module x {}
7*197f68daSRichard Smith   explicit module y {}
8*197f68daSRichard Smith }
9*197f68daSRichard Smith #pragma clang module contents
10*197f68daSRichard Smith #pragma clang module begin a.x
11*197f68daSRichard Smith namespace N {
12*197f68daSRichard Smith   template<typename T> extern int f(T) { return 0; }
13*197f68daSRichard Smith }
14*197f68daSRichard Smith #pragma clang module end
15*197f68daSRichard Smith 
16*197f68daSRichard Smith #pragma clang module begin a.y
17*197f68daSRichard Smith #pragma clang module import a.x
18*197f68daSRichard Smith using N::f;
19*197f68daSRichard Smith #pragma clang module end
20*197f68daSRichard Smith #pragma clang module endbuild
21*197f68daSRichard Smith 
22*197f68daSRichard Smith namespace N { struct A {}; }
23*197f68daSRichard Smith struct B {};
24*197f68daSRichard Smith 
25*197f68daSRichard Smith #ifndef ONLY_Y
26*197f68daSRichard Smith #pragma clang module import a.x
test1()27*197f68daSRichard Smith void test1() {
28*197f68daSRichard Smith   f(N::A());
29*197f68daSRichard Smith   f(B()); // expected-error {{use of undeclared identifier 'f'}}
30*197f68daSRichard Smith }
31*197f68daSRichard Smith #else
32*197f68daSRichard Smith // expected-no-diagnostics
33*197f68daSRichard Smith #endif
34*197f68daSRichard Smith 
35*197f68daSRichard Smith #pragma clang module import a.y
test2()36*197f68daSRichard Smith void test2() {
37*197f68daSRichard Smith   // These are OK even if a.x is not imported.
38*197f68daSRichard Smith   f(N::A());
39*197f68daSRichard Smith   f(B());
40*197f68daSRichard Smith }
41