Pārlūkot izejas kodu

GDScript: unsafe arithmetic assignment bug fix

Fix: #41051
Thakee Nathees 5 gadi atpakaļ
vecāks
revīzija
38c7d080e8
1 mainītis faili ar 17 papildinājumiem un 15 dzēšanām
  1. 17 15
      modules/gdscript/gdscript_analyzer.cpp

+ 17 - 15
modules/gdscript/gdscript_analyzer.cpp

@@ -1406,23 +1406,25 @@ void GDScriptAnalyzer::reduce_assignment(GDScriptParser::AssignmentNode *p_assig
 			break;
 	}
 
-	bool compatible = true;
-	GDScriptParser::DataType op_type = p_assignment->assigned_value->get_datatype();
-	if (vop != Variant::OP_EQUAL) {
-		op_type = get_operation_type(vop, p_assignment->assignee->get_datatype(), p_assignment->assigned_value->get_datatype(), compatible);
-	}
-
-	if (compatible) {
-		compatible = is_type_compatible(p_assignment->assignee->get_datatype(), op_type, true);
-		if (!compatible) {
-			if (p_assignment->assignee->get_datatype().is_hard_type()) {
-				push_error(vformat(R"(Cannot assign a value of type "%s" to a target of type "%s".)", p_assignment->assigned_value->get_datatype().to_string(), p_assignment->assignee->get_datatype().to_string()), p_assignment->assigned_value);
-			} else {
-				// TODO: Warning in this case.
+	if (!p_assignment->assignee->get_datatype().is_variant() && !p_assignment->assigned_value->get_datatype().is_variant()) {
+		bool compatible = true;
+		GDScriptParser::DataType op_type = p_assignment->assigned_value->get_datatype();
+		if (vop != Variant::OP_EQUAL) {
+			op_type = get_operation_type(vop, p_assignment->assignee->get_datatype(), p_assignment->assigned_value->get_datatype(), compatible);
+		}
+
+		if (compatible) {
+			compatible = is_type_compatible(p_assignment->assignee->get_datatype(), op_type, true);
+			if (!compatible) {
+				if (p_assignment->assignee->get_datatype().is_hard_type()) {
+					push_error(vformat(R"(Cannot assign a value of type "%s" to a target of type "%s".)", p_assignment->assigned_value->get_datatype().to_string(), p_assignment->assignee->get_datatype().to_string()), p_assignment->assigned_value);
+				} else {
+					// TODO: Warning in this case.
+				}
 			}
+		} else {
+			push_error(vformat(R"(Invalid operands "%s" and "%s" for assignment operator.)", p_assignment->assignee->get_datatype().to_string(), p_assignment->assigned_value->get_datatype().to_string()), p_assignment);
 		}
-	} else {
-		push_error(vformat(R"(Invalid operands "%s" and "%s" for assignment operator.)", p_assignment->assignee->get_datatype().to_string(), p_assignment->assigned_value->get_datatype().to_string()), p_assignment);
 	}
 
 	if (p_assignment->assignee->get_datatype().has_no_type() || p_assignment->assigned_value->get_datatype().is_variant()) {