From 38f9314673265d947f232c0fde9fb2a5ebd26069 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?= <grubba@grubba.org> Date: Sat, 3 May 2014 11:25:25 +0200 Subject: [PATCH] Compiler: Improved type checking for program references. Inherits and type declarations now complain about use of deprecated symbols. --- src/language.yacc | 10 ++++++++++ src/las.c | 10 ++++++++++ src/pike_types.c | 13 +++++++++++++ src/pike_types.h | 2 ++ src/program.c | 10 ++++++++++ 5 files changed, 45 insertions(+) diff --git a/src/language.yacc b/src/language.yacc index aa30623fec..4f1b8ab92a 100644 --- a/src/language.yacc +++ b/src/language.yacc @@ -1375,6 +1375,16 @@ basic_type: identifier_type: idents { + fix_type_field($1); + + if (!pike_types_le($1->type, typeable_type_string) && + (THIS_COMPILATION->lex.pragmas & ID_STRICT_TYPES)) { + yytype_report(REPORT_WARNING, + $1->current_file, $1->line_number, typeable_type_string, + $1->current_file, $1->line_number, $1->type, + 0, "Invalid type."); + } + resolv_constant($1); if (TYPEOF(Pike_sp[-1]) == T_TYPE) { diff --git a/src/las.c b/src/las.c index b72901dd6f..e95a18fe59 100644 --- a/src/las.c +++ b/src/las.c @@ -1614,6 +1614,16 @@ void resolv_program(node *n) { check_tree(n,0); + fix_type_field(n); + + if (!pike_types_le(n->type, inheritable_type_string) && + (THIS_COMPILATION->lex.pragmas & ID_STRICT_TYPES)) { + yytype_report(REPORT_WARNING, + n->current_file, n->line_number, inheritable_type_string, + n->current_file, n->line_number, n->type, + 0, "Not a valid object type.\n"); + } + resolv_class(n); switch(TYPEOF(Pike_sp[-1])) { diff --git a/src/pike_types.c b/src/pike_types.c index e073237095..113790f2b1 100644 --- a/src/pike_types.c +++ b/src/pike_types.c @@ -100,6 +100,8 @@ PMOD_EXPORT struct pike_type *type_type_string; PMOD_EXPORT struct pike_type *mixed_type_string; PMOD_EXPORT struct pike_type *void_type_string; PMOD_EXPORT struct pike_type *zero_type_string; +PMOD_EXPORT struct pike_type *inheritable_type_string; +PMOD_EXPORT struct pike_type *typeable_type_string; PMOD_EXPORT struct pike_type *enumerable_type_string; PMOD_EXPORT struct pike_type *any_type_string; PMOD_EXPORT struct pike_type *weak_type_string; /* array|mapping|multiset|function */ @@ -8701,6 +8703,13 @@ void init_types(void) type_type_string = CONSTTYPE(tType(tMix)); void_type_string = CONSTTYPE(tVoid); zero_type_string = CONSTTYPE(tZero); + inheritable_type_string = CONSTTYPE(tOr3(tPrg(tObj), tObj, + tFuncV(tNone, tOr(tVoid, tMix), + tObj))); + typeable_type_string = CONSTTYPE(tOr4(tPrg(tObj), tObj, + tFuncV(tNone, tOr(tVoid, tMix), + tObj), + tType(tMix))); enumerable_type_string = CONSTTYPE(tOr3(tString,tInt,tFloat)); any_type_string = CONSTTYPE(tOr(tVoid,tMix)); weak_type_string = CONSTTYPE(tOr4(tArray,tMultiset,tMapping, @@ -8755,6 +8764,10 @@ void cleanup_pike_types(void) void_type_string = NULL; free_type(zero_type_string); zero_type_string = NULL; + free_type(inheritable_type_string); + inheritable_type_string = NULL; + free_type(typeable_type_string); + typeable_type_string = NULL; free_type(enumerable_type_string); enumerable_type_string = NULL; free_type(any_type_string); diff --git a/src/pike_types.h b/src/pike_types.h index 0f029d7071..e7ed267b31 100644 --- a/src/pike_types.h +++ b/src/pike_types.h @@ -136,6 +136,8 @@ PMOD_EXPORT extern struct pike_type *type_type_string; PMOD_EXPORT extern struct pike_type *mixed_type_string; PMOD_EXPORT extern struct pike_type *void_type_string; PMOD_EXPORT extern struct pike_type *zero_type_string; +PMOD_EXPORT extern struct pike_type *inheritable_type_string; +PMOD_EXPORT extern struct pike_type *typeable_type_string; PMOD_EXPORT extern struct pike_type *enumerable_type_string; PMOD_EXPORT extern struct pike_type *any_type_string; PMOD_EXPORT extern struct pike_type *weak_type_string; diff --git a/src/program.c b/src/program.c index 768488a8a2..45fc459819 100644 --- a/src/program.c +++ b/src/program.c @@ -5031,6 +5031,16 @@ void compiler_do_inherit(node *n, return; } + fix_type_field(n); + + if (!pike_types_le(n->type, inheritable_type_string) && + (THIS_COMPILATION->lex.pragmas & ID_STRICT_TYPES)) { + yytype_report(REPORT_WARNING, + n->current_file, n->line_number, inheritable_type_string, + n->current_file, n->line_number, n->type, + 0, "Program required for inherit.\n"); + } + switch(n->token) { case F_IDENTIFIER: -- GitLab