|  | // RUN: %clang_cc1 -fmodules -fmodules-local-submodule-visibility -fno-modules-error-recovery -fno-spell-checking -verify -std=c++17 %s | 
|  |  | 
|  | #pragma clang module build a | 
|  | module a {} | 
|  | #pragma clang module contents | 
|  | #pragma clang module begin a | 
|  | constexpr bool return_true() { return true; } | 
|  | struct X { | 
|  | static void f() noexcept(return_true()); | 
|  | }; | 
|  | #pragma clang module end | 
|  | #pragma clang module endbuild | 
|  |  | 
|  | #pragma clang module build b | 
|  | module b {} | 
|  | #pragma clang module contents | 
|  | #pragma clang module begin b | 
|  | #pragma clang module import a | 
|  | using T = decltype(return_true() && noexcept(X::f())); | 
|  | #pragma clang module end | 
|  | #pragma clang module endbuild | 
|  |  | 
|  | #pragma clang module import a | 
|  | #pragma clang module import b | 
|  |  | 
|  | // Trigger import of return_true and then X::f in the same pass. This causes | 
|  | // the type of X::f to be loaded while we have a pending body for return_true, | 
|  | // which means evaluation of its exception specification at that point would | 
|  | // fail. | 
|  | T t; | 
|  |  | 
|  | static_assert(noexcept(X().f())); | 
|  |  | 
|  | // expected-no-diagnostics |