absyntax_utils/get_datatype_info.cc
changeset 921 d228aaa4d616
parent 919 8da635655f37
child 922 1ba7a814098d
--- a/absyntax_utils/get_datatype_info.cc	Wed Aug 06 10:43:15 2014 +0100
+++ b/absyntax_utils/get_datatype_info.cc	Fri Aug 08 10:26:52 2014 +0100
@@ -238,20 +238,27 @@
 }
 
 
+/* Returns true if both datatypes are identicial.
+ * WARING: When handling REF_TO datatypes, it may return 'true' even though
+ *         the datatypes are not identicial. This occurs when at least one of the
+ *         datatypes if a ref_to_any_c, which os equivalent to a (void *), and the
+ *         other datatype is any REF_TO datatype (including a ref_to_any_c).
+ */
 bool get_datatype_info_c::is_type_equal(symbol_c *first_type, symbol_c *second_type) {
-  if ((NULL == first_type) || (NULL == second_type))                 {return false;}
-  if (typeid(* first_type) == typeid(invalid_type_name_c))           {return false;}
-  if (typeid(*second_type) == typeid(invalid_type_name_c))           {return false;}
-    
+  if (!is_type_valid( first_type))                                   {return false;}
+  if (!is_type_valid(second_type))                                   {return false;}
+
+  /* GENERIC DATATYPES */
+  /* For the moment, we only support the ANY generic datatype! */
+  if ((is_ANY_generic_type( first_type)) ||
+      (is_ANY_generic_type(second_type)))                            {return true;}
+      
   /* ANY_ELEMENTARY */
   if ((is_ANY_ELEMENTARY(first_type)) &&
       (typeid(*first_type) == typeid(*second_type)))                 {return true;}
 
   /* ANY_DERIVED */
   if (is_ref_to(first_type) && is_ref_to(second_type)) {
-    /* if either of them is the constant 'NULL' then we consider them 'equal', as NULL is compatible to a REF_TO any datatype! */
-    if (typeid(* first_type) == typeid(ref_value_null_literal_c))    {return true;}  
-    if (typeid(*second_type) == typeid(ref_value_null_literal_c))    {return true;}
     return is_type_equal(search_base_type_c::get_basetype_decl(get_ref_to(first_type )),
                          search_base_type_c::get_basetype_decl(get_ref_to(second_type)));
   }
@@ -260,7 +267,6 @@
 }
 
 
-
 bool get_datatype_info_c::is_type_valid(symbol_c *type) {
   if (NULL == type)                                                  {return false;}
   if (typeid(*type) == typeid(invalid_type_name_c))                  {return false;}
@@ -299,7 +305,6 @@
   if (typeid(*type_decl) == typeid(ref_type_decl_c))                           {return true;}   /* identifier ':' ref_spec_init */
   if (typeid(*type_decl) == typeid(ref_spec_init_c))                           {return true;}   /* ref_spec [ ASSIGN ref_initialization ]; */
   if (typeid(*type_decl) == typeid(ref_spec_c))                                {return true;}   /* REF_TO (non_generic_type_name | function_block_type_name) */
-  if (typeid(*type_decl) == typeid(ref_value_null_literal_c))                  {return true;}   /* REF_TO (non_generic_type_name | function_block_type_name) */
   return false;
 }
 
@@ -404,6 +409,12 @@
 
 
 
+bool get_datatype_info_c::is_ANY_generic_type(symbol_c *type_symbol) {
+  symbol_c *type_decl = search_base_type_c::get_basetype_decl(type_symbol);
+  if (NULL == type_decl)                                             {return false;}  
+  if (typeid(*type_decl) == typeid(generic_type_any_c))              {return true;}   /*  The ANY keyword! */
+  return false;
+}
 
 
 bool get_datatype_info_c::is_ANY_ELEMENTARY(symbol_c *type_symbol) {