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