X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCC.y;h=44ef82b949ea23af59371be1da2b109518ce042d;hb=c2a0ea8e1e3331b8ea967a0c23cfaabf6fc33e59;hp=83409a13eee5b778e5622d262a60f7db466a8d51;hpb=d3b1ccb2d5c5999da084145c34cca85b6f8beff1;p=fw%2Fsdcc diff --git a/src/SDCC.y b/src/SDCC.y index 83409a13..44ef82b9 100644 --- a/src/SDCC.y +++ b/src/SDCC.y @@ -1015,6 +1015,7 @@ pointer default: // this could be just "constant" // werror(W_PTR_TYPE_INVALID); + ; } } else @@ -1101,9 +1102,13 @@ type_name /* go to the end of the list */ sym_link *p; pointerTypes($2,$1); - for ( p = $2 ; p->next ; p=p->next); - p->next = $1 ; - $$ = $2 ; + for ( p = $2 ; p && p->next ; p=p->next); + if (!p) { + werror(E_SYNTAX_ERROR, yytext); + } else { + p->next = $1 ; + } + $$ = $2 ; } ; @@ -1146,6 +1151,12 @@ abstract_declarator2 // $1 must be a pointer to a function sym_link *p=newLink(); DCL_TYPE(p) = FUNCTION; + if (!$1) { + // ((void (code *) ()) 0) () + $1=newLink(); + DCL_TYPE($1)=CPOINTER; + $$ = $1; + } $1->next=p; } | abstract_declarator2 '(' parameter_type_list ')' { @@ -1156,9 +1167,16 @@ abstract_declarator2 // $1 must be a pointer to a function sym_link *p=newLink(); DCL_TYPE(p) = FUNCTION; + if (!$1) { + // ((void (code *) (void)) 0) () + $1=newLink(); + DCL_TYPE($1)=CPOINTER; + $$ = $1; + } $1->next=p; } } + ; initializer : assignment_expr { $$ = newiList(INIT_NODE,$1); } @@ -1300,6 +1318,7 @@ while : WHILE { /* create and push the continue , break & body labels */ sprintf (lbuff,"_whilebody_%d",Lblnum++); $$ = newSymbol(lbuff,NestLevel); } + ; do : DO { /* create and push the continue , break & body Labels */ static int Lblnum = 0 ; @@ -1314,6 +1333,8 @@ do : DO { /* create and push the continue , break & body Labels */ sprintf (lbuff,"_dobody_%d",Lblnum++); $$ = newSymbol (lbuff,NestLevel); } + ; + for : FOR { /* create & push continue, break & body labels */ static int Lblnum = 0 ; @@ -1330,6 +1351,7 @@ for : FOR { /* create & push continue, break & body labels */ sprintf (lbuff,"_forcond_%d",Lblnum++); STACK_PUSH(forStack,newSymbol(lbuff,NestLevel)); } + ; iteration_statement : while '(' expr ')' statement