summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeejin Ahn <aheejin@gmail.com>2022-08-11 17:56:49 -0700
committerGitHub <noreply@github.com>2022-08-11 17:56:49 -0700
commitdaf5447644e4b1c6c9c09fd0eec6f5ab983a6831 (patch)
treee6ad0637e3b6a306f41fb479f2c7ca52ad94f6c6
parent3bef680b3892c159ab30e6dd610de6f84c9556aa (diff)
downloadbinaryen-daf5447644e4b1c6c9c09fd0eec6f5ab983a6831.tar.gz
binaryen-daf5447644e4b1c6c9c09fd0eec6f5ab983a6831.tar.bz2
binaryen-daf5447644e4b1c6c9c09fd0eec6f5ab983a6831.zip
[EH] Pop should be supertype of tag type (#4901)
`pop`s type should be a supertype, not a subtype, of the tag's type within `catch`.
-rw-r--r--src/wasm/wasm-validator.cpp2
-rw-r--r--test/exception-handling.wast6
-rw-r--r--test/exception-handling.wast.from-wast8
-rw-r--r--test/exception-handling.wast.fromBinary6
-rw-r--r--test/exception-handling.wast.fromBinary.noDebugInfo6
5 files changed, 14 insertions, 14 deletions
diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp
index bc51d8b63..10310f8c0 100644
--- a/src/wasm/wasm-validator.cpp
+++ b/src/wasm/wasm-validator.cpp
@@ -2175,7 +2175,7 @@ void FunctionValidator::visitTry(Try* curr) {
} else {
if (shouldBeTrue(pops.size() == 1, curr, "")) {
auto* pop = *pops.begin();
- if (!shouldBeSubType(pop->type, tag->sig.params, curr, "")) {
+ if (!shouldBeSubType(tag->sig.params, pop->type, curr, "")) {
getStream()
<< "catch's tag (" << tagName
<< ")'s pop doesn't have the same type as the tag's params";
diff --git a/test/exception-handling.wast b/test/exception-handling.wast
index 642856f03..93dbe41ba 100644
--- a/test/exception-handling.wast
+++ b/test/exception-handling.wast
@@ -2,7 +2,7 @@
(tag $e-i32 (param i32))
(tag $e-i64 (param i64))
(tag $e-i32-i64 (param i32 i64))
- (tag $e-anyref (param anyref))
+ (tag $e-funcref (param funcref))
(tag $e-empty)
(func $foo)
@@ -330,9 +330,9 @@
(try
(do)
- (catch $e-anyref
+ (catch $e-funcref
(drop
- (pop funcref) ;; pop can be subtype
+ (pop anyref) ;; pop can be supertype
)
)
)
diff --git a/test/exception-handling.wast.from-wast b/test/exception-handling.wast.from-wast
index 2427a1ee1..be14cda0f 100644
--- a/test/exception-handling.wast.from-wast
+++ b/test/exception-handling.wast.from-wast
@@ -3,11 +3,11 @@
(type $i32_=>_none (func (param i32)))
(type $i64_=>_none (func (param i64)))
(type $i32_i64_=>_none (func (param i32 i64)))
- (type $anyref_=>_none (func (param anyref)))
+ (type $funcref_=>_none (func (param funcref)))
(tag $e-i32 (param i32))
(tag $e-i64 (param i64))
(tag $e-i32-i64 (param i32 i64))
- (tag $e-anyref (param anyref))
+ (tag $e-funcref (param funcref))
(tag $e-empty (param))
(func $foo
(nop)
@@ -372,9 +372,9 @@
(do
(nop)
)
- (catch $e-anyref
+ (catch $e-funcref
(drop
- (pop funcref)
+ (pop anyref)
)
)
)
diff --git a/test/exception-handling.wast.fromBinary b/test/exception-handling.wast.fromBinary
index f88e54507..5642a4f2d 100644
--- a/test/exception-handling.wast.fromBinary
+++ b/test/exception-handling.wast.fromBinary
@@ -3,11 +3,11 @@
(type $i32_=>_none (func (param i32)))
(type $i64_=>_none (func (param i64)))
(type $i32_i64_=>_none (func (param i32 i64)))
- (type $anyref_=>_none (func (param anyref)))
+ (type $funcref_=>_none (func (param funcref)))
(tag $tag$0 (param i32))
(tag $tag$1 (param i64))
(tag $tag$2 (param i32 i64))
- (tag $tag$3 (param anyref))
+ (tag $tag$3 (param funcref))
(tag $tag$4 (param))
(func $foo
(nop)
@@ -403,7 +403,7 @@
)
(catch $tag$3
(drop
- (pop anyref)
+ (pop funcref)
)
)
)
diff --git a/test/exception-handling.wast.fromBinary.noDebugInfo b/test/exception-handling.wast.fromBinary.noDebugInfo
index c65a216c3..08d31f361 100644
--- a/test/exception-handling.wast.fromBinary.noDebugInfo
+++ b/test/exception-handling.wast.fromBinary.noDebugInfo
@@ -3,11 +3,11 @@
(type $i32_=>_none (func (param i32)))
(type $i64_=>_none (func (param i64)))
(type $i32_i64_=>_none (func (param i32 i64)))
- (type $anyref_=>_none (func (param anyref)))
+ (type $funcref_=>_none (func (param funcref)))
(tag $tag$0 (param i32))
(tag $tag$1 (param i64))
(tag $tag$2 (param i32 i64))
- (tag $tag$3 (param anyref))
+ (tag $tag$3 (param funcref))
(tag $tag$4 (param))
(func $0
(nop)
@@ -403,7 +403,7 @@
)
(catch $tag$3
(drop
- (pop anyref)
+ (pop funcref)
)
)
)