Skip to content

Commit f57b43c

Browse files
committed
patch 8.2.3005: Vim9: using a void value does not give a proper error message
Problem: Vim9: using a void value does not give a proper error message. Solution: Give a clear error message. (clodes #8387)
1 parent 8ac681a commit f57b43c

7 files changed

Lines changed: 71 additions & 48 deletions

File tree

src/testdir/test_vim9_disassemble.vim

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ def Test_disassemble_exec_expr()
117117
'\d 2STRING stack\[-1\]\_s*' ..
118118
'\d\+ PUSHS ".txt"\_s*' ..
119119
'\d\+ EXECCONCAT 4\_s*' ..
120-
'\d\+ RETURN 0',
120+
'\d\+ RETURN void',
121121
res)
122122
enddef
123123

@@ -133,7 +133,7 @@ EOF
133133
assert_match('<SNR>\d*_PyHeredoc.*' ..
134134
" python3 << EOF^@ print('hello')^@EOF\\_s*" ..
135135
'\d EXEC_SPLIT python3 << EOF^@ print(''hello'')^@EOF\_s*' ..
136-
'\d RETURN 0',
136+
'\d RETURN void',
137137
res)
138138
enddef
139139
endif
@@ -153,7 +153,7 @@ def Test_disassemble_substitute()
153153
'\d SUBSTITUTE :%s/a/\\=expr/&g#c\_s*' ..
154154
' 0 LOAD $0\_s*' ..
155155
' -------------\_s*' ..
156-
'\d RETURN 0',
156+
'\d RETURN void',
157157
res)
158158
enddef
159159

@@ -181,7 +181,7 @@ def Test_disassemble_seachpair()
181181
' -------------\_s*' ..
182182
'\d BCALL searchpair(argc 5)\_s*' ..
183183
'\d DROP\_s*' ..
184-
'\d RETURN 0',
184+
'\d RETURN void',
185185
res)
186186
enddef
187187

@@ -209,7 +209,7 @@ def Test_disassemble_redir_var()
209209
'\d REDIR END\_s*' ..
210210
'\d CONCAT\_s*' ..
211211
'\d STORE $0\_s*' ..
212-
'\d RETURN 0',
212+
'\d RETURN void',
213213
res)
214214
enddef
215215

@@ -228,7 +228,7 @@ def Test_disassemble_cexpr()
228228
'\d CEXPR pre cexpr\_s*' ..
229229
'\d LOAD $0\_s*' ..
230230
'\d CEXPR core cexpr "cexpr errors"\_s*' ..
231-
'\d RETURN 0',
231+
'\d RETURN void',
232232
res)
233233
enddef
234234

@@ -244,7 +244,7 @@ def Test_disassemble_yank_range()
244244
'\d EXEC norm! m\[jjm\]\_s*' ..
245245
' :''\[,''\]yank\_s*' ..
246246
'\d EXEC :''\[,''\]yank\_s*' ..
247-
'\d RETURN 0',
247+
'\d RETURN void',
248248
res)
249249
enddef
250250

@@ -258,7 +258,7 @@ def Test_disassemble_put_expr()
258258
' :3put ="text"\_s*' ..
259259
'\d PUSHS "text"\_s*' ..
260260
'\d PUT = 3\_s*' ..
261-
'\d RETURN 0',
261+
'\d RETURN void',
262262
res)
263263
enddef
264264

@@ -272,7 +272,7 @@ def Test_disassemble_put_range()
272272
' :$-2put a\_s*' ..
273273
'\d RANGE $-2\_s*' ..
274274
'\d PUT a range\_s*' ..
275-
'\d RETURN 0',
275+
'\d RETURN void',
276276
res)
277277
enddef
278278

@@ -390,7 +390,7 @@ def Test_disassemble_store_member()
390390
'\d\+ PUSHNR 1\_s*' ..
391391
'\d\+ LOAD $2\_s*' ..
392392
'\d\+ STOREINDEX blob\_s*' ..
393-
'\d\+ RETURN 0',
393+
'\d\+ RETURN void',
394394
res)
395395
enddef
396396

@@ -413,7 +413,7 @@ def Test_disassemble_store_index()
413413
'\d LOAD $0\_s*' ..
414414
'\d MEMBER dd\_s*' ..
415415
'\d STOREINDEX any\_s*' ..
416-
'\d\+ RETURN 0',
416+
'\d\+ RETURN void',
417417
res)
418418
enddef
419419

@@ -448,7 +448,7 @@ def Test_disassemble_list_assign()
448448
'\d\+ STORE $1\_s*' ..
449449
'\d\+ SLICE 2\_s*' ..
450450
'\d\+ STORE $2\_s*' ..
451-
'\d\+ RETURN 0',
451+
'\d\+ RETURN void',
452452
res)
453453
enddef
454454

@@ -476,7 +476,7 @@ def Test_disassemble_list_add()
476476
'\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
477477
'\d\+ LISTAPPEND\_s*' ..
478478
'\d\+ DROP\_s*' ..
479-
'\d\+ RETURN 0',
479+
'\d\+ RETURN void',
480480
res)
481481
enddef
482482

@@ -503,7 +503,7 @@ def Test_disassemble_blob_add()
503503
'\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
504504
'\d\+ BLOBAPPEND\_s*' ..
505505
'\d\+ DROP\_s*' ..
506-
'\d\+ RETURN 0',
506+
'\d\+ RETURN void',
507507
res)
508508
enddef
509509

@@ -530,7 +530,7 @@ def Test_disassemble_blob_index_slice()
530530
'\d\+ PUSHNR 2\_s*' ..
531531
'\d\+ BLOBSLICE\_s*' ..
532532
'\d\+ ECHO 1\_s*' ..
533-
'\d\+ RETURN 0',
533+
'\d\+ RETURN void',
534534
res)
535535
enddef
536536

@@ -720,7 +720,7 @@ def Test_disassemble_closure()
720720
'\d LOAD arg\[-1\]\_s*' ..
721721
'\d CONCAT\_s*' ..
722722
'\d STOREOUTER level 1 $0\_s*' ..
723-
'\d RETURN 0',
723+
'\d RETURN void',
724724
res)
725725

726726
res = execute('disass g:Get')
@@ -754,7 +754,7 @@ def Test_disassemble_pcall()
754754
'\d PCALL top (argc 1)\_s*' ..
755755
'\d PCALL end\_s*' ..
756756
'\d DROP\_s*' ..
757-
'\d RETURN 0',
757+
'\d RETURN void',
758758
res)
759759
enddef
760760

@@ -1012,7 +1012,7 @@ def Test_disassemble_function()
10121012
'\d PUSHS "UserFunc"\_s*' ..
10131013
'\d BCALL funcref(argc 1)\_s*' ..
10141014
'\d STORE $2\_s*' ..
1015-
'\d RETURN 0',
1015+
'\d RETURN void',
10161016
instr)
10171017
enddef
10181018

@@ -1039,7 +1039,7 @@ def Test_disassemble_channel()
10391039
'var chan1: channel\_s*' ..
10401040
'\d PUSHCHANNEL 0\_s*' ..
10411041
'\d STORE $2\_s*' ..
1042-
'\d RETURN 0',
1042+
'\d RETURN void',
10431043
instr)
10441044
enddef
10451045

@@ -1111,7 +1111,7 @@ def Test_disassemble_nested_func()
11111111
'echomsg "inner"\_s*' ..
11121112
'enddef\_s*' ..
11131113
'\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
1114-
'\d RETURN 0',
1114+
'\d RETURN void',
11151115
instr)
11161116
enddef
11171117

@@ -1133,7 +1133,7 @@ def Test_disassemble_nested_def_list()
11331133
'\d DEF /Info\_s*' ..
11341134
'def /Info/\_s*' ..
11351135
'\d DEF /Info/\_s*' ..
1136-
'\d RETURN 0',
1136+
'\d RETURN void',
11371137
instr)
11381138
enddef
11391139

@@ -1264,7 +1264,7 @@ def Test_disassemble_for_loop_unpack()
12641264
'endfor\_s*' ..
12651265
'\d\+ JUMP -> 8\_s*' ..
12661266
'\d\+ DROP\_s*' ..
1267-
'\d\+ RETURN 0',
1267+
'\d\+ RETURN void',
12681268
instr)
12691269
enddef
12701270

@@ -1321,7 +1321,7 @@ def Test_disassemble_for_loop_continue()
13211321
'endfor\_s*' ..
13221322
'21 JUMP -> 4\_s*' ..
13231323
'\d\+ DROP\_s*' ..
1324-
'\d\+ RETURN 0',
1324+
'\d\+ RETURN void',
13251325
instr)
13261326
enddef
13271327

@@ -1341,7 +1341,7 @@ def Test_disassemble_typecast()
13411341
'\d NEWLIST size 2\_s*' ..
13421342
'\d SETTYPE list<number>\_s*' ..
13431343
'\d STORE $0\_s*' ..
1344-
'\d RETURN 0\_s*',
1344+
'\d RETURN void\_s*',
13451345
instr)
13461346
enddef
13471347

@@ -1828,7 +1828,7 @@ def Test_dsassemble_falsy_op()
18281828
'echo "" ?? "empty string"\_s*' ..
18291829
'\d\+ PUSHS "empty string"\_s*' ..
18301830
'\d\+ ECHO 1\_s*' ..
1831-
'\d\+ RETURN 0',
1831+
'\d\+ RETURN void',
18321832
res)
18331833
enddef
18341834

@@ -1855,15 +1855,15 @@ def Test_disassemble_compare_const()
18551855
'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
18561856
'\d PUSHNR 42.*' ..
18571857
'\d ECHO 1.*' ..
1858-
'\d RETURN 0',
1858+
'\d RETURN void',
18591859
instr)
18601860
else
18611861
# condition false, function just returns
18621862
assert_match('TestCase' .. nr .. '.*' ..
18631863
'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
18641864
'echo 42[ \n]*' ..
18651865
'endif[ \n]*' ..
1866-
'\d RETURN 0',
1866+
'\d RETURN void',
18671867
instr)
18681868
endif
18691869

@@ -1901,7 +1901,7 @@ def Test_disassemble_execute()
19011901
'\d\+ LOAD $1\_s*' ..
19021902
'\d\+ CONCAT\_s*' ..
19031903
'\d\+ EXECUTE 1\_s*' ..
1904-
'\d\+ RETURN 0',
1904+
'\d\+ RETURN void',
19051905
res)
19061906
enddef
19071907

@@ -1920,7 +1920,7 @@ def Test_disassemble_echomsg()
19201920
"echoerr 'went' .. 'wrong'\\_s*" ..
19211921
'\d PUSHS "wentwrong"\_s*' ..
19221922
'\d ECHOERR 1\_s*' ..
1923-
'\d RETURN 0',
1923+
'\d RETURN void',
19241924
res)
19251925
enddef
19261926

@@ -2029,7 +2029,7 @@ def Test_shuffle()
20292029
'\d SHUFFLE 2 up 1\_s*' ..
20302030
'\d BCALL append(argc 2)\_s*' ..
20312031
'\d DROP\_s*' ..
2032-
'\d RETURN 0',
2032+
'\d RETURN void',
20332033
res)
20342034
enddef
20352035

@@ -2052,7 +2052,7 @@ def Test_silent()
20522052
'\d PUSHS "error"\_s*' ..
20532053
'\d ECHOERR 1\_s*' ..
20542054
'\d CMDMOD_REV\_s*' ..
2055-
'\d\+ RETURN 0',
2055+
'\d\+ RETURN void',
20562056
res)
20572057
enddef
20582058

@@ -2081,7 +2081,7 @@ def Test_silent_if()
20812081
'\d\+ CMDMOD_REV\_s*' ..
20822082
'\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
20832083
'endif\_s*' ..
2084-
'\d\+ RETURN 0',
2084+
'\d\+ RETURN void',
20852085
res)
20862086
enddef
20872087

@@ -2104,7 +2104,7 @@ def Test_silent_for()
21042104
'endfor\_s*' ..
21052105
'\d JUMP -> 5\_s*' ..
21062106
'8 DROP\_s*' ..
2107-
'\d RETURN 0\_s*',
2107+
'\d RETURN void\_s*',
21082108
res)
21092109
enddef
21102110

@@ -2125,7 +2125,7 @@ def Test_silent_while()
21252125

21262126
'endwhile\_s*' ..
21272127
'\d JUMP -> 0\_s*' ..
2128-
'6 RETURN 0\_s*',
2128+
'6 RETURN void\_s*',
21292129
res)
21302130
enddef
21312131

src/testdir/test_vim9_expr.vim

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2967,6 +2967,20 @@ def Test_expr7_method_call()
29672967
assert_equal([1, 2, 3], sorted)
29682968
END
29692969
CheckDefAndScriptSuccess(lines)
2970+
2971+
lines =<< trim END
2972+
def RetVoid()
2973+
enddef
2974+
RetVoid()->byte2line()
2975+
END
2976+
CheckDefExecAndScriptFailure(lines, 'E1031:')
2977+
2978+
lines =<< trim END
2979+
def RetVoid()
2980+
enddef
2981+
RetVoid()->byteidx(3)
2982+
END
2983+
CheckDefExecAndScriptFailure(lines, 'E1031:')
29702984
enddef
29712985

29722986

src/typval.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -238,9 +238,11 @@ tv_get_bool_or_number_chk(typval_T *varp, int *denote, int want_bool)
238238
case VAR_BLOB:
239239
emsg(_("E974: Using a Blob as a Number"));
240240
break;
241+
case VAR_VOID:
242+
emsg(_(e_cannot_use_void_value));
243+
break;
241244
case VAR_UNKNOWN:
242245
case VAR_ANY:
243-
case VAR_VOID:
244246
case VAR_INSTR:
245247
internal_error_no_abort("tv_get_number(UNKNOWN)");
246248
break;
@@ -294,7 +296,7 @@ tv_get_bool_chk(typval_T *varp, int *denote)
294296
return tv_get_bool_or_number_chk(varp, denote, TRUE);
295297
}
296298

297-
#ifdef FEAT_FLOAT
299+
#if defined(FEAT_FLOAT) || defined(PROTO)
298300
float_T
299301
tv_get_float(typval_T *varp)
300302
{
@@ -336,9 +338,11 @@ tv_get_float(typval_T *varp)
336338
case VAR_BLOB:
337339
emsg(_("E975: Using a Blob as a Float"));
338340
break;
341+
case VAR_VOID:
342+
emsg(_(e_cannot_use_void_value));
343+
break;
339344
case VAR_UNKNOWN:
340345
case VAR_ANY:
341-
case VAR_VOID:
342346
case VAR_INSTR:
343347
internal_error_no_abort("tv_get_float(UNKNOWN)");
344348
break;
@@ -501,9 +505,11 @@ tv_get_string_buf_chk_strict(typval_T *varp, char_u *buf, int strict)
501505
return channel_to_string_buf(varp, buf);
502506
#endif
503507
break;
508+
case VAR_VOID:
509+
emsg(_(e_cannot_use_void_value));
510+
break;
504511
case VAR_UNKNOWN:
505512
case VAR_ANY:
506-
case VAR_VOID:
507513
case VAR_INSTR:
508514
semsg(_(e_using_invalid_value_as_string_str),
509515
vartype_name(varp->v_type));
@@ -585,6 +591,7 @@ copy_tv(typval_T *from, typval_T *to)
585591
case VAR_NUMBER:
586592
case VAR_BOOL:
587593
case VAR_SPECIAL:
594+
case VAR_VOID:
588595
to->vval.v_number = from->vval.v_number;
589596
break;
590597
case VAR_FLOAT:
@@ -659,7 +666,6 @@ copy_tv(typval_T *from, typval_T *to)
659666
break;
660667
case VAR_UNKNOWN:
661668
case VAR_ANY:
662-
case VAR_VOID:
663669
internal_error_no_abort("copy_tv(UNKNOWN)");
664670
break;
665671
}

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -750,6 +750,8 @@ static char *(features[]) =
750750

751751
static int included_patches[] =
752752
{ /* Add new patch number below this line */
753+
/**/
754+
3005,
753755
/**/
754756
3004,
755757
/**/

0 commit comments

Comments
 (0)