| // 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; |