From 9b463c5c7144d890bad3ed3c99e2c185799b8590 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Thu, 5 Aug 2021 11:50:18 -0700 Subject: [PATCH] Fix parsing of empty element `func` segments This fixes an issue where `(elem func)` was parsed as `(elem funcref)` which meant we couldn't distinguish the two nodes in the AST. The fix is to force the usage of index-based elements if `func` is used. --- crates/wast/src/ast/table.rs | 8 ++++---- tests/local/empty-elem.wast | 6 ++++++ 2 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 tests/local/empty-elem.wast diff --git a/crates/wast/src/ast/table.rs b/crates/wast/src/ast/table.rs index ef019d0f4d..0a5dcb2fd7 100644 --- a/crates/wast/src/ast/table.rs +++ b/crates/wast/src/ast/table.rs @@ -188,15 +188,15 @@ impl<'a> Parse<'a> for ElemPayload<'a> { impl<'a> ElemPayload<'a> { fn parse_tail(parser: Parser<'a>, ty: Option>) -> Result { - let ty = match ty { + let (must_use_indices, ty) = match ty { None => { parser.parse::>()?; - ast::RefType::func() + (true, ast::RefType::func()) } - Some(ty) => ty, + Some(ty) => (false, ty), }; if let ast::HeapType::Func = ty.heap { - if parser.peek::>() { + if must_use_indices || parser.peek::>() { let mut elems = Vec::new(); while !parser.is_empty() { elems.push(parser.parse::>()?.0); diff --git a/tests/local/empty-elem.wast b/tests/local/empty-elem.wast new file mode 100644 index 0000000000..e30f9bd092 --- /dev/null +++ b/tests/local/empty-elem.wast @@ -0,0 +1,6 @@ +(module + (elem) + (elem func) + (elem funcref) + (elem declare func) + (elem declare funcref))