diff options
Diffstat (limited to 'gcc/treelang/parse.y')
-rw-r--r-- | gcc/treelang/parse.y | 54 |
1 files changed, 33 insertions, 21 deletions
diff --git a/gcc/treelang/parse.y b/gcc/treelang/parse.y index 665157e82a7..be443625221 100644 --- a/gcc/treelang/parse.y +++ b/gcc/treelang/parse.y @@ -3,7 +3,7 @@ --------------------------------------------------------------------- -Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 +Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it @@ -273,6 +273,7 @@ storage typename NAME LEFT_PARENTHESIS parameters_opt RIGHT_PARENTHESIS SEMICOLO { case STATIC_STORAGE: case EXTERNAL_DEFINITION_STORAGE: + case EXTERNAL_REFERENCE_STORAGE: break; case AUTOMATIC_STORAGE: @@ -324,6 +325,17 @@ storage typename NAME LEFT_PARENTHESIS parameters_opt RIGHT_PARENTHESIS SEMICOLO STORAGE_CLASS (prod), NUMERIC_TYPE (type), first_parms, tok->tp.tok.location); + +#ifdef ENABLE_CHECKING + /* Check all the parameters have code. */ + for (this_parm = PARAMETERS (prod); + this_parm; + this_parm = this_parm->tp.pro.next) + { + gcc_assert ((struct prod_token_parm_item*)VARIABLE (this_parm)); + gcc_assert (((struct prod_token_parm_item*)VARIABLE (this_parm))->tp.pro.code); + } +#endif } ; @@ -332,7 +344,6 @@ NAME LEFT_BRACE { struct prod_token_parm_item *proto; struct prod_token_parm_item search_prod; struct prod_token_parm_item* tok; - struct prod_token_parm_item *this_parm; tok = $1; SYMBOL_TABLE_NAME ((&search_prod)) = tok; search_prod.category = token_category; @@ -346,20 +357,9 @@ NAME LEFT_BRACE { gcc_assert (proto->tp.pro.code); - tree_code_create_function_initial (proto->tp.pro.code, tok->tp.tok.location, - FIRST_PARMS (current_function)); - -#ifdef ENABLE_CHECKING - /* Check all the parameters have code. */ - for (this_parm = PARAMETERS (proto); - this_parm; - this_parm = this_parm->tp.pro.next) - { - gcc_assert ((struct prod_token_parm_item*)VARIABLE (this_parm)); - gcc_assert (((struct prod_token_parm_item*)VARIABLE (this_parm))->tp.pro.code); - } -#endif + tree_code_create_function_initial (proto->tp.pro.code, tok->tp.tok.location); } + variable_defs_opt statements_opt RIGHT_BRACE { struct prod_token_parm_item* tok; tok = $1; @@ -591,8 +591,11 @@ INTEGER { struct prod_token_parm_item *tok = $2; struct prod_token_parm_item *op1 = $1; struct prod_token_parm_item *op2 = $3; + int type_code = NUMERIC_TYPE (op1); + if (!type_code) + YYERROR; $$ = make_plus_expression - (tok, op1, op2, SIGNED_INT, EXP_EQUALS); + (tok, op1, op2, type_code, EXP_EQUALS); } |variable_ref ASSIGN expression { struct prod_token_parm_item *tok = $2; @@ -610,7 +613,7 @@ INTEGER { ; function_invocation: -NAME LEFT_PARENTHESIS expressions_with_commas RIGHT_PARENTHESIS { +NAME LEFT_PARENTHESIS expressions_with_commas_opt RIGHT_PARENTHESIS { struct prod_token_parm_item *prod; struct prod_token_parm_item* tok; struct prod_token_parm_item search_prod; @@ -672,11 +675,18 @@ NAME LEFT_PARENTHESIS expressions_with_commas RIGHT_PARENTHESIS { type = tree_code_get_type (NUMERIC_TYPE (prod)); prod->tp.pro.code = tree_code_get_expression (EXP_FUNCTION_INVOCATION, type, proto->tp.pro.code, parms, - NULL); + NULL, tok->tp.tok.location); $$ = prod; } ; +expressions_with_commas_opt: +/* Nil. */ { +$$ = 0 +} +|expressions_with_commas { $$ = $1 } +; + expressions_with_commas: expression { struct prod_token_parm_item *exp; @@ -720,8 +730,9 @@ NAME { OP1 (prod) = $1; prod->tp.pro.code = - tree_code_get_expression (EXP_REFERENCE, type, - symbol_table_entry->tp.pro.code, NULL, NULL); + tree_code_get_expression (EXP_REFERENCE, type, + symbol_table_entry->tp.pro.code, NULL, NULL, + tok->tp.tok.location); $$ = prod; } ; @@ -910,7 +921,8 @@ make_plus_expression (struct prod_token_parm_item* tok, prod->tp.pro.code = tree_code_get_expression (prod_code, type, op1->tp.pro.code, - op2->tp.pro.code, NULL); + op2->tp.pro.code, NULL, + tok->tp.tok.location); return prod; } |