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