From a33600d3cb9056644066f2a339bedb10aa71c4cd Mon Sep 17 00:00:00 2001 From: Rhys Weatherley Date: Tue, 11 May 2004 06:52:19 +0000 Subject: [PATCH] Report errors for unimplemented expressions and statements, so that users are not "surprised" when things silently fail. --- ChangeLog | 4 +++ dpas/dpas-parser.y | 74 +++++++++++++++++++++++++++++++++++++++------- dpas/dpas-types.c | 8 +++-- dpas/dpas-types.h | 2 ++ 4 files changed, 76 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4a8db29..569c492 100644 --- a/ChangeLog +++ b/ChangeLog @@ -15,6 +15,10 @@ * jit/jit-reg-alloc.c (_jit_regs_load_to_top_two): handle the case where the second value is on the stack but not the first. + * dpas/dpas-parser.y, dpas/dpas-types.c, dpas/dpas-types.h: + report errors for unimplemented expressions and statements, + so that users are not "surprised" when things silently fail. + 2004-05-10 Rhys Weatherley * jit/jit-reg-alloc.c, jit/jit-reg-alloc.h, jit/jit-rules-interp.c: diff --git a/dpas/dpas-parser.y b/dpas/dpas-parser.y index 05dc8ad..3561095 100644 --- a/dpas/dpas-parser.y +++ b/dpas/dpas-parser.y @@ -1523,16 +1523,28 @@ InnerStatement } expression_list_free($2.exprs, $2.len); } - | K_GOTO Label + | K_GOTO Label { + /* TODO */ + dpas_error("`goto' statements not yet implemented"); + } | CompoundStatement | IfStatement | WhileStatement | RepeatStatement | ForStatement | CaseStatement - | K_WITH VariableList K_DO Statement - | K_THROW Expression - | K_THROW + | K_WITH VariableList K_DO Statement { + /* TODO */ + dpas_error("`with' statements not yet implemented"); + } + | K_THROW Expression { + /* TODO */ + dpas_error("`throw' statements not yet implemented"); + } + | K_THROW { + /* TODO */ + dpas_error("`throw' statements not yet implemented"); + } | TryStatement | K_EXIT { /* Exit from the current loop level */ @@ -2101,7 +2113,10 @@ Direction ; CaseStatement - : K_CASE Expression K_OF CaseLimbList + : K_CASE Expression K_OF CaseLimbList { + /* TODO */ + dpas_error("`case' statements not yet implemented"); + } ; CaseLimbList @@ -2124,7 +2139,10 @@ VariableList ; TryStatement - : K_TRY StatementSequence OptSemi CatchClause FinallyClause K_END + : K_TRY StatementSequence OptSemi CatchClause FinallyClause K_END { + /* TODO */ + dpas_error("`try' statements not yet implemented"); + } ; CatchClause @@ -2402,8 +2420,16 @@ Factor (dpas_current_function(), &($1)); dpas_sem_set_rvalue($$, $1.type, value); } - | '[' ExpressionList ']' { /* TODO */ } - | '[' ']' { /* TODO */ } + | '[' ExpressionList ']' { + /* TODO */ + dpas_error("set expressions not yet implemented"); + dpas_sem_set_error($$); + } + | '[' ']' { + /* TODO */ + dpas_error("set expressions not yet implemented"); + dpas_sem_set_error($$); + } | K_NOT Factor { jit_value_t value; if(dpas_sem_is_rvalue($2) && @@ -2536,10 +2562,36 @@ Factor dpas_sem_set_error($$); } } - | K_VA_ARG '(' TypeIdentifier ')' { /* TODO */ } - | K_SIZEOF '(' Variable ')' { /* TODO */ } + | K_VA_ARG '(' TypeIdentifier ')' { + /* TODO */ + dpas_error("`va_arg' not yet implemented"); + dpas_sem_set_error($$); + } + | K_SIZEOF '(' Variable ')' { + jit_nuint size; + jit_value_t value; + if(dpas_sem_is_rvalue($3) || dpas_sem_is_type($3)) + { + size = jit_type_get_size(dpas_sem_get_type($3)); + value = jit_value_create_nint_constant + (dpas_current_function(), dpas_type_size_t, + (jit_nint)size); + if(!value) + { + dpas_out_of_memory(); + } + dpas_sem_set_rvalue($$, dpas_type_size_t, value); + } + else + { + dpas_error("invalid operand to `sizeof'"); + dpas_sem_set_error($$); + } + } | '(' K_IF Expression K_THEN Expression K_ELSE Expression ')' { /* TODO */ + dpas_error("ternary `if' not yet implemented"); + dpas_sem_set_error($$); } ; @@ -2643,6 +2695,8 @@ Variable } | Variable '[' ExpressionList ']' { /* TODO */ + dpas_error("array expression not yet implemented"); + dpas_sem_set_error($$); } | Variable '.' Identifier { /* Fetch the effective address of a record field */ diff --git a/dpas/dpas-types.c b/dpas/dpas-types.c index 056daa5..0bc1ae8 100644 --- a/dpas/dpas-types.c +++ b/dpas/dpas-types.c @@ -30,6 +30,8 @@ jit_type_t dpas_type_char; jit_type_t dpas_type_string; jit_type_t dpas_type_address; jit_type_t dpas_type_nil; +jit_type_t dpas_type_size_t; +jit_type_t dpas_type_ptrdiff_t; /* * Register a predefined type within the global scope. @@ -127,6 +129,8 @@ void dpas_init_types(void) dpas_type_address = jit_type_void_ptr; dpas_type_nil = jit_type_create_tagged (jit_type_void_ptr, DPAS_TAG_NIL, 0, 0, 1); + dpas_type_size_t = get_uint_type(sizeof(size_t)); + dpas_type_ptrdiff_t = get_uint_type(sizeof(ptrdiff_t)); /* * Register all of the builtin types. @@ -178,8 +182,8 @@ void dpas_init_types(void) register_type("LongReal", jit_type_nfloat); register_type("Extended", jit_type_nfloat); - register_type("PtrDiffType", get_int_type(sizeof(ptrdiff_t))); - register_type("SizeType", get_uint_type(sizeof(size_t))); + register_type("PtrDiffType", dpas_type_ptrdiff_t); + register_type("SizeType", dpas_type_size_t); register_type("SysInt", jit_type_sys_int); register_type("SysCard", jit_type_sys_uint); diff --git a/dpas/dpas-types.h b/dpas/dpas-types.h index 855d913..95f4fe5 100644 --- a/dpas/dpas-types.h +++ b/dpas/dpas-types.h @@ -49,6 +49,8 @@ extern jit_type_t dpas_type_char; extern jit_type_t dpas_type_string; extern jit_type_t dpas_type_address; extern jit_type_t dpas_type_nil; +extern jit_type_t dpas_type_size_t; +extern jit_type_t dpas_type_ptrdiff_t; /* * Information block for a subrange. -- 2.47.3