http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51705
--- Comment #16 from Steve Kargl <sgk at troutmask dot apl.washington.edu> 2011-12-30 04:01:52 UTC --- On Thu, Dec 29, 2011 at 11:12:39PM +0000, redi at gcc dot gnu.org wrote: > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51705 > > --- Comment #13 from Jonathan Wakely <redi at gcc dot gnu.org> 2011-12-29 > 23:12:39 UTC --- > (In reply to comment #10) > > I have no qualms with this. If it does not support C++03, then > > should advertise that it does. > > (Assuming you meant should *not*) that's not very useful in practice. If no > headers anywhere in existence actually use 'export' then do you seriously > argue > that no compiler should ever define __cplusplus == 199711L? Yes, I meant 'not'. Yes, if 'export' is not support, then __cplusplus should not be defined to indicate that g++ supports that standard. I have no problem with -std=c++11 enabling C++11 features and evening trying to apply a strict interpretation of C++11. But, if g++ does not support the entire language at 201103L, then it should not advertise that it does. > > If this is the case, then it definitely should not advertise > > that it does support C++11. > > But pragmatically, it helps more users to do the Right Thing for what users > use > and want. Clearly we have a real problem here for FreeBSD, and should be > fixed > by not defining __cplusplus==201103L or via fixincludes, but I maintain it was > pretty silly to update headers to use bleeding edge features before checking > if > they work with bleeding edge compilers. Yes, GCC 4.7 might be bleeding edge, > but so is [[noreturn]] support so not checking it works before using it is > just > sloppy. Given the area FreeBSD that Ed works on, I suspect it is supported by at least one compiler. > (In reply to comment #11) > > But this has nothing to do with FreeBSD specifically. It will apply to > > basically any operating system in the future. > > > > Say, GCC 4.8 (late 2012?) will support [[noreturn]] properly and some OS > > vendor > > decides to start using it by the year 2016 in its header files. That will > > still > > prevent you from compiling GCC 4.7 then, in case some piece of software > > depends > > on it. > > *ahem* It will prevent you using 4.7.0 20111229 (experimental) - this problem > doesn't exist with any released version. We can get it fixed (FreeBSD is a > primary platform after all, so this should be P2 or even P1) if we identify > the > problem correctly. I believe the right fix is fixincludes. Feel free to keep > arguing otherwise, but wherever the problem lies, it's not that libstdc++ uses > C++11 features (note that libstdc++ only ever checks > __GXX_EXPERIMENTAL_CXX0X__ > so is agnostic about the value of __cplusplus) Well, the correct fix is for g++ not to define __cplusplus as 201103L. Or, the correct fix is for the g++ developers to implement [[noreturn]]. But, common sense, here a hack to make it work on FreeBSD. 2011-12-29 Steven G. Kargl <ka...@gcc.gnu.org> * inclhack.def: Disgusting hack to workaround brain damage of defining __cplusplus as 201103L with -std=c++11 when g++ does not support c++11. * fixincl.x: regenerated. * genfixes: Fix a version test. Index: inclhack.def =================================================================== --- inclhack.def (revision 182738) +++ inclhack.def (working copy) @@ -20,6 +20,21 @@ autogen definitions fixincl; FIXINC_DEBUG = yes; #endif +/* + * g++ -std=c++11 defines __cplusplus to 201103L, which lies about + * the level of support g++ has for the C++11 standard. + */ +fix = { + hackname = cdef_cplusplus; + mach = "*-*-freebsd10.*"; + files = sys/cdefs.h; + select = "\\\\[\\\\[noreturn\\\\]\\\\]"; + sed = "s/\\\\[\\\\[noreturn\\\\]\\\\]/__dead2/"; + test_text = "#include <sys/cdefs.h>"; +}; + + + /* On AIX when _LARGE_FILES is defined stdio.h defines fopen to * fopen64 etc. and this causes problems when building with g++ * because cstdio udefs everything from stdio.h, leaving us with Index: fixincl.x =================================================================== --- fixincl.x (revision 182738) +++ fixincl.x (working copy) @@ -2,11 +2,11 @@ * * DO NOT EDIT THIS FILE (fixincl.x) * - * It has been AutoGen-ed November 7, 2011 at 01:16:39 PM by AutoGen 5.10 + * It has been AutoGen-ed December 29, 2011 at 06:29:22 PM by AutoGen 5.12 * From the definitions inclhack.def * and the template file fixincl */ -/* DO NOT SVN-MERGE THIS FILE, EITHER Mon Nov 7 13:16:39 EST 2011 +/* DO NOT SVN-MERGE THIS FILE, EITHER Thu Dec 29 18:29:22 PST 2011 * * You must regenerate it. Use the ./genfixes script. * @@ -15,7 +15,7 @@ * certain ANSI-incompatible system header files which are fixed to work * correctly with ANSI C and placed in a directory that GNU C will search. * - * This file contains 222 fixup descriptions. + * This file contains 223 fixup descriptions. * * See README for more information. * @@ -43,6 +43,42 @@ static char const sed_cmd_z[] = SED_PROG /* * * * * * * * * * * * * * * * * * * * * * * * * * * + * Description of Cdef_Cplusplus fix + */ +tSCC zCdef_CplusplusName[] = + "cdef_cplusplus"; + +/* + * File name selection pattern + */ +tSCC zCdef_CplusplusList[] = + "sys/cdefs.h\0"; +/* + * Machine/OS name selection pattern + */ +tSCC* apzCdef_CplusplusMachs[] = { + "*-*-freebsd10.*", + (const char*)NULL }; + +/* + * content selection pattern - do fix if pattern found + */ +tSCC zCdef_CplusplusSelect0[] = + "\\\\[\\\\[noreturn\\\\]\\\\]"; + +#define CDEF_CPLUSPLUS_TEST_CT 1 +static tTestDesc aCdef_CplusplusTests[] = { + { TT_EGREP, zCdef_CplusplusSelect0, (regex_t*)NULL }, }; + +/* + * Fix Command Arguments for Cdef_Cplusplus + */ +static const char* apzCdef_CplusplusPatch[] = { sed_cmd_z, + "-e", "s/\\\\[\\\\[noreturn\\\\]\\\\]/__dead2/", + (char*)NULL }; + +/* * * * * * * * * * * * * * * * * * * * * * * * * * + * * Description of Aab_Aix_Stdio fix */ tSCC zAab_Aix_StdioName[] = @@ -9034,14 +9070,15 @@ static const char* apzX11_SprintfPatch[] * * List of all fixes */ -#define REGEX_COUNT 264 +#define REGEX_COUNT 265 #define MACH_LIST_SIZE_LIMIT 181 -#define FIX_COUNT 222 +#define FIX_COUNT 223 /* * Enumerate the fixes */ typedef enum { + CDEF_CPLUSPLUS_FIXIDX, AAB_AIX_STDIO_FIXIDX, AAB_DARWIN7_9_LONG_DOUBLE_FUNCS_FIXIDX, AAB_DARWIN7_9_LONG_DOUBLE_FUNCS_2_FIXIDX, @@ -9267,6 +9304,11 @@ typedef enum { } t_fixinc_idx; tFixDesc fixDescList[ FIX_COUNT ] = { + { zCdef_CplusplusName, zCdef_CplusplusList, + apzCdef_CplusplusMachs, + CDEF_CPLUSPLUS_TEST_CT, FD_MACH_ONLY, + aCdef_CplusplusTests, apzCdef_CplusplusPatch, 0 }, + { zAab_Aix_StdioName, zAab_Aix_StdioList, apzAab_Aix_StdioMachs, AAB_AIX_STDIO_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE, Index: genfixes =================================================================== --- genfixes (revision 182738) +++ genfixes (working copy) @@ -62,7 +62,7 @@ fi AG="autogen $AG" set -e -if [ -z "`${AG} -v | fgrep 'Ver. 5.'`" ] +if [ -z "`${AG} -v | fgrep '5.'`" ] then echo "AutoGen appears to be out of date or not correctly installed." echo "Please download and install:"