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