1# Copyright (c) 2021-2022 Huawei Device Co., Ltd. 2# Licensed under the Apache License, Version 2.0 (the "License"); 3# you may not use this file except in compliance with the License. 4# You may obtain a copy of the License at 5# 6# http://www.apache.org/licenses/LICENSE-2.0 7# 8# Unless required by applicable law or agreed to in writing, software 9# distributed under the License is distributed on an "AS IS" BASIS, 10# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11# See the License for the specific language governing permissions and 12# limitations under the License. 13 14definitions: 15 - name: obj-param-ctor 16 template: | 17 .record Obj { 18 i32 fld1 19 } 20 21 .function void Obj.ctor(Obj a0, i32 a1) <ctor> { 22 lda a1 23 stobj a0, Obj.fld1 24 return.void 25 } 26 - name: obj-ctor 27 template: | 28 .record Obj {} 29 30 .function void Obj.ctor(Obj a0) <ctor> { 31 return.void 32 } 33 - name: PandaAssembly 34 template: > 35 .language PandaAssembly 36tests: 37 - file-name: "return.obj" 38 isa: 39 title: Return value from method 40 description: > 41 Return from the current method, i.e. restore the frame of method invoker and return control to the 42 invoker. Return value should be in accumulator. 43 exceptions: 44 - x_none 45 commands: 46 - file-name: "call_s_p" 47 isa: 48 instructions: 49 - sig: return.obj 50 acc: in:ref 51 format: [op_none] 52 description: Check 'return.obj' returns control flow to caller in Pandasm context with static call. 53 tags: ['tsan'] 54 header-template: [obj-param-ctor] 55 code-template: | 56 .function Obj func(%s) { 57 movi v0, 0x12345678 58 initobj.short Obj.ctor, v0 59 return.obj 60 } 61 62 .function i32 main() { 63 %s 64 call func%s 65 sta.obj v0 66 ldobj v0, Obj.fld1 67 movi v1, 0x12345678 68 jeq v1, ok 69 ldai 1 70 return 71 ok: 72 check-type: exit-positive 73 cases: 74 - values: 75 - '' 76 - '' 77 - '' 78 - values: 79 - 'i32 a0' 80 - 'movi v0, 0x12345678' 81 - ', v0' 82 - values: 83 - 'i32 a0, f64 a1' 84 - | 85 # 86 movi v0, 0 87 fmovi.64 v1, 1.2 88 - ', v0, v1' 89 - values: 90 - 'i32 a0, f64 a1, i64 a2' 91 - | 92 # 93 movi v0, 0 94 fmovi.64 v1, 1.2 95 movi.64 v2, 0xFF 96 - ', v0, v1, v2' 97 - values: 98 - 'i32 a0, f64 a1, i64 a2, Obj a3' 99 - | 100 # 101 movi v0, 0 102 fmovi.64 v1, 1.2 103 movi.64 v2, 0xFF 104 mov.null v3 105 - ', v0, v1, v2, v3' 106 107 - file-name: "call_s_j" 108 isa: 109 instructions: 110 - sig: return.obj 111 acc: in:ref 112 format: [op_none] 113 description: Check 'return.obj' returns control flow to caller in PandaAssembly context with static call. 114 runner-options: [use-pa] 115 tags: ['tsan'] 116 header-template: [PandaAssembly, obj-param-ctor] 117 code-template: | 118 .function Obj Obj.func(%s) { 119 movi v0, 0x12345678 120 initobj.short Obj.ctor, v0 121 return.obj 122 } 123 124 .function i32 main() { 125 %s 126 call Obj.func%s 127 sta.obj v0 128 ldobj v0, Obj.fld1 129 movi v1, 0x12345678 130 jeq v1, ok 131 ldai 1 132 return 133 ok: 134 check-type: exit-positive 135 cases: 136 - values: 137 - '' 138 - '' 139 - '' 140 - values: 141 - 'i32 a0' 142 - 'movi v0, 0x12345678' 143 - ', v0' 144 - values: 145 - 'i32 a0, f64 a1' 146 - | 147 # 148 movi v0, 0 149 fmovi.64 v1, 1.2 150 - ', v0, v1' 151 - values: 152 - 'i32 a0, f64 a1, i64 a2' 153 - | 154 # 155 movi v0, 0 156 fmovi.64 v1, 1.2 157 movi.64 v2, 0xFF 158 - ', v0, v1, v2' 159 - values: 160 - 'i32 a0, f64 a1, i64 a2, Obj a3' 161 - | 162 # 163 movi v0, 0 164 fmovi.64 v1, 1.2 165 movi.64 v2, 0xFF 166 mov.null v3 167 - ', v0, v1, v2, v3' 168 169 - file-name: "call_v_p" 170 isa: 171 instructions: 172 - sig: return.obj 173 acc: in:ref 174 format: [op_none] 175 description: Check 'return.obj' returns control flow to caller in Pandasm context with virtual call. 176 tags: ['tsan'] 177 header-template: [obj-param-ctor] 178 code-template: | 179 .function Obj Obj.func(Obj a0%s) { 180 movi v0, 0x12345678 181 initobj.short Obj.ctor, v0 182 return.obj 183 } 184 185 .function i32 main() { 186 %s 187 newobj v10, Obj 188 call.virt Obj.func, v10%s 189 sta.obj v0 190 ldobj v0, Obj.fld1 191 movi v1, 0x12345678 192 jeq v1, ok 193 ldai 1 194 return 195 ok: 196 check-type: exit-positive 197 cases: 198 - values: 199 - '' 200 - '' 201 - '' 202 - values: 203 - ', i32 a1' 204 - 'movi v0, 0x12345678' 205 - ', v0' 206 - values: 207 - ', i32 a1, f64 a2' 208 - | 209 # 210 movi v0, 0 211 fmovi.64 v1, 1.2 212 - ', v0, v1' 213 - values: 214 - ', i32 a1, f64 a2, i64 a3' 215 - | 216 # 217 movi v0, 0 218 fmovi.64 v1, 1.2 219 movi.64 v2, 0xFF 220 - ', v0, v1, v2' 221 222 - file-name: "call_v_j" 223 isa: 224 instructions: 225 - sig: return.obj 226 acc: in:ref 227 format: [op_none] 228 description: Check 'return.obj' returns control flow to caller in PandaAssembly context with virtual call. 229 runner-options: ['use-pa'] 230 tags: ['tsan'] 231 header-template: [PandaAssembly, obj-param-ctor] 232 code-template: | 233 .function Obj Obj.func(Obj a0%s) { 234 movi v0, 0x12345678 235 initobj.short Obj.ctor, v0 236 return.obj 237 } 238 .record Obj2 <panda.extends=Obj> {} 239 240 .function i32 main() { 241 %s 242 newobj v10, Obj2 243 call.virt Obj.func, v10%s 244 sta.obj v0 245 ldobj v0, Obj.fld1 246 movi v1, 0x12345678 247 jeq v1, ok 248 ldai 1 249 return 250 ok: 251 check-type: exit-positive 252 cases: 253 - values: 254 - '' 255 - '' 256 - '' 257 - values: 258 - ', i32 a1' 259 - 'movi v0, 0x12345678' 260 - ', v0' 261 - values: 262 - ', i32 a1, f64 a2' 263 - | 264 # 265 movi v0, 0 266 fmovi.64 v1, 1.2 267 - ', v0, v1' 268 - values: 269 - ', i32 a1, f64 a2, i64 a3' 270 - | 271 # 272 movi v0, 0 273 fmovi.64 v1, 1.2 274 movi.64 v2, 0xFF 275 - ', v0, v1, v2' 276 277 - file-name: "op_none_null" 278 isa: 279 instructions: 280 - sig: return.obj 281 acc: in:ref 282 format: [op_none] 283 description: Check 'return.obj' returns control flow to caller. 284 header-template: [obj-param-ctor] 285 code-template: | 286 .function Obj func(%s) { 287 lda.null 288 return.obj 289 } 290 291 .function i32 main() { 292 %s 293 call func%s 294 mov.null v0 295 jne.obj v0, return_ne_num 296 ldai 0 297 return 298 return_ne_num: 299 ldai 1 300 return 301 cases: 302 - values: 303 - '' 304 - '' 305 - '' 306 307 - values: 308 - 'i32 a0' 309 - 'movi v0, 0x12345678' 310 - ', v0' 311 312 - values: 313 - 'i32 a0, f64 a1' 314 - | 315 # 316 movi v0, 0 317 fmovi.64 v1, 1.2 318 - ', v0, v1' 319 - values: 320 - 'i32 a0, f64 a1, i64 a2' 321 - | 322 # 323 movi v0, 0 324 fmovi.64 v1, 1.2 325 movi.64 v2, 0xFF 326 - ', v0, v1, v2' 327 328 - values: 329 - 'i32 a0, f64 a1, i64 a2, Obj a3' 330 - | 331 # 332 movi v0, 0 333 fmovi.64 v1, 1.2 334 movi.64 v2, 0xFF 335 mov.null v3 336 - ', v0, v1, v2, v3' 337 338 - file-name: "type" 339 tags: [verifier] 340 bugid: ['1324'] 341 runner-options: ['verifier-failure', 'verifier-config'] 342 isa: 343 instructions: 344 - sig: return.obj 345 acc: in:ref 346 format: [op_none] 347 verification: 348 - acc_return_type 349 header-template: [] 350 code-template: | 351 .record panda.Object <external> 352 .function %s func() { 353 *s 354 return.obj 355 } 356 357 .function i32 main() { 358 call.short func 359 check-type: exit-positive 360 description: Check that 'return.obj' is used with correct accumulator value and function return type. 361 template-cases: 362 - values: [void] 363 - values: [u1] 364 - values: [i8] 365 - values: [u8] 366 - values: [i16] 367 - values: [u16] 368 - values: [i32] 369 - values: [u32] 370 - values: [i64] 371 - values: [u64] 372 - values: [f32] 373 - values: [f64] 374 - values: [panda.Object] 375 exclude: [case_obj] 376 bugid: ['7360'] 377 ignore: true 378 cases: 379 - values: [''] 380 - values: [ldai 0] 381 - values: [ldai.64 0] 382 - values: [fldai 0] 383 - values: [fldai.64 0] 384 - values: [lda.null] 385 id: case_obj 386 - values: [lda.str "some string"] 387 id: case_obj 388 - values: 389 - initobj Obj.ctor 390 case-header-template: [obj-ctor] 391 id: case_obj 392 - values: 393 - lda.type Obj 394 case-header-template: [obj-ctor] 395 id: case_obj 396 397 - file-name: "wrong_return" 398 tags: [verifier] 399 runner-options: ['verifier-failure', 'verifier-config'] 400 isa: 401 instructions: 402 - sig: return.obj 403 acc: in:ref 404 format: [op_none] 405 header-template: [obj-ctor] 406 code-template: | 407 .function Obj func() { 408 initobj Obj.ctor 409 %s 410 } 411 412 .function i32 main() { 413 call.short func 414 check-type: exit-positive 415 description: Check the verifier behavior when expected 'return.obj' is not given. 416 cases: 417 - values: [""] 418 - values: ["return.void"] 419 - values: ["return"] 420 - values: ["return.64"] 421 422 - file-name: "regs_restore" 423 isa: 424 instructions: 425 - sig: return.obj 426 acc: in:ref 427 format: [op_none] 428 header-template: [obj_ctor] 429 code-template: | 430 .function Obj func(%s) { 431 %s 432 initobj.short Obj.ctor 433 return.obj 434 } 435 436 .function i32 main() { 437 %s 438 call func%s 439 %s 440 description: Check that after 'return.obj' register are restored in caller. 441 cases: 442 - values: 443 - '' 444 - '' 445 - 'movi v0, 0x12345678' 446 - '' 447 - | 448 # 449 ldai 0x12345678 450 jne v0, set_failure 451 ldai 0 452 jmp fall_through 453 set_failure: 454 ldai 1 455 fall_through: 456 description: "Register is not used in function." 457 - values: 458 - 'i32 a0' 459 - 'movi v0, 0x87654321' 460 - 'movi v0, 0x12345678' 461 - ', v0' 462 - | 463 # 464 ldai 0x12345678 465 jne v0, set_failure 466 ldai 0 467 jmp fall_through 468 set_failure: 469 ldai 1 470 fall_through: 471 description: "Register is used in function." 472 - values: 473 - 'i32 a0' 474 - '' 475 - 'movi v0, 0x12345678' 476 - ', v0' 477 - | 478 # 479 ldai 0x12345678 480 jne v0, set_failure 481 ldai 0 482 jmp fall_through 483 set_failure: 484 ldai 1 485 fall_through: 486 description: "Register is not used in function." 487 - values: 488 - 'f64 a0, i64 a1' 489 - | 490 # 491 fmovi.64 v0, 0 492 movi.64 v1, 0 493 - | 494 # 495 fmovi.64 v0, 3.1415926535 496 movi.64 v1, 0x123456789ABCDEF0 497 - ', v0, v1' 498 - | 499 # 500 fldai.64 3.1415926535 501 fcmpg.64 v0 502 jeqz check2 503 ldai 1 504 return 505 check2: 506 ldai.64 0x123456789ABCDEF0 507 cmp.64 v1 508 description: "Registers are used in function." 509 - values: 510 - 'f64 a0, i64 a1, i32 a2, f64 a3' 511 - | 512 # 513 fmovi.64 v0, 0 514 movi.64 v1, 0 515 movi v2, 0 516 fmovi.64 v3, 0 517 - | 518 # 519 fmovi.64 v0, 3.1415926535 520 movi.64 v1, 0x123456789ABCDEF0 521 movi v2, 123456789 522 fmovi.64 v3, 0x8000000000000001 523 - ', v0, v1, v2, v3' 524 - | 525 # 526 fldai.64 3.1415926535 527 fcmpg.64 v0 528 jeqz check1 529 ldai 1 530 return 531 check1: 532 ldai.64 0x123456789ABCDEF0 533 cmp.64 v1 534 jeqz check2 535 ldai 1 536 return 537 check2: 538 ldai 123456789 539 jeq v2, check3 540 ldai 1 541 return 542 check3: 543 fldai.64 0x8000000000000001 544 fcmpg.64 v3 545 description: "Registers are used in function." 546 547 - file-name: "static_return_type_arr" 548 isa: 549 instructions: 550 - sig: return.obj 551 acc: in:ref 552 format: [op_none] 553 verification: 554 - acc_return_type 555 header-template: [] 556 code-template: | 557 # Records definition to all tests in group. 558 .record panda.Object <external> 559 .record panda.String <external> 560 .record panda.Class <external> 561 .record A {} 562 %s 563 564 .function %s %sfunc(%s a0) <static> { 565 %s 566 lda.obj a0 567 return.obj 568 } 569 570 .function i32 main() { 571 movi v0, 123 572 newarr v0, v0, *s 573 call.short %sfunc, v0 574 %s 575 jne.obj v0, return_ne_num 576 ldai 0 577 return 578 return_ne_num: 579 ldai 1 580 return 581 template-cases: 582 - values: 583 - '##-' 584 - 'panda.Object' 585 - '' 586 - 'panda.Object' 587 - "##- %s %s - this line will be removed" 588 - '' 589 - | 590 # 591 sta.obj v2 592 isinstance %s 593 movi v1, 1 594 jeq v1, check_val 595 ldai 1 596 return 597 check_val: 598 lda.obj v2 599 bugid: ['1805'] 600 - values: 601 - | 602 .record B {} 603 - 'panda.Object' 604 - 'B.' 605 - 'panda.Object' 606 - "##- %s %s - this line will be removed" 607 - 'B.' 608 - | 609 # 610 sta.obj v2 611 isinstance %s 612 movi v1, 1 613 jeq v1, check_val 614 ldai 1 615 return 616 check_val: 617 lda.obj v2 618 bugid: ['1805'] 619 - values: 620 - '##-' 621 - '%s' 622 - '' 623 - '%s' 624 - '##-' 625 - '' 626 - '' 627 - values: 628 - | 629 .record B {} 630 - '%s' 631 - 'B.' 632 - '%s' 633 - '' 634 - 'B.' 635 - '' 636 description: Check 'return.obj' return object with different types. 637 cases: 638 - values: ['u1[]', 'u1[]', 'u1[]', 'u1[]'] 639 - values: ['u8[]', 'u8[]', 'u8[]', 'u8[]'] 640 - values: ['i8[]', 'i8[]', 'i8[]', 'i8[]'] 641 - values: ['u16[]', 'u16[]', 'u16[]', 'u16[]'] 642 - values: ['i16[]', 'i16[]', 'i16[]', 'i16[]'] 643 - values: ['i32[]', 'i32[]', 'i32[]', 'i32[]'] 644 - values: ['i64[]', 'i64[]', 'i64[]', 'i64[]'] 645 - values: ['f64[]', 'f64[]', 'f64[]', 'f64[]'] 646 - values: 647 - 'panda.Object[]' 648 - 'panda.Object[]' 649 - 'panda.Object[]' 650 - 'panda.Object[]' 651 - values: 652 - 'panda.String[]' 653 - 'panda.String[]' 654 - 'panda.String[]' 655 - 'panda.String[]' 656 - values: 657 - 'panda.Class[]' 658 - 'panda.Class[]' 659 - 'panda.Class[]' 660 - 'panda.Class[]' 661 - values: ['A[]', 'A[]', 'A[]', 'A[]'] 662 663 - file-name: "virt_return_type_arr" 664 isa: 665 instructions: 666 - sig: return.obj 667 acc: in:ref 668 format: [op_none] 669 verification: 670 - acc_return_type 671 header-template: [] 672 code-template: | 673 # Records definition to all tests in group. 674 .record panda.Object <external> 675 .record panda.String <external> 676 .record panda.Class <external> 677 .record A {} 678 .record B {} 679 680 .function void B.ctor(B a0) <ctor> { 681 return.void 682 } 683 684 .function %s B.func(B a0, %s a1) { 685 %s 686 lda.obj a1 687 return.obj 688 } 689 690 .function i32 main() { 691 movi v0, 123 692 newarr v0, v0, *s 693 initobj B.ctor 694 sta.obj v3 695 call.virt.short B.func, v3, v0 696 %s 697 jne.obj v0, return_ne_num 698 ldai 0 699 return 700 return_ne_num: 701 ldai 1 702 return 703 template-cases: 704 - values: 705 - 'panda.Object' 706 - 'panda.Object' 707 - "##- %s %s - this line will be removed" 708 - | 709 # 710 sta.obj v2 711 isinstance %s 712 movi v1, 1 713 jeq v1, check_val 714 ldai 1 715 return 716 check_val: 717 lda.obj v2 718 bugid: ['1805'] 719 720 - values: 721 - '%s' 722 - '%s' 723 - '##-' 724 - '' 725 726 description: Check 'return.obj' return object from virtual method with different types. 727 cases: 728 - values: ['u1[]', 'u1[]', 'u1[]', 'u1[]'] 729 - values: ['u8[]', 'u8[]', 'u8[]', 'u8[]'] 730 - values: ['i8[]', 'i8[]', 'i8[]', 'i8[]'] 731 - values: ['u16[]', 'u16[]', 'u16[]', 'u16[]'] 732 - values: ['i16[]', 'i16[]', 'i16[]', 'i16[]'] 733 - values: ['i32[]', 'i32[]', 'i32[]', 'i32[]'] 734 - values: ['i64[]', 'i64[]', 'i64[]', 'i64[]'] 735 - values: ['f64[]', 'f64[]', 'f64[]', 'f64[]'] 736 - values: 737 - 'panda.Object[]' 738 - 'panda.Object[]' 739 - 'panda.Object[]' 740 - 'panda.Object[]' 741 - values: 742 - 'panda.String[]' 743 - 'panda.String[]' 744 - 'panda.String[]' 745 - 'panda.String[]' 746 - values: 747 - 'panda.Class[]' 748 - 'panda.Class[]' 749 - 'panda.Class[]' 750 - 'panda.Class[]' 751 - values: ['A[]', 'A[]', 'A[]', 'A[]'] 752 753 - file-name: "j_virt_return_type_arr" 754 isa: 755 instructions: 756 - sig: return.obj 757 acc: in:ref 758 format: [op_none] 759 verification: 760 - acc_return_type 761 header-template: [PandaAssembly] 762 runner-options: [use-pa] 763 code-template: | 764 # Records definition to all tests in group. 765 .record panda.Object <external> 766 .record panda.String <external> 767 .record panda.Class <external> 768 .record A {} 769 770 .record B {} 771 .record C <panda.extends=B> {} 772 773 .function void C.ctor(C a0) <ctor> { 774 return.void 775 } 776 777 .function %s B.func(B a0, %s a1) { 778 %s 779 lda.obj a1 780 return.obj 781 } 782 783 .function i32 main() { 784 movi v0, 123 785 newarr v0, v0, *s 786 initobj C.ctor 787 sta.obj v3 788 call.virt.short B.func, v3, v0 789 %s 790 jne.obj v0, return_ne_num 791 ldai 0 792 return 793 return_ne_num: 794 ldai 1 795 return 796 template-cases: 797 - values: 798 - 'panda.Object' 799 - 'panda.Object' 800 - "##- %s %s - this line will be removed" 801 - | 802 # 803 sta.obj v2 804 isinstance %s 805 movi v1, 1 806 jeq v1, check_val 807 ldai 1 808 return 809 check_val: 810 lda.obj v2 811 bugid: ['1805'] 812 813 - values: 814 - '%s' 815 - '%s' 816 - '##-' 817 - '' 818 819 description: Check 'return.obj' return object from virtual method with different types. 820 cases: 821 - values: ['u1[]', 'u1[]', 'u1[]', 'u1[]'] 822 - values: ['i8[]', 'i8[]', 'i8[]', 'i8[]'] 823 - values: ['u16[]', 'u16[]', 'u16[]', 'u16[]'] 824 - values: ['i16[]', 'i16[]', 'i16[]', 'i16[]'] 825 - values: ['i32[]', 'i32[]', 'i32[]', 'i32[]'] 826 - values: ['i64[]', 'i64[]', 'i64[]', 'i64[]'] 827 - values: ['f64[]', 'f64[]', 'f64[]', 'f64[]'] 828 - values: 829 - 'panda.Object[]' 830 - 'panda.Object[]' 831 - 'panda.Object[]' 832 - 'panda.Object[]' 833 - values: 834 - 'panda.String[]' 835 - 'panda.String[]' 836 - 'panda.String[]' 837 - 'panda.String[]' 838 - values: 839 - 'panda.Class[]' 840 - 'panda.Class[]' 841 - 'panda.Class[]' 842 - 'panda.Class[]' 843 - values: ['A[]', 'A[]', 'A[]', 'A[]'] 844 845 846 - file-name: "uninitialized_acc_s_p" 847 tags: [verifier] 848 runner-options: ['verifier-failure', 'verifier-config'] 849 isa: 850 instructions: 851 - sig: return.obj 852 acc: in:ref 853 format: [op_none] 854 header-template: [] 855 code-template: | 856 .record panda.Object <external> 857 .record R {} 858 .function %s func() { 859 return.obj 860 } 861 862 .function i32 main() { 863 call.short func 864 check-type: exit-positive 865 description: Check that verifier reports an error if accumulator is not initialized in Pandasm context with static call. 866 cases: 867 - values: 868 - panda.Object 869 - values: 870 - R 871 872 - file-name: "uninitialized_acc_s_j" 873 tags: [verifier] 874 runner-options: ['verifier-failure', 'verifier-config', 'use-pa'] 875 isa: 876 instructions: 877 - sig: return.obj 878 acc: in:ref 879 format: [op_none] 880 header-template: [PandaAssembly] 881 code-template: | 882 .record panda.Object <external> 883 .record R {} 884 .function %s func() { 885 return.obj 886 } 887 888 .function i32 main() { 889 call.short func 890 check-type: exit-positive 891 description: Check that verifier reports an error if accumulator is not initialized in PandaAssembly context with static call. 892 cases: 893 - values: 894 - panda.Object 895 - values: 896 - R 897 898 - file-name: "uninitialized_acc_v_p" 899 tags: [verifier] 900 runner-options: ['verifier-failure', 'verifier-config'] 901 isa: 902 instructions: 903 - sig: return.obj 904 acc: in:ref 905 format: [op_none] 906 header-template: [] 907 code-template: | 908 .record panda.Object <external> 909 .record R {} 910 .function %s R.func(R a0) { 911 return.obj 912 } 913 914 .function i32 main() { 915 newobj v10, R 916 call.virt.short R.func, v10 917 check-type: exit-positive 918 description: Check that verifier reports an error if accumulator is not initialized in Pandasm context with virtual call. 919 cases: 920 - values: 921 - panda.Object 922 - values: 923 - R 924 925 - file-name: "uninitialized_acc_s_j" 926 tags: [verifier] 927 runner-options: ['verifier-failure', 'verifier-config', 'use-pa'] 928 isa: 929 instructions: 930 - sig: return.obj 931 acc: in:ref 932 format: [op_none] 933 header-template: [PandaAssembly] 934 code-template: | 935 .record panda.Object <external> 936 .record R {} 937 .function %s R.func(R a0) { 938 return.obj 939 } 940 941 .function i32 main() { 942 newobj v10, R 943 call.virt.short R.func, v10 944 check-type: exit-positive 945 description: Check that verifier reports an error if accumulator is not initialized in PandaAssembly context with virtual call. 946 cases: 947 - values: 948 - panda.Object 949 - values: 950 - R 951