Browse Source

GDScript: Fix use of conversion assign for variant values

George Marques 2 years ago
parent
commit
04d0e851ea

+ 2 - 2
modules/gdscript/gdscript_analyzer.cpp

@@ -2110,14 +2110,14 @@ void GDScriptAnalyzer::reduce_assignment(GDScriptParser::AssignmentNode *p_assig
 
 	bool compatible = true;
 	GDScriptParser::DataType op_type = assigned_value_type;
-	if (p_assignment->operation != GDScriptParser::AssignmentNode::OP_NONE) {
+	if (p_assignment->operation != GDScriptParser::AssignmentNode::OP_NONE && !op_type.is_variant()) {
 		op_type = get_operation_type(p_assignment->variant_op, assignee_type, assigned_value_type, compatible, p_assignment->assigned_value);
 	}
 	p_assignment->set_datatype(op_type);
 
 	// If Assignee is a variant, then you can assign anything
 	// When the assigned value has a known type, further checks are possible.
-	if (assignee_type.is_hard_type() && !assignee_type.is_variant() && op_type.is_hard_type()) {
+	if (assignee_type.is_hard_type() && !assignee_type.is_variant() && op_type.is_hard_type() && !op_type.is_variant()) {
 		if (compatible) {
 			compatible = is_type_compatible(assignee_type, op_type, true, p_assignment->assigned_value);
 			if (!compatible) {

+ 9 - 0
modules/gdscript/tests/scripts/runtime/features/use_conversion_assign_with_variant_value.gd

@@ -0,0 +1,9 @@
+# https://github.com/godotengine/godot/issues/71172
+
+func test():
+	@warning_ignore(narrowing_conversion)
+	var foo: int = 0.0
+	print(typeof(foo) == TYPE_INT)
+	var dict : Dictionary = {"a":0.0}
+	foo = dict.get("a")
+	print(typeof(foo) == TYPE_INT)

+ 3 - 0
modules/gdscript/tests/scripts/runtime/features/use_conversion_assign_with_variant_value.out

@@ -0,0 +1,3 @@
+GDTEST_OK
+true
+true