diff options
-rwxr-xr-x | scripts/fuzz_opt.py | 2 | ||||
-rw-r--r-- | src/wasm/wasm-binary.cpp | 24 | ||||
-rw-r--r-- | test/lit/basic/shared-types-no-gc.wast (renamed from test/lit/basic/shared-null-no-gc.wast) | 15 |
3 files changed, 20 insertions, 21 deletions
diff --git a/scripts/fuzz_opt.py b/scripts/fuzz_opt.py index a591f9414..e7826c0f3 100755 --- a/scripts/fuzz_opt.py +++ b/scripts/fuzz_opt.py @@ -361,7 +361,7 @@ INITIAL_CONTENTS_IGNORE = [ 'shared-absheaptype.wast', 'type-ssa-shared.wast', 'shared-ref_eq.wast', - 'shared-null-no-gc.wast', + 'shared-types-no-gc.wast', ] diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index d35edadc8..20815b701 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -1520,23 +1520,15 @@ void WasmBinaryWriter::writeType(Type type) { // internally use more refined versions of those types, but we cannot emit // those more refined types. if (!wasm->features.hasGC()) { - if (Type::isSubType(type, Type(HeapType::func, Nullable))) { - o << S32LEB(BinaryConsts::EncodedType::funcref); - return; - } - if (Type::isSubType(type, Type(HeapType::ext, Nullable))) { - o << S32LEB(BinaryConsts::EncodedType::externref); - return; - } - if (Type::isSubType(type, Type(HeapType::exn, Nullable))) { - o << S32LEB(BinaryConsts::EncodedType::exnref); - return; - } - if (Type::isSubType(type, Type(HeapType::string, Nullable))) { - o << S32LEB(BinaryConsts::EncodedType::stringref); - return; + auto ht = type.getHeapType(); + if (ht.isBasic() && ht.getBasic(Unshared) == HeapType::string) { + // Do not overgeneralize stringref to anyref. We have tests that when a + // stringref is expected, we actually get a stringref. If we see a + // string, the stringref feature must be enabled. + type = Type(HeapTypes::string.getBasic(ht.getShared()), Nullable); + } else { + type = Type(type.getHeapType().getTop(), Nullable); } - WASM_UNREACHABLE("bad type without GC"); } auto heapType = type.getHeapType(); if (type.isNullable() && heapType.isBasic() && !heapType.isShared()) { diff --git a/test/lit/basic/shared-null-no-gc.wast b/test/lit/basic/shared-types-no-gc.wast index b920f80f8..94c664f58 100644 --- a/test/lit/basic/shared-null-no-gc.wast +++ b/test/lit/basic/shared-types-no-gc.wast @@ -1,19 +1,26 @@ ;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited. -;; Test that we can write a binary without crashing when using a shared bottom -;; type without GC enabled. +;; Test that we can write a binary without crashing when using shared reference +;; types without GC enabled. ;; RUN: wasm-opt %s --enable-reference-types --enable-shared-everything --roundtrip -S -o - | filecheck %s (module - ;; CHECK: (func $test + ;; CHECK: (func $null ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (ref.null (shared nofunc)) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - (func $test + (func $null (drop (ref.null (shared func)) ) ) + + ;; CHECK: (func $signature (result (ref null (shared func))) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (func $signature (result (ref null (shared func))) + (unreachable) + ) ) |