summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xscripts/fuzz_opt.py2
-rw-r--r--src/wasm/wasm-binary.cpp24
-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)
+ )
)