From f67aa3e46d1f100cc6788353bf6c50f2175250e9 Mon Sep 17 00:00:00 2001 From: Dmitrii Maganov Date: Tue, 27 Dec 2022 22:49:26 +0200 Subject: [PATCH] GDScript: Fix return type of constructor call for extending class --- modules/gdscript/gdscript_analyzer.cpp | 2 +- .../scripts/analyzer/errors/constructor_call_type.gd | 10 ++++++++++ .../scripts/analyzer/errors/constructor_call_type.out | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 modules/gdscript/tests/scripts/analyzer/errors/constructor_call_type.gd create mode 100644 modules/gdscript/tests/scripts/analyzer/errors/constructor_call_type.out diff --git a/modules/gdscript/gdscript_analyzer.cpp b/modules/gdscript/gdscript_analyzer.cpp index fc2e6e94f33..9f8d4e4f7e9 100644 --- a/modules/gdscript/gdscript_analyzer.cpp +++ b/modules/gdscript/gdscript_analyzer.cpp @@ -4174,7 +4174,7 @@ bool GDScriptAnalyzer::get_function_signature(GDScriptParser::Node *p_source, bo r_default_arg_count++; } } - r_return_type = found_function->get_datatype(); + r_return_type = p_is_constructor ? p_base_type : found_function->get_datatype(); r_return_type.is_meta_type = false; r_return_type.is_coroutine = found_function->is_coroutine; diff --git a/modules/gdscript/tests/scripts/analyzer/errors/constructor_call_type.gd b/modules/gdscript/tests/scripts/analyzer/errors/constructor_call_type.gd new file mode 100644 index 00000000000..251be700881 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/constructor_call_type.gd @@ -0,0 +1,10 @@ +class A: + func _init(): + pass + +class B extends A: pass +class C extends A: pass + +func test(): + var x := B.new() + print(x is C) diff --git a/modules/gdscript/tests/scripts/analyzer/errors/constructor_call_type.out b/modules/gdscript/tests/scripts/analyzer/errors/constructor_call_type.out new file mode 100644 index 00000000000..91d5125ec01 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/constructor_call_type.out @@ -0,0 +1,2 @@ +GDTEST_ANALYZER_ERROR +Expression is of type "B" so it can't be of type "C".