summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSoni L. <EnderMoneyMod@gmail.com>2024-09-24 15:17:18 -0300
committerGitHub <noreply@github.com>2024-09-24 11:17:18 -0700
commit790bc0472552d80671bdf99ba7652876c463d526 (patch)
treeaf56c495ebe6712f4e7ae026ed8664db6b393d0a
parent38524984d5a15c433fe111b1367d74c910dbb677 (diff)
downloadwabt-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.cc15
-rw-r--r--test/typecheck/bad-callref-empty.txt14
-rw-r--r--test/typecheck/bad-callref-int32.txt2
-rw-r--r--test/typecheck/bad-callref-null.txt2
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 ;;)