1# ============================================================================
2#  http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html
3# ============================================================================
4#
5# SYNOPSIS
6#
7#   AX_CXX_COMPILE_STDCXX_11([ext|noext])
8#
9# DESCRIPTION
10#
11#   Check for baseline language coverage in the compiler for the C++11
12#   standard; if necessary, add switches to CXXFLAGS to enable support.
13#   Errors out if no mode that supports C++11 baseline syntax can be found.
14#   The argument, if specified, indicates whether you insist on an extended
15#   mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. -std=c++11).
16#   If neither is specified, you get whatever works, with preference for an
17#   extended mode.
18#
19# LICENSE
20#
21#   Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
22#   Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
23#
24#   Copying and distribution of this file, with or without modification, are
25#   permitted in any medium without royalty provided the copyright notice
26#   and this notice are preserved. This file is offered as-is, without any
27#   warranty.
28
29#serial 1
30
31m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [
32  template <typename T>
33    struct check
34    {
35      static_assert(sizeof(int) <= sizeof(T), "not big enough");
36    };
37
38    typedef check<check<bool>> right_angle_brackets;
39
40    int a;
41    decltype(a) b;
42
43    typedef check<int> check_type;
44    check_type c;
45    check_type&& cr = static_cast<check_type&&>(c);
46])
47
48AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl
49  m4_if([$1], [], [],
50        [$1], [ext], [],
51        [$1], [noext], [],
52        [m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl
53  AC_LANG_ASSERT([C++])dnl
54  ac_success=no
55  AC_CACHE_CHECK(whether $CXX supports C++11 features by default,
56  ax_cv_cxx_compile_cxx11,
57  [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
58    [ax_cv_cxx_compile_cxx11=yes],
59    [ax_cv_cxx_compile_cxx11=no])])
60  if test x$ax_cv_cxx_compile_cxx11 = xyes; then
61    ac_success=yes
62  fi
63
64  m4_if([$1], [noext], [], [dnl
65  if test x$ac_success = xno; then
66    for switch in -std=gnu++11 -std=gnu++0x; do
67      cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
68      AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
69                     $cachevar,
70        [ac_save_CXXFLAGS="$CXXFLAGS"
71         CXXFLAGS="$CXXFLAGS $switch"
72         AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
73          [eval $cachevar=yes],
74          [eval $cachevar=no])
75         CXXFLAGS="$ac_save_CXXFLAGS"])
76      if eval test x\$$cachevar = xyes; then
77        CXXFLAGS="$CXXFLAGS $switch"
78        ac_success=yes
79        break
80      fi
81    done
82  fi])
83
84  m4_if([$1], [ext], [], [dnl
85  if test x$ac_success = xno; then
86    for switch in -std=c++11 -std=c++0x; do
87      cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
88      AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
89                     $cachevar,
90        [ac_save_CXXFLAGS="$CXXFLAGS"
91         CXXFLAGS="$CXXFLAGS $switch"
92         AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
93          [eval $cachevar=yes],
94          [eval $cachevar=no])
95         CXXFLAGS="$ac_save_CXXFLAGS"])
96      if eval test x\$$cachevar = xyes; then
97        CXXFLAGS="$CXXFLAGS $switch"
98        ac_success=yes
99        break
100      fi
101    done
102  fi])
103
104  if test x$ac_success = xno; then
105    AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.])
106  fi
107])
108