Browse Source

GDScript Fix type mismatch in optimized single arg `range`

kleonc 2 years ago
parent
commit
c268e3a235

+ 1 - 1
modules/gdscript/gdscript_analyzer.cpp

@@ -1377,7 +1377,7 @@ void GDScriptAnalyzer::resolve_for(GDScriptParser::ForNode *p_for) {
 					if (all_is_constant) {
 						switch (args.size()) {
 							case 1:
-								reduced = args[0];
+								reduced = (int32_t)args[0];
 								break;
 							case 2:
 								reduced = Vector2i(args[0], args[1]);

+ 60 - 0
modules/gdscript/tests/scripts/runtime/features/range_optimized_in_for_has_int_iterator.gd

@@ -0,0 +1,60 @@
+func test():
+	# All combinations of 1/2/3 arguments, each being int/float.
+
+	for number in range(5):
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+	for number in range(5.2):
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+
+	for number in range(1, 5):
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+	for number in range(1, 5.2):
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+	for number in range(1.2, 5):
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+	for number in range(1.2, 5.2):
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+
+	for number in range(1, 5, 2):
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+	for number in range(1, 5, 2.2):
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+	for number in range(1, 5.2, 2):
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+	for number in range(1, 5.2, 2.2):
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+	for number in range(1.2, 5, 2):
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+	for number in range(1.2, 5.2, 2):
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+	for number in range(1.2, 5, 2.2):
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+	for number in range(1.2, 5.2, 2.2):
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")

+ 1 - 0
modules/gdscript/tests/scripts/runtime/features/range_optimized_in_for_has_int_iterator.out

@@ -0,0 +1 @@
+GDTEST_OK

+ 77 - 0
modules/gdscript/tests/scripts/runtime/features/range_returns_ints.gd

@@ -0,0 +1,77 @@
+func test():
+	# All combinations of 1/2/3 arguments, each being int/float.
+	# Store result in variable to ensure actual array is created (avoid `for` + `range` optimization).
+
+	var result
+
+	result = range(5)
+	for number in result:
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+	result = range(5.2)
+	for number in result:
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+
+	result = range(1, 5)
+	for number in result:
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+	result = range(1, 5.2)
+	for number in result:
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+	result = range(1.2, 5)
+	for number in result:
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+	result = range(1.2, 5.2)
+	for number in result:
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+
+	result = range(1, 5, 2)
+	for number in result:
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+	result = range(1, 5, 2.2)
+	for number in result:
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+	result = range(1, 5.2, 2)
+	for number in result:
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+	result = range(1, 5.2, 2.2)
+	for number in result:
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+	result = range(1.2, 5, 2)
+	for number in result:
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+	result = range(1.2, 5.2, 2)
+	for number in result:
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+	result = range(1.2, 5, 2.2)
+	for number in result:
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")
+
+	result = range(1.2, 5.2, 2.2)
+	for number in result:
+		if typeof(number) != TYPE_INT:
+			print("Number returned from `range` was not an int!")

+ 1 - 0
modules/gdscript/tests/scripts/runtime/features/range_returns_ints.out

@@ -0,0 +1 @@
+GDTEST_OK