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