xref: /aosp_15_r20/external/elfutils/m4/ax_cxx_compile_stdcxx.m4 (revision 7304104da70ce23c86437a01be71edd1a2d7f37e)
1*7304104dSAndroid Build Coastguard Worker# ===========================================================================
2*7304104dSAndroid Build Coastguard Worker#  https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html
3*7304104dSAndroid Build Coastguard Worker# ===========================================================================
4*7304104dSAndroid Build Coastguard Worker#
5*7304104dSAndroid Build Coastguard Worker# SYNOPSIS
6*7304104dSAndroid Build Coastguard Worker#
7*7304104dSAndroid Build Coastguard Worker#   AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional])
8*7304104dSAndroid Build Coastguard Worker#
9*7304104dSAndroid Build Coastguard Worker# DESCRIPTION
10*7304104dSAndroid Build Coastguard Worker#
11*7304104dSAndroid Build Coastguard Worker#   Check for baseline language coverage in the compiler for the specified
12*7304104dSAndroid Build Coastguard Worker#   version of the C++ standard.  If necessary, add switches to CXX and
13*7304104dSAndroid Build Coastguard Worker#   CXXCPP to enable support.  VERSION may be '11', '14', '17', or '20' for
14*7304104dSAndroid Build Coastguard Worker#   the respective C++ standard version.
15*7304104dSAndroid Build Coastguard Worker#
16*7304104dSAndroid Build Coastguard Worker#   The second argument, if specified, indicates whether you insist on an
17*7304104dSAndroid Build Coastguard Worker#   extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
18*7304104dSAndroid Build Coastguard Worker#   -std=c++11).  If neither is specified, you get whatever works, with
19*7304104dSAndroid Build Coastguard Worker#   preference for no added switch, and then for an extended mode.
20*7304104dSAndroid Build Coastguard Worker#
21*7304104dSAndroid Build Coastguard Worker#   The third argument, if specified 'mandatory' or if left unspecified,
22*7304104dSAndroid Build Coastguard Worker#   indicates that baseline support for the specified C++ standard is
23*7304104dSAndroid Build Coastguard Worker#   required and that the macro should error out if no mode with that
24*7304104dSAndroid Build Coastguard Worker#   support is found.  If specified 'optional', then configuration proceeds
25*7304104dSAndroid Build Coastguard Worker#   regardless, after defining HAVE_CXX${VERSION} if and only if a
26*7304104dSAndroid Build Coastguard Worker#   supporting mode is found.
27*7304104dSAndroid Build Coastguard Worker#
28*7304104dSAndroid Build Coastguard Worker# LICENSE
29*7304104dSAndroid Build Coastguard Worker#
30*7304104dSAndroid Build Coastguard Worker#   Copyright (c) 2008 Benjamin Kosnik <[email protected]>
31*7304104dSAndroid Build Coastguard Worker#   Copyright (c) 2012 Zack Weinberg <[email protected]>
32*7304104dSAndroid Build Coastguard Worker#   Copyright (c) 2013 Roy Stogner <[email protected]>
33*7304104dSAndroid Build Coastguard Worker#   Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <[email protected]>
34*7304104dSAndroid Build Coastguard Worker#   Copyright (c) 2015 Paul Norman <[email protected]>
35*7304104dSAndroid Build Coastguard Worker#   Copyright (c) 2015 Moritz Klammler <[email protected]>
36*7304104dSAndroid Build Coastguard Worker#   Copyright (c) 2016, 2018 Krzesimir Nowak <[email protected]>
37*7304104dSAndroid Build Coastguard Worker#   Copyright (c) 2019 Enji Cooper <[email protected]>
38*7304104dSAndroid Build Coastguard Worker#   Copyright (c) 2020 Jason Merrill <[email protected]>
39*7304104dSAndroid Build Coastguard Worker#   Copyright (c) 2021 Jörn Heusipp <[email protected]>
40*7304104dSAndroid Build Coastguard Worker#
41*7304104dSAndroid Build Coastguard Worker#   Copying and distribution of this file, with or without modification, are
42*7304104dSAndroid Build Coastguard Worker#   permitted in any medium without royalty provided the copyright notice
43*7304104dSAndroid Build Coastguard Worker#   and this notice are preserved.  This file is offered as-is, without any
44*7304104dSAndroid Build Coastguard Worker#   warranty.
45*7304104dSAndroid Build Coastguard Worker
46*7304104dSAndroid Build Coastguard Worker#serial 18
47*7304104dSAndroid Build Coastguard Worker
48*7304104dSAndroid Build Coastguard Workerdnl  This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro
49*7304104dSAndroid Build Coastguard Workerdnl  (serial version number 13).
50*7304104dSAndroid Build Coastguard Worker
51*7304104dSAndroid Build Coastguard WorkerAC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
52*7304104dSAndroid Build Coastguard Worker  m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"],
53*7304104dSAndroid Build Coastguard Worker        [$1], [14], [ax_cxx_compile_alternatives="14 1y"],
54*7304104dSAndroid Build Coastguard Worker        [$1], [17], [ax_cxx_compile_alternatives="17 1z"],
55*7304104dSAndroid Build Coastguard Worker        [$1], [20], [ax_cxx_compile_alternatives="20"],
56*7304104dSAndroid Build Coastguard Worker        [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl
57*7304104dSAndroid Build Coastguard Worker  m4_if([$2], [], [],
58*7304104dSAndroid Build Coastguard Worker        [$2], [ext], [],
59*7304104dSAndroid Build Coastguard Worker        [$2], [noext], [],
60*7304104dSAndroid Build Coastguard Worker        [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl
61*7304104dSAndroid Build Coastguard Worker  m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true],
62*7304104dSAndroid Build Coastguard Worker        [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true],
63*7304104dSAndroid Build Coastguard Worker        [$3], [optional], [ax_cxx_compile_cxx$1_required=false],
64*7304104dSAndroid Build Coastguard Worker        [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])])
65*7304104dSAndroid Build Coastguard Worker  AC_LANG_PUSH([C++])dnl
66*7304104dSAndroid Build Coastguard Worker  ac_success=no
67*7304104dSAndroid Build Coastguard Worker
68*7304104dSAndroid Build Coastguard Worker  m4_if([$2], [], [dnl
69*7304104dSAndroid Build Coastguard Worker    AC_CACHE_CHECK(whether $CXX supports C++$1 features by default,
70*7304104dSAndroid Build Coastguard Worker		   ax_cv_cxx_compile_cxx$1,
71*7304104dSAndroid Build Coastguard Worker      [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
72*7304104dSAndroid Build Coastguard Worker        [ax_cv_cxx_compile_cxx$1=yes],
73*7304104dSAndroid Build Coastguard Worker        [ax_cv_cxx_compile_cxx$1=no])])
74*7304104dSAndroid Build Coastguard Worker    if test x$ax_cv_cxx_compile_cxx$1 = xyes; then
75*7304104dSAndroid Build Coastguard Worker      ac_success=yes
76*7304104dSAndroid Build Coastguard Worker    fi])
77*7304104dSAndroid Build Coastguard Worker
78*7304104dSAndroid Build Coastguard Worker  m4_if([$2], [noext], [], [dnl
79*7304104dSAndroid Build Coastguard Worker  if test x$ac_success = xno; then
80*7304104dSAndroid Build Coastguard Worker    for alternative in ${ax_cxx_compile_alternatives}; do
81*7304104dSAndroid Build Coastguard Worker      switch="-std=gnu++${alternative}"
82*7304104dSAndroid Build Coastguard Worker      cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
83*7304104dSAndroid Build Coastguard Worker      AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
84*7304104dSAndroid Build Coastguard Worker                     $cachevar,
85*7304104dSAndroid Build Coastguard Worker        [ac_save_CXX="$CXX"
86*7304104dSAndroid Build Coastguard Worker         CXX="$CXX $switch"
87*7304104dSAndroid Build Coastguard Worker         AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
88*7304104dSAndroid Build Coastguard Worker          [eval $cachevar=yes],
89*7304104dSAndroid Build Coastguard Worker          [eval $cachevar=no])
90*7304104dSAndroid Build Coastguard Worker         CXX="$ac_save_CXX"])
91*7304104dSAndroid Build Coastguard Worker      if eval test x\$$cachevar = xyes; then
92*7304104dSAndroid Build Coastguard Worker        CXX="$CXX $switch"
93*7304104dSAndroid Build Coastguard Worker        if test -n "$CXXCPP" ; then
94*7304104dSAndroid Build Coastguard Worker          CXXCPP="$CXXCPP $switch"
95*7304104dSAndroid Build Coastguard Worker        fi
96*7304104dSAndroid Build Coastguard Worker        ac_success=yes
97*7304104dSAndroid Build Coastguard Worker        break
98*7304104dSAndroid Build Coastguard Worker      fi
99*7304104dSAndroid Build Coastguard Worker    done
100*7304104dSAndroid Build Coastguard Worker  fi])
101*7304104dSAndroid Build Coastguard Worker
102*7304104dSAndroid Build Coastguard Worker  m4_if([$2], [ext], [], [dnl
103*7304104dSAndroid Build Coastguard Worker  if test x$ac_success = xno; then
104*7304104dSAndroid Build Coastguard Worker    dnl HP's aCC needs +std=c++11 according to:
105*7304104dSAndroid Build Coastguard Worker    dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf
106*7304104dSAndroid Build Coastguard Worker    dnl Cray's crayCC needs "-h std=c++11"
107*7304104dSAndroid Build Coastguard Worker    dnl MSVC needs -std:c++NN for C++17 and later (default is C++14)
108*7304104dSAndroid Build Coastguard Worker    for alternative in ${ax_cxx_compile_alternatives}; do
109*7304104dSAndroid Build Coastguard Worker      for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}" MSVC; do
110*7304104dSAndroid Build Coastguard Worker        if test x"$switch" = xMSVC; then
111*7304104dSAndroid Build Coastguard Worker          dnl AS_TR_SH maps both `:` and `=` to `_` so -std:c++17 would collide
112*7304104dSAndroid Build Coastguard Worker          dnl with -std=c++17.  We suffix the cache variable name with _MSVC to
113*7304104dSAndroid Build Coastguard Worker          dnl avoid this.
114*7304104dSAndroid Build Coastguard Worker          switch=-std:c++${alternative}
115*7304104dSAndroid Build Coastguard Worker          cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_${switch}_MSVC])
116*7304104dSAndroid Build Coastguard Worker        else
117*7304104dSAndroid Build Coastguard Worker          cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
118*7304104dSAndroid Build Coastguard Worker        fi
119*7304104dSAndroid Build Coastguard Worker        AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
120*7304104dSAndroid Build Coastguard Worker                       $cachevar,
121*7304104dSAndroid Build Coastguard Worker          [ac_save_CXX="$CXX"
122*7304104dSAndroid Build Coastguard Worker           CXX="$CXX $switch"
123*7304104dSAndroid Build Coastguard Worker           AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
124*7304104dSAndroid Build Coastguard Worker            [eval $cachevar=yes],
125*7304104dSAndroid Build Coastguard Worker            [eval $cachevar=no])
126*7304104dSAndroid Build Coastguard Worker           CXX="$ac_save_CXX"])
127*7304104dSAndroid Build Coastguard Worker        if eval test x\$$cachevar = xyes; then
128*7304104dSAndroid Build Coastguard Worker          CXX="$CXX $switch"
129*7304104dSAndroid Build Coastguard Worker          if test -n "$CXXCPP" ; then
130*7304104dSAndroid Build Coastguard Worker            CXXCPP="$CXXCPP $switch"
131*7304104dSAndroid Build Coastguard Worker          fi
132*7304104dSAndroid Build Coastguard Worker          ac_success=yes
133*7304104dSAndroid Build Coastguard Worker          break
134*7304104dSAndroid Build Coastguard Worker        fi
135*7304104dSAndroid Build Coastguard Worker      done
136*7304104dSAndroid Build Coastguard Worker      if test x$ac_success = xyes; then
137*7304104dSAndroid Build Coastguard Worker        break
138*7304104dSAndroid Build Coastguard Worker      fi
139*7304104dSAndroid Build Coastguard Worker    done
140*7304104dSAndroid Build Coastguard Worker  fi])
141*7304104dSAndroid Build Coastguard Worker  AC_LANG_POP([C++])
142*7304104dSAndroid Build Coastguard Worker  if test x$ax_cxx_compile_cxx$1_required = xtrue; then
143*7304104dSAndroid Build Coastguard Worker    if test x$ac_success = xno; then
144*7304104dSAndroid Build Coastguard Worker      AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.])
145*7304104dSAndroid Build Coastguard Worker    fi
146*7304104dSAndroid Build Coastguard Worker  fi
147*7304104dSAndroid Build Coastguard Worker  if test x$ac_success = xno; then
148*7304104dSAndroid Build Coastguard Worker    HAVE_CXX$1=0
149*7304104dSAndroid Build Coastguard Worker    AC_MSG_NOTICE([No compiler with C++$1 support was found])
150*7304104dSAndroid Build Coastguard Worker  else
151*7304104dSAndroid Build Coastguard Worker    HAVE_CXX$1=1
152*7304104dSAndroid Build Coastguard Worker    AC_DEFINE(HAVE_CXX$1,1,
153*7304104dSAndroid Build Coastguard Worker              [define if the compiler supports basic C++$1 syntax])
154*7304104dSAndroid Build Coastguard Worker  fi
155*7304104dSAndroid Build Coastguard Worker  AC_SUBST(HAVE_CXX$1)
156*7304104dSAndroid Build Coastguard Worker])
157*7304104dSAndroid Build Coastguard Worker
158*7304104dSAndroid Build Coastguard Worker
159*7304104dSAndroid Build Coastguard Workerdnl  Test body for checking C++11 support
160*7304104dSAndroid Build Coastguard Worker
161*7304104dSAndroid Build Coastguard Workerm4_define([_AX_CXX_COMPILE_STDCXX_testbody_11],
162*7304104dSAndroid Build Coastguard Worker  _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
163*7304104dSAndroid Build Coastguard Worker)
164*7304104dSAndroid Build Coastguard Worker
165*7304104dSAndroid Build Coastguard Workerdnl  Test body for checking C++14 support
166*7304104dSAndroid Build Coastguard Worker
167*7304104dSAndroid Build Coastguard Workerm4_define([_AX_CXX_COMPILE_STDCXX_testbody_14],
168*7304104dSAndroid Build Coastguard Worker  _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
169*7304104dSAndroid Build Coastguard Worker  _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
170*7304104dSAndroid Build Coastguard Worker)
171*7304104dSAndroid Build Coastguard Worker
172*7304104dSAndroid Build Coastguard Workerdnl  Test body for checking C++17 support
173*7304104dSAndroid Build Coastguard Worker
174*7304104dSAndroid Build Coastguard Workerm4_define([_AX_CXX_COMPILE_STDCXX_testbody_17],
175*7304104dSAndroid Build Coastguard Worker  _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
176*7304104dSAndroid Build Coastguard Worker  _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
177*7304104dSAndroid Build Coastguard Worker  _AX_CXX_COMPILE_STDCXX_testbody_new_in_17
178*7304104dSAndroid Build Coastguard Worker)
179*7304104dSAndroid Build Coastguard Worker
180*7304104dSAndroid Build Coastguard Workerdnl  Test body for checking C++20 support
181*7304104dSAndroid Build Coastguard Worker
182*7304104dSAndroid Build Coastguard Workerm4_define([_AX_CXX_COMPILE_STDCXX_testbody_20],
183*7304104dSAndroid Build Coastguard Worker  _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
184*7304104dSAndroid Build Coastguard Worker  _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
185*7304104dSAndroid Build Coastguard Worker  _AX_CXX_COMPILE_STDCXX_testbody_new_in_17
186*7304104dSAndroid Build Coastguard Worker  _AX_CXX_COMPILE_STDCXX_testbody_new_in_20
187*7304104dSAndroid Build Coastguard Worker)
188*7304104dSAndroid Build Coastguard Worker
189*7304104dSAndroid Build Coastguard Worker
190*7304104dSAndroid Build Coastguard Workerdnl  Tests for new features in C++11
191*7304104dSAndroid Build Coastguard Worker
192*7304104dSAndroid Build Coastguard Workerm4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[
193*7304104dSAndroid Build Coastguard Worker
194*7304104dSAndroid Build Coastguard Worker// If the compiler admits that it is not ready for C++11, why torture it?
195*7304104dSAndroid Build Coastguard Worker// Hopefully, this will speed up the test.
196*7304104dSAndroid Build Coastguard Worker
197*7304104dSAndroid Build Coastguard Worker#ifndef __cplusplus
198*7304104dSAndroid Build Coastguard Worker
199*7304104dSAndroid Build Coastguard Worker#error "This is not a C++ compiler"
200*7304104dSAndroid Build Coastguard Worker
201*7304104dSAndroid Build Coastguard Worker// MSVC always sets __cplusplus to 199711L in older versions; newer versions
202*7304104dSAndroid Build Coastguard Worker// only set it correctly if /Zc:__cplusplus is specified as well as a
203*7304104dSAndroid Build Coastguard Worker// /std:c++NN switch:
204*7304104dSAndroid Build Coastguard Worker// https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/
205*7304104dSAndroid Build Coastguard Worker#elif __cplusplus < 201103L && !defined _MSC_VER
206*7304104dSAndroid Build Coastguard Worker
207*7304104dSAndroid Build Coastguard Worker#error "This is not a C++11 compiler"
208*7304104dSAndroid Build Coastguard Worker
209*7304104dSAndroid Build Coastguard Worker#else
210*7304104dSAndroid Build Coastguard Worker
211*7304104dSAndroid Build Coastguard Workernamespace cxx11
212*7304104dSAndroid Build Coastguard Worker{
213*7304104dSAndroid Build Coastguard Worker
214*7304104dSAndroid Build Coastguard Worker  namespace test_static_assert
215*7304104dSAndroid Build Coastguard Worker  {
216*7304104dSAndroid Build Coastguard Worker
217*7304104dSAndroid Build Coastguard Worker    template <typename T>
218*7304104dSAndroid Build Coastguard Worker    struct check
219*7304104dSAndroid Build Coastguard Worker    {
220*7304104dSAndroid Build Coastguard Worker      static_assert(sizeof(int) <= sizeof(T), "not big enough");
221*7304104dSAndroid Build Coastguard Worker    };
222*7304104dSAndroid Build Coastguard Worker
223*7304104dSAndroid Build Coastguard Worker  }
224*7304104dSAndroid Build Coastguard Worker
225*7304104dSAndroid Build Coastguard Worker  namespace test_final_override
226*7304104dSAndroid Build Coastguard Worker  {
227*7304104dSAndroid Build Coastguard Worker
228*7304104dSAndroid Build Coastguard Worker    struct Base
229*7304104dSAndroid Build Coastguard Worker    {
230*7304104dSAndroid Build Coastguard Worker      virtual ~Base() {}
231*7304104dSAndroid Build Coastguard Worker      virtual void f() {}
232*7304104dSAndroid Build Coastguard Worker    };
233*7304104dSAndroid Build Coastguard Worker
234*7304104dSAndroid Build Coastguard Worker    struct Derived : public Base
235*7304104dSAndroid Build Coastguard Worker    {
236*7304104dSAndroid Build Coastguard Worker      virtual ~Derived() override {}
237*7304104dSAndroid Build Coastguard Worker      virtual void f() override {}
238*7304104dSAndroid Build Coastguard Worker    };
239*7304104dSAndroid Build Coastguard Worker
240*7304104dSAndroid Build Coastguard Worker  }
241*7304104dSAndroid Build Coastguard Worker
242*7304104dSAndroid Build Coastguard Worker  namespace test_double_right_angle_brackets
243*7304104dSAndroid Build Coastguard Worker  {
244*7304104dSAndroid Build Coastguard Worker
245*7304104dSAndroid Build Coastguard Worker    template < typename T >
246*7304104dSAndroid Build Coastguard Worker    struct check {};
247*7304104dSAndroid Build Coastguard Worker
248*7304104dSAndroid Build Coastguard Worker    typedef check<void> single_type;
249*7304104dSAndroid Build Coastguard Worker    typedef check<check<void>> double_type;
250*7304104dSAndroid Build Coastguard Worker    typedef check<check<check<void>>> triple_type;
251*7304104dSAndroid Build Coastguard Worker    typedef check<check<check<check<void>>>> quadruple_type;
252*7304104dSAndroid Build Coastguard Worker
253*7304104dSAndroid Build Coastguard Worker  }
254*7304104dSAndroid Build Coastguard Worker
255*7304104dSAndroid Build Coastguard Worker  namespace test_decltype
256*7304104dSAndroid Build Coastguard Worker  {
257*7304104dSAndroid Build Coastguard Worker
258*7304104dSAndroid Build Coastguard Worker    int
259*7304104dSAndroid Build Coastguard Worker    f()
260*7304104dSAndroid Build Coastguard Worker    {
261*7304104dSAndroid Build Coastguard Worker      int a = 1;
262*7304104dSAndroid Build Coastguard Worker      decltype(a) b = 2;
263*7304104dSAndroid Build Coastguard Worker      return a + b;
264*7304104dSAndroid Build Coastguard Worker    }
265*7304104dSAndroid Build Coastguard Worker
266*7304104dSAndroid Build Coastguard Worker  }
267*7304104dSAndroid Build Coastguard Worker
268*7304104dSAndroid Build Coastguard Worker  namespace test_type_deduction
269*7304104dSAndroid Build Coastguard Worker  {
270*7304104dSAndroid Build Coastguard Worker
271*7304104dSAndroid Build Coastguard Worker    template < typename T1, typename T2 >
272*7304104dSAndroid Build Coastguard Worker    struct is_same
273*7304104dSAndroid Build Coastguard Worker    {
274*7304104dSAndroid Build Coastguard Worker      static const bool value = false;
275*7304104dSAndroid Build Coastguard Worker    };
276*7304104dSAndroid Build Coastguard Worker
277*7304104dSAndroid Build Coastguard Worker    template < typename T >
278*7304104dSAndroid Build Coastguard Worker    struct is_same<T, T>
279*7304104dSAndroid Build Coastguard Worker    {
280*7304104dSAndroid Build Coastguard Worker      static const bool value = true;
281*7304104dSAndroid Build Coastguard Worker    };
282*7304104dSAndroid Build Coastguard Worker
283*7304104dSAndroid Build Coastguard Worker    template < typename T1, typename T2 >
284*7304104dSAndroid Build Coastguard Worker    auto
285*7304104dSAndroid Build Coastguard Worker    add(T1 a1, T2 a2) -> decltype(a1 + a2)
286*7304104dSAndroid Build Coastguard Worker    {
287*7304104dSAndroid Build Coastguard Worker      return a1 + a2;
288*7304104dSAndroid Build Coastguard Worker    }
289*7304104dSAndroid Build Coastguard Worker
290*7304104dSAndroid Build Coastguard Worker    int
291*7304104dSAndroid Build Coastguard Worker    test(const int c, volatile int v)
292*7304104dSAndroid Build Coastguard Worker    {
293*7304104dSAndroid Build Coastguard Worker      static_assert(is_same<int, decltype(0)>::value == true, "");
294*7304104dSAndroid Build Coastguard Worker      static_assert(is_same<int, decltype(c)>::value == false, "");
295*7304104dSAndroid Build Coastguard Worker      static_assert(is_same<int, decltype(v)>::value == false, "");
296*7304104dSAndroid Build Coastguard Worker      auto ac = c;
297*7304104dSAndroid Build Coastguard Worker      auto av = v;
298*7304104dSAndroid Build Coastguard Worker      auto sumi = ac + av + 'x';
299*7304104dSAndroid Build Coastguard Worker      auto sumf = ac + av + 1.0;
300*7304104dSAndroid Build Coastguard Worker      static_assert(is_same<int, decltype(ac)>::value == true, "");
301*7304104dSAndroid Build Coastguard Worker      static_assert(is_same<int, decltype(av)>::value == true, "");
302*7304104dSAndroid Build Coastguard Worker      static_assert(is_same<int, decltype(sumi)>::value == true, "");
303*7304104dSAndroid Build Coastguard Worker      static_assert(is_same<int, decltype(sumf)>::value == false, "");
304*7304104dSAndroid Build Coastguard Worker      static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
305*7304104dSAndroid Build Coastguard Worker      return (sumf > 0.0) ? sumi : add(c, v);
306*7304104dSAndroid Build Coastguard Worker    }
307*7304104dSAndroid Build Coastguard Worker
308*7304104dSAndroid Build Coastguard Worker  }
309*7304104dSAndroid Build Coastguard Worker
310*7304104dSAndroid Build Coastguard Worker  namespace test_noexcept
311*7304104dSAndroid Build Coastguard Worker  {
312*7304104dSAndroid Build Coastguard Worker
313*7304104dSAndroid Build Coastguard Worker    int f() { return 0; }
314*7304104dSAndroid Build Coastguard Worker    int g() noexcept { return 0; }
315*7304104dSAndroid Build Coastguard Worker
316*7304104dSAndroid Build Coastguard Worker    static_assert(noexcept(f()) == false, "");
317*7304104dSAndroid Build Coastguard Worker    static_assert(noexcept(g()) == true, "");
318*7304104dSAndroid Build Coastguard Worker
319*7304104dSAndroid Build Coastguard Worker  }
320*7304104dSAndroid Build Coastguard Worker
321*7304104dSAndroid Build Coastguard Worker  namespace test_constexpr
322*7304104dSAndroid Build Coastguard Worker  {
323*7304104dSAndroid Build Coastguard Worker
324*7304104dSAndroid Build Coastguard Worker    template < typename CharT >
325*7304104dSAndroid Build Coastguard Worker    unsigned long constexpr
326*7304104dSAndroid Build Coastguard Worker    strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
327*7304104dSAndroid Build Coastguard Worker    {
328*7304104dSAndroid Build Coastguard Worker      return *s ? strlen_c_r(s + 1, acc + 1) : acc;
329*7304104dSAndroid Build Coastguard Worker    }
330*7304104dSAndroid Build Coastguard Worker
331*7304104dSAndroid Build Coastguard Worker    template < typename CharT >
332*7304104dSAndroid Build Coastguard Worker    unsigned long constexpr
333*7304104dSAndroid Build Coastguard Worker    strlen_c(const CharT *const s) noexcept
334*7304104dSAndroid Build Coastguard Worker    {
335*7304104dSAndroid Build Coastguard Worker      return strlen_c_r(s, 0UL);
336*7304104dSAndroid Build Coastguard Worker    }
337*7304104dSAndroid Build Coastguard Worker
338*7304104dSAndroid Build Coastguard Worker    static_assert(strlen_c("") == 0UL, "");
339*7304104dSAndroid Build Coastguard Worker    static_assert(strlen_c("1") == 1UL, "");
340*7304104dSAndroid Build Coastguard Worker    static_assert(strlen_c("example") == 7UL, "");
341*7304104dSAndroid Build Coastguard Worker    static_assert(strlen_c("another\0example") == 7UL, "");
342*7304104dSAndroid Build Coastguard Worker
343*7304104dSAndroid Build Coastguard Worker  }
344*7304104dSAndroid Build Coastguard Worker
345*7304104dSAndroid Build Coastguard Worker  namespace test_rvalue_references
346*7304104dSAndroid Build Coastguard Worker  {
347*7304104dSAndroid Build Coastguard Worker
348*7304104dSAndroid Build Coastguard Worker    template < int N >
349*7304104dSAndroid Build Coastguard Worker    struct answer
350*7304104dSAndroid Build Coastguard Worker    {
351*7304104dSAndroid Build Coastguard Worker      static constexpr int value = N;
352*7304104dSAndroid Build Coastguard Worker    };
353*7304104dSAndroid Build Coastguard Worker
354*7304104dSAndroid Build Coastguard Worker    answer<1> f(int&)       { return answer<1>(); }
355*7304104dSAndroid Build Coastguard Worker    answer<2> f(const int&) { return answer<2>(); }
356*7304104dSAndroid Build Coastguard Worker    answer<3> f(int&&)      { return answer<3>(); }
357*7304104dSAndroid Build Coastguard Worker
358*7304104dSAndroid Build Coastguard Worker    void
359*7304104dSAndroid Build Coastguard Worker    test()
360*7304104dSAndroid Build Coastguard Worker    {
361*7304104dSAndroid Build Coastguard Worker      int i = 0;
362*7304104dSAndroid Build Coastguard Worker      const int c = 0;
363*7304104dSAndroid Build Coastguard Worker      static_assert(decltype(f(i))::value == 1, "");
364*7304104dSAndroid Build Coastguard Worker      static_assert(decltype(f(c))::value == 2, "");
365*7304104dSAndroid Build Coastguard Worker      static_assert(decltype(f(0))::value == 3, "");
366*7304104dSAndroid Build Coastguard Worker    }
367*7304104dSAndroid Build Coastguard Worker
368*7304104dSAndroid Build Coastguard Worker  }
369*7304104dSAndroid Build Coastguard Worker
370*7304104dSAndroid Build Coastguard Worker  namespace test_uniform_initialization
371*7304104dSAndroid Build Coastguard Worker  {
372*7304104dSAndroid Build Coastguard Worker
373*7304104dSAndroid Build Coastguard Worker    struct test
374*7304104dSAndroid Build Coastguard Worker    {
375*7304104dSAndroid Build Coastguard Worker      static const int zero {};
376*7304104dSAndroid Build Coastguard Worker      static const int one {1};
377*7304104dSAndroid Build Coastguard Worker    };
378*7304104dSAndroid Build Coastguard Worker
379*7304104dSAndroid Build Coastguard Worker    static_assert(test::zero == 0, "");
380*7304104dSAndroid Build Coastguard Worker    static_assert(test::one == 1, "");
381*7304104dSAndroid Build Coastguard Worker
382*7304104dSAndroid Build Coastguard Worker  }
383*7304104dSAndroid Build Coastguard Worker
384*7304104dSAndroid Build Coastguard Worker  namespace test_lambdas
385*7304104dSAndroid Build Coastguard Worker  {
386*7304104dSAndroid Build Coastguard Worker
387*7304104dSAndroid Build Coastguard Worker    void
388*7304104dSAndroid Build Coastguard Worker    test1()
389*7304104dSAndroid Build Coastguard Worker    {
390*7304104dSAndroid Build Coastguard Worker      auto lambda1 = [](){};
391*7304104dSAndroid Build Coastguard Worker      auto lambda2 = lambda1;
392*7304104dSAndroid Build Coastguard Worker      lambda1();
393*7304104dSAndroid Build Coastguard Worker      lambda2();
394*7304104dSAndroid Build Coastguard Worker    }
395*7304104dSAndroid Build Coastguard Worker
396*7304104dSAndroid Build Coastguard Worker    int
397*7304104dSAndroid Build Coastguard Worker    test2()
398*7304104dSAndroid Build Coastguard Worker    {
399*7304104dSAndroid Build Coastguard Worker      auto a = [](int i, int j){ return i + j; }(1, 2);
400*7304104dSAndroid Build Coastguard Worker      auto b = []() -> int { return '0'; }();
401*7304104dSAndroid Build Coastguard Worker      auto c = [=](){ return a + b; }();
402*7304104dSAndroid Build Coastguard Worker      auto d = [&](){ return c; }();
403*7304104dSAndroid Build Coastguard Worker      auto e = [a, &b](int x) mutable {
404*7304104dSAndroid Build Coastguard Worker        const auto identity = [](int y){ return y; };
405*7304104dSAndroid Build Coastguard Worker        for (auto i = 0; i < a; ++i)
406*7304104dSAndroid Build Coastguard Worker          a += b--;
407*7304104dSAndroid Build Coastguard Worker        return x + identity(a + b);
408*7304104dSAndroid Build Coastguard Worker      }(0);
409*7304104dSAndroid Build Coastguard Worker      return a + b + c + d + e;
410*7304104dSAndroid Build Coastguard Worker    }
411*7304104dSAndroid Build Coastguard Worker
412*7304104dSAndroid Build Coastguard Worker    int
413*7304104dSAndroid Build Coastguard Worker    test3()
414*7304104dSAndroid Build Coastguard Worker    {
415*7304104dSAndroid Build Coastguard Worker      const auto nullary = [](){ return 0; };
416*7304104dSAndroid Build Coastguard Worker      const auto unary = [](int x){ return x; };
417*7304104dSAndroid Build Coastguard Worker      using nullary_t = decltype(nullary);
418*7304104dSAndroid Build Coastguard Worker      using unary_t = decltype(unary);
419*7304104dSAndroid Build Coastguard Worker      const auto higher1st = [](nullary_t f){ return f(); };
420*7304104dSAndroid Build Coastguard Worker      const auto higher2nd = [unary](nullary_t f1){
421*7304104dSAndroid Build Coastguard Worker        return [unary, f1](unary_t f2){ return f2(unary(f1())); };
422*7304104dSAndroid Build Coastguard Worker      };
423*7304104dSAndroid Build Coastguard Worker      return higher1st(nullary) + higher2nd(nullary)(unary);
424*7304104dSAndroid Build Coastguard Worker    }
425*7304104dSAndroid Build Coastguard Worker
426*7304104dSAndroid Build Coastguard Worker  }
427*7304104dSAndroid Build Coastguard Worker
428*7304104dSAndroid Build Coastguard Worker  namespace test_variadic_templates
429*7304104dSAndroid Build Coastguard Worker  {
430*7304104dSAndroid Build Coastguard Worker
431*7304104dSAndroid Build Coastguard Worker    template <int...>
432*7304104dSAndroid Build Coastguard Worker    struct sum;
433*7304104dSAndroid Build Coastguard Worker
434*7304104dSAndroid Build Coastguard Worker    template <int N0, int... N1toN>
435*7304104dSAndroid Build Coastguard Worker    struct sum<N0, N1toN...>
436*7304104dSAndroid Build Coastguard Worker    {
437*7304104dSAndroid Build Coastguard Worker      static constexpr auto value = N0 + sum<N1toN...>::value;
438*7304104dSAndroid Build Coastguard Worker    };
439*7304104dSAndroid Build Coastguard Worker
440*7304104dSAndroid Build Coastguard Worker    template <>
441*7304104dSAndroid Build Coastguard Worker    struct sum<>
442*7304104dSAndroid Build Coastguard Worker    {
443*7304104dSAndroid Build Coastguard Worker      static constexpr auto value = 0;
444*7304104dSAndroid Build Coastguard Worker    };
445*7304104dSAndroid Build Coastguard Worker
446*7304104dSAndroid Build Coastguard Worker    static_assert(sum<>::value == 0, "");
447*7304104dSAndroid Build Coastguard Worker    static_assert(sum<1>::value == 1, "");
448*7304104dSAndroid Build Coastguard Worker    static_assert(sum<23>::value == 23, "");
449*7304104dSAndroid Build Coastguard Worker    static_assert(sum<1, 2>::value == 3, "");
450*7304104dSAndroid Build Coastguard Worker    static_assert(sum<5, 5, 11>::value == 21, "");
451*7304104dSAndroid Build Coastguard Worker    static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
452*7304104dSAndroid Build Coastguard Worker
453*7304104dSAndroid Build Coastguard Worker  }
454*7304104dSAndroid Build Coastguard Worker
455*7304104dSAndroid Build Coastguard Worker  // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
456*7304104dSAndroid Build Coastguard Worker  // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
457*7304104dSAndroid Build Coastguard Worker  // because of this.
458*7304104dSAndroid Build Coastguard Worker  namespace test_template_alias_sfinae
459*7304104dSAndroid Build Coastguard Worker  {
460*7304104dSAndroid Build Coastguard Worker
461*7304104dSAndroid Build Coastguard Worker    struct foo {};
462*7304104dSAndroid Build Coastguard Worker
463*7304104dSAndroid Build Coastguard Worker    template<typename T>
464*7304104dSAndroid Build Coastguard Worker    using member = typename T::member_type;
465*7304104dSAndroid Build Coastguard Worker
466*7304104dSAndroid Build Coastguard Worker    template<typename T>
467*7304104dSAndroid Build Coastguard Worker    void func(...) {}
468*7304104dSAndroid Build Coastguard Worker
469*7304104dSAndroid Build Coastguard Worker    template<typename T>
470*7304104dSAndroid Build Coastguard Worker    void func(member<T>*) {}
471*7304104dSAndroid Build Coastguard Worker
472*7304104dSAndroid Build Coastguard Worker    void test();
473*7304104dSAndroid Build Coastguard Worker
474*7304104dSAndroid Build Coastguard Worker    void test() { func<foo>(0); }
475*7304104dSAndroid Build Coastguard Worker
476*7304104dSAndroid Build Coastguard Worker  }
477*7304104dSAndroid Build Coastguard Worker
478*7304104dSAndroid Build Coastguard Worker}  // namespace cxx11
479*7304104dSAndroid Build Coastguard Worker
480*7304104dSAndroid Build Coastguard Worker#endif  // __cplusplus >= 201103L
481*7304104dSAndroid Build Coastguard Worker
482*7304104dSAndroid Build Coastguard Worker]])
483*7304104dSAndroid Build Coastguard Worker
484*7304104dSAndroid Build Coastguard Worker
485*7304104dSAndroid Build Coastguard Workerdnl  Tests for new features in C++14
486*7304104dSAndroid Build Coastguard Worker
487*7304104dSAndroid Build Coastguard Workerm4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[
488*7304104dSAndroid Build Coastguard Worker
489*7304104dSAndroid Build Coastguard Worker// If the compiler admits that it is not ready for C++14, why torture it?
490*7304104dSAndroid Build Coastguard Worker// Hopefully, this will speed up the test.
491*7304104dSAndroid Build Coastguard Worker
492*7304104dSAndroid Build Coastguard Worker#ifndef __cplusplus
493*7304104dSAndroid Build Coastguard Worker
494*7304104dSAndroid Build Coastguard Worker#error "This is not a C++ compiler"
495*7304104dSAndroid Build Coastguard Worker
496*7304104dSAndroid Build Coastguard Worker#elif __cplusplus < 201402L && !defined _MSC_VER
497*7304104dSAndroid Build Coastguard Worker
498*7304104dSAndroid Build Coastguard Worker#error "This is not a C++14 compiler"
499*7304104dSAndroid Build Coastguard Worker
500*7304104dSAndroid Build Coastguard Worker#else
501*7304104dSAndroid Build Coastguard Worker
502*7304104dSAndroid Build Coastguard Workernamespace cxx14
503*7304104dSAndroid Build Coastguard Worker{
504*7304104dSAndroid Build Coastguard Worker
505*7304104dSAndroid Build Coastguard Worker  namespace test_polymorphic_lambdas
506*7304104dSAndroid Build Coastguard Worker  {
507*7304104dSAndroid Build Coastguard Worker
508*7304104dSAndroid Build Coastguard Worker    int
509*7304104dSAndroid Build Coastguard Worker    test()
510*7304104dSAndroid Build Coastguard Worker    {
511*7304104dSAndroid Build Coastguard Worker      const auto lambda = [](auto&&... args){
512*7304104dSAndroid Build Coastguard Worker        const auto istiny = [](auto x){
513*7304104dSAndroid Build Coastguard Worker          return (sizeof(x) == 1UL) ? 1 : 0;
514*7304104dSAndroid Build Coastguard Worker        };
515*7304104dSAndroid Build Coastguard Worker        const int aretiny[] = { istiny(args)... };
516*7304104dSAndroid Build Coastguard Worker        return aretiny[0];
517*7304104dSAndroid Build Coastguard Worker      };
518*7304104dSAndroid Build Coastguard Worker      return lambda(1, 1L, 1.0f, '1');
519*7304104dSAndroid Build Coastguard Worker    }
520*7304104dSAndroid Build Coastguard Worker
521*7304104dSAndroid Build Coastguard Worker  }
522*7304104dSAndroid Build Coastguard Worker
523*7304104dSAndroid Build Coastguard Worker  namespace test_binary_literals
524*7304104dSAndroid Build Coastguard Worker  {
525*7304104dSAndroid Build Coastguard Worker
526*7304104dSAndroid Build Coastguard Worker    constexpr auto ivii = 0b0000000000101010;
527*7304104dSAndroid Build Coastguard Worker    static_assert(ivii == 42, "wrong value");
528*7304104dSAndroid Build Coastguard Worker
529*7304104dSAndroid Build Coastguard Worker  }
530*7304104dSAndroid Build Coastguard Worker
531*7304104dSAndroid Build Coastguard Worker  namespace test_generalized_constexpr
532*7304104dSAndroid Build Coastguard Worker  {
533*7304104dSAndroid Build Coastguard Worker
534*7304104dSAndroid Build Coastguard Worker    template < typename CharT >
535*7304104dSAndroid Build Coastguard Worker    constexpr unsigned long
536*7304104dSAndroid Build Coastguard Worker    strlen_c(const CharT *const s) noexcept
537*7304104dSAndroid Build Coastguard Worker    {
538*7304104dSAndroid Build Coastguard Worker      auto length = 0UL;
539*7304104dSAndroid Build Coastguard Worker      for (auto p = s; *p; ++p)
540*7304104dSAndroid Build Coastguard Worker        ++length;
541*7304104dSAndroid Build Coastguard Worker      return length;
542*7304104dSAndroid Build Coastguard Worker    }
543*7304104dSAndroid Build Coastguard Worker
544*7304104dSAndroid Build Coastguard Worker    static_assert(strlen_c("") == 0UL, "");
545*7304104dSAndroid Build Coastguard Worker    static_assert(strlen_c("x") == 1UL, "");
546*7304104dSAndroid Build Coastguard Worker    static_assert(strlen_c("test") == 4UL, "");
547*7304104dSAndroid Build Coastguard Worker    static_assert(strlen_c("another\0test") == 7UL, "");
548*7304104dSAndroid Build Coastguard Worker
549*7304104dSAndroid Build Coastguard Worker  }
550*7304104dSAndroid Build Coastguard Worker
551*7304104dSAndroid Build Coastguard Worker  namespace test_lambda_init_capture
552*7304104dSAndroid Build Coastguard Worker  {
553*7304104dSAndroid Build Coastguard Worker
554*7304104dSAndroid Build Coastguard Worker    int
555*7304104dSAndroid Build Coastguard Worker    test()
556*7304104dSAndroid Build Coastguard Worker    {
557*7304104dSAndroid Build Coastguard Worker      auto x = 0;
558*7304104dSAndroid Build Coastguard Worker      const auto lambda1 = [a = x](int b){ return a + b; };
559*7304104dSAndroid Build Coastguard Worker      const auto lambda2 = [a = lambda1(x)](){ return a; };
560*7304104dSAndroid Build Coastguard Worker      return lambda2();
561*7304104dSAndroid Build Coastguard Worker    }
562*7304104dSAndroid Build Coastguard Worker
563*7304104dSAndroid Build Coastguard Worker  }
564*7304104dSAndroid Build Coastguard Worker
565*7304104dSAndroid Build Coastguard Worker  namespace test_digit_separators
566*7304104dSAndroid Build Coastguard Worker  {
567*7304104dSAndroid Build Coastguard Worker
568*7304104dSAndroid Build Coastguard Worker    constexpr auto ten_million = 100'000'000;
569*7304104dSAndroid Build Coastguard Worker    static_assert(ten_million == 100000000, "");
570*7304104dSAndroid Build Coastguard Worker
571*7304104dSAndroid Build Coastguard Worker  }
572*7304104dSAndroid Build Coastguard Worker
573*7304104dSAndroid Build Coastguard Worker  namespace test_return_type_deduction
574*7304104dSAndroid Build Coastguard Worker  {
575*7304104dSAndroid Build Coastguard Worker
576*7304104dSAndroid Build Coastguard Worker    auto f(int& x) { return x; }
577*7304104dSAndroid Build Coastguard Worker    decltype(auto) g(int& x) { return x; }
578*7304104dSAndroid Build Coastguard Worker
579*7304104dSAndroid Build Coastguard Worker    template < typename T1, typename T2 >
580*7304104dSAndroid Build Coastguard Worker    struct is_same
581*7304104dSAndroid Build Coastguard Worker    {
582*7304104dSAndroid Build Coastguard Worker      static constexpr auto value = false;
583*7304104dSAndroid Build Coastguard Worker    };
584*7304104dSAndroid Build Coastguard Worker
585*7304104dSAndroid Build Coastguard Worker    template < typename T >
586*7304104dSAndroid Build Coastguard Worker    struct is_same<T, T>
587*7304104dSAndroid Build Coastguard Worker    {
588*7304104dSAndroid Build Coastguard Worker      static constexpr auto value = true;
589*7304104dSAndroid Build Coastguard Worker    };
590*7304104dSAndroid Build Coastguard Worker
591*7304104dSAndroid Build Coastguard Worker    int
592*7304104dSAndroid Build Coastguard Worker    test()
593*7304104dSAndroid Build Coastguard Worker    {
594*7304104dSAndroid Build Coastguard Worker      auto x = 0;
595*7304104dSAndroid Build Coastguard Worker      static_assert(is_same<int, decltype(f(x))>::value, "");
596*7304104dSAndroid Build Coastguard Worker      static_assert(is_same<int&, decltype(g(x))>::value, "");
597*7304104dSAndroid Build Coastguard Worker      return x;
598*7304104dSAndroid Build Coastguard Worker    }
599*7304104dSAndroid Build Coastguard Worker
600*7304104dSAndroid Build Coastguard Worker  }
601*7304104dSAndroid Build Coastguard Worker
602*7304104dSAndroid Build Coastguard Worker}  // namespace cxx14
603*7304104dSAndroid Build Coastguard Worker
604*7304104dSAndroid Build Coastguard Worker#endif  // __cplusplus >= 201402L
605*7304104dSAndroid Build Coastguard Worker
606*7304104dSAndroid Build Coastguard Worker]])
607*7304104dSAndroid Build Coastguard Worker
608*7304104dSAndroid Build Coastguard Worker
609*7304104dSAndroid Build Coastguard Workerdnl  Tests for new features in C++17
610*7304104dSAndroid Build Coastguard Worker
611*7304104dSAndroid Build Coastguard Workerm4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[
612*7304104dSAndroid Build Coastguard Worker
613*7304104dSAndroid Build Coastguard Worker// If the compiler admits that it is not ready for C++17, why torture it?
614*7304104dSAndroid Build Coastguard Worker// Hopefully, this will speed up the test.
615*7304104dSAndroid Build Coastguard Worker
616*7304104dSAndroid Build Coastguard Worker#ifndef __cplusplus
617*7304104dSAndroid Build Coastguard Worker
618*7304104dSAndroid Build Coastguard Worker#error "This is not a C++ compiler"
619*7304104dSAndroid Build Coastguard Worker
620*7304104dSAndroid Build Coastguard Worker#elif __cplusplus < 201703L && !defined _MSC_VER
621*7304104dSAndroid Build Coastguard Worker
622*7304104dSAndroid Build Coastguard Worker#error "This is not a C++17 compiler"
623*7304104dSAndroid Build Coastguard Worker
624*7304104dSAndroid Build Coastguard Worker#else
625*7304104dSAndroid Build Coastguard Worker
626*7304104dSAndroid Build Coastguard Worker#include <initializer_list>
627*7304104dSAndroid Build Coastguard Worker#include <utility>
628*7304104dSAndroid Build Coastguard Worker#include <type_traits>
629*7304104dSAndroid Build Coastguard Worker
630*7304104dSAndroid Build Coastguard Workernamespace cxx17
631*7304104dSAndroid Build Coastguard Worker{
632*7304104dSAndroid Build Coastguard Worker
633*7304104dSAndroid Build Coastguard Worker  namespace test_constexpr_lambdas
634*7304104dSAndroid Build Coastguard Worker  {
635*7304104dSAndroid Build Coastguard Worker
636*7304104dSAndroid Build Coastguard Worker    constexpr int foo = [](){return 42;}();
637*7304104dSAndroid Build Coastguard Worker
638*7304104dSAndroid Build Coastguard Worker  }
639*7304104dSAndroid Build Coastguard Worker
640*7304104dSAndroid Build Coastguard Worker  namespace test::nested_namespace::definitions
641*7304104dSAndroid Build Coastguard Worker  {
642*7304104dSAndroid Build Coastguard Worker
643*7304104dSAndroid Build Coastguard Worker  }
644*7304104dSAndroid Build Coastguard Worker
645*7304104dSAndroid Build Coastguard Worker  namespace test_fold_expression
646*7304104dSAndroid Build Coastguard Worker  {
647*7304104dSAndroid Build Coastguard Worker
648*7304104dSAndroid Build Coastguard Worker    template<typename... Args>
649*7304104dSAndroid Build Coastguard Worker    int multiply(Args... args)
650*7304104dSAndroid Build Coastguard Worker    {
651*7304104dSAndroid Build Coastguard Worker      return (args * ... * 1);
652*7304104dSAndroid Build Coastguard Worker    }
653*7304104dSAndroid Build Coastguard Worker
654*7304104dSAndroid Build Coastguard Worker    template<typename... Args>
655*7304104dSAndroid Build Coastguard Worker    bool all(Args... args)
656*7304104dSAndroid Build Coastguard Worker    {
657*7304104dSAndroid Build Coastguard Worker      return (args && ...);
658*7304104dSAndroid Build Coastguard Worker    }
659*7304104dSAndroid Build Coastguard Worker
660*7304104dSAndroid Build Coastguard Worker  }
661*7304104dSAndroid Build Coastguard Worker
662*7304104dSAndroid Build Coastguard Worker  namespace test_extended_static_assert
663*7304104dSAndroid Build Coastguard Worker  {
664*7304104dSAndroid Build Coastguard Worker
665*7304104dSAndroid Build Coastguard Worker    static_assert (true);
666*7304104dSAndroid Build Coastguard Worker
667*7304104dSAndroid Build Coastguard Worker  }
668*7304104dSAndroid Build Coastguard Worker
669*7304104dSAndroid Build Coastguard Worker  namespace test_auto_brace_init_list
670*7304104dSAndroid Build Coastguard Worker  {
671*7304104dSAndroid Build Coastguard Worker
672*7304104dSAndroid Build Coastguard Worker    auto foo = {5};
673*7304104dSAndroid Build Coastguard Worker    auto bar {5};
674*7304104dSAndroid Build Coastguard Worker
675*7304104dSAndroid Build Coastguard Worker    static_assert(std::is_same<std::initializer_list<int>, decltype(foo)>::value);
676*7304104dSAndroid Build Coastguard Worker    static_assert(std::is_same<int, decltype(bar)>::value);
677*7304104dSAndroid Build Coastguard Worker  }
678*7304104dSAndroid Build Coastguard Worker
679*7304104dSAndroid Build Coastguard Worker  namespace test_typename_in_template_template_parameter
680*7304104dSAndroid Build Coastguard Worker  {
681*7304104dSAndroid Build Coastguard Worker
682*7304104dSAndroid Build Coastguard Worker    template<template<typename> typename X> struct D;
683*7304104dSAndroid Build Coastguard Worker
684*7304104dSAndroid Build Coastguard Worker  }
685*7304104dSAndroid Build Coastguard Worker
686*7304104dSAndroid Build Coastguard Worker  namespace test_fallthrough_nodiscard_maybe_unused_attributes
687*7304104dSAndroid Build Coastguard Worker  {
688*7304104dSAndroid Build Coastguard Worker
689*7304104dSAndroid Build Coastguard Worker    int f1()
690*7304104dSAndroid Build Coastguard Worker    {
691*7304104dSAndroid Build Coastguard Worker      return 42;
692*7304104dSAndroid Build Coastguard Worker    }
693*7304104dSAndroid Build Coastguard Worker
694*7304104dSAndroid Build Coastguard Worker    [[nodiscard]] int f2()
695*7304104dSAndroid Build Coastguard Worker    {
696*7304104dSAndroid Build Coastguard Worker      [[maybe_unused]] auto unused = f1();
697*7304104dSAndroid Build Coastguard Worker
698*7304104dSAndroid Build Coastguard Worker      switch (f1())
699*7304104dSAndroid Build Coastguard Worker      {
700*7304104dSAndroid Build Coastguard Worker      case 17:
701*7304104dSAndroid Build Coastguard Worker        f1();
702*7304104dSAndroid Build Coastguard Worker        [[fallthrough]];
703*7304104dSAndroid Build Coastguard Worker      case 42:
704*7304104dSAndroid Build Coastguard Worker        f1();
705*7304104dSAndroid Build Coastguard Worker      }
706*7304104dSAndroid Build Coastguard Worker      return f1();
707*7304104dSAndroid Build Coastguard Worker    }
708*7304104dSAndroid Build Coastguard Worker
709*7304104dSAndroid Build Coastguard Worker  }
710*7304104dSAndroid Build Coastguard Worker
711*7304104dSAndroid Build Coastguard Worker  namespace test_extended_aggregate_initialization
712*7304104dSAndroid Build Coastguard Worker  {
713*7304104dSAndroid Build Coastguard Worker
714*7304104dSAndroid Build Coastguard Worker    struct base1
715*7304104dSAndroid Build Coastguard Worker    {
716*7304104dSAndroid Build Coastguard Worker      int b1, b2 = 42;
717*7304104dSAndroid Build Coastguard Worker    };
718*7304104dSAndroid Build Coastguard Worker
719*7304104dSAndroid Build Coastguard Worker    struct base2
720*7304104dSAndroid Build Coastguard Worker    {
721*7304104dSAndroid Build Coastguard Worker      base2() {
722*7304104dSAndroid Build Coastguard Worker        b3 = 42;
723*7304104dSAndroid Build Coastguard Worker      }
724*7304104dSAndroid Build Coastguard Worker      int b3;
725*7304104dSAndroid Build Coastguard Worker    };
726*7304104dSAndroid Build Coastguard Worker
727*7304104dSAndroid Build Coastguard Worker    struct derived : base1, base2
728*7304104dSAndroid Build Coastguard Worker    {
729*7304104dSAndroid Build Coastguard Worker        int d;
730*7304104dSAndroid Build Coastguard Worker    };
731*7304104dSAndroid Build Coastguard Worker
732*7304104dSAndroid Build Coastguard Worker    derived d1 {{1, 2}, {}, 4};  // full initialization
733*7304104dSAndroid Build Coastguard Worker    derived d2 {{}, {}, 4};      // value-initialized bases
734*7304104dSAndroid Build Coastguard Worker
735*7304104dSAndroid Build Coastguard Worker  }
736*7304104dSAndroid Build Coastguard Worker
737*7304104dSAndroid Build Coastguard Worker  namespace test_general_range_based_for_loop
738*7304104dSAndroid Build Coastguard Worker  {
739*7304104dSAndroid Build Coastguard Worker
740*7304104dSAndroid Build Coastguard Worker    struct iter
741*7304104dSAndroid Build Coastguard Worker    {
742*7304104dSAndroid Build Coastguard Worker      int i;
743*7304104dSAndroid Build Coastguard Worker
744*7304104dSAndroid Build Coastguard Worker      int& operator* ()
745*7304104dSAndroid Build Coastguard Worker      {
746*7304104dSAndroid Build Coastguard Worker        return i;
747*7304104dSAndroid Build Coastguard Worker      }
748*7304104dSAndroid Build Coastguard Worker
749*7304104dSAndroid Build Coastguard Worker      const int& operator* () const
750*7304104dSAndroid Build Coastguard Worker      {
751*7304104dSAndroid Build Coastguard Worker        return i;
752*7304104dSAndroid Build Coastguard Worker      }
753*7304104dSAndroid Build Coastguard Worker
754*7304104dSAndroid Build Coastguard Worker      iter& operator++()
755*7304104dSAndroid Build Coastguard Worker      {
756*7304104dSAndroid Build Coastguard Worker        ++i;
757*7304104dSAndroid Build Coastguard Worker        return *this;
758*7304104dSAndroid Build Coastguard Worker      }
759*7304104dSAndroid Build Coastguard Worker    };
760*7304104dSAndroid Build Coastguard Worker
761*7304104dSAndroid Build Coastguard Worker    struct sentinel
762*7304104dSAndroid Build Coastguard Worker    {
763*7304104dSAndroid Build Coastguard Worker      int i;
764*7304104dSAndroid Build Coastguard Worker    };
765*7304104dSAndroid Build Coastguard Worker
766*7304104dSAndroid Build Coastguard Worker    bool operator== (const iter& i, const sentinel& s)
767*7304104dSAndroid Build Coastguard Worker    {
768*7304104dSAndroid Build Coastguard Worker      return i.i == s.i;
769*7304104dSAndroid Build Coastguard Worker    }
770*7304104dSAndroid Build Coastguard Worker
771*7304104dSAndroid Build Coastguard Worker    bool operator!= (const iter& i, const sentinel& s)
772*7304104dSAndroid Build Coastguard Worker    {
773*7304104dSAndroid Build Coastguard Worker      return !(i == s);
774*7304104dSAndroid Build Coastguard Worker    }
775*7304104dSAndroid Build Coastguard Worker
776*7304104dSAndroid Build Coastguard Worker    struct range
777*7304104dSAndroid Build Coastguard Worker    {
778*7304104dSAndroid Build Coastguard Worker      iter begin() const
779*7304104dSAndroid Build Coastguard Worker      {
780*7304104dSAndroid Build Coastguard Worker        return {0};
781*7304104dSAndroid Build Coastguard Worker      }
782*7304104dSAndroid Build Coastguard Worker
783*7304104dSAndroid Build Coastguard Worker      sentinel end() const
784*7304104dSAndroid Build Coastguard Worker      {
785*7304104dSAndroid Build Coastguard Worker        return {5};
786*7304104dSAndroid Build Coastguard Worker      }
787*7304104dSAndroid Build Coastguard Worker    };
788*7304104dSAndroid Build Coastguard Worker
789*7304104dSAndroid Build Coastguard Worker    void f()
790*7304104dSAndroid Build Coastguard Worker    {
791*7304104dSAndroid Build Coastguard Worker      range r {};
792*7304104dSAndroid Build Coastguard Worker
793*7304104dSAndroid Build Coastguard Worker      for (auto i : r)
794*7304104dSAndroid Build Coastguard Worker      {
795*7304104dSAndroid Build Coastguard Worker        [[maybe_unused]] auto v = i;
796*7304104dSAndroid Build Coastguard Worker      }
797*7304104dSAndroid Build Coastguard Worker    }
798*7304104dSAndroid Build Coastguard Worker
799*7304104dSAndroid Build Coastguard Worker  }
800*7304104dSAndroid Build Coastguard Worker
801*7304104dSAndroid Build Coastguard Worker  namespace test_lambda_capture_asterisk_this_by_value
802*7304104dSAndroid Build Coastguard Worker  {
803*7304104dSAndroid Build Coastguard Worker
804*7304104dSAndroid Build Coastguard Worker    struct t
805*7304104dSAndroid Build Coastguard Worker    {
806*7304104dSAndroid Build Coastguard Worker      int i;
807*7304104dSAndroid Build Coastguard Worker      int foo()
808*7304104dSAndroid Build Coastguard Worker      {
809*7304104dSAndroid Build Coastguard Worker        return [*this]()
810*7304104dSAndroid Build Coastguard Worker        {
811*7304104dSAndroid Build Coastguard Worker          return i;
812*7304104dSAndroid Build Coastguard Worker        }();
813*7304104dSAndroid Build Coastguard Worker      }
814*7304104dSAndroid Build Coastguard Worker    };
815*7304104dSAndroid Build Coastguard Worker
816*7304104dSAndroid Build Coastguard Worker  }
817*7304104dSAndroid Build Coastguard Worker
818*7304104dSAndroid Build Coastguard Worker  namespace test_enum_class_construction
819*7304104dSAndroid Build Coastguard Worker  {
820*7304104dSAndroid Build Coastguard Worker
821*7304104dSAndroid Build Coastguard Worker    enum class byte : unsigned char
822*7304104dSAndroid Build Coastguard Worker    {};
823*7304104dSAndroid Build Coastguard Worker
824*7304104dSAndroid Build Coastguard Worker    byte foo {42};
825*7304104dSAndroid Build Coastguard Worker
826*7304104dSAndroid Build Coastguard Worker  }
827*7304104dSAndroid Build Coastguard Worker
828*7304104dSAndroid Build Coastguard Worker  namespace test_constexpr_if
829*7304104dSAndroid Build Coastguard Worker  {
830*7304104dSAndroid Build Coastguard Worker
831*7304104dSAndroid Build Coastguard Worker    template <bool cond>
832*7304104dSAndroid Build Coastguard Worker    int f ()
833*7304104dSAndroid Build Coastguard Worker    {
834*7304104dSAndroid Build Coastguard Worker      if constexpr(cond)
835*7304104dSAndroid Build Coastguard Worker      {
836*7304104dSAndroid Build Coastguard Worker        return 13;
837*7304104dSAndroid Build Coastguard Worker      }
838*7304104dSAndroid Build Coastguard Worker      else
839*7304104dSAndroid Build Coastguard Worker      {
840*7304104dSAndroid Build Coastguard Worker        return 42;
841*7304104dSAndroid Build Coastguard Worker      }
842*7304104dSAndroid Build Coastguard Worker    }
843*7304104dSAndroid Build Coastguard Worker
844*7304104dSAndroid Build Coastguard Worker  }
845*7304104dSAndroid Build Coastguard Worker
846*7304104dSAndroid Build Coastguard Worker  namespace test_selection_statement_with_initializer
847*7304104dSAndroid Build Coastguard Worker  {
848*7304104dSAndroid Build Coastguard Worker
849*7304104dSAndroid Build Coastguard Worker    int f()
850*7304104dSAndroid Build Coastguard Worker    {
851*7304104dSAndroid Build Coastguard Worker      return 13;
852*7304104dSAndroid Build Coastguard Worker    }
853*7304104dSAndroid Build Coastguard Worker
854*7304104dSAndroid Build Coastguard Worker    int f2()
855*7304104dSAndroid Build Coastguard Worker    {
856*7304104dSAndroid Build Coastguard Worker      if (auto i = f(); i > 0)
857*7304104dSAndroid Build Coastguard Worker      {
858*7304104dSAndroid Build Coastguard Worker        return 3;
859*7304104dSAndroid Build Coastguard Worker      }
860*7304104dSAndroid Build Coastguard Worker
861*7304104dSAndroid Build Coastguard Worker      switch (auto i = f(); i + 4)
862*7304104dSAndroid Build Coastguard Worker      {
863*7304104dSAndroid Build Coastguard Worker      case 17:
864*7304104dSAndroid Build Coastguard Worker        return 2;
865*7304104dSAndroid Build Coastguard Worker
866*7304104dSAndroid Build Coastguard Worker      default:
867*7304104dSAndroid Build Coastguard Worker        return 1;
868*7304104dSAndroid Build Coastguard Worker      }
869*7304104dSAndroid Build Coastguard Worker    }
870*7304104dSAndroid Build Coastguard Worker
871*7304104dSAndroid Build Coastguard Worker  }
872*7304104dSAndroid Build Coastguard Worker
873*7304104dSAndroid Build Coastguard Worker  namespace test_template_argument_deduction_for_class_templates
874*7304104dSAndroid Build Coastguard Worker  {
875*7304104dSAndroid Build Coastguard Worker
876*7304104dSAndroid Build Coastguard Worker    template <typename T1, typename T2>
877*7304104dSAndroid Build Coastguard Worker    struct pair
878*7304104dSAndroid Build Coastguard Worker    {
879*7304104dSAndroid Build Coastguard Worker      pair (T1 p1, T2 p2)
880*7304104dSAndroid Build Coastguard Worker        : m1 {p1},
881*7304104dSAndroid Build Coastguard Worker          m2 {p2}
882*7304104dSAndroid Build Coastguard Worker      {}
883*7304104dSAndroid Build Coastguard Worker
884*7304104dSAndroid Build Coastguard Worker      T1 m1;
885*7304104dSAndroid Build Coastguard Worker      T2 m2;
886*7304104dSAndroid Build Coastguard Worker    };
887*7304104dSAndroid Build Coastguard Worker
888*7304104dSAndroid Build Coastguard Worker    void f()
889*7304104dSAndroid Build Coastguard Worker    {
890*7304104dSAndroid Build Coastguard Worker      [[maybe_unused]] auto p = pair{13, 42u};
891*7304104dSAndroid Build Coastguard Worker    }
892*7304104dSAndroid Build Coastguard Worker
893*7304104dSAndroid Build Coastguard Worker  }
894*7304104dSAndroid Build Coastguard Worker
895*7304104dSAndroid Build Coastguard Worker  namespace test_non_type_auto_template_parameters
896*7304104dSAndroid Build Coastguard Worker  {
897*7304104dSAndroid Build Coastguard Worker
898*7304104dSAndroid Build Coastguard Worker    template <auto n>
899*7304104dSAndroid Build Coastguard Worker    struct B
900*7304104dSAndroid Build Coastguard Worker    {};
901*7304104dSAndroid Build Coastguard Worker
902*7304104dSAndroid Build Coastguard Worker    B<5> b1;
903*7304104dSAndroid Build Coastguard Worker    B<'a'> b2;
904*7304104dSAndroid Build Coastguard Worker
905*7304104dSAndroid Build Coastguard Worker  }
906*7304104dSAndroid Build Coastguard Worker
907*7304104dSAndroid Build Coastguard Worker  namespace test_structured_bindings
908*7304104dSAndroid Build Coastguard Worker  {
909*7304104dSAndroid Build Coastguard Worker
910*7304104dSAndroid Build Coastguard Worker    int arr[2] = { 1, 2 };
911*7304104dSAndroid Build Coastguard Worker    std::pair<int, int> pr = { 1, 2 };
912*7304104dSAndroid Build Coastguard Worker
913*7304104dSAndroid Build Coastguard Worker    auto f1() -> int(&)[2]
914*7304104dSAndroid Build Coastguard Worker    {
915*7304104dSAndroid Build Coastguard Worker      return arr;
916*7304104dSAndroid Build Coastguard Worker    }
917*7304104dSAndroid Build Coastguard Worker
918*7304104dSAndroid Build Coastguard Worker    auto f2() -> std::pair<int, int>&
919*7304104dSAndroid Build Coastguard Worker    {
920*7304104dSAndroid Build Coastguard Worker      return pr;
921*7304104dSAndroid Build Coastguard Worker    }
922*7304104dSAndroid Build Coastguard Worker
923*7304104dSAndroid Build Coastguard Worker    struct S
924*7304104dSAndroid Build Coastguard Worker    {
925*7304104dSAndroid Build Coastguard Worker      int x1 : 2;
926*7304104dSAndroid Build Coastguard Worker      volatile double y1;
927*7304104dSAndroid Build Coastguard Worker    };
928*7304104dSAndroid Build Coastguard Worker
929*7304104dSAndroid Build Coastguard Worker    S f3()
930*7304104dSAndroid Build Coastguard Worker    {
931*7304104dSAndroid Build Coastguard Worker      return {};
932*7304104dSAndroid Build Coastguard Worker    }
933*7304104dSAndroid Build Coastguard Worker
934*7304104dSAndroid Build Coastguard Worker    auto [ x1, y1 ] = f1();
935*7304104dSAndroid Build Coastguard Worker    auto& [ xr1, yr1 ] = f1();
936*7304104dSAndroid Build Coastguard Worker    auto [ x2, y2 ] = f2();
937*7304104dSAndroid Build Coastguard Worker    auto& [ xr2, yr2 ] = f2();
938*7304104dSAndroid Build Coastguard Worker    const auto [ x3, y3 ] = f3();
939*7304104dSAndroid Build Coastguard Worker
940*7304104dSAndroid Build Coastguard Worker  }
941*7304104dSAndroid Build Coastguard Worker
942*7304104dSAndroid Build Coastguard Worker  namespace test_exception_spec_type_system
943*7304104dSAndroid Build Coastguard Worker  {
944*7304104dSAndroid Build Coastguard Worker
945*7304104dSAndroid Build Coastguard Worker    struct Good {};
946*7304104dSAndroid Build Coastguard Worker    struct Bad {};
947*7304104dSAndroid Build Coastguard Worker
948*7304104dSAndroid Build Coastguard Worker    void g1() noexcept;
949*7304104dSAndroid Build Coastguard Worker    void g2();
950*7304104dSAndroid Build Coastguard Worker
951*7304104dSAndroid Build Coastguard Worker    template<typename T>
952*7304104dSAndroid Build Coastguard Worker    Bad
953*7304104dSAndroid Build Coastguard Worker    f(T*, T*);
954*7304104dSAndroid Build Coastguard Worker
955*7304104dSAndroid Build Coastguard Worker    template<typename T1, typename T2>
956*7304104dSAndroid Build Coastguard Worker    Good
957*7304104dSAndroid Build Coastguard Worker    f(T1*, T2*);
958*7304104dSAndroid Build Coastguard Worker
959*7304104dSAndroid Build Coastguard Worker    static_assert (std::is_same_v<Good, decltype(f(g1, g2))>);
960*7304104dSAndroid Build Coastguard Worker
961*7304104dSAndroid Build Coastguard Worker  }
962*7304104dSAndroid Build Coastguard Worker
963*7304104dSAndroid Build Coastguard Worker  namespace test_inline_variables
964*7304104dSAndroid Build Coastguard Worker  {
965*7304104dSAndroid Build Coastguard Worker
966*7304104dSAndroid Build Coastguard Worker    template<class T> void f(T)
967*7304104dSAndroid Build Coastguard Worker    {}
968*7304104dSAndroid Build Coastguard Worker
969*7304104dSAndroid Build Coastguard Worker    template<class T> inline T g(T)
970*7304104dSAndroid Build Coastguard Worker    {
971*7304104dSAndroid Build Coastguard Worker      return T{};
972*7304104dSAndroid Build Coastguard Worker    }
973*7304104dSAndroid Build Coastguard Worker
974*7304104dSAndroid Build Coastguard Worker    template<> inline void f<>(int)
975*7304104dSAndroid Build Coastguard Worker    {}
976*7304104dSAndroid Build Coastguard Worker
977*7304104dSAndroid Build Coastguard Worker    template<> int g<>(int)
978*7304104dSAndroid Build Coastguard Worker    {
979*7304104dSAndroid Build Coastguard Worker      return 5;
980*7304104dSAndroid Build Coastguard Worker    }
981*7304104dSAndroid Build Coastguard Worker
982*7304104dSAndroid Build Coastguard Worker  }
983*7304104dSAndroid Build Coastguard Worker
984*7304104dSAndroid Build Coastguard Worker}  // namespace cxx17
985*7304104dSAndroid Build Coastguard Worker
986*7304104dSAndroid Build Coastguard Worker#endif  // __cplusplus < 201703L && !defined _MSC_VER
987*7304104dSAndroid Build Coastguard Worker
988*7304104dSAndroid Build Coastguard Worker]])
989*7304104dSAndroid Build Coastguard Worker
990*7304104dSAndroid Build Coastguard Worker
991*7304104dSAndroid Build Coastguard Workerdnl  Tests for new features in C++20
992*7304104dSAndroid Build Coastguard Worker
993*7304104dSAndroid Build Coastguard Workerm4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_20], [[
994*7304104dSAndroid Build Coastguard Worker
995*7304104dSAndroid Build Coastguard Worker#ifndef __cplusplus
996*7304104dSAndroid Build Coastguard Worker
997*7304104dSAndroid Build Coastguard Worker#error "This is not a C++ compiler"
998*7304104dSAndroid Build Coastguard Worker
999*7304104dSAndroid Build Coastguard Worker#elif __cplusplus < 202002L && !defined _MSC_VER
1000*7304104dSAndroid Build Coastguard Worker
1001*7304104dSAndroid Build Coastguard Worker#error "This is not a C++20 compiler"
1002*7304104dSAndroid Build Coastguard Worker
1003*7304104dSAndroid Build Coastguard Worker#else
1004*7304104dSAndroid Build Coastguard Worker
1005*7304104dSAndroid Build Coastguard Worker#include <version>
1006*7304104dSAndroid Build Coastguard Worker
1007*7304104dSAndroid Build Coastguard Workernamespace cxx20
1008*7304104dSAndroid Build Coastguard Worker{
1009*7304104dSAndroid Build Coastguard Worker
1010*7304104dSAndroid Build Coastguard Worker// As C++20 supports feature test macros in the standard, there is no
1011*7304104dSAndroid Build Coastguard Worker// immediate need to actually test for feature availability on the
1012*7304104dSAndroid Build Coastguard Worker// Autoconf side.
1013*7304104dSAndroid Build Coastguard Worker
1014*7304104dSAndroid Build Coastguard Worker}  // namespace cxx20
1015*7304104dSAndroid Build Coastguard Worker
1016*7304104dSAndroid Build Coastguard Worker#endif  // __cplusplus < 202002L && !defined _MSC_VER
1017*7304104dSAndroid Build Coastguard Worker
1018*7304104dSAndroid Build Coastguard Worker]])
1019