stage3/narrow_candidate_datatypes.cc
changeset 666 8ba9ec4bae50
parent 661 f537c3315f83
child 673 90d7636e3c39
equal deleted inserted replaced
665:50fca2d3abd9 666:8ba9ec4bae50
   479 /* subscript_list ',' subscript */
   479 /* subscript_list ',' subscript */
   480 // SYM_LIST(subscript_list_c)
   480 // SYM_LIST(subscript_list_c)
   481 void *narrow_candidate_datatypes_c::visit(subscript_list_c *symbol) {
   481 void *narrow_candidate_datatypes_c::visit(subscript_list_c *symbol) {
   482 	for (int i = 0; i < symbol->n; i++) {
   482 	for (int i = 0; i < symbol->n; i++) {
   483 		for (unsigned int k = 0; k < symbol->elements[i]->candidate_datatypes.size(); k++) {
   483 		for (unsigned int k = 0; k < symbol->elements[i]->candidate_datatypes.size(); k++) {
   484 			if (is_ANY_INT_type(symbol->elements[i]->candidate_datatypes[k]))
   484 			if (get_datatype_info_c::is_ANY_INT(symbol->elements[i]->candidate_datatypes[k]))
   485 				symbol->elements[i]->datatype = symbol->elements[i]->candidate_datatypes[k];
   485 				symbol->elements[i]->datatype = symbol->elements[i]->candidate_datatypes[k];
   486 		}
   486 		}
   487 		symbol->elements[i]->accept(*this);
   487 		symbol->elements[i]->accept(*this);
   488 	}
   488 	}
   489 	return NULL;  
   489 	return NULL;  
  1008 
  1008 
  1009 void *narrow_candidate_datatypes_c::narrow_conditional_flow_control_IL_instruction(symbol_c *symbol) {
  1009 void *narrow_candidate_datatypes_c::narrow_conditional_flow_control_IL_instruction(symbol_c *symbol) {
  1010 	/* if the next IL instructions needs us to provide a datatype other than a bool, 
  1010 	/* if the next IL instructions needs us to provide a datatype other than a bool, 
  1011 	 * then we have an internal compiler error - most likely in fill_candidate_datatypes_c 
  1011 	 * then we have an internal compiler error - most likely in fill_candidate_datatypes_c 
  1012 	 */
  1012 	 */
  1013 	if ((NULL != symbol->datatype) && (!is_ANY_BOOL_compatible(symbol->datatype))) ERROR;
  1013 	if ((NULL != symbol->datatype) && (!get_datatype_info_c::is_BOOL_compatible(symbol->datatype))) ERROR;
  1014 	if (symbol->candidate_datatypes.size() > 1) ERROR;
  1014 	if (symbol->candidate_datatypes.size() > 1) ERROR;
  1015 
  1015 
  1016 	/* NOTE: If there is no IL instruction following this CALC, CALCN, JMPC, JMPC, ..., instruction,
  1016 	/* NOTE: If there is no IL instruction following this CALC, CALCN, JMPC, JMPC, ..., instruction,
  1017 	 *       we must still provide a bool_type_name_c datatype (if possible, i.e. if it exists in the candidate datatype list).
  1017 	 *       we must still provide a bool_type_name_c datatype (if possible, i.e. if it exists in the candidate datatype list).
  1018 	 *       If it is not possible, we set it to NULL
  1018 	 *       If it is not possible, we set it to NULL
  1019 	 */
  1019 	 */
  1020 	if (symbol->candidate_datatypes.size() == 0)    symbol->datatype = NULL;
  1020 	if (symbol->candidate_datatypes.size() == 0)    symbol->datatype = NULL;
  1021 	else    symbol->datatype = symbol->candidate_datatypes[0]; /* i.e. a bool_type_name_c! */
  1021 	else    symbol->datatype = symbol->candidate_datatypes[0]; /* i.e. a bool_type_name_c! */
  1022 	if ((NULL != symbol->datatype) && (!is_ANY_BOOL_compatible(symbol->datatype))) ERROR;
  1022 	if ((NULL != symbol->datatype) && (!get_datatype_info_c::is_BOOL_compatible(symbol->datatype))) ERROR;
  1023 
  1023 
  1024 	/* set the required datatype of the previous IL instruction, i.e. a bool_type_name_c! */
  1024 	/* set the required datatype of the previous IL instruction, i.e. a bool_type_name_c! */
  1025 	set_datatype_in_prev_il_instructions(symbol->datatype, fake_prev_il_instruction);
  1025 	set_datatype_in_prev_il_instructions(symbol->datatype, fake_prev_il_instruction);
  1026 	return NULL;
  1026 	return NULL;
  1027 }
  1027 }
  1077 			r_type = r_expr->candidate_datatypes[j];
  1077 			r_type = r_expr->candidate_datatypes[j];
  1078 			if        (is_widening_compatible(widen_table, l_type, r_type, symbol->datatype, deprecated_operation)) {
  1078 			if        (is_widening_compatible(widen_table, l_type, r_type, symbol->datatype, deprecated_operation)) {
  1079 				l_expr->datatype = l_type;
  1079 				l_expr->datatype = l_type;
  1080 				r_expr->datatype = r_type;
  1080 				r_expr->datatype = r_type;
  1081 				count ++;
  1081 				count ++;
  1082 			} else if ((l_type == r_type) && search_base_type.type_is_enumerated(l_type) && is_ANY_BOOL_compatible(symbol->datatype)) {
  1082 			} else if ((l_type == r_type) && search_base_type.type_is_enumerated(l_type) && get_datatype_info_c::is_BOOL_compatible(symbol->datatype)) {
  1083 				if (NULL != deprecated_operation)  *deprecated_operation = false;
  1083 				if (NULL != deprecated_operation)  *deprecated_operation = false;
  1084 				l_expr->datatype = l_type;
  1084 				l_expr->datatype = l_type;
  1085 				r_expr->datatype = r_type;
  1085 				r_expr->datatype = r_type;
  1086 				count ++;
  1086 				count ++;
  1087 			}
  1087 			}
  1203 /* B 3.2.3 Selection Statements */
  1203 /* B 3.2.3 Selection Statements */
  1204 /********************************/
  1204 /********************************/
  1205 
  1205 
  1206 void *narrow_candidate_datatypes_c::visit(if_statement_c *symbol) {
  1206 void *narrow_candidate_datatypes_c::visit(if_statement_c *symbol) {
  1207 	for(unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) {
  1207 	for(unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) {
  1208 		if (is_ANY_BOOL_compatible(symbol->expression->candidate_datatypes[i]))
  1208 		if (get_datatype_info_c::is_BOOL_compatible(symbol->expression->candidate_datatypes[i]))
  1209 			symbol->expression->datatype = symbol->expression->candidate_datatypes[i];
  1209 			symbol->expression->datatype = symbol->expression->candidate_datatypes[i];
  1210 	}
  1210 	}
  1211 	symbol->expression->accept(*this);
  1211 	symbol->expression->accept(*this);
  1212 	if (NULL != symbol->statement_list)
  1212 	if (NULL != symbol->statement_list)
  1213 		symbol->statement_list->accept(*this);
  1213 		symbol->statement_list->accept(*this);
  1219 }
  1219 }
  1220 
  1220 
  1221 
  1221 
  1222 void *narrow_candidate_datatypes_c::visit(elseif_statement_c *symbol) {
  1222 void *narrow_candidate_datatypes_c::visit(elseif_statement_c *symbol) {
  1223 	for (unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) {
  1223 	for (unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) {
  1224 		if (is_ANY_BOOL_compatible(symbol->expression->candidate_datatypes[i]))
  1224 		if (get_datatype_info_c::is_BOOL_compatible(symbol->expression->candidate_datatypes[i]))
  1225 			symbol->expression->datatype = symbol->expression->candidate_datatypes[i];
  1225 			symbol->expression->datatype = symbol->expression->candidate_datatypes[i];
  1226 	}
  1226 	}
  1227 	symbol->expression->accept(*this);
  1227 	symbol->expression->accept(*this);
  1228 	if (NULL != symbol->statement_list)
  1228 	if (NULL != symbol->statement_list)
  1229 		symbol->statement_list->accept(*this);
  1229 		symbol->statement_list->accept(*this);
  1232 
  1232 
  1233 /* CASE expression OF case_element_list ELSE statement_list END_CASE */
  1233 /* CASE expression OF case_element_list ELSE statement_list END_CASE */
  1234 // SYM_REF3(case_statement_c, expression, case_element_list, statement_list)
  1234 // SYM_REF3(case_statement_c, expression, case_element_list, statement_list)
  1235 void *narrow_candidate_datatypes_c::visit(case_statement_c *symbol) {
  1235 void *narrow_candidate_datatypes_c::visit(case_statement_c *symbol) {
  1236 	for (unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) {
  1236 	for (unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) {
  1237 		if ((is_ANY_INT_type(symbol->expression->candidate_datatypes[i]))
  1237 		if ((get_datatype_info_c::is_ANY_INT(symbol->expression->candidate_datatypes[i]))
  1238 				 || (search_base_type.type_is_enumerated(symbol->expression->candidate_datatypes[i])))
  1238 				 || (search_base_type.type_is_enumerated(symbol->expression->candidate_datatypes[i])))
  1239 			symbol->expression->datatype = symbol->expression->candidate_datatypes[i];
  1239 			symbol->expression->datatype = symbol->expression->candidate_datatypes[i];
  1240 	}
  1240 	}
  1241 	symbol->expression->accept(*this);
  1241 	symbol->expression->accept(*this);
  1242 	if (NULL != symbol->statement_list)
  1242 	if (NULL != symbol->statement_list)
  1285 /* B 3.2.4 Iteration Statements */
  1285 /* B 3.2.4 Iteration Statements */
  1286 /********************************/
  1286 /********************************/
  1287 void *narrow_candidate_datatypes_c::visit(for_statement_c *symbol) {
  1287 void *narrow_candidate_datatypes_c::visit(for_statement_c *symbol) {
  1288 	/* Control variable */
  1288 	/* Control variable */
  1289 	for(unsigned int i = 0; i < symbol->control_variable->candidate_datatypes.size(); i++) {
  1289 	for(unsigned int i = 0; i < symbol->control_variable->candidate_datatypes.size(); i++) {
  1290 		if (is_ANY_INT_type(symbol->control_variable->candidate_datatypes[i])) {
  1290 		if (get_datatype_info_c::is_ANY_INT(symbol->control_variable->candidate_datatypes[i])) {
  1291 			symbol->control_variable->datatype = symbol->control_variable->candidate_datatypes[i];
  1291 			symbol->control_variable->datatype = symbol->control_variable->candidate_datatypes[i];
  1292 		}
  1292 		}
  1293 	}
  1293 	}
  1294 	symbol->control_variable->accept(*this);
  1294 	symbol->control_variable->accept(*this);
  1295 	/* BEG expression */
  1295 	/* BEG expression */
  1296 	for(unsigned int i = 0; i < symbol->beg_expression->candidate_datatypes.size(); i++) {
  1296 	for(unsigned int i = 0; i < symbol->beg_expression->candidate_datatypes.size(); i++) {
  1297 		if (is_type_equal(symbol->control_variable->datatype,symbol->beg_expression->candidate_datatypes[i]) &&
  1297 		if (is_type_equal(symbol->control_variable->datatype,symbol->beg_expression->candidate_datatypes[i]) &&
  1298 				is_ANY_INT_type(symbol->beg_expression->candidate_datatypes[i])) {
  1298 				get_datatype_info_c::is_ANY_INT(symbol->beg_expression->candidate_datatypes[i])) {
  1299 			symbol->beg_expression->datatype = symbol->beg_expression->candidate_datatypes[i];
  1299 			symbol->beg_expression->datatype = symbol->beg_expression->candidate_datatypes[i];
  1300 		}
  1300 		}
  1301 	}
  1301 	}
  1302 	symbol->beg_expression->accept(*this);
  1302 	symbol->beg_expression->accept(*this);
  1303 	/* END expression */
  1303 	/* END expression */
  1304 	for(unsigned int i = 0; i < symbol->end_expression->candidate_datatypes.size(); i++) {
  1304 	for(unsigned int i = 0; i < symbol->end_expression->candidate_datatypes.size(); i++) {
  1305 		if (is_type_equal(symbol->control_variable->datatype,symbol->end_expression->candidate_datatypes[i]) &&
  1305 		if (is_type_equal(symbol->control_variable->datatype,symbol->end_expression->candidate_datatypes[i]) &&
  1306 				is_ANY_INT_type(symbol->end_expression->candidate_datatypes[i])) {
  1306 				get_datatype_info_c::is_ANY_INT(symbol->end_expression->candidate_datatypes[i])) {
  1307 			symbol->end_expression->datatype = symbol->end_expression->candidate_datatypes[i];
  1307 			symbol->end_expression->datatype = symbol->end_expression->candidate_datatypes[i];
  1308 		}
  1308 		}
  1309 	}
  1309 	}
  1310 	symbol->end_expression->accept(*this);
  1310 	symbol->end_expression->accept(*this);
  1311 	/* BY expression */
  1311 	/* BY expression */
  1312 	if (NULL != symbol->by_expression) {
  1312 	if (NULL != symbol->by_expression) {
  1313 		for(unsigned int i = 0; i < symbol->by_expression->candidate_datatypes.size(); i++) {
  1313 		for(unsigned int i = 0; i < symbol->by_expression->candidate_datatypes.size(); i++) {
  1314 			if (is_type_equal(symbol->control_variable->datatype,symbol->by_expression->candidate_datatypes[i]) &&
  1314 			if (is_type_equal(symbol->control_variable->datatype,symbol->by_expression->candidate_datatypes[i]) &&
  1315 					is_ANY_INT_type(symbol->by_expression->candidate_datatypes[i])) {
  1315 					get_datatype_info_c::is_ANY_INT(symbol->by_expression->candidate_datatypes[i])) {
  1316 				symbol->by_expression->datatype = symbol->by_expression->candidate_datatypes[i];
  1316 				symbol->by_expression->datatype = symbol->by_expression->candidate_datatypes[i];
  1317 			}
  1317 			}
  1318 		}
  1318 		}
  1319 		symbol->by_expression->accept(*this);
  1319 		symbol->by_expression->accept(*this);
  1320 	}
  1320 	}
  1323 	return NULL;
  1323 	return NULL;
  1324 }
  1324 }
  1325 
  1325 
  1326 void *narrow_candidate_datatypes_c::visit(while_statement_c *symbol) {
  1326 void *narrow_candidate_datatypes_c::visit(while_statement_c *symbol) {
  1327 	for (unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) {
  1327 	for (unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) {
  1328 		if(is_BOOL_type(symbol->expression->candidate_datatypes[i]))
  1328 		if(get_datatype_info_c::is_BOOL(symbol->expression->candidate_datatypes[i]))
  1329 			symbol->expression->datatype = symbol->expression->candidate_datatypes[i];
  1329 			symbol->expression->datatype = symbol->expression->candidate_datatypes[i];
  1330 	}
  1330 	}
  1331 	symbol->expression->accept(*this);
  1331 	symbol->expression->accept(*this);
  1332 	if (NULL != symbol->statement_list)
  1332 	if (NULL != symbol->statement_list)
  1333 		symbol->statement_list->accept(*this);
  1333 		symbol->statement_list->accept(*this);
  1334 	return NULL;
  1334 	return NULL;
  1335 }
  1335 }
  1336 
  1336 
  1337 void *narrow_candidate_datatypes_c::visit(repeat_statement_c *symbol) {
  1337 void *narrow_candidate_datatypes_c::visit(repeat_statement_c *symbol) {
  1338 	for (unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) {
  1338 	for (unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) {
  1339 		if(is_BOOL_type(symbol->expression->candidate_datatypes[i]))
  1339 		if(get_datatype_info_c::is_BOOL(symbol->expression->candidate_datatypes[i]))
  1340 			symbol->expression->datatype = symbol->expression->candidate_datatypes[i];
  1340 			symbol->expression->datatype = symbol->expression->candidate_datatypes[i];
  1341 	}
  1341 	}
  1342 	symbol->expression->accept(*this);
  1342 	symbol->expression->accept(*this);
  1343 	if (NULL != symbol->statement_list)
  1343 	if (NULL != symbol->statement_list)
  1344 		symbol->statement_list->accept(*this);
  1344 		symbol->statement_list->accept(*this);