Skip to content

Commit 854e01b

Browse files
Add support for ref.null constant in WAST expectations (#8076)
Fixes `ref_null.wast` spec test and partially fixes `ref_is_null.wast` and `select.wast`.
1 parent 6ec238b commit 854e01b

File tree

4 files changed

+19
-4
lines changed

4 files changed

+19
-4
lines changed

scripts/test/shared.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -455,10 +455,9 @@ def get_tests(test_dir, extensions=[], recursive=False):
455455
'try_table.wast', # Requires try_table interpretation
456456
'local_init.wast', # Requires local validation to respect unnamed blocks
457457
'ref_func.wast', # Requires rejecting undeclared functions references
458-
'ref_is_null.wast', # Requires ref.null wast constants
459-
'ref_null.wast', # Requires ref.null wast constants
458+
'ref_is_null.wast', # Requires support for non-nullable reference types in tables
460459
'return_call_indirect.wast', # Requires more precise unreachable validation
461-
'select.wast', # Requires ref.null wast constants
460+
'select.wast', # Missing validation of type annotation on select
462461
'table.wast', # Requires support for table default elements
463462
'unreached-invalid.wast', # Requires more precise unreachable validation
464463
'array.wast', # Requires support for table default elements

src/parser/wast-parser.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,13 @@ Result<ExpectedResult> result(Lexer& in) {
213213
return lanes;
214214
}
215215

216+
if (in.takeSExprStart("ref.null")) {
217+
if (!in.takeRParen()) {
218+
return in.err("expected end of ref.null");
219+
}
220+
return NullRefResult{};
221+
}
222+
216223
if (in.takeSExprStart("ref.extern")) {
217224
if (!in.takeRParen()) {
218225
return in.err("expected end of ref.extern");

src/parser/wat-parser.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ struct RefResult {
6363
HeapType type;
6464
};
6565

66+
struct NullRefResult {};
67+
6668
enum class NaNKind { Canonical, Arithmetic };
6769

6870
struct NaNResult {
@@ -74,7 +76,8 @@ using LaneResult = std::variant<Literal, NaNResult>;
7476

7577
using LaneResults = std::vector<LaneResult>;
7678

77-
using ExpectedResult = std::variant<Literal, RefResult, NaNResult, LaneResults>;
79+
using ExpectedResult =
80+
std::variant<Literal, NullRefResult, RefResult, NaNResult, LaneResults>;
7881

7982
using ExpectedResults = std::vector<ExpectedResult>;
8083

src/tools/wasm-shell.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,12 @@ struct Shell {
342342
<< atIndex();
343343
return Err{err.str()};
344344
}
345+
} else if ([[maybe_unused]] auto* nullRef =
346+
std::get_if<NullRefResult>(&expected)) {
347+
if (!val.isNull()) {
348+
err << "expected ref.null, got " << val << atIndex();
349+
return Err{err.str()};
350+
}
345351
} else if (auto* nan = std::get_if<NaNResult>(&expected)) {
346352
auto check = checkNaN(val, *nan);
347353
if (auto* e = check.getErr()) {

0 commit comments

Comments
 (0)