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