From 41a83732654fbc474e94c499557e508af353a29e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Steffen=20M=C3=BCthing?= <muething@dune-project.org>
Date: Wed, 24 Jul 2013 08:22:30 +0200
Subject: [PATCH] [Build System] Add test for C++11 initializer list

---
 cmake/modules/FindCXX11Features.cmake | 23 +++++++++++++++++
 config.h.cmake                        |  3 +++
 m4/CMakeLists.txt                     |  1 +
 m4/Makefile.am                        |  1 +
 m4/cxx11_initializer_list.m4          | 37 +++++++++++++++++++++++++++
 m4/dune_common.m4                     |  1 +
 6 files changed, 66 insertions(+)
 create mode 100644 m4/cxx11_initializer_list.m4

diff --git a/cmake/modules/FindCXX11Features.cmake b/cmake/modules/FindCXX11Features.cmake
index fbb96ce4e..ce402a962 100644
--- a/cmake/modules/FindCXX11Features.cmake
+++ b/cmake/modules/FindCXX11Features.cmake
@@ -288,4 +288,27 @@ CHECK_CXX_SOURCE_COMPILES("
   }
 " HAVE_RVALUE_REFERENCES
 )
+
+# initializer list
+CHECK_CXX_SOURCE_COMPILES("
+  #include <initializer_list>
+  #include <vector>
+
+  struct A
+  {
+    A(std::initializer_list<int> il)
+      : vec(il)
+    {}
+
+    std::vector<int> vec;
+  };
+
+  int main(void)
+  {
+    A a{1,3,4,5};
+    return 0;
+  }
+" HAVE_INITIALIZER_LIST
+)
+
 cmake_pop_check_state()
diff --git a/config.h.cmake b/config.h.cmake
index 1ded4db4d..745307314 100644
--- a/config.h.cmake
+++ b/config.h.cmake
@@ -154,6 +154,9 @@
 /* Define to 1 if rvalue references are supported */
 #cmakedefine HAVE_RVALUE_REFERENCES 1
 
+/* Define to 1 if initializer list is supported */
+#cmakedefine HAVE_INITIALIZER_LIST 1
+
 /* Include always useful headers */
 #include <dune/common/deprecated.hh>
 #include <dune/common/unused.hh>
diff --git a/m4/CMakeLists.txt b/m4/CMakeLists.txt
index 5a842931e..2dad49170 100644
--- a/m4/CMakeLists.txt
+++ b/m4/CMakeLists.txt
@@ -13,6 +13,7 @@ install(PROGRAMS
         cxx0x_static_assert.m4
         cxx0x_variadic.m4
         cxx0x_variadic_constructor_sfinae.m4
+        cxx11_initializer_list.m4
         dune.m4
         dune_all.m4
         dune_autobuild.m4
diff --git a/m4/Makefile.am b/m4/Makefile.am
index 68a0b3f51..e16142f8b 100644
--- a/m4/Makefile.am
+++ b/m4/Makefile.am
@@ -17,6 +17,7 @@ ALLM4S = 					\
 	cxx0x_static_assert.m4			\
 	cxx0x_variadic.m4			\
 	cxx0x_variadic_constructor_sfinae.m4    \
+	cxx11_initializer_list.m4		\
 	dune.m4					\
 	dune_all.m4				\
 	dune_autobuild.m4			\
diff --git a/m4/cxx11_initializer_list.m4 b/m4/cxx11_initializer_list.m4
new file mode 100644
index 000000000..04fc9ff86
--- /dev/null
+++ b/m4/cxx11_initializer_list.m4
@@ -0,0 +1,37 @@
+# tests for C++11 initializer list support
+# the associated macro is called HAVE_INITIALIZER_LIST
+
+AC_DEFUN([INITIALIZER_LIST_CHECK],[
+  AC_CACHE_CHECK([whether std::initializer_list is supported], dune_cv_initializer_list_support, [
+    AC_REQUIRE([AC_PROG_CXX])
+    AC_REQUIRE([GXX0X])
+    AC_LANG_PUSH([C++])
+    AC_RUN_IFELSE([
+      AC_LANG_PROGRAM([
+
+        #include <initializer_list>
+        #include <vector>
+
+        struct A
+        {
+
+          A(std::initializer_list<int> il)
+            : vec(il)
+          {}
+
+          std::vector<int> vec;
+        };
+
+        ],
+        [
+          A a{1,3,4,5};
+          return 0;
+        ])],
+      dune_cv_initializer_list_support=yes,
+      dune_cv_initializer_list_support=no)
+    AC_LANG_POP
+  ])
+  if test "x$dune_cv_initializer_list_support" = xyes; then
+    AC_DEFINE(HAVE_INITIALIZER_LIST, 1, [Define to 1 if std::initializer_list is supported])
+  fi
+])
diff --git a/m4/dune_common.m4 b/m4/dune_common.m4
index 651a23e09..5a9735fec 100644
--- a/m4/dune_common.m4
+++ b/m4/dune_common.m4
@@ -24,6 +24,7 @@ AC_DEFUN([DUNE_COMMON_CHECKS],
   AC_REQUIRE([SHARED_PTR])
   AC_REQUIRE([VARIADIC_TEMPLATES_CHECK])
   AC_REQUIRE([RVALUE_REFERENCES_CHECK])
+  AC_REQUIRE([INITIALIZER_LIST_CHECK])
   AC_REQUIRE([DUNE_BOOST_BASE])
   AC_REQUIRE([MAKE_SHARED])
   AC_REQUIRE([DUNE_LINKCXX])
-- 
GitLab