incompatible pointer type - Mailing list pgsql-bugs

From Robert Young
Subject incompatible pointer type
Date
Msg-id CAJjz_NhLdKSchC=nFFFUCfgQ-C1KG9W-TG3vX1JmMUGx2pGETA@mail.gmail.com
Whole thread Raw
Responses Re: incompatible pointer type
List pgsql-bugs
Platform:
OpenBSD  4.9 GENERIC.MP#819 amd64 Intel(R) Xeon(R) CPU E5620 @ 2.40GHz

Error:
gmake[4]: Entering directory `/tmp/pgxc/git/src/pl/plpgsql/src'
/usr/bin/bison -d  -o pl_gram.c gram.y
gcc -DPGXC -Wall -Wmissing-prototypes -Wpointer-arith
-Wdeclaration-after-statement -Wendif-labels -Wformat-security
-fno-strict-aliasing -fwrapv -fpic -DPIC -I. -I.
-I../../../../src/include   -c -o pl_gram.o pl_gram.c
gram.y: In function 'plpgsql_yyparse':
gram.y:875: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:878: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:1229: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:1516: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:1521: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:1562: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:1568: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:1574: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:1580: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:1586: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:1592: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:1636: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:1796: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:1800: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:1807: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y: In function 'tok_is_keyword':
gram.y:2197: error: dereferencing pointer to incomplete type
gram.y:2197: error: dereferencing pointer to incomplete type
gram.y:2198: error: dereferencing pointer to incomplete type
gram.y: In function 'read_datatype':
gram.y:2419: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:2426: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:2443: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:2450: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y: In function 'read_fetch_direction':
gram.y:2624: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:2629: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:2634: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:2639: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:2645: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:2654: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:2663: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:2669: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:2674: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y: In function 'read_raise_options':
gram.y:3370: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:3373: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:3376: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gram.y:3379: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gmake[4]: *** [pl_gram.o] Error 1
gmake[4]: Leaving directory `/tmp/pgxc/git/src/pl/plpgsql/src'

CAUSE:
let's inspect an error sample:
wrong1.c :
struct bar;
void foo(struct bar *p)
 {}
typedef struct
 {int a;
 } bar ;
bar u;
int main()
 {foo(&u);
  return(0);
 }

# gcc wrong1.c
wrong1.c: In function 'main':
wrong1.c:9: warning: passing argument 1 of 'foo' from incompatible pointer type

BECAUSE: The former "bar" and the latter "bar" are NOT RELEVANT.
If we rename the former "bar" to "bar_anthoer" ,the compiler would
give the same reply.
wrong2.c :
struct bar_another;
void foo(struct bar_another *p)
 {}
typedef struct
 {int a;
 } bar ;
bar u;
int main()
 {foo(&u);
  return(0);
 }

# gcc wrong2.c
wrong2.c: In function 'main':
wrong2.c:9: warning: passing argument 1 of 'foo' from incompatible pointer type

let's fix it.
right.c :
typedef struct
 {int a;
 } bar ;
void foo(bar *p)
 {}
bar u;
int main()
 {foo(&u);
  return(0);
 }

FIX:
1.delete "YYSTYPE" forward-declaration
2.move "tok_is_keyword" forward-declaration behind "YYSTYPE" definition
3.delete keyword "union" in function arguments.
OK.these will eliminate all the warnings.

diff --git a/src/pl/plpgsql/src/gram.y b/src/pl/plpgsql/src/gram.y
index 4e2b705..b632a76 100644
--- a/src/pl/plpgsql/src/gram.y
+++ b/src/pl/plpgsql/src/gram.y
@@ -53,10 +53,6 @@ typedef struct

 #define parser_errposition(pos)  plpgsql_scanner_errposition(pos)

-union YYSTYPE;                                 /* need forward
reference for tok_is_keyword */
-
-static bool                    tok_is_keyword(int token, union YYSTYPE *lval,
-
    int kw_token, const char *kw_str);
 static void                    word_is_not_variable(PLword *word, int
location);
 static void                    cword_is_not_variable(PLcword *cword,
int location);
 static void                    current_token_is_not_variable(int tok);
@@ -318,6 +314,10 @@ static     List
*read_raise_options(void);
 %token <keyword>       K_WHEN
 %token <keyword>       K_WHILE

+%{
+static bool                    tok_is_keyword(int token, YYSTYPE *lval,
+
    int kw_token, const char *kw_str);
+%}
 %%

 pl_function            : comp_options pl_block opt_semi
@@ -2179,7 +2179,7 @@ unreserved_keyword        :
  * Hence, this kluge.
  */
 static bool
-tok_is_keyword(int token, union YYSTYPE *lval,
+tok_is_keyword(int token, YYSTYPE *lval,
                           int kw_token, const char *kw_str)
 {
        if (token == kw_token)

pgsql-bugs by date:

Previous
From: Sachin Srivastava
Date:
Subject: Re: BUG #6260: not accept password
Next
From: Susanne Ebrecht
Date:
Subject: Re: char(0)