1 // RUN: %clang_cc1 -fmodules %s -verify 2 // expected-no-diagnostics 3 4 #pragma clang module build A 5 module A {} 6 #pragma clang module contents 7 #pragma clang module begin A 8 namespace N { class X; } 9 #pragma clang module end 10 #pragma clang module endbuild 11 12 #pragma clang module build B 13 module B {} 14 #pragma clang module contents 15 #pragma clang module begin B 16 namespace N { class Friendly { friend class X; }; } 17 #pragma clang module end 18 #pragma clang module endbuild 19 20 #pragma clang module build C 21 module C {} 22 #pragma clang module contents 23 #pragma clang module begin C 24 #pragma clang module import A 25 void use_X(N::X *p); 26 #pragma clang module import B 27 // UsingShadowDecl names the friend declaration 28 using N::X; 29 #pragma clang module end 30 #pragma clang module endbuild 31 32 #pragma clang module import B 33 namespace N { class AlsoFriendly { friend class X; }; } 34 #pragma clang module import A 35 #pragma clang module import C 36 // The friend declaration from N::Friendly is now the first in the redecl 37 // chain, so is not ordinarily visible. We need the IDNS of the UsingShadowDecl 38 // to still consider it to be visible, though. 39 X *p; 40