From 64d889235799e4e59aa860b0a072eb342b6d7aad Mon Sep 17 00:00:00 2001 From: Zoltan Herczeg Date: Tue, 8 Apr 2025 08:03:59 +0000 Subject: [PATCH] Support table initializer expressions; completes function references support --- README.md | 2 + include/wabt/binary-reader-logging.h | 10 +- include/wabt/binary-reader-nop.h | 10 +- include/wabt/binary-reader.h | 15 +- include/wabt/interp/interp-inl.h | 10 +- include/wabt/interp/interp.h | 9 +- include/wabt/ir.h | 3 +- include/wabt/shared-validator.h | 7 +- src/apply-names.cc | 8 + src/binary-reader-ir.cc | 26 +- src/binary-reader-logging.cc | 12 +- src/binary-reader-objdump.cc | 31 +- src/binary-reader.cc | 53 ++- src/binary-writer.cc | 12 +- src/interp/binary-reader-interp.cc | 42 +- src/interp/interp-wasm-c-api.cc | 3 +- src/interp/interp.cc | 43 +- src/ir.cc | 24 +- src/resolve-names.cc | 9 + src/shared-validator.cc | 22 +- src/test-interp.cc | 13 +- src/tools/spectest-interp.cc | 9 +- src/validator.cc | 30 +- src/wast-parser.cc | 17 +- src/wat-writer.cc | 3 +- test/dump/call_ref.txt | 2 +- test/dump/relocations-all-features.txt | 53 ++- test/dump/typed_func_refs_params.txt | 2 +- test/dump/typed_func_refs_results.txt | 2 +- test/roundtrip/fold-callref.txt | 2 +- test/spec/function-references/binary.txt | 238 ++++++++++ test/spec/function-references/data.txt | 66 +++ test/spec/function-references/elem.txt | 90 ++++ test/spec/function-references/global.txt | 4 +- test/spec/function-references/if.txt | 409 ++++++++++++++++++ test/spec/function-references/linking.txt | 118 +++++ test/spec/function-references/local_get.txt | 54 +++ test/spec/function-references/ref.txt | 2 +- test/spec/function-references/ref_is_null.txt | 14 + test/spec/function-references/ref_null.txt | 6 + test/spec/function-references/return_call.txt | 39 ++ .../return_call_indirect.txt | 124 ++++++ test/spec/function-references/select.txt | 102 +++++ test/spec/function-references/table-sub.txt | 12 + test/spec/function-references/table.txt | 75 ++++ .../function-references/unreached-invalid.txt | 371 ++++++++++++++++ .../function-references/unreached-valid.txt | 16 + test/spec/memory64/table.txt | 8 +- test/spec/table.txt | 4 +- test/update-spec-tests.py | 2 +- 50 files changed, 2103 insertions(+), 135 deletions(-) create mode 100644 test/spec/function-references/binary.txt create mode 100644 test/spec/function-references/data.txt create mode 100644 test/spec/function-references/elem.txt create mode 100644 test/spec/function-references/if.txt create mode 100644 test/spec/function-references/linking.txt create mode 100644 test/spec/function-references/local_get.txt create mode 100644 test/spec/function-references/ref_is_null.txt create mode 100644 test/spec/function-references/ref_null.txt create mode 100644 test/spec/function-references/return_call.txt create mode 100644 test/spec/function-references/return_call_indirect.txt create mode 100644 test/spec/function-references/select.txt create mode 100644 test/spec/function-references/table-sub.txt create mode 100644 test/spec/function-references/table.txt create mode 100644 test/spec/function-references/unreached-invalid.txt create mode 100644 test/spec/function-references/unreached-valid.txt diff --git a/README.md b/README.md index d35ab0f1cb..b59b1c98ac 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,7 @@ Wabt has been compiled to JavaScript via emscripten. Some of the functionality i | [extended-const][] | `--enable-extended-const` | | ✓ | ✓ | ✓ | ✓ | ✓ | | [relaxed-simd][] | `--enable-relaxed-simd` | | ✓ | ✓ | ✓ | ✓ | | | [custom-page-sizes][] | `--enable-custom-page-sizes`| | ✓ | ✓ | ✓ | ✓ | ✓ | +| [function-references][] | `--enable-function-references` | | ✓ | ✓ | ✓ | ✓ | | [exception handling]: https://github.com/WebAssembly/exception-handling [mutable globals]: https://github.com/WebAssembly/mutable-global @@ -80,6 +81,7 @@ Wabt has been compiled to JavaScript via emscripten. Some of the functionality i [extended-const]: https://github.com/WebAssembly/extended-const [relaxed-simd]: https://github.com/WebAssembly/relaxed-simd [custom-page-sizes]: https://github.com/WebAssembly/custom-page-sizes +[function-references]: https://github.com/WebAssembly/function-references ## Cloning diff --git a/include/wabt/binary-reader-logging.h b/include/wabt/binary-reader-logging.h index bd7ff33fe1..ece3c469d0 100644 --- a/include/wabt/binary-reader-logging.h +++ b/include/wabt/binary-reader-logging.h @@ -96,9 +96,13 @@ class BinaryReaderLogging : public BinaryReaderDelegate { Result BeginTableSection(Offset size) override; Result OnTableCount(Index count) override; - Result OnTable(Index index, - Type elem_type, - const Limits* elem_limits) override; + Result BeginTable(Index index, + Type elem_type, + const Limits* elem_limits, + TableInitExprStatus init_provided) override; + Result BeginTableInitExpr(Index index) override; + Result EndTableInitExpr(Index index) override; + Result EndTable(Index index) override; Result EndTableSection() override; Result BeginMemorySection(Offset size) override; diff --git a/include/wabt/binary-reader-nop.h b/include/wabt/binary-reader-nop.h index 545db127b2..359cf9cdf0 100644 --- a/include/wabt/binary-reader-nop.h +++ b/include/wabt/binary-reader-nop.h @@ -121,11 +121,15 @@ class BinaryReaderNop : public BinaryReaderDelegate { /* Table section */ Result BeginTableSection(Offset size) override { return Result::Ok; } Result OnTableCount(Index count) override { return Result::Ok; } - Result OnTable(Index index, - Type elem_type, - const Limits* elem_limits) override { + Result BeginTable(Index index, + Type elem_type, + const Limits* elem_limits, + TableInitExprStatus init_provided) override { return Result::Ok; } + Result BeginTableInitExpr(Index index) override { return Result::Ok; } + Result EndTableInitExpr(Index index) override { return Result::Ok; } + Result EndTable(Index index) override { return Result::Ok; } Result EndTableSection() override { return Result::Ok; } /* Memory section */ diff --git a/include/wabt/binary-reader.h b/include/wabt/binary-reader.h index 96455f2251..fdec07a79b 100644 --- a/include/wabt/binary-reader.h +++ b/include/wabt/binary-reader.h @@ -66,6 +66,11 @@ struct CatchClause { }; using CatchClauseVector = std::vector; +enum class TableInitExprStatus { + TableWithInitExpression, + TableWithoutInitExpression, +}; + class BinaryReaderDelegate { public: struct State { @@ -156,9 +161,13 @@ class BinaryReaderDelegate { /* Table section */ virtual Result BeginTableSection(Offset size) = 0; virtual Result OnTableCount(Index count) = 0; - virtual Result OnTable(Index index, - Type elem_type, - const Limits* elem_limits) = 0; + virtual Result BeginTable(Index index, + Type elem_type, + const Limits* elem_limits, + TableInitExprStatus init_provided) = 0; + virtual Result BeginTableInitExpr(Index index) = 0; + virtual Result EndTableInitExpr(Index index) = 0; + virtual Result EndTable(Index index) = 0; virtual Result EndTableSection() = 0; /* Memory section */ diff --git a/include/wabt/interp/interp-inl.h b/include/wabt/interp/interp-inl.h index 074fc9fc9f..6125999a9b 100644 --- a/include/wabt/interp/interp-inl.h +++ b/include/wabt/interp/interp-inl.h @@ -422,12 +422,6 @@ void RequireType(ValueType type) { assert(HasType(type)); } -inline bool TypesMatch(ValueType expected, ValueType actual) { - // Currently there is no subtyping, so expected and actual must match - // exactly. In the future this may be expanded. - return expected == actual; -} - //// Value //// inline Value WABT_VECTORCALL Value::Make(s32 val) { Value res; res.i32_ = val; res.SetType(ValueType::I32); return res; } inline Value WABT_VECTORCALL Value::Make(u32 val) { Value res; res.i32_ = val; res.SetType(ValueType::I32); return res; } @@ -682,8 +676,8 @@ inline bool Table::classof(const Object* obj) { } // static -inline Table::Ptr Table::New(Store& store, TableType type) { - return store.Alloc(store, type); +inline Table::Ptr Table::New(Store& store, TableType type, Ref init_ref) { + return store.Alloc
(store, type, init_ref); } inline const ExternType& Table::extern_type() { diff --git a/include/wabt/interp/interp.h b/include/wabt/interp/interp.h index 4e376eb327..42e6a6b8bb 100644 --- a/include/wabt/interp/interp.h +++ b/include/wabt/interp/interp.h @@ -157,6 +157,10 @@ using u32x2 = Simd; //// Types //// +bool TypesMatch(ValueType expected, ValueType actual); + +//// Limits //// + bool CanGrow(const Limits&, u32 old_size, u32 delta, u32* new_size); Result Match(const Limits& expected, const Limits& actual, @@ -334,6 +338,7 @@ struct FuncDesc { struct TableDesc { TableType type; + FuncDesc init_func; }; struct MemoryDesc { @@ -818,7 +823,7 @@ class Table : public Extern { static const char* GetTypeName() { return "Table"; } using Ptr = RefPtr
; - static Table::Ptr New(Store&, TableType); + static Table::Ptr New(Store&, TableType, Ref); Result Match(Store&, const ImportType&, Trap::Ptr* out_trap) override; @@ -850,7 +855,7 @@ class Table : public Extern { private: friend Store; - explicit Table(Store&, TableType); + explicit Table(Store&, TableType, Ref); void Mark(Store&) override; TableType type_; diff --git a/include/wabt/ir.h b/include/wabt/ir.h index 9102297dc8..c5ca49dc8b 100644 --- a/include/wabt/ir.h +++ b/include/wabt/ir.h @@ -987,13 +987,14 @@ struct Table { std::string name; Limits elem_limits; Type elem_type; + ExprList init_expr; }; using ExprListVector = std::vector; struct ElemSegment { explicit ElemSegment(std::string_view name) : name(name) {} - uint8_t GetFlags(const Module*) const; + uint8_t GetFlags(const Module*, bool function_references_enabled) const; SegmentKind kind = SegmentKind::Active; std::string name; diff --git a/include/wabt/shared-validator.h b/include/wabt/shared-validator.h index f972500d66..b333533bc8 100644 --- a/include/wabt/shared-validator.h +++ b/include/wabt/shared-validator.h @@ -40,6 +40,11 @@ struct ValidateOptions { Features features; }; +enum class TableImportStatus { + TableIsImported, + TableIsNotImported, +}; + class SharedValidator { public: WABT_DISALLOW_COPY_AND_ASSIGN(SharedValidator); @@ -75,7 +80,7 @@ class SharedValidator { Result OnArrayType(const Location&, TypeMut field); Result OnFunction(const Location&, Var sig_var); - Result OnTable(const Location&, Type elem_type, const Limits&); + Result OnTable(const Location&, Type elem_type, const Limits&, TableImportStatus import_status, TableInitExprStatus init_provided); Result OnMemory(const Location&, const Limits&, uint32_t page_size); Result OnGlobalImport(const Location&, Type type, bool mutable_); Result OnGlobal(const Location&, Type type, bool mutable_); diff --git a/src/apply-names.cc b/src/apply-names.cc index 3d25749ccd..ab91fa42a4 100644 --- a/src/apply-names.cc +++ b/src/apply-names.cc @@ -102,6 +102,7 @@ class NameApplier : public ExprVisitor::DelegateNop { Result VisitGlobal(Global* global); Result VisitTag(Tag* tag); Result VisitExport(Index export_index, Export* export_); + Result VisitTable(Table* table); Result VisitElemSegment(Index elem_segment_index, ElemSegment* segment); Result VisitDataSegment(Index data_segment_index, DataSegment* segment); Result VisitStart(Var* start_var); @@ -559,6 +560,11 @@ Result NameApplier::VisitExport(Index export_index, Export* export_) { return Result::Ok; } +Result NameApplier::VisitTable(Table* table) { + CHECK_RESULT(visitor_.VisitExprList(table->init_expr)); + return Result::Ok; +} + Result NameApplier::VisitElemSegment(Index elem_segment_index, ElemSegment* segment) { CHECK_RESULT(UseNameForTableVar(&segment->table_var)); @@ -594,6 +600,8 @@ Result NameApplier::VisitModule(Module* module) { CHECK_RESULT(VisitTag(module->tags[i])); for (size_t i = 0; i < module->exports.size(); ++i) CHECK_RESULT(VisitExport(i, module->exports[i])); + for (size_t i = 0; i < module->tables.size(); ++i) + CHECK_RESULT(VisitTable(module->tables[i])); for (size_t i = 0; i < module->elem_segments.size(); ++i) CHECK_RESULT(VisitElemSegment(i, module->elem_segments[i])); for (size_t i = 0; i < module->data_segments.size(); ++i) diff --git a/src/binary-reader-ir.cc b/src/binary-reader-ir.cc index bf5c01201d..a04f8e2dd4 100644 --- a/src/binary-reader-ir.cc +++ b/src/binary-reader-ir.cc @@ -144,9 +144,12 @@ class BinaryReaderIR : public BinaryReaderNop { Result OnFunction(Index index, Index sig_index) override; Result OnTableCount(Index count) override; - Result OnTable(Index index, - Type elem_type, - const Limits* elem_limits) override; + Result BeginTable(Index index, + Type elem_type, + const Limits* elem_limits, + TableInitExprStatus init_provided) override; + Result BeginTableInitExpr(Index index) override; + Result EndTableInitExpr(Index index) override; Result OnMemoryCount(Index count) override; Result OnMemory(Index index, @@ -700,9 +703,10 @@ Result BinaryReaderIR::OnTableCount(Index count) { return Result::Ok; } -Result BinaryReaderIR::OnTable(Index index, - Type elem_type, - const Limits* elem_limits) { +Result BinaryReaderIR::BeginTable(Index index, + Type elem_type, + const Limits* elem_limits, + TableInitExprStatus) { auto field = std::make_unique(GetLocation()); Table& table = field->table; table.elem_limits = *elem_limits; @@ -712,6 +716,16 @@ Result BinaryReaderIR::OnTable(Index index, return Result::Ok; } +Result BinaryReaderIR::BeginTableInitExpr(Index index) { + assert(index == module_->tables.size() - 1); + Table* table = module_->tables[index]; + return BeginInitExpr(&table->init_expr); +} + +Result BinaryReaderIR::EndTableInitExpr(Index index) { + return EndInitExpr(); +} + Result BinaryReaderIR::OnMemoryCount(Index count) { WABT_TRY module_->memories.reserve(module_->num_memory_imports + count); diff --git a/src/binary-reader-logging.cc b/src/binary-reader-logging.cc index 89690ca533..538f45a3d2 100644 --- a/src/binary-reader-logging.cc +++ b/src/binary-reader-logging.cc @@ -255,14 +255,15 @@ Result BinaryReaderLogging::OnImportTag(Index import_index, sig_index); } -Result BinaryReaderLogging::OnTable(Index index, - Type elem_type, - const Limits* elem_limits) { +Result BinaryReaderLogging::BeginTable(Index index, + Type elem_type, + const Limits* elem_limits, + TableInitExprStatus init_provided) { char buf[100]; SPrintLimits(buf, sizeof(buf), elem_limits); LOGF("OnTable(index: %" PRIindex ", elem_type: %s, %s)\n", index, elem_type.GetName().c_str(), buf); - return reader_->OnTable(index, elem_type, elem_limits); + return reader_->BeginTable(index, elem_type, elem_limits, init_provided); } Result BinaryReaderLogging::OnMemory(Index index, @@ -816,6 +817,9 @@ DEFINE_END(EndFunctionSection) DEFINE_BEGIN(BeginTableSection) DEFINE_INDEX(OnTableCount) +DEFINE_INDEX(BeginTableInitExpr) +DEFINE_INDEX(EndTableInitExpr) +DEFINE_INDEX(EndTable) DEFINE_END(EndTableSection) DEFINE_BEGIN(BeginMemorySection) diff --git a/src/binary-reader-objdump.cc b/src/binary-reader-objdump.cc index e35d1fe5b8..086bdae13c 100644 --- a/src/binary-reader-objdump.cc +++ b/src/binary-reader-objdump.cc @@ -1127,9 +1127,10 @@ class BinaryReaderObjdump : public BinaryReaderObjdumpBase { Result OnFunction(Index index, Index sig_index) override; Result OnTableCount(Index count) override; - Result OnTable(Index index, - Type elem_type, - const Limits* elem_limits) override; + Result BeginTable(Index index, + Type elem_type, + const Limits* elem_limits, + TableInitExprStatus init_provided) override; Result OnMemoryCount(Index count) override; Result OnMemory(Index index, @@ -1176,6 +1177,14 @@ class BinaryReaderObjdump : public BinaryReaderObjdumpBase { Result EndDataSegmentInitExpr(Index index) override { return EndInitExpr(); } + Result BeginTableInitExpr(Index index) override { + reading_table_init_expr_ = true; + BeginInitExpr(); + return Result::Ok; + } + + Result EndTableInitExpr(Index index) override { return EndInitExpr(); } + Result BeginGlobalInitExpr(Index index) override { reading_global_init_expr_ = true; BeginInitExpr(); @@ -1305,6 +1314,7 @@ class BinaryReaderObjdump : public BinaryReaderObjdumpBase { Index elem_index_ = 0; Index table_index_ = 0; Index next_data_reloc_ = 0; + bool reading_table_init_expr_ = false; bool reading_elem_init_expr_ = false; bool reading_data_init_expr_ = false; bool reading_global_init_expr_ = false; @@ -1317,8 +1327,9 @@ class BinaryReaderObjdump : public BinaryReaderObjdumpBase { uint64_t elem_offset_ = 0; bool ReadingInitExpr() { - return reading_elem_init_expr_ || reading_data_init_expr_ || - reading_global_init_expr_ || reading_elem_expr_; + return reading_table_init_expr_ || reading_elem_init_expr_ || + reading_data_init_expr_ || reading_global_init_expr_ || + reading_elem_expr_; } }; @@ -1697,9 +1708,10 @@ Result BinaryReaderObjdump::OnTableCount(Index count) { return OnCount(count); } -Result BinaryReaderObjdump::OnTable(Index index, - Type elem_type, - const Limits* elem_limits) { +Result BinaryReaderObjdump::BeginTable(Index index, + Type elem_type, + const Limits* elem_limits, + TableInitExprStatus) { PrintDetails(" - table[%" PRIindex "] type=%s initial=%" PRId64, index, elem_type.GetName().c_str(), elem_limits->initial); if (elem_limits->has_max) { @@ -1922,6 +1934,9 @@ Result BinaryReaderObjdump::EndInitExpr() { if (reading_data_init_expr_) { reading_data_init_expr_ = false; InitExprToConstOffset(current_init_expr_, &data_offset_); + } else if (reading_table_init_expr_) { + reading_table_init_expr_ = false; + InitExprToConstOffset(current_init_expr_, &elem_offset_); } else if (reading_elem_init_expr_) { reading_elem_init_expr_ = false; InitExprToConstOffset(current_init_expr_, &elem_offset_); diff --git a/src/binary-reader.cc b/src/binary-reader.cc index b9c2e3d5ad..e2db6decfa 100644 --- a/src/binary-reader.cc +++ b/src/binary-reader.cc @@ -152,7 +152,7 @@ class BinaryReader { Index NumTotalFuncs(); [[nodiscard]] Result ReadInitExpr(Index index); - [[nodiscard]] Result ReadTable(Type* out_elem_type, Limits* out_elem_limits); + [[nodiscard]] Result ReadTable(Limits* out_elem_limits); [[nodiscard]] Result ReadMemory(Limits* out_page_limits, uint32_t* out_page_size); [[nodiscard]] Result ReadGlobalHeader(Type* out_type, bool* out_mutable); @@ -625,9 +625,7 @@ Result BinaryReader::ReadInitExpr(Index index) { return Result::Ok; } -Result BinaryReader::ReadTable(Type* out_elem_type, Limits* out_elem_limits) { - CHECK_RESULT(ReadRefType(out_elem_type, "table elem type")); - +Result BinaryReader::ReadTable(Limits* out_elem_limits) { uint8_t flags; uint32_t initial; uint32_t max = 0; @@ -2715,7 +2713,8 @@ Result BinaryReader::ReadImportSection(Offset section_size) { case ExternalKind::Table: { Type elem_type; Limits elem_limits; - CHECK_RESULT(ReadTable(&elem_type, &elem_limits)); + CHECK_RESULT(ReadRefType(&elem_type, "table elem type")); + CHECK_RESULT(ReadTable(&elem_limits)); CALLBACK(OnImportTable, i, module_name, field_name, num_table_imports_, elem_type, &elem_limits); num_table_imports_++; @@ -2787,8 +2786,42 @@ Result BinaryReader::ReadTableSection(Offset section_size) { Index table_index = num_table_imports_ + i; Type elem_type; Limits elem_limits; - CHECK_RESULT(ReadTable(&elem_type, &elem_limits)); - CALLBACK(OnTable, table_index, elem_type, &elem_limits); + TableInitExprStatus init_provided = + TableInitExprStatus::TableWithoutInitExpression; + + CHECK_RESULT(ReadType(&elem_type, "table elem type")); + + // Type::Void will never represent a valid type, so it was + // choosen to represent the availability of the init expression. + if (options_.features.function_references_enabled() && + elem_type == Type::Void) { + init_provided = TableInitExprStatus::TableWithInitExpression; + + uint8_t value; + CHECK_RESULT(ReadU8(&value, "table init")); + // This zero value is reserved for future + // extensions, and currently unused. + if (value != 0) { + PrintError("unsupported table intializer: 0x%x\n", + static_cast(value)); + return Result::Error; + } + + CHECK_RESULT(ReadType(&elem_type, "table elem type")); + } + + ERROR_UNLESS(elem_type.IsRef(), "table elem type must be a reference type"); + + CHECK_RESULT(ReadTable(&elem_limits)); + CALLBACK(BeginTable, table_index, elem_type, &elem_limits, init_provided); + + if (init_provided == TableInitExprStatus::TableWithInitExpression) { + CALLBACK(BeginTableInitExpr, table_index); + CHECK_RESULT(ReadInitExpr(table_index)); + CALLBACK(EndTableInitExpr, table_index); + } + + CALLBACK(EndTable, table_index); } CALLBACK0(EndTableSection); return Result::Ok; @@ -2879,6 +2912,11 @@ Result BinaryReader::ReadElemSection(Offset section_size) { } Type elem_type = Type::FuncRef; + if (options_.features.function_references_enabled() && + !(flags & SegUseElemExprs)) { + elem_type = Type(Type::FuncRef, Type::ReferenceNonNull); + } + CALLBACK(BeginElemSegment, i, table_index, flags); if (!(flags & SegPassive)) { @@ -2897,7 +2935,6 @@ Result BinaryReader::ReadElemSection(Offset section_size) { ERROR_UNLESS(kind == ExternalKind::Func, "segment elem type must be func (%s)", elem_type.GetName().c_str()); - elem_type = Type::FuncRef; } } diff --git a/src/binary-writer.cc b/src/binary-writer.cc index 68b1ba9d31..52671de617 100644 --- a/src/binary-writer.cc +++ b/src/binary-writer.cc @@ -1227,9 +1227,18 @@ void BinaryWriter::WriteFunc(const Func* func) { } void BinaryWriter::WriteTable(const Table* table) { + if (!table->init_expr.empty()) { + // BinaryReader::ReadTableSection provides information about these values. + WriteType(stream_, Type::Void, "initialized table prefix"); + stream_->WriteU8(0x0, "initialized table prefix"); + } WriteType(stream_, table->elem_type); WriteLimitsFlags(stream_, ComputeLimitsFlags(&table->elem_limits)); WriteLimitsData(stream_, &table->elem_limits); + + if (!table->init_expr.empty()) { + WriteInitExpr(table->init_expr); + } } void BinaryWriter::WriteMemory(const Memory* memory) { @@ -1616,7 +1625,8 @@ Result BinaryWriter::WriteModule() { ElemSegment* segment = module_->elem_segments[i]; WriteHeader("elem segment header", i); // 1. flags - uint8_t flags = segment->GetFlags(module_); + uint8_t flags = segment->GetFlags( + module_, options_.features.function_references_enabled()); stream_->WriteU8(flags, "segment flags"); // 2. optional target table if (flags & SegExplicitIndex && segment->kind != SegmentKind::Declared) { diff --git a/src/interp/binary-reader-interp.cc b/src/interp/binary-reader-interp.cc index d0dd7863c7..fb8425c25d 100644 --- a/src/interp/binary-reader-interp.cc +++ b/src/interp/binary-reader-interp.cc @@ -123,9 +123,12 @@ class BinaryReaderInterp : public BinaryReaderNop { Result OnFunction(Index index, Index sig_index) override; Result OnTableCount(Index count) override; - Result OnTable(Index index, - Type elem_type, - const Limits* elem_limits) override; + Result BeginTable(Index index, + Type elem_type, + const Limits* elem_limits, + TableInitExprStatus init_provided) override; + Result BeginTableInitExpr(Index index) override; + Result EndTableInitExpr(Index index) override; Result OnMemoryCount(Index count) override; Result OnMemory(Index index, @@ -558,7 +561,10 @@ Result BinaryReaderInterp::OnImportTable(Index import_index, Index table_index, Type elem_type, const Limits* elem_limits) { - CHECK_RESULT(validator_.OnTable(GetLocation(), elem_type, *elem_limits)); + CHECK_RESULT( + validator_.OnTable(GetLocation(), elem_type, *elem_limits, + TableImportStatus::TableIsImported, + TableInitExprStatus::TableWithoutInitExpression)); TableType table_type{elem_type, *elem_limits}; module_.imports.push_back(ImportDesc{ImportType( std::string(module_name), std::string(field_name), table_type.Clone())}); @@ -627,16 +633,34 @@ Result BinaryReaderInterp::OnTableCount(Index count) { return Result::Ok; } -Result BinaryReaderInterp::OnTable(Index index, - Type elem_type, - const Limits* elem_limits) { - CHECK_RESULT(validator_.OnTable(GetLocation(), elem_type, *elem_limits)); +Result BinaryReaderInterp::BeginTable(Index index, + Type elem_type, + const Limits* elem_limits, + TableInitExprStatus init_provided) { + CHECK_RESULT(validator_.OnTable(GetLocation(), elem_type, *elem_limits, + TableImportStatus::TableIsNotImported, + init_provided)); TableType table_type{elem_type, *elem_limits}; - module_.tables.push_back(TableDesc{table_type}); + FuncDesc init_func{ + FuncType{{}, {elem_type}}, {}, Istream::kInvalidOffset, {}}; + module_.tables.push_back(TableDesc{table_type, init_func}); table_types_.push_back(table_type); return Result::Ok; } +Result BinaryReaderInterp::BeginTableInitExpr(Index index) { + TableDesc& table = module_.tables.back(); + return BeginInitExpr(&table.init_func); +} + +Result BinaryReaderInterp::EndTableInitExpr(Index index) { + FixupTopLabel(); + CHECK_RESULT(validator_.EndInitExpr()); + istream_.Emit(Opcode::Return); + PopLabel(); + return Result::Ok; +} + Result BinaryReaderInterp::OnMemoryCount(Index count) { module_.memories.reserve(count); return Result::Ok; diff --git a/src/interp/interp-wasm-c-api.cc b/src/interp/interp-wasm-c-api.cc index bb4598a472..e449bf8f3b 100644 --- a/src/interp/interp-wasm-c-api.cc +++ b/src/interp/interp-wasm-c-api.cc @@ -960,7 +960,8 @@ void wasm_global_set(wasm_global_t* global, const wasm_val_t* val) { own wasm_table_t* wasm_table_new(wasm_store_t* store, const wasm_tabletype_t* type, wasm_ref_t* init) { - return new wasm_table_t{Table::New(store->I, *type->As())}; + return new wasm_table_t{Table::New(store->I, *type->As(), + init ? init->I->self() : Ref::Null)}; } own wasm_tabletype_t* wasm_table_type(const wasm_table_t* table) { diff --git a/src/interp/interp.cc b/src/interp/interp.cc index f18b4d5ed7..2944d05f06 100644 --- a/src/interp/interp.cc +++ b/src/interp/interp.cc @@ -264,6 +264,30 @@ Result Match(const TagType& expected, return Result::Ok; } +//// Types //// + +bool TypesMatch(ValueType expected, ValueType actual) { + // Currently there is no subtyping, so expected and actual must match + // exactly. In the future this may be expanded. + if (expected == actual) { + return true; + } + + if (expected == Type::FuncRef && + (actual == Type::Ref || + (expected.IsNullableNonTypedRef() && + (actual == Type::FuncRef || actual == Type::RefNull)))) { + return true; + } + + if (actual == Type::Ref && expected == Type::RefNull && + actual.GetReferenceIndex() == expected.GetReferenceIndex()) { + return true; + } + + return false; +} + //// Limits //// template bool CanGrow(const Limits& limits, T old_size, T delta, T* new_size) { @@ -312,6 +336,8 @@ bool Store::HasValueType(Ref ref, ValueType type) const { Object* obj = objects_.Get(ref.index); switch (type) { case ValueType::FuncRef: + case ValueType::Ref: + case ValueType::RefNull: return obj->kind() == ObjectKind::DefinedFunc || obj->kind() == ObjectKind::HostFunc; case ValueType::ExnRef: @@ -549,8 +575,12 @@ Result HostFunc::DoCall(Thread& thread, } //// Table //// -Table::Table(Store&, TableType type) : Extern(skind), type_(type) { +Table::Table(Store& store, TableType type, Ref init_ref) + : Extern(skind), type_(type) { elements_.resize(type.limits.initial); + if (init_ref != Ref::Null) { + Fill(store, 0, init_ref, type.limits.initial); + } } void Table::Mark(Store& store) { @@ -914,7 +944,16 @@ Instance::Ptr Instance::Instantiate(Store& store, // Tables. for (auto&& desc : mod->desc().tables) { - inst->tables_.push_back(Table::New(store, desc.type).ref()); + Ref ref = Ref::Null; + if (desc.init_func.code_offset != Istream::kInvalidOffset) { + Ref func_ref = DefinedFunc::New(store, inst.ref(), desc.init_func).ref(); + Value value; + if (Failed(inst->CallInitFunc(store, func_ref, &value, out_trap))) { + return {}; + } + ref = value.Get(); + } + inst->tables_.push_back(Table::New(store, desc.type, ref).ref()); } // Memories. diff --git a/src/ir.cc b/src/ir.cc index 7ac779f7ee..8e46650347 100644 --- a/src/ir.cc +++ b/src/ir.cc @@ -703,7 +703,8 @@ void Var::Destroy() { } } -uint8_t ElemSegment::GetFlags(const Module* module) const { +uint8_t ElemSegment::GetFlags(const Module* module, + bool function_references_enabled) const { uint8_t flags = 0; switch (kind) { @@ -724,15 +725,20 @@ uint8_t ElemSegment::GetFlags(const Module* module) const { break; } - bool all_ref_func = - elem_type == Type::FuncRef && - std::all_of(elem_exprs.begin(), elem_exprs.end(), - [](const ExprList& elem_expr) { - return elem_expr.front().type() == ExprType::RefFunc; - }); - - if (!all_ref_func) { + if (function_references_enabled && + elem_type != Type(Type::FuncRef, Type::ReferenceNonNull)) { flags |= SegUseElemExprs; + } else { + bool all_ref_func = + elem_type == Type::FuncRef && + std::all_of(elem_exprs.begin(), elem_exprs.end(), + [](const ExprList& elem_expr) { + return elem_expr.front().type() == ExprType::RefFunc; + }); + + if (!all_ref_func) { + flags |= SegUseElemExprs; + } } return flags; diff --git a/src/resolve-names.cc b/src/resolve-names.cc index d24f2f5c37..606bf781c2 100644 --- a/src/resolve-names.cc +++ b/src/resolve-names.cc @@ -111,6 +111,7 @@ class NameResolver : public ExprVisitor::DelegateNop { void VisitExport(Export* export_); void VisitGlobal(Global* global); void VisitTag(Tag* tag); + void VisitTable(Table* table); void VisitElemSegment(ElemSegment* segment); void VisitDataSegment(DataSegment* segment); void VisitScriptModule(ScriptModule* script_module); @@ -582,6 +583,12 @@ void NameResolver::VisitTag(Tag* tag) { } } +void NameResolver::VisitTable(Table* table) { + if (!table->init_expr.empty()) { + visitor_.VisitExprList(table->init_expr); + } +} + void NameResolver::VisitElemSegment(ElemSegment* segment) { ResolveTableVar(&segment->table_var); visitor_.VisitExprList(segment->offset); @@ -616,6 +623,8 @@ Result NameResolver::VisitModule(Module* module) { VisitGlobal(global); for (Tag* tag : module->tags) VisitTag(tag); + for (Table* table : module->tables) + VisitTable(table); for (ElemSegment* elem_segment : module->elem_segments) VisitElemSegment(elem_segment); for (DataSegment* data_segment : module->data_segments) diff --git a/src/shared-validator.cc b/src/shared-validator.cc index 689cec6607..aa18ba4f26 100644 --- a/src/shared-validator.cc +++ b/src/shared-validator.cc @@ -122,7 +122,9 @@ Result SharedValidator::CheckLimits(const Location& loc, Result SharedValidator::OnTable(const Location& loc, Type elem_type, - const Limits& limits) { + const Limits& limits, + TableImportStatus import_status, + TableInitExprStatus init_provided) { Result result = Result::Ok; // Must be checked by parser or binary reader. assert(elem_type.IsRef()); @@ -134,19 +136,21 @@ Result SharedValidator::OnTable(const Location& loc, if (limits.is_shared) { result |= PrintError(loc, "tables may not be shared"); } - if (elem_type != Type::FuncRef && - !options_.features.reference_types_enabled()) { + if (options_.features.reference_types_enabled()) { + if (!elem_type.IsRef()) { + result |= PrintError(loc, "ables may only contain reference types"); + } else if (import_status == TableImportStatus::TableIsNotImported && + init_provided == + TableInitExprStatus::TableWithoutInitExpression && + !elem_type.IsNullableRef()) { + result |= PrintError(loc, "missing table initializer"); + } + } else if (elem_type != Type::FuncRef) { result |= PrintError(loc, "tables must have funcref type"); } result |= CheckReferenceType(loc, elem_type, "tables"); - // TODO: support table initializers - if (elem_type.IsRef() && !elem_type.IsNullableRef()) { - result |= - PrintError(loc, "currently non-nullable references are not supported"); - } - tables_.push_back(TableType{elem_type, limits}); return result; } diff --git a/src/test-interp.cc b/src/test-interp.cc index 9346b7b166..76b5cce13e 100644 --- a/src/test-interp.cc +++ b/src/test-interp.cc @@ -608,9 +608,9 @@ TEST_F(InterpGCTest, Collect_GlobalCycle) { TEST_F(InterpGCTest, Collect_TableCycle) { auto tt = TableType{ValueType::ExternRef, Limits{2}}; - auto t1 = Table::New(store_, tt); - auto t2 = Table::New(store_, tt); - auto t3 = Table::New(store_, tt); + auto t1 = Table::New(store_, tt, Ref::Null); + auto t2 = Table::New(store_, tt, Ref::Null); + auto t3 = Table::New(store_, tt, Ref::Null); t1->Set(store_, 0, t1->self()); // t1 references itself. t2->Set(store_, 0, t3->self()); @@ -659,7 +659,8 @@ TEST_F(InterpGCTest, Collect_InstanceImport) { auto f = HostFunc::New(store_, FuncType{{}, {}}, [](Thread& thread, const Values&, Values&, Trap::Ptr*) -> Result { return Result::Ok; }); - auto t = Table::New(store_, TableType{ValueType::FuncRef, Limits{0}}); + auto t = + Table::New(store_, TableType{ValueType::FuncRef, Limits{0}}, Ref::Null); auto m = Memory::New(store_, MemoryType{Limits{0}, WABT_DEFAULT_PAGE_SIZE}); auto g = Global::New(store_, GlobalType{ValueType::I32, Mutability::Const}, Value::Make(5)); @@ -709,10 +710,10 @@ TEST_F(InterpGCTest, Collect_DeepRecursion) { // Create a chain of tables, where each contains // a single reference to the next table. - Table::Ptr prev_table = Table::New(store_, tt); + Table::Ptr prev_table = Table::New(store_, tt, Ref::Null); for (size_t i = 1; i < table_count; i++) { - Table::Ptr new_table = Table::New(store_, tt); + Table::Ptr new_table = Table::New(store_, tt, Ref::Null); new_table->Set(store_, 0, prev_table->self()); diff --git a/src/tools/spectest-interp.cc b/src/tools/spectest-interp.cc index d859f14823..3b8620224b 100644 --- a/src/tools/spectest-interp.cc +++ b/src/tools/spectest-interp.cc @@ -1307,11 +1307,12 @@ CommandRunner::CommandRunner() : store_(s_features) { }); } - spectest["table"] = - interp::Table::New(store_, TableType{ValueType::FuncRef, Limits{10, 20}}); + spectest["table"] = interp::Table::New( + store_, TableType{ValueType::FuncRef, Limits{10, 20}}, Ref::Null); spectest["table64"] = interp::Table::New( - store_, TableType{ValueType::FuncRef, Limits{10, 20, false, true}}); + store_, TableType{ValueType::FuncRef, Limits{10, 20, false, true}}, + Ref::Null); spectest["memory"] = interp::Memory::New( store_, MemoryType{Limits{1, 2}, WABT_DEFAULT_PAGE_SIZE}); @@ -1920,7 +1921,7 @@ wabt::Result CommandRunner::CheckAssertReturnResult( case Type::FuncRef: // A funcref expectation only requires that the reference be a function, // but it doesn't check the actual index. - ok = (actual.type == Type::FuncRef); + ok = (actual.type == Type::FuncRef || actual.type == Type::RefNull); break; case Type::ExternRef: diff --git a/src/validator.cc b/src/validator.cc index 76b8f31c40..4b0882cfcc 100644 --- a/src/validator.cc +++ b/src/validator.cc @@ -224,6 +224,12 @@ static Result CheckType(Type actual, Type expected) { } } + if (actual_type == Type::FuncRef && expected_type == Type::RefNull) { + // The ref.null constant should be a valid value to any + // (ref null...) definition, regarless of its actual type. + return Result::Ok; + } + return Result::Error; } @@ -801,8 +807,10 @@ Result Validator::CheckModule() { case ExternalKind::Table: { auto&& table = cast(f->import.get())->table; - result_ |= - validator_.OnTable(field.loc, table.elem_type, table.elem_limits); + result_ |= validator_.OnTable( + field.loc, table.elem_type, table.elem_limits, + TableImportStatus::TableIsImported, + TableInitExprStatus::TableWithoutInitExpression); break; } @@ -841,8 +849,22 @@ Result Validator::CheckModule() { // Table section. for (const ModuleField& field : module->fields) { if (auto* f = dyn_cast(&field)) { - result_ |= validator_.OnTable(field.loc, f->table.elem_type, - f->table.elem_limits); + TableInitExprStatus init_provided = + f->table.init_expr.empty() + ? TableInitExprStatus::TableWithoutInitExpression + : TableInitExprStatus::TableWithInitExpression; + result_ |= validator_.OnTable( + field.loc, f->table.elem_type, f->table.elem_limits, + TableImportStatus::TableIsNotImported, init_provided); + + // Init expr. + if (init_provided == TableInitExprStatus::TableWithInitExpression) { + result_ |= validator_.BeginInitExpr(field.loc, f->table.elem_type); + ExprVisitor visitor(this); + result_ |= + visitor.VisitExprList(const_cast(f->table.init_expr)); + result_ |= validator_.EndInitExpr(); + } } } diff --git a/src/wast-parser.cc b/src/wast-parser.cc index ed0b155125..60064dec63 100644 --- a/src/wast-parser.cc +++ b/src/wast-parser.cc @@ -1344,7 +1344,8 @@ Result WastParser::ResolveTargetRefType(const Module& module, assert(type->IsReferenceWithIndex() && !var.is_index()); if (type->GetReferenceIndex() != kInvalidIndex) { - // Resolved earlier. + // Type has either a name or an absolute index. The former might + // be resolved earlier, and the latter does not need any resolving. return Result::Ok; } @@ -1538,7 +1539,10 @@ Result WastParser::ParseElemModuleField(Module* module) { VarToType(elem_type, &field->elem_segment.elem_type); ParseElemExprListOpt(&field->elem_segment.elem_exprs); } else { - field->elem_segment.elem_type = Type::FuncRef; + field->elem_segment.elem_type = + Type(Type::FuncRef, options_->features.function_references_enabled() + ? Type::ReferenceNonNull + : Type::ReferenceOrNull); if (PeekMatch(TokenType::Func)) { EXPECT(Func); } @@ -2001,6 +2005,9 @@ Result WastParser::ParseTableModuleField(Module* module) { Var elem_type; CHECK_RESULT(ParseRefType(&elem_type)); VarToType(elem_type, &table.elem_type); + if (PeekMatch(TokenType::Lpar)) { + CHECK_RESULT(ParseTerminatingInstrList(&table.init_expr)); + } module->AppendField(std::move(field)); } } @@ -3112,10 +3119,12 @@ Result WastParser::ParseConstList(ConstVector* consts, ConstType type) { case TokenType::RefNull: { auto token = Consume(); Var type; - CHECK_RESULT(ParseRefKind(&type)); + if (Peek() != TokenType::Rpar) { + CHECK_RESULT(ParseRefKind(&type)); + } ErrorUnlessOpcodeEnabled(token); const_.loc = GetLocation(); - const_.set_null(type.opt_type()); + const_.set_null(type.has_opt_type() ? type.opt_type() : Type::FuncRef); break; } case TokenType::RefFunc: { diff --git a/src/wat-writer.cc b/src/wat-writer.cc index 5da55e8535..04ade45064 100644 --- a/src/wat-writer.cc +++ b/src/wat-writer.cc @@ -1596,7 +1596,8 @@ void WatWriter::WriteElemSegment(const ElemSegment& segment) { Writef("(;%u;)", elem_segment_index_); } - uint8_t flags = segment.GetFlags(&module); + uint8_t flags = segment.GetFlags( + &module, options_.features.function_references_enabled()); if ((flags & (SegPassive | SegExplicitIndex)) == SegExplicitIndex) { WriteOpenSpace("table"); diff --git a/test/dump/call_ref.txt b/test/dump/call_ref.txt index 997440c108..a517a45c0e 100644 --- a/test/dump/call_ref.txt +++ b/test/dump/call_ref.txt @@ -11,7 +11,7 @@ (i32.add (local.get $x) (i32.const 19)) ) - (elem declare funcref (ref.func $foo)) + (elem declare func $foo) (type (func (param i32) (result i32))) ) diff --git a/test/dump/relocations-all-features.txt b/test/dump/relocations-all-features.txt index 0b22b64184..8575f6140c 100644 --- a/test/dump/relocations-all-features.txt +++ b/test/dump/relocations-all-features.txt @@ -27,10 +27,11 @@ Sections: Table start=0x00000041 end=0x00000046 (size=0x00000005) count: 1 Global start=0x00000048 end=0x0000004e (size=0x00000006) count: 1 Export start=0x00000050 end=0x00000055 (size=0x00000005) count: 1 - Elem start=0x00000057 end=0x0000005e (size=0x00000007) count: 1 - Code start=0x00000060 end=0x00000086 (size=0x00000026) count: 1 - Custom start=0x00000088 end=0x000000a9 (size=0x00000021) "linking" - Custom start=0x000000ab end=0x000000c7 (size=0x0000001c) "reloc.Code" + Elem start=0x00000057 end=0x00000064 (size=0x0000000d) count: 1 + Code start=0x00000066 end=0x0000008c (size=0x00000026) count: 1 + Custom start=0x0000008e end=0x000000af (size=0x00000021) "linking" + Custom start=0x000000b1 end=0x000000c1 (size=0x00000010) "reloc.Elem" + Custom start=0x000000c3 end=0x000000df (size=0x0000001c) "reloc.Code" Section Details: @@ -50,7 +51,7 @@ Global[1]: Export[1]: - func[2] -> "f" Elem[1]: - - segment[0] flags=0 table=0 count=1 - init i32=0 + - segment[0] flags=4 table=0 count=1 - init i32=0 - elem[0] = ref.func:1 <__extern.bar> Code[1]: - func[2] size=36 @@ -62,29 +63,33 @@ Custom: - 2: F func=2 [ exported no_strip binding=global vis=hidden ] - 3: T <> table=0 [ binding=local vis=hidden ] - 4: G global=0 [ binding=global vis=default ] +Custom: + - name: "reloc.Elem" + - relocations for section: 6 (Elem) [1] + - R_WASM_FUNCTION_INDEX_LEB offset=0x000007(file=0x00005e) symbol=1 <__extern.bar> Custom: - name: "reloc.Code" - relocations for section: 7 (Code) [5] - - R_WASM_GLOBAL_INDEX_LEB offset=0x000004(file=0x000064) symbol=4 - - R_WASM_FUNCTION_INDEX_LEB offset=0x00000a(file=0x00006a) symbol=2 - - R_WASM_FUNCTION_INDEX_LEB offset=0x000010(file=0x000070) symbol=0 <__extern.foo> - - R_WASM_TYPE_INDEX_LEB offset=0x00001b(file=0x00007b) type=2 - - R_WASM_TABLE_NUMBER_LEB offset=0x000020(file=0x000080) symbol=3 <> + - R_WASM_GLOBAL_INDEX_LEB offset=0x000004(file=0x00006a) symbol=4 + - R_WASM_FUNCTION_INDEX_LEB offset=0x00000a(file=0x000070) symbol=2 + - R_WASM_FUNCTION_INDEX_LEB offset=0x000010(file=0x000076) symbol=0 <__extern.foo> + - R_WASM_TYPE_INDEX_LEB offset=0x00001b(file=0x000081) type=2 + - R_WASM_TABLE_NUMBER_LEB offset=0x000020(file=0x000086) symbol=3 <> Code Disassembly: -000062 func[2] : - 000063: 23 80 80 80 80 00 | global.get 0 - 000064: R_WASM_GLOBAL_INDEX_LEB 4 - 000069: 10 82 80 80 80 00 | call 2 - 00006a: R_WASM_FUNCTION_INDEX_LEB 2 - 00006f: 10 80 80 80 80 00 | call 0 <__extern.foo> - 000070: R_WASM_FUNCTION_INDEX_LEB 0 <__extern.foo> - 000075: 41 d2 09 | i32.const 1234 - 000078: 41 00 | i32.const 0 - 00007a: 11 82 80 80 80 00 80 80 80 | call_indirect 0 (type 2) - 000083: 80 00 | - 00007b: R_WASM_TYPE_INDEX_LEB 2 - 000085: 0b | end - 000080: R_WASM_TABLE_NUMBER_LEB 3 <> +000068 func[2] : + 000069: 23 80 80 80 80 00 | global.get 0 + 00006a: R_WASM_GLOBAL_INDEX_LEB 4 + 00006f: 10 82 80 80 80 00 | call 2 + 000070: R_WASM_FUNCTION_INDEX_LEB 2 + 000075: 10 80 80 80 80 00 | call 0 <__extern.foo> + 000076: R_WASM_FUNCTION_INDEX_LEB 0 <__extern.foo> + 00007b: 41 d2 09 | i32.const 1234 + 00007e: 41 00 | i32.const 0 + 000080: 11 82 80 80 80 00 80 80 80 | call_indirect 0 (type 2) + 000089: 80 00 | + 000081: R_WASM_TYPE_INDEX_LEB 2 + 00008b: 0b | end + 000086: R_WASM_TABLE_NUMBER_LEB 3 <> ;;; STDOUT ;;) diff --git a/test/dump/typed_func_refs_params.txt b/test/dump/typed_func_refs_params.txt index 7bbd41f722..d83bd568ec 100644 --- a/test/dump/typed_func_refs_params.txt +++ b/test/dump/typed_func_refs_params.txt @@ -25,7 +25,7 @@ ) ) - (elem declare funcref (ref.func $square)) + (elem declare func $square) ) (;; STDERR ;;; diff --git a/test/dump/typed_func_refs_results.txt b/test/dump/typed_func_refs_results.txt index 81ff524039..2e635ccbf5 100644 --- a/test/dump/typed_func_refs_results.txt +++ b/test/dump/typed_func_refs_results.txt @@ -39,7 +39,7 @@ ) ) - (elem declare funcref (ref.func $square) (ref.func $double)) + (elem declare func $square $double) ) (;; STDERR ;;; diff --git a/test/roundtrip/fold-callref.txt b/test/roundtrip/fold-callref.txt index dbd885b88b..b3a8fe6925 100644 --- a/test/roundtrip/fold-callref.txt +++ b/test/roundtrip/fold-callref.txt @@ -66,5 +66,5 @@ (f32.const 0x1p+2 (;=4;)) (ref.func 1)) (ref.func 2))) - (elem (;0;) declare func 0 1 2)) + (elem (;0;) declare funcref (ref.func 0) (ref.func 1) (ref.func 2))) ;;; STDOUT ;;) diff --git a/test/spec/function-references/binary.txt b/test/spec/function-references/binary.txt new file mode 100644 index 0000000000..69c79857ff --- /dev/null +++ b/test/spec/function-references/binary.txt @@ -0,0 +1,238 @@ +;;; TOOL: run-interp-spec +;;; STDIN_FILE: third_party/testsuite/proposals/function-references/binary.wast +;;; ARGS*: --enable-function-references +(;; STDOUT ;;; +out/test/spec/function-references/binary.wast:6: assert_malformed passed: + 0000000: error: unable to read uint32_t: magic +out/test/spec/function-references/binary.wast:7: assert_malformed passed: + 0000000: error: unable to read uint32_t: magic +out/test/spec/function-references/binary.wast:8: assert_malformed passed: + 0000000: error: unable to read uint32_t: magic +out/test/spec/function-references/binary.wast:9: assert_malformed passed: + 0000004: error: bad magic value +out/test/spec/function-references/binary.wast:10: assert_malformed passed: + 0000004: error: bad magic value +out/test/spec/function-references/binary.wast:11: assert_malformed passed: + 0000004: error: bad magic value +out/test/spec/function-references/binary.wast:12: assert_malformed passed: + 0000004: error: bad magic value +out/test/spec/function-references/binary.wast:13: assert_malformed passed: + 0000004: error: bad magic value +out/test/spec/function-references/binary.wast:14: assert_malformed passed: + 0000004: error: bad magic value +out/test/spec/function-references/binary.wast:15: assert_malformed passed: + 0000004: error: bad magic value +out/test/spec/function-references/binary.wast:16: assert_malformed passed: + 0000004: error: bad magic value +out/test/spec/function-references/binary.wast:17: assert_malformed passed: + 0000004: error: bad magic value +out/test/spec/function-references/binary.wast:18: assert_malformed passed: + 0000004: error: bad magic value +out/test/spec/function-references/binary.wast:21: assert_malformed passed: + 0000004: error: bad magic value +out/test/spec/function-references/binary.wast:24: assert_malformed passed: + 0000004: error: bad magic value +out/test/spec/function-references/binary.wast:25: assert_malformed passed: + 0000004: error: bad magic value +out/test/spec/function-references/binary.wast:28: assert_malformed passed: + 0000004: error: bad magic value +out/test/spec/function-references/binary.wast:31: assert_malformed passed: + 0000004: error: bad magic value +out/test/spec/function-references/binary.wast:34: assert_malformed passed: + 0000004: error: bad magic value +out/test/spec/function-references/binary.wast:37: assert_malformed passed: + 0000004: error: unable to read uint16_t: version +out/test/spec/function-references/binary.wast:38: assert_malformed passed: + 0000004: error: unable to read uint16_t: version +out/test/spec/function-references/binary.wast:39: assert_malformed passed: + 0000006: error: unable to read uint16_t: layer +out/test/spec/function-references/binary.wast:40: assert_malformed passed: + 0000008: error: bad wasm file version: 0 (expected 0x1) +out/test/spec/function-references/binary.wast:41: assert_malformed passed: + 0000008: error: bad wasm file version: 0xd (expected 0x1) +out/test/spec/function-references/binary.wast:42: assert_malformed passed: + 0000008: error: bad wasm file version: 0xe (expected 0x1) +out/test/spec/function-references/binary.wast:43: assert_malformed passed: + 0000008: error: bad wasm file version: 0x100 (expected 0x1) +out/test/spec/function-references/binary.wast:44: assert_malformed passed: + 0000008: error: wasm components are not yet supported in this tool +out/test/spec/function-references/binary.wast:45: assert_malformed passed: + 0000008: error: unsupported wasm layer: 0x100 +out/test/spec/function-references/binary.wast:48: assert_malformed passed: + 000000a: error: invalid section code: 14 +out/test/spec/function-references/binary.wast:49: assert_malformed passed: + 000000a: error: invalid section code: 127 +out/test/spec/function-references/binary.wast:50: assert_malformed passed: + 000000a: error: invalid section code: 128 +out/test/spec/function-references/binary.wast:51: assert_malformed passed: + 000000a: error: invalid section code: 129 +out/test/spec/function-references/binary.wast:52: assert_malformed passed: + 000000a: error: invalid section code: 255 +out/test/spec/function-references/binary.wast:56: assert_malformed passed: + 000001b: error: function body must end with END opcode +out/test/spec/function-references/binary.wast:77: assert_malformed passed: + 000001a: error: function body must end with END opcode +out/test/spec/function-references/binary.wast:93: assert_malformed passed: + 000001a: error: function body must end with END opcode +out/test/spec/function-references/binary.wast:113: assert_malformed passed: + 0000019: error: init expression must end with END opcode +out/test/spec/function-references/binary.wast:126: assert_malformed passed: + 0000020: error: memory.grow reserved value must be 0 +out/test/spec/function-references/binary.wast:146: assert_malformed passed: + 0000020: error: memory.grow reserved value must be 0 +out/test/spec/function-references/binary.wast:166: assert_malformed passed: + 0000020: error: memory.grow reserved value must be 0 +out/test/spec/function-references/binary.wast:185: assert_malformed passed: + 0000020: error: memory.grow reserved value must be 0 +out/test/spec/function-references/binary.wast:204: assert_malformed passed: + 0000020: error: memory.grow reserved value must be 0 +out/test/spec/function-references/binary.wast:224: assert_malformed passed: + 000001e: error: memory.size reserved value must be 0 +out/test/spec/function-references/binary.wast:243: assert_malformed passed: + 000001e: error: memory.size reserved value must be 0 +out/test/spec/function-references/binary.wast:262: assert_malformed passed: + 000001e: error: memory.size reserved value must be 0 +out/test/spec/function-references/binary.wast:280: assert_malformed passed: + 000001e: error: memory.size reserved value must be 0 +out/test/spec/function-references/binary.wast:298: assert_malformed passed: + 000001e: error: memory.size reserved value must be 0 +out/test/spec/function-references/binary.wast:317: assert_malformed passed: + 0000017: error: unable to read u32 leb128: local type count +out/test/spec/function-references/binary.wast:334: assert_malformed passed: + 0000017: error: unable to read u32 leb128: local type count +out/test/spec/function-references/binary.wast:351: assert_malformed passed: + 000001e: error: local count must be <= 0xffffffff +out/test/spec/function-references/binary.wast:367: assert_malformed passed: + 0000030: error: local count must be <= 0xffffffff +out/test/spec/function-references/binary.wast:401: assert_malformed passed: + 0000013: error: function signature count != function body count +out/test/spec/function-references/binary.wast:411: assert_malformed passed: + 000000b: error: function signature count != function body count +out/test/spec/function-references/binary.wast:420: assert_malformed passed: + 0000016: error: function signature count != function body count +out/test/spec/function-references/binary.wast:431: assert_malformed passed: + 0000015: error: function signature count != function body count +out/test/spec/function-references/binary.wast:454: assert_malformed passed: + 000000e: error: data segment count does not equal count in DataCount section +out/test/spec/function-references/binary.wast:466: assert_malformed passed: + 000000e: error: data segment count does not equal count in DataCount section +out/test/spec/function-references/binary.wast:478: assert_malformed passed: + 0000010: error: Data section missing but DataCount non-zero +out/test/spec/function-references/binary.wast:494: assert_malformed passed: + 0000024: error: memory.init requires data count section +out/test/spec/function-references/binary.wast:517: assert_malformed passed: + 000001e: error: data.drop requires data count section +out/test/spec/function-references/binary.wast:537: assert_malformed passed: + 0000024: error: unexpected opcode: 0xf3 +out/test/spec/function-references/binary.wast:565: assert_malformed passed: + 0000022: error: table elem type must be a reference type +out/test/spec/function-references/binary.wast:650: assert_malformed passed: + 000000a: error: invalid section size: extends past end +out/test/spec/function-references/binary.wast:661: assert_malformed passed: + 000000e: error: unfinished section (expected end: 0x11) +out/test/spec/function-references/binary.wast:680: assert_malformed passed: + 000000e: error: invalid import tag kind: exceptions not allowed +out/test/spec/function-references/binary.wast:690: assert_malformed passed: + 000000e: error: invalid import tag kind: exceptions not allowed +out/test/spec/function-references/binary.wast:701: assert_malformed passed: + 000000e: error: malformed import kind: 5 +out/test/spec/function-references/binary.wast:711: assert_malformed passed: + 000000e: error: malformed import kind: 5 +out/test/spec/function-references/binary.wast:722: assert_malformed passed: + 000000e: error: malformed import kind: 128 +out/test/spec/function-references/binary.wast:732: assert_malformed passed: + 000000e: error: malformed import kind: 128 +out/test/spec/function-references/binary.wast:745: assert_malformed passed: + 0000027: error: unable to read u32 leb128: string length +out/test/spec/function-references/binary.wast:764: assert_malformed passed: + 000002b: error: unfinished section (expected end: 0x40) +out/test/spec/function-references/binary.wast:795: assert_malformed passed: + 000000b: error: invalid table count 1, only 0 bytes left in section +out/test/spec/function-references/binary.wast:805: assert_malformed passed: + 000000d: error: tables may not be shared +out/test/spec/function-references/binary.wast:814: assert_malformed passed: + 000000d: error: tables may not be shared +out/test/spec/function-references/binary.wast:824: assert_malformed passed: + 000000d: error: malformed table limits flag: 129 +out/test/spec/function-references/binary.wast:842: assert_malformed passed: + 000000b: error: invalid memory count 1, only 0 bytes left in section +out/test/spec/function-references/binary.wast:852: assert_malformed passed: + 000000c: error: memory may not be shared: threads not allowed +out/test/spec/function-references/binary.wast:860: assert_malformed passed: + 000000c: error: memory may not be shared: threads not allowed +out/test/spec/function-references/binary.wast:869: assert_malformed passed: + 000000c: error: malformed memory limits flag: 129 +out/test/spec/function-references/binary.wast:878: assert_malformed passed: + 000000c: error: malformed memory limits flag: 129 +out/test/spec/function-references/binary.wast:895: assert_malformed passed: + 0000010: error: unable to read i32 leb128: global type +out/test/spec/function-references/binary.wast:906: assert_malformed passed: + 0000010: error: unfinished section (expected end: 0x15) +out/test/spec/function-references/binary.wast:929: assert_malformed passed: + 000001b: error: unable to read u32 leb128: string length +out/test/spec/function-references/binary.wast:950: assert_malformed passed: + 000001b: error: unfinished section (expected end: 0x20) +out/test/spec/function-references/binary.wast:984: assert_malformed passed: + 0000021: error: unable to read u32 leb128: elem segment flags +out/test/spec/function-references/binary.wast:1000: assert_malformed passed: + 0000024: error: init expression must end with END opcode +out/test/spec/function-references/binary.wast:1017: assert_malformed passed: + 0000021: error: unfinished section (expected end: 0x27) +out/test/spec/function-references/binary.wast:1043: assert_malformed passed: + 0000016: error: unable to read u32 leb128: data segment flags +out/test/spec/function-references/binary.wast:1056: assert_malformed passed: + 0000016: error: unfinished section (expected end: 0x1c) +out/test/spec/function-references/binary.wast:1069: assert_malformed passed: + 0000015: error: unable to read data: data segment data +out/test/spec/function-references/binary.wast:1083: assert_malformed passed: + 000001a: error: unfinished section (expected end: 0x1b) +out/test/spec/function-references/binary.wast:1114: assert_malformed passed: + 0000048: error: function body must end with END opcode +out/test/spec/function-references/binary.wast:1161: assert_malformed passed: + 0000017: error: multiple Start sections +out/test/spec/function-references/binary.wast:1178: assert_malformed passed: + 0000014: error: multiple Function sections +out/test/spec/function-references/binary.wast:1190: assert_malformed passed: + 0000016: error: function signature count != function body count +out/test/spec/function-references/binary.wast:1202: assert_malformed passed: + 000000d: error: multiple DataCount sections +out/test/spec/function-references/binary.wast:1212: assert_malformed passed: + 000000d: error: multiple Data sections +out/test/spec/function-references/binary.wast:1222: assert_malformed passed: + 000000d: error: multiple Global sections +out/test/spec/function-references/binary.wast:1232: assert_malformed passed: + 000000d: error: multiple Export sections +out/test/spec/function-references/binary.wast:1242: assert_malformed passed: + 000000d: error: multiple Table sections +out/test/spec/function-references/binary.wast:1252: assert_malformed passed: + 000000d: error: multiple Elem sections +out/test/spec/function-references/binary.wast:1262: assert_malformed passed: + 000000d: error: multiple Import sections +out/test/spec/function-references/binary.wast:1272: assert_malformed passed: + 000000d: error: multiple Type sections +out/test/spec/function-references/binary.wast:1282: assert_malformed passed: + 000000d: error: multiple Memory sections +out/test/spec/function-references/binary.wast:1292: assert_malformed passed: + 000000d: error: section Type out of order +out/test/spec/function-references/binary.wast:1302: assert_malformed passed: + 000000d: error: section Import out of order +out/test/spec/function-references/binary.wast:1312: assert_malformed passed: + 000000d: error: section Function out of order +out/test/spec/function-references/binary.wast:1322: assert_malformed passed: + 000000d: error: section Table out of order +out/test/spec/function-references/binary.wast:1332: assert_malformed passed: + 000000d: error: section Memory out of order +out/test/spec/function-references/binary.wast:1342: assert_malformed passed: + 000000d: error: section Global out of order +out/test/spec/function-references/binary.wast:1352: assert_malformed passed: + 0000011: error: section Export out of order +out/test/spec/function-references/binary.wast:1363: assert_malformed passed: + 0000011: error: section Start out of order +out/test/spec/function-references/binary.wast:1374: assert_malformed passed: + 000000d: error: section Elem out of order +out/test/spec/function-references/binary.wast:1384: assert_malformed passed: + 000000d: error: section DataCount out of order +out/test/spec/function-references/binary.wast:1394: assert_malformed passed: + 000000d: error: section Code out of order +136/136 tests passed. +;;; STDOUT ;;) diff --git a/test/spec/function-references/data.txt b/test/spec/function-references/data.txt new file mode 100644 index 0000000000..6954d9bfe2 --- /dev/null +++ b/test/spec/function-references/data.txt @@ -0,0 +1,66 @@ +;;; TOOL: run-interp-spec +;;; STDIN_FILE: third_party/testsuite/proposals/function-references/data.wast +;;; ARGS*: --enable-function-references +(;; STDOUT ;;; +out/test/spec/function-references/data.wast:290: assert_invalid passed: + out/test/spec/function-references/data/data.39.wasm:000000c: error: memory variable out of range: 0 (max 0) + 000000c: error: BeginDataSegment callback failed +out/test/spec/function-references/data.wast:298: assert_invalid passed: + out/test/spec/function-references/data/data.40.wasm:0000012: error: memory variable out of range: 1 (max 1) + 0000012: error: BeginDataSegment callback failed +out/test/spec/function-references/data.wast:311: assert_invalid passed: + out/test/spec/function-references/data/data.41.wasm:000000c: error: memory variable out of range: 0 (max 0) + 000000c: error: BeginDataSegment callback failed +out/test/spec/function-references/data.wast:322: assert_invalid passed: + out/test/spec/function-references/data/data.42.wasm:000000d: error: memory variable out of range: 1 (max 0) + 000000d: error: BeginDataSegment callback failed +out/test/spec/function-references/data.wast:334: assert_invalid passed: + out/test/spec/function-references/data/data.43.wasm:0000012: error: memory variable out of range: 1 (max 1) + 0000012: error: BeginDataSegment callback failed +out/test/spec/function-references/data.wast:356: assert_invalid passed: + out/test/spec/function-references/data/data.44.wasm:000000d: error: memory variable out of range: 1 (max 0) + 000000d: error: BeginDataSegment callback failed +out/test/spec/function-references/data.wast:375: assert_invalid passed: + out/test/spec/function-references/data/data.45.wasm:0000013: error: type mismatch in initializer expression, expected [i32] but got [i64] + 0000014: error: EndDataSegmentInitExpr callback failed +out/test/spec/function-references/data.wast:383: assert_invalid passed: + out/test/spec/function-references/data/data.46.wasm:0000013: error: type mismatch in initializer expression, expected [i32] but got [funcref] + 0000014: error: EndDataSegmentInitExpr callback failed +out/test/spec/function-references/data.wast:391: assert_invalid passed: + out/test/spec/function-references/data/data.47.wasm:0000011: error: type mismatch in initializer expression, expected [i32] but got [] + 0000012: error: EndDataSegmentInitExpr callback failed +out/test/spec/function-references/data.wast:399: assert_invalid passed: + out/test/spec/function-references/data/data.48.wasm:0000015: error: type mismatch at end of initializer expression, expected [] but got [i32] + 0000016: error: EndDataSegmentInitExpr callback failed +out/test/spec/function-references/data.wast:407: assert_invalid passed: + out/test/spec/function-references/data/data.49.wasm:000002b: error: type mismatch at end of initializer expression, expected [] but got [i32] + 000002c: error: EndDataSegmentInitExpr callback failed +out/test/spec/function-references/data.wast:416: assert_invalid passed: + out/test/spec/function-references/data/data.50.wasm:000002b: error: type mismatch at end of initializer expression, expected [] but got [i32] + 000002c: error: EndDataSegmentInitExpr callback failed +out/test/spec/function-references/data.wast:425: assert_invalid passed: + out/test/spec/function-references/data/data.51.wasm:0000014: error: invalid initializer: instruction not valid in initializer expression: i32.ctz + 0000014: error: OnUnaryExpr callback failed +out/test/spec/function-references/data.wast:433: assert_invalid passed: + out/test/spec/function-references/data/data.52.wasm:0000012: error: invalid initializer: instruction not valid in initializer expression: nop + 0000012: error: OnNopExpr callback failed +out/test/spec/function-references/data.wast:441: assert_invalid passed: + out/test/spec/function-references/data/data.53.wasm:0000012: error: invalid initializer: instruction not valid in initializer expression: nop + 0000012: error: OnNopExpr callback failed +out/test/spec/function-references/data.wast:449: assert_invalid passed: + out/test/spec/function-references/data/data.54.wasm:0000014: error: invalid initializer: instruction not valid in initializer expression: nop + 0000014: error: OnNopExpr callback failed +out/test/spec/function-references/data.wast:457: assert_invalid passed: + out/test/spec/function-references/data/data.55.wasm:0000020: error: initializer expression cannot reference a mutable global + 0000020: error: OnGlobalGetExpr callback failed +out/test/spec/function-references/data.wast:466: assert_invalid passed: + out/test/spec/function-references/data/data.56.wasm:0000013: error: global variable out of range: 0 (max 0) + 0000013: error: OnGlobalGetExpr callback failed +out/test/spec/function-references/data.wast:474: assert_invalid passed: + out/test/spec/function-references/data/data.57.wasm:0000029: error: global variable out of range: 1 (max 1) + 0000029: error: OnGlobalGetExpr callback failed +out/test/spec/function-references/data.wast:483: assert_invalid passed: + out/test/spec/function-references/data/data.58.wasm:000002d: error: initializer expression cannot reference a mutable global + 000002d: error: OnGlobalGetExpr callback failed +59/59 tests passed. +;;; STDOUT ;;) diff --git a/test/spec/function-references/elem.txt b/test/spec/function-references/elem.txt new file mode 100644 index 0000000000..48e136761a --- /dev/null +++ b/test/spec/function-references/elem.txt @@ -0,0 +1,90 @@ +;;; TOOL: run-interp-spec +;;; STDIN_FILE: third_party/testsuite/proposals/function-references/elem.wast +;;; ARGS*: --enable-function-references +(;; STDOUT ;;; +out/test/spec/function-references/elem.wast:508: assert_invalid passed: + out/test/spec/function-references/elem/elem.53.wasm:0000025: error: type mismatch at elem segment. got funcref, expected (ref func) + 0000025: error: OnElemSegmentElemType callback failed +out/test/spec/function-references/elem.wast:516: assert_invalid passed: + out/test/spec/function-references/elem/elem.54.wasm:0000025: error: type mismatch at elem segment. got funcref, expected (ref func) + 0000025: error: OnElemSegmentElemType callback failed +out/test/spec/function-references/elem.wast:697: assert_trap passed: out of bounds table access: table.init out of bounds +out/test/spec/function-references/elem.wast:707: assert_trap passed: out of bounds table access: table.init out of bounds +out/test/spec/function-references/elem.wast:713: assert_invalid passed: + out/test/spec/function-references/elem/elem.75.wasm:0000016: error: table variable out of range: 0 (max 0) + 0000016: error: BeginElemSegment callback failed +out/test/spec/function-references/elem.wast:724: assert_invalid passed: + out/test/spec/function-references/elem/elem.76.wasm:0000014: error: type mismatch in initializer expression, expected [i32] but got [i64] + 0000015: error: EndElemSegmentInitExpr callback failed +out/test/spec/function-references/elem.wast:732: assert_invalid passed: + out/test/spec/function-references/elem/elem.77.wasm:0000014: error: type mismatch in initializer expression, expected [i32] but got [funcref] + 0000015: error: EndElemSegmentInitExpr callback failed +out/test/spec/function-references/elem.wast:740: assert_invalid passed: + out/test/spec/function-references/elem/elem.78.wasm:0000012: error: type mismatch in initializer expression, expected [i32] but got [] + 0000013: error: EndElemSegmentInitExpr callback failed +out/test/spec/function-references/elem.wast:748: assert_invalid passed: + out/test/spec/function-references/elem/elem.79.wasm:0000016: error: type mismatch at end of initializer expression, expected [] but got [i32] + 0000017: error: EndElemSegmentInitExpr callback failed +out/test/spec/function-references/elem.wast:756: assert_invalid passed: + out/test/spec/function-references/elem/elem.80.wasm:000002c: error: type mismatch at end of initializer expression, expected [] but got [i32] + 000002d: error: EndElemSegmentInitExpr callback failed +out/test/spec/function-references/elem.wast:765: assert_invalid passed: + out/test/spec/function-references/elem/elem.81.wasm:000002c: error: type mismatch at end of initializer expression, expected [] but got [i32] + 000002d: error: EndElemSegmentInitExpr callback failed +out/test/spec/function-references/elem.wast:775: assert_invalid passed: + out/test/spec/function-references/elem/elem.82.wasm:0000015: error: invalid initializer: instruction not valid in initializer expression: i32.ctz + 0000015: error: OnUnaryExpr callback failed +out/test/spec/function-references/elem.wast:783: assert_invalid passed: + out/test/spec/function-references/elem/elem.83.wasm:0000013: error: invalid initializer: instruction not valid in initializer expression: nop + 0000013: error: OnNopExpr callback failed +out/test/spec/function-references/elem.wast:791: assert_invalid passed: + out/test/spec/function-references/elem/elem.84.wasm:0000013: error: invalid initializer: instruction not valid in initializer expression: nop + 0000013: error: OnNopExpr callback failed +out/test/spec/function-references/elem.wast:799: assert_invalid passed: + out/test/spec/function-references/elem/elem.85.wasm:0000015: error: invalid initializer: instruction not valid in initializer expression: nop + 0000015: error: OnNopExpr callback failed +out/test/spec/function-references/elem.wast:807: assert_invalid passed: + out/test/spec/function-references/elem/elem.86.wasm:0000021: error: initializer expression cannot reference a mutable global + 0000021: error: OnGlobalGetExpr callback failed +out/test/spec/function-references/elem.wast:816: assert_invalid passed: + out/test/spec/function-references/elem/elem.87.wasm:0000014: error: global variable out of range: 0 (max 0) + 0000014: error: OnGlobalGetExpr callback failed +out/test/spec/function-references/elem.wast:824: assert_invalid passed: + out/test/spec/function-references/elem/elem.88.wasm:000002a: error: global variable out of range: 1 (max 1) + 000002a: error: OnGlobalGetExpr callback failed +out/test/spec/function-references/elem.wast:833: assert_invalid passed: + out/test/spec/function-references/elem/elem.89.wasm:000002e: error: initializer expression cannot reference a mutable global + 000002e: error: OnGlobalGetExpr callback failed +out/test/spec/function-references/elem.wast:845: assert_invalid passed: + out/test/spec/function-references/elem/elem.90.wasm:0000018: error: type mismatch in initializer expression, expected [funcref] but got [externref] + 0000019: error: EndElemExpr callback failed +out/test/spec/function-references/elem.wast:853: assert_invalid passed: + out/test/spec/function-references/elem/elem.91.wasm:000001a: error: type mismatch at end of initializer expression, expected [] but got [funcref] + 000001b: error: EndElemExpr callback failed +out/test/spec/function-references/elem.wast:861: assert_invalid passed: + out/test/spec/function-references/elem/elem.92.wasm:0000018: error: type mismatch in initializer expression, expected [funcref] but got [i32] + 0000019: error: EndElemExpr callback failed +out/test/spec/function-references/elem.wast:869: assert_invalid passed: + out/test/spec/function-references/elem/elem.93.wasm:0000018: error: type mismatch in initializer expression, expected [funcref] but got [i32] + 0000019: error: EndElemExpr callback failed +out/test/spec/function-references/elem.wast:877: assert_invalid passed: + out/test/spec/function-references/elem/elem.94.wasm:0000023: error: invalid initializer: instruction not valid in initializer expression: call + 0000023: error: OnCallExpr callback failed +out/test/spec/function-references/elem.wast:886: assert_invalid passed: + out/test/spec/function-references/elem/elem.95.wasm:000001b: error: invalid initializer: instruction not valid in initializer expression: i32.add + 000001b: error: OnBinaryExpr callback failed +out/test/spec/function-references/elem.wast:945: assert_trap passed: uninitialized table element +out/test/spec/function-references/elem.wast:978: assert_invalid passed: + out/test/spec/function-references/elem/elem.101.wasm:000001f: error: type mismatch at elem segment. got (ref func), expected externref + 000001f: error: OnElemSegmentElemType callback failed +out/test/spec/function-references/elem.wast:983: assert_invalid passed: + out/test/spec/function-references/elem/elem.102.wasm:0000017: error: type mismatch at elem segment. got externref, expected funcref + 0000017: error: OnElemSegmentElemType callback failed +out/test/spec/function-references/elem.wast:988: assert_invalid passed: + out/test/spec/function-references/elem/elem.103.wasm:0000034: error: type mismatch at table.init. got funcref, expected externref + 0000034: error: OnTableInitExpr callback failed +out/test/spec/function-references/elem.wast:997: assert_invalid passed: + out/test/spec/function-references/elem/elem.104.wasm:0000030: error: type mismatch at table.init. got externref, expected funcref + 0000030: error: OnTableInitExpr callback failed +135/135 tests passed. +;;; STDOUT ;;) diff --git a/test/spec/function-references/global.txt b/test/spec/function-references/global.txt index 2810e9015b..4eeba07b35 100644 --- a/test/spec/function-references/global.txt +++ b/test/spec/function-references/global.txt @@ -123,8 +123,8 @@ out/test/spec/function-references/global.wast:585: assert_invalid passed: out/test/spec/function-references/global/global.45.wasm:0000027: error: type mismatch in global.set, expected [i32] but got [] 0000027: error: OnGlobalSetExpr callback failed out/test/spec/function-references/global.wast:595: assert_invalid passed: - out/test/spec/function-references/global/global.46.wasm:000003e: error: type mismatch in global.set, expected [i32] but got [] - 000003e: error: OnGlobalSetExpr callback failed + out/test/spec/function-references/global/global.46.wasm:0000040: error: type mismatch in global.set, expected [i32] but got [] + 0000040: error: OnGlobalSetExpr callback failed out/test/spec/function-references/global.wast:613: assert_malformed passed: out/test/spec/function-references/global/global.47.wat:1:33: error: redefinition of global "$foo" (global $foo i32 (i32.const 0))(global $foo i32 (i32.const 0)) diff --git a/test/spec/function-references/if.txt b/test/spec/function-references/if.txt new file mode 100644 index 0000000000..4b5c423de0 --- /dev/null +++ b/test/spec/function-references/if.txt @@ -0,0 +1,409 @@ +;;; TOOL: run-interp-spec +;;; STDIN_FILE: third_party/testsuite/proposals/function-references/if.wast +;;; ARGS*: --enable-function-references +(;; STDOUT ;;; +out/test/spec/function-references/if.wast:593: assert_trap passed: undefined table index +out/test/spec/function-references/if.wast:736: assert_malformed passed: + out/test/spec/function-references/if/if.1.wat:1:95: error: unexpected token "param", expected then block (e.g. (then ...)). + ...i32.const 0) (if (type $sig) (result i32) (param i32) (i32.const 1) (then))) + ^^^^^ + out/test/spec/function-references/if/if.1.wat:1:121: error: unexpected token "then", expected an instr. + ...i32.const 0) (if (type $sig) (result i32) (param i32) (i32.const 1) (then))) + ^^^^ +out/test/spec/function-references/if.wast:745: assert_malformed passed: + out/test/spec/function-references/if/if.2.wat:1:82: error: unexpected token "type", expected then block (e.g. (then ...)). + ...nc (i32.const 0) (if (param i32) (type $sig) (result i32) (i32.const 1) (... + ^^^^ + out/test/spec/function-references/if/if.2.wat:1:121: error: unexpected token "then", expected an instr. + ...i32.const 0) (if (param i32) (type $sig) (result i32) (i32.const 1) (then))) + ^^^^ +out/test/spec/function-references/if.wast:754: assert_malformed passed: + out/test/spec/function-references/if/if.3.wat:1:95: error: unexpected token "type", expected then block (e.g. (then ...)). + ...i32.const 0) (if (param i32) (result i32) (type $sig) (i32.const 1) (then))) + ^^^^ + out/test/spec/function-references/if/if.3.wat:1:121: error: unexpected token "then", expected an instr. + ...i32.const 0) (if (param i32) (result i32) (type $sig) (i32.const 1) (then))) + ^^^^ +out/test/spec/function-references/if.wast:763: assert_malformed passed: + out/test/spec/function-references/if/if.4.wat:1:83: error: unexpected token "type", expected then block (e.g. (then ...)). + ...c (i32.const 0) (if (result i32) (type $sig) (param i32) (i32.const 1) (t... + ^^^^ + out/test/spec/function-references/if/if.4.wat:1:121: error: unexpected token "then", expected an instr. + ...i32.const 0) (if (result i32) (type $sig) (param i32) (i32.const 1) (then))) + ^^^^ +out/test/spec/function-references/if.wast:772: assert_malformed passed: + out/test/spec/function-references/if/if.5.wat:1:83: error: unexpected token "param", expected then block (e.g. (then ...)). + ...c (i32.const 0) (if (result i32) (param i32) (type $sig) (i32.const 1) (t... + ^^^^^ + out/test/spec/function-references/if/if.5.wat:1:121: error: unexpected token "then", expected an instr. + ...i32.const 0) (if (result i32) (param i32) (type $sig) (i32.const 1) (then))) + ^^^^ +out/test/spec/function-references/if.wast:781: assert_malformed passed: + out/test/spec/function-references/if/if.6.wat:1:39: error: unexpected token "param", expected then block (e.g. (then ...)). + (func (i32.const 0) (if (result i32) (param i32) (i32.const 1) (then))) + ^^^^^ + out/test/spec/function-references/if/if.6.wat:1:65: error: unexpected token "then", expected an instr. + (func (i32.const 0) (if (result i32) (param i32) (i32.const 1) (then))) + ^^^^ +out/test/spec/function-references/if.wast:788: assert_malformed passed: + out/test/spec/function-references/if/if.7.wat:1:47: error: unexpected token $x, expected ). + ...(i32.const 0) (i32.const 1) (if (param $x i32) (then (drop)) (else (drop)))) + ^^ + out/test/spec/function-references/if/if.7.wat:1:69: error: unexpected token (, expected EOF. + ...(i32.const 0) (i32.const 1) (if (param $x i32) (then (drop)) (else (drop)))) + ^ +out/test/spec/function-references/if.wast:796: assert_malformed passed: + out/test/spec/function-references/if/if.8.wat:1:40: error: expected 0 results, got 1 + (type $sig (func))(func (i32.const 1) (if (type $sig) (result i32) (then (i3... + ^ +out/test/spec/function-references/if.wast:806: assert_malformed passed: + out/test/spec/function-references/if/if.9.wat:1:65: error: expected 1 arguments, got 0 + ...) (result i32)))(func (i32.const 1) (if (type $sig) (result i32) (then (i... + ^ +out/test/spec/function-references/if.wast:816: assert_malformed passed: + out/test/spec/function-references/if/if.10.wat:1:79: error: expected 1 results, got 0 + ...))(func (i32.const 0) (i32.const 1) (if (type $sig) (param i32) (then (dr... + ^ +out/test/spec/function-references/if.wast:826: assert_malformed passed: + out/test/spec/function-references/if/if.11.wat:1:83: error: expected 2 arguments, got 1 + ...))(func (i32.const 0) (i32.const 1) (if (type $sig) (param i32) (result i... + ^ +out/test/spec/function-references/if.wast:836: assert_invalid passed: + out/test/spec/function-references/if/if.12.wasm:000001f: error: type mismatch at end of function, expected [] but got [i32] + 000001f: error: EndFunctionBody callback failed +out/test/spec/function-references/if.wast:844: assert_invalid passed: + out/test/spec/function-references/if/if.13.wasm:000001e: error: type mismatch in implicit return, expected [i32] but got [] + 000001e: error: EndFunctionBody callback failed +out/test/spec/function-references/if.wast:848: assert_invalid passed: + out/test/spec/function-references/if/if.14.wasm:000001e: error: type mismatch in implicit return, expected [i64] but got [] + 000001e: error: EndFunctionBody callback failed +out/test/spec/function-references/if.wast:852: assert_invalid passed: + out/test/spec/function-references/if/if.15.wasm:000001e: error: type mismatch in implicit return, expected [f32] but got [] + 000001e: error: EndFunctionBody callback failed +out/test/spec/function-references/if.wast:856: assert_invalid passed: + out/test/spec/function-references/if/if.16.wasm:000001e: error: type mismatch in implicit return, expected [f64] but got [] + 000001e: error: EndFunctionBody callback failed +out/test/spec/function-references/if.wast:861: assert_invalid passed: + out/test/spec/function-references/if/if.17.wasm:000001e: error: type mismatch in implicit return, expected [i32] but got [] + 000001e: error: EndFunctionBody callback failed +out/test/spec/function-references/if.wast:865: assert_invalid passed: + out/test/spec/function-references/if/if.18.wasm:000001e: error: type mismatch in implicit return, expected [i64] but got [] + 000001e: error: EndFunctionBody callback failed +out/test/spec/function-references/if.wast:869: assert_invalid passed: + out/test/spec/function-references/if/if.19.wasm:000001e: error: type mismatch in implicit return, expected [f32] but got [] + 000001e: error: EndFunctionBody callback failed +out/test/spec/function-references/if.wast:873: assert_invalid passed: + out/test/spec/function-references/if/if.20.wasm:000001e: error: type mismatch in implicit return, expected [f64] but got [] + 000001e: error: EndFunctionBody callback failed +out/test/spec/function-references/if.wast:878: assert_invalid passed: + out/test/spec/function-references/if/if.21.wasm:000001e: error: type mismatch at end of `if true` branch, expected [] but got [i32] + 000001e: error: OnEndExpr callback failed +out/test/spec/function-references/if.wast:884: assert_invalid passed: + out/test/spec/function-references/if/if.22.wasm:000001e: error: type mismatch at end of `if true` branch, expected [] but got [i32] + 000001e: error: OnEndExpr callback failed +out/test/spec/function-references/if.wast:890: assert_invalid passed: + out/test/spec/function-references/if/if.23.wasm:000001f: error: type mismatch at end of `if false` branch, expected [] but got [i32] + 000001f: error: OnEndExpr callback failed +out/test/spec/function-references/if.wast:896: assert_invalid passed: + out/test/spec/function-references/if/if.24.wasm:000001d: error: type mismatch at end of `if true` branch, expected [] but got [i32] + 000001e: error: OnElseExpr callback failed +out/test/spec/function-references/if.wast:903: assert_invalid passed: + out/test/spec/function-references/if/if.25.wasm:0000020: error: type mismatch at end of `if true` branch, expected [] but got [i32, i32] + 0000020: error: OnEndExpr callback failed +out/test/spec/function-references/if.wast:909: assert_invalid passed: + out/test/spec/function-references/if/if.26.wasm:0000020: error: type mismatch at end of `if true` branch, expected [] but got [i32, i32] + 0000020: error: OnEndExpr callback failed +out/test/spec/function-references/if.wast:915: assert_invalid passed: + out/test/spec/function-references/if/if.27.wasm:0000021: error: type mismatch at end of `if false` branch, expected [] but got [i32, i32] + 0000021: error: OnEndExpr callback failed +out/test/spec/function-references/if.wast:921: assert_invalid passed: + out/test/spec/function-references/if/if.28.wasm:000001f: error: type mismatch at end of `if true` branch, expected [] but got [i32, i32] + 0000020: error: OnElseExpr callback failed +out/test/spec/function-references/if.wast:928: assert_invalid passed: + out/test/spec/function-references/if/if.29.wasm:000001c: error: type mismatch in `if true` branch, expected [i32] but got [] + 000001d: error: OnElseExpr callback failed +out/test/spec/function-references/if.wast:934: assert_invalid passed: + out/test/spec/function-references/if/if.30.wasm:000001f: error: type mismatch in `if false` branch, expected [i32] but got [] + 000001f: error: OnEndExpr callback failed +out/test/spec/function-references/if.wast:940: assert_invalid passed: + out/test/spec/function-references/if/if.31.wasm:000001d: error: type mismatch in `if true` branch, expected [i32] but got [] + 000001d: error: OnEndExpr callback failed +out/test/spec/function-references/if.wast:947: assert_invalid passed: + out/test/spec/function-references/if/if.32.wasm:000001d: error: type mismatch in `if true` branch, expected [i32, i32] but got [] + 000001e: error: OnElseExpr callback failed +out/test/spec/function-references/if.wast:953: assert_invalid passed: + out/test/spec/function-references/if/if.33.wasm:0000022: error: type mismatch in `if false` branch, expected [i32, i32] but got [] + 0000022: error: OnEndExpr callback failed +out/test/spec/function-references/if.wast:959: assert_invalid passed: + out/test/spec/function-references/if/if.34.wasm:000001e: error: type mismatch in `if true` branch, expected [i32, i32] but got [] + 000001e: error: OnEndExpr callback failed +out/test/spec/function-references/if.wast:966: assert_invalid passed: + out/test/spec/function-references/if/if.35.wasm:000001f: error: type mismatch in `if false` branch, expected [i32] but got [] + 000001f: error: OnEndExpr callback failed +out/test/spec/function-references/if.wast:972: assert_invalid passed: + out/test/spec/function-references/if/if.36.wasm:0000022: error: type mismatch in `if false` branch, expected [i32, i32] but got [] + 0000022: error: OnEndExpr callback failed +out/test/spec/function-references/if.wast:979: assert_invalid passed: + out/test/spec/function-references/if/if.37.wasm:000001d: error: type mismatch in `if true` branch, expected [i32] but got [] + 000001e: error: OnElseExpr callback failed +out/test/spec/function-references/if.wast:985: assert_invalid passed: + out/test/spec/function-references/if/if.38.wasm:0000021: error: type mismatch in `if false` branch, expected [i32] but got [] + 0000021: error: OnEndExpr callback failed +out/test/spec/function-references/if.wast:991: assert_invalid passed: + out/test/spec/function-references/if/if.39.wasm:000001d: error: type mismatch in `if true` branch, expected [i32] but got [] + 000001e: error: OnElseExpr callback failed +out/test/spec/function-references/if.wast:998: assert_invalid passed: + out/test/spec/function-references/if/if.40.wasm:000001e: error: type mismatch in `if true` branch, expected [i32, i32] but got [] + 000001f: error: OnElseExpr callback failed +out/test/spec/function-references/if.wast:1004: assert_invalid passed: + out/test/spec/function-references/if/if.41.wasm:0000024: error: type mismatch in `if false` branch, expected [i32, i32] but got [] + 0000024: error: OnEndExpr callback failed +out/test/spec/function-references/if.wast:1010: assert_invalid passed: + out/test/spec/function-references/if/if.42.wasm:000001e: error: type mismatch in `if true` branch, expected [i32, i32] but got [] + 000001f: error: OnElseExpr callback failed +out/test/spec/function-references/if.wast:1017: assert_invalid passed: + out/test/spec/function-references/if/if.43.wasm:000001e: error: type mismatch in `if true` branch, expected [i32] but got [i64] + 000001f: error: OnElseExpr callback failed +out/test/spec/function-references/if.wast:1023: assert_invalid passed: + out/test/spec/function-references/if/if.44.wasm:0000022: error: type mismatch in `if false` branch, expected [i32] but got [i64] + 0000022: error: OnEndExpr callback failed +out/test/spec/function-references/if.wast:1029: assert_invalid passed: + out/test/spec/function-references/if/if.45.wasm:000001e: error: type mismatch in `if true` branch, expected [i32] but got [i64] + 000001f: error: OnElseExpr callback failed +out/test/spec/function-references/if.wast:1036: assert_invalid passed: + out/test/spec/function-references/if/if.46.wasm:000001f: error: type mismatch in `if true` branch, expected [i32, i32] but got [i32] + 0000020: error: OnElseExpr callback failed +out/test/spec/function-references/if.wast:1042: assert_invalid passed: + out/test/spec/function-references/if/if.47.wasm:0000025: error: type mismatch in `if false` branch, expected [i32, i32] but got [i32] + 0000025: error: OnEndExpr callback failed +out/test/spec/function-references/if.wast:1048: assert_invalid passed: + out/test/spec/function-references/if/if.48.wasm:000001f: error: type mismatch in `if true` branch, expected [i32, i32] but got [i32] + 0000020: error: OnElseExpr callback failed +out/test/spec/function-references/if.wast:1055: assert_invalid passed: + out/test/spec/function-references/if/if.49.wasm:0000021: error: type mismatch in `if true` branch, expected [i32, i32] but got [i32] + 0000022: error: OnElseExpr callback failed +out/test/spec/function-references/if.wast:1062: assert_invalid passed: + out/test/spec/function-references/if/if.50.wasm:0000027: error: type mismatch in `if false` branch, expected [i32, i32] but got [i32] + 0000027: error: OnEndExpr callback failed +out/test/spec/function-references/if.wast:1069: assert_invalid passed: + out/test/spec/function-references/if/if.51.wasm:0000021: error: type mismatch in `if true` branch, expected [i32, i32] but got [i32] + 0000022: error: OnElseExpr callback failed +out/test/spec/function-references/if.wast:1077: assert_invalid passed: + out/test/spec/function-references/if/if.52.wasm:0000020: error: type mismatch at end of `if true` branch, expected [] but got [i32] + 0000021: error: OnElseExpr callback failed +out/test/spec/function-references/if.wast:1083: assert_invalid passed: + out/test/spec/function-references/if/if.53.wasm:0000024: error: type mismatch at end of `if false` branch, expected [] but got [i32] + 0000024: error: OnEndExpr callback failed +out/test/spec/function-references/if.wast:1089: assert_invalid passed: + out/test/spec/function-references/if/if.54.wasm:0000020: error: type mismatch at end of `if true` branch, expected [] but got [i32] + 0000021: error: OnElseExpr callback failed +out/test/spec/function-references/if.wast:1096: assert_invalid passed: + out/test/spec/function-references/if/if.55.wasm:000001e: error: type mismatch in `if true` branch, expected [i32] but got [i64] + 000001f: error: OnElseExpr callback failed +out/test/spec/function-references/if.wast:1102: assert_invalid passed: + out/test/spec/function-references/if/if.56.wasm:0000023: error: type mismatch at end of `if true` branch, expected [] but got [i32] + 0000024: error: OnElseExpr callback failed +out/test/spec/function-references/if.wast:1109: assert_invalid passed: + out/test/spec/function-references/if/if.57.wasm:0000025: error: type mismatch in implicit return, expected [i32] but got [i64] + 0000025: error: EndFunctionBody callback failed +out/test/spec/function-references/if.wast:1119: assert_invalid passed: + out/test/spec/function-references/if/if.58.wasm:0000025: error: type mismatch in implicit return, expected [i32] but got [i64] + 0000025: error: EndFunctionBody callback failed +out/test/spec/function-references/if.wast:1129: assert_invalid passed: + out/test/spec/function-references/if/if.59.wasm:0000027: error: type mismatch in implicit return, expected [i32] but got [i64] + 0000027: error: EndFunctionBody callback failed +out/test/spec/function-references/if.wast:1140: assert_invalid passed: + out/test/spec/function-references/if/if.60.wasm:000001e: error: type mismatch in br, expected [i32] but got [] + 000001e: error: OnBrExpr callback failed +out/test/spec/function-references/if.wast:1146: assert_invalid passed: + out/test/spec/function-references/if/if.61.wasm:0000021: error: type mismatch in br, expected [i32] but got [] + 0000021: error: OnBrExpr callback failed +out/test/spec/function-references/if.wast:1152: assert_invalid passed: + out/test/spec/function-references/if/if.62.wasm:000001f: error: type mismatch in br, expected [i32, i32] but got [] + 000001f: error: OnBrExpr callback failed +out/test/spec/function-references/if.wast:1158: assert_invalid passed: + out/test/spec/function-references/if/if.63.wasm:0000024: error: type mismatch in br, expected [i32, i32] but got [] + 0000024: error: OnBrExpr callback failed +out/test/spec/function-references/if.wast:1165: assert_invalid passed: + out/test/spec/function-references/if/if.64.wasm:000001e: error: type mismatch in br, expected [i32] but got [] + 000001e: error: OnBrExpr callback failed +out/test/spec/function-references/if.wast:1174: assert_invalid passed: + out/test/spec/function-references/if/if.65.wasm:0000021: error: type mismatch in br, expected [i32] but got [] + 0000021: error: OnBrExpr callback failed +out/test/spec/function-references/if.wast:1183: assert_invalid passed: + out/test/spec/function-references/if/if.66.wasm:000001f: error: type mismatch in br, expected [i32, i32] but got [] + 000001f: error: OnBrExpr callback failed +out/test/spec/function-references/if.wast:1192: assert_invalid passed: + out/test/spec/function-references/if/if.67.wasm:0000024: error: type mismatch in br, expected [i32, i32] but got [] + 0000024: error: OnBrExpr callback failed +out/test/spec/function-references/if.wast:1202: assert_invalid passed: + out/test/spec/function-references/if/if.68.wasm:000001f: error: type mismatch in br, expected [i32] but got [] + 000001f: error: OnBrExpr callback failed +out/test/spec/function-references/if.wast:1211: assert_invalid passed: + out/test/spec/function-references/if/if.69.wasm:0000022: error: type mismatch in br, expected [i32] but got [] + 0000022: error: OnBrExpr callback failed +out/test/spec/function-references/if.wast:1220: assert_invalid passed: + out/test/spec/function-references/if/if.70.wasm:0000020: error: type mismatch in br, expected [i32, i32] but got [] + 0000020: error: OnBrExpr callback failed +out/test/spec/function-references/if.wast:1229: assert_invalid passed: + out/test/spec/function-references/if/if.71.wasm:0000025: error: type mismatch in br, expected [i32, i32] but got [] + 0000025: error: OnBrExpr callback failed +out/test/spec/function-references/if.wast:1239: assert_invalid passed: + out/test/spec/function-references/if/if.72.wasm:0000020: error: type mismatch in br, expected [i32] but got [i64] + 0000020: error: OnBrExpr callback failed +out/test/spec/function-references/if.wast:1248: assert_invalid passed: + out/test/spec/function-references/if/if.73.wasm:0000023: error: type mismatch in br, expected [i32] but got [i64] + 0000023: error: OnBrExpr callback failed +out/test/spec/function-references/if.wast:1257: assert_invalid passed: + out/test/spec/function-references/if/if.74.wasm:0000021: error: type mismatch in br, expected [i32, i32] but got [i64] + 0000021: error: OnBrExpr callback failed +out/test/spec/function-references/if.wast:1266: assert_invalid passed: + out/test/spec/function-references/if/if.75.wasm:0000026: error: type mismatch in br, expected [i32, i32] but got [i64] + 0000026: error: OnBrExpr callback failed +out/test/spec/function-references/if.wast:1275: assert_invalid passed: + out/test/spec/function-references/if/if.76.wasm:0000023: error: type mismatch in br, expected [i32, i32] but got [i64] + 0000023: error: OnBrExpr callback failed +out/test/spec/function-references/if.wast:1285: assert_invalid passed: + out/test/spec/function-references/if/if.77.wasm:0000021: error: type mismatch in `if true` branch, expected [i32, i32] but got [i32] + 0000022: error: OnElseExpr callback failed +out/test/spec/function-references/if.wast:1296: assert_invalid passed: + out/test/spec/function-references/if/if.78.wasm:0000019: error: type mismatch in if, expected [i32] but got [] + 0000019: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1304: assert_invalid passed: + out/test/spec/function-references/if/if.79.wasm:000001d: error: type mismatch in if, expected [i32] but got [] + 000001d: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1313: assert_invalid passed: + out/test/spec/function-references/if/if.80.wasm:000001d: error: type mismatch in if, expected [i32] but got [] + 000001d: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1322: assert_invalid passed: + out/test/spec/function-references/if/if.81.wasm:000001f: error: type mismatch in if, expected [i32] but got [] + 000001f: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1331: assert_invalid passed: + out/test/spec/function-references/if/if.82.wasm:0000022: error: type mismatch in if, expected [i32] but got [] + 0000022: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1341: assert_invalid passed: + out/test/spec/function-references/if/if.83.wasm:000001d: error: type mismatch in if, expected [i32] but got [] + 000001d: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1350: assert_invalid passed: + out/test/spec/function-references/if/if.84.wasm:000001d: error: type mismatch in if, expected [i32] but got [] + 000001d: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1359: assert_invalid passed: + out/test/spec/function-references/if/if.85.wasm:000001d: error: type mismatch in if, expected [i32] but got [] + 000001d: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1368: assert_invalid passed: + out/test/spec/function-references/if/if.86.wasm:0000019: error: type mismatch in if, expected [i32] but got [] + 0000019: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1376: assert_invalid passed: + out/test/spec/function-references/if/if.87.wasm:0000019: error: type mismatch in if, expected [i32] but got [] + 0000019: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1384: assert_invalid passed: + out/test/spec/function-references/if/if.88.wasm:000001f: error: type mismatch in if, expected [i32] but got [] + 000001f: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1393: assert_invalid passed: + out/test/spec/function-references/if/if.89.wasm:0000038: error: type mismatch in if, expected [i32] but got [] + 0000038: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1409: assert_invalid passed: + out/test/spec/function-references/if/if.90.wasm:000001b: error: type mismatch in if, expected [i32] but got [] + 000001b: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1418: assert_invalid passed: + out/test/spec/function-references/if/if.91.wasm:000001b: error: type mismatch in if, expected [i32] but got [] + 000001b: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1427: assert_invalid passed: + out/test/spec/function-references/if/if.92.wasm:0000021: error: type mismatch in if, expected [i32] but got [] + 0000021: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1436: assert_invalid passed: + out/test/spec/function-references/if/if.93.wasm:000001e: error: type mismatch in if, expected [i32] but got [] + 000001e: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1445: assert_invalid passed: + out/test/spec/function-references/if/if.94.wasm:000001e: error: type mismatch in if, expected [i32] but got [] + 000001e: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1454: assert_invalid passed: + out/test/spec/function-references/if/if.95.wasm:000001e: error: type mismatch in if, expected [i32] but got [] + 000001e: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1464: assert_invalid passed: + out/test/spec/function-references/if/if.96.wasm:000001f: error: type mismatch in if, expected [i32] but got [] + 000001f: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1470: assert_invalid passed: + out/test/spec/function-references/if/if.97.wasm:0000020: error: type mismatch in if, expected [i32, f64] but got [] + 0000020: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1476: assert_invalid passed: + out/test/spec/function-references/if/if.98.wasm:0000024: error: type mismatch in if, expected [i32] but got [f32] + 0000024: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1482: assert_invalid passed: + out/test/spec/function-references/if/if.99.wasm:0000025: error: type mismatch in if, expected [f32, i32] but got [f32] + 0000025: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1488: assert_invalid passed: + out/test/spec/function-references/if/if.100.wasm:0000021: error: type mismatch in if, expected [i32] but got [] + 0000021: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1494: assert_invalid passed: + out/test/spec/function-references/if/if.101.wasm:0000022: error: type mismatch in if, expected [i32, f64] but got [] + 0000022: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1500: assert_invalid passed: + out/test/spec/function-references/if/if.102.wasm:0000026: error: type mismatch in if, expected [i32] but got [f32] + 0000026: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1506: assert_invalid passed: + out/test/spec/function-references/if/if.103.wasm:0000027: error: type mismatch in if, expected [f32, i32] but got [f32] + 0000027: error: OnIfExpr callback failed +out/test/spec/function-references/if.wast:1513: assert_malformed passed: + out/test/spec/function-references/if/if.104.wat:1:42: error: unexpected token $x, expected ). + (func (param i32) (result i32) if (param $x i32) end) + ^^ +out/test/spec/function-references/if.wast:1517: assert_malformed passed: + out/test/spec/function-references/if/if.105.wat:1:43: error: unexpected token $x, expected ). + (func (param i32) (result i32) (if (param $x i32) (then))) + ^^ +out/test/spec/function-references/if.wast:1522: assert_malformed passed: + out/test/spec/function-references/if/if.106.wat:1:26: error: unexpected label "$l" + (func i32.const 0 if end $l) + ^^ +out/test/spec/function-references/if.wast:1526: assert_malformed passed: + out/test/spec/function-references/if/if.107.wat:1:29: error: mismatching label "$a" != "$l" + (func i32.const 0 if $a end $l) + ^^ +out/test/spec/function-references/if.wast:1530: assert_malformed passed: + out/test/spec/function-references/if/if.108.wat:1:27: error: unexpected label "$l" + (func i32.const 0 if else $l end) + ^^ +out/test/spec/function-references/if.wast:1534: assert_malformed passed: + out/test/spec/function-references/if/if.109.wat:1:30: error: mismatching label "$a" != "$l" + (func i32.const 0 if $a else $l end) + ^^ +out/test/spec/function-references/if.wast:1538: assert_malformed passed: + out/test/spec/function-references/if/if.110.wat:1:31: error: unexpected label "$l" + (func i32.const 0 if else end $l) + ^^ +out/test/spec/function-references/if.wast:1542: assert_malformed passed: + out/test/spec/function-references/if/if.111.wat:1:27: error: unexpected label "$l" + (func i32.const 0 if else $l end $l) + ^^ + out/test/spec/function-references/if/if.111.wat:1:34: error: unexpected label "$l" + (func i32.const 0 if else $l end $l) + ^^ +out/test/spec/function-references/if.wast:1546: assert_malformed passed: + out/test/spec/function-references/if/if.112.wat:1:27: error: unexpected label "$l1" + (func i32.const 0 if else $l1 end $l2) + ^^^ + out/test/spec/function-references/if/if.112.wat:1:35: error: unexpected label "$l2" + (func i32.const 0 if else $l1 end $l2) + ^^^ +out/test/spec/function-references/if.wast:1550: assert_malformed passed: + out/test/spec/function-references/if/if.113.wat:1:34: error: mismatching label "$a" != "$l" + (func i32.const 0 if $a else end $l) + ^^ +out/test/spec/function-references/if.wast:1554: assert_malformed passed: + out/test/spec/function-references/if/if.114.wat:1:37: error: mismatching label "$a" != "$l" + (func i32.const 0 if $a else $a end $l) + ^^ +out/test/spec/function-references/if.wast:1558: assert_malformed passed: + out/test/spec/function-references/if/if.115.wat:1:30: error: mismatching label "$a" != "$l" + (func i32.const 0 if $a else $l end $l) + ^^ + out/test/spec/function-references/if/if.115.wat:1:37: error: mismatching label "$a" != "$l" + (func i32.const 0 if $a else $l end $l) + ^^ +out/test/spec/function-references/if.wast:1562: assert_malformed passed: + out/test/spec/function-references/if/if.116.wat:1:11: error: unexpected token i32.const, expected (. + (func (if i32.const 0 (then) (else))) + ^^^^^^^^^ +241/241 tests passed. +;;; STDOUT ;;) diff --git a/test/spec/function-references/linking.txt b/test/spec/function-references/linking.txt new file mode 100644 index 0000000000..01cd478503 --- /dev/null +++ b/test/spec/function-references/linking.txt @@ -0,0 +1,118 @@ +;;; TOOL: run-interp-spec +;;; STDIN_FILE: third_party/testsuite/proposals/function-references/linking.wast +;;; ARGS*: --enable-function-references +(;; STDOUT ;;; +out/test/spec/function-references/linking.wast:28: assert_unlinkable passed: + error: import signature mismatch +out/test/spec/function-references/linking.wast:32: assert_unlinkable passed: + error: import signature mismatch +out/test/spec/function-references/linking.wast:87: assert_unlinkable passed: + error: mutability mismatch in imported global, expected mutable but got immutable. +out/test/spec/function-references/linking.wast:91: assert_unlinkable passed: + error: mutability mismatch in imported global, expected immutable but got mutable. +out/test/spec/function-references/linking.wast:133: assert_unlinkable passed: + error: type mismatch in imported global, expected funcref but got externref. +out/test/spec/function-references/linking.wast:138: assert_unlinkable passed: + error: type mismatch in imported global, expected (ref func) but got funcref. +out/test/spec/function-references/linking.wast:142: assert_unlinkable passed: + error: type mismatch in imported global, expected (ref func) but got (ref null 0). +out/test/spec/function-references/linking.wast:146: assert_unlinkable passed: + error: type mismatch in imported global, expected (ref func) but got externref. +out/test/spec/function-references/linking.wast:151: assert_unlinkable passed: + error: type mismatch in imported global, expected (ref null 0) but got funcref. +out/test/spec/function-references/linking.wast:155: assert_unlinkable passed: + error: type mismatch in imported global, expected (ref null 0) but got (ref func). +out/test/spec/function-references/linking.wast:159: assert_unlinkable passed: + error: type mismatch in imported global, expected (ref null 0) but got externref. +out/test/spec/function-references/linking.wast:164: assert_unlinkable passed: + error: type mismatch in imported global, expected (ref 0) but got funcref. +out/test/spec/function-references/linking.wast:168: assert_unlinkable passed: + error: type mismatch in imported global, expected (ref 0) but got (ref func). +out/test/spec/function-references/linking.wast:172: assert_unlinkable passed: + error: type mismatch in imported global, expected (ref 0) but got (ref null 0). +out/test/spec/function-references/linking.wast:176: assert_unlinkable passed: + error: type mismatch in imported global, expected (ref 0) but got externref. +out/test/spec/function-references/linking.wast:181: assert_unlinkable passed: + error: type mismatch in imported global, expected externref but got funcref. +out/test/spec/function-references/linking.wast:185: assert_unlinkable passed: + error: type mismatch in imported global, expected externref but got (ref func). +out/test/spec/function-references/linking.wast:189: assert_unlinkable passed: + error: type mismatch in imported global, expected externref but got (ref null 0). +out/test/spec/function-references/linking.wast:193: assert_unlinkable passed: + error: type mismatch in imported global, expected externref but got (ref 0). +out/test/spec/function-references/linking.wast:199: assert_unlinkable passed: + error: type mismatch in imported global, expected funcref but got (ref func). +out/test/spec/function-references/linking.wast:203: assert_unlinkable passed: + error: type mismatch in imported global, expected funcref but got (ref null 0). +out/test/spec/function-references/linking.wast:207: assert_unlinkable passed: + error: type mismatch in imported global, expected funcref but got (ref 0). +out/test/spec/function-references/linking.wast:211: assert_unlinkable passed: + error: type mismatch in imported global, expected funcref but got externref. +out/test/spec/function-references/linking.wast:216: assert_unlinkable passed: + error: type mismatch in imported global, expected (ref func) but got funcref. +out/test/spec/function-references/linking.wast:220: assert_unlinkable passed: + error: type mismatch in imported global, expected (ref func) but got (ref null 0). +out/test/spec/function-references/linking.wast:224: assert_unlinkable passed: + error: type mismatch in imported global, expected (ref func) but got (ref 0). +out/test/spec/function-references/linking.wast:228: assert_unlinkable passed: + error: type mismatch in imported global, expected (ref func) but got externref. +out/test/spec/function-references/linking.wast:233: assert_unlinkable passed: + error: type mismatch in imported global, expected (ref null 0) but got funcref. +out/test/spec/function-references/linking.wast:237: assert_unlinkable passed: + error: type mismatch in imported global, expected (ref null 0) but got (ref func). +out/test/spec/function-references/linking.wast:241: assert_unlinkable passed: + error: type mismatch in imported global, expected (ref null 0) but got (ref 0). +out/test/spec/function-references/linking.wast:245: assert_unlinkable passed: + error: type mismatch in imported global, expected (ref null 0) but got externref. +out/test/spec/function-references/linking.wast:250: assert_unlinkable passed: + error: type mismatch in imported global, expected (ref 0) but got funcref. +out/test/spec/function-references/linking.wast:254: assert_unlinkable passed: + error: type mismatch in imported global, expected (ref 0) but got (ref func). +out/test/spec/function-references/linking.wast:258: assert_unlinkable passed: + error: type mismatch in imported global, expected (ref 0) but got (ref null 0). +out/test/spec/function-references/linking.wast:262: assert_unlinkable passed: + error: type mismatch in imported global, expected (ref 0) but got externref. +out/test/spec/function-references/linking.wast:267: assert_unlinkable passed: + error: type mismatch in imported global, expected externref but got funcref. +out/test/spec/function-references/linking.wast:271: assert_unlinkable passed: + error: type mismatch in imported global, expected externref but got (ref func). +out/test/spec/function-references/linking.wast:275: assert_unlinkable passed: + error: type mismatch in imported global, expected externref but got (ref null 0). +out/test/spec/function-references/linking.wast:279: assert_unlinkable passed: + error: type mismatch in imported global, expected externref but got (ref 0). +out/test/spec/function-references/linking.wast:325: assert_trap passed: uninitialized table element +out/test/spec/function-references/linking.wast:326: assert_trap passed: uninitialized table element +out/test/spec/function-references/linking.wast:328: assert_trap passed: uninitialized table element +out/test/spec/function-references/linking.wast:330: assert_trap passed: uninitialized table element +out/test/spec/function-references/linking.wast:331: assert_trap passed: uninitialized table element +out/test/spec/function-references/linking.wast:333: assert_trap passed: uninitialized table element +out/test/spec/function-references/linking.wast:335: assert_trap passed: undefined table index +out/test/spec/function-references/linking.wast:336: assert_trap passed: undefined table index +out/test/spec/function-references/linking.wast:337: assert_trap passed: undefined table index +out/test/spec/function-references/linking.wast:338: assert_trap passed: undefined table index +out/test/spec/function-references/linking.wast:341: assert_trap passed: indirect call signature mismatch +out/test/spec/function-references/linking.wast:373: assert_trap passed: uninitialized table element +out/test/spec/function-references/linking.wast:374: assert_trap passed: uninitialized table element +out/test/spec/function-references/linking.wast:376: assert_trap passed: uninitialized table element +out/test/spec/function-references/linking.wast:377: assert_trap passed: uninitialized table element +out/test/spec/function-references/linking.wast:379: assert_trap passed: undefined table index +out/test/spec/function-references/linking.wast:405: assert_unlinkable passed: + error: invalid import "Mt.mem" +out/test/spec/function-references/linking.wast:414: assert_trap passed: uninitialized table element +out/test/spec/function-references/linking.wast:428: assert_trap passed: uninitialized table element +out/test/spec/function-references/linking.wast:459: assert_unlinkable passed: + error: type mismatch in imported table, expected funcref but got (ref null 0). +out/test/spec/function-references/linking.wast:463: assert_unlinkable passed: + error: type mismatch in imported table, expected funcref but got externref. +out/test/spec/function-references/linking.wast:468: assert_unlinkable passed: + error: type mismatch in imported table, expected (ref null 0) but got funcref. +out/test/spec/function-references/linking.wast:472: assert_unlinkable passed: + error: type mismatch in imported table, expected (ref null 0) but got externref. +out/test/spec/function-references/linking.wast:477: assert_unlinkable passed: + error: type mismatch in imported table, expected externref but got funcref. +out/test/spec/function-references/linking.wast:481: assert_unlinkable passed: + error: type mismatch in imported table, expected externref but got (ref null 0). +out/test/spec/function-references/linking.wast:559: assert_unlinkable passed: + error: invalid import "Mm.tab" +158/158 tests passed. +;;; STDOUT ;;) diff --git a/test/spec/function-references/local_get.txt b/test/spec/function-references/local_get.txt new file mode 100644 index 0000000000..580bdaf7a5 --- /dev/null +++ b/test/spec/function-references/local_get.txt @@ -0,0 +1,54 @@ +;;; TOOL: run-interp-spec +;;; STDIN_FILE: third_party/testsuite/proposals/function-references/local_get.wast +;;; ARGS*: --enable-function-references +(;; STDOUT ;;; +out/test/spec/function-references/local_get.wast:149: assert_invalid passed: + out/test/spec/function-references/local_get/local_get.1.wasm:000001d: error: type mismatch in implicit return, expected [i64] but got [i32] + 000001d: error: EndFunctionBody callback failed +out/test/spec/function-references/local_get.wast:153: assert_invalid passed: + out/test/spec/function-references/local_get/local_get.2.wasm:000001d: error: type mismatch in i32.eqz, expected [i32] but got [f32] + 000001d: error: OnConvertExpr callback failed +out/test/spec/function-references/local_get.wast:157: assert_invalid passed: + out/test/spec/function-references/local_get/local_get.3.wasm:000001f: error: type mismatch in f64.neg, expected [f64] but got [i64] + 000001f: error: OnUnaryExpr callback failed +out/test/spec/function-references/local_get.wast:165: assert_invalid passed: + out/test/spec/function-references/local_get/local_get.4.wasm:000001c: error: type mismatch in implicit return, expected [i64] but got [i32] + 000001c: error: EndFunctionBody callback failed +out/test/spec/function-references/local_get.wast:169: assert_invalid passed: + out/test/spec/function-references/local_get/local_get.5.wasm:000001c: error: type mismatch in i32.eqz, expected [i32] but got [f32] + 000001c: error: OnConvertExpr callback failed +out/test/spec/function-references/local_get.wast:173: assert_invalid passed: + out/test/spec/function-references/local_get/local_get.6.wasm:000001d: error: type mismatch in f64.neg, expected [f64] but got [i64] + 000001d: error: OnUnaryExpr callback failed +out/test/spec/function-references/local_get.wast:181: assert_invalid passed: + out/test/spec/function-references/local_get/local_get.7.wasm:000001c: error: type mismatch at end of function, expected [] but got [i32] + 000001c: error: EndFunctionBody callback failed +out/test/spec/function-references/local_get.wast:185: assert_invalid passed: + out/test/spec/function-references/local_get/local_get.8.wasm:000001c: error: type mismatch at end of function, expected [] but got [i64] + 000001c: error: EndFunctionBody callback failed +out/test/spec/function-references/local_get.wast:189: assert_invalid passed: + out/test/spec/function-references/local_get/local_get.9.wasm:000001c: error: type mismatch at end of function, expected [] but got [f32] + 000001c: error: EndFunctionBody callback failed +out/test/spec/function-references/local_get.wast:193: assert_invalid passed: + out/test/spec/function-references/local_get/local_get.10.wasm:000001c: error: type mismatch at end of function, expected [] but got [f64] + 000001c: error: EndFunctionBody callback failed +out/test/spec/function-references/local_get.wast:201: assert_invalid passed: + out/test/spec/function-references/local_get/local_get.11.wasm:000001d: error: local variable out of range (max 2) + 000001d: error: OnLocalGetExpr callback failed +out/test/spec/function-references/local_get.wast:205: assert_invalid passed: + out/test/spec/function-references/local_get/local_get.12.wasm:0000020: error: local variable out of range (max 2) + 0000020: error: OnLocalGetExpr callback failed +out/test/spec/function-references/local_get.wast:210: assert_invalid passed: + out/test/spec/function-references/local_get/local_get.13.wasm:000001b: error: local variable out of range (max 2) + 000001b: error: OnLocalGetExpr callback failed +out/test/spec/function-references/local_get.wast:214: assert_invalid passed: + out/test/spec/function-references/local_get/local_get.14.wasm:000001f: error: local variable out of range (max 2) + 000001f: error: OnLocalGetExpr callback failed +out/test/spec/function-references/local_get.wast:219: assert_invalid passed: + out/test/spec/function-references/local_get/local_get.15.wasm:000001e: error: local variable out of range (max 3) + 000001e: error: OnLocalGetExpr callback failed +out/test/spec/function-references/local_get.wast:223: assert_invalid passed: + out/test/spec/function-references/local_get/local_get.16.wasm:0000021: error: local variable out of range (max 3) + 0000021: error: OnLocalGetExpr callback failed +36/36 tests passed. +;;; STDOUT ;;) diff --git a/test/spec/function-references/ref.txt b/test/spec/function-references/ref.txt index bada48ff54..d9a7c90bd8 100644 --- a/test/spec/function-references/ref.txt +++ b/test/spec/function-references/ref.txt @@ -13,7 +13,7 @@ out/test/spec/function-references/ref.wast:37: assert_invalid passed: 000000e: error: BeginGlobal callback failed out/test/spec/function-references/ref.wast:42: assert_invalid passed: out/test/spec/function-references/ref/ref.4.wasm:000000f: error: reference 1 is out of range (max: 0) in tables - 000000f: error: OnTable callback failed + 000000f: error: BeginTable callback failed out/test/spec/function-references/ref.wast:47: assert_invalid passed: out/test/spec/function-references/ref/ref.5.wasm:000000e: error: reference 1 is out of range 000000e: error: OnElemSegmentElemType callback failed diff --git a/test/spec/function-references/ref_is_null.txt b/test/spec/function-references/ref_is_null.txt new file mode 100644 index 0000000000..7e9b59f5f1 --- /dev/null +++ b/test/spec/function-references/ref_is_null.txt @@ -0,0 +1,14 @@ +;;; TOOL: run-interp-spec +;;; STDIN_FILE: third_party/testsuite/proposals/function-references/ref_is_null.wast +;;; ARGS*: --enable-function-references +(;; STDOUT ;;; +init(externref:1) => +deinit() => +out/test/spec/function-references/ref_is_null.wast:79: assert_invalid passed: + out/test/spec/function-references/ref_is_null/ref_is_null.2.wasm:000001b: error: type mismatch in ref.is_null, expected [reference] but got [i32] + 000001b: error: OnRefIsNullExpr callback failed +out/test/spec/function-references/ref_is_null.wast:83: assert_invalid passed: + out/test/spec/function-references/ref_is_null/ref_is_null.3.wasm:0000018: error: type mismatch in ref.is_null, expected [reference] but got [] + 0000018: error: OnRefIsNullExpr callback failed +22/22 tests passed. +;;; STDOUT ;;) diff --git a/test/spec/function-references/ref_null.txt b/test/spec/function-references/ref_null.txt new file mode 100644 index 0000000000..277961e5c0 --- /dev/null +++ b/test/spec/function-references/ref_null.txt @@ -0,0 +1,6 @@ +;;; TOOL: run-interp-spec +;;; STDIN_FILE: third_party/testsuite/proposals/function-references/ref_null.wast +;;; ARGS*: --enable-function-references +(;; STDOUT ;;; +4/4 tests passed. +;;; STDOUT ;;) diff --git a/test/spec/function-references/return_call.txt b/test/spec/function-references/return_call.txt new file mode 100644 index 0000000000..1cda3fd427 --- /dev/null +++ b/test/spec/function-references/return_call.txt @@ -0,0 +1,39 @@ +;;; TOOL: run-interp-spec +;;; STDIN_FILE: third_party/testsuite/proposals/function-references/return_call.wast +;;; ARGS*: --enable-function-references --enable-tail-call +(;; STDOUT ;;; +out/test/spec/function-references/return_call.wast:124: assert_invalid passed: + out/test/spec/function-references/return_call/return_call.1.wasm:000001e: error: return signatures have inconsistent types: expected [i32], got [] + 000001e: error: OnReturnCallExpr callback failed +out/test/spec/function-references/return_call.wast:131: assert_invalid passed: + out/test/spec/function-references/return_call/return_call.2.wasm:000001f: error: return signatures have inconsistent types: expected [i32], got [i64] + 000001f: error: OnReturnCallExpr callback failed +out/test/spec/function-references/return_call.wast:139: assert_invalid passed: + out/test/spec/function-references/return_call/return_call.3.wasm:000001e: error: type mismatch in return_call, expected [i32] but got [] + 000001e: error: OnReturnCallExpr callback failed +out/test/spec/function-references/return_call.wast:146: assert_invalid passed: + out/test/spec/function-references/return_call/return_call.4.wasm:000001f: error: type mismatch in return_call, expected [f64, i32] but got [] + 000001f: error: OnReturnCallExpr callback failed +out/test/spec/function-references/return_call.wast:164: assert_invalid passed: + out/test/spec/function-references/return_call/return_call.7.wasm:0000022: error: type mismatch in return_call, expected [i32, i32] but got [i32] + 0000022: error: OnReturnCallExpr callback failed +out/test/spec/function-references/return_call.wast:171: assert_invalid passed: + out/test/spec/function-references/return_call/return_call.8.wasm:0000022: error: type mismatch in return_call, expected [i32, i32] but got [i32] + 0000022: error: OnReturnCallExpr callback failed +out/test/spec/function-references/return_call.wast:178: assert_invalid passed: + out/test/spec/function-references/return_call/return_call.9.wasm:000002a: error: type mismatch in return_call, expected [i32, f64] but got [f64, i32] + 000002a: error: OnReturnCallExpr callback failed +out/test/spec/function-references/return_call.wast:185: assert_invalid passed: + out/test/spec/function-references/return_call/return_call.10.wasm:000002a: error: type mismatch in return_call, expected [f64, i32] but got [i32, f64] + 000002a: error: OnReturnCallExpr callback failed +out/test/spec/function-references/return_call.wast:192: assert_invalid passed: + out/test/spec/function-references/return_call/return_call.11.wasm:0000024: error: return signatures have inconsistent types: expected [i32], got [i32, i32] + 0000024: error: OnReturnCallExpr callback failed +out/test/spec/function-references/return_call.wast:204: assert_invalid passed: + out/test/spec/function-references/return_call/return_call.12.wasm:0000019: error: function variable out of range: 1 (max 1) + 0000019: error: OnReturnCallExpr callback failed +out/test/spec/function-references/return_call.wast:208: assert_invalid passed: + out/test/spec/function-references/return_call/return_call.13.wasm:000001d: error: function variable out of range: 1012321300 (max 1) + 000001d: error: OnReturnCallExpr callback failed +45/45 tests passed. +;;; STDOUT ;;) diff --git a/test/spec/function-references/return_call_indirect.txt b/test/spec/function-references/return_call_indirect.txt new file mode 100644 index 0000000000..0d491ef5f5 --- /dev/null +++ b/test/spec/function-references/return_call_indirect.txt @@ -0,0 +1,124 @@ +;;; TOOL: run-interp-spec +;;; STDIN_FILE: third_party/testsuite/proposals/function-references/return_call_indirect.wast +;;; ARGS*: --enable-function-references --enable-tail-call +(;; STDOUT ;;; +out/test/spec/function-references/return_call_indirect.wast:234: assert_trap passed: indirect call signature mismatch +out/test/spec/function-references/return_call_indirect.wast:235: assert_trap passed: indirect call signature mismatch +out/test/spec/function-references/return_call_indirect.wast:236: assert_trap passed: undefined table index +out/test/spec/function-references/return_call_indirect.wast:237: assert_trap passed: undefined table index +out/test/spec/function-references/return_call_indirect.wast:238: assert_trap passed: undefined table index +out/test/spec/function-references/return_call_indirect.wast:244: assert_trap passed: indirect call signature mismatch +out/test/spec/function-references/return_call_indirect.wast:245: assert_trap passed: indirect call signature mismatch +out/test/spec/function-references/return_call_indirect.wast:273: assert_malformed passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.1.wat:1:129: error: unexpected token "param", expected an expr. + ...indirect (type $sig) (result i32) (param i32) (i32.const 0) (i32.const ... + ^^^^^ + out/test/spec/function-references/return_call_indirect/return_call_indirect.1.wat:1:173: error: unexpected token ), expected EOF. + ...irect (type $sig) (result i32) (param i32) (i32.const 0) (i32.const 0) )) + ^ +out/test/spec/function-references/return_call_indirect.wast:285: assert_malformed passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.2.wat:1:116: error: unexpected token "type", expected an expr. + ...(return_call_indirect (param i32) (type $sig) (result i32) (i32.const 0... + ^^^^ + out/test/spec/function-references/return_call_indirect/return_call_indirect.2.wat:1:173: error: unexpected token ), expected EOF. + ...irect (param i32) (type $sig) (result i32) (i32.const 0) (i32.const 0) )) + ^ +out/test/spec/function-references/return_call_indirect.wast:297: assert_malformed passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.3.wat:1:129: error: unexpected token "type", expected an expr. + ...indirect (param i32) (result i32) (type $sig) (i32.const 0) (i32.const ... + ^^^^ + out/test/spec/function-references/return_call_indirect/return_call_indirect.3.wat:1:173: error: unexpected token ), expected EOF. + ...irect (param i32) (result i32) (type $sig) (i32.const 0) (i32.const 0) )) + ^ +out/test/spec/function-references/return_call_indirect.wast:309: assert_malformed passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.4.wat:1:117: error: unexpected token "type", expected an expr. + ...return_call_indirect (result i32) (type $sig) (param i32) (i32.const 0)... + ^^^^ + out/test/spec/function-references/return_call_indirect/return_call_indirect.4.wat:1:173: error: unexpected token ), expected EOF. + ...irect (result i32) (type $sig) (param i32) (i32.const 0) (i32.const 0) )) + ^ +out/test/spec/function-references/return_call_indirect.wast:321: assert_malformed passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.5.wat:1:117: error: unexpected token "param", expected an expr. + ...return_call_indirect (result i32) (param i32) (type $sig) (i32.const 0)... + ^^^^^ + out/test/spec/function-references/return_call_indirect/return_call_indirect.5.wat:1:173: error: unexpected token ), expected EOF. + ...irect (result i32) (param i32) (type $sig) (i32.const 0) (i32.const 0) )) + ^ +out/test/spec/function-references/return_call_indirect.wast:333: assert_malformed passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.6.wat:1:74: error: unexpected token "param", expected an expr. + ...return_call_indirect (result i32) (param i32) (i32.const 0) (i32.const ... + ^^^^^ + out/test/spec/function-references/return_call_indirect/return_call_indirect.6.wat:1:118: error: unexpected token ), expected EOF. + ...urn_call_indirect (result i32) (param i32) (i32.const 0) (i32.const 0) )) + ^ +out/test/spec/function-references/return_call_indirect.wast:345: assert_malformed passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.7.wat:1:53: error: unexpected token $x, expected ). + ...cref)(func (return_call_indirect (param $x i32) (i32.const 0) (i32.const 0))) + ^^ + out/test/spec/function-references/return_call_indirect/return_call_indirect.7.wat:1:89: error: unexpected token ), expected EOF. + ...cref)(func (return_call_indirect (param $x i32) (i32.const 0) (i32.const 0))) + ^ +out/test/spec/function-references/return_call_indirect.wast:352: assert_malformed passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.8.wat:1:57: error: expected 0 results, got 1 + ...ncref)(func (result i32) (return_call_indirect (type $sig) (result i32) (... + ^^^^^^^^^^^^^^^^^^^^ +out/test/spec/function-references/return_call_indirect.wast:362: assert_malformed passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.9.wat:1:82: error: expected 1 arguments, got 0 + ...ncref)(func (result i32) (return_call_indirect (type $sig) (result i32) (... + ^^^^^^^^^^^^^^^^^^^^ +out/test/spec/function-references/return_call_indirect.wast:372: assert_malformed passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.10.wat:1:69: error: expected 1 results, got 0 + ...))(table 0 funcref)(func (return_call_indirect (type $sig) (param i32) ... + ^^^^^^^^^^^^^^^^^^^^ +out/test/spec/function-references/return_call_indirect.wast:384: assert_malformed passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.11.wat:1:86: error: expected 2 arguments, got 1 + ...ncref)(func (result i32) (return_call_indirect (type $sig) (param i32) (r... + ^^^^^^^^^^^^^^^^^^^^ +out/test/spec/function-references/return_call_indirect.wast:399: assert_invalid passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.12.wasm:000001c: error: table variable out of range: 0 (max 0) + out/test/spec/function-references/return_call_indirect/return_call_indirect.12.wasm:000001c: error: type mismatch: return_call_indirect must reference table of funcref type + 000001c: error: OnReturnCallIndirectExpr callback failed +out/test/spec/function-references/return_call_indirect.wast:407: assert_invalid passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.13.wasm:0000024: error: type mismatch at end of function, expected [] but got [i32] + 0000024: error: EndFunctionBody callback failed +out/test/spec/function-references/return_call_indirect.wast:415: assert_invalid passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.14.wasm:0000026: error: return signatures have inconsistent types: expected [], got [i64] + 0000026: error: OnReturnCallIndirectExpr callback failed +out/test/spec/function-references/return_call_indirect.wast:424: assert_invalid passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.15.wasm:0000026: error: type mismatch in return_call_indirect, expected [i32] but got [] + 0000026: error: OnReturnCallIndirectExpr callback failed +out/test/spec/function-references/return_call_indirect.wast:432: assert_invalid passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.16.wasm:0000027: error: type mismatch in return_call_indirect, expected [f64, i32] but got [] + 0000027: error: OnReturnCallIndirectExpr callback failed +out/test/spec/function-references/return_call_indirect.wast:455: assert_invalid passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.19.wasm:0000027: error: type mismatch in return_call_indirect, expected [i32] but got [] + 0000027: error: OnReturnCallIndirectExpr callback failed +out/test/spec/function-references/return_call_indirect.wast:463: assert_invalid passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.20.wasm:0000028: error: type mismatch in return_call_indirect, expected [i32] but got [... i64] + 0000028: error: OnReturnCallIndirectExpr callback failed +out/test/spec/function-references/return_call_indirect.wast:472: assert_invalid passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.21.wasm:000002a: error: type mismatch in return_call_indirect, expected [i32, i32] but got [i32] + 000002a: error: OnReturnCallIndirectExpr callback failed +out/test/spec/function-references/return_call_indirect.wast:482: assert_invalid passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.22.wasm:000002a: error: type mismatch in return_call_indirect, expected [i32, i32] but got [i32] + 000002a: error: OnReturnCallIndirectExpr callback failed +out/test/spec/function-references/return_call_indirect.wast:492: assert_invalid passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.23.wasm:0000032: error: type mismatch in return_call_indirect, expected [i32, f64] but got [f64, i32] + 0000032: error: OnReturnCallIndirectExpr callback failed +out/test/spec/function-references/return_call_indirect.wast:502: assert_invalid passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.24.wasm:0000032: error: type mismatch in return_call_indirect, expected [f64, i32] but got [i32, f64] + 0000032: error: OnReturnCallIndirectExpr callback failed +out/test/spec/function-references/return_call_indirect.wast:512: assert_invalid passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.25.wasm:0000034: error: return signatures have inconsistent types: expected [i32], got [i32, i32] + 0000034: error: OnReturnCallIndirectExpr callback failed +out/test/spec/function-references/return_call_indirect.wast:526: assert_invalid passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.26.wasm:0000022: error: function type variable out of range: 1 (max 1) + 0000022: error: OnReturnCallIndirectExpr callback failed +out/test/spec/function-references/return_call_indirect.wast:533: assert_invalid passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.27.wasm:0000026: error: function type variable out of range: 1012321300 (max 1) + 0000026: error: OnReturnCallIndirectExpr callback failed +out/test/spec/function-references/return_call_indirect.wast:544: assert_invalid passed: + out/test/spec/function-references/return_call_indirect/return_call_indirect.28.wasm:0000019: error: function variable out of range: 0 (max 0) + 0000019: error: OnRefFuncExpr callback failed +76/76 tests passed. +;;; STDOUT ;;) diff --git a/test/spec/function-references/select.txt b/test/spec/function-references/select.txt new file mode 100644 index 0000000000..77e04f2482 --- /dev/null +++ b/test/spec/function-references/select.txt @@ -0,0 +1,102 @@ +;;; TOOL: run-interp-spec +;;; STDIN_FILE: third_party/testsuite/proposals/function-references/select.wast +;;; ARGS*: --enable-function-references +(;; STDOUT ;;; +out/test/spec/function-references/select.wast:282: assert_trap passed: unreachable executed +out/test/spec/function-references/select.wast:283: assert_trap passed: unreachable executed +out/test/spec/function-references/select.wast:284: assert_trap passed: unreachable executed +out/test/spec/function-references/select.wast:285: assert_trap passed: unreachable executed +out/test/spec/function-references/select.wast:322: assert_trap passed: undefined table index +out/test/spec/function-references/select.wast:323: assert_trap passed: undefined table index +out/test/spec/function-references/select.wast:364: assert_invalid passed: + out/test/spec/function-references/select/select.1.wasm:000001c: error: type mismatch in select, expected [any, any, i32] but got [i32] + 000001c: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:368: assert_invalid passed: + out/test/spec/function-references/select/select.2.wasm:000001c: error: type mismatch in select, expected [any, any, i32] but got [i32] + 000001c: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:372: assert_invalid passed: + out/test/spec/function-references/select/select.3.wasm:0000027: error: invalid arity in select instruction: 2. + 0000027: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:384: assert_invalid passed: + out/test/spec/function-references/select/select.4.wasm:0000023: error: type mismatch in select, expected [any, any, i32] but got [(ref 0), (ref 0), i32] + 0000023: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:392: assert_invalid passed: + out/test/spec/function-references/select/select.5.wasm:000001f: error: type mismatch in select, expected [any, any, i32] but got [funcref, funcref, i32] + 000001f: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:398: assert_invalid passed: + out/test/spec/function-references/select/select.6.wasm:000001f: error: type mismatch in select, expected [any, any, i32] but got [externref, externref, i32] + 000001f: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:408: assert_invalid passed: + out/test/spec/function-references/select/select.8.wasm:000001e: error: type mismatch in select, expected [i64, i64, i32] but got [i32, i64, i32] + 000001e: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:414: assert_invalid passed: + out/test/spec/function-references/select/select.9.wasm:0000021: error: type mismatch in select, expected [f32, f32, i32] but got [i32, f32, i32] + 0000021: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:420: assert_invalid passed: + out/test/spec/function-references/select/select.10.wasm:0000025: error: type mismatch in select, expected [f64, f64, i32] but got [i32, f64, i32] + 0000025: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:427: assert_invalid passed: + out/test/spec/function-references/select/select.11.wasm:000001e: error: type mismatch in select, expected [i64, i64, i32] but got [i32, i64, i32] + 000001e: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:431: assert_invalid passed: + out/test/spec/function-references/select/select.12.wasm:0000021: error: type mismatch in select, expected [f32, f32, i32] but got [i32, f32, i32] + 0000021: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:435: assert_invalid passed: + out/test/spec/function-references/select/select.13.wasm:000001e: error: type mismatch in select, expected [i64, i64, i32] but got [i32, i64, i32] + 000001e: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:439: assert_invalid passed: + out/test/spec/function-references/select/select.14.wasm:0000021: error: type mismatch in select, expected [f32, f32, i32] but got [i32, f32, i32] + 0000021: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:443: assert_invalid passed: + out/test/spec/function-references/select/select.15.wasm:0000025: error: type mismatch in select, expected [f64, f64, i32] but got [i32, f64, i32] + 0000025: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:449: assert_invalid passed: + out/test/spec/function-references/select/select.16.wasm:0000018: error: type mismatch in select, expected [any, any, i32] but got [] + 0000018: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:457: assert_invalid passed: + out/test/spec/function-references/select/select.17.wasm:000001a: error: type mismatch in select, expected [any, any, i32] but got [i32] + 000001a: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:465: assert_invalid passed: + out/test/spec/function-references/select/select.18.wasm:000001c: error: type mismatch in select, expected [i32, i32, i32] but got [i32, i32] + 000001c: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:473: assert_invalid passed: + out/test/spec/function-references/select/select.19.wasm:0000020: error: type mismatch in select, expected [any, any, i32] but got [] + 0000020: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:482: assert_invalid passed: + out/test/spec/function-references/select/select.20.wasm:0000020: error: type mismatch in select, expected [any, any, i32] but got [i32] + 0000020: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:491: assert_invalid passed: + out/test/spec/function-references/select/select.21.wasm:0000020: error: type mismatch in select, expected [i32, i32, i32] but got [i32, i32] + 0000020: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:500: assert_invalid passed: + out/test/spec/function-references/select/select.22.wasm:0000020: error: type mismatch in select, expected [any, any, i32] but got [] + 0000020: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:509: assert_invalid passed: + out/test/spec/function-references/select/select.23.wasm:0000020: error: type mismatch in select, expected [any, any, i32] but got [i32] + 0000020: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:518: assert_invalid passed: + out/test/spec/function-references/select/select.24.wasm:0000020: error: type mismatch in select, expected [i32, i32, i32] but got [i32, i32] + 0000020: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:527: assert_invalid passed: + out/test/spec/function-references/select/select.25.wasm:0000020: error: type mismatch in select, expected [any, any, i32] but got [] + 0000020: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:536: assert_invalid passed: + out/test/spec/function-references/select/select.26.wasm:0000020: error: type mismatch in select, expected [any, any, i32] but got [i32] + 0000020: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:545: assert_invalid passed: + out/test/spec/function-references/select/select.27.wasm:0000020: error: type mismatch in select, expected [i32, i32, i32] but got [i32, i32] + 0000020: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:557: assert_invalid passed: + out/test/spec/function-references/select/select.28.wasm:000001e: error: type mismatch in select, expected [i32, i32, i32] but got [i32, i32, i64] + 000001e: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:561: assert_invalid passed: + out/test/spec/function-references/select/select.29.wasm:0000021: error: type mismatch in select, expected [i32, i32, i32] but got [i32, i32, f32] + 0000021: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:565: assert_invalid passed: + out/test/spec/function-references/select/select.30.wasm:0000025: error: type mismatch in select, expected [i32, i32, i32] but got [i32, i32, f64] + 0000025: error: OnSelectExpr callback failed +out/test/spec/function-references/select.wast:572: assert_invalid passed: + out/test/spec/function-references/select/select.31.wasm:0000020: error: type mismatch in implicit return, expected [i32] but got [i64] + 0000020: error: EndFunctionBody callback failed +157/157 tests passed. +;;; STDOUT ;;) diff --git a/test/spec/function-references/table-sub.txt b/test/spec/function-references/table-sub.txt new file mode 100644 index 0000000000..94e463cbba --- /dev/null +++ b/test/spec/function-references/table-sub.txt @@ -0,0 +1,12 @@ +;;; TOOL: run-interp-spec +;;; STDIN_FILE: third_party/testsuite/proposals/function-references/table-sub.wast +;;; ARGS*: --enable-function-references +(;; STDOUT ;;; +out/test/spec/function-references/table-sub.wast:13: assert_invalid passed: + out/test/spec/function-references/table-sub/table-sub.1.wasm:000002a: error: type mismatch at table.copy. got externref, expected funcref + 000002a: error: OnTableCopyExpr callback failed +out/test/spec/function-references/table-sub.wast:24: assert_invalid passed: + out/test/spec/function-references/table-sub/table-sub.2.wasm:000002d: error: type mismatch at table.init. got externref, expected funcref + 000002d: error: OnTableInitExpr callback failed +3/3 tests passed. +;;; STDOUT ;;) diff --git a/test/spec/function-references/table.txt b/test/spec/function-references/table.txt new file mode 100644 index 0000000000..78f6023cdf --- /dev/null +++ b/test/spec/function-references/table.txt @@ -0,0 +1,75 @@ +;;; TOOL: run-interp-spec +;;; STDIN_FILE: third_party/testsuite/proposals/function-references/table.wast +;;; ARGS*: --enable-function-references +(;; STDOUT ;;; +out/test/spec/function-references/table.wast:22: assert_invalid passed: + out/test/spec/function-references/table/table.15.wasm:000000c: error: table variable out of range: 0 (max 0) + 000000c: error: BeginElemSegment callback failed +out/test/spec/function-references/table.wast:23: assert_invalid passed: + out/test/spec/function-references/table/table.16.wasm:0000016: error: table variable out of range: 0 (max 0) + 0000016: error: BeginElemSegment callback failed +out/test/spec/function-references/table.wast:27: assert_invalid passed: + out/test/spec/function-references/table/table.17.wasm:000000f: error: max elems (0) must be >= initial elems (1) + 000000f: error: BeginTable callback failed +out/test/spec/function-references/table.wast:31: assert_invalid passed: + out/test/spec/function-references/table/table.18.wasm:0000013: error: max elems (0) must be >= initial elems (4294967295) + 0000013: error: BeginTable callback failed +out/test/spec/function-references/table.wast:36: assert_malformed passed: + out/test/spec/function-references/table/table.19.wat:1:8: error: invalid int "0x1_0000_0000" + (table 0x1_0000_0000 funcref) + ^^^^^^^^^^^^^ +out/test/spec/function-references/table.wast:40: assert_malformed passed: + out/test/spec/function-references/table/table.20.wat:1:8: error: invalid int "0x1_0000_0000" + (table 0x1_0000_0000 0x1_0000_0000 funcref) + ^^^^^^^^^^^^^ + out/test/spec/function-references/table/table.20.wat:1:22: error: invalid int "0x1_0000_0000" + (table 0x1_0000_0000 0x1_0000_0000 funcref) + ^^^^^^^^^^^^^ +out/test/spec/function-references/table.wast:44: assert_malformed passed: + out/test/spec/function-references/table/table.21.wat:1:10: error: invalid int "0x1_0000_0000" + (table 0 0x1_0000_0000 funcref) + ^^^^^^^^^^^^^ +out/test/spec/function-references/table.wast:49: assert_invalid passed: + out/test/spec/function-references/table/table.22.wasm:0000012: error: type mismatch in initializer expression, expected [funcref] but got [i32] + 0000013: error: EndTableInitExpr callback failed +out/test/spec/function-references/table.wast:53: assert_invalid passed: + out/test/spec/function-references/table/table.23.wasm:0000013: error: type mismatch in initializer expression, expected [(ref func)] but got [externref] + 0000014: error: EndTableInitExpr callback failed +out/test/spec/function-references/table.wast:57: assert_invalid passed: + out/test/spec/function-references/table/table.24.wasm:0000019: error: type mismatch in initializer expression, expected [(ref 0)] but got [funcref] + 000001a: error: EndTableInitExpr callback failed +out/test/spec/function-references/table.wast:61: assert_invalid passed: + out/test/spec/function-references/table/table.25.wasm:0000013: error: type mismatch in initializer expression, expected [(ref func)] but got [funcref] + 0000014: error: EndTableInitExpr callback failed +out/test/spec/function-references/table.wast:65: assert_invalid passed: + out/test/spec/function-references/table/table.26.wasm:000000f: error: missing table initializer + 000000f: error: BeginTable callback failed +out/test/spec/function-references/table.wast:69: assert_invalid passed: + out/test/spec/function-references/table/table.27.wasm:000000f: error: missing table initializer + 000000f: error: BeginTable callback failed +out/test/spec/function-references/table.wast:73: assert_invalid passed: + out/test/spec/function-references/table/table.28.wasm:0000015: error: missing table initializer + 0000015: error: BeginTable callback failed +out/test/spec/function-references/table.wast:114: assert_invalid passed: + out/test/spec/function-references/table/table.31.wasm:0000015: error: missing table initializer + 0000015: error: BeginTable callback failed +out/test/spec/function-references/table.wast:122: assert_invalid passed: + out/test/spec/function-references/table/table.32.wasm:0000015: error: missing table initializer + 0000015: error: BeginTable callback failed +out/test/spec/function-references/table.wast:130: assert_invalid passed: + out/test/spec/function-references/table/table.33.wasm:0000016: error: missing table initializer + 0000016: error: BeginTable callback failed +out/test/spec/function-references/table.wast:141: assert_malformed passed: + out/test/spec/function-references/table/table.34.wat:1:24: error: redefinition of table "$foo" + (table $foo 1 funcref)(table $foo 1 funcref) + ^^^^^ +out/test/spec/function-references/table.wast:148: assert_malformed passed: + out/test/spec/function-references/table/table.35.wat:1:39: error: redefinition of table "$foo" + (import "" "" (table $foo 1 funcref))(table $foo 1 funcref) + ^^^^^ +out/test/spec/function-references/table.wast:155: assert_malformed passed: + out/test/spec/function-references/table/table.36.wat:1:39: error: redefinition of table "$foo" + (import "" "" (table $foo 1 funcref))(import "" "" (table $foo 1 funcref)) + ^^^^^^ +42/42 tests passed. +;;; STDOUT ;;) diff --git a/test/spec/function-references/unreached-invalid.txt b/test/spec/function-references/unreached-invalid.txt new file mode 100644 index 0000000000..f24cd1c089 --- /dev/null +++ b/test/spec/function-references/unreached-invalid.txt @@ -0,0 +1,371 @@ +;;; TOOL: run-interp-spec +;;; STDIN_FILE: third_party/testsuite/proposals/function-references/unreached-invalid.wast +;;; ARGS*: --enable-function-references +(;; STDOUT ;;; +out/test/spec/function-references/unreached-invalid.wast:4: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.0.wasm:000001a: error: local variable out of range (max 0) + 000001a: error: OnLocalGetExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:8: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.1.wasm:000001a: error: global variable out of range: 0 (max 0) + 000001a: error: OnGlobalGetExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:12: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.2.wasm:000001a: error: function variable out of range: 1 (max 1) + 000001a: error: OnCallExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:16: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.3.wasm:0000018: error: invalid depth: 1 (max 0) + 000001a: error: OnBrExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:21: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.4.wasm:000001b: error: type mismatch in i64.eqz, expected [i64] but got [i32] + 000001b: error: OnConvertExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:27: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.5.wasm:000001f: error: type mismatch in implicit return, expected [i32] but got [i64] + 000001f: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:33: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.6.wasm:0000023: error: type mismatch in select, expected [i32, i32, i32] but got [i64, i32, i32] + 0000023: error: OnSelectExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:42: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.7.wasm:000001b: error: type mismatch at end of function, expected [] but got [i32] + 000001b: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:46: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.8.wasm:000001a: error: type mismatch at end of function, expected [] but got [i32] + 000001a: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:50: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.9.wasm:000001c: error: type mismatch at end of function, expected [] but got [i32] + 000001c: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:56: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.10.wasm:000001a: error: type mismatch at end of function, expected [] but got [any] + 000001a: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:60: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.11.wasm:000001c: error: type mismatch at end of function, expected [] but got [any] + 000001c: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:64: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.12.wasm:000001e: error: type mismatch at end of function, expected [] but got [i32] + 000001e: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:71: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.13.wasm:000001f: error: type mismatch in i32.eqz, expected [i32] but got [] + 000001f: error: OnConvertExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:77: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.14.wasm:0000021: error: type mismatch in i32.eqz, expected [i32] but got [f32] + 0000021: error: OnConvertExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:83: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.15.wasm:0000020: error: type mismatch in f32.eq, expected [f32, f32] but got [i32] + 0000020: error: OnCompareExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:89: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.16.wasm:0000023: error: type mismatch in f32.eq, expected [f32, f32] but got [i32, f32] + 0000023: error: OnCompareExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:95: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.17.wasm:000001e: error: type mismatch at end of block, expected [] but got [i32] + 000001e: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:101: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.18.wasm:0000024: error: type mismatch in block, expected [i32] but got [f32] + 0000024: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:107: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.19.wasm:0000020: error: type mismatch at end of loop, expected [] but got [i32] + 0000020: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:113: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.20.wasm:0000024: error: type mismatch in loop, expected [i32] but got [f32] + 0000024: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:119: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.21.wasm:000001c: error: type mismatch at end of function, expected [] but got [i32] + 000001c: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:125: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.22.wasm:0000022: error: type mismatch in implicit return, expected [i32] but got [f32] + 0000022: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:132: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.23.wasm:000001c: error: type mismatch in i32.eqz, expected [i32] but got [] + 000001c: error: OnConvertExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:138: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.24.wasm:000001e: error: type mismatch in i32.eqz, expected [i32] but got [f32] + 000001e: error: OnConvertExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:144: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.25.wasm:000001d: error: type mismatch in f32.eq, expected [f32, f32] but got [i32] + 000001d: error: OnCompareExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:150: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.26.wasm:0000020: error: type mismatch in f32.eq, expected [f32, f32] but got [i32, f32] + 0000020: error: OnCompareExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:156: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.27.wasm:000001d: error: type mismatch at end of block, expected [] but got [i32] + 000001d: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:162: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.28.wasm:0000025: error: type mismatch in block, expected [i32] but got [f32] + 0000025: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:168: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.29.wasm:000001f: error: type mismatch at end of loop, expected [] but got [i32] + 000001f: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:174: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.30.wasm:0000023: error: type mismatch in loop, expected [i32] but got [f32] + 0000023: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:180: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.31.wasm:000001b: error: type mismatch at end of function, expected [] but got [i32] + 000001b: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:186: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.32.wasm:0000021: error: type mismatch in implicit return, expected [i32] but got [f32] + 0000021: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:193: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.33.wasm:000001c: error: type mismatch in i32.eqz, expected [i32] but got [] + 000001c: error: OnConvertExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:199: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.34.wasm:000001c: error: type mismatch in i32.eqz, expected [i32] but got [] + 000001c: error: OnConvertExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:205: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.35.wasm:000001c: error: type mismatch in i32.eqz, expected [i32] but got [] + 000001c: error: OnConvertExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:211: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.36.wasm:000001e: error: type mismatch in i32.eqz, expected [i32] but got [f32] + 000001e: error: OnConvertExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:217: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.37.wasm:000001d: error: type mismatch in f32.eq, expected [f32, f32] but got [i32] + 000001d: error: OnCompareExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:223: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.38.wasm:0000020: error: type mismatch in f32.eq, expected [f32, f32] but got [i32, f32] + 0000020: error: OnCompareExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:229: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.39.wasm:000001d: error: type mismatch at end of block, expected [] but got [i32] + 000001d: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:235: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.40.wasm:0000023: error: type mismatch in block, expected [i32] but got [f32] + 0000023: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:241: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.41.wasm:000001f: error: type mismatch at end of loop, expected [] but got [i32] + 000001f: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:247: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.42.wasm:0000021: error: type mismatch in loop, expected [i32] but got [f32] + 0000021: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:253: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.43.wasm:000001b: error: type mismatch at end of function, expected [] but got [i32] + 000001b: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:259: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.44.wasm:000001f: error: type mismatch in implicit return, expected [i32] but got [f32] + 000001f: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:265: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.45.wasm:000001e: error: type mismatch in i32.eqz, expected [i32] but got [] + 000001e: error: OnConvertExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:271: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.46.wasm:0000020: error: type mismatch in i32.eqz, expected [i32] but got [] + 0000020: error: OnConvertExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:277: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.47.wasm:000001f: error: type mismatch in i32.eqz, expected [i32] but got [] + 000001f: error: OnConvertExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:284: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.48.wasm:000001f: error: type mismatch in i32.eqz, expected [i32] but got [] + 000001f: error: OnConvertExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:290: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.49.wasm:0000021: error: type mismatch in i32.eqz, expected [i32] but got [f32] + 0000021: error: OnConvertExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:296: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.50.wasm:0000020: error: type mismatch in f32.eq, expected [f32, f32] but got [i32] + 0000020: error: OnCompareExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:302: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.51.wasm:0000023: error: type mismatch in f32.eq, expected [f32, f32] but got [i32, f32] + 0000023: error: OnCompareExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:308: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.52.wasm:0000020: error: type mismatch at end of block, expected [] but got [i32] + 0000020: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:314: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.53.wasm:0000026: error: type mismatch in block, expected [i32] but got [... f32] + out/test/spec/function-references/unreached-invalid/unreached-invalid.53.wasm:0000026: error: type mismatch at end of block, expected [] but got [i32] + 0000026: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:321: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.54.wasm:0000022: error: type mismatch at end of loop, expected [] but got [i32] + 0000022: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:327: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.55.wasm:0000024: error: type mismatch in loop, expected [i32] but got [f32] + 0000024: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:334: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.56.wasm:000001e: error: type mismatch at end of function, expected [] but got [i32] + 000001e: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:340: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.57.wasm:0000022: error: type mismatch in implicit return, expected [i32] but got [f32] + 0000022: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:348: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.58.wasm:0000020: error: type mismatch in i32.eqz, expected [i32] but got [] + 0000020: error: OnConvertExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:354: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.59.wasm:0000022: error: type mismatch in i32.eqz, expected [i32] but got [f32] + 0000022: error: OnConvertExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:360: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.60.wasm:0000021: error: type mismatch in f32.eq, expected [f32, f32] but got [i32] + 0000021: error: OnCompareExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:366: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.61.wasm:0000024: error: type mismatch in f32.eq, expected [f32, f32] but got [i32, f32] + 0000024: error: OnCompareExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:372: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.62.wasm:0000021: error: type mismatch at end of block, expected [] but got [i32] + 0000021: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:378: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.63.wasm:0000027: error: type mismatch in block, expected [i32] but got [... f32] + out/test/spec/function-references/unreached-invalid/unreached-invalid.63.wasm:0000027: error: type mismatch at end of block, expected [] but got [i32] + 0000027: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:384: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.64.wasm:0000023: error: type mismatch at end of loop, expected [] but got [i32] + 0000023: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:390: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.65.wasm:0000025: error: type mismatch in loop, expected [i32] but got [f32] + 0000025: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:396: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.66.wasm:000001f: error: type mismatch at end of function, expected [] but got [i32] + 000001f: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:402: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.67.wasm:0000023: error: type mismatch in implicit return, expected [i32] but got [f32] + 0000023: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:409: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.68.wasm:000001d: error: type mismatch in i32.eqz, expected [i32] but got [] + 000001d: error: OnConvertExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:415: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.69.wasm:0000021: error: type mismatch in i32.eqz, expected [i32] but got [f32] + 0000021: error: OnConvertExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:421: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.70.wasm:000001e: error: type mismatch in f32.eq, expected [f32, f32] but got [i32] + 000001e: error: OnCompareExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:427: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.71.wasm:0000023: error: type mismatch in f32.eq, expected [f32, f32] but got [i32, f32] + 0000023: error: OnCompareExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:433: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.72.wasm:000001e: error: type mismatch at end of `if true` branch, expected [] but got [i32] + 000001e: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:439: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.73.wasm:0000022: error: type mismatch in `if true` branch, expected [i32] but got [f32] + 0000022: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:445: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.74.wasm:0000020: error: type mismatch at end of block, expected [] but got [i32] + 0000020: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:451: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.75.wasm:0000024: error: type mismatch in block, expected [i32] but got [f32] + 0000024: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:457: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.76.wasm:0000020: error: type mismatch at end of loop, expected [] but got [i32] + 0000020: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:463: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.77.wasm:0000024: error: type mismatch in loop, expected [i32] but got [f32] + 0000024: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:470: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.78.wasm:0000025: error: type mismatch in return, expected [i32] but got [f64] + 0000025: error: OnReturnExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:477: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.79.wasm:0000029: error: type mismatch in br, expected [i32] but got [f64] + 0000029: error: OnBrExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:484: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.80.wasm:0000021: error: type mismatch in br_if, expected [i32] but got [f32] + 0000021: error: OnBrIfExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:490: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.81.wasm:0000024: error: type mismatch at end of block, expected [] but got [i32] + 0000024: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:498: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.82.wasm:0000024: error: type mismatch in block, expected [f32] but got [i32] + 0000024: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:507: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.83.wasm:0000024: error: type mismatch at end of block, expected [] but got [i32] + 0000024: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:515: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.84.wasm:0000022: error: type mismatch in br_table, expected [i32] but got [f32] + 0000022: error: OnBrTableExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:521: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.85.wasm:0000025: error: type mismatch in br_table, expected [i32] but got [f32] + 0000025: error: OnBrTableExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:527: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.86.wasm:0000023: error: br_table labels have inconsistent types: expected [f32], got [] + 0000023: error: OnBrTableExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:540: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.87.wasm:0000020: error: type mismatch at end of block, expected [] but got [i32] + 0000020: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:546: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.88.wasm:0000020: error: type mismatch in implicit return, expected [i32] but got [] + 0000020: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:552: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.89.wasm:0000022: error: type mismatch in implicit return, expected [i32] but got [i64] + 0000022: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:558: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.90.wasm:0000023: error: type mismatch at end of block, expected [] but got [i32] + 0000023: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:565: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.91.wasm:0000021: error: type mismatch at end of block, expected [] but got [i32] + 0000021: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:571: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.92.wasm:0000022: error: type mismatch in block, expected [i32] but got [] + 0000022: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:577: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.93.wasm:0000024: error: type mismatch in block, expected [i32] but got [i64] + 0000024: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:584: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.94.wasm:0000023: error: type mismatch at end of block, expected [] but got [i32] + 0000023: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:590: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.95.wasm:0000025: error: type mismatch in block, expected [i32] but got [] + 0000025: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:596: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.96.wasm:0000027: error: type mismatch in block, expected [i32] but got [i64] + 0000027: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:604: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.97.wasm:0000024: error: type mismatch at end of block, expected [] but got [i32] + 0000024: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:611: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.98.wasm:0000020: error: type mismatch at end of block, expected [] but got [i32] + 0000020: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:617: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.99.wasm:0000022: error: type mismatch in implicit return, expected [i32] but got [] + 0000022: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:623: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.100.wasm:0000024: error: type mismatch in implicit return, expected [i32] but got [i64] + 0000024: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:629: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.101.wasm:0000025: error: type mismatch at end of block, expected [] but got [i32] + 0000025: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:637: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.102.wasm:0000020: error: type mismatch at end of loop, expected [] but got [i32] + 0000020: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:643: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.103.wasm:0000020: error: type mismatch in implicit return, expected [i32] but got [] + 0000020: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:649: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.104.wasm:0000022: error: type mismatch in implicit return, expected [i32] but got [i64] + 0000022: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:656: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.105.wasm:000001f: error: type mismatch in implicit return, expected [i32] but got [] + 000001f: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:662: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.106.wasm:0000020: error: type mismatch in implicit return, expected [i32] but got [] + 0000020: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:669: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.107.wasm:000001d: error: type mismatch at end of function, expected [] but got [i32] + 000001d: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:676: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.108.wasm:0000022: error: type mismatch at end of block, expected [] but got [i32] + 0000022: error: OnEndExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:687: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.109.wasm:000001c: error: type mismatch in i64.extend_i32_u, expected [i32] but got [i64] + 000001c: error: OnConvertExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:698: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.110.wasm:000001b: error: type mismatch at end of function, expected [] but got [f32] + 000001b: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:710: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.111.wasm:000001f: error: type mismatch in select, expected [i64, i64, i32] but got [i32, i64, i32] + 000001f: error: OnSelectExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:715: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.112.wasm:000001f: error: type mismatch in select, expected [i32, i32, i32] but got [i64, i32, i32] + 000001f: error: OnSelectExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:721: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.113.wasm:000001f: error: type mismatch in select, expected [i32, i32, i32] but got [i32, i32, i64] + 000001f: error: OnSelectExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:726: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.114.wasm:000001d: error: type mismatch in select, expected [i32, i32, i32] but got [i32, i64] + 000001d: error: OnSelectExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:731: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.115.wasm:000001b: error: type mismatch in select, expected [any, any, i32] but got [i64] + 000001b: error: OnSelectExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:737: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.116.wasm:000001f: error: type mismatch in implicit return, expected [i32] but got [i64] + 000001f: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:744: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.117.wasm:000001a: error: type mismatch at end of function, expected [] but got [any] + 000001a: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:749: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.118.wasm:0000026: error: type mismatch in br_table, expected [i32] but got [externref] + 0000026: error: OnBrTableExpr callback failed +out/test/spec/function-references/unreached-invalid.wast:764: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.119.wasm:0000021: error: type mismatch in implicit return, expected [i32] but got [i64] + 0000021: error: EndFunctionBody callback failed +out/test/spec/function-references/unreached-invalid.wast:774: assert_invalid passed: + out/test/spec/function-references/unreached-invalid/unreached-invalid.120.wasm:0000022: error: type mismatch at end of function, expected [] but got [i32] + 0000022: error: EndFunctionBody callback failed +121/121 tests passed. +;;; STDOUT ;;) diff --git a/test/spec/function-references/unreached-valid.txt b/test/spec/function-references/unreached-valid.txt new file mode 100644 index 0000000000..fbf034ed99 --- /dev/null +++ b/test/spec/function-references/unreached-valid.txt @@ -0,0 +1,16 @@ +;;; TOOL: run-interp-spec +;;; STDIN_FILE: third_party/testsuite/proposals/function-references/unreached-valid.wast +;;; ARGS*: --enable-function-references +(;; STDOUT ;;; +out/test/spec/function-references/unreached-valid.wast:48: assert_trap passed: unreachable executed +out/test/spec/function-references/unreached-valid.wast:49: assert_trap passed: unreachable executed +out/test/spec/function-references/unreached-valid.wast:50: assert_trap passed: unreachable executed +out/test/spec/function-references/unreached-valid.wast:51: assert_trap passed: unreachable executed +out/test/spec/function-references/unreached-valid.wast:53: assert_trap passed: unreachable executed +out/test/spec/function-references/unreached-valid.wast:54: assert_trap passed: unreachable executed +out/test/spec/function-references/unreached-valid.wast:55: assert_trap passed: unreachable executed +out/test/spec/function-references/unreached-valid.wast:56: assert_trap passed: unreachable executed +out/test/spec/function-references/unreached-valid.wast:58: assert_trap passed: unreachable executed +out/test/spec/function-references/unreached-valid.wast:77: assert_trap passed: unreachable executed +12/12 tests passed. +;;; STDOUT ;;) diff --git a/test/spec/memory64/table.txt b/test/spec/memory64/table.txt index 1fb959594d..2f04749958 100644 --- a/test/spec/memory64/table.txt +++ b/test/spec/memory64/table.txt @@ -79,10 +79,10 @@ (;; STDOUT ;;; out/test/spec/memory64/table.txt:17: assert_invalid passed: out/test/spec/memory64/table/table.9.wasm:000000f: error: max elems (0) must be >= initial elems (1) - 000000f: error: OnTable callback failed + 000000f: error: BeginTable callback failed out/test/spec/memory64/table.txt:21: assert_invalid passed: out/test/spec/memory64/table/table.10.wasm:0000013: error: max elems (0) must be >= initial elems (4294967295) - 0000013: error: OnTable callback failed + 0000013: error: BeginTable callback failed out/test/spec/memory64/table.txt:26: assert_invalid passed: out/test/spec/memory64/table/table.11.wat:1:8: error: invalid int "0x1_0000_0000" (table 0x1_0000_0000 funcref) @@ -100,10 +100,10 @@ out/test/spec/memory64/table.txt:34: assert_invalid passed: ^^^^^^^^^^^^^ out/test/spec/memory64/table.txt:52: assert_invalid passed: out/test/spec/memory64/table/table.23.wasm:000000f: error: max elems (0) must be >= initial elems (1) - 000000f: error: OnTable callback failed + 000000f: error: BeginTable callback failed out/test/spec/memory64/table.txt:56: assert_invalid passed: out/test/spec/memory64/table/table.24.wasm:0000013: error: max elems (0) must be >= initial elems (4294967295) - 0000013: error: OnTable callback failed + 0000013: error: BeginTable callback failed out/test/spec/memory64/table.txt:62: assert_invalid passed: out/test/spec/memory64/table/table.25.wasm:000000c: error: table variable out of range: 0 (max 0) 000000c: error: BeginElemSegment callback failed diff --git a/test/spec/table.txt b/test/spec/table.txt index 360b4c2562..0654e62353 100644 --- a/test/spec/table.txt +++ b/test/spec/table.txt @@ -9,10 +9,10 @@ out/test/spec/table.wast:15: assert_invalid passed: 0000016: error: BeginElemSegment callback failed out/test/spec/table.wast:19: assert_invalid passed: out/test/spec/table/table.11.wasm:000000f: error: max elems (0) must be >= initial elems (1) - 000000f: error: OnTable callback failed + 000000f: error: BeginTable callback failed out/test/spec/table.wast:23: assert_invalid passed: out/test/spec/table/table.12.wasm:0000013: error: max elems (0) must be >= initial elems (4294967295) - 0000013: error: OnTable callback failed + 0000013: error: BeginTable callback failed out/test/spec/table.wast:28: assert_malformed passed: out/test/spec/table/table.13.wat:1:8: error: invalid int "0x1_0000_0000" (table 0x1_0000_0000 funcref) diff --git a/test/update-spec-tests.py b/test/update-spec-tests.py index 8e45a148e5..dbc9aeafb2 100755 --- a/test/update-spec-tests.py +++ b/test/update-spec-tests.py @@ -104,6 +104,7 @@ def main(args): 'relaxed-simd': '--enable-relaxed-simd', 'exception-handling': '--enable-exceptions', 'custom-page-sizes': '--enable-custom-page-sizes', + 'function-references': '--enable-function-references', } old_proposal_flags = { @@ -112,7 +113,6 @@ def main(args): unimplemented = set([ 'gc', - 'function-references', 'threads', 'annotations', 'wide-arithmetic',