summaryrefslogtreecommitdiff
path: root/test/Modules/cxx17-exception-spec.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/Modules/cxx17-exception-spec.cpp')
-rw-r--r--test/Modules/cxx17-exception-spec.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/test/Modules/cxx17-exception-spec.cpp b/test/Modules/cxx17-exception-spec.cpp
new file mode 100644
index 0000000000000..ba7be0e30d9c0
--- /dev/null
+++ b/test/Modules/cxx17-exception-spec.cpp
@@ -0,0 +1,34 @@
+// 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