1*5159bbadSRichard Smith // RUN: %clang_cc1 -x c++ -std=c++17 -fmodules -fmodules-local-submodule-visibility -fmodules-cache-path=%t %s -verify
2*5159bbadSRichard Smith 
3*5159bbadSRichard Smith // expected-no-diagnostics
4*5159bbadSRichard Smith 
5*5159bbadSRichard Smith #pragma clang module build PR38627
6*5159bbadSRichard Smith module PR38627 {}
7*5159bbadSRichard Smith #pragma clang module contents
8*5159bbadSRichard Smith #pragma clang module begin PR38627
9*5159bbadSRichard Smith namespace PR38627 {
10*5159bbadSRichard Smith struct X {
11*5159bbadSRichard Smith   virtual ~X() {}
12*5159bbadSRichard Smith   struct C {
13*5159bbadSRichard Smith     friend X::~X();
14*5159bbadSRichard Smith   } c;
15*5159bbadSRichard Smith };
16*5159bbadSRichard Smith }
17*5159bbadSRichard Smith #pragma clang module end
18*5159bbadSRichard Smith #pragma clang module endbuild
19*5159bbadSRichard Smith 
20*5159bbadSRichard Smith #pragma clang module import PR38627
21*5159bbadSRichard Smith 
22*5159bbadSRichard Smith namespace PR38627 {
23*5159bbadSRichard Smith struct Y {
24*5159bbadSRichard Smith   virtual ~Y() {}
25*5159bbadSRichard Smith   struct C {
26*5159bbadSRichard Smith     friend Y::~Y();
27*5159bbadSRichard Smith   } c;
28*5159bbadSRichard Smith };
29*5159bbadSRichard Smith static_assert(noexcept(X().~X()));
30*5159bbadSRichard Smith static_assert(noexcept(Y().~Y()));
31*5159bbadSRichard Smith 
32*5159bbadSRichard Smith struct A { virtual ~A() = default; };
33*5159bbadSRichard Smith struct B : public A, public X {
34*5159bbadSRichard Smith   virtual ~B() override = default;
35*5159bbadSRichard Smith };
36*5159bbadSRichard Smith } // PR38627
37