tests: grep -E is not portable
[bison.git] / m4 / bison-cxx-std.m4
blobdd8a5345c8cac2814feae2220492018e392b9a9c
1 # bison-cxx-std.m4 serial 1
3 # Copyright (C) 2018-2021 Free Software Foundation, Inc.
5 # This file is free software; the Free Software Foundation
6 # gives unlimited permission to copy and/or distribute it,
7 # with or without modifications, as long as this notice is preserved.
9 m4_define([_BISON_CXXSTD_98_snippet],
10 [[]])
12 m4_define([_BISON_CXXSTD_03_snippet],
13 [[]])
15 m4_define([_BISON_CXXSTD_11_snippet],
16 [[  // C++11
17 #include <algorithm>
18 #include <cassert>
19 #include <memory>
20 #include <set>
21 #include <sstream>
22 #include <string>
23 #include <utility> // std::swap
24 #include <vector>
26   template <typename T>
27   struct check
28   {
29     static_assert(sizeof(int) <= sizeof(T), "not big enough");
30   };
32   using right_angle_brackets = check<check<bool>>;
34   auto f = std::make_shared<std::string>("shared_ptr");
36   int a;
37   decltype(a) b;
39   typedef check<int> check_type;
40   check_type c;
41   check_type&& cr = static_cast<check_type&&>(c);
43   auto d = a;
45   // Some versions of libstdc++ do not support std::set::emplace.
46   void foo()
47   {
48     std::set<int> is;
49     is.emplace(42);
50   }
52   // Clang++ 3.5, for a while, was unable to process properly
53   // the for-loop because its variable, r, is a typedef...
54   // It failed as follows:
55   //
56   // error: unexpected ':' in nested name specifier; did you mean '::'?
57   //    for (auto r: std::set<int>{1, 2})
58   //               ^
59   //               ::
60   using r = std::set<int>;
61   void bar()
62   {
63     for (int r: std::set<int>{1, 2})
64       continue;
65   }
67   // GCC 4.8.2 on Solaris 11.3 does not support to_string.
68   auto e = std::to_string(42);
70   // Needed by glr2.cc.
71   void cxx11_vector_data ()
72   {
73     std::vector<int> ints;
74     ints.emplace_back (42);
75     assert (ints.data () == &ints[0]);
76   }
78   // Needed by glr2.cc.
79   void cxx11_array_swap ()
80   {
81     int i0[4] = { 1, 2, 3, 4 };
82     int i1[4] = { 5, 6, 7, 8 };
83     std::swap (i0, i1);
84   }
85 ]])
87 m4_define([_BISON_CXXSTD_14_snippet],
88 [[  // C++14
89   void mismatch()
90   {
91     using ints = std::vector<int>;
92     auto v1 = ints{1, 2, 3};
93     auto v2 = ints{1, 2};
94     std::mismatch(std::begin(v1), std::end(v1),
95                   std::begin(v2), std::end(v2));
96   }
97 ]])
99 m4_define([_BISON_CXXSTD_17_snippet],
100 [[  // C++17
101   namespace ns1::ns2::ns3 {}
103 #include <optional>
104   auto opt_string = std::optional<std::string>{};
105   auto out = std::ostringstream{};
108 m4_define([_BISON_CXXSTD_20_snippet],
109 [[  // C++20
112 m4_define([_BISON_CXXSTD_2B_snippet],
113 [[  // C++2B
117 m4_define([_BISON_CXXSTD_testbody(98)],
118 [AC_LANG_PROGRAM([
119 _BISON_CXXSTD_98_snippet
120 ])])
122 m4_define([_BISON_CXXSTD_testbody(03)],
123 [AC_LANG_PROGRAM([
124 _BISON_CXXSTD_98_snippet
125 _BISON_CXXSTD_03_snippet
126 ])])
128 m4_define([_BISON_CXXSTD_testbody(11)],
129 [AC_LANG_PROGRAM([
130 _BISON_CXXSTD_98_snippet
131 _BISON_CXXSTD_03_snippet
132 _BISON_CXXSTD_11_snippet
133 ])])
135 m4_define([_BISON_CXXSTD_testbody(14)],
136 [AC_LANG_PROGRAM([
137 _BISON_CXXSTD_98_snippet
138 _BISON_CXXSTD_03_snippet
139 _BISON_CXXSTD_11_snippet
140 _BISON_CXXSTD_14_snippet
141 ])])
143 m4_define([_BISON_CXXSTD_testbody(17)],
144 [AC_LANG_PROGRAM([
145 _BISON_CXXSTD_98_snippet
146 _BISON_CXXSTD_03_snippet
147 _BISON_CXXSTD_11_snippet
148 _BISON_CXXSTD_14_snippet
149 _BISON_CXXSTD_17_snippet
150 ])])
152 m4_define([_BISON_CXXSTD_testbody(20)],
153 [AC_LANG_PROGRAM([
154 _BISON_CXXSTD_98_snippet
155 _BISON_CXXSTD_03_snippet
156 _BISON_CXXSTD_11_snippet
157 _BISON_CXXSTD_14_snippet
158 _BISON_CXXSTD_17_snippet
159 _BISON_CXXSTD_20_snippet
160 ])])
162 m4_define([_BISON_CXXSTD_testbody(2b)],
163 [AC_LANG_PROGRAM([
164 _BISON_CXXSTD_98_snippet
165 _BISON_CXXSTD_03_snippet
166 _BISON_CXXSTD_11_snippet
167 _BISON_CXXSTD_14_snippet
168 _BISON_CXXSTD_17_snippet
169 _BISON_CXXSTD_20_snippet
170 _BISON_CXXSTD_2B_snippet
171 ])])
174 m4_define([_BISON_CXXSTD_testbody],
175 [m4_ifdef([$0($1)],
176           [m4_indir([$0($1)], m4_shift2($@))],
177           [m4_fatal([$0: unknown C++ standard: $1])])])
180 # BISON_CXXSTD(STD)
181 # -----------------
182 # Check whether the C++ compiler supports STD (11, 98, 2b, etc.).
183 # If it does, AC_SUBST 'CXX<STD>_CXXFLAGS' to the corresponding flags.
184 AC_DEFUN([BISON_CXXSTD],
185 [AC_REQUIRE([AC_PROG_CXX])
186 AC_LANG_PUSH([C++])
187 for f in '-std=c++$1' '-std=c++$1 -stdlib=libc++'
189   BISON_CHECK_COMPILER_FLAG([$f],
190                      [AC_SUBST(m4_toupper([CXX$1_CXXFLAGS]), [$f]) break],
191                      [], [],
192                      [_BISON_CXXSTD_testbody($1)])
193 done
194 AC_LANG_POP([C++])