changeset 34834:d3127b18fe1e v9.1.0286

patch 9.1.0286: Vim9: E1027 with defcompile for abstract methods Commit: https://github.com/vim/vim/commit/1af0fbf955f799392f614bc38f9d2fcbd9960526 Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Tue Apr 9 21:39:27 2024 +0200 patch 9.1.0286: Vim9: E1027 with defcompile for abstract methods Problem: Vim9: E1027 with defcompile for abstract methods with non-void return types, but still compiles it (zzzyxwvut) Solution: Don't compile abstract methods (Yegappan Lakshmanan) fixes: #14443 closes: #14447 Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Tue, 09 Apr 2024 21:45:04 +0200
parents 0fde4c80d761
children a5841d54e20a
files src/testdir/test_vim9_class.vim src/version.c src/vim9class.c
diffstat 3 files changed, 47 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_class.vim
+++ b/src/testdir/test_vim9_class.vim
@@ -10583,4 +10583,46 @@ def Test_lambda_block_in_class()
   v9.CheckScriptSuccess(lines)
 enddef
 
+" Test for defcompiling an abstract method
+def Test_abstract_method_defcompile()
+  # Compile an abstract class with abstract object methods
+  var lines =<< trim END
+    vim9script
+    abstract class A
+      abstract def Foo(): string
+      abstract def Bar(): list<string>
+    endclass
+    defcompile
+  END
+  v9.CheckScriptSuccess(lines)
+
+  # Compile a concrete object method in an abstract class
+  lines =<< trim END
+    vim9script
+    abstract class A
+      abstract def Foo(): string
+      abstract def Bar(): list<string>
+      def Baz(): string
+        pass
+      enddef
+    endclass
+    defcompile
+  END
+  v9.CheckScriptFailure(lines, 'E476: Invalid command: pass', 1)
+
+  # Compile a concrete class method in an abstract class
+  lines =<< trim END
+    vim9script
+    abstract class A
+      abstract def Foo(): string
+      abstract def Bar(): list<string>
+      static def Baz(): string
+        pass
+      enddef
+    endclass
+    defcompile
+  END
+  v9.CheckScriptFailure(lines, 'E476: Invalid command: pass', 1)
+enddef
+
 " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    286,
+/**/
     285,
 /**/
     284,
--- a/src/vim9class.c
+++ b/src/vim9class.c
@@ -3723,7 +3723,9 @@ defcompile_class(class_T *cl)
 	{
 	    ufunc_T *ufunc = loop == 1 ? cl->class_class_functions[i]
 						: cl->class_obj_methods[i];
-	    defcompile_function(ufunc, cl);
+	    // Don't compile abstract methods
+	    if (!IS_ABSTRACT_METHOD(ufunc))
+		defcompile_function(ufunc, cl);
 	}
     }
 }