Kaydet (Commit) 44159c6c authored tarafından Luboš Luňák's avatar Luboš Luňák

split the 'can we use C++11' check into independent tests for each problem

Change-Id: If0fdc13b02ca6dd4eb67afee5b308d2e51a5b30d
üst d7ae9f77
...@@ -5560,31 +5560,51 @@ dnl C++11 ...@@ -5560,31 +5560,51 @@ dnl C++11
dnl =================================================================== dnl ===================================================================
CXXFLAGS_CXX11= CXXFLAGS_CXX11=
HAVE_CXX11=
if test "$GCC" = "yes"; then if test "$GCC" = "yes"; then
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ CXXFLAGS_CXX11=
AC_MSG_CHECKING([whether $CXX supports C++11])
for flag in -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x ; do
save_CXXFLAGS=$CXXFLAGS
CXXFLAGS="$CXXFLAGS $flag -Werror"
AC_LANG_PUSH([C++])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[void f() {}]])],[CXXFLAGS_CXX11=$flag])
AC_LANG_POP([C++])
CXXFLAGS=$save_CXXFLAGS
if test -n "$CXXFLAGS_CXX11"; then
HAVE_CXX11=TRUE
break
fi
done
if test "$HAVE_CXX11" = TRUE; then
AC_MSG_RESULT([yes ($CXXFLAGS_CXX11)])
else
AC_MSG_RESULT(no)
fi
if test "$HAVE_CXX11" = TRUE; then
AC_MSG_CHECKING([whether using C++11 causes libstdc++ 4.7.0/4.7.1 ABI breakage])
# This should check libstdc++ version, not gcc, but clang has incidentally C++11 support
# disabled in this case by the __float128 case below.
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#if __GNUC__ == 4 && __GNUC_MINOR__ == 7 && (__GNUC_PATCHLEVEL__ == 0 || __GNUC_PATCHLEVEL__ == 1) #if __GNUC__ == 4 && __GNUC_MINOR__ == 7 && (__GNUC_PATCHLEVEL__ == 0 || __GNUC_PATCHLEVEL__ == 1)
abi broken
#else #else
abi ok
#endif #endif
]])],[HAVE_BROKEN_ABI=TRUE],[HAVE_BROKEN_ABI=FALSE]) ]])], [AC_MSG_RESULT(no, ok)],
[AC_MSG_RESULT(yes, disabling C++11)
HAVE_CXX11=])
fi
AC_MSG_CHECKING([whether $CXX supports C++11 without Language Defect 757]) if test "$HAVE_CXX11" = TRUE; then
# This should check libstdc++ version, not gcc, but clang has incidentally C++11 support AC_MSG_CHECKING([whether $CXX supports C++11 without Language Defect 757])
# disabled in this case by the __float128 case below.
if test "$HAVE_BROKEN_ABI" = "TRUE"; then
AC_MSG_NOTICE([Not using -std=gnu++0x on $CXX version 4.7.0/4.7.1 due to libstdc++ ABI breakage.])
else
save_CXXFLAGS=$CXXFLAGS save_CXXFLAGS=$CXXFLAGS
CXXFLAGS="$CXXFLAGS -std=gnu++0x" CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11"
AC_LANG_PUSH([C++]) AC_LANG_PUSH([C++])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <stddef.h> #include <stddef.h>
#include <vector>
// some Clang fail when compiling against GCC 4.7 headers with -std=gnu++0x
// (__float128)
template <typename T, size_t S> char (&sal_n_array_size( T(&)[S] ))[S]; template <typename T, size_t S> char (&sal_n_array_size( T(&)[S] ))[S];
namespace namespace
...@@ -5607,22 +5627,37 @@ size_t i = sizeof(sal_n_array_size(thinga)); ...@@ -5607,22 +5627,37 @@ size_t i = sizeof(sal_n_array_size(thinga));
size_t j = sizeof(sal_n_array_size(thingb)); size_t j = sizeof(sal_n_array_size(thingb));
return !(i != 0 && j != 0); return !(i != 0 && j != 0);
]]) ]])
],[ ], [ AC_MSG_RESULT(yes) ],
HAVE_CXX11=TRUE [ AC_MSG_RESULT(no)
if test "$CPP_LIBRARY" = LIBCPP -a $_os = Darwin; then HAVE_CXX11=
: Already set CXX to contain -std=c++11 ])
else AC_LANG_POP([C++])
CXXFLAGS_CXX11=-std=gnu++0x CXXFLAGS=$save_CXXFLAGS
fi fi
],[])
if test "$HAVE_CXX11" = TRUE; then
AC_MSG_CHECKING([whether $CXX supports C++11 without __float128 compile error])
save_CXXFLAGS=$CXXFLAGS
CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11"
AC_LANG_PUSH([C++])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <vector>
// some Clang fail when compiling against GCC 4.7 headers with -std=gnu++0x
// (__float128)
]])
],[ AC_MSG_RESULT(yes) ],
[ AC_MSG_RESULT(no)
HAVE_CXX11=
])
AC_LANG_POP([C++]) AC_LANG_POP([C++])
CXXFLAGS=$save_CXXFLAGS CXXFLAGS=$save_CXXFLAGS
fi fi
if test "$HAVE_CXX11" = "TRUE"; then
AC_MSG_RESULT([yes ($CXXFLAGS_CXX11)]) if test "$HAVE_CXX11" != "TRUE" -a -n "$CXXFLAGS_CXX11"; then
else AC_MSG_NOTICE([Disabling C++11 support])
AC_MSG_RESULT([no]) CXXFLAGS_CXX11=
fi fi
fi fi
...@@ -5633,8 +5668,8 @@ dnl ================================== ...@@ -5633,8 +5668,8 @@ dnl ==================================
dnl Check for C++11 "= delete" support dnl Check for C++11 "= delete" support
dnl ================================== dnl ==================================
AC_MSG_CHECKING([whether $CXX supports C++11 = delete syntax])
if test "$HAVE_CXX11" = "TRUE"; then if test "$HAVE_CXX11" = "TRUE"; then
AC_MSG_CHECKING([whether $CXX supports C++11 = delete syntax])
save_CXXFLAGS=$CXXFLAGS save_CXXFLAGS=$CXXFLAGS
CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11" CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11"
AC_LANG_PUSH([C++]) AC_LANG_PUSH([C++])
...@@ -5653,16 +5688,14 @@ struct A ...@@ -5653,16 +5688,14 @@ struct A
else else
AC_MSG_RESULT([no]) AC_MSG_RESULT([no])
fi fi
else
AC_MSG_RESULT([no])
fi fi
dnl ================================== dnl ==================================
dnl Check for C++11 "override" support dnl Check for C++11 "override" support
dnl ================================== dnl ==================================
AC_MSG_CHECKING([whether $CXX supports C++11 "override" syntax])
if test "$HAVE_CXX11" = "TRUE"; then if test "$HAVE_CXX11" = "TRUE"; then
AC_MSG_CHECKING([whether $CXX supports C++11 "override" syntax])
save_CXXFLAGS=$CXXFLAGS save_CXXFLAGS=$CXXFLAGS
CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11" CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11"
AC_LANG_PUSH([C++]) AC_LANG_PUSH([C++])
...@@ -5686,16 +5719,14 @@ struct B : A ...@@ -5686,16 +5719,14 @@ struct B : A
else else
AC_MSG_RESULT([no]) AC_MSG_RESULT([no])
fi fi
else
AC_MSG_RESULT([no])
fi fi
dnl ================================== dnl ==================================
dnl Check for C++11 "final" support dnl Check for C++11 "final" support
dnl ================================== dnl ==================================
AC_MSG_CHECKING([whether $CXX supports C++11 "final" syntax])
if test "$HAVE_CXX11" = "TRUE"; then if test "$HAVE_CXX11" = "TRUE"; then
AC_MSG_CHECKING([whether $CXX supports C++11 "final" syntax])
save_CXXFLAGS=$CXXFLAGS save_CXXFLAGS=$CXXFLAGS
CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11" CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11"
AC_LANG_PUSH([C++]) AC_LANG_PUSH([C++])
...@@ -5755,30 +5786,30 @@ struct D : C ...@@ -5755,30 +5786,30 @@ struct D : C
else else
AC_MSG_RESULT([no]) AC_MSG_RESULT([no])
fi fi
else
AC_MSG_RESULT([no])
fi fi
dnl =================================================================== dnl ===================================================================
dnl Check for C++11 perfect forwarding support dnl Check for C++11 perfect forwarding support
dnl =================================================================== dnl ===================================================================
AC_MSG_CHECKING([whether $CXX supports C++11 perfect forwarding]) if test "$HAVE_CXX11" = "TRUE"; then
save_CXXFLAGS=$CXXFLAGS AC_MSG_CHECKING([whether $CXX supports C++11 perfect forwarding])
CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11" save_CXXFLAGS=$CXXFLAGS
AC_LANG_PUSH([C++]) CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ AC_LANG_PUSH([C++])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <utility> #include <utility>
template<typename T, typename... Args> T * f(Args &&... v) { template<typename T, typename... Args> T * f(Args &&... v) {
return new T(std::forward<Args>(v)...); return new T(std::forward<Args>(v)...);
} }
]], [[ ]], [[
f<int>(0); f<int>(0);
]])], [perfect_forwarding=yes], [perfect_forwarding=no]) ]])], [perfect_forwarding=yes], [perfect_forwarding=no])
AC_LANG_POP([C++]) AC_LANG_POP([C++])
CXXFLAGS=$save_CXXFLAGS CXXFLAGS=$save_CXXFLAGS
AC_MSG_RESULT([$perfect_forwarding]) AC_MSG_RESULT([$perfect_forwarding])
if test "$perfect_forwarding" = yes; then if test "$perfect_forwarding" = yes; then
AC_DEFINE([HAVE_CXX11_PERFECT_FORWARDING]) AC_DEFINE([HAVE_CXX11_PERFECT_FORWARDING])
fi
fi fi
dnl =================================================================== dnl ===================================================================
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment