diff options
-rw-r--r-- | src/wasm/wat-parser.cpp | 6 | ||||
-rw-r--r-- | test/lit/wat-kitchen-sink.wast | 2 |
2 files changed, 6 insertions, 2 deletions
diff --git a/src/wasm/wat-parser.cpp b/src/wasm/wat-parser.cpp index 1ee2bd2c8..e17701094 100644 --- a/src/wasm/wat-parser.cpp +++ b/src/wasm/wat-parser.cpp @@ -739,7 +739,7 @@ template<typename Ctx> struct InstrParserCtx : TypeParserCtx<Ctx> { CHECK_ERR(val); return push(pos, builder.makeUnary(op, *val)); } - Result<> makeSelect(Index pos, typename TypeParserCtx<Ctx>::ResultsT* res) { + Result<> makeSelect(Index pos, std::vector<Type>* res) { if (res && res->size() > 1) { return self().in.err(pos, "select may not have more than one result type"); @@ -750,6 +750,10 @@ template<typename Ctx> struct InstrParserCtx : TypeParserCtx<Ctx> { CHECK_ERR(ifFalse); auto ifTrue = pop(pos); CHECK_ERR(ifTrue); + auto select = builder.makeSelect(*cond, *ifTrue, *ifFalse); + if (res && !res->empty() && !Type::isSubType(select->type, res->front())) { + return self().in.err(pos, "select type annotation is incorrect"); + } return push(pos, builder.makeSelect(*cond, *ifTrue, *ifFalse)); } Result<> makeDrop(Index pos) { diff --git a/test/lit/wat-kitchen-sink.wast b/test/lit/wat-kitchen-sink.wast index 10b2287b3..a0e3c3bef 100644 --- a/test/lit/wat-kitchen-sink.wast +++ b/test/lit/wat-kitchen-sink.wast @@ -689,7 +689,7 @@ local.get 0 local.get 1 local.get 2 - select (result) (result i64) (result) + select (result) (result i32) (result) drop ) |