diff options
-rw-r--r-- | src/apply-names.cc | 7 | ||||
-rw-r--r-- | src/binary-reader-ir.cc | 15 | ||||
-rw-r--r-- | src/binary-reader-logging.cc | 15 | ||||
-rw-r--r-- | src/binary-reader-logging.h | 4 | ||||
-rw-r--r-- | src/binary-reader-nop.h | 6 | ||||
-rw-r--r-- | src/binary-reader-objdump.cc | 12 | ||||
-rw-r--r-- | src/binary-reader.cc | 4 | ||||
-rw-r--r-- | src/binary-reader.h | 4 | ||||
-rw-r--r-- | src/interp/binary-reader-interp.cc | 19 | ||||
-rw-r--r-- | src/ir.cc | 11 | ||||
-rw-r--r-- | src/resolve-names.cc | 7 | ||||
-rw-r--r-- | src/shared-validator.cc | 31 | ||||
-rw-r--r-- | src/shared-validator.h | 14 | ||||
-rw-r--r-- | src/validator.cc | 7 | ||||
-rw-r--r-- | src/wast-parser.cc | 20 | ||||
-rw-r--r-- | test/spec/bulk-memory-operations/table_init.txt | 2 | ||||
-rw-r--r-- | test/spec/reference-types/table-sub.txt | 12 | ||||
-rw-r--r-- | test/spec/reference-types/table_init.txt | 2 | ||||
-rw-r--r-- | test/typecheck/bad-bulk-memory-no-table.txt | 6 | ||||
m--------- | third_party/testsuite | 0 |
20 files changed, 140 insertions, 58 deletions
diff --git a/src/apply-names.cc b/src/apply-names.cc index ee638c9b..95868176 100644 --- a/src/apply-names.cc +++ b/src/apply-names.cc @@ -58,6 +58,7 @@ class NameApplier : public ExprVisitor::DelegateNop { Result OnDataDropExpr(DataDropExpr*) override; Result OnMemoryInitExpr(MemoryInitExpr*) override; Result OnElemDropExpr(ElemDropExpr*) override; + Result OnTableCopyExpr(TableCopyExpr*) override; Result OnTableInitExpr(TableInitExpr*) override; Result OnTableGetExpr(TableGetExpr*) override; Result OnTableSetExpr(TableSetExpr*) override; @@ -260,6 +261,12 @@ Result NameApplier::OnElemDropExpr(ElemDropExpr* expr) { return Result::Ok; } +Result NameApplier::OnTableCopyExpr(TableCopyExpr* expr) { + CHECK_RESULT(UseNameForTableVar(&expr->dst_table)); + CHECK_RESULT(UseNameForTableVar(&expr->src_table)); + return Result::Ok; +} + Result NameApplier::OnTableInitExpr(TableInitExpr* expr) { CHECK_RESULT(UseNameForElemSegmentVar(&expr->segment_index)); CHECK_RESULT(UseNameForTableVar(&expr->table_index)); diff --git a/src/binary-reader-ir.cc b/src/binary-reader-ir.cc index 0bc03ebe..c907cba5 100644 --- a/src/binary-reader-ir.cc +++ b/src/binary-reader-ir.cc @@ -205,10 +205,10 @@ class BinaryReaderIR : public BinaryReaderNop { Result OnElemSegmentCount(Index count) override; Result BeginElemSegment(Index index, Index table_index, - uint8_t flags, - Type elem_type) override; + uint8_t flags) override; Result BeginElemSegmentInitExpr(Index index) override; Result EndElemSegmentInitExpr(Index index) override; + Result OnElemSegmentElemType(Index index, Type elem_type) override; Result OnElemSegmentElemExprCount(Index index, Index count) override; Result OnElemSegmentElemExpr_RefNull(Index segment_index) override; Result OnElemSegmentElemExpr_RefFunc(Index segment_index, @@ -1022,8 +1022,7 @@ Result BinaryReaderIR::OnElemSegmentCount(Index count) { Result BinaryReaderIR::BeginElemSegment(Index index, Index table_index, - uint8_t flags, - Type elem_type) { + uint8_t flags) { auto field = MakeUnique<ElemSegmentModuleField>(GetLocation()); ElemSegment& elem_segment = field->elem_segment; elem_segment.table_var = Var(table_index, GetLocation()); @@ -1034,7 +1033,6 @@ Result BinaryReaderIR::BeginElemSegment(Index index, } else { elem_segment.kind = SegmentKind::Active; } - elem_segment.elem_type = elem_type; module_->AppendField(std::move(field)); return Result::Ok; } @@ -1051,6 +1049,13 @@ Result BinaryReaderIR::EndElemSegmentInitExpr(Index index) { return Result::Ok; } +Result BinaryReaderIR::OnElemSegmentElemType(Index index, Type elem_type) { + assert(index == module_->elem_segments.size() - 1); + ElemSegment* segment = module_->elem_segments[index]; + segment->elem_type = elem_type; + return Result::Ok; +} + Result BinaryReaderIR::OnElemSegmentElemExprCount(Index index, Index count) { assert(index == module_->elem_segments.size() - 1); ElemSegment* segment = module_->elem_segments[index]; diff --git a/src/binary-reader-logging.cc b/src/binary-reader-logging.cc index 5ee062ed..81ddfbe9 100644 --- a/src/binary-reader-logging.cc +++ b/src/binary-reader-logging.cc @@ -368,12 +368,17 @@ Result BinaryReaderLogging::OnSimdShuffleOpExpr(Opcode opcode, v128 value) { Result BinaryReaderLogging::BeginElemSegment(Index index, Index table_index, - uint8_t flags, - Type elem_type) { + uint8_t flags) { LOGF("BeginElemSegment(index: %" PRIindex ", table_index: %" PRIindex - ", flags: %d, elem_type: %s)\n", - index, table_index, flags, GetTypeName(elem_type)); - return reader_->BeginElemSegment(index, table_index, flags, elem_type); + ", flags: %d)\n", + index, table_index, flags); + return reader_->BeginElemSegment(index, table_index, flags); +} + +Result BinaryReaderLogging::OnElemSegmentElemType(Index index, Type elem_type) { + LOGF("OnElemSegmentElemType(index: %" PRIindex ", type: %s)\n", index, + GetTypeName(elem_type)); + return reader_->OnElemSegmentElemType(index, elem_type); } Result BinaryReaderLogging::OnDataSegmentData(Index index, diff --git a/src/binary-reader-logging.h b/src/binary-reader-logging.h index 9e12d434..facc8d5d 100644 --- a/src/binary-reader-logging.h +++ b/src/binary-reader-logging.h @@ -231,10 +231,10 @@ class BinaryReaderLogging : public BinaryReaderDelegate { Result OnElemSegmentCount(Index count) override; Result BeginElemSegment(Index index, Index table_index, - uint8_t flags, - Type elem_type) override; + uint8_t flags) override; Result BeginElemSegmentInitExpr(Index index) override; Result EndElemSegmentInitExpr(Index index) override; + Result OnElemSegmentElemType(Index index, Type elem_type) override; Result OnElemSegmentElemExprCount(Index index, Index count) override; Result OnElemSegmentElemExpr_RefNull(Index segment_index) override; Result OnElemSegmentElemExpr_RefFunc(Index segment_index, diff --git a/src/binary-reader-nop.h b/src/binary-reader-nop.h index 2426103d..0124858c 100644 --- a/src/binary-reader-nop.h +++ b/src/binary-reader-nop.h @@ -302,12 +302,14 @@ class BinaryReaderNop : public BinaryReaderDelegate { Result OnElemSegmentCount(Index count) override { return Result::Ok; } Result BeginElemSegment(Index index, Index table_index, - uint8_t flags, - Type elem_type) override { + uint8_t flags) override { return Result::Ok; } Result BeginElemSegmentInitExpr(Index index) override { return Result::Ok; } Result EndElemSegmentInitExpr(Index index) override { return Result::Ok; } + Result OnElemSegmentElemType(Index index, Type elem_type) override { + return Result::Ok; + } Result OnElemSegmentElemExprCount(Index index, Index count) override { return Result::Ok; } diff --git a/src/binary-reader-objdump.cc b/src/binary-reader-objdump.cc index 6b80849a..a1c919ec 100644 --- a/src/binary-reader-objdump.cc +++ b/src/binary-reader-objdump.cc @@ -799,8 +799,8 @@ class BinaryReaderObjdump : public BinaryReaderObjdumpBase { Result OnElemSegmentCount(Index count) override; Result BeginElemSegment(Index index, Index table_index, - uint8_t flags, - Type elem_type) override; + uint8_t flags) override; + Result OnElemSegmentElemType(Index index, Type elem_type) override; Result OnElemSegmentElemExprCount(Index index, Index count) override; Result OnElemSegmentElemExpr_RefNull(Index segment_index) override; Result OnElemSegmentElemExpr_RefFunc(Index segment_index, @@ -1273,14 +1273,18 @@ Result BinaryReaderObjdump::OnElemSegmentCount(Index count) { Result BinaryReaderObjdump::BeginElemSegment(Index index, Index table_index, - uint8_t flags, - Type elem_type) { + uint8_t flags) { table_index_ = table_index; elem_index_ = 0; elem_flags_ = flags; return Result::Ok; } +Result BinaryReaderObjdump::OnElemSegmentElemType(Index index, Type elem_type) { + // TODO: Add support for this. + return Result::Ok; +} + Result BinaryReaderObjdump::OnElemSegmentElemExprCount(Index index, Index count) { PrintDetails(" - segment[%" PRIindex "] flags=%d table=%" PRIindex diff --git a/src/binary-reader.cc b/src/binary-reader.cc index 74fd3a67..6041145b 100644 --- a/src/binary-reader.cc +++ b/src/binary-reader.cc @@ -2220,7 +2220,7 @@ Result BinaryReader::ReadElemSection(Offset section_size) { } Type elem_type = Type::Funcref; - CALLBACK(BeginElemSegment, i, table_index, flags, elem_type); + CALLBACK(BeginElemSegment, i, table_index, flags); if (!(flags & SegPassive)) { CALLBACK(BeginElemSegmentInitExpr, i); @@ -2245,6 +2245,8 @@ Result BinaryReader::ReadElemSection(Offset section_size) { } } + CALLBACK(OnElemSegmentElemType, i, elem_type); + Index num_elem_exprs; CHECK_RESULT(ReadCount(&num_elem_exprs, "elem count")); diff --git a/src/binary-reader.h b/src/binary-reader.h index b5f97a8f..67e2c80c 100644 --- a/src/binary-reader.h +++ b/src/binary-reader.h @@ -287,10 +287,10 @@ class BinaryReaderDelegate { virtual Result OnElemSegmentCount(Index count) = 0; virtual Result BeginElemSegment(Index index, Index table_index, - uint8_t flags, - Type elem_type) = 0; + uint8_t flags) = 0; virtual Result BeginElemSegmentInitExpr(Index index) = 0; virtual Result EndElemSegmentInitExpr(Index index) = 0; + virtual Result OnElemSegmentElemType(Index index, Type elem_type) = 0; virtual Result OnElemSegmentElemExprCount(Index index, Index count) = 0; virtual Result OnElemSegmentElemExpr_RefNull(Index segment_index) = 0; virtual Result OnElemSegmentElemExpr_RefFunc(Index segment_index, diff --git a/src/interp/binary-reader-interp.cc b/src/interp/binary-reader-interp.cc index 5e442b61..8149907c 100644 --- a/src/interp/binary-reader-interp.cc +++ b/src/interp/binary-reader-interp.cc @@ -221,9 +221,9 @@ class BinaryReaderInterp : public BinaryReaderNop { wabt::Result OnElemSegmentCount(Index count) override; wabt::Result BeginElemSegment(Index index, Index table_index, - uint8_t flags, - Type elem_type) override; + uint8_t flags) override; wabt::Result EndElemSegmentInitExpr(Index index) override; + wabt::Result OnElemSegmentElemType(Index index, Type elem_type) override; wabt::Result OnElemSegmentElemExprCount(Index index, Index count) override; wabt::Result OnElemSegmentElemExpr_RefNull(Index segment_index) override; wabt::Result OnElemSegmentElemExpr_RefFunc(Index segment_index, @@ -692,13 +692,12 @@ wabt::Result BinaryReaderInterp::OnElemSegmentCount(Index count) { wabt::Result BinaryReaderInterp::BeginElemSegment(Index index, Index table_index, - uint8_t flags, - Type elem_type) { + uint8_t flags) { auto mode = ToSegmentMode(flags); - CHECK_RESULT(validator_.OnElemSegment(loc, Var(table_index), mode, elem_type)); + CHECK_RESULT(validator_.OnElemSegment(loc, Var(table_index), mode)); ElemDesc desc; - desc.type = elem_type; + desc.type = ValueType::Void; // Initialized later in OnElemSegmentElemType. desc.mode = mode; desc.table_index = table_index; module_.elems.push_back(desc); @@ -727,6 +726,14 @@ wabt::Result BinaryReaderInterp::EndElemSegmentInitExpr(Index index) { return wabt::Result::Ok; } +wabt::Result BinaryReaderInterp::OnElemSegmentElemType(Index index, + Type elem_type) { + validator_.OnElemSegmentElemType(elem_type); + ElemDesc& elem = module_.elems.back(); + elem.type = elem_type; + return wabt::Result::Ok; +} + wabt::Result BinaryReaderInterp::OnElemSegmentElemExprCount(Index index, Index count) { ElemDesc& elem = module_.elems.back(); @@ -653,6 +653,8 @@ Const::Const(V128Tag, v128 value, const Location& loc_) uint8_t ElemSegment::GetFlags(const Module* module) const { uint8_t flags = 0; + bool all_ref_func = elem_type == Type::Funcref; + switch (kind) { case SegmentKind::Active: { Index table_index = module->GetTableIndex(table_var); @@ -671,10 +673,11 @@ uint8_t ElemSegment::GetFlags(const Module* module) const { break; } - bool all_ref_func = std::all_of( - elem_exprs.begin(), elem_exprs.end(), [](const ElemExpr& elem_expr) { - return elem_expr.kind == ElemExprKind::RefFunc; - }); + all_ref_func = all_ref_func && + std::all_of(elem_exprs.begin(), elem_exprs.end(), + [](const ElemExpr& elem_expr) { + return elem_expr.kind == ElemExprKind::RefFunc; + }); if (!all_ref_func) { flags |= SegUseElemExprs; } diff --git a/src/resolve-names.cc b/src/resolve-names.cc index 2dff2a62..59bb0493 100644 --- a/src/resolve-names.cc +++ b/src/resolve-names.cc @@ -58,6 +58,7 @@ class NameResolver : public ExprVisitor::DelegateNop { Result OnDataDropExpr(DataDropExpr*) override; Result OnMemoryInitExpr(MemoryInitExpr*) override; Result OnElemDropExpr(ElemDropExpr*) override; + Result OnTableCopyExpr(TableCopyExpr*) override; Result OnTableInitExpr(TableInitExpr*) override; Result OnTableGetExpr(TableGetExpr*) override; Result OnTableSetExpr(TableSetExpr*) override; @@ -354,6 +355,12 @@ Result NameResolver::OnElemDropExpr(ElemDropExpr* expr) { return Result::Ok; } +Result NameResolver::OnTableCopyExpr(TableCopyExpr* expr) { + ResolveTableVar(&expr->dst_table); + ResolveTableVar(&expr->src_table); + return Result::Ok; +} + Result NameResolver::OnTableInitExpr(TableInitExpr* expr) { ResolveElemSegmentVar(&expr->segment_index); ResolveTableVar(&expr->table_index); diff --git a/src/shared-validator.cc b/src/shared-validator.cc index 708d6189..e286dc96 100644 --- a/src/shared-validator.cc +++ b/src/shared-validator.cc @@ -287,16 +287,19 @@ Result SharedValidator::OnStart(const Location& loc, Var func_var) { Result SharedValidator::OnElemSegment(const Location& loc, Var table_var, - SegmentKind kind, - Type elem_type) { + SegmentKind kind) { Result result = Result::Ok; if (kind == SegmentKind::Active) { result |= CheckTableIndex(table_var); } - ++elem_segments_; + elems_.push_back(ElemType{Type::Void}); // Updated in OnElemSegmentElemType. return result; } +void SharedValidator::OnElemSegmentElemType(Type elem_type) { + elems_.back().element = elem_type; +} + Result SharedValidator::OnElemSegmentInitExpr_Const(const Location& loc, Type type) { return CheckType(loc, type, Type::I32, "elem segment offset"); @@ -450,8 +453,7 @@ Result SharedValidator::CheckMemoryIndex(Var memory_var, MemoryType* out) { } // TODO: Remove; this is only used to match previous error output. -Result SharedValidator::CheckMemoryIndex(Var memory_var, - Opcode opcode) { +Result SharedValidator::CheckMemoryIndex(Var memory_var, Opcode opcode) { if (memory_var.index() >= memories_.size()) { return PrintError(memory_var.loc, "%s requires an imported or defined memory.", @@ -483,8 +485,9 @@ Result SharedValidator::CheckEventIndex(Var event_var, EventType* out) { return CheckIndexWithValue(event_var, events_, out, "event"); } -Result SharedValidator::CheckElemSegmentIndex(Var elem_segment_var) { - return CheckIndex(elem_segment_var, elem_segments_, "elem_segment"); +Result SharedValidator::CheckElemSegmentIndex(Var elem_segment_var, + ElemType* out) { + return CheckIndexWithValue(elem_segment_var, elems_, out, "elem_segment"); } Result SharedValidator::CheckDataSegmentIndex(Var data_segment_var) { @@ -1052,9 +1055,12 @@ Result SharedValidator::OnTableCopy(const Location& loc, Var src_var) { Result result = Result::Ok; expr_loc_ = &loc; - result |= CheckTableIndex(dst_var, Opcode::TableCopy); - result |= CheckTableIndex(src_var, Opcode::TableCopy); + TableType dst_table; + TableType src_table; + result |= CheckTableIndex(dst_var, &dst_table); + result |= CheckTableIndex(src_var, &src_table); result |= typechecker_.OnTableCopy(); + result |= CheckType(loc, src_table.element, dst_table.element, "table.copy"); return result; } @@ -1090,9 +1096,12 @@ Result SharedValidator::OnTableInit(const Location& loc, Var table_var) { Result result = Result::Ok; expr_loc_ = &loc; - result |= CheckTableIndex(table_var, Opcode::TableInit); - result |= CheckElemSegmentIndex(segment_var); + TableType table_type; + ElemType elem_type; + result |= CheckTableIndex(table_var, &table_type); + result |= CheckElemSegmentIndex(segment_var, &elem_type); result |= typechecker_.OnTableInit(table_var.index(), segment_var.index()); + result |= CheckType(loc, elem_type.element, table_type.element, "table.init"); return result; } diff --git a/src/shared-validator.h b/src/shared-validator.h index 2143c1fa..3e2035e9 100644 --- a/src/shared-validator.h +++ b/src/shared-validator.h @@ -84,7 +84,8 @@ class SharedValidator { Result OnStart(const Location&, Var func_var); - Result OnElemSegment(const Location&, Var table_var, SegmentKind, Type elem_type); + Result OnElemSegment(const Location&, Var table_var, SegmentKind); + void OnElemSegmentElemType(Type elem_type); Result OnElemSegmentInitExpr_Const(const Location&, Type); Result OnElemSegmentInitExpr_GlobalGet(const Location&, Var global_var); Result OnElemSegmentInitExpr_Other(const Location&); @@ -200,6 +201,13 @@ class SharedValidator { TypeVector params; }; + struct ElemType { + ElemType() = default; + ElemType(Type element) : element(element) {} + + Type element; + }; + struct LocalDecl { Type type; Index end; @@ -232,7 +240,7 @@ class SharedValidator { Result CheckMemoryIndex(Var memory_var, Opcode); Result CheckGlobalIndex(Var global_var, GlobalType* out = nullptr); Result CheckEventIndex(Var event_var, EventType* out = nullptr); - Result CheckElemSegmentIndex(Var elem_segment_var); + Result CheckElemSegmentIndex(Var elem_segment_var, ElemType* out = nullptr); Result CheckDataSegmentIndex(Var data_segment_var); Result CheckAlign(const Location&, Address align, Address natural_align); @@ -258,9 +266,9 @@ class SharedValidator { std::vector<MemoryType> memories_; // Includes imported and defined. std::vector<GlobalType> globals_; // Includes imported and defined. std::vector<EventType> events_; // Includes imported and defined. + std::vector<ElemType> elems_; Index starts_ = 0; Index num_imported_globals_ = 0; - Index elem_segments_ = 0; Index data_segments_ = 0; // Includes parameters, since this is only used for validating diff --git a/src/validator.cc b/src/validator.cc index ce25df9e..7498ca40 100644 --- a/src/validator.cc +++ b/src/validator.cc @@ -731,9 +731,10 @@ Result Validator::CheckModule() { // Elem segment section. for (const ModuleField& field : module->fields) { if (auto* f = dyn_cast<ElemSegmentModuleField>(&field)) { - result_ |= validator_.OnElemSegment( - field.loc, f->elem_segment.table_var, f->elem_segment.kind, - f->elem_segment.elem_type); + result_ |= validator_.OnElemSegment(field.loc, f->elem_segment.table_var, + f->elem_segment.kind); + + validator_.OnElemSegmentElemType(f->elem_segment.elem_type); // Init expr. if (f->elem_segment.offset.size() == 1) { diff --git a/src/wast-parser.cc b/src/wast-parser.cc index 3468e008..3075ee91 100644 --- a/src/wast-parser.cc +++ b/src/wast-parser.cc @@ -1820,11 +1820,8 @@ Result WastParser::ParsePlainInstr(std::unique_ptr<Expr>* out_expr) { Var dst(0, loc); Var src(0, loc); if (options_->features.reference_types_enabled()) { - // TODO: disabled for now, since the spec tests don't currently use. -#if 0 - CHECK_RESULT(ParseVar(&dst)); - CHECK_RESULT(ParseVar(&src)); -#endif + ParseVarOpt(&dst, dst); + ParseVarOpt(&src, src); } out_expr->reset(new TableCopyExpr(dst, src, loc)); break; @@ -1840,6 +1837,15 @@ Result WastParser::ParsePlainInstr(std::unique_ptr<Expr>* out_expr) { Var segment_index(0, loc); CHECK_RESULT(ParseVar(&segment_index)); Var table_index(0, loc); + if (ParseVarOpt(&table_index, table_index)) { + // Here are the two forms: + // + // table.init $elemidx ... + // table.init $tableidx $elemidx ... + // + // So if both indexes are provided, we need to swap them. + std::swap(segment_index, table_index); + } out_expr->reset(new TableInitExpr(segment_index, table_index, loc)); break; } @@ -1851,21 +1857,25 @@ Result WastParser::ParsePlainInstr(std::unique_ptr<Expr>* out_expr) { case TokenType::TableSet: ErrorUnlessOpcodeEnabled(Consume()); + // TODO: Table index. CHECK_RESULT(ParsePlainInstrVar<TableSetExpr>(loc, out_expr)); break; case TokenType::TableGrow: ErrorUnlessOpcodeEnabled(Consume()); + // TODO: Table index. CHECK_RESULT(ParsePlainInstrVar<TableGrowExpr>(loc, out_expr)); break; case TokenType::TableSize: ErrorUnlessOpcodeEnabled(Consume()); + // TODO: Table index. CHECK_RESULT(ParsePlainInstrVar<TableSizeExpr>(loc, out_expr)); break; case TokenType::TableFill: ErrorUnlessOpcodeEnabled(Consume()); + // TODO: Table index. CHECK_RESULT(ParsePlainInstrVar<TableFillExpr>(loc, out_expr)); break; diff --git a/test/spec/bulk-memory-operations/table_init.txt b/test/spec/bulk-memory-operations/table_init.txt index 4ddc3581..1f08758a 100644 --- a/test/spec/bulk-memory-operations/table_init.txt +++ b/test/spec/bulk-memory-operations/table_init.txt @@ -59,7 +59,7 @@ out/test/spec/bulk-memory-operations/table_init.wast:193: assert_invalid passed: 0000000: error: elem_segment variable out of range: 0 (max 4294967295) 0000024: error: OnElemDropExpr callback failed out/test/spec/bulk-memory-operations/table_init.wast:199: assert_invalid passed: - 0000000: error: table.init requires table 0 to be an imported or defined table. + 0000000: error: table variable out of range: 0 (max 4294967295) 0000000: error: elem_segment variable out of range: 0 (max 4294967295) 000002b: error: OnTableInitExpr callback failed out/test/spec/bulk-memory-operations/table_init.wast:205: assert_invalid passed: diff --git a/test/spec/reference-types/table-sub.txt b/test/spec/reference-types/table-sub.txt new file mode 100644 index 00000000..5b14f2fb --- /dev/null +++ b/test/spec/reference-types/table-sub.txt @@ -0,0 +1,12 @@ +;;; TOOL: run-interp-spec +;;; STDIN_FILE: third_party/testsuite/proposals/reference-types/table-sub.wast +;;; ARGS*: --enable-reference-types +(;; STDOUT ;;; +out/test/spec/reference-types/table-sub.wast:12: assert_invalid passed: + error: type mismatch at table.copy. got anyref, expected funcref + 000002a: error: OnTableCopyExpr callback failed +out/test/spec/reference-types/table-sub.wast:23: assert_invalid passed: + error: type mismatch at table.init. got anyref, expected funcref + 000002d: error: OnTableInitExpr callback failed +2/2 tests passed. +;;; STDOUT ;;) diff --git a/test/spec/reference-types/table_init.txt b/test/spec/reference-types/table_init.txt index 52e80050..d2aefc79 100644 --- a/test/spec/reference-types/table_init.txt +++ b/test/spec/reference-types/table_init.txt @@ -59,7 +59,7 @@ out/test/spec/reference-types/table_init.wast:193: assert_invalid passed: 0000000: error: elem_segment variable out of range: 0 (max 4294967295) 0000024: error: OnElemDropExpr callback failed out/test/spec/reference-types/table_init.wast:199: assert_invalid passed: - 0000000: error: table.init requires table 0 to be an imported or defined table. + 0000000: error: table variable out of range: 0 (max 4294967295) 0000000: error: elem_segment variable out of range: 0 (max 4294967295) 000002b: error: OnTableInitExpr callback failed out/test/spec/reference-types/table_init.wast:205: assert_invalid passed: diff --git a/test/typecheck/bad-bulk-memory-no-table.txt b/test/typecheck/bad-bulk-memory-no-table.txt index 21e97f07..a3dd1a0d 100644 --- a/test/typecheck/bad-bulk-memory-no-table.txt +++ b/test/typecheck/bad-bulk-memory-no-table.txt @@ -9,16 +9,16 @@ ) ) (;; STDERR ;;; -out/test/typecheck/bad-bulk-memory-no-table.txt:7:41: error: table.init requires table 0 to be an imported or defined table. +out/test/typecheck/bad-bulk-memory-no-table.txt:7:41: error: table variable out of range: 0 (max 4294967295) i32.const 0 i32.const 0 i32.const 0 table.init 0 ^^^^^^^^^^ out/test/typecheck/bad-bulk-memory-no-table.txt:7:52: error: elem_segment variable out of range: 0 (max 4294967295) i32.const 0 i32.const 0 i32.const 0 table.init 0 ^ -out/test/typecheck/bad-bulk-memory-no-table.txt:8:41: error: table.copy requires table 0 to be an imported or defined table. +out/test/typecheck/bad-bulk-memory-no-table.txt:8:41: error: table variable out of range: 0 (max 4294967295) i32.const 0 i32.const 0 i32.const 0 table.copy ^^^^^^^^^^ -out/test/typecheck/bad-bulk-memory-no-table.txt:8:41: error: table.copy requires table 0 to be an imported or defined table. +out/test/typecheck/bad-bulk-memory-no-table.txt:8:41: error: table variable out of range: 0 (max 4294967295) i32.const 0 i32.const 0 i32.const 0 table.copy ^^^^^^^^^^ ;;; STDERR ;;) diff --git a/third_party/testsuite b/third_party/testsuite -Subproject f261b73e7a47863866b57e97f8cab83eefdc2fd +Subproject 1b45c074228bc47f5f1c718a0929e7a3a2c5bb2 |