diff src/vim9instr.c @ 27924:e6e3abc28c7a v8.2.4487

patch 8.2.4487: Vim9: cannot compare with v:null Commit: https://github.com/vim/vim/commit/7a2222487507eb13cccdb9a66397092775d62b8c Author: Bram Moolenaar <Bram@vim.org> Date: Tue Mar 1 19:23:24 2022 +0000 patch 8.2.4487: Vim9: cannot compare with v:null Problem: Vim9: cannot compare with v:null. Solution: Allow comparing anything with v:null. (closes https://github.com/vim/vim/issues/9866)
author Bram Moolenaar <Bram@vim.org>
date Tue, 01 Mar 2022 20:30:04 +0100
parents f40647a2b36a
children 1012048eed26
line wrap: on
line diff
--- a/src/vim9instr.c
+++ b/src/vim9instr.c
@@ -372,6 +372,24 @@ get_compare_isn(exprtype_T exprtype, var
 	    || ((type1 == VAR_NUMBER || type1 == VAR_FLOAT)
 	      && (type2 == VAR_NUMBER || type2 == VAR_FLOAT)))
 	isntype = ISN_COMPAREANY;
+    else if (type1 == VAR_SPECIAL || type2 == VAR_SPECIAL)
+    {
+	switch (type1 == VAR_SPECIAL ? type2 : type1)
+	{
+	    case VAR_BLOB: break;
+	    case VAR_CHANNEL: break;
+	    case VAR_DICT: break;
+	    case VAR_FUNC: break;
+	    case VAR_JOB: break;
+	    case VAR_LIST: break;
+	    case VAR_PARTIAL: break;
+	    case VAR_STRING: break;
+	    default: semsg(_(e_cannot_compare_str_with_str),
+				   vartype_name(type1), vartype_name(type2));
+		     return ISN_DROP;
+	}
+	isntype = ISN_COMPARENULL;
+    }
 
     if ((exprtype == EXPR_IS || exprtype == EXPR_ISNOT)
 	    && (isntype == ISN_COMPAREBOOL
@@ -388,7 +406,7 @@ get_compare_isn(exprtype_T exprtype, var
 		    && (type1 == VAR_BOOL || type1 == VAR_SPECIAL
 		       || type2 == VAR_BOOL || type2 == VAR_SPECIAL)))
 	    || ((exprtype != EXPR_EQUAL && exprtype != EXPR_NEQUAL
-				 && exprtype != EXPR_IS && exprtype != EXPR_ISNOT
+			       && exprtype != EXPR_IS && exprtype != EXPR_ISNOT
 		    && (type1 == VAR_BLOB || type2 == VAR_BLOB
 			|| type1 == VAR_LIST || type2 == VAR_LIST))))
     {
@@ -2131,6 +2149,7 @@ delete_instr(isn_T *isn)
 	case ISN_COMPAREFUNC:
 	case ISN_COMPARELIST:
 	case ISN_COMPARENR:
+	case ISN_COMPARENULL:
 	case ISN_COMPARESPECIAL:
 	case ISN_COMPARESTRING:
 	case ISN_CONCAT: