Skip to content

Commit

Permalink
Merge pull request godotengine#75885 from AThousandShips/compound_fix
Browse files Browse the repository at this point in the history
[GDScript] Fix incorrect compound assignment
  • Loading branch information
akien-mga committed Apr 25, 2023
2 parents efb42c3 + e5365da commit 45cd5dc
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 11 deletions.
12 changes: 1 addition & 11 deletions modules/gdscript/gdscript_compiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
31 changes: 31 additions & 0 deletions modules/gdscript/tests/scripts/runtime/features/assign_operator.gd
Original file line number Diff line number Diff line change
@@ -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)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
GDTEST_OK
16
(8, 16)
(8, 16, 24)
(8, 16, 24, 32)
[1, 2, 3, 4, 5]

0 comments on commit 45cd5dc

Please sign in to comment.