X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCC.y;h=4a7ac6cfc2e3ac0beb8062c66926002ba08a90db;hb=e483295e5a0539ea4cea6a708f37fb94ea557c08;hp=b4b3664615be9f25d67283daf4d61e9306e7e9c3;hpb=e62b6792afc55ee7aff91f187d53d4ebc64bc816;p=fw%2Fsdcc diff --git a/src/SDCC.y b/src/SDCC.y index b4b36646..4a7ac6cf 100644 --- a/src/SDCC.y +++ b/src/SDCC.y @@ -85,7 +85,7 @@ value *cenum = NULL ; /* current enumeration type chain*/ %token CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE CONST VOLATILE VOID BIT %token STRUCT UNION ENUM ELIPSIS RANGE FAR %token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN -%token NAKED +%token NAKED JAVANATIVE OVERLAY %token INLINEASM %token IFX ADDRESS_OF GET_VALUE_AT_ADDRESS SPIL UNSPIL GETHBIT %token BITWISEAND UNARYMINUS IPUSH IPOP PCALL ENDFUNCTION JUMPTABLE @@ -192,6 +192,14 @@ function_attributes $$->class = SPECIFIER ; FUNC_ISNAKED($$)=1; } + | JAVANATIVE { $$ = newLink (); + $$->class = SPECIFIER ; + FUNC_ISJAVANATIVE($$)=1; + } + | OVERLAY { $$ = newLink (); + $$->class = SPECIFIER ; + FUNC_ISOVERLAY($$)=1; + } | NONBANKED {$$ = newLink (); $$->class = SPECIFIER ; FUNC_NONBANKED($$) = 1; @@ -398,34 +406,34 @@ assignment_expr $$ = newNode($2,$1,$3); break; case MUL_ASSIGN: - $$ = newNode('=',$1,newNode('*',copyAst($1),$3)); + $$ = newNode('=',$1,newNode('*',removeIncDecOps(copyAst($1)),$3)); break; case DIV_ASSIGN: - $$ = newNode('=',$1,newNode('/',copyAst($1),$3)); + $$ = newNode('=',$1,newNode('/',removeIncDecOps(copyAst($1)),$3)); break; case MOD_ASSIGN: - $$ = newNode('=',$1,newNode('%',copyAst($1),$3)); + $$ = newNode('=',$1,newNode('%',removeIncDecOps(copyAst($1)),$3)); break; case ADD_ASSIGN: - $$ = newNode('=',$1,newNode('+',copyAst($1),$3)); + $$ = newNode('=',$1,newNode('+',removeIncDecOps(copyAst($1)),$3)); break; case SUB_ASSIGN: - $$ = newNode('=',$1,newNode('-',copyAst($1),$3)); + $$ = newNode('=',$1,newNode('-',removeIncDecOps(copyAst($1)),$3)); break; case LEFT_ASSIGN: - $$ = newNode('=',$1,newNode(LEFT_OP,copyAst($1),$3)); + $$ = newNode('=',$1,newNode(LEFT_OP,removeIncDecOps(copyAst($1)),$3)); break; case RIGHT_ASSIGN: - $$ = newNode('=',$1,newNode(RIGHT_OP,copyAst($1),$3)); + $$ = newNode('=',$1,newNode(RIGHT_OP,removeIncDecOps(copyAst($1)),$3)); break; case AND_ASSIGN: - $$ = newNode('=',$1,newNode('&',copyAst($1),$3)); + $$ = newNode('=',$1,newNode('&',removeIncDecOps(copyAst($1)),$3)); break; case XOR_ASSIGN: - $$ = newNode('=',$1,newNode('^',copyAst($1),$3)); + $$ = newNode('=',$1,newNode('^',removeIncDecOps(copyAst($1)),$3)); break; case OR_ASSIGN: - $$ = newNode('=',$1,newNode('|',copyAst($1),$3)); + $$ = newNode('=',$1,newNode('|',removeIncDecOps(copyAst($1)),$3)); break; default : $$ = NULL; @@ -976,7 +984,7 @@ pointer { $$ = $1 ; $$->next = $2 ; - DCL_TYPE($2)=GPOINTER; + DCL_TYPE($2)=port->unqualified_pointer; } | unqualified_pointer type_specifier_list pointer { @@ -1148,6 +1156,12 @@ 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; } }