patch 9.1.1040: Vim9: imported type cannot be used as func return type

Problem:  Vim9: imported type cannot be used as func return type
          (Dayvid Albuquerque)
Solution: temporarily reset the is_export flag (Yegappan Lakshmanan)

fixes: #16489
closes: #16492

Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/testdir/test_vim9_import.vim b/src/testdir/test_vim9_import.vim
index 4a3e239..ff81f4a 100644
--- a/src/testdir/test_vim9_import.vim
+++ b/src/testdir/test_vim9_import.vim
@@ -3387,4 +3387,37 @@
   v9.CheckScriptFailure(lines, 'E741: Value is locked: Foo', 3)
 enddef
 
+" Test for using an autoload imported class as the function return type
+def Test_imported_class_as_def_func_rettype()
+  var lines =<< trim END
+    vim9script
+
+    export class Foo
+      var name: string = "foo"
+    endclass
+  END
+  writefile(lines, 'Ximportclassrettype1.vim', 'D')
+
+  lines =<< trim END
+    vim9script
+
+    import autoload "./Ximportclassrettype1.vim" as A
+
+    export def CreateFoo(): A.Foo
+      return A.Foo.new()
+    enddef
+  END
+  writefile(lines, 'Ximportclassrettype2.vim', 'D')
+
+  lines =<< trim END
+    vim9script
+
+    import './Ximportclassrettype2.vim' as B
+
+    var foo = B.CreateFoo()
+    assert_equal('foo', foo.name)
+  END
+  v9.CheckScriptSuccess(lines)
+enddef
+
 " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
diff --git a/src/userfunc.c b/src/userfunc.c
index 06be445..91c971e 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -5472,11 +5472,19 @@
 	// The function may use script variables from the context.
 	function_using_block_scopes(fp, cstack);
 
+	// The argument types and the return type may use an imported type.
+	// In that case, the imported file will be sourced.  To avoid treating
+	// everything in the imported file as exported, temporarily reset
+	// is_export.
+	int save_is_export = is_export;
+	is_export = FALSE;
+
 	if (parse_argument_types(fp, &argtypes, varargs, &arg_objm,
 					obj_members, obj_member_count) == FAIL)
 	{
 	    SOURCING_LNUM = lnum_save;
 	    free_fp = fp_allocated;
+	    is_export = save_is_export;
 	    goto erret;
 	}
 	varargs = FALSE;
@@ -5486,8 +5494,10 @@
 	{
 	    SOURCING_LNUM = lnum_save;
 	    free_fp = fp_allocated;
+	    is_export = save_is_export;
 	    goto erret;
 	}
+	is_export = save_is_export;
 	SOURCING_LNUM = lnum_save;
     }
     else
diff --git a/src/version.c b/src/version.c
index 3a3ee56..8e53159 100644
--- a/src/version.c
+++ b/src/version.c
@@ -13,7 +13,7 @@
  * Vim originated from Stevie version 3.6 (Fish disk 217) by GRWalter (Fred)
  * It has been changed beyond recognition since then.
  *
- * Differences between version 8.2 and 9.0 can be found with ":help version9".
+ * Differences between version 8.2 and 9.1 can be found with ":help version9".
  * Differences between version 7.4 and 8.x can be found with ":help version8".
  * Differences between version 6.4 and 7.x can be found with ":help version7".
  * Differences between version 5.8 and 6.x can be found with ":help version6".
@@ -705,6 +705,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1040,
+/**/
     1039,
 /**/
     1038,