Browse Source

Merge pull request #75885 from AThousandShips/compound_fix

[GDScript] Fix incorrect compound assignment
Rémi Verschelde 2 years ago
parent
commit
45cd5dcad3

+ 1 - 11
modules/gdscript/gdscript_compiler.cpp

@@ -1165,18 +1165,8 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code
 				bool has_operation = assignment->operation != GDScriptParser::AssignmentNode::OP_NONE;
 				bool has_operation = assignment->operation != GDScriptParser::AssignmentNode::OP_NONE;
 				if (has_operation) {
 				if (has_operation) {
 					// Perform operation.
 					// Perform operation.
-					GDScriptCodeGenerator::Address og_value = _parse_expression(codegen, r_error, assignment->assignee);
-
-					if (!has_setter && !assignment->use_conversion_assign) {
-						// If there's nothing special about the assignment, perform the assignment as part of the operator
-						gen->write_binary_operator(target, assignment->variant_op, og_value, assigned_value);
-						if (assigned_value.mode == GDScriptCodeGenerator::Address::TEMPORARY) {
-							gen->pop_temporary(); // Pop assigned value if not done before.
-						}
-						return GDScriptCodeGenerator::Address();
-					}
-
 					GDScriptCodeGenerator::Address op_result = codegen.add_temporary(_gdtype_from_datatype(assignment->get_datatype(), codegen.script));
 					GDScriptCodeGenerator::Address op_result = codegen.add_temporary(_gdtype_from_datatype(assignment->get_datatype(), codegen.script));
+					GDScriptCodeGenerator::Address og_value = _parse_expression(codegen, r_error, assignment->assignee);
 					gen->write_binary_operator(op_result, assignment->variant_op, og_value, assigned_value);
 					gen->write_binary_operator(op_result, assignment->variant_op, og_value, assigned_value);
 					to_assign = op_result;
 					to_assign = op_result;
 
 

+ 31 - 0
modules/gdscript/tests/scripts/runtime/features/assign_operator.gd

@@ -0,0 +1,31 @@
+# https://github.com/godotengine/godot/issues/75832
+
+@warning_ignore("narrowing_conversion")
+func test():
+	var hf := 2.0
+	var sf = 2.0
+
+	var i := 2
+	i *= hf
+	i *= sf
+	i *= 2.0
+	print(i)
+	var v2 := Vector2i(1, 2)
+	v2 *= hf
+	v2 *= sf
+	v2 *= 2.0
+	print(v2)
+	var v3 := Vector3i(1, 2, 3)
+	v3 *= hf
+	v3 *= sf
+	v3 *= 2.0
+	print(v3)
+	var v4 := Vector4i(1, 2, 3, 4)
+	v4 *= hf
+	v4 *= sf
+	v4 *= 2.0
+	print(v4)
+
+	var arr := [1, 2, 3]
+	arr += [4, 5]
+	print(arr)

+ 6 - 0
modules/gdscript/tests/scripts/runtime/features/assign_operator.out

@@ -0,0 +1,6 @@
+GDTEST_OK
+16
+(8, 16)
+(8, 16, 24)
+(8, 16, 24, 32)
+[1, 2, 3, 4, 5]