stage3/narrow_candidate_datatypes.cc
changeset 718 a9f8cc778444
parent 693 51a2fa6441b9
child 726 9b61eb4f00dc
equal deleted inserted replaced
717:44f74fad2cc0 718:a9f8cc778444
   407 }
   407 }
   408 
   408 
   409 
   409 
   410 /* a helper function... */
   410 /* a helper function... */
   411 symbol_c *narrow_candidate_datatypes_c::base_type(symbol_c *symbol) {
   411 symbol_c *narrow_candidate_datatypes_c::base_type(symbol_c *symbol) {
   412 	/* NOTE: symbol == NULL is valid. It will occur when, for e.g., an undefined/undeclared symbolic_variable is used
   412 	/* NOTE: symbol == NULL is valid. It will occur when, for e.g., an undefined/undeclared symbolic_variable is used in the code. */
   413 	 *       in the code.
       
   414 	 */
       
   415 	if (symbol == NULL) return NULL;
   413 	if (symbol == NULL) return NULL;
   416 	return (symbol_c *)symbol->accept(search_base_type);	
   414 	return search_base_type_c::get_basetype_decl(symbol);
   417 }
   415 }
   418 
   416 
   419 /*********************/
   417 /*********************/
   420 /* B 1.2 - Constants */
   418 /* B 1.2 - Constants */
   421 /*********************/
   419 /*********************/
  1080  *  In the above situation it is a legal operation when (l_expr.datatype == r_expr.datatype) && is_enumerated(r/l_expr.datatype) && is_bool(symbol.datatype)
  1078  *  In the above situation it is a legal operation when (l_expr.datatype == r_expr.datatype) && is_enumerated(r/l_expr.datatype) && is_bool(symbol.datatype)
  1081  */
  1079  */
  1082 void *narrow_candidate_datatypes_c::narrow_binary_expression(const struct widen_entry widen_table[], symbol_c *symbol, symbol_c *l_expr, symbol_c *r_expr, bool *deprecated_operation, bool allow_enums) {
  1080 void *narrow_candidate_datatypes_c::narrow_binary_expression(const struct widen_entry widen_table[], symbol_c *symbol, symbol_c *l_expr, symbol_c *r_expr, bool *deprecated_operation, bool allow_enums) {
  1083 	symbol_c *l_type, *r_type;
  1081 	symbol_c *l_type, *r_type;
  1084 	int count = 0;
  1082 	int count = 0;
  1085 	search_base_type_c search_base_type;
       
  1086 
  1083 
  1087 	if (NULL != deprecated_operation)
  1084 	if (NULL != deprecated_operation)
  1088 		*deprecated_operation = false;
  1085 		*deprecated_operation = false;
  1089 
  1086 
  1090 	for(unsigned int i = 0; i < l_expr->candidate_datatypes.size(); i++) {
  1087 	for(unsigned int i = 0; i < l_expr->candidate_datatypes.size(); i++) {
  1094 			r_type = r_expr->candidate_datatypes[j];
  1091 			r_type = r_expr->candidate_datatypes[j];
  1095 			if        (is_widening_compatible(widen_table, l_type, r_type, symbol->datatype, deprecated_operation)) {
  1092 			if        (is_widening_compatible(widen_table, l_type, r_type, symbol->datatype, deprecated_operation)) {
  1096 				l_expr->datatype = l_type;
  1093 				l_expr->datatype = l_type;
  1097 				r_expr->datatype = r_type;
  1094 				r_expr->datatype = r_type;
  1098 				count ++;
  1095 				count ++;
  1099 			} else if ((l_type == r_type) && search_base_type.type_is_enumerated(l_type) && get_datatype_info_c::is_BOOL_compatible(symbol->datatype)) {
  1096 			} else if ((l_type == r_type) && search_base_type_c::type_is_enumerated(l_type) && get_datatype_info_c::is_BOOL_compatible(symbol->datatype)) {
  1100 				if (NULL != deprecated_operation)  *deprecated_operation = false;
  1097 				if (NULL != deprecated_operation)  *deprecated_operation = false;
  1101 				l_expr->datatype = l_type;
  1098 				l_expr->datatype = l_type;
  1102 				r_expr->datatype = r_type;
  1099 				r_expr->datatype = r_type;
  1103 				count ++;
  1100 				count ++;
  1104 			}
  1101 			}
  1250 /* CASE expression OF case_element_list ELSE statement_list END_CASE */
  1247 /* CASE expression OF case_element_list ELSE statement_list END_CASE */
  1251 // SYM_REF3(case_statement_c, expression, case_element_list, statement_list)
  1248 // SYM_REF3(case_statement_c, expression, case_element_list, statement_list)
  1252 void *narrow_candidate_datatypes_c::visit(case_statement_c *symbol) {
  1249 void *narrow_candidate_datatypes_c::visit(case_statement_c *symbol) {
  1253 	for (unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) {
  1250 	for (unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) {
  1254 		if ((get_datatype_info_c::is_ANY_INT(symbol->expression->candidate_datatypes[i]))
  1251 		if ((get_datatype_info_c::is_ANY_INT(symbol->expression->candidate_datatypes[i]))
  1255 				 || (search_base_type.type_is_enumerated(symbol->expression->candidate_datatypes[i])))
  1252 				 || (search_base_type_c::type_is_enumerated(symbol->expression->candidate_datatypes[i])))
  1256 			symbol->expression->datatype = symbol->expression->candidate_datatypes[i];
  1253 			symbol->expression->datatype = symbol->expression->candidate_datatypes[i];
  1257 	}
  1254 	}
  1258 	symbol->expression->accept(*this);
  1255 	symbol->expression->accept(*this);
  1259 	if (NULL != symbol->statement_list)
  1256 	if (NULL != symbol->statement_list)
  1260 		symbol->statement_list->accept(*this);
  1257 		symbol->statement_list->accept(*this);