| // RUN: %clang_cc1 -fmodules %s -verify | 
 | // expected-no-diagnostics | 
 |  | 
 | #pragma clang module build A | 
 | module A {} | 
 | #pragma clang module contents | 
 | #pragma clang module begin A | 
 | namespace N { class X; } | 
 | #pragma clang module end | 
 | #pragma clang module endbuild | 
 |  | 
 | #pragma clang module build B | 
 | module B {} | 
 | #pragma clang module contents | 
 | #pragma clang module begin B | 
 | namespace N { class Friendly { friend class X; }; } | 
 | #pragma clang module end | 
 | #pragma clang module endbuild | 
 |  | 
 | #pragma clang module build C | 
 | module C {} | 
 | #pragma clang module contents | 
 | #pragma clang module begin C | 
 | #pragma clang module import A | 
 | void use_X(N::X *p); | 
 | #pragma clang module import B | 
 | // UsingShadowDecl names the friend declaration | 
 | using N::X; | 
 | #pragma clang module end | 
 | #pragma clang module endbuild | 
 |  | 
 | #pragma clang module import B | 
 | namespace N { class AlsoFriendly { friend class X; }; } | 
 | #pragma clang module import A | 
 | #pragma clang module import C | 
 | // The friend declaration from N::Friendly is now the first in the redecl | 
 | // chain, so is not ordinarily visible. We need the IDNS of the UsingShadowDecl | 
 | // to still consider it to be visible, though. | 
 | X *p; |