On Wed, Sep 18, 2024 at 6:22 PM Jason Merrill <ja...@redhat.com> wrote: > > Tested x86_64-pc-linux-gnu with 5.5.0 bootstrap compiler. Thoughts?
I'm fine with this in general - do we have needs of bumping the requirement for GCC 15 though? IMO we should bump once we are requiring actual C++14 in some place. As of the version requirement as you say only some minor versions of the GCC 5 series are OK I would suggest to say we recommend using GCC 6 or later but GCC 5.5 should also work? Richard. > -- 8< -- > > This implements my proposal to update our bootstrap requirement to C++14. > The big benefit of the change is the greater constexpr power, but C++14 also > added variable templates, generic lambdas, lambda init-capture, binary > literals, and numeric literal digit separators. > > I'm not sure which GCC version to mention here. C++14 was feature-complete > in GCC 5, and became the default in GCC 6. 5.5.0 builds trunk with no > trouble, but of course trunk also doesn't use any C++14 features. Looking > at bugzilla, I see only one C++14 fix (PR71630) in 5.5, and it doesn't seem > important. In 5.4, PR69995 seems potentially significant, so shall we > recommend 5.4 or later? Or just say 5.5 because people are unlikely to be > stuck on an earlier minor release? > > gcc/ChangeLog: > > * doc/install.texi (Prerequisites): Update to C++14. > > ChangeLog: > > * configure.ac: Update requirement to C++14. > * configure: Regenerate. > --- > gcc/doc/install.texi | 15 +- > configure.ac | 12 +- > configure | 832 ++++++++++++++++++++++++++++++++++++++++--- > 3 files changed, 790 insertions(+), 69 deletions(-) > > diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi > index e339d736969..87add0b6572 100644 > --- a/gcc/doc/install.texi > +++ b/gcc/doc/install.texi > @@ -222,17 +222,18 @@ described below. > > @heading Tools/packages necessary for building GCC > @table @asis > -@item ISO C++11 compiler > -Necessary to bootstrap GCC. GCC 4.8.3 or newer has sufficient > -support for used C++11 features. > +@item ISO C++14 compiler > +Necessary to bootstrap GCC. GCC 5.5 or newer has sufficient > +support for used C++14 features. > > -Versions of GCC prior to 11 also allow bootstrapping with an ISO C++98 > -compiler, and versions of GCC prior to 4.8 also allow bootstrapping with > -an ISO C89 compiler. > +Versions of GCC prior to 15 allow bootstrapping with an ISO C++11 > +compiler, versions prior to 11 allow bootstrapping with an ISO C++98 > +compiler, and versions prior to 4.8 allow bootstrapping with an ISO > +C89 compiler. > > To build all languages in a cross-compiler or other configuration where > 3-stage bootstrap is not performed, you need to start with an existing > -GCC binary (version 4.8.3 or later) because source code for language > +GCC binary (version 5.5 or later) because source code for language > frontends other than C might use GCC extensions. > > @item C standard library and headers > diff --git a/configure.ac b/configure.ac > index f61dbe64a94..91635d5368a 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -1457,16 +1457,16 @@ case "$have_compiler:$host:$target:$enable_bootstrap" > in > ;; > esac > > -# When bootstrapping with GCC, build stage 1 in C++11 mode to ensure that a > -# C++11 compiler can still start the bootstrap. Otherwise, if building GCC, > -# require C++11 (or higher). > +# When bootstrapping with GCC, build stage 1 in C++14 mode to ensure that a > +# C++14 compiler can still start the bootstrap. Otherwise, if building GCC, > +# require C++14 (or higher). > if test "$enable_bootstrap:$GXX" = "yes:yes"; then > - CXX="$CXX -std=c++11" > + CXX="$CXX -std=c++14" > elif test "$have_compiler" = yes; then > - AX_CXX_COMPILE_STDCXX(11) > + AX_CXX_COMPILE_STDCXX(14) > > if test "${build}" != "${host}"; then > - AX_CXX_COMPILE_STDCXX(11, [], [], [_FOR_BUILD]) > + AX_CXX_COMPILE_STDCXX(14, [], [], [_FOR_BUILD]) > fi > fi > > diff --git a/configure b/configure > index e9583f2ba0c..ab9719c6e93 100755 > --- a/configure > +++ b/configure > @@ -712,8 +712,8 @@ gmplibs > PGO_BUILD_LTO_CFLAGS > PGO_BUILD_USE_CFLAGS > PGO_BUILD_GEN_CFLAGS > -HAVE_CXX11_FOR_BUILD > -HAVE_CXX11 > +HAVE_CXX14_FOR_BUILD > +HAVE_CXX14 > do_compare > CARGO > GDC > @@ -5914,13 +5914,13 @@ $as_echo "$as_me: WARNING: trying to bootstrap a > cross compiler" >&2;} > ;; > esac > > -# When bootstrapping with GCC, build stage 1 in C++11 mode to ensure that a > -# C++11 compiler can still start the bootstrap. Otherwise, if building GCC, > -# require C++11 (or higher). > +# When bootstrapping with GCC, build stage 1 in C++14 mode to ensure that a > +# C++14 compiler can still start the bootstrap. Otherwise, if building GCC, > +# require C++14 (or higher). > if test "$enable_bootstrap:$GXX" = "yes:yes"; then > - CXX="$CXX -std=c++11" > + CXX="$CXX -std=c++14" > elif test "$have_compiler" = yes; then > - ax_cxx_compile_alternatives="11 0x" ax_cxx_compile_cxx11_required=true > + ax_cxx_compile_alternatives="14 1y" ax_cxx_compile_cxx14_required=true > ac_ext=cpp > ac_cpp='$CXXCPP $CPPFLAGS' > ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' > @@ -5928,9 +5928,9 @@ ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS > $LDFLAGS conftest.$ac_ex > ac_compiler_gnu=$ac_cv_cxx_compiler_gnu > ac_success=no > > - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX > supports C++11 features by default" >&5 > -$as_echo_n "checking whether $CXX supports C++11 features by default... " > >&6; } > -if ${ax_cv_cxx_compile_cxx11+:} false; then : > + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX > supports C++14 features by default" >&5 > +$as_echo_n "checking whether $CXX supports C++14 features by default... " > >&6; } > +if ${ax_cv_cxx_compile_cxx14+:} false; then : > $as_echo_n "(cached) " >&6 > else > cat confdefs.h - <<_ACEOF >conftest.$ac_ext > @@ -6223,26 +6223,146 @@ namespace cxx11 > > > > + > +// If the compiler admits that it is not ready for C++14, why torture it? > +// Hopefully, this will speed up the test. > + > +#ifndef __cplusplus > + > +#error "This is not a C++ compiler" > + > +#elif __cplusplus < 201402L > + > +#error "This is not a C++14 compiler" > + > +#else > + > +namespace cxx14 > +{ > + > + namespace test_polymorphic_lambdas > + { > + > + int > + test() > + { > + const auto lambda = [](auto&&... args){ > + const auto istiny = [](auto x){ > + return (sizeof(x) == 1UL) ? 1 : 0; > + }; > + const int aretiny[] = { istiny(args)... }; > + return aretiny[0]; > + }; > + return lambda(1, 1L, 1.0f, '1'); > + } > + > + } > + > + namespace test_binary_literals > + { > + > + constexpr auto ivii = 0b0000000000101010; > + static_assert(ivii == 42, "wrong value"); > + > + } > + > + namespace test_generalized_constexpr > + { > + > + template < typename CharT > > + constexpr unsigned long > + strlen_c(const CharT *const s) noexcept > + { > + auto length = 0UL; > + for (auto p = s; *p; ++p) > + ++length; > + return length; > + } > + > + static_assert(strlen_c("") == 0UL, ""); > + static_assert(strlen_c("x") == 1UL, ""); > + static_assert(strlen_c("test") == 4UL, ""); > + static_assert(strlen_c("another\0test") == 7UL, ""); > + > + } > + > + namespace test_lambda_init_capture > + { > + > + int > + test() > + { > + auto x = 0; > + const auto lambda1 = [a = x](int b){ return a + b; }; > + const auto lambda2 = [a = lambda1(x)](){ return a; }; > + return lambda2(); > + } > + > + } > + > + namespace test_digit_separators > + { > + > + constexpr auto ten_million = 100'000'000; > + static_assert(ten_million == 100000000, ""); > + > + } > + > + namespace test_return_type_deduction > + { > + > + auto f(int& x) { return x; } > + decltype(auto) g(int& x) { return x; } > + > + template < typename T1, typename T2 > > + struct is_same > + { > + static constexpr auto value = false; > + }; > + > + template < typename T > > + struct is_same<T, T> > + { > + static constexpr auto value = true; > + }; > + > + int > + test() > + { > + auto x = 0; > + static_assert(is_same<int, decltype(f(x))>::value, ""); > + static_assert(is_same<int&, decltype(g(x))>::value, ""); > + return x; > + } > + > + } > + > +} // namespace cxx14 > + > +#endif // __cplusplus >= 201402L > + > + > + > _ACEOF > if ac_fn_cxx_try_compile "$LINENO"; then : > - ax_cv_cxx_compile_cxx11=yes > + ax_cv_cxx_compile_cxx14=yes > else > - ax_cv_cxx_compile_cxx11=no > + ax_cv_cxx_compile_cxx14=no > fi > rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext > fi > -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_compile_cxx11" > >&5 > -$as_echo "$ax_cv_cxx_compile_cxx11" >&6; } > - if test x$ax_cv_cxx_compile_cxx11 = xyes; then > +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_compile_cxx14" > >&5 > +$as_echo "$ax_cv_cxx_compile_cxx14" >&6; } > + if test x$ax_cv_cxx_compile_cxx14 = xyes; then > ac_success=yes > fi > > if test x$ac_success = xno; then > for alternative in ${ax_cxx_compile_alternatives}; do > switch="-std=gnu++${alternative}" > - cachevar=`$as_echo "ax_cv_cxx_compile_cxx11_$switch" | $as_tr_sh` > - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX > supports C++11 features with $switch" >&5 > -$as_echo_n "checking whether $CXX supports C++11 features with $switch... " > >&6; } > + cachevar=`$as_echo "ax_cv_cxx_compile_cxx14_$switch" | $as_tr_sh` > + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX > supports C++14 features with $switch" >&5 > +$as_echo_n "checking whether $CXX supports C++14 features with $switch... " > >&6; } > if eval \${$cachevar+:} false; then : > $as_echo_n "(cached) " >&6 > else > @@ -6538,6 +6658,126 @@ namespace cxx11 > > > > + > +// If the compiler admits that it is not ready for C++14, why torture it? > +// Hopefully, this will speed up the test. > + > +#ifndef __cplusplus > + > +#error "This is not a C++ compiler" > + > +#elif __cplusplus < 201402L > + > +#error "This is not a C++14 compiler" > + > +#else > + > +namespace cxx14 > +{ > + > + namespace test_polymorphic_lambdas > + { > + > + int > + test() > + { > + const auto lambda = [](auto&&... args){ > + const auto istiny = [](auto x){ > + return (sizeof(x) == 1UL) ? 1 : 0; > + }; > + const int aretiny[] = { istiny(args)... }; > + return aretiny[0]; > + }; > + return lambda(1, 1L, 1.0f, '1'); > + } > + > + } > + > + namespace test_binary_literals > + { > + > + constexpr auto ivii = 0b0000000000101010; > + static_assert(ivii == 42, "wrong value"); > + > + } > + > + namespace test_generalized_constexpr > + { > + > + template < typename CharT > > + constexpr unsigned long > + strlen_c(const CharT *const s) noexcept > + { > + auto length = 0UL; > + for (auto p = s; *p; ++p) > + ++length; > + return length; > + } > + > + static_assert(strlen_c("") == 0UL, ""); > + static_assert(strlen_c("x") == 1UL, ""); > + static_assert(strlen_c("test") == 4UL, ""); > + static_assert(strlen_c("another\0test") == 7UL, ""); > + > + } > + > + namespace test_lambda_init_capture > + { > + > + int > + test() > + { > + auto x = 0; > + const auto lambda1 = [a = x](int b){ return a + b; }; > + const auto lambda2 = [a = lambda1(x)](){ return a; }; > + return lambda2(); > + } > + > + } > + > + namespace test_digit_separators > + { > + > + constexpr auto ten_million = 100'000'000; > + static_assert(ten_million == 100000000, ""); > + > + } > + > + namespace test_return_type_deduction > + { > + > + auto f(int& x) { return x; } > + decltype(auto) g(int& x) { return x; } > + > + template < typename T1, typename T2 > > + struct is_same > + { > + static constexpr auto value = false; > + }; > + > + template < typename T > > + struct is_same<T, T> > + { > + static constexpr auto value = true; > + }; > + > + int > + test() > + { > + auto x = 0; > + static_assert(is_same<int, decltype(f(x))>::value, ""); > + static_assert(is_same<int&, decltype(g(x))>::value, ""); > + return x; > + } > + > + } > + > +} // namespace cxx14 > + > +#endif // __cplusplus >= 201402L > + > + > + > _ACEOF > if ac_fn_cxx_try_compile "$LINENO"; then : > eval $cachevar=yes > @@ -6564,9 +6804,9 @@ $as_echo "$ac_res" >&6; } > if test x$ac_success = xno; then > for alternative in ${ax_cxx_compile_alternatives}; do > for switch in -std=c++${alternative} +std=c++${alternative} "-h > std=c++${alternative}"; do > - cachevar=`$as_echo "ax_cv_cxx_compile_cxx11_$switch" | $as_tr_sh` > - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX > supports C++11 features with $switch" >&5 > -$as_echo_n "checking whether $CXX supports C++11 features with $switch... " > >&6; } > + cachevar=`$as_echo "ax_cv_cxx_compile_cxx14_$switch" | $as_tr_sh` > + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX > supports C++14 features with $switch" >&5 > +$as_echo_n "checking whether $CXX supports C++14 features with $switch... " > >&6; } > if eval \${$cachevar+:} false; then : > $as_echo_n "(cached) " >&6 > else > @@ -6862,6 +7102,126 @@ namespace cxx11 > > > > + > +// If the compiler admits that it is not ready for C++14, why torture it? > +// Hopefully, this will speed up the test. > + > +#ifndef __cplusplus > + > +#error "This is not a C++ compiler" > + > +#elif __cplusplus < 201402L > + > +#error "This is not a C++14 compiler" > + > +#else > + > +namespace cxx14 > +{ > + > + namespace test_polymorphic_lambdas > + { > + > + int > + test() > + { > + const auto lambda = [](auto&&... args){ > + const auto istiny = [](auto x){ > + return (sizeof(x) == 1UL) ? 1 : 0; > + }; > + const int aretiny[] = { istiny(args)... }; > + return aretiny[0]; > + }; > + return lambda(1, 1L, 1.0f, '1'); > + } > + > + } > + > + namespace test_binary_literals > + { > + > + constexpr auto ivii = 0b0000000000101010; > + static_assert(ivii == 42, "wrong value"); > + > + } > + > + namespace test_generalized_constexpr > + { > + > + template < typename CharT > > + constexpr unsigned long > + strlen_c(const CharT *const s) noexcept > + { > + auto length = 0UL; > + for (auto p = s; *p; ++p) > + ++length; > + return length; > + } > + > + static_assert(strlen_c("") == 0UL, ""); > + static_assert(strlen_c("x") == 1UL, ""); > + static_assert(strlen_c("test") == 4UL, ""); > + static_assert(strlen_c("another\0test") == 7UL, ""); > + > + } > + > + namespace test_lambda_init_capture > + { > + > + int > + test() > + { > + auto x = 0; > + const auto lambda1 = [a = x](int b){ return a + b; }; > + const auto lambda2 = [a = lambda1(x)](){ return a; }; > + return lambda2(); > + } > + > + } > + > + namespace test_digit_separators > + { > + > + constexpr auto ten_million = 100'000'000; > + static_assert(ten_million == 100000000, ""); > + > + } > + > + namespace test_return_type_deduction > + { > + > + auto f(int& x) { return x; } > + decltype(auto) g(int& x) { return x; } > + > + template < typename T1, typename T2 > > + struct is_same > + { > + static constexpr auto value = false; > + }; > + > + template < typename T > > + struct is_same<T, T> > + { > + static constexpr auto value = true; > + }; > + > + int > + test() > + { > + auto x = 0; > + static_assert(is_same<int, decltype(f(x))>::value, ""); > + static_assert(is_same<int&, decltype(g(x))>::value, ""); > + return x; > + } > + > + } > + > +} // namespace cxx14 > + > +#endif // __cplusplus >= 201402L > + > + > + > _ACEOF > if ac_fn_cxx_try_compile "$LINENO"; then : > eval $cachevar=yes > @@ -6895,41 +7255,41 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext > >&5' > ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS > conftest.$ac_ext $LIBS >&5' > ac_compiler_gnu=$ac_cv_c_compiler_gnu > > - if test x$ax_cxx_compile_cxx11_required = xtrue; then > + if test x$ax_cxx_compile_cxx14_required = xtrue; then > if test x$ac_success = xno; then > - as_fn_error $? "*** A compiler with support for C++11 language > features is required." "$LINENO" 5 > + as_fn_error $? "*** A compiler with support for C++14 language > features is required." "$LINENO" 5 > fi > fi > if test x$ac_success = xno; then > - HAVE_CXX11=0 > - { $as_echo "$as_me:${as_lineno-$LINENO}: No compiler with C++11 support > was found" >&5 > -$as_echo "$as_me: No compiler with C++11 support was found" >&6;} > + HAVE_CXX14=0 > + { $as_echo "$as_me:${as_lineno-$LINENO}: No compiler with C++14 support > was found" >&5 > +$as_echo "$as_me: No compiler with C++14 support was found" >&6;} > else > - HAVE_CXX11=1 > + HAVE_CXX14=1 > > -$as_echo "#define HAVE_CXX11 1" >>confdefs.h > +$as_echo "#define HAVE_CXX14 1" >>confdefs.h > > fi > > > > if test "${build}" != "${host}"; then > - ax_cxx_compile_alternatives="11 0x" > ax_cxx_compile_cxx11_required=true > + ax_cxx_compile_alternatives="14 1y" > ax_cxx_compile_cxx14_required=true > ac_ext=cpp > ac_cpp='$CXXCPP $CPPFLAGS' > ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' > ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS > conftest.$ac_ext $LIBS >&5' > ac_compiler_gnu=$ac_cv_cxx_compiler_gnu > ac_success=no > - ax_cv_cxx_compile_cxx11_orig_cxx="$CXX" > - ax_cv_cxx_compile_cxx11_orig_cxxflags="$CXXFLAGS" > - ax_cv_cxx_compile_cxx11_orig_cppflags="$CPPFLAGS" > + ax_cv_cxx_compile_cxx14_orig_cxx="$CXX" > + ax_cv_cxx_compile_cxx14_orig_cxxflags="$CXXFLAGS" > + ax_cv_cxx_compile_cxx14_orig_cppflags="$CPPFLAGS" > CXX="$CXX_FOR_BUILD" > CXXFLAGS="$CXXFLAGS_FOR_BUILD" > CPPFLAGS="$CPPFLAGS_FOR_BUILD" > - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX > supports C++11 features by default" >&5 > -$as_echo_n "checking whether $CXX supports C++11 features by default... " > >&6; } > -if ${ax_cv_cxx_compile_cxx11_FOR_BUILD+:} false; then : > + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX > supports C++14 features by default" >&5 > +$as_echo_n "checking whether $CXX supports C++14 features by default... " > >&6; } > +if ${ax_cv_cxx_compile_cxx14_FOR_BUILD+:} false; then : > $as_echo_n "(cached) " >&6 > else > cat confdefs.h - <<_ACEOF >conftest.$ac_ext > @@ -7222,26 +7582,146 @@ namespace cxx11 > > > > + > +// If the compiler admits that it is not ready for C++14, why torture it? > +// Hopefully, this will speed up the test. > + > +#ifndef __cplusplus > + > +#error "This is not a C++ compiler" > + > +#elif __cplusplus < 201402L > + > +#error "This is not a C++14 compiler" > + > +#else > + > +namespace cxx14 > +{ > + > + namespace test_polymorphic_lambdas > + { > + > + int > + test() > + { > + const auto lambda = [](auto&&... args){ > + const auto istiny = [](auto x){ > + return (sizeof(x) == 1UL) ? 1 : 0; > + }; > + const int aretiny[] = { istiny(args)... }; > + return aretiny[0]; > + }; > + return lambda(1, 1L, 1.0f, '1'); > + } > + > + } > + > + namespace test_binary_literals > + { > + > + constexpr auto ivii = 0b0000000000101010; > + static_assert(ivii == 42, "wrong value"); > + > + } > + > + namespace test_generalized_constexpr > + { > + > + template < typename CharT > > + constexpr unsigned long > + strlen_c(const CharT *const s) noexcept > + { > + auto length = 0UL; > + for (auto p = s; *p; ++p) > + ++length; > + return length; > + } > + > + static_assert(strlen_c("") == 0UL, ""); > + static_assert(strlen_c("x") == 1UL, ""); > + static_assert(strlen_c("test") == 4UL, ""); > + static_assert(strlen_c("another\0test") == 7UL, ""); > + > + } > + > + namespace test_lambda_init_capture > + { > + > + int > + test() > + { > + auto x = 0; > + const auto lambda1 = [a = x](int b){ return a + b; }; > + const auto lambda2 = [a = lambda1(x)](){ return a; }; > + return lambda2(); > + } > + > + } > + > + namespace test_digit_separators > + { > + > + constexpr auto ten_million = 100'000'000; > + static_assert(ten_million == 100000000, ""); > + > + } > + > + namespace test_return_type_deduction > + { > + > + auto f(int& x) { return x; } > + decltype(auto) g(int& x) { return x; } > + > + template < typename T1, typename T2 > > + struct is_same > + { > + static constexpr auto value = false; > + }; > + > + template < typename T > > + struct is_same<T, T> > + { > + static constexpr auto value = true; > + }; > + > + int > + test() > + { > + auto x = 0; > + static_assert(is_same<int, decltype(f(x))>::value, ""); > + static_assert(is_same<int&, decltype(g(x))>::value, ""); > + return x; > + } > + > + } > + > +} // namespace cxx14 > + > +#endif // __cplusplus >= 201402L > + > + > + > _ACEOF > if ac_fn_cxx_try_compile "$LINENO"; then : > - ax_cv_cxx_compile_cxx11_FOR_BUILD=yes > + ax_cv_cxx_compile_cxx14_FOR_BUILD=yes > else > - ax_cv_cxx_compile_cxx11_FOR_BUILD=no > + ax_cv_cxx_compile_cxx14_FOR_BUILD=no > fi > rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext > fi > -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: > $ax_cv_cxx_compile_cxx11_FOR_BUILD" >&5 > -$as_echo "$ax_cv_cxx_compile_cxx11_FOR_BUILD" >&6; } > - if test x$ax_cv_cxx_compile_cxx11_FOR_BUILD = xyes; then > +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: > $ax_cv_cxx_compile_cxx14_FOR_BUILD" >&5 > +$as_echo "$ax_cv_cxx_compile_cxx14_FOR_BUILD" >&6; } > + if test x$ax_cv_cxx_compile_cxx14_FOR_BUILD = xyes; then > ac_success=yes > fi > > if test x$ac_success = xno; then > for alternative in ${ax_cxx_compile_alternatives}; do > switch="-std=gnu++${alternative}" > - cachevar=`$as_echo "ax_cv_cxx_compile_cxx11_FOR_BUILD_$switch" | > $as_tr_sh` > - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX > supports C++11 features with $switch" >&5 > -$as_echo_n "checking whether $CXX supports C++11 features with $switch... " > >&6; } > + cachevar=`$as_echo "ax_cv_cxx_compile_cxx14_FOR_BUILD_$switch" | > $as_tr_sh` > + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX > supports C++14 features with $switch" >&5 > +$as_echo_n "checking whether $CXX supports C++14 features with $switch... " > >&6; } > if eval \${$cachevar+:} false; then : > $as_echo_n "(cached) " >&6 > else > @@ -7537,6 +8017,126 @@ namespace cxx11 > > > > + > +// If the compiler admits that it is not ready for C++14, why torture it? > +// Hopefully, this will speed up the test. > + > +#ifndef __cplusplus > + > +#error "This is not a C++ compiler" > + > +#elif __cplusplus < 201402L > + > +#error "This is not a C++14 compiler" > + > +#else > + > +namespace cxx14 > +{ > + > + namespace test_polymorphic_lambdas > + { > + > + int > + test() > + { > + const auto lambda = [](auto&&... args){ > + const auto istiny = [](auto x){ > + return (sizeof(x) == 1UL) ? 1 : 0; > + }; > + const int aretiny[] = { istiny(args)... }; > + return aretiny[0]; > + }; > + return lambda(1, 1L, 1.0f, '1'); > + } > + > + } > + > + namespace test_binary_literals > + { > + > + constexpr auto ivii = 0b0000000000101010; > + static_assert(ivii == 42, "wrong value"); > + > + } > + > + namespace test_generalized_constexpr > + { > + > + template < typename CharT > > + constexpr unsigned long > + strlen_c(const CharT *const s) noexcept > + { > + auto length = 0UL; > + for (auto p = s; *p; ++p) > + ++length; > + return length; > + } > + > + static_assert(strlen_c("") == 0UL, ""); > + static_assert(strlen_c("x") == 1UL, ""); > + static_assert(strlen_c("test") == 4UL, ""); > + static_assert(strlen_c("another\0test") == 7UL, ""); > + > + } > + > + namespace test_lambda_init_capture > + { > + > + int > + test() > + { > + auto x = 0; > + const auto lambda1 = [a = x](int b){ return a + b; }; > + const auto lambda2 = [a = lambda1(x)](){ return a; }; > + return lambda2(); > + } > + > + } > + > + namespace test_digit_separators > + { > + > + constexpr auto ten_million = 100'000'000; > + static_assert(ten_million == 100000000, ""); > + > + } > + > + namespace test_return_type_deduction > + { > + > + auto f(int& x) { return x; } > + decltype(auto) g(int& x) { return x; } > + > + template < typename T1, typename T2 > > + struct is_same > + { > + static constexpr auto value = false; > + }; > + > + template < typename T > > + struct is_same<T, T> > + { > + static constexpr auto value = true; > + }; > + > + int > + test() > + { > + auto x = 0; > + static_assert(is_same<int, decltype(f(x))>::value, ""); > + static_assert(is_same<int&, decltype(g(x))>::value, ""); > + return x; > + } > + > + } > + > +} // namespace cxx14 > + > +#endif // __cplusplus >= 201402L > + > + > + > _ACEOF > if ac_fn_cxx_try_compile "$LINENO"; then : > eval $cachevar=yes > @@ -7563,9 +8163,9 @@ $as_echo "$ac_res" >&6; } > if test x$ac_success = xno; then > for alternative in ${ax_cxx_compile_alternatives}; do > for switch in -std=c++${alternative} +std=c++${alternative} "-h > std=c++${alternative}"; do > - cachevar=`$as_echo "ax_cv_cxx_compile_cxx11_FOR_BUILD_$switch" | > $as_tr_sh` > - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX > supports C++11 features with $switch" >&5 > -$as_echo_n "checking whether $CXX supports C++11 features with $switch... " > >&6; } > + cachevar=`$as_echo "ax_cv_cxx_compile_cxx14_FOR_BUILD_$switch" | > $as_tr_sh` > + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX > supports C++14 features with $switch" >&5 > +$as_echo_n "checking whether $CXX supports C++14 features with $switch... " > >&6; } > if eval \${$cachevar+:} false; then : > $as_echo_n "(cached) " >&6 > else > @@ -7861,6 +8461,126 @@ namespace cxx11 > > > > + > +// If the compiler admits that it is not ready for C++14, why torture it? > +// Hopefully, this will speed up the test. > + > +#ifndef __cplusplus > + > +#error "This is not a C++ compiler" > + > +#elif __cplusplus < 201402L > + > +#error "This is not a C++14 compiler" > + > +#else > + > +namespace cxx14 > +{ > + > + namespace test_polymorphic_lambdas > + { > + > + int > + test() > + { > + const auto lambda = [](auto&&... args){ > + const auto istiny = [](auto x){ > + return (sizeof(x) == 1UL) ? 1 : 0; > + }; > + const int aretiny[] = { istiny(args)... }; > + return aretiny[0]; > + }; > + return lambda(1, 1L, 1.0f, '1'); > + } > + > + } > + > + namespace test_binary_literals > + { > + > + constexpr auto ivii = 0b0000000000101010; > + static_assert(ivii == 42, "wrong value"); > + > + } > + > + namespace test_generalized_constexpr > + { > + > + template < typename CharT > > + constexpr unsigned long > + strlen_c(const CharT *const s) noexcept > + { > + auto length = 0UL; > + for (auto p = s; *p; ++p) > + ++length; > + return length; > + } > + > + static_assert(strlen_c("") == 0UL, ""); > + static_assert(strlen_c("x") == 1UL, ""); > + static_assert(strlen_c("test") == 4UL, ""); > + static_assert(strlen_c("another\0test") == 7UL, ""); > + > + } > + > + namespace test_lambda_init_capture > + { > + > + int > + test() > + { > + auto x = 0; > + const auto lambda1 = [a = x](int b){ return a + b; }; > + const auto lambda2 = [a = lambda1(x)](){ return a; }; > + return lambda2(); > + } > + > + } > + > + namespace test_digit_separators > + { > + > + constexpr auto ten_million = 100'000'000; > + static_assert(ten_million == 100000000, ""); > + > + } > + > + namespace test_return_type_deduction > + { > + > + auto f(int& x) { return x; } > + decltype(auto) g(int& x) { return x; } > + > + template < typename T1, typename T2 > > + struct is_same > + { > + static constexpr auto value = false; > + }; > + > + template < typename T > > + struct is_same<T, T> > + { > + static constexpr auto value = true; > + }; > + > + int > + test() > + { > + auto x = 0; > + static_assert(is_same<int, decltype(f(x))>::value, ""); > + static_assert(is_same<int&, decltype(g(x))>::value, ""); > + return x; > + } > + > + } > + > +} // namespace cxx14 > + > +#endif // __cplusplus >= 201402L > + > + > + > _ACEOF > if ac_fn_cxx_try_compile "$LINENO"; then : > eval $cachevar=yes > @@ -7890,28 +8610,28 @@ $as_echo "$ac_res" >&6; } > CXX_FOR_BUILD="$CXX" > CXXFLAGS_FOR_BUILD="$CXXFLAGS" > CPPFLAGS_FOR_BUILD="$CPPFLAGS" > - CXX="$ax_cv_cxx_compile_cxx11_orig_cxx" > - CXXFLAGS="$ax_cv_cxx_compile_cxx11_orig_cxxflags" > - CPPFLAGS="$ax_cv_cxx_compile_cxx11_orig_cppflags" > + CXX="$ax_cv_cxx_compile_cxx14_orig_cxx" > + CXXFLAGS="$ax_cv_cxx_compile_cxx14_orig_cxxflags" > + CPPFLAGS="$ax_cv_cxx_compile_cxx14_orig_cppflags" > ac_ext=c > ac_cpp='$CPP $CPPFLAGS' > ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' > ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS > conftest.$ac_ext $LIBS >&5' > ac_compiler_gnu=$ac_cv_c_compiler_gnu > > - if test x$ax_cxx_compile_cxx11_required = xtrue; then > + if test x$ax_cxx_compile_cxx14_required = xtrue; then > if test x$ac_success = xno; then > - as_fn_error $? "*** A compiler with support for C++11 language > features is required." "$LINENO" 5 > + as_fn_error $? "*** A compiler with support for C++14 language > features is required." "$LINENO" 5 > fi > fi > if test x$ac_success = xno; then > - HAVE_CXX11_FOR_BUILD=0 > - { $as_echo "$as_me:${as_lineno-$LINENO}: No compiler with C++11 support > was found" >&5 > -$as_echo "$as_me: No compiler with C++11 support was found" >&6;} > + HAVE_CXX14_FOR_BUILD=0 > + { $as_echo "$as_me:${as_lineno-$LINENO}: No compiler with C++14 support > was found" >&5 > +$as_echo "$as_me: No compiler with C++14 support was found" >&6;} > else > - HAVE_CXX11_FOR_BUILD=1 > + HAVE_CXX14_FOR_BUILD=1 > > -$as_echo "#define HAVE_CXX11_FOR_BUILD 1" >>confdefs.h > +$as_echo "#define HAVE_CXX14_FOR_BUILD 1" >>confdefs.h > > fi > > > base-commit: 5c8f9f4d4cebabf85e68c5bdbe2d4ee6646edc7c > -- > 2.46.0 >