diff --git a/src/language.yacc b/src/language.yacc index aa30623fec4763d37388bb1b4381d87d7b31fab2..4f1b8ab92a2caa90936cc1f985d9993926113a90 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 b72901dd6fbb9c16aa9d7d9d0f4f8f8e00718b7a..e95a18fe5980dff2fa01eaf452de337db866f5d4 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 e07323709522fa946099635f1071cac050a2caeb..113790f2b11aff5a604de62f992e8b2058efab6b 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 0f029d7071d9f28fe768fb10f35c90977e8c2d6e..e7ed267b3196a55c9b74db810458818734fb9634 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 768488a8a2e4b5bf96bce4b1d77fc47432e5202e..45fc459819d8860243cccf3b1b2183b1610cbddc 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: