build: check for C++ 20 and 2b

C++20 is released.

* configure.ac, m4/bison-cxx-std.m4, tests/atlocal.in,
* tests/local.at: Replace 2a with 20, and add support for 2b.
This commit is contained in:
Akim Demaille
2021-08-12 08:31:38 +02:00
parent db66acc5d0
commit 15ba35a51b
4 changed files with 38 additions and 18 deletions

View File

@@ -84,7 +84,8 @@ BISON_CXXSTD([03])
BISON_CXXSTD([11]) BISON_CXXSTD([11])
BISON_CXXSTD([14]) BISON_CXXSTD([14])
BISON_CXXSTD([17]) BISON_CXXSTD([17])
BISON_CXXSTD([2a]) BISON_CXXSTD([20])
BISON_CXXSTD([2b])
AM_CONDITIONAL([ENABLE_CXX11], [test x"$CXX11_CXXFLAGS" != x]) AM_CONDITIONAL([ENABLE_CXX11], [test x"$CXX11_CXXFLAGS" != x])
AM_CONDITIONAL([ENABLE_CXX14], [test x"$CXX14_CXXFLAGS" != x]) AM_CONDITIONAL([ENABLE_CXX14], [test x"$CXX14_CXXFLAGS" != x])
AC_LANG_POP([C++]) AC_LANG_POP([C++])

View File

@@ -7,16 +7,17 @@
# with or without modifications, as long as this notice is preserved. # with or without modifications, as long as this notice is preserved.
m4_define([_BISON_CXXSTD_98_snippet], m4_define([_BISON_CXXSTD_98_snippet],
[#include <vector> [[#include <cassert>
#include <vector>
typedef std::vector<int> ints; typedef std::vector<int> ints;
]) ]])
m4_define([_BISON_CXXSTD_03_snippet], m4_define([_BISON_CXXSTD_03_snippet],
[]) [])
m4_define([_BISON_CXXSTD_11_snippet], m4_define([_BISON_CXXSTD_11_snippet],
[#include <algorithm> [[#include <algorithm>
#include <memory> #include <memory>
#include <set> #include <set>
#include <sstream> #include <sstream>
@@ -66,10 +67,10 @@ m4_define([_BISON_CXXSTD_11_snippet],
// GCC 4.8.2 on Solaris 11.3 does not support to_string. // GCC 4.8.2 on Solaris 11.3 does not support to_string.
auto e = std::to_string(42); auto e = std::to_string(42);
]) ]])
m4_define([_BISON_CXXSTD_14_snippet], m4_define([_BISON_CXXSTD_14_snippet],
[ // C++14 [[ // C++14
void mismatch() void mismatch()
{ {
using ints = std::vector<int>; using ints = std::vector<int>;
@@ -78,20 +79,24 @@ m4_define([_BISON_CXXSTD_14_snippet],
std::mismatch(std::begin(v1), std::end(v1), std::mismatch(std::begin(v1), std::end(v1),
std::begin(v2), std::end(v2)); std::begin(v2), std::end(v2));
} }
]) ]])
m4_define([_BISON_CXXSTD_17_snippet], m4_define([_BISON_CXXSTD_17_snippet],
[ // C++17 [[ // C++17
namespace ns1::ns2::ns3 {} namespace ns1::ns2::ns3 {}
#include <optional> #include <optional>
auto opt_string = std::optional<std::string>{}; auto opt_string = std::optional<std::string>{};
auto out = std::ostringstream{}; auto out = std::ostringstream{};
]) ]])
m4_define([_BISON_CXXSTD_2A_snippet], m4_define([_BISON_CXXSTD_20_snippet],
[ // C++2A [[ // C++20
]) ]])
m4_define([_BISON_CXXSTD_2B_snippet],
[[ // C++2B
]])
m4_define([_BISON_CXXSTD_testbody(98)], m4_define([_BISON_CXXSTD_testbody(98)],
@@ -129,14 +134,25 @@ _BISON_CXXSTD_14_snippet
_BISON_CXXSTD_17_snippet _BISON_CXXSTD_17_snippet
])]) ])])
m4_define([_BISON_CXXSTD_testbody(2a)], m4_define([_BISON_CXXSTD_testbody(20)],
[AC_LANG_PROGRAM([ [AC_LANG_PROGRAM([
_BISON_CXXSTD_98_snippet _BISON_CXXSTD_98_snippet
_BISON_CXXSTD_03_snippet _BISON_CXXSTD_03_snippet
_BISON_CXXSTD_11_snippet _BISON_CXXSTD_11_snippet
_BISON_CXXSTD_14_snippet _BISON_CXXSTD_14_snippet
_BISON_CXXSTD_17_snippet _BISON_CXXSTD_17_snippet
_BISON_CXXSTD_2A_snippet _BISON_CXXSTD_20_snippet
])])
m4_define([_BISON_CXXSTD_testbody(2b)],
[AC_LANG_PROGRAM([
_BISON_CXXSTD_98_snippet
_BISON_CXXSTD_03_snippet
_BISON_CXXSTD_11_snippet
_BISON_CXXSTD_14_snippet
_BISON_CXXSTD_17_snippet
_BISON_CXXSTD_20_snippet
_BISON_CXXSTD_2B_snippet
])]) ])])
@@ -148,7 +164,7 @@ m4_define([_BISON_CXXSTD_testbody],
# BISON_CXXSTD(STD) # BISON_CXXSTD(STD)
# ----------------- # -----------------
# Check whether the C++ compiler support STD (11, 98, 2a, etc.). # Check whether the C++ compiler support STD (11, 98, 2b, etc.).
# If it does, AC_SUBST 'CXX<STD>_CXXFLAGS' to the corresponding flags. # If it does, AC_SUBST 'CXX<STD>_CXXFLAGS' to the corresponding flags.
AC_DEFUN([BISON_CXXSTD], AC_DEFUN([BISON_CXXSTD],
[AC_REQUIRE([AC_PROG_CXX]) [AC_REQUIRE([AC_PROG_CXX])

View File

@@ -60,7 +60,8 @@ fi
: ${CXX11_CXXFLAGS='@CXX11_CXXFLAGS@'} : ${CXX11_CXXFLAGS='@CXX11_CXXFLAGS@'}
: ${CXX14_CXXFLAGS='@CXX14_CXXFLAGS@'} : ${CXX14_CXXFLAGS='@CXX14_CXXFLAGS@'}
: ${CXX17_CXXFLAGS='@CXX17_CXXFLAGS@'} : ${CXX17_CXXFLAGS='@CXX17_CXXFLAGS@'}
: ${CXX2A_CXXFLAGS='@CXX2A_CXXFLAGS@'} : ${CXX20_CXXFLAGS='@CXX20_CXXFLAGS@'}
: ${CXX2B_CXXFLAGS='@CXX2B_CXXFLAGS@'}
# Whether the compiler supports POSIXLY_CORRECT defined. # Whether the compiler supports POSIXLY_CORRECT defined.
: ${C_COMPILER_POSIXLY_CORRECT='@C_COMPILER_POSIXLY_CORRECT@'} : ${C_COMPILER_POSIXLY_CORRECT='@C_COMPILER_POSIXLY_CORRECT@'}

View File

@@ -881,7 +881,8 @@ for at_std in '' \
${CXX11_CXXFLAGS:+"$CXX11_CXXFLAGS"} \ ${CXX11_CXXFLAGS:+"$CXX11_CXXFLAGS"} \
${CXX14_CXXFLAGS:+"$CXX14_CXXFLAGS"} \ ${CXX14_CXXFLAGS:+"$CXX14_CXXFLAGS"} \
${CXX17_CXXFLAGS:+"$CXX17_CXXFLAGS"} \ ${CXX17_CXXFLAGS:+"$CXX17_CXXFLAGS"} \
${CXX2A_CXXFLAGS:+"$CXX2A_CXXFLAGS"} ${CXX20_CXXFLAGS:+"$CXX20_CXXFLAGS"} \
${CXX2B_CXXFLAGS:+"$CXX2B_CXXFLAGS"}
do do
]AS_ECHO(["======== Testing with C++ standard flags: '$at_cxx_std'"])[ ]AS_ECHO(["======== Testing with C++ standard flags: '$at_cxx_std'"])[
CXXFLAGS="$at_for_each_std_CXXFLAGS_save $at_std" CXXFLAGS="$at_for_each_std_CXXFLAGS_save $at_std"
@@ -1510,7 +1511,8 @@ m4_define([AT_REQUIRE_CXX_STD],
[11], [201103], [11], [201103],
[14], [201402], [14], [201402],
[17], [201703], [17], [201703],
[2a], [201709], [20], [202002],
[2b], [202100],
[m4_fatal([$0: invalid arguments: $@])])[ [m4_fatal([$0: invalid arguments: $@])])[
return 1; return 1;
#else #else