Browse Source

Merge pull request #70656 from vonagam/fix-void-returns

GDScript: Disallow return with value in void functions
Rémi Verschelde 2 years ago
parent
commit
e4c1103af4

+ 3 - 0
modules/gdscript/gdscript_analyzer.cpp

@@ -2047,6 +2047,9 @@ void GDScriptAnalyzer::resolve_return(GDScriptParser::ReturnNode *p_return) {
 				update_array_literal_element_type(expected_type, static_cast<GDScriptParser::ArrayNode *>(p_return->return_value));
 			}
 		}
+		if (has_expected_type && expected_type.is_hard_type() && expected_type.kind == GDScriptParser::DataType::BUILTIN && expected_type.builtin_type == Variant::NIL) {
+			push_error("A void function cannot return a value.", p_return);
+		}
 		result = p_return->return_value->get_datatype();
 	} else {
 		// Return type is null by default.

+ 2 - 0
modules/gdscript/tests/scripts/analyzer/errors/return_null_in_void_func.gd

@@ -0,0 +1,2 @@
+func test() -> void:
+  return null

+ 2 - 0
modules/gdscript/tests/scripts/analyzer/errors/return_null_in_void_func.out

@@ -0,0 +1,2 @@
+GDTEST_ANALYZER_ERROR
+A void function cannot return a value.

+ 4 - 0
modules/gdscript/tests/scripts/analyzer/errors/return_variant_in_void_func.gd

@@ -0,0 +1,4 @@
+func test() -> void:
+  var a
+  a = 1
+  return a

+ 2 - 0
modules/gdscript/tests/scripts/analyzer/errors/return_variant_in_void_func.out

@@ -0,0 +1,2 @@
+GDTEST_ANALYZER_ERROR
+A void function cannot return a value.

+ 5 - 0
modules/gdscript/tests/scripts/analyzer/features/return_variant_typed.gd

@@ -0,0 +1,5 @@
+func variant() -> Variant:
+  return 'variant'
+
+func test():
+  print(variant())

+ 2 - 0
modules/gdscript/tests/scripts/analyzer/features/return_variant_typed.out

@@ -0,0 +1,2 @@
+GDTEST_OK
+variant