llvm-capstone/clang/test/Modules/cxx17-exception-spec.cpp
Richard Smith eaf11ad709 Track the result of evaluating a computed noexcept specification on the
FunctionProtoType.

We previously re-evaluated the expression each time we wanted to know whether
the type is noexcept or not. We now evaluate the expression exactly once.

This is not quite "no functional change": it fixes a crasher bug during AST
deserialization where we would try to evaluate the noexcept specification in a
situation where we have not deserialized sufficient portions of the AST to
permit such evaluation.

llvm-svn: 331428
2018-05-03 03:58:32 +00:00

35 lines
1008 B
C++

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