mirror of
https://github.com/gcc-mirror/gcc.git
synced 2024-11-21 13:40:47 +00:00
build: update bootstrap req to C++14
We moved to a bootstrap requirement of C++11 in GCC 11, 8 years after support was stable in GCC 4.8. It is now 8 years since C++14 was the default mode in GCC 6 (and 9 years since support was complete in GCC 5), and we have a few bits of optional C++14 code in the compiler, so it seems a good time to update the bootstrap requirement again. 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. C++14 was feature-complete in GCC 5, and became the default in GCC 6. 5.4.0 bootstraps trunk correctly; trunk stage1 built with 5.3.0 breaks in eh_data_format_name due to PR69995. gcc/ChangeLog: * doc/install.texi (Prerequisites): Update to C++14. ChangeLog: * configure.ac: Update requirement to C++14. * configure: Regenerate.
This commit is contained in:
parent
f475a31ab4
commit
a9ec1bc06b
832
configure
vendored
832
configure
vendored
@ -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
|
||||
|
||||
|
12
configure.ac
12
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
|
||||
|
||||
|
@ -222,17 +222,23 @@ 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.4 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.
|
||||
|
||||
If you need to build an intermediate version of GCC in order to
|
||||
bootstrap current GCC, consider GCC 9.5: it can build the current Ada
|
||||
and D compilers, and was also the version that declared C++17 support
|
||||
stable.
|
||||
|
||||
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 (of a new enough version) because source code for language
|
||||
frontends other than C might use GCC extensions.
|
||||
|
||||
@item C standard library and headers
|
||||
|
Loading…
Reference in New Issue
Block a user