This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Sunos4 bootstrap failure, bug in cpp's implicit extern "C" marking


	I'm still getting the following error when bootstrapping on
sunos4 when compiling libstdc++/cinst.cc:

 >   ../../../egcs-CVS20000229/libstdc++/cinst.cc -o fcomplex.o
 > In file included from ../../../egcs-CVS20000229/libstdc++/complex:7,
 >                  from ../../../egcs-CVS20000229/libstdc++/std/complext.cc:28,
 >                  from ../../../egcs-CVS20000229/libstdc++/cinst.cc:29:
 > /a/caip/a99/u99/ghazi/gcc-testing/sunos-test/build/gcc/include/math.h:67:
 > previous declaration of `double hypot (double, double)' with C++ linkage
 > ../../../egcs-CVS20000229/libstdc++/std/complext.h:314:
 > conflicts with new declaration with C linkage
 > make[2]: *** [bigstmp-complx] Error 1

Note that the "fixed" math.h on sunos4 is giving C++ linkage to its
functions.  This has been happening since at least as far back as:

http://gcc.gnu.org/ml/gcc-bugs/2000-02/msg00142.html

I thought this would have been fixed with the patch that corrected the
"in system header" stuff, but its not.

I looked a bit at the code to do implicit extern "C" on system headers
and saw this in cpplib.c:output_line_command()

 >   /* Tell cc1 if following text comes from a system header file.  */
 >   if (ip->system_header_p)
 >     {
 >       CPP_PUTC_Q (pfile, ' ');
 >       CPP_PUTC_Q (pfile, '3');
 >     }
 > #ifndef NO_IMPLICIT_EXTERN_C
 >   /* Tell cc1plus if following text should be treated as C.  */
 >   if (ip->system_header_p == 2 && CPP_OPTIONS (pfile)->cplusplus)
 >     {
 >       CPP_PUTC_Q (pfile, ' ');
 >       CPP_PUTC_Q (pfile, '4');
 >     }
 > #endif

For Sunos4, NO_IMPLICIT_EXTERN_C is not defined, so the code above is
activated and I verified this by looking at cpplib.i.

When I look at cinst.ii, I see the following line directives for math.h:

# 1 "/a/caip/a99/u99/ghazi/gcc-testing/sunos-test/build/gcc/include/math.h" 1 3
# 57 "/a/caip/a99/u99/ghazi/gcc-testing/sunos-test/build/gcc/include/math.h" 2 3
# 165 "/a/caip/a99/u99/ghazi/gcc-testing/sunos-test/build/gcc/include/math.h" 3

I see the 3, indicating math.h is a system header, but I don't see a 4
to indicate implicit extern "C".

If I manually append " 4" at the end of all three lines in cinst.ii
and compile that file, the error goes away.  So its looks like cc1plus
is honoring the marker correctly, just that cpp isn't passing it in.
I'm guessing that something is wrong in the preprocessor.

		--Kaveh
--
Kaveh R. Ghazi			Engagement Manager / Project Services
ghazi@caip.rutgers.edu		Qwest Internet Solutions

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]