Browse Source

Merge pull request #35076 from vnen/gdscript-type-match-assign

Type match on assignment only if operators have type
Rémi Verschelde 5 years ago
parent
commit
e32d232053
1 changed files with 2 additions and 8 deletions
  1. 2 8
      modules/gdscript/gdscript_parser.cpp

+ 2 - 8
modules/gdscript/gdscript_parser.cpp

@@ -8210,12 +8210,10 @@ void GDScriptParser::_check_block_types(BlockNode *p_block) {
 							_add_warning(GDScriptWarning::FUNCTION_MAY_YIELD, op->line, _find_function_name(static_cast<OperatorNode *>(op->arguments[1])));
 							_add_warning(GDScriptWarning::FUNCTION_MAY_YIELD, op->line, _find_function_name(static_cast<OperatorNode *>(op->arguments[1])));
 						}
 						}
 
 
-						bool type_match = check_types;
 #endif // DEBUG_ENABLED
 #endif // DEBUG_ENABLED
+						bool type_match = lh_type.has_type && rh_type.has_type;
 						if (check_types && !_is_type_compatible(lh_type, rh_type)) {
 						if (check_types && !_is_type_compatible(lh_type, rh_type)) {
-#ifdef DEBUG_ENABLED
 							type_match = false;
 							type_match = false;
-#endif // DEBUG_ENABLED
 
 
 							// Try supertype test
 							// Try supertype test
 							if (_is_type_compatible(rh_type, lh_type)) {
 							if (_is_type_compatible(rh_type, lh_type)) {
@@ -8247,9 +8245,7 @@ void GDScriptParser::_check_block_types(BlockNode *p_block) {
 
 
 									op->arguments.write[1] = convert_call;
 									op->arguments.write[1] = convert_call;
 
 
-#ifdef DEBUG_ENABLED
 									type_match = true; // Since we are converting, the type is matching
 									type_match = true; // Since we are converting, the type is matching
-#endif // DEBUG_ENABLED
 								}
 								}
 #ifdef DEBUG_ENABLED
 #ifdef DEBUG_ENABLED
 								if (lh_type.builtin_type == Variant::INT && rh_type.builtin_type == Variant::REAL) {
 								if (lh_type.builtin_type == Variant::INT && rh_type.builtin_type == Variant::REAL) {
@@ -8262,10 +8258,8 @@ void GDScriptParser::_check_block_types(BlockNode *p_block) {
 						if (!rh_type.has_type && (op->op != OperatorNode::OP_ASSIGN || lh_type.has_type || op->arguments[0]->type == Node::TYPE_OPERATOR)) {
 						if (!rh_type.has_type && (op->op != OperatorNode::OP_ASSIGN || lh_type.has_type || op->arguments[0]->type == Node::TYPE_OPERATOR)) {
 							_mark_line_as_unsafe(op->line);
 							_mark_line_as_unsafe(op->line);
 						}
 						}
-						op->datatype.has_type = type_match;
-#else
-						op->datatype.has_type = false;
 #endif // DEBUG_ENABLED
 #endif // DEBUG_ENABLED
+						op->datatype.has_type = type_match;
 					} break;
 					} break;
 					case OperatorNode::OP_CALL:
 					case OperatorNode::OP_CALL:
 					case OperatorNode::OP_PARENT_CALL: {
 					case OperatorNode::OP_PARENT_CALL: {