
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 -o describe.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)
-----------------------------------------------------------------------


Fri, 17 Dec 1999 15:11:22 +0100 (CET)
Karel Zak - Zakkr <zakkr@zf.jcu.cz>
psql vs. gcc
> 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

Fri, 17 Dec 1999 14:45:00 +0000
Thomas Lockhart <lockhart@alumni.caltech.edu>
Re: [HACKERS] psql vs. gcc
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

Fri, 17 Dec 1999 12:24:01 -0500
Tom Lane <tgl@sss.pgh.pa.us>
Re: [HACKERS] psql vs. gcc 
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, Pennsylvania 19026

Fri, 17 Dec 1999 12:43:33 -0500 (EST)
Bruce Momjian <pgman@candle.pha.pa.us>
Re: [HACKERS] psql vs. gcc
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 -o describe.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, Pennsylvania 19026

Fri, 17 Dec 1999 12:59:14 -0500 (EST)
Bruce Momjian <pgman@candle.pha.pa.us>
Re: [HACKERS] psql vs. gcc
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



Sat, 18 Dec 1999 14:06:28 +0100 (CET)
Peter Eisentraut <peter_e@gmx.net>
Re: [HACKERS] psql vs. gcc 