diff --git a/modules/gdscript/gdscript_compiler.cpp b/modules/gdscript/gdscript_compiler.cpp index 5413eadf602..e27b977e9d8 100644 --- a/modules/gdscript/gdscript_compiler.cpp +++ b/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; if (has_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 og_value = _parse_expression(codegen, r_error, assignment->assignee); gen->write_binary_operator(op_result, assignment->variant_op, og_value, assigned_value); to_assign = op_result; diff --git a/modules/gdscript/tests/scripts/runtime/features/assign_operator.gd b/modules/gdscript/tests/scripts/runtime/features/assign_operator.gd new file mode 100644 index 00000000000..2a9fe851ef0 --- /dev/null +++ b/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) diff --git a/modules/gdscript/tests/scripts/runtime/features/assign_operator.out b/modules/gdscript/tests/scripts/runtime/features/assign_operator.out new file mode 100644 index 00000000000..bfcfc1dff51 --- /dev/null +++ b/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]