1*49532137SNico Weber // RUN: rm -rf %t 25159bbadSRichard Smith // RUN: %clang_cc1 -x c++ -std=c++17 -fmodules -fmodules-local-submodule-visibility -fmodules-cache-path=%t %s -verify 35159bbadSRichard Smith 45159bbadSRichard Smith // expected-no-diagnostics 55159bbadSRichard Smith 65159bbadSRichard Smith #pragma clang module build PR38627 75159bbadSRichard Smith module PR38627 {} 85159bbadSRichard Smith #pragma clang module contents 95159bbadSRichard Smith #pragma clang module begin PR38627 105159bbadSRichard Smith namespace PR38627 { 115159bbadSRichard Smith struct X { 125159bbadSRichard Smith virtual ~X() {} 135159bbadSRichard Smith struct C { 145159bbadSRichard Smith friend X::~X(); 155159bbadSRichard Smith } c; 165159bbadSRichard Smith }; 175159bbadSRichard Smith } 185159bbadSRichard Smith #pragma clang module end 195159bbadSRichard Smith #pragma clang module endbuild 205159bbadSRichard Smith 215159bbadSRichard Smith #pragma clang module import PR38627 225159bbadSRichard Smith 235159bbadSRichard Smith namespace PR38627 { 245159bbadSRichard Smith struct Y { 255159bbadSRichard Smith virtual ~Y() {} 265159bbadSRichard Smith struct C { 275159bbadSRichard Smith friend Y::~Y(); 285159bbadSRichard Smith } c; 295159bbadSRichard Smith }; 305159bbadSRichard Smith static_assert(noexcept(X().~X())); 315159bbadSRichard Smith static_assert(noexcept(Y().~Y())); 325159bbadSRichard Smith 335159bbadSRichard Smith struct A { virtual ~A() = default; }; 345159bbadSRichard Smith struct B : public A, public X { 355159bbadSRichard Smith virtual ~B() override = default; 365159bbadSRichard Smith }; 375159bbadSRichard Smith } // PR38627 38