Skip to content

Commit

Permalink
Merge pull request #81332 from dalexeev/gds-fix-update-array-literal-…
Browse files Browse the repository at this point in the history
…in-weak-context

GDScript: Don't make array literal typed in weak type context
  • Loading branch information
akien-mga committed Sep 20, 2023
2 parents 971f678 + 242d3d8 commit 712ebe7
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 2 deletions.
4 changes: 2 additions & 2 deletions modules/gdscript/gdscript_analyzer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2609,7 +2609,7 @@ void GDScriptAnalyzer::reduce_assignment(GDScriptParser::AssignmentNode *p_assig
}

// Check if assigned value is an array literal, so we can make it a typed array too if appropriate.
if (p_assignment->assigned_value->type == GDScriptParser::Node::ARRAY && assignee_type.has_container_element_type()) {
if (p_assignment->assigned_value->type == GDScriptParser::Node::ARRAY && assignee_type.is_hard_type() && assignee_type.has_container_element_type()) {
update_array_literal_element_type(static_cast<GDScriptParser::ArrayNode *>(p_assignment->assigned_value), assignee_type.get_container_element_type());
}

Expand Down Expand Up @@ -3213,7 +3213,7 @@ void GDScriptAnalyzer::reduce_call(GDScriptParser::CallNode *p_call, bool p_is_a
// If the function requires typed arrays we must make literals be typed.
for (const KeyValue<int, GDScriptParser::ArrayNode *> &E : arrays) {
int index = E.key;
if (index < par_types.size() && par_types[index].has_container_element_type()) {
if (index < par_types.size() && par_types[index].is_hard_type() && par_types[index].has_container_element_type()) {
update_array_literal_element_type(E.value, par_types[index].get_container_element_type());
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
var _typed_array: Array[int]

func weak_param_func(weak_param = _typed_array):
weak_param = [11] # Don't treat the literal as typed!
return weak_param

func hard_param_func(hard_param := _typed_array):
hard_param = [12]
return hard_param

func test():
var weak_var = _typed_array
print(weak_var.is_typed())
weak_var = [21] # Don't treat the literal as typed!
print(weak_var.is_typed())
print(weak_param_func().is_typed())

var hard_var := _typed_array
print(hard_var.is_typed())
hard_var = [22]
print(hard_var.is_typed())
print(hard_param_func().is_typed())
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
GDTEST_OK
true
false
false
true
true
true

0 comments on commit 712ebe7

Please sign in to comment.