http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54659
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |ebotcazou at gcc dot | |gnu.org --- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> 2012-12-21 11:35:46 UTC --- (In reply to comment #4) > On Fri, 26 Oct 2012, dnovillo at google dot com wrote: > > > > > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54659 > > > > --- Comment #3 from dnovillo at google dot com <dnovillo at google dot com> > > 2012-10-26 12:34:53 UTC --- > > On Fri, Oct 26, 2012 at 8:05 AM, rguenther at suse dot de > > <gcc-bugzi...@gcc.gnu.org> wrote: > > > > > Fact is that all this stuff happens because gmp.h is not included > > > from system.h ... > > > > I broke Ada when I tried it. I don't remember the details, but it > > seemed tedious to fix. > > I know ... but it's the only way that is designed to avoid this > kind of issues. Trying to see what happens ... The issue is r176210 wrapping everything in #ifdef __cplusplus extern "C" { #endif ... #ifdef __cplusplus } #endif _including_ #include statements, including the inclusion of system.h. That of course is totally bogus. What it wants is to make sure exports have C linkage (I assume). A fix is to undo this ... like with the following hack: Index: gcc/system.h =================================================================== --- gcc/system.h (revision 194658) +++ gcc/system.h (working copy) @@ -24,6 +24,11 @@ along with GCC; see the file COPYING3. #ifndef GCC_SYSTEM_H #define GCC_SYSTEM_H +/* Undo extern "C" wrappings done by including files (Ada). */ +#ifdef __cplusplus +extern "C++" { +#endif + /* We must include stdarg.h before stdio.h. */ #include <stdarg.h> @@ -1051,4 +1056,8 @@ helper_const_non_const_cast (const char #define DEBUG_VARIABLE #endif +#ifdef __cplusplus +} +#endif + #endif /* ! GCC_SYSTEM_H */ but of course even better would be to fix the reason for this hack - why are those Ada files built with a C++ compiler in the first place?! Why does it need to wrap _everything_ inside extern "C"?? Ada people?