From 9307c173c781904e1a9ad277d3a17f82cd0b4f1c Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Thu, 12 Aug 2021 09:08:20 +0200 Subject: [PATCH] build: reject C++ compilers that don't support std::vector::data GCC 4.2 on macOS claims to support C++98, but does not feature it. input.cc: In member function 'void state_stack::yycompressStack()': input.cc:1774: error: 'class std::vector >' has no member named 'data' Reported by Christopher Nielsen . . * m4/bison-cxx-std.m4 (_BISON_CXXSTD_98_snippet): Check for it. * m4/cxx.m4 (BISON_TEST_FOR_WORKING_CXX_COMPILER): Ditto. --- m4/bison-cxx-std.m4 | 15 ++++++++++++++- m4/cxx.m4 | 13 +++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/m4/bison-cxx-std.m4 b/m4/bison-cxx-std.m4 index 65d59cc7..4a71d20f 100644 --- a/m4/bison-cxx-std.m4 +++ b/m4/bison-cxx-std.m4 @@ -10,7 +10,20 @@ m4_define([_BISON_CXXSTD_98_snippet], [[#include #include -typedef std::vector ints; +void cxx98_vector () +{ + typedef std::vector ints; + + // Check support for std::vector::data. + // GCC 4.2 on macOS claims to support C++98, but does not feature it. + // + // input.cc: In member function 'void state_stack::yycompressStack()': + // input.cc:1774: error: 'class std::vector >' has no member named 'data' + // + // . + ints my_ints; + assert (my_ints.data () == &my_ints[0]); +} ]]) m4_define([_BISON_CXXSTD_03_snippet], diff --git a/m4/cxx.m4 b/m4/cxx.m4 index 36e66c43..0a99fa27 100644 --- a/m4/cxx.m4 +++ b/m4/cxx.m4 @@ -27,20 +27,25 @@ AC_DEFUN([BISON_TEST_FOR_WORKING_CXX_COMPILER], bison_cv_cxx_works=no AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( - [#include + [[ + #include + #include #include #include #include - using namespace std;], - [std::cerr << ""; + #include + using namespace std;]], + [[std::cerr << ""; cout << ""; + std::vector ints; + assert(ints.data () == &ints[0]); typedef std::pair uipair; std::map m; std::map::iterator i; m.insert (uipair (4, -4)); for (i = m.begin (); i != m.end (); ++i) if (i->first != 4) - return 1;])], + return 1;]])], [AS_IF([AC_TRY_COMMAND([$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_objext $LIBS >&AS_MESSAGE_LOG_FD])], [AS_IF([test "$cross_compiling" = yes], [bison_cv_cxx_works=cross],