xref: /Universal-ctags/m4/std-gnu11.m4 (revision 820c1a8d46849a90376d8eb15b319ac05439f656)
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