From 7691b14121d2ce4c69bcba06c1b8449894236eea Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christoph=20Gr=C3=BCninger?= <gruenich@dune-project.org>
Date: Tue, 29 Sep 2015 18:09:51 +0200
Subject: [PATCH] [cmake] Fix C++14 flag check for non-compatible STDL

Thanks to Marian for the heads-up and the testing.
---
 cmake/modules/CheckCXXFeatures.cmake | 34 +++++++++++++++++++++++++---
 1 file changed, 31 insertions(+), 3 deletions(-)

diff --git a/cmake/modules/CheckCXXFeatures.cmake b/cmake/modules/CheckCXXFeatures.cmake
index b22f363df..023eb317b 100644
--- a/cmake/modules/CheckCXXFeatures.cmake
+++ b/cmake/modules/CheckCXXFeatures.cmake
@@ -24,9 +24,21 @@ if(NOT DISABLE_CXX_VERSION_CHECK)
   # try to use compiler flag -std=c++14
   include(TestCXXAcceptsFlag)
   check_cxx_accepts_flag("-std=c++14" CXX_FLAG_CXX14)
+
+  include(CheckCXXSourceCompiles)
+  cmake_push_check_state()
+  set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++14")
+  check_cxx_source_compiles("
+      #include <memory>
+
+      int main() {
+        std::make_unique<int>();
+      }
+    " CXX_LIB_SUPPORTS_CXX14)
+  cmake_pop_check_state()
 endif()
 
-if(CXX_FLAG_CXX14)
+if(CXX_FLAG_CXX14 AND CXX_LIB_SUPPORTS_CXX14)
   set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++14")
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 ")
   set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++14 ")
@@ -38,8 +50,20 @@ else()
   if(NOT DISABLE_CXX_VERSION_CHECK)
     # try to use compiler flag -std=c++1y for older compilers
     check_cxx_accepts_flag("-std=c++1y" CXX_FLAG_CXX1Y)
+
+    include(CheckCXXSourceCompiles)
+    cmake_push_check_state()
+    set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++1y")
+    check_cxx_source_compiles("
+        #include <memory>
+
+        int main() {
+          std::make_unique<int>();
+        }
+      " CXX_LIB_SUPPORTS_CXX1Y)
+    cmake_pop_check_state()
   endif()
-  if(CXX_FLAG_CXX1Y)
+  if(CXX_FLAG_CXX1Y AND CXX_LIB_SUPPORTS_CXX1Y)
     set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++1y" )
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y ")
     set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++1y ")
@@ -51,7 +75,9 @@ else()
 endif()
 
 # test for C++11 flags
-if(NOT (DISABLE_CXX_VERSION_CHECK OR CXX_FLAG_CXX14 OR CXX_FLAG_CXX1Y))
+if(NOT DISABLE_CXX_VERSION_CHECK
+   AND NOT ((CXX_FLAG_CXX14 AND CXX_LIB_SUPPORTS_CXX14)
+            OR (CXX_FLAG_CXX1Y AND CXX_LIB_SUPPORTS_CXX1Y)))
   # try to use compiler flag -std=c++11
   check_cxx_accepts_flag("-std=c++11" CXX_FLAG_CXX11)
 
@@ -405,3 +431,5 @@ if(NOT STDTHREAD_WORKS)
     "STDTHREAD_LINK_FLAGS.  If you think this test is wrong, set the cache "
     "variable STDTHREAD_WORKS.")
 endif(NOT STDTHREAD_WORKS)
+
+cmake_pop_check_state()
-- 
GitLab