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 | |