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