Builtin functions wrongly expanded (egcs-1.1.2, Red Hat 6.0)

Michael Smith michael@csuite.ns.ca
Sat Sep 25 12:42:00 GMT 1999


We're running Red Hat 6.0 (standard egcs-1.1.2-12 RPM). Compilation of
wu-ftpd (2.4.2-beta18 - long story) fails in a function where strpbrk() is
redeclared (er, redefined? been a while since I read a C text...) because
cpp expands it.

Here's a code snippet to reproduce:

#include <string.h>

int
main(int argc, char **argv)
{
	char *strpbrk(const char *, const char *);

	return 0;
}

$ gcc -v -O -save-temps -o nobuiltin nobuiltin.c
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/specs
gcc version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)
 /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/cpp -lang-c -v -undef
-D__GNUC__=2 -D__GNUC_MINOR__=91 -D__ELF__ -Dunix -Di386 -D__i386__
-Dlinux -D__ELF__ -D__unix__ -D__i386__ -D__i386__ -D__linux__ -D__unix
-D__i386 -D__linux -Asystem(posix) -D__OPTIMIZE__ -Asystem(unix)
-Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ nobuiltin.c
nobuiltin.i
GNU CPP version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release) (i386
Linux/ELF
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/i386-redhat-linux/include
 /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include
 /usr/include
End of search list.
 /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/cc1 nobuiltin.i -quiet
-dumpbase nobuiltin.c -O -version -o nobuiltin.s
GNU C version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)
(i386-redhat-linux) compiled by GNU C version egcs-2.91.66 19990314/Linux
(egcs-1.1.2 release).
nobuiltin.c: In function `main':
nobuiltin.c:6: parse error before `__extension__'
nobuiltin.c:6: parse error before `const'
nobuiltin.c:6: parse error before `=='
nobuiltin.c:6: `__a0' undeclared (first use in this function)
nobuiltin.c:6: (Each undeclared identifier is reported only once
nobuiltin.c:6: for each function it appears in.)
nobuiltin.c:6: parse error before `)'
nobuiltin.c:6: `__a1' undeclared (first use in this function)
nobuiltin.c:6: parse error before `)'
nobuiltin.c:6: parse error before `const'
nobuiltin.c:6: parse error before `const'
nobuiltin.c:6: `__a2' undeclared (first use in this function)
nobuiltin.c:6: parse error before `)'
nobuiltin.c:6: parse error before `const'

I think this is a bug in gcc, but I wouldn't be surprised if I'm wrong. I
included -fno-builtin on the command line, which I thought should take
care of this, but it seemed to have no effect (the resulting intermediate 
files were identical). I've attached nobuiltin.i but here's the important
part:


# 1 "nobuiltin.c" 2


int
main(int argc, char **argv)
{
        char * __extension__    ({ char __a0, __a1, __a2;
(__builtin_constant_p (  const char * ) && ((size_t)(const void *)((
const char *  ) + 1) - (size_t)(const void *)(   const char *  ) == 1)   ?
((__a0 = ((__const char  *) (  const char * ))[0], __a0 == '\0')      ?
((void *)0)   : ((__a1 = ((__const char *) (  const char * ))[1], __a1 ==
'\0')       ? (__extension__ (__builtin_constant_p (  __a0 ) && (  __a0 )
== '\0'   ? (char *) __rawmemchr (  const char *  ,   __a0 )      : strchr
(  const char *  ,   __a0 )))  : ((__a2 = ((__const char *) (  const char
* ))[2], __a2 == '\0')       ? __strpbrk_c2 ( const char * , __a0, __a1)
: (((__const char *) (  const char * ))[3] == '\0'      ? __strpbrk_c3 (
const char * , __a0, __a1, __a2)       : strpbrk ( const char * ,   const
char * ))))) : strpbrk ( const char * ,   const char * )); }) ;

        return 0;
}

--------------------------------------------------------------------------
 Michael Smith				michael@csuite.ns.ca
 Director of information warfare	Halifax, Nova Scotia, Canada
 Chebucto Community Net			http://www.chebucto.ns.ca/~aa529/
==========================================================================


More information about the Gcc-bugs mailing list