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