From 2632977f6b6aa2f5c6254a69936ca288ace0560d Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 17 Mar 2015 23:46:50 +0100 Subject: [PATCH] Don't attempt using with g++ 4.9.2 in C++98 mode. g++ 4.9.2 added support of __has_include() but, unlike clang, refuses to compile the header that is detected as existing now in C++98 mode, so the build was broken with it when not using configure (i.e. under MSW). Fix this by, first, testing for C++11 compilers separately (which seems like a good idea anyhow as it will allow using these headers with other compilers) and, second, not trusting g++ __has_include() for C++11 headers in C++98 mode. --- docs/changes.txt | 1 + include/wx/defs.h | 34 ++++++++++++++++++++++++++++++---- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 6ebbfa73e2..2a68451820 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -611,6 +611,7 @@ wxGTK: wxMSW: +- Fix compilation with g++ 4.9 in non-C++11 mode. - Fix regression in wxDC drawing with bottom-to-top y axis (Artur Wieczorek). - Fix compilation with C++Builder XE compiler (Nichka). - Fix best height of wxSlider with labels but without ticks (Artur Wieczorek). diff --git a/include/wx/defs.h b/include/wx/defs.h index b14ee413cb..7152b9dc5f 100644 --- a/include/wx/defs.h +++ b/include/wx/defs.h @@ -357,7 +357,21 @@ typedef short int WXTYPE; #endif #endif -#if defined(__has_include) +/* + Check for C++11 compilers, it is important to do it before the + __has_include() checks because of g++ 4.9.2+ complications below. + */ +#if __cplusplus >= 201103L || wxCHECK_VISUALC_VERSION(10) + #ifndef HAVE_TYPE_TRAITS + #define HAVE_TYPE_TRAITS + #endif + #ifndef HAVE_STD_UNORDERED_MAP + #define HAVE_STD_UNORDERED_MAP + #endif + #ifndef HAVE_STD_UNORDERED_SET + #define HAVE_STD_UNORDERED_SET + #endif +#elif defined(__has_include) /* Notice that we trust our configure tests more than __has_include(), notably the latter can return true even if the header exists but isn't @@ -365,8 +379,20 @@ typedef short int WXTYPE; So if configure already detected at least one working alternative, just use it. */ + + /* + Since 4.9.2, g++ provides __has_include() but, unlike clang, refuses to + compile the C++11 headers in C++98 mode (and we are sure we use the + latter because we explicitly checked for C++11 above). + */ + #if defined(__GNUC__) && !defined(__clang__) + #define wx_has_cpp11_include(h) 0 + #else + #define wx_has_cpp11_include(h) __has_include(h) + #endif + #if !defined(HAVE_TYPE_TRAITS) && !defined(HAVE_TR1_TYPE_TRAITS) - #if __has_include() + #if wx_has_cpp11_include() #define HAVE_TYPE_TRAITS #elif __has_include() #define HAVE_TR1_TYPE_TRAITS @@ -374,7 +400,7 @@ typedef short int WXTYPE; #endif #if !defined(HAVE_STD_UNORDERED_MAP) && !defined(HAVE_TR1_UNORDERED_MAP) - #if __has_include() + #if wx_has_cpp11_include() #define HAVE_STD_UNORDERED_MAP #elif __has_include() #define HAVE_TR1_UNORDERED_MAP @@ -382,7 +408,7 @@ typedef short int WXTYPE; #endif #if !defined(HAVE_STD_UNORDERED_SET) && !defined(HAVE_TR1_UNORDERED_SET) - #if __has_include() + #if wx_has_cpp11_include() #define HAVE_STD_UNORDERED_SET #elif __has_include() #define HAVE_TR1_UNORDERED_SET