diff options
author | Soni L. <EnderMoneyMod@gmail.com> | 2024-09-24 15:17:18 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-24 11:17:18 -0700 |
commit | 790bc0472552d80671bdf99ba7652876c463d526 (patch) | |
tree | af56c495ebe6712f4e7ae026ed8664db6b393d0a | |
parent | 38524984d5a15c433fe111b1367d74c910dbb677 (diff) | |
download | wabt-790bc0472552d80671bdf99ba7652876c463d526.tar.gz wabt-790bc0472552d80671bdf99ba7652876c463d526.tar.bz2 wabt-790bc0472552d80671bdf99ba7652876c463d526.zip |
Fix call_ref on empty stack (#2472)
Same issue as #2471 but for `call_ref`.
We don't believe there's a prior issue for this.
-rw-r--r-- | src/type-checker.cc | 15 | ||||
-rw-r--r-- | test/typecheck/bad-callref-empty.txt | 14 | ||||
-rw-r--r-- | test/typecheck/bad-callref-int32.txt | 2 | ||||
-rw-r--r-- | test/typecheck/bad-callref-null.txt | 2 |
4 files changed, 20 insertions, 13 deletions
diff --git a/src/type-checker.cc b/src/type-checker.cc index 37412e15..8d6c3a11 100644 --- a/src/type-checker.cc +++ b/src/type-checker.cc @@ -522,21 +522,14 @@ Result TypeChecker::OnCallIndirect(const TypeVector& param_types, Result TypeChecker::OnIndexedFuncRef(Index* out_index) { Type type; - CHECK_RESULT(PeekType(0, &type)); - Result result = Result::Ok; - if (!(type == Type::Any || type.IsReferenceWithIndex())) { - TypeVector actual; - actual.push_back(type); - std::string message = - "type mismatch in call_ref, expected reference but got " + - TypesToString(actual); - PrintError("%s", message.c_str()); - result = Result::Error; + Result result = PeekType(0, &type); + if (!type.IsReferenceWithIndex()) { + type = Type::Reference; } + result |= PopAndCheck1Type(type, "call_ref"); if (Succeeded(result)) { *out_index = type.GetReferenceIndex(); } - result |= DropTypes(1); return result; } diff --git a/test/typecheck/bad-callref-empty.txt b/test/typecheck/bad-callref-empty.txt new file mode 100644 index 00000000..cee38853 --- /dev/null +++ b/test/typecheck/bad-callref-empty.txt @@ -0,0 +1,14 @@ +;;; TOOL: wat2wasm +;;; ARGS: --enable-function-references +;;; ERROR: 1 +(module + (func (export "main") + (call_ref + ) + ) +) +(;; STDERR ;;; +out/test/typecheck/bad-callref-empty.txt:6:6: error: type mismatch in call_ref, expected [reference] but got [] + (call_ref + ^^^^^^^^ +;;; STDERR ;;) diff --git a/test/typecheck/bad-callref-int32.txt b/test/typecheck/bad-callref-int32.txt index 52f34da1..95401b95 100644 --- a/test/typecheck/bad-callref-int32.txt +++ b/test/typecheck/bad-callref-int32.txt @@ -9,7 +9,7 @@ ) ) (;; STDERR ;;; -out/test/typecheck/bad-callref-int32.txt:6:6: error: type mismatch in call_ref, expected reference but got [i32] +out/test/typecheck/bad-callref-int32.txt:6:6: error: type mismatch in call_ref, expected [reference] but got [... i32] (call_ref (i32.const 10) ^^^^^^^^ ;;; STDERR ;;) diff --git a/test/typecheck/bad-callref-null.txt b/test/typecheck/bad-callref-null.txt index 08860777..6771a893 100644 --- a/test/typecheck/bad-callref-null.txt +++ b/test/typecheck/bad-callref-null.txt @@ -9,7 +9,7 @@ ) ) (;; STDERR ;;; -out/test/typecheck/bad-callref-null.txt:6:6: error: type mismatch in call_ref, expected reference but got [funcref] +out/test/typecheck/bad-callref-null.txt:6:6: error: type mismatch in call_ref, expected [reference] but got [... funcref] (call_ref (i32.const 10) ^^^^^^^^ ;;; STDERR ;;) |