From 05f8333e7693c70cd4891c2f34005eb3651be07a Mon Sep 17 00:00:00 2001 From: Maximilien Colange Date: Tue, 13 Dec 2016 17:42:07 +0100 Subject: [PATCH] Add an option to enable C++14. * configure.ac: add an option --enable-c++14. * NEWS: mention the new option. --- NEWS | 5 ++++ configure.ac | 77 +++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 72 insertions(+), 10 deletions(-) diff --git a/NEWS b/NEWS index f2de77c6f..6755d07e6 100644 --- a/NEWS +++ b/NEWS @@ -19,6 +19,11 @@ New in spot 2.2.1.dev (Not yet released) * If the system has an installed libltdl library, use it instead of the one we distribute. + * The configure script has a new option --enable-c++14, to compile in + C++14 mode. Obviously you need a compiler that supports it. This allows + to check that nothing breaks when we will switch to C++14. This option + is also available in the configure script of buddy. + Bug fixes: * scc_filter() had a left-over print statement that would print diff --git a/configure.ac b/configure.ac index c82cd40e9..b49250f08 100644 --- a/configure.ac +++ b/configure.ac @@ -44,8 +44,18 @@ AC_PROG_CXX AM_PROG_LEX adl_CHECK_BISON +# Option to activate C/C++14 +AC_ARG_ENABLE([c++14], + [AC_HELP_STRING([--enable-c++14], + [Use C++14.])], + [enable_14=yes], [enable_14=no]) + # Activate at C11 for gnulib tests -AX_CHECK_COMPILE_FLAG([-std=c11], [CFLAGS="$CFLAGS -std=c11"]) +if test x"${enable_14}" = xyes; then + AX_CHECK_COMPILE_FLAG([-std=c14], [CFLAGS="$CFLAGS -std=c14"]) +else + AX_CHECK_COMPILE_FLAG([-std=c11], [CFLAGS="$CFLAGS -std=c11"]) +fi gl_INIT @@ -67,7 +77,7 @@ m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], #include // fails with some installation of clang #include - template + template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); @@ -93,14 +103,61 @@ m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], } ])]) -for f in -std=c++11 '-std=c++11 -stdlib=libc++' -std=c++0x -do - AX_CHECK_COMPILE_FLAG([$f], [CXXFLAGS="$CXXFLAGS $f" stdpass=true], [], [], - [_AX_CXX_COMPILE_STDCXX_11_testbody]) - ${stdpass-false} && break -done -if ! "${stdpass-false}"; then - AC_ERROR([unable to turn on C++11 mode with this compiler]) +# Turn on C++14 support +# This is currently a copy of the above code for C++11, feel free to add +# further tests here when necessary. +m4_define([_AX_CXX_COMPILE_STDCXX_14_testbody], +[AC_LANG_SOURCE([#include +#include +#include // fails with some installation of clang +#include + + template + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; + + typedef check> right_angle_brackets; + + auto f = std::make_shared("shared_ptr"); + + int a; + decltype(a) b; + + typedef check check_type; + check_type c; + check_type&& cr = static_cast(c); + + auto d = a; + + void test_emplace() + { + std::map m; + m.emplace(1, 2); // fails with g++ 4.6 + } +])]) + +if test x"${enable_14}" = xyes; then + for f in -std=c++14 '-std=c++14 -stdlib=libc++' -std=c++1y + do + AX_CHECK_COMPILE_FLAG([$f], [CXXFLAGS="$CXXFLAGS $f" stdpass=true], [], [], + [_AX_CXX_COMPILE_STDCXX_14_testbody]) + ${stdpass-false} && break + done + if ! "${stdpass-false}"; then + AC_ERROR([unable to turn on C++14 mode with this compiler]) + fi +else + for f in -std=c++11 '-std=c++11 -stdlib=libc++' -std=c++0x + do + AX_CHECK_COMPILE_FLAG([$f], [CXXFLAGS="$CXXFLAGS $f" stdpass=true], [], [], + [_AX_CXX_COMPILE_STDCXX_11_testbody]) + ${stdpass-false} && break + done + if ! "${stdpass-false}"; then + AC_ERROR([unable to turn on C++11 mode with this compiler]) + fi fi AX_CHECK_BUDDY