aboutsummaryrefslogtreecommitdiff
path: root/gcc/treelang/parse.y
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/treelang/parse.y')
-rw-r--r--gcc/treelang/parse.y46
1 files changed, 27 insertions, 19 deletions
diff --git a/gcc/treelang/parse.y b/gcc/treelang/parse.y
index e7c9838..29da162 100644
--- a/gcc/treelang/parse.y
+++ b/gcc/treelang/parse.y
@@ -5,7 +5,8 @@
---------------------------------------------------------------------
- Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
+ Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
@@ -254,7 +255,7 @@ typename NAME {
;
function_prototype:
-storage typename NAME LEFT_PARENTHESIS parameters RIGHT_PARENTHESIS SEMICOLON {
+storage typename NAME LEFT_PARENTHESIS parameters_opt RIGHT_PARENTHESIS SEMICOLON {
struct prod_token_parm_item* tok;
struct prod_token_parm_item *prod;
struct prod_token_parm_item *type;
@@ -450,6 +451,14 @@ INT {
}
;
+parameters_opt:
+/* Nothing to do. */ {
+ $$ = 0;
+}
+| parameters {
+ $$ = $1;
+}
+
parameters:
parameter {
/* Nothing to do. */
@@ -496,7 +505,7 @@ IF LEFT_PARENTHESIS expression RIGHT_PARENTHESIS {
ensure_not_void (NUMERIC_TYPE (exp), exp->tp.pro.main_token);
tree_code_if_start (exp->tp.pro.code, tok->tp.tok.location);
}
-LEFT_BRACE statements_opt RIGHT_BRACE {
+LEFT_BRACE variable_defs_opt statements_opt RIGHT_BRACE {
/* Just let the statements flow. */
}
ELSE {
@@ -504,7 +513,7 @@ ELSE {
tok = $1;
tree_code_if_else (tok->tp.tok.location);
}
-LEFT_BRACE statements_opt RIGHT_BRACE {
+LEFT_BRACE variable_defs_opt statements_opt RIGHT_BRACE {
struct prod_token_parm_item* tok;
tok = $12;
tree_code_if_end (tok->tp.tok.location);
@@ -518,25 +527,23 @@ tl_RETURN expression_opt {
struct prod_token_parm_item* ret_tok;
ret_tok = $1;
type_prod = EXPRESSION_TYPE (current_function);
- if (NUMERIC_TYPE (type_prod) == VOID)
+ if (NUMERIC_TYPE (type_prod) == VOID_TYPE)
if ($2 == NULL)
tree_code_generate_return (type_prod->tp.pro.code, NULL);
else
{
fprintf (stderr, "%s:%i:%i: Redundant expression in return\n",
- ret_tok->tp.tok.location.file,
- ret_tok->tp.tok.location.line, ret_tok->tp.tok.charno);
- print_token (stderr, 0, ret_tok);
+ ret_tok->tp.tok.location.file,
+ ret_tok->tp.tok.location.line, ret_tok->tp.tok.charno);
errorcount++;
tree_code_generate_return (type_prod->tp.pro.code, NULL);
- }
+ }
else
if ($2 == NULL)
{
fprintf (stderr, "%s:%i:%i: Expression missing in return\n",
- ret_tok->tp.tok.location.file,
- ret_tok->tp.tok.location.line, ret_tok->tp.tok.charno);
- print_token (stderr, 0, ret_tok);
+ ret_tok->tp.tok.location.file,
+ ret_tok->tp.tok.location.line, ret_tok->tp.tok.charno);
errorcount++;
}
else
@@ -687,7 +694,7 @@ NAME LEFT_PARENTHESIS expressions_with_commas RIGHT_PARENTHESIS {
abort ();
parms = tree_code_add_parameter (parms, var->tp.pro.code, exp->tp.pro.code);
}
- type = get_type_for_numeric_type (NUMERIC_TYPE (prod));
+ 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);
$$ = prod;
@@ -734,7 +741,7 @@ NAME {
prod = make_production (PROD_VARIABLE_REFERENCE_EXPRESSION, tok);
NUMERIC_TYPE (prod) = NUMERIC_TYPE (symbol_table_entry);
- type = get_type_for_numeric_type (NUMERIC_TYPE (prod));
+ type = tree_code_get_type (NUMERIC_TYPE (prod));
if (!NUMERIC_TYPE (prod))
YYERROR;
OP1 (prod) = $1;
@@ -832,7 +839,7 @@ reverse_prod_list (struct prod_token_parm_item *old_first)
static void
ensure_not_void (unsigned int type, struct prod_token_parm_item* name)
{
- if (type == VOID)
+ if (type == VOID_TYPE)
{
fprintf (stderr, "%s:%i:%i: Type must not be void in this context\n",
name->tp.tok.location.file,
@@ -877,7 +884,7 @@ check_type_match (int type_num, struct prod_token_parm_item *exp)
case UNSIGNED_CHAR:
return 1;
- case VOID:
+ case VOID_TYPE:
abort ();
default:
@@ -885,7 +892,7 @@ check_type_match (int type_num, struct prod_token_parm_item *exp)
}
break;
- case VOID:
+ case VOID_TYPE:
abort ();
default:
@@ -903,7 +910,8 @@ make_integer_constant (struct prod_token_parm_item* value)
struct prod_token_parm_item *prod;
tok = value;
prod = make_production (PROD_INTEGER_CONSTANT, tok);
- if ((tok->tp.tok.chars[0] == (unsigned char)'-')|| (tok->tp.tok.chars[0] == (unsigned char)'+'))
+ if ((tok->tp.tok.chars[0] == (unsigned char)'-')
+ || (tok->tp.tok.chars[0] == (unsigned char)'+'))
NUMERIC_TYPE (prod) = SIGNED_INT;
else
NUMERIC_TYPE (prod) = UNSIGNED_INT;
@@ -930,7 +938,7 @@ make_plus_expression (struct prod_token_parm_item* tok,
prod = make_production (PROD_PLUS_EXPRESSION, tok);
NUMERIC_TYPE (prod) = type_code;
- type = get_type_for_numeric_type (NUMERIC_TYPE (prod));
+ type = tree_code_get_type (type_code);
if (!type)
abort ();
OP1 (prod) = op1;