]> git.draconx.ca Git - cdecl99.git/commitdiff
Fix pointer declarators.
authorNick Bowler <nbowler@draconx.ca>
Tue, 5 Jul 2011 22:23:01 +0000 (18:23 -0400)
committerNick Bowler <nbowler@draconx.ca>
Tue, 5 Jul 2011 22:23:01 +0000 (18:23 -0400)
Support for parsing pointer types like int ** was broken a while back.
Fix it up.

src/parse.y

index f7ef80c62479fb2fae74f12aca2c99ae6b0b375f..06cbc07d96418508f6a951271819ac38095258f2 100644 (file)
@@ -161,9 +161,9 @@ void cdecl_free(struct cdecl *decl)
 %type <strval>     vla_ident
 %type <uintval>    declspec_simple typespec_simple qualifier_simple
 %type <declspec>   declspec_notype declspec_noid typespec_noid typespec
-%type <declspec>   qualifier qualifiers pointer
+%type <declspec>   qualifier qualifiers
 %type <declspec>   declspecs declspecs_noid
-%type <declarator> direct_declarator declarator declarators array
+%type <declarator> direct_declarator declarator declarators pointer array
 %type <decl>       declaration
 
 %%
@@ -256,8 +256,6 @@ typespec: typespec_noid | T_STRUCT T_IDENT {
 
 declspec_noid: declspec_notype | typespec_noid
 
-pointer: T_ASTERISK qualifiers { $$ = $2; }
-
 vla_ident: T_IDENT | T_ASTERISK {
        ALLOC($$, sizeof "");
        strcpy($$, "");
@@ -279,13 +277,20 @@ array: T_LBRACKET T_UINT T_RBRACKET {
                .type = CDECL_DECL_ARRAY);
 }
 
-declarator: direct_declarator | pointer direct_declarator {
+pointer: T_ASTERISK qualifiers direct_declarator {
+       ALLOC_STRUCT($$, struct cdecl_declarator,
+               .type = CDECL_DECL_POINTER,
+               .u.pointer.qualifiers = $2,
+               .u.pointer.declarator = $3);
+} | T_ASTERISK qualifiers pointer {
        ALLOC_STRUCT($$, struct cdecl_declarator,
                .type = CDECL_DECL_POINTER,
-               .u.pointer.qualifiers = $1,
-               .u.pointer.declarator = $2);
+               .u.pointer.qualifiers = $2,
+               .u.pointer.declarator = $3);
 }
 
+declarator: direct_declarator | pointer;
+
 direct_declarator: {
        ALLOC_STRUCT($$, struct cdecl_declarator,
                .type = CDECL_DECL_IDENT,