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