Thread: psql vs. gcc

psql vs. gcc

From
Karel Zak - Zakkr
Date:
Hi,

If I compile current source, gcc (2.95.2) return interesting error for 
pgsql/describe.c.

gcc command line:

make[1]: Leaving directory /home/PG_DEVEL/pgsql.change/src/interfaces/libpq'
gcc -I../../interfaces/libpq -I../../include -I../../backend   -O2 -Wall
-Wmissing-prototypes -DMULTIBYTE=LATIN2   -c -o describe.o describe.c


The gcc return error for next lines:

------       strcpy(buf,          "SELECT pg_database.datname as \"Database\",\n"                  "
pg_user.usenameas \"Owner\""
 
#ifdef MULTIBYTE                  ",\n       pg_database.encoding as \"Encoding\""
#endif               );
-------

If I instead strcpy() write sprintf(buf, ..) all is right. 
What is bad, my gcc or previous source code? (IMHO is Peter's code right and
gcc is a little mazy).

Full error dump:

make -C ../../interfaces/libpq libpq.a
make[1]: Entering directory `/home/PG_DEVEL/pgsql.change/src/interfaces/libpq'
make[1]: `libpq.a' is up to date.
make[1]: Leaving directory `/home/PG_DEVEL/pgsql.change/src/interfaces/libpq'
gcc -I../../interfaces/libpq -I../../include -I../../backend   -O2 -Wall -Wmissing-prototypes -DMULTIBYTE=LATIN2   -c
-odescribe.o describe.c
 
describe.c:324: warning: preprocessing directive not recognized within macro arg
describe.c:324: warning: preprocessing directive not recognized within macro arg
describe.c:324: warning: preprocessing directive not recognized within macro arg
describe.c:324: warning: preprocessing directive not recognized within macro arg
describe.c:324: warning: preprocessing directive not recognized within macro arg
describe.c:324: warning: preprocessing directive not recognized within macro arg
describe.c:324: warning: preprocessing directive not recognized within macro arg
describe.c:324: warning: preprocessing directive not recognized within macro arg
describe.c:324: warning: preprocessing directive not recognized within macro arg
describe.c:324: warning: preprocessing directive not recognized within macro arg
describe.c:324: warning: preprocessing directive not recognized within macro arg
describe.c:324: warning: preprocessing directive not recognized within macro arg
describe.c:324: warning: preprocessing directive not recognized within macro arg
describe.c:324: warning: preprocessing directive not recognized within macro arg
describe.c: In function `listAllDbs':
describe.c:321: undefined or invalid # directive
describe.c:323: undefined or invalid # directive
describe.c:324: parse error before `#'
describe.c:324: parse error before `#'
describe.c:324: parse error before `#'
describe.c:324: parse error before `#'
describe.c:324: parse error before `#'
describe.c:324: parse error before `#'
describe.c:324: parse error before `#'
describe.c:324: parse error before `#'
describe.c:324: parse error before `#'
describe.c:324: parse error before `#'
describe.c:324: parse error before `#'
describe.c:324: parse error before `#'
describe.c:324: parse error before `#'
describe.c:324: parse error before `#'
describe.c:324: parse error before `#'
describe.c:324: parse error before `#'
describe.c:324: parse error before `:'
make: *** [describe.o] Error 1


----------------------------------------------------------------------
Karel Zak <zakkr@zf.jcu.cz>              http://home.zf.jcu.cz/~zakkr/

Docs:        http://docs.linux.cz                    (big docs archive)    
Kim Project: http://home.zf.jcu.cz/~zakkr/kim/        (process manager)
FTP:         ftp://ftp2.zf.jcu.cz/users/zakkr/        (C/ncurses/PgSQL)
-----------------------------------------------------------------------



Re: [HACKERS] psql vs. gcc

From
Thomas Lockhart
Date:
> If I compile current source, gcc (2.95.2) return interesting error for
> pgsql/describe.c.
> The gcc return error for next lines:
>         strcpy(buf,
>            "SELECT pg_database.datname as \"Database\",\n"
>                    "       pg_user.usename as \"Owner\""
> #ifdef MULTIBYTE
>                    ",\n       pg_database.encoding as \"Encoding\""
> #endif
>                 );

I'm sure we would accept a patch that changed this into a
 strcpy() #ifdef MULTIBYTE strcat() #endif

sequence rather than this monolithic line.
                   - Thomas

-- 
Thomas Lockhart                lockhart@alumni.caltech.edu
South Pasadena, California


Re: [HACKERS] psql vs. gcc

From
Tom Lane
Date:
Karel Zak - Zakkr <zakkr@zf.jcu.cz> writes:
>         strcpy(buf,
>            "SELECT pg_database.datname as \"Database\",\n"
>                    "       pg_user.usename as \"Owner\""
> #ifdef MULTIBYTE
>                    ",\n       pg_database.encoding as \"Encoding\""
> #endif
>                 );
> What is bad, my gcc or previous source code? (IMHO is Peter's code right and
> gcc is a little mazy).

After looking at my C reference, I believe gcc is following the ANSI C
spec and Peter's code is broken.  According to the book I'm looking at,
concatenation of adjacent string literals is specified to happen while
forming preprocessing tokens, which obviously must occur *before*
preprocessor directives are evaluated.  (#if throws away preprocessing
tokens, not raw characters...)  So when MULTIBYTE is defined, an
ANSI-compliant compiler will see a syntax error in the above.

> describe.c:324: warning: preprocessing directive not recognized within macro arg

Looks like there are a few other problems here too...
        regards, tom lane


Re: [HACKERS] psql vs. gcc

From
Bruce Momjian
Date:
I accidentally rejected the proper fix for this yesterday because there
was no description about what it was supposed to fix.  Let me see if I
can get it now.


> > If I compile current source, gcc (2.95.2) return interesting error for
> > pgsql/describe.c.
> > The gcc return error for next lines:
> >         strcpy(buf,
> >            "SELECT pg_database.datname as \"Database\",\n"
> >                    "       pg_user.usename as \"Owner\""
> > #ifdef MULTIBYTE
> >                    ",\n       pg_database.encoding as \"Encoding\""
> > #endif
> >                 );
> 
> I'm sure we would accept a patch that changed this into a
> 
>   strcpy()
>   #ifdef MULTIBYTE
>   strcat()
>   #endif
> 
> sequence rather than this monolithic line.
> 
>                     - Thomas
> 
> -- 
> Thomas Lockhart                lockhart@alumni.caltech.edu
> South Pasadena, California
> 
> ************
> 


--  Bruce Momjian                        |  http://www.op.net/~candle maillist@candle.pha.pa.us            |  (610)
853-3000+  If your life is a hard drive,     |  830 Blythe Avenue +  Christ can be your backup.        |  Drexel Hill,
Pennsylvania19026
 


Re: [HACKERS] psql vs. gcc

From
Bruce Momjian
Date:
OK, I have applied a patch to use strcat in the case of MULTIBYTE to add
the needed extra line.


> 
> Hi,
> 
> If I compile current source, gcc (2.95.2) return interesting error for 
> pgsql/describe.c.
> 
> gcc command line:
> 
> make[1]: Leaving directory /home/PG_DEVEL/pgsql.change/src/interfaces/libpq'
> gcc -I../../interfaces/libpq -I../../include -I../../backend   -O2 -Wall
> -Wmissing-prototypes -DMULTIBYTE=LATIN2   -c -o describe.o describe.c
> 
> 
> The gcc return error for next lines:
> 
> ------
>         strcpy(buf,
>            "SELECT pg_database.datname as \"Database\",\n"
>                    "       pg_user.usename as \"Owner\""
> #ifdef MULTIBYTE
>                    ",\n       pg_database.encoding as \"Encoding\""
> #endif
>                 );
> -------
> 
> If I instead strcpy() write sprintf(buf, ..) all is right. 
>  
> What is bad, my gcc or previous source code? (IMHO is Peter's code right and
> gcc is a little mazy).
> 
> Full error dump:
> 
> make -C ../../interfaces/libpq libpq.a
> make[1]: Entering directory `/home/PG_DEVEL/pgsql.change/src/interfaces/libpq'
> make[1]: `libpq.a' is up to date.
> make[1]: Leaving directory `/home/PG_DEVEL/pgsql.change/src/interfaces/libpq'
> gcc -I../../interfaces/libpq -I../../include -I../../backend   -O2 -Wall -Wmissing-prototypes -DMULTIBYTE=LATIN2   -c
-odescribe.o describe.c
 
> describe.c:324: warning: preprocessing directive not recognized within macro arg
> describe.c:324: warning: preprocessing directive not recognized within macro arg
> describe.c:324: warning: preprocessing directive not recognized within macro arg
> describe.c:324: warning: preprocessing directive not recognized within macro arg
> describe.c:324: warning: preprocessing directive not recognized within macro arg
> describe.c:324: warning: preprocessing directive not recognized within macro arg
> describe.c:324: warning: preprocessing directive not recognized within macro arg
> describe.c:324: warning: preprocessing directive not recognized within macro arg
> describe.c:324: warning: preprocessing directive not recognized within macro arg
> describe.c:324: warning: preprocessing directive not recognized within macro arg
> describe.c:324: warning: preprocessing directive not recognized within macro arg
> describe.c:324: warning: preprocessing directive not recognized within macro arg
> describe.c:324: warning: preprocessing directive not recognized within macro arg
> describe.c:324: warning: preprocessing directive not recognized within macro arg
> describe.c: In function `listAllDbs':
> describe.c:321: undefined or invalid # directive
> describe.c:323: undefined or invalid # directive
> describe.c:324: parse error before `#'
> describe.c:324: parse error before `#'
> describe.c:324: parse error before `#'
> describe.c:324: parse error before `#'
> describe.c:324: parse error before `#'
> describe.c:324: parse error before `#'
> describe.c:324: parse error before `#'
> describe.c:324: parse error before `#'
> describe.c:324: parse error before `#'
> describe.c:324: parse error before `#'
> describe.c:324: parse error before `#'
> describe.c:324: parse error before `#'
> describe.c:324: parse error before `#'
> describe.c:324: parse error before `#'
> describe.c:324: parse error before `#'
> describe.c:324: parse error before `#'
> describe.c:324: parse error before `:'
> make: *** [describe.o] Error 1
> 
> 
> ----------------------------------------------------------------------
> Karel Zak <zakkr@zf.jcu.cz>              http://home.zf.jcu.cz/~zakkr/
> 
> Docs:        http://docs.linux.cz                    (big docs archive)    
> Kim Project: http://home.zf.jcu.cz/~zakkr/kim/        (process manager)
> FTP:         ftp://ftp2.zf.jcu.cz/users/zakkr/        (C/ncurses/PgSQL)
> -----------------------------------------------------------------------
> 
> 
> ************
> 


--  Bruce Momjian                        |  http://www.op.net/~candle maillist@candle.pha.pa.us            |  (610)
853-3000+  If your life is a hard drive,     |  830 Blythe Avenue +  Christ can be your backup.        |  Drexel Hill,
Pennsylvania19026
 


Re: [HACKERS] psql vs. gcc

From
Peter Eisentraut
Date:
On 1999-12-17, Tom Lane mentioned:

> After looking at my C reference, I believe gcc is following the ANSI C
> spec and Peter's code is broken.  According to the book I'm looking at,
> concatenation of adjacent string literals is specified to happen while
> forming preprocessing tokens, which obviously must occur *before*
> preprocessor directives are evaluated.  (#if throws away preprocessing
> tokens, not raw characters...)  So when MULTIBYTE is defined, an
> ANSI-compliant compiler will see a syntax error in the above.

I usually compile all code with both gcc 2.8.1 and egcs 2.91.66 and make
it -Wall -W proof. So I must consider that an omission in those compilers.
Thanks for pointing it out.

> > describe.c:324: warning: preprocessing directive not recognized within macro arg
> 
> Looks like there are a few other problems here too...

The problem sounds more like strcpy is a macro now. Great. More macros.
Just what I need. :)

-- 
Peter Eisentraut                  Sernanders väg 10:115
peter_e@gmx.net                   75262 Uppsala
http://yi.org/peter-e/            Sweden