From 5916ac62dfc7424d4e3041fb59d3476029f72f01 Mon Sep 17 00:00:00 2001 From: Daniel Arndt Date: Mon, 21 May 2018 01:49:02 +0200 Subject: [PATCH] Restrict C++17 check --- cmake/checks/check_01_cxx_features.cmake | 33 +++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/cmake/checks/check_01_cxx_features.cmake b/cmake/checks/check_01_cxx_features.cmake index 6c4b973381..d46f34baf6 100644 --- a/cmake/checks/check_01_cxx_features.cmake +++ b/cmake/checks/check_01_cxx_features.cmake @@ -176,11 +176,42 @@ IF(NOT DEFINED DEAL_II_WITH_CXX17 OR DEAL_II_WITH_CXX17) " DEAL_II_HAVE_CXX17_IF_CONSTEXPR) + # + # Some compilers treat lambdas as constexpr functions when compiling + # with C++17 support even if they don't fulfill all the constexpr + # function requirements. Consequently, these compilers don't allow + # try-blocks or non-literal return types in lambdas. This is a bug. + # + CHECK_CXX_SOURCE_COMPILES( + " + #include + + int main() + { + auto c = []() + { + return std::string{}; + }(); + (void) c; + + return []() + { + try + {} + catch(...) + {} + return 0; + }(); + } + " + DEAL_II_NON_CONSTEXPR_LAMBDA) + RESET_CMAKE_REQUIRED() ENDIF() IF( DEAL_II_HAVE_CXX17_ATTRIBUTES AND - DEAL_II_HAVE_CXX17_IF_CONSTEXPR) + DEAL_II_HAVE_CXX17_IF_CONSTEXPR AND + DEAL_II_NON_CONSTEXPR_LAMBDA) SET(DEAL_II_HAVE_CXX17 TRUE) ELSE() IF(NOT _user_provided_cxx_version_flag) -- 2.39.5