1*820c1a8dSHiroo HAYASHI# Prefer GNU C11 and C++11 to earlier versions. -*- coding: utf-8 -*- 2*820c1a8dSHiroo HAYASHI 3*820c1a8dSHiroo HAYASHI# This implementation is taken from GNU Autoconf lib/autoconf/c.m4 4*820c1a8dSHiroo HAYASHI# commit 017d5ddd82854911f0119691d91ea8a1438824d6 5*820c1a8dSHiroo HAYASHI# dated Sun Apr 3 13:57:17 2016 -0700 6*820c1a8dSHiroo HAYASHI# This implementation will be obsolete once we can assume Autoconf 2.70 7*820c1a8dSHiroo HAYASHI# or later is installed everywhere a Gnulib program might be developed. 8*820c1a8dSHiroo HAYASHI 9*820c1a8dSHiroo HAYASHIm4_version_prereq([2.70], [], [ 10*820c1a8dSHiroo HAYASHI 11*820c1a8dSHiroo HAYASHI 12*820c1a8dSHiroo HAYASHI# Copyright (C) 2001-2021 Free Software Foundation, Inc. 13*820c1a8dSHiroo HAYASHI 14*820c1a8dSHiroo HAYASHI# This program is free software; you can redistribute it and/or modify 15*820c1a8dSHiroo HAYASHI# it under the terms of the GNU General Public License as published by 16*820c1a8dSHiroo HAYASHI# the Free Software Foundation, either version 3 of the License, or 17*820c1a8dSHiroo HAYASHI# (at your option) any later version. 18*820c1a8dSHiroo HAYASHI# 19*820c1a8dSHiroo HAYASHI# This program is distributed in the hope that it will be useful, 20*820c1a8dSHiroo HAYASHI# but WITHOUT ANY WARRANTY; without even the implied warranty of 21*820c1a8dSHiroo HAYASHI# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22*820c1a8dSHiroo HAYASHI# GNU General Public License for more details. 23*820c1a8dSHiroo HAYASHI# 24*820c1a8dSHiroo HAYASHI# You should have received a copy of the GNU General Public License 25*820c1a8dSHiroo HAYASHI# along with this program. If not, see <https://www.gnu.org/licenses/>. 26*820c1a8dSHiroo HAYASHI 27*820c1a8dSHiroo HAYASHI# Written by David MacKenzie, with help from 28*820c1a8dSHiroo HAYASHI# Akim Demaille, Paul Eggert, 29*820c1a8dSHiroo HAYASHI# François Pinard, Karl Berry, Richard Pixley, Ian Lance Taylor, 30*820c1a8dSHiroo HAYASHI# Roland McGrath, Noah Friedman, david d zuhn, and many others. 31*820c1a8dSHiroo HAYASHI 32*820c1a8dSHiroo HAYASHI 33*820c1a8dSHiroo HAYASHI# AC_PROG_CC([COMPILER ...]) 34*820c1a8dSHiroo HAYASHI# -------------------------- 35*820c1a8dSHiroo HAYASHI# COMPILER ... is a space separated list of C compilers to search for. 36*820c1a8dSHiroo HAYASHI# This just gives the user an opportunity to specify an alternative 37*820c1a8dSHiroo HAYASHI# search list for the C compiler. 38*820c1a8dSHiroo HAYASHIAC_DEFUN_ONCE([AC_PROG_CC], 39*820c1a8dSHiroo HAYASHI[AC_LANG_PUSH(C)dnl 40*820c1a8dSHiroo HAYASHIAC_ARG_VAR([CC], [C compiler command])dnl 41*820c1a8dSHiroo HAYASHIAC_ARG_VAR([CFLAGS], [C compiler flags])dnl 42*820c1a8dSHiroo HAYASHI_AC_ARG_VAR_LDFLAGS()dnl 43*820c1a8dSHiroo HAYASHI_AC_ARG_VAR_LIBS()dnl 44*820c1a8dSHiroo HAYASHI_AC_ARG_VAR_CPPFLAGS()dnl 45*820c1a8dSHiroo HAYASHIm4_ifval([$1], 46*820c1a8dSHiroo HAYASHI [AC_CHECK_TOOLS(CC, [$1])], 47*820c1a8dSHiroo HAYASHI[AC_CHECK_TOOL(CC, gcc) 48*820c1a8dSHiroo HAYASHIif test -z "$CC"; then 49*820c1a8dSHiroo HAYASHI dnl Here we want: 50*820c1a8dSHiroo HAYASHI dnl AC_CHECK_TOOL(CC, cc) 51*820c1a8dSHiroo HAYASHI dnl but without the check for a tool without the prefix. 52*820c1a8dSHiroo HAYASHI dnl Until the check is removed from there, copy the code: 53*820c1a8dSHiroo HAYASHI if test -n "$ac_tool_prefix"; then 54*820c1a8dSHiroo HAYASHI AC_CHECK_PROG(CC, [${ac_tool_prefix}cc], [${ac_tool_prefix}cc]) 55*820c1a8dSHiroo HAYASHI fi 56*820c1a8dSHiroo HAYASHIfi 57*820c1a8dSHiroo HAYASHIif test -z "$CC"; then 58*820c1a8dSHiroo HAYASHI AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc) 59*820c1a8dSHiroo HAYASHIfi 60*820c1a8dSHiroo HAYASHIif test -z "$CC"; then 61*820c1a8dSHiroo HAYASHI AC_CHECK_TOOLS(CC, cl.exe) 62*820c1a8dSHiroo HAYASHIfi 63*820c1a8dSHiroo HAYASHIif test -z "$CC"; then 64*820c1a8dSHiroo HAYASHI AC_CHECK_TOOL(CC, clang) 65*820c1a8dSHiroo HAYASHIfi 66*820c1a8dSHiroo HAYASHI]) 67*820c1a8dSHiroo HAYASHI 68*820c1a8dSHiroo HAYASHItest -z "$CC" && AC_MSG_FAILURE([no acceptable C compiler found in \$PATH]) 69*820c1a8dSHiroo HAYASHI 70*820c1a8dSHiroo HAYASHI# Provide some information about the compiler. 71*820c1a8dSHiroo HAYASHI_AS_ECHO_LOG([checking for _AC_LANG compiler version]) 72*820c1a8dSHiroo HAYASHIset X $ac_compile 73*820c1a8dSHiroo HAYASHIac_compiler=$[2] 74*820c1a8dSHiroo HAYASHIfor ac_option in --version -v -V -qversion -version; do 75*820c1a8dSHiroo HAYASHI _AC_DO_LIMIT([$ac_compiler $ac_option >&AS_MESSAGE_LOG_FD]) 76*820c1a8dSHiroo HAYASHIdone 77*820c1a8dSHiroo HAYASHI 78*820c1a8dSHiroo HAYASHIm4_expand_once([_AC_COMPILER_EXEEXT])[]dnl 79*820c1a8dSHiroo HAYASHIm4_expand_once([_AC_COMPILER_OBJEXT])[]dnl 80*820c1a8dSHiroo HAYASHI_AC_LANG_COMPILER_GNU 81*820c1a8dSHiroo HAYASHIif test $ac_compiler_gnu = yes; then 82*820c1a8dSHiroo HAYASHI GCC=yes 83*820c1a8dSHiroo HAYASHIelse 84*820c1a8dSHiroo HAYASHI GCC= 85*820c1a8dSHiroo HAYASHIfi 86*820c1a8dSHiroo HAYASHI_AC_PROG_CC_G 87*820c1a8dSHiroo HAYASHIdnl 88*820c1a8dSHiroo HAYASHIdnl Set ac_prog_cc_stdc to the supported C version. 89*820c1a8dSHiroo HAYASHIdnl Also set the documented variable ac_cv_prog_cc_stdc; 90*820c1a8dSHiroo HAYASHIdnl its name was chosen when it was cached, but it is no longer cached. 91*820c1a8dSHiroo HAYASHI_AC_PROG_CC_C11([ac_prog_cc_stdc=c11 92*820c1a8dSHiroo HAYASHI ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11], 93*820c1a8dSHiroo HAYASHI [_AC_PROG_CC_C99([ac_prog_cc_stdc=c99 94*820c1a8dSHiroo HAYASHI ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99], 95*820c1a8dSHiroo HAYASHI [_AC_PROG_CC_C89([ac_prog_cc_stdc=c89 96*820c1a8dSHiroo HAYASHI ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89], 97*820c1a8dSHiroo HAYASHI [ac_prog_cc_stdc=no 98*820c1a8dSHiroo HAYASHI ac_cv_prog_cc_stdc=no])])]) 99*820c1a8dSHiroo HAYASHIdnl 100*820c1a8dSHiroo HAYASHIAC_LANG_POP(C)dnl 101*820c1a8dSHiroo HAYASHI])# AC_PROG_CC 102*820c1a8dSHiroo HAYASHI 103*820c1a8dSHiroo HAYASHI 104*820c1a8dSHiroo HAYASHI 105*820c1a8dSHiroo HAYASHI# AC_PROG_CXX([LIST-OF-COMPILERS]) 106*820c1a8dSHiroo HAYASHI# -------------------------------- 107*820c1a8dSHiroo HAYASHI# LIST-OF-COMPILERS is a space separated list of C++ compilers to search 108*820c1a8dSHiroo HAYASHI# for (if not specified, a default list is used). This just gives the 109*820c1a8dSHiroo HAYASHI# user an opportunity to specify an alternative search list for the C++ 110*820c1a8dSHiroo HAYASHI# compiler. 111*820c1a8dSHiroo HAYASHI# aCC HP-UX C++ compiler much better than `CC', so test before. 112*820c1a8dSHiroo HAYASHI# FCC Fujitsu C++ compiler 113*820c1a8dSHiroo HAYASHI# KCC KAI C++ compiler 114*820c1a8dSHiroo HAYASHI# RCC Rational C++ 115*820c1a8dSHiroo HAYASHI# xlC_r AIX C Set++ (with support for reentrant code) 116*820c1a8dSHiroo HAYASHI# xlC AIX C Set++ 117*820c1a8dSHiroo HAYASHIAC_DEFUN([AC_PROG_CXX], 118*820c1a8dSHiroo HAYASHI[AC_LANG_PUSH(C++)dnl 119*820c1a8dSHiroo HAYASHIAC_ARG_VAR([CXX], [C++ compiler command])dnl 120*820c1a8dSHiroo HAYASHIAC_ARG_VAR([CXXFLAGS], [C++ compiler flags])dnl 121*820c1a8dSHiroo HAYASHI_AC_ARG_VAR_LDFLAGS()dnl 122*820c1a8dSHiroo HAYASHI_AC_ARG_VAR_LIBS()dnl 123*820c1a8dSHiroo HAYASHI_AC_ARG_VAR_CPPFLAGS()dnl 124*820c1a8dSHiroo HAYASHI_AC_ARG_VAR_PRECIOUS([CCC])dnl 125*820c1a8dSHiroo HAYASHIif test -z "$CXX"; then 126*820c1a8dSHiroo HAYASHI if test -n "$CCC"; then 127*820c1a8dSHiroo HAYASHI CXX=$CCC 128*820c1a8dSHiroo HAYASHI else 129*820c1a8dSHiroo HAYASHI AC_CHECK_TOOLS(CXX, 130*820c1a8dSHiroo HAYASHI [m4_default([$1], 131*820c1a8dSHiroo HAYASHI [g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++])], 132*820c1a8dSHiroo HAYASHI g++) 133*820c1a8dSHiroo HAYASHI fi 134*820c1a8dSHiroo HAYASHIfi 135*820c1a8dSHiroo HAYASHI# Provide some information about the compiler. 136*820c1a8dSHiroo HAYASHI_AS_ECHO_LOG([checking for _AC_LANG compiler version]) 137*820c1a8dSHiroo HAYASHIset X $ac_compile 138*820c1a8dSHiroo HAYASHIac_compiler=$[2] 139*820c1a8dSHiroo HAYASHIfor ac_option in --version -v -V -qversion; do 140*820c1a8dSHiroo HAYASHI _AC_DO_LIMIT([$ac_compiler $ac_option >&AS_MESSAGE_LOG_FD]) 141*820c1a8dSHiroo HAYASHIdone 142*820c1a8dSHiroo HAYASHI 143*820c1a8dSHiroo HAYASHIm4_expand_once([_AC_COMPILER_EXEEXT])[]dnl 144*820c1a8dSHiroo HAYASHIm4_expand_once([_AC_COMPILER_OBJEXT])[]dnl 145*820c1a8dSHiroo HAYASHI_AC_LANG_COMPILER_GNU 146*820c1a8dSHiroo HAYASHIif test $ac_compiler_gnu = yes; then 147*820c1a8dSHiroo HAYASHI GXX=yes 148*820c1a8dSHiroo HAYASHIelse 149*820c1a8dSHiroo HAYASHI GXX= 150*820c1a8dSHiroo HAYASHIfi 151*820c1a8dSHiroo HAYASHI_AC_PROG_CXX_G 152*820c1a8dSHiroo HAYASHI_AC_PROG_CXX_CXX11([ac_prog_cxx_stdcxx=cxx11 153*820c1a8dSHiroo HAYASHI ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 154*820c1a8dSHiroo HAYASHI ac_cv_prog_cxx_cxx98=$ac_cv_prog_cxx_cxx11], 155*820c1a8dSHiroo HAYASHI [_AC_PROG_CXX_CXX98([ac_prog_cxx_stdcxx=cxx98 156*820c1a8dSHiroo HAYASHI ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98], 157*820c1a8dSHiroo HAYASHI [ac_prog_cxx_stdcxx=no 158*820c1a8dSHiroo HAYASHI ac_cv_prog_cxx_stdcxx=no])]) 159*820c1a8dSHiroo HAYASHIAC_LANG_POP(C++)dnl 160*820c1a8dSHiroo HAYASHI])# AC_PROG_CXX 161*820c1a8dSHiroo HAYASHI 162*820c1a8dSHiroo HAYASHI 163*820c1a8dSHiroo HAYASHI# _AC_C_STD_TRY(STANDARD, TEST-PROLOGUE, TEST-BODY, OPTION-LIST, 164*820c1a8dSHiroo HAYASHI# ACTION-IF-AVAILABLE, ACTION-IF-UNAVAILABLE) 165*820c1a8dSHiroo HAYASHI# -------------------------------------------------------------- 166*820c1a8dSHiroo HAYASHI# Check whether the C compiler accepts features of STANDARD (e.g `c89', `c99') 167*820c1a8dSHiroo HAYASHI# by trying to compile a program of TEST-PROLOGUE and TEST-BODY. If this fails, 168*820c1a8dSHiroo HAYASHI# try again with each compiler option in the space-separated OPTION-LIST; if one 169*820c1a8dSHiroo HAYASHI# helps, append it to CC. If eventually successful, run ACTION-IF-AVAILABLE, 170*820c1a8dSHiroo HAYASHI# else ACTION-IF-UNAVAILABLE. 171*820c1a8dSHiroo HAYASHIAC_DEFUN([_AC_C_STD_TRY], 172*820c1a8dSHiroo HAYASHI[AC_MSG_CHECKING([for $CC option to enable ]m4_translit($1, [c], [C])[ features]) 173*820c1a8dSHiroo HAYASHIAC_CACHE_VAL(ac_cv_prog_cc_$1, 174*820c1a8dSHiroo HAYASHI[ac_cv_prog_cc_$1=no 175*820c1a8dSHiroo HAYASHIac_save_CC=$CC 176*820c1a8dSHiroo HAYASHIAC_LANG_CONFTEST([AC_LANG_PROGRAM([$2], [$3])]) 177*820c1a8dSHiroo HAYASHIfor ac_arg in '' $4 178*820c1a8dSHiroo HAYASHIdo 179*820c1a8dSHiroo HAYASHI CC="$ac_save_CC $ac_arg" 180*820c1a8dSHiroo HAYASHI _AC_COMPILE_IFELSE([], [ac_cv_prog_cc_$1=$ac_arg]) 181*820c1a8dSHiroo HAYASHI test "x$ac_cv_prog_cc_$1" != "xno" && break 182*820c1a8dSHiroo HAYASHIdone 183*820c1a8dSHiroo HAYASHIrm -f conftest.$ac_ext 184*820c1a8dSHiroo HAYASHICC=$ac_save_CC 185*820c1a8dSHiroo HAYASHI])# AC_CACHE_VAL 186*820c1a8dSHiroo HAYASHIac_prog_cc_stdc_options= 187*820c1a8dSHiroo HAYASHIcase "x$ac_cv_prog_cc_$1" in 188*820c1a8dSHiroo HAYASHI x) 189*820c1a8dSHiroo HAYASHI AC_MSG_RESULT([none needed]) ;; 190*820c1a8dSHiroo HAYASHI xno) 191*820c1a8dSHiroo HAYASHI AC_MSG_RESULT([unsupported]) ;; 192*820c1a8dSHiroo HAYASHI *) 193*820c1a8dSHiroo HAYASHI ac_prog_cc_stdc_options=" $ac_cv_prog_cc_$1" 194*820c1a8dSHiroo HAYASHI CC=$CC$ac_prog_cc_stdc_options 195*820c1a8dSHiroo HAYASHI AC_MSG_RESULT([$ac_cv_prog_cc_$1]) ;; 196*820c1a8dSHiroo HAYASHIesac 197*820c1a8dSHiroo HAYASHIAS_IF([test "x$ac_cv_prog_cc_$1" != xno], [$5], [$6]) 198*820c1a8dSHiroo HAYASHI])# _AC_C_STD_TRY 199*820c1a8dSHiroo HAYASHI 200*820c1a8dSHiroo HAYASHI# _AC_C_C99_TEST_HEADER 201*820c1a8dSHiroo HAYASHI# --------------------- 202*820c1a8dSHiroo HAYASHI# A C header suitable for testing for C99. 203*820c1a8dSHiroo HAYASHIAC_DEFUN([_AC_C_C99_TEST_HEADER], 204*820c1a8dSHiroo HAYASHI[[#include <stdarg.h> 205*820c1a8dSHiroo HAYASHI#include <stdbool.h> 206*820c1a8dSHiroo HAYASHI#include <stddef.h> 207*820c1a8dSHiroo HAYASHI#include <stdlib.h> 208*820c1a8dSHiroo HAYASHI#include <wchar.h> 209*820c1a8dSHiroo HAYASHI#include <stdio.h> 210*820c1a8dSHiroo HAYASHI 211*820c1a8dSHiroo HAYASHI// Check varargs macros. These examples are taken from C99 6.10.3.5. 212*820c1a8dSHiroo HAYASHI#define debug(...) fprintf (stderr, __VA_ARGS__) 213*820c1a8dSHiroo HAYASHI#define showlist(...) puts (#__VA_ARGS__) 214*820c1a8dSHiroo HAYASHI#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) 215*820c1a8dSHiroo HAYASHIstatic void 216*820c1a8dSHiroo HAYASHItest_varargs_macros (void) 217*820c1a8dSHiroo HAYASHI{ 218*820c1a8dSHiroo HAYASHI int x = 1234; 219*820c1a8dSHiroo HAYASHI int y = 5678; 220*820c1a8dSHiroo HAYASHI debug ("Flag"); 221*820c1a8dSHiroo HAYASHI debug ("X = %d\n", x); 222*820c1a8dSHiroo HAYASHI showlist (The first, second, and third items.); 223*820c1a8dSHiroo HAYASHI report (x>y, "x is %d but y is %d", x, y); 224*820c1a8dSHiroo HAYASHI} 225*820c1a8dSHiroo HAYASHI 226*820c1a8dSHiroo HAYASHI// Check long long types. 227*820c1a8dSHiroo HAYASHI#define BIG64 18446744073709551615ull 228*820c1a8dSHiroo HAYASHI#define BIG32 4294967295ul 229*820c1a8dSHiroo HAYASHI#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) 230*820c1a8dSHiroo HAYASHI#if !BIG_OK 231*820c1a8dSHiroo HAYASHI your preprocessor is broken; 232*820c1a8dSHiroo HAYASHI#endif 233*820c1a8dSHiroo HAYASHI#if BIG_OK 234*820c1a8dSHiroo HAYASHI#else 235*820c1a8dSHiroo HAYASHI your preprocessor is broken; 236*820c1a8dSHiroo HAYASHI#endif 237*820c1a8dSHiroo HAYASHIstatic long long int bignum = -9223372036854775807LL; 238*820c1a8dSHiroo HAYASHIstatic unsigned long long int ubignum = BIG64; 239*820c1a8dSHiroo HAYASHI 240*820c1a8dSHiroo HAYASHIstruct incomplete_array 241*820c1a8dSHiroo HAYASHI{ 242*820c1a8dSHiroo HAYASHI int datasize; 243*820c1a8dSHiroo HAYASHI double data[]; 244*820c1a8dSHiroo HAYASHI}; 245*820c1a8dSHiroo HAYASHI 246*820c1a8dSHiroo HAYASHIstruct named_init { 247*820c1a8dSHiroo HAYASHI int number; 248*820c1a8dSHiroo HAYASHI const wchar_t *name; 249*820c1a8dSHiroo HAYASHI double average; 250*820c1a8dSHiroo HAYASHI}; 251*820c1a8dSHiroo HAYASHI 252*820c1a8dSHiroo HAYASHItypedef const char *ccp; 253*820c1a8dSHiroo HAYASHI 254*820c1a8dSHiroo HAYASHIstatic inline int 255*820c1a8dSHiroo HAYASHItest_restrict (ccp restrict text) 256*820c1a8dSHiroo HAYASHI{ 257*820c1a8dSHiroo HAYASHI // See if C++-style comments work. 258*820c1a8dSHiroo HAYASHI // Iterate through items via the restricted pointer. 259*820c1a8dSHiroo HAYASHI // Also check for declarations in for loops. 260*820c1a8dSHiroo HAYASHI for (unsigned int i = 0; *(text+i) != '\0'; ++i) 261*820c1a8dSHiroo HAYASHI continue; 262*820c1a8dSHiroo HAYASHI return 0; 263*820c1a8dSHiroo HAYASHI} 264*820c1a8dSHiroo HAYASHI 265*820c1a8dSHiroo HAYASHI// Check varargs and va_copy. 266*820c1a8dSHiroo HAYASHIstatic bool 267*820c1a8dSHiroo HAYASHItest_varargs (const char *format, ...) 268*820c1a8dSHiroo HAYASHI{ 269*820c1a8dSHiroo HAYASHI va_list args; 270*820c1a8dSHiroo HAYASHI va_start (args, format); 271*820c1a8dSHiroo HAYASHI va_list args_copy; 272*820c1a8dSHiroo HAYASHI va_copy (args_copy, args); 273*820c1a8dSHiroo HAYASHI 274*820c1a8dSHiroo HAYASHI const char *str = ""; 275*820c1a8dSHiroo HAYASHI int number = 0; 276*820c1a8dSHiroo HAYASHI float fnumber = 0; 277*820c1a8dSHiroo HAYASHI 278*820c1a8dSHiroo HAYASHI while (*format) 279*820c1a8dSHiroo HAYASHI { 280*820c1a8dSHiroo HAYASHI switch (*format++) 281*820c1a8dSHiroo HAYASHI { 282*820c1a8dSHiroo HAYASHI case 's': // string 283*820c1a8dSHiroo HAYASHI str = va_arg (args_copy, const char *); 284*820c1a8dSHiroo HAYASHI break; 285*820c1a8dSHiroo HAYASHI case 'd': // int 286*820c1a8dSHiroo HAYASHI number = va_arg (args_copy, int); 287*820c1a8dSHiroo HAYASHI break; 288*820c1a8dSHiroo HAYASHI case 'f': // float 289*820c1a8dSHiroo HAYASHI fnumber = va_arg (args_copy, double); 290*820c1a8dSHiroo HAYASHI break; 291*820c1a8dSHiroo HAYASHI default: 292*820c1a8dSHiroo HAYASHI break; 293*820c1a8dSHiroo HAYASHI } 294*820c1a8dSHiroo HAYASHI } 295*820c1a8dSHiroo HAYASHI va_end (args_copy); 296*820c1a8dSHiroo HAYASHI va_end (args); 297*820c1a8dSHiroo HAYASHI 298*820c1a8dSHiroo HAYASHI return *str && number && fnumber; 299*820c1a8dSHiroo HAYASHI}]])# _AC_C_C99_TEST_HEADER 300*820c1a8dSHiroo HAYASHI 301*820c1a8dSHiroo HAYASHI# _AC_C_C99_TEST_BODY 302*820c1a8dSHiroo HAYASHI# ------------------- 303*820c1a8dSHiroo HAYASHI# A C body suitable for testing for C99, assuming the corresponding header. 304*820c1a8dSHiroo HAYASHIAC_DEFUN([_AC_C_C99_TEST_BODY], 305*820c1a8dSHiroo HAYASHI[[ 306*820c1a8dSHiroo HAYASHI // Check bool. 307*820c1a8dSHiroo HAYASHI _Bool success = false; 308*820c1a8dSHiroo HAYASHI 309*820c1a8dSHiroo HAYASHI // Check restrict. 310*820c1a8dSHiroo HAYASHI if (test_restrict ("String literal") == 0) 311*820c1a8dSHiroo HAYASHI success = true; 312*820c1a8dSHiroo HAYASHI char *restrict newvar = "Another string"; 313*820c1a8dSHiroo HAYASHI 314*820c1a8dSHiroo HAYASHI // Check varargs. 315*820c1a8dSHiroo HAYASHI success &= test_varargs ("s, d' f .", "string", 65, 34.234); 316*820c1a8dSHiroo HAYASHI test_varargs_macros (); 317*820c1a8dSHiroo HAYASHI 318*820c1a8dSHiroo HAYASHI // Check flexible array members. 319*820c1a8dSHiroo HAYASHI struct incomplete_array *ia = 320*820c1a8dSHiroo HAYASHI malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); 321*820c1a8dSHiroo HAYASHI ia->datasize = 10; 322*820c1a8dSHiroo HAYASHI for (int i = 0; i < ia->datasize; ++i) 323*820c1a8dSHiroo HAYASHI ia->data[i] = i * 1.234; 324*820c1a8dSHiroo HAYASHI 325*820c1a8dSHiroo HAYASHI // Check named initializers. 326*820c1a8dSHiroo HAYASHI struct named_init ni = { 327*820c1a8dSHiroo HAYASHI .number = 34, 328*820c1a8dSHiroo HAYASHI .name = L"Test wide string", 329*820c1a8dSHiroo HAYASHI .average = 543.34343, 330*820c1a8dSHiroo HAYASHI }; 331*820c1a8dSHiroo HAYASHI 332*820c1a8dSHiroo HAYASHI ni.number = 58; 333*820c1a8dSHiroo HAYASHI 334*820c1a8dSHiroo HAYASHI int dynamic_array[ni.number]; 335*820c1a8dSHiroo HAYASHI dynamic_array[ni.number - 1] = 543; 336*820c1a8dSHiroo HAYASHI 337*820c1a8dSHiroo HAYASHI // work around unused variable warnings 338*820c1a8dSHiroo HAYASHI return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' 339*820c1a8dSHiroo HAYASHI || dynamic_array[ni.number - 1] != 543); 340*820c1a8dSHiroo HAYASHI]]) 341*820c1a8dSHiroo HAYASHI 342*820c1a8dSHiroo HAYASHI# _AC_PROG_CC_C99 ([ACTION-IF-AVAILABLE], [ACTION-IF-UNAVAILABLE]) 343*820c1a8dSHiroo HAYASHI# ---------------------------------------------------------------- 344*820c1a8dSHiroo HAYASHI# If the C compiler is not in ISO C99 mode by default, try to add an 345*820c1a8dSHiroo HAYASHI# option to output variable CC to make it so. This macro tries 346*820c1a8dSHiroo HAYASHI# various options that select ISO C99 on some system or another. It 347*820c1a8dSHiroo HAYASHI# considers the compiler to be in ISO C99 mode if it handles _Bool, 348*820c1a8dSHiroo HAYASHI# // comments, flexible array members, inline, long long int, mixed 349*820c1a8dSHiroo HAYASHI# code and declarations, named initialization of structs, restrict, 350*820c1a8dSHiroo HAYASHI# va_copy, varargs macros, variable declarations in for loops and 351*820c1a8dSHiroo HAYASHI# variable length arrays. 352*820c1a8dSHiroo HAYASHIAC_DEFUN([_AC_PROG_CC_C99], 353*820c1a8dSHiroo HAYASHI[_AC_C_STD_TRY([c99], 354*820c1a8dSHiroo HAYASHI[_AC_C_C99_TEST_HEADER], 355*820c1a8dSHiroo HAYASHI[_AC_C_C99_TEST_BODY], 356*820c1a8dSHiroo HAYASHIdnl Try 357*820c1a8dSHiroo HAYASHIdnl GCC -std=gnu99 (unused restrictive modes: -std=c99 -std=iso9899:1999) 358*820c1a8dSHiroo HAYASHIdnl IBM XL C -qlanglvl=extc1x (V12.1; does not pass C11 test) 359*820c1a8dSHiroo HAYASHIdnl IBM XL C -qlanglvl=extc99 360*820c1a8dSHiroo HAYASHIdnl (pre-V12.1; unused restrictive mode: -qlanglvl=stdc99) 361*820c1a8dSHiroo HAYASHIdnl HP cc -AC99 362*820c1a8dSHiroo HAYASHIdnl Intel ICC -std=c99, -c99 (deprecated) 363*820c1a8dSHiroo HAYASHIdnl IRIX -c99 364*820c1a8dSHiroo HAYASHIdnl Solaris -D_STDC_C99= 365*820c1a8dSHiroo HAYASHIdnl cc's -xc99 option uses linker magic to define the external 366*820c1a8dSHiroo HAYASHIdnl symbol __xpg4 as if by "int __xpg4 = 1;", which enables C99 367*820c1a8dSHiroo HAYASHIdnl behavior for C library functions. This is not wanted here, 368*820c1a8dSHiroo HAYASHIdnl because it means that a single module compiled with -xc99 369*820c1a8dSHiroo HAYASHIdnl alters C runtime behavior for the entire program, not for 370*820c1a8dSHiroo HAYASHIdnl just the module. Instead, define the (private) symbol 371*820c1a8dSHiroo HAYASHIdnl _STDC_C99, which suppresses a bogus failure in <stdbool.h>. 372*820c1a8dSHiroo HAYASHIdnl The resulting compiler passes the test case here, and that's 373*820c1a8dSHiroo HAYASHIdnl good enough. For more, please see the thread starting at: 374*820c1a8dSHiroo HAYASHIdnl https://lists.gnu.org/r/autoconf/2010-12/msg00059.html 375*820c1a8dSHiroo HAYASHIdnl Tru64 -c99 376*820c1a8dSHiroo HAYASHIdnl with extended modes being tried first. 377*820c1a8dSHiroo HAYASHI[[-std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc1x -qlanglvl=extc99]], [$1], [$2])[]dnl 378*820c1a8dSHiroo HAYASHI])# _AC_PROG_CC_C99 379*820c1a8dSHiroo HAYASHI 380*820c1a8dSHiroo HAYASHI 381*820c1a8dSHiroo HAYASHI# _AC_PROG_CC_C11 ([ACTION-IF-AVAILABLE], [ACTION-IF-UNAVAILABLE]) 382*820c1a8dSHiroo HAYASHI# ---------------------------------------------------------------- 383*820c1a8dSHiroo HAYASHI# If the C compiler is not in ISO C11 mode by default, try to add an 384*820c1a8dSHiroo HAYASHI# option to output variable CC to make it so. This macro tries 385*820c1a8dSHiroo HAYASHI# various options that select ISO C11 on some system or another. It 386*820c1a8dSHiroo HAYASHI# considers the compiler to be in ISO C11 mode if it handles _Alignas, 387*820c1a8dSHiroo HAYASHI# _Alignof, _Noreturn, _Static_assert, UTF-8 string literals, 388*820c1a8dSHiroo HAYASHI# duplicate typedefs, and anonymous structures and unions. 389*820c1a8dSHiroo HAYASHIAC_DEFUN([_AC_PROG_CC_C11], 390*820c1a8dSHiroo HAYASHI[_AC_C_STD_TRY([c11], 391*820c1a8dSHiroo HAYASHI[_AC_C_C99_TEST_HEADER[ 392*820c1a8dSHiroo HAYASHI// Check _Alignas. 393*820c1a8dSHiroo HAYASHIchar _Alignas (double) aligned_as_double; 394*820c1a8dSHiroo HAYASHIchar _Alignas (0) no_special_alignment; 395*820c1a8dSHiroo HAYASHIextern char aligned_as_int; 396*820c1a8dSHiroo HAYASHIchar _Alignas (0) _Alignas (int) aligned_as_int; 397*820c1a8dSHiroo HAYASHI 398*820c1a8dSHiroo HAYASHI// Check _Alignof. 399*820c1a8dSHiroo HAYASHIenum 400*820c1a8dSHiroo HAYASHI{ 401*820c1a8dSHiroo HAYASHI int_alignment = _Alignof (int), 402*820c1a8dSHiroo HAYASHI int_array_alignment = _Alignof (int[100]), 403*820c1a8dSHiroo HAYASHI char_alignment = _Alignof (char) 404*820c1a8dSHiroo HAYASHI}; 405*820c1a8dSHiroo HAYASHI_Static_assert (0 < -_Alignof (int), "_Alignof is signed"); 406*820c1a8dSHiroo HAYASHI 407*820c1a8dSHiroo HAYASHI// Check _Noreturn. 408*820c1a8dSHiroo HAYASHIint _Noreturn does_not_return (void) { for (;;) continue; } 409*820c1a8dSHiroo HAYASHI 410*820c1a8dSHiroo HAYASHI// Check _Static_assert. 411*820c1a8dSHiroo HAYASHIstruct test_static_assert 412*820c1a8dSHiroo HAYASHI{ 413*820c1a8dSHiroo HAYASHI int x; 414*820c1a8dSHiroo HAYASHI _Static_assert (sizeof (int) <= sizeof (long int), 415*820c1a8dSHiroo HAYASHI "_Static_assert does not work in struct"); 416*820c1a8dSHiroo HAYASHI long int y; 417*820c1a8dSHiroo HAYASHI}; 418*820c1a8dSHiroo HAYASHI 419*820c1a8dSHiroo HAYASHI// Check UTF-8 literals. 420*820c1a8dSHiroo HAYASHI#define u8 syntax error! 421*820c1a8dSHiroo HAYASHIchar const utf8_literal[] = u8"happens to be ASCII" "another string"; 422*820c1a8dSHiroo HAYASHI 423*820c1a8dSHiroo HAYASHI// Check duplicate typedefs. 424*820c1a8dSHiroo HAYASHItypedef long *long_ptr; 425*820c1a8dSHiroo HAYASHItypedef long int *long_ptr; 426*820c1a8dSHiroo HAYASHItypedef long_ptr long_ptr; 427*820c1a8dSHiroo HAYASHI 428*820c1a8dSHiroo HAYASHI// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. 429*820c1a8dSHiroo HAYASHIstruct anonymous 430*820c1a8dSHiroo HAYASHI{ 431*820c1a8dSHiroo HAYASHI union { 432*820c1a8dSHiroo HAYASHI struct { int i; int j; }; 433*820c1a8dSHiroo HAYASHI struct { int k; long int l; } w; 434*820c1a8dSHiroo HAYASHI }; 435*820c1a8dSHiroo HAYASHI int m; 436*820c1a8dSHiroo HAYASHI} v1; 437*820c1a8dSHiroo HAYASHI]], 438*820c1a8dSHiroo HAYASHI[_AC_C_C99_TEST_BODY[ 439*820c1a8dSHiroo HAYASHI v1.i = 2; 440*820c1a8dSHiroo HAYASHI v1.w.k = 5; 441*820c1a8dSHiroo HAYASHI _Static_assert ((offsetof (struct anonymous, i) 442*820c1a8dSHiroo HAYASHI == offsetof (struct anonymous, w.k)), 443*820c1a8dSHiroo HAYASHI "Anonymous union alignment botch"); 444*820c1a8dSHiroo HAYASHI]], 445*820c1a8dSHiroo HAYASHIdnl Try 446*820c1a8dSHiroo HAYASHIdnl GCC -std=gnu11 (unused restrictive mode: -std=c11) 447*820c1a8dSHiroo HAYASHIdnl with extended modes being tried first. 448*820c1a8dSHiroo HAYASHIdnl 449*820c1a8dSHiroo HAYASHIdnl Do not try -qlanglvl=extc1x, because IBM XL C V12.1 (the latest version as 450*820c1a8dSHiroo HAYASHIdnl of September 2012) does not pass the C11 test. For now, try extc1x when 451*820c1a8dSHiroo HAYASHIdnl compiling the C99 test instead, since it enables _Static_assert and 452*820c1a8dSHiroo HAYASHIdnl _Noreturn, which is a win. If -qlanglvl=extc11 or -qlanglvl=extc1x passes 453*820c1a8dSHiroo HAYASHIdnl the C11 test in some future version of IBM XL C, we'll add it here, 454*820c1a8dSHiroo HAYASHIdnl preferably extc11. 455*820c1a8dSHiroo HAYASHI[[-std=gnu11]], [$1], [$2])[]dnl 456*820c1a8dSHiroo HAYASHI])# _AC_PROG_CC_C11 457*820c1a8dSHiroo HAYASHI 458*820c1a8dSHiroo HAYASHI 459*820c1a8dSHiroo HAYASHI# AC_PROG_CC_C89 460*820c1a8dSHiroo HAYASHI# -------------- 461*820c1a8dSHiroo HAYASHI# Do not use AU_ALIAS here and in AC_PROG_CC_C99 and AC_PROG_CC_STDC, 462*820c1a8dSHiroo HAYASHI# as that'd be incompatible with how Automake redefines AC_PROG_CC. See 463*820c1a8dSHiroo HAYASHI# <https://lists.gnu.org/r/autoconf/2012-10/msg00048.html>. 464*820c1a8dSHiroo HAYASHIAU_DEFUN([AC_PROG_CC_C89], 465*820c1a8dSHiroo HAYASHI [AC_REQUIRE([AC_PROG_CC])], 466*820c1a8dSHiroo HAYASHI [$0 is obsolete; use AC_PROG_CC] 467*820c1a8dSHiroo HAYASHI) 468*820c1a8dSHiroo HAYASHI 469*820c1a8dSHiroo HAYASHI# AC_PROG_CC_C99 470*820c1a8dSHiroo HAYASHI# -------------- 471*820c1a8dSHiroo HAYASHIAU_DEFUN([AC_PROG_CC_C99], 472*820c1a8dSHiroo HAYASHI [AC_REQUIRE([AC_PROG_CC])], 473*820c1a8dSHiroo HAYASHI [$0 is obsolete; use AC_PROG_CC] 474*820c1a8dSHiroo HAYASHI) 475*820c1a8dSHiroo HAYASHI 476*820c1a8dSHiroo HAYASHI# AC_PROG_CC_STDC 477*820c1a8dSHiroo HAYASHI# --------------- 478*820c1a8dSHiroo HAYASHIAU_DEFUN([AC_PROG_CC_STDC], 479*820c1a8dSHiroo HAYASHI [AC_REQUIRE([AC_PROG_CC])], 480*820c1a8dSHiroo HAYASHI [$0 is obsolete; use AC_PROG_CC] 481*820c1a8dSHiroo HAYASHI) 482*820c1a8dSHiroo HAYASHI 483*820c1a8dSHiroo HAYASHI 484*820c1a8dSHiroo HAYASHI# AC_C_PROTOTYPES 485*820c1a8dSHiroo HAYASHI# --------------- 486*820c1a8dSHiroo HAYASHI# Check if the C compiler supports prototypes, included if it needs 487*820c1a8dSHiroo HAYASHI# options. 488*820c1a8dSHiroo HAYASHIAC_DEFUN([AC_C_PROTOTYPES], 489*820c1a8dSHiroo HAYASHI[AC_REQUIRE([AC_PROG_CC])dnl 490*820c1a8dSHiroo HAYASHIif test "$ac_prog_cc_stdc" != no; then 491*820c1a8dSHiroo HAYASHI AC_DEFINE(PROTOTYPES, 1, 492*820c1a8dSHiroo HAYASHI [Define to 1 if the C compiler supports function prototypes.]) 493*820c1a8dSHiroo HAYASHI AC_DEFINE(__PROTOTYPES, 1, 494*820c1a8dSHiroo HAYASHI [Define like PROTOTYPES; this can be used by system headers.]) 495*820c1a8dSHiroo HAYASHIfi 496*820c1a8dSHiroo HAYASHI])# AC_C_PROTOTYPES 497*820c1a8dSHiroo HAYASHI 498*820c1a8dSHiroo HAYASHI 499*820c1a8dSHiroo HAYASHI# _AC_CXX_STD_TRY(STANDARD, TEST-PROLOGUE, TEST-BODY, OPTION-LIST, 500*820c1a8dSHiroo HAYASHI# ACTION-IF-AVAILABLE, ACTION-IF-UNAVAILABLE) 501*820c1a8dSHiroo HAYASHI# ---------------------------------------------------------------- 502*820c1a8dSHiroo HAYASHI# Check whether the C++ compiler accepts features of STANDARD (e.g 503*820c1a8dSHiroo HAYASHI# `cxx98', `cxx11') by trying to compile a program of TEST-PROLOGUE 504*820c1a8dSHiroo HAYASHI# and TEST-BODY. If this fails, try again with each compiler option 505*820c1a8dSHiroo HAYASHI# in the space-separated OPTION-LIST; if one helps, append it to CXX. 506*820c1a8dSHiroo HAYASHI# If eventually successful, run ACTION-IF-AVAILABLE, else 507*820c1a8dSHiroo HAYASHI# ACTION-IF-UNAVAILABLE. 508*820c1a8dSHiroo HAYASHIAC_DEFUN([_AC_CXX_STD_TRY], 509*820c1a8dSHiroo HAYASHI[AC_MSG_CHECKING([for $CXX option to enable ]m4_translit(m4_translit($1, [x], [+]), [a-z], [A-Z])[ features]) 510*820c1a8dSHiroo HAYASHIAC_LANG_PUSH(C++)dnl 511*820c1a8dSHiroo HAYASHIAC_CACHE_VAL(ac_cv_prog_cxx_$1, 512*820c1a8dSHiroo HAYASHI[ac_cv_prog_cxx_$1=no 513*820c1a8dSHiroo HAYASHIac_save_CXX=$CXX 514*820c1a8dSHiroo HAYASHIAC_LANG_CONFTEST([AC_LANG_PROGRAM([$2], [$3])]) 515*820c1a8dSHiroo HAYASHIfor ac_arg in '' $4 516*820c1a8dSHiroo HAYASHIdo 517*820c1a8dSHiroo HAYASHI CXX="$ac_save_CXX $ac_arg" 518*820c1a8dSHiroo HAYASHI _AC_COMPILE_IFELSE([], [ac_cv_prog_cxx_$1=$ac_arg]) 519*820c1a8dSHiroo HAYASHI test "x$ac_cv_prog_cxx_$1" != "xno" && break 520*820c1a8dSHiroo HAYASHIdone 521*820c1a8dSHiroo HAYASHIrm -f conftest.$ac_ext 522*820c1a8dSHiroo HAYASHICXX=$ac_save_CXX 523*820c1a8dSHiroo HAYASHI])# AC_CACHE_VAL 524*820c1a8dSHiroo HAYASHIac_prog_cxx_stdcxx_options= 525*820c1a8dSHiroo HAYASHIcase "x$ac_cv_prog_cxx_$1" in 526*820c1a8dSHiroo HAYASHI x) 527*820c1a8dSHiroo HAYASHI AC_MSG_RESULT([none needed]) ;; 528*820c1a8dSHiroo HAYASHI xno) 529*820c1a8dSHiroo HAYASHI AC_MSG_RESULT([unsupported]) ;; 530*820c1a8dSHiroo HAYASHI *) 531*820c1a8dSHiroo HAYASHI ac_prog_cxx_stdcxx_options=" $ac_cv_prog_cxx_$1" 532*820c1a8dSHiroo HAYASHI CXX=$CXX$ac_prog_cxx_stdcxx_options 533*820c1a8dSHiroo HAYASHI AC_MSG_RESULT([$ac_cv_prog_cxx_$1]) ;; 534*820c1a8dSHiroo HAYASHIesac 535*820c1a8dSHiroo HAYASHIAC_LANG_POP(C++)dnl 536*820c1a8dSHiroo HAYASHIAS_IF([test "x$ac_cv_prog_cxx_$1" != xno], [$5], [$6]) 537*820c1a8dSHiroo HAYASHI])# _AC_CXX_STD_TRY 538*820c1a8dSHiroo HAYASHI 539*820c1a8dSHiroo HAYASHI# _AC_CXX_CXX98_TEST_HEADER 540*820c1a8dSHiroo HAYASHI# ------------------------- 541*820c1a8dSHiroo HAYASHI# A C++ header suitable for testing for CXX98. 542*820c1a8dSHiroo HAYASHIAC_DEFUN([_AC_CXX_CXX98_TEST_HEADER], 543*820c1a8dSHiroo HAYASHI[[ 544*820c1a8dSHiroo HAYASHI#include <algorithm> 545*820c1a8dSHiroo HAYASHI#include <cstdlib> 546*820c1a8dSHiroo HAYASHI#include <fstream> 547*820c1a8dSHiroo HAYASHI#include <iomanip> 548*820c1a8dSHiroo HAYASHI#include <iostream> 549*820c1a8dSHiroo HAYASHI#include <list> 550*820c1a8dSHiroo HAYASHI#include <map> 551*820c1a8dSHiroo HAYASHI#include <set> 552*820c1a8dSHiroo HAYASHI#include <sstream> 553*820c1a8dSHiroo HAYASHI#include <stdexcept> 554*820c1a8dSHiroo HAYASHI#include <string> 555*820c1a8dSHiroo HAYASHI#include <utility> 556*820c1a8dSHiroo HAYASHI#include <vector> 557*820c1a8dSHiroo HAYASHI 558*820c1a8dSHiroo HAYASHInamespace test { 559*820c1a8dSHiroo HAYASHI typedef std::vector<std::string> string_vec; 560*820c1a8dSHiroo HAYASHI typedef std::pair<int,bool> map_value; 561*820c1a8dSHiroo HAYASHI typedef std::map<std::string,map_value> map_type; 562*820c1a8dSHiroo HAYASHI typedef std::set<int> set_type; 563*820c1a8dSHiroo HAYASHI 564*820c1a8dSHiroo HAYASHI template<typename T> 565*820c1a8dSHiroo HAYASHI class printer { 566*820c1a8dSHiroo HAYASHI public: 567*820c1a8dSHiroo HAYASHI printer(std::ostringstream& os): os(os) {} 568*820c1a8dSHiroo HAYASHI void operator() (T elem) { os << elem << std::endl; } 569*820c1a8dSHiroo HAYASHI private: 570*820c1a8dSHiroo HAYASHI std::ostringstream& os; 571*820c1a8dSHiroo HAYASHI }; 572*820c1a8dSHiroo HAYASHI} 573*820c1a8dSHiroo HAYASHI]])# _AC_CXX_CXX98_TEST_HEADER 574*820c1a8dSHiroo HAYASHI 575*820c1a8dSHiroo HAYASHI# _AC_CXX_CXX98_TEST_BODY 576*820c1a8dSHiroo HAYASHI# ----------------------- 577*820c1a8dSHiroo HAYASHI# A C++ body suitable for testing for CXX98, assuming the corresponding header. 578*820c1a8dSHiroo HAYASHIAC_DEFUN([_AC_CXX_CXX98_TEST_BODY], 579*820c1a8dSHiroo HAYASHI[[ 580*820c1a8dSHiroo HAYASHI 581*820c1a8dSHiroo HAYASHItry { 582*820c1a8dSHiroo HAYASHI // Basic string. 583*820c1a8dSHiroo HAYASHI std::string teststr("ASCII text"); 584*820c1a8dSHiroo HAYASHI teststr += " string"; 585*820c1a8dSHiroo HAYASHI 586*820c1a8dSHiroo HAYASHI // Simple vector. 587*820c1a8dSHiroo HAYASHI test::string_vec testvec; 588*820c1a8dSHiroo HAYASHI testvec.push_back(teststr); 589*820c1a8dSHiroo HAYASHI testvec.push_back("foo"); 590*820c1a8dSHiroo HAYASHI testvec.push_back("bar"); 591*820c1a8dSHiroo HAYASHI if (testvec.size() != 3) { 592*820c1a8dSHiroo HAYASHI throw std::runtime_error("vector size is not 1"); 593*820c1a8dSHiroo HAYASHI } 594*820c1a8dSHiroo HAYASHI 595*820c1a8dSHiroo HAYASHI // Dump vector into stringstream and obtain string. 596*820c1a8dSHiroo HAYASHI std::ostringstream os; 597*820c1a8dSHiroo HAYASHI for (test::string_vec::const_iterator i = testvec.begin(); 598*820c1a8dSHiroo HAYASHI i != testvec.end(); ++i) { 599*820c1a8dSHiroo HAYASHI if (i + 1 != testvec.end()) { 600*820c1a8dSHiroo HAYASHI os << teststr << '\n'; 601*820c1a8dSHiroo HAYASHI } 602*820c1a8dSHiroo HAYASHI } 603*820c1a8dSHiroo HAYASHI // Check algorithms work. 604*820c1a8dSHiroo HAYASHI std::for_each(testvec.begin(), testvec.end(), test::printer<std::string>(os)); 605*820c1a8dSHiroo HAYASHI std::string os_out = os.str(); 606*820c1a8dSHiroo HAYASHI 607*820c1a8dSHiroo HAYASHI // Test pair and map. 608*820c1a8dSHiroo HAYASHI test::map_type testmap; 609*820c1a8dSHiroo HAYASHI testmap.insert(std::make_pair(std::string("key"), 610*820c1a8dSHiroo HAYASHI std::make_pair(53,false))); 611*820c1a8dSHiroo HAYASHI 612*820c1a8dSHiroo HAYASHI // Test set. 613*820c1a8dSHiroo HAYASHI int values[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; 614*820c1a8dSHiroo HAYASHI test::set_type testset(values, values + sizeof(values)/sizeof(values[0])); 615*820c1a8dSHiroo HAYASHI std::list<int> testlist(testset.begin(), testset.end()); 616*820c1a8dSHiroo HAYASHI std::copy(testset.begin(), testset.end(), std::back_inserter(testlist)); 617*820c1a8dSHiroo HAYASHI} catch (const std::exception& e) { 618*820c1a8dSHiroo HAYASHI std::cerr << "Caught exception: " << e.what() << std::endl; 619*820c1a8dSHiroo HAYASHI 620*820c1a8dSHiroo HAYASHI // Test fstream 621*820c1a8dSHiroo HAYASHI std::ofstream of("test.txt"); 622*820c1a8dSHiroo HAYASHI of << "Test ASCII text\n" << std::flush; 623*820c1a8dSHiroo HAYASHI of << "N= " << std::hex << std::setw(8) << std::left << 534 << std::endl; 624*820c1a8dSHiroo HAYASHI of.close(); 625*820c1a8dSHiroo HAYASHI} 626*820c1a8dSHiroo HAYASHIstd::exit(0); 627*820c1a8dSHiroo HAYASHI]]) 628*820c1a8dSHiroo HAYASHI 629*820c1a8dSHiroo HAYASHI# _AC_CXX_CXX11_TEST_HEADER 630*820c1a8dSHiroo HAYASHI# ------------------------- 631*820c1a8dSHiroo HAYASHI# A C++ header suitable for testing for CXX11. 632*820c1a8dSHiroo HAYASHIAC_DEFUN([_AC_CXX_CXX11_TEST_HEADER], 633*820c1a8dSHiroo HAYASHI[[ 634*820c1a8dSHiroo HAYASHI#include <deque> 635*820c1a8dSHiroo HAYASHI#include <functional> 636*820c1a8dSHiroo HAYASHI#include <memory> 637*820c1a8dSHiroo HAYASHI#include <tuple> 638*820c1a8dSHiroo HAYASHI#include <array> 639*820c1a8dSHiroo HAYASHI#include <regex> 640*820c1a8dSHiroo HAYASHI#include <iostream> 641*820c1a8dSHiroo HAYASHI 642*820c1a8dSHiroo HAYASHInamespace cxx11test 643*820c1a8dSHiroo HAYASHI{ 644*820c1a8dSHiroo HAYASHI typedef std::shared_ptr<std::string> sptr; 645*820c1a8dSHiroo HAYASHI typedef std::weak_ptr<std::string> wptr; 646*820c1a8dSHiroo HAYASHI 647*820c1a8dSHiroo HAYASHI typedef std::tuple<std::string,int,double> tp; 648*820c1a8dSHiroo HAYASHI typedef std::array<int, 20> int_array; 649*820c1a8dSHiroo HAYASHI 650*820c1a8dSHiroo HAYASHI constexpr int get_val() { return 20; } 651*820c1a8dSHiroo HAYASHI 652*820c1a8dSHiroo HAYASHI struct testinit 653*820c1a8dSHiroo HAYASHI { 654*820c1a8dSHiroo HAYASHI int i; 655*820c1a8dSHiroo HAYASHI double d; 656*820c1a8dSHiroo HAYASHI }; 657*820c1a8dSHiroo HAYASHI 658*820c1a8dSHiroo HAYASHI class delegate { 659*820c1a8dSHiroo HAYASHI public: 660*820c1a8dSHiroo HAYASHI delegate(int n) : n(n) {} 661*820c1a8dSHiroo HAYASHI delegate(): delegate(2354) {} 662*820c1a8dSHiroo HAYASHI 663*820c1a8dSHiroo HAYASHI virtual int getval() { return this->n; }; 664*820c1a8dSHiroo HAYASHI protected: 665*820c1a8dSHiroo HAYASHI int n; 666*820c1a8dSHiroo HAYASHI }; 667*820c1a8dSHiroo HAYASHI 668*820c1a8dSHiroo HAYASHI class overridden : public delegate { 669*820c1a8dSHiroo HAYASHI public: 670*820c1a8dSHiroo HAYASHI overridden(int n): delegate(n) {} 671*820c1a8dSHiroo HAYASHI virtual int getval() override final { return this->n * 2; } 672*820c1a8dSHiroo HAYASHI }; 673*820c1a8dSHiroo HAYASHI 674*820c1a8dSHiroo HAYASHI class nocopy { 675*820c1a8dSHiroo HAYASHI public: 676*820c1a8dSHiroo HAYASHI nocopy(int i): i(i) {} 677*820c1a8dSHiroo HAYASHI nocopy() = default; 678*820c1a8dSHiroo HAYASHI nocopy(const nocopy&) = delete; 679*820c1a8dSHiroo HAYASHI nocopy & operator=(const nocopy&) = delete; 680*820c1a8dSHiroo HAYASHI private: 681*820c1a8dSHiroo HAYASHI int i; 682*820c1a8dSHiroo HAYASHI }; 683*820c1a8dSHiroo HAYASHI} 684*820c1a8dSHiroo HAYASHI]])# _AC_CXX_CXX11_TEST_HEADER 685*820c1a8dSHiroo HAYASHI 686*820c1a8dSHiroo HAYASHI# _AC_CXX_CXX11_TEST_BODY 687*820c1a8dSHiroo HAYASHI# ----------------------- 688*820c1a8dSHiroo HAYASHI# A C++ body suitable for testing for CXX11, assuming the corresponding header. 689*820c1a8dSHiroo HAYASHIAC_DEFUN([_AC_CXX_CXX11_TEST_BODY], 690*820c1a8dSHiroo HAYASHI[[ 691*820c1a8dSHiroo HAYASHI{ 692*820c1a8dSHiroo HAYASHI // Test auto and decltype 693*820c1a8dSHiroo HAYASHI std::deque<int> d; 694*820c1a8dSHiroo HAYASHI d.push_front(43); 695*820c1a8dSHiroo HAYASHI d.push_front(484); 696*820c1a8dSHiroo HAYASHI d.push_front(3); 697*820c1a8dSHiroo HAYASHI d.push_front(844); 698*820c1a8dSHiroo HAYASHI int total = 0; 699*820c1a8dSHiroo HAYASHI for (auto i = d.begin(); i != d.end(); ++i) { total += *i; } 700*820c1a8dSHiroo HAYASHI 701*820c1a8dSHiroo HAYASHI auto a1 = 6538; 702*820c1a8dSHiroo HAYASHI auto a2 = 48573953.4; 703*820c1a8dSHiroo HAYASHI auto a3 = "String literal"; 704*820c1a8dSHiroo HAYASHI 705*820c1a8dSHiroo HAYASHI decltype(a2) a4 = 34895.034; 706*820c1a8dSHiroo HAYASHI} 707*820c1a8dSHiroo HAYASHI{ 708*820c1a8dSHiroo HAYASHI // Test constexpr 709*820c1a8dSHiroo HAYASHI short sa[cxx11test::get_val()] = { 0 }; 710*820c1a8dSHiroo HAYASHI} 711*820c1a8dSHiroo HAYASHI{ 712*820c1a8dSHiroo HAYASHI // Test initializer lists 713*820c1a8dSHiroo HAYASHI cxx11test::testinit il = { 4323, 435234.23544 }; 714*820c1a8dSHiroo HAYASHI} 715*820c1a8dSHiroo HAYASHI{ 716*820c1a8dSHiroo HAYASHI // Test range-based for and lambda 717*820c1a8dSHiroo HAYASHI cxx11test::int_array array = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; 718*820c1a8dSHiroo HAYASHI for (int &x : array) { x += 23; } 719*820c1a8dSHiroo HAYASHI std::for_each(array.begin(), array.end(), [](int v1){ std::cout << v1; }); 720*820c1a8dSHiroo HAYASHI} 721*820c1a8dSHiroo HAYASHI{ 722*820c1a8dSHiroo HAYASHI using cxx11test::sptr; 723*820c1a8dSHiroo HAYASHI using cxx11test::wptr; 724*820c1a8dSHiroo HAYASHI 725*820c1a8dSHiroo HAYASHI sptr sp(new std::string("ASCII string")); 726*820c1a8dSHiroo HAYASHI wptr wp(sp); 727*820c1a8dSHiroo HAYASHI sptr sp2(wp); 728*820c1a8dSHiroo HAYASHI} 729*820c1a8dSHiroo HAYASHI{ 730*820c1a8dSHiroo HAYASHI cxx11test::tp tuple("test", 54, 45.53434); 731*820c1a8dSHiroo HAYASHI double d = std::get<2>(tuple); 732*820c1a8dSHiroo HAYASHI std::string s; 733*820c1a8dSHiroo HAYASHI int i; 734*820c1a8dSHiroo HAYASHI std::tie(s,i,d) = tuple; 735*820c1a8dSHiroo HAYASHI} 736*820c1a8dSHiroo HAYASHI{ 737*820c1a8dSHiroo HAYASHI static std::regex filename_regex("^_?([a-z0-9_.]+-)+[a-z0-9]+$"); 738*820c1a8dSHiroo HAYASHI std::string testmatch("Test if this string matches"); 739*820c1a8dSHiroo HAYASHI bool match = std::regex_search(testmatch, filename_regex); 740*820c1a8dSHiroo HAYASHI} 741*820c1a8dSHiroo HAYASHI{ 742*820c1a8dSHiroo HAYASHI cxx11test::int_array array = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; 743*820c1a8dSHiroo HAYASHI cxx11test::int_array::size_type size = array.size(); 744*820c1a8dSHiroo HAYASHI} 745*820c1a8dSHiroo HAYASHI{ 746*820c1a8dSHiroo HAYASHI // Test constructor delegation 747*820c1a8dSHiroo HAYASHI cxx11test::delegate d1; 748*820c1a8dSHiroo HAYASHI cxx11test::delegate d2(); 749*820c1a8dSHiroo HAYASHI cxx11test::delegate d3(45); 750*820c1a8dSHiroo HAYASHI} 751*820c1a8dSHiroo HAYASHI{ 752*820c1a8dSHiroo HAYASHI // Test override and final 753*820c1a8dSHiroo HAYASHI cxx11test::overridden o1(55464); 754*820c1a8dSHiroo HAYASHI} 755*820c1a8dSHiroo HAYASHI{ 756*820c1a8dSHiroo HAYASHI // Test nullptr 757*820c1a8dSHiroo HAYASHI char *c = nullptr; 758*820c1a8dSHiroo HAYASHI} 759*820c1a8dSHiroo HAYASHI{ 760*820c1a8dSHiroo HAYASHI // Test template brackets 761*820c1a8dSHiroo HAYASHI std::vector<std::pair<int,char*>> v1; 762*820c1a8dSHiroo HAYASHI} 763*820c1a8dSHiroo HAYASHI{ 764*820c1a8dSHiroo HAYASHI // Unicode literals 765*820c1a8dSHiroo HAYASHI char const *utf8 = u8"UTF-8 string \u2500"; 766*820c1a8dSHiroo HAYASHI char16_t const *utf16 = u"UTF-8 string \u2500"; 767*820c1a8dSHiroo HAYASHI char32_t const *utf32 = U"UTF-32 string \u2500"; 768*820c1a8dSHiroo HAYASHI} 769*820c1a8dSHiroo HAYASHI]]) 770*820c1a8dSHiroo HAYASHI 771*820c1a8dSHiroo HAYASHI# _AC_PROG_CXX_CXX98 ([ACTION-IF-AVAILABLE], [ACTION-IF-UNAVAILABLE]) 772*820c1a8dSHiroo HAYASHI# ------------------------------------------------------------------- 773*820c1a8dSHiroo HAYASHI 774*820c1a8dSHiroo HAYASHI# If the C++ compiler is not in ISO C++98 mode by default, try to add 775*820c1a8dSHiroo HAYASHI# an option to output variable CXX to make it so. This macro tries 776*820c1a8dSHiroo HAYASHI# various options that select ISO C++98 on some system or another. It 777*820c1a8dSHiroo HAYASHI# considers the compiler to be in ISO C++98 mode if it handles basic 778*820c1a8dSHiroo HAYASHI# features of the std namespace including: string, containers (list, 779*820c1a8dSHiroo HAYASHI# map, set, vector), streams (fstreams, iostreams, stringstreams, 780*820c1a8dSHiroo HAYASHI# iomanip), pair, exceptions and algorithms. 781*820c1a8dSHiroo HAYASHI 782*820c1a8dSHiroo HAYASHI 783*820c1a8dSHiroo HAYASHIAC_DEFUN([_AC_PROG_CXX_CXX98], 784*820c1a8dSHiroo HAYASHI[_AC_CXX_STD_TRY([cxx98], 785*820c1a8dSHiroo HAYASHI[_AC_CXX_CXX98_TEST_HEADER], 786*820c1a8dSHiroo HAYASHI[_AC_CXX_CXX98_TEST_BODY], 787*820c1a8dSHiroo HAYASHIdnl Try 788*820c1a8dSHiroo HAYASHIdnl GCC -std=gnu++98 (unused restrictive mode: -std=c++98) 789*820c1a8dSHiroo HAYASHIdnl IBM XL C -qlanglvl=extended 790*820c1a8dSHiroo HAYASHIdnl HP aC++ -AA 791*820c1a8dSHiroo HAYASHIdnl Intel ICC -std=gnu++98 792*820c1a8dSHiroo HAYASHIdnl Solaris N/A (default) 793*820c1a8dSHiroo HAYASHIdnl Tru64 N/A (default, but -std gnu could be used) 794*820c1a8dSHiroo HAYASHIdnl with extended modes being tried first. 795*820c1a8dSHiroo HAYASHI[[-std=gnu++98 -std=c++98 -qlanglvl=extended -AA]], [$1], [$2])[]dnl 796*820c1a8dSHiroo HAYASHI])# _AC_PROG_CXX_CXX98 797*820c1a8dSHiroo HAYASHI 798*820c1a8dSHiroo HAYASHI# _AC_PROG_CXX_CXX11 ([ACTION-IF-AVAILABLE], [ACTION-IF-UNAVAILABLE]) 799*820c1a8dSHiroo HAYASHI# ------------------------------------------------------------------- 800*820c1a8dSHiroo HAYASHI# If the C++ compiler is not in ISO CXX11 mode by default, try to add 801*820c1a8dSHiroo HAYASHI# an option to output variable CXX to make it so. This macro tries 802*820c1a8dSHiroo HAYASHI# various options that select ISO C++11 on some system or another. It 803*820c1a8dSHiroo HAYASHI# considers the compiler to be in ISO C++11 mode if it handles all the 804*820c1a8dSHiroo HAYASHI# tests from the C++98 checks, plus the following: Language features 805*820c1a8dSHiroo HAYASHI# (auto, constexpr, decltype, default/deleted constructors, delegate 806*820c1a8dSHiroo HAYASHI# constructors, final, initializer lists, lambda functions, nullptr, 807*820c1a8dSHiroo HAYASHI# override, range-based for loops, template brackets without spaces, 808*820c1a8dSHiroo HAYASHI# unicode literals) and library features (array, memory (shared_ptr, 809*820c1a8dSHiroo HAYASHI# weak_ptr), regex and tuple types). 810*820c1a8dSHiroo HAYASHIAC_DEFUN([_AC_PROG_CXX_CXX11], 811*820c1a8dSHiroo HAYASHI[_AC_CXX_STD_TRY([cxx11], 812*820c1a8dSHiroo HAYASHI[_AC_CXX_CXX11_TEST_HEADER 813*820c1a8dSHiroo HAYASHI_AC_CXX_CXX98_TEST_HEADER], 814*820c1a8dSHiroo HAYASHI[_AC_CXX_CXX11_TEST_BODY 815*820c1a8dSHiroo HAYASHI_AC_CXX_CXX98_TEST_BODY], 816*820c1a8dSHiroo HAYASHIdnl Try 817*820c1a8dSHiroo HAYASHIdnl GCC -std=gnu++11 (unused restrictive mode: -std=c++11) [and 0x variants] 818*820c1a8dSHiroo HAYASHIdnl IBM XL C -qlanglvl=extended0x 819*820c1a8dSHiroo HAYASHIdnl (pre-V12.1; unused restrictive mode: -qlanglvl=stdcxx11) 820*820c1a8dSHiroo HAYASHIdnl HP aC++ -AA 821*820c1a8dSHiroo HAYASHIdnl Intel ICC -std=c++11 -std=c++0x 822*820c1a8dSHiroo HAYASHIdnl Solaris N/A (no support) 823*820c1a8dSHiroo HAYASHIdnl Tru64 N/A (no support) 824*820c1a8dSHiroo HAYASHIdnl with extended modes being tried first. 825*820c1a8dSHiroo HAYASHI[[-std=gnu++11 -std=c++11 -std=gnu++0x -std=c++0x -qlanglvl=extended0x -AA]], [$1], [$2])[]dnl 826*820c1a8dSHiroo HAYASHI])# _AC_PROG_CXX_CXX11 827*820c1a8dSHiroo HAYASHI 828*820c1a8dSHiroo HAYASHI 829*820c1a8dSHiroo HAYASHI])# m4_version_prereq 830