From 6c28b8edd3bd43c28c4c5671b4b1800e14b47949 Mon Sep 17 00:00:00 2001 From: "ocean (they/them)" Date: Wed, 21 Jun 2023 15:13:45 -0400 Subject: [PATCH] GDScript: fix regression when checking for virtual function implementation. Unfortunately it appears the virtual function checks in #77324 are not trustworthy at runtime, because objects can have scripts attached, but this information is not always available at compile-time. These checks need to be removed. The rest of the PR is still useful, making all method flags available to the analyzer, so a full revert isn't necessary/desirable. This reopens #76938, which will need another solution. --- modules/gdscript/gdscript_analyzer.cpp | 10 ---------- .../analyzer/errors/virtual_method_not_implemented.gd | 2 -- .../errors/virtual_method_not_implemented.out | 2 -- .../analyzer/errors/virtual_super_not_implemented.gd | 5 ----- .../analyzer/errors/virtual_super_not_implemented.out | 2 -- .../analyzer/features/virtual_method_implemented.gd | 11 ----------- .../analyzer/features/virtual_method_implemented.out | 1 - .../analyzer/features/virtual_super_implemented.gd | 10 ---------- .../analyzer/features/virtual_super_implemented.out | 1 - 9 files changed, 44 deletions(-) delete mode 100644 modules/gdscript/tests/scripts/analyzer/errors/virtual_method_not_implemented.gd delete mode 100644 modules/gdscript/tests/scripts/analyzer/errors/virtual_method_not_implemented.out delete mode 100644 modules/gdscript/tests/scripts/analyzer/errors/virtual_super_not_implemented.gd delete mode 100644 modules/gdscript/tests/scripts/analyzer/errors/virtual_super_not_implemented.out delete mode 100644 modules/gdscript/tests/scripts/analyzer/features/virtual_method_implemented.gd delete mode 100644 modules/gdscript/tests/scripts/analyzer/features/virtual_method_implemented.out delete mode 100644 modules/gdscript/tests/scripts/analyzer/features/virtual_super_implemented.gd delete mode 100644 modules/gdscript/tests/scripts/analyzer/features/virtual_super_implemented.out diff --git a/modules/gdscript/gdscript_analyzer.cpp b/modules/gdscript/gdscript_analyzer.cpp index 9d39cbf1a5..d3445b8cc0 100644 --- a/modules/gdscript/gdscript_analyzer.cpp +++ b/modules/gdscript/gdscript_analyzer.cpp @@ -3097,16 +3097,6 @@ void GDScriptAnalyzer::reduce_call(GDScriptParser::CallNode *p_call, bool p_is_a bool is_constructor = (base_type.is_meta_type || (p_call->callee && p_call->callee->type == GDScriptParser::Node::IDENTIFIER)) && p_call->function_name == SNAME("new"); if (get_function_signature(p_call, is_constructor, base_type, p_call->function_name, return_type, par_types, default_arg_count, method_flags)) { - // If the method is implemented in the class hierarchy, the virtual flag will not be set for that MethodInfo and the search stops there. - // MethodInfo's above the class that defines the method might still have the virtual flag set. - if (method_flags.has_flag(METHOD_FLAG_VIRTUAL)) { - if (p_call->is_super) { - push_error(vformat(R"*(Cannot call the parent class' virtual function "%s()" because it hasn't been defined.)*", p_call->function_name), p_call); - } else { - push_error(vformat(R"*(Cannot call virtual function "%s()" because it hasn't been defined.)*", p_call->function_name), p_call); - } - } - // If the function require typed arrays we must make literals be typed. for (const KeyValue &E : arrays) { int index = E.key; diff --git a/modules/gdscript/tests/scripts/analyzer/errors/virtual_method_not_implemented.gd b/modules/gdscript/tests/scripts/analyzer/errors/virtual_method_not_implemented.gd deleted file mode 100644 index c34d927035..0000000000 --- a/modules/gdscript/tests/scripts/analyzer/errors/virtual_method_not_implemented.gd +++ /dev/null @@ -1,2 +0,0 @@ -func test(): - _get_property_list() diff --git a/modules/gdscript/tests/scripts/analyzer/errors/virtual_method_not_implemented.out b/modules/gdscript/tests/scripts/analyzer/errors/virtual_method_not_implemented.out deleted file mode 100644 index ce2f49a5e5..0000000000 --- a/modules/gdscript/tests/scripts/analyzer/errors/virtual_method_not_implemented.out +++ /dev/null @@ -1,2 +0,0 @@ -GDTEST_ANALYZER_ERROR -Cannot call virtual function "_get_property_list()" because it hasn't been defined. diff --git a/modules/gdscript/tests/scripts/analyzer/errors/virtual_super_not_implemented.gd b/modules/gdscript/tests/scripts/analyzer/errors/virtual_super_not_implemented.gd deleted file mode 100644 index 57dfffdbee..0000000000 --- a/modules/gdscript/tests/scripts/analyzer/errors/virtual_super_not_implemented.gd +++ /dev/null @@ -1,5 +0,0 @@ -func _init(): - super() - -func test(): - pass diff --git a/modules/gdscript/tests/scripts/analyzer/errors/virtual_super_not_implemented.out b/modules/gdscript/tests/scripts/analyzer/errors/virtual_super_not_implemented.out deleted file mode 100644 index e68759223c..0000000000 --- a/modules/gdscript/tests/scripts/analyzer/errors/virtual_super_not_implemented.out +++ /dev/null @@ -1,2 +0,0 @@ -GDTEST_ANALYZER_ERROR -Cannot call the parent class' virtual function "_init()" because it hasn't been defined. diff --git a/modules/gdscript/tests/scripts/analyzer/features/virtual_method_implemented.gd b/modules/gdscript/tests/scripts/analyzer/features/virtual_method_implemented.gd deleted file mode 100644 index 1aacd1d11c..0000000000 --- a/modules/gdscript/tests/scripts/analyzer/features/virtual_method_implemented.gd +++ /dev/null @@ -1,11 +0,0 @@ -class TestOne: - func _get_property_list(): - return {} - -class TestTwo extends TestOne: - func _init(): - var _x = _get_property_list() - -func test(): - var x = TestTwo.new() - var _x = x._get_property_list() diff --git a/modules/gdscript/tests/scripts/analyzer/features/virtual_method_implemented.out b/modules/gdscript/tests/scripts/analyzer/features/virtual_method_implemented.out deleted file mode 100644 index d73c5eb7cd..0000000000 --- a/modules/gdscript/tests/scripts/analyzer/features/virtual_method_implemented.out +++ /dev/null @@ -1 +0,0 @@ -GDTEST_OK diff --git a/modules/gdscript/tests/scripts/analyzer/features/virtual_super_implemented.gd b/modules/gdscript/tests/scripts/analyzer/features/virtual_super_implemented.gd deleted file mode 100644 index c447003619..0000000000 --- a/modules/gdscript/tests/scripts/analyzer/features/virtual_super_implemented.gd +++ /dev/null @@ -1,10 +0,0 @@ -class TestOne: - func _init(): - pass - -class TestTwo extends TestOne: - func _init(): - super() - -func test(): - pass diff --git a/modules/gdscript/tests/scripts/analyzer/features/virtual_super_implemented.out b/modules/gdscript/tests/scripts/analyzer/features/virtual_super_implemented.out deleted file mode 100644 index d73c5eb7cd..0000000000 --- a/modules/gdscript/tests/scripts/analyzer/features/virtual_super_implemented.out +++ /dev/null @@ -1 +0,0 @@ -GDTEST_OK