From 41d9b550c2d2e716e30b0bc7492b76cd41423c5d Mon Sep 17 00:00:00 2001 From: stevenfontanella Date: Fri, 28 Nov 2025 02:35:54 +0000 Subject: [PATCH 1/2] Add support for ref.null constant in WAST expectations --- scripts/test/shared.py | 5 ++--- src/parser/wast-parser.cpp | 7 +++++++ src/parser/wat-parser.h | 5 ++++- src/tools/wasm-shell.cpp | 6 ++++++ 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/scripts/test/shared.py b/scripts/test/shared.py index b1764d30f36..a21712ac31e 100644 --- a/scripts/test/shared.py +++ b/scripts/test/shared.py @@ -455,10 +455,9 @@ def get_tests(test_dir, extensions=[], recursive=False): 'try_table.wast', # Requires try_table interpretation 'local_init.wast', # Requires local validation to respect unnamed blocks 'ref_func.wast', # Requires rejecting undeclared functions references - 'ref_is_null.wast', # Requires ref.null wast constants - 'ref_null.wast', # Requires ref.null wast constants + 'ref_is_null.wast', # Requires support for non-nullable reference types in tables 'return_call_indirect.wast', # Requires more precise unreachable validation - 'select.wast', # Requires ref.null wast constants + 'select.wast', # Missing type checking for func references 'table.wast', # Requires support for table default elements 'unreached-invalid.wast', # Requires more precise unreachable validation 'array.wast', # Requires support for table default elements diff --git a/src/parser/wast-parser.cpp b/src/parser/wast-parser.cpp index 6aa9d6a200b..d49cd29a762 100644 --- a/src/parser/wast-parser.cpp +++ b/src/parser/wast-parser.cpp @@ -213,6 +213,13 @@ Result result(Lexer& in) { return lanes; } + if (in.takeSExprStart("ref.null")) { + if (!in.takeRParen()) { + return in.err("expected end of ref.null"); + } + return NullRefResult{}; + } + if (in.takeSExprStart("ref.extern")) { if (!in.takeRParen()) { return in.err("expected end of ref.extern"); diff --git a/src/parser/wat-parser.h b/src/parser/wat-parser.h index 6bbe8601a4c..1b7bd595003 100644 --- a/src/parser/wat-parser.h +++ b/src/parser/wat-parser.h @@ -63,6 +63,8 @@ struct RefResult { HeapType type; }; +struct NullRefResult {}; + enum class NaNKind { Canonical, Arithmetic }; struct NaNResult { @@ -74,7 +76,8 @@ using LaneResult = std::variant; using LaneResults = std::vector; -using ExpectedResult = std::variant; +using ExpectedResult = + std::variant; using ExpectedResults = std::vector; diff --git a/src/tools/wasm-shell.cpp b/src/tools/wasm-shell.cpp index 1ee9a5a4c5f..910f5f2e7bb 100644 --- a/src/tools/wasm-shell.cpp +++ b/src/tools/wasm-shell.cpp @@ -342,6 +342,12 @@ struct Shell { << atIndex(); return Err{err.str()}; } + } else if ([[maybe_unused]] auto* nullRef = + std::get_if(&expected)) { + if (!val.isNull()) { + err << "expected ref.null, got " << val << atIndex(); + return Err{err.str()}; + } } else if (auto* nan = std::get_if(&expected)) { auto check = checkNaN(val, *nan); if (auto* e = check.getErr()) { From 96e87eec8ca1a7d9f759a9b5906d8c091dfc826d Mon Sep 17 00:00:00 2001 From: stevenfontanella Date: Mon, 1 Dec 2025 18:46:17 +0000 Subject: [PATCH 2/2] Fix failure reason for select.wast test --- scripts/test/shared.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/test/shared.py b/scripts/test/shared.py index a21712ac31e..d21b4ae6d19 100644 --- a/scripts/test/shared.py +++ b/scripts/test/shared.py @@ -457,7 +457,7 @@ def get_tests(test_dir, extensions=[], recursive=False): 'ref_func.wast', # Requires rejecting undeclared functions references 'ref_is_null.wast', # Requires support for non-nullable reference types in tables 'return_call_indirect.wast', # Requires more precise unreachable validation - 'select.wast', # Missing type checking for func references + 'select.wast', # Missing validation of type annotation on select 'table.wast', # Requires support for table default elements 'unreached-invalid.wast', # Requires more precise unreachable validation 'array.wast', # Requires support for table default elements