1 // RUN: %clang_cc1 -fmodules -fmodules-local-submodule-visibility -fno-modules-error-recovery -fno-spell-checking -verify -std=c++17 %s 2 3 #pragma clang module build a 4 module a {} 5 #pragma clang module contents 6 #pragma clang module begin a 7 constexpr bool return_true() { return true; } 8 struct X { 9 static void f() noexcept(return_true()); 10 }; 11 #pragma clang module end 12 #pragma clang module endbuild 13 14 #pragma clang module build b 15 module b {} 16 #pragma clang module contents 17 #pragma clang module begin b 18 #pragma clang module import a 19 using T = decltype(return_true() && noexcept(X::f())); 20 #pragma clang module end 21 #pragma clang module endbuild 22 23 #pragma clang module import a 24 #pragma clang module import b 25 26 // Trigger import of return_true and then X::f in the same pass. This causes 27 // the type of X::f to be loaded while we have a pending body for return_true, 28 // which means evaluation of its exception specification at that point would 29 // fail. 30 T t; 31 32 static_assert(noexcept(X().f())); 33 34 // expected-no-diagnostics 35