patch 9.0.1077: can add text property with negative ID before virtual text
Problem: Can add text property with negative ID before virtual text
property.
Solution: Remember that a text property with a negative ID was used and give
an appropriate error message. (closes #11725)
Fix index computation.
diff --git a/src/testdir/dumps/Test_prop_negative_error_1.dump b/src/testdir/dumps/Test_prop_negative_error_1.dump
new file mode 100644
index 0000000..47458d8
--- /dev/null
+++ b/src/testdir/dumps/Test_prop_negative_error_1.dump
@@ -0,0 +1,8 @@
+>o+0&#ffffff0|n|e| @56
+|t|w|o| @56
+|t+0#ffffff16#ff404010|h|r|e@1| +0#0000000#ffffff0@54
+|~+0#4040ff13&| @58
+|~| @58
+|~| @58
+|~| @58
+| +0#0000000&@41|1|,|1| @10|A|l@1|
diff --git a/src/testdir/dumps/Test_prop_negative_error_2.dump b/src/testdir/dumps/Test_prop_negative_error_2.dump
new file mode 100644
index 0000000..188224c
--- /dev/null
+++ b/src/testdir/dumps/Test_prop_negative_error_2.dump
@@ -0,0 +1,8 @@
+|~+0#4040ff13#ffffff0| @58
+|~| @58
+|~| @58
+|E+0#ffffff16#e000002|r@1|o|r| |d|e|t|e|c|t|e|d| |w|h|i|l|e| |p|r|o|c|e|s@1|i|n|g| |f|u|n|c|t|i|o|n| |A|d@1|T|e|x|t|p|r|o|p|:| +0#0000000#ffffff0@6
+|l+0#af5f00255&|i|n|e| @3|5|:| +0#0000000&@49
+|E+0#ffffff16#e000002|1|3@1|9|:| |C|a|n@1|o|t| |a|d@1| |a| |t|e|x|t|p|r|o|p| |w|i|t|h| |t|e|x|t| |a|f|t|e|r| |u|s|i|n|g| |a| |t|e|x|t|p|r|o
+|p| |w|i|t|h| |a| |n|e|g|a|t|i|v|e| |i|d| +0#0000000#ffffff0@39
+|P+0#00e0003&|r|e|s@1| |E|N|T|E|R| |o|r| |t|y|p|e| |c|o|m@1|a|n|d| |t|o| |c|o|n|t|i|n|u|e> +0#0000000&@20
diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim
index 333c3b2..a507a95 100644
--- a/src/testdir/test_textprop.vim
+++ b/src/testdir/test_textprop.vim
@@ -3725,6 +3725,50 @@
call StopVimInTerminal(buf)
endfunc
+
+func Test_error_when_using_negative_id()
+ call prop_type_add('test1', #{highlight: 'ErrorMsg'})
+ call prop_add(1, 1, #{type: 'test1', text: 'virtual'})
+ call assert_fails("call prop_add(1, 1, #{type: 'test1', length: 1, id: -1})", 'E1293:')
+
+ call prop_type_delete('test1')
+endfunc
+
+func Test_error_after_using_negative_id()
+ " This needs to run a separate Vim instance because the
+ " "did_use_negative_pop_id" will be set.
+ CheckRunVimInTerminal
+
+ let lines =<< trim END
+ vim9script
+
+ setline(1, ['one', 'two', 'three'])
+ prop_type_add('test_1', {highlight: 'Error'})
+ prop_type_add('test_2', {highlight: 'WildMenu'})
+
+ prop_add(3, 1, {
+ type: 'test_1',
+ length: 5,
+ id: -1
+ })
+
+ def g:AddTextprop()
+ prop_add(1, 0, {
+ type: 'test_2',
+ text: 'The quick fox',
+ text_padding_left: 2
+ })
+ enddef
+ END
+ call writefile(lines, 'XtextPropError', 'D')
+ let buf = RunVimInTerminal('-S XtextPropError', #{rows: 8, cols: 60})
+ call VerifyScreenDump(buf, 'Test_prop_negative_error_1', {})
+
+ call term_sendkeys(buf, ":call AddTextprop()\<CR>")
+ call VerifyScreenDump(buf, 'Test_prop_negative_error_2', {})
+
+ call StopVimInTerminal(buf)
+endfunc
" vim: shiftwidth=2 sts=2 expandtab