diff options
-rw-r--r-- | src/wasm/wasm-type.cpp | 8 | ||||
-rw-r--r-- | test/lit/nominal-good.wast | 70 |
2 files changed, 50 insertions, 28 deletions
diff --git a/src/wasm/wasm-type.cpp b/src/wasm/wasm-type.cpp index 9bae42e98..eb1bd14b1 100644 --- a/src/wasm/wasm-type.cpp +++ b/src/wasm/wasm-type.cpp @@ -2278,9 +2278,11 @@ Type TypeBuilder::getTempRttType(Rtt rtt) { void TypeBuilder::setSubType(size_t i, size_t j) { assert(i < size() && j < size() && "index out of bounds"); - HeapTypeInfo* sub = impl->entries[i].info.get(); - HeapTypeInfo* super = impl->entries[j].info.get(); - sub->supertype = super; + if (typeSystem == TypeSystem::Nominal) { + HeapTypeInfo* sub = impl->entries[i].info.get(); + HeapTypeInfo* super = impl->entries[j].info.get(); + sub->supertype = super; + } } namespace { diff --git a/test/lit/nominal-good.wast b/test/lit/nominal-good.wast index 8fff43d6a..4110fb96b 100644 --- a/test/lit/nominal-good.wast +++ b/test/lit/nominal-good.wast @@ -1,46 +1,66 @@ ;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited. -;; RUN: wasm-opt %s -all --nominal -S -o - | filecheck %s -;; RUN: wasm-opt %s -all --nominal --roundtrip -S -o - | filecheck %s +;; RUN: wasm-opt %s -all --nominal -S -o - | filecheck %s --check-prefix NOMINAL +;; RUN: wasm-opt %s -all --nominal --roundtrip -S -o - | filecheck %s --check-prefix NOMINAL +;; RUN: wasm-opt %s -all -S -o - | filecheck %s --check-prefix EQUIREC +;; RUN: wasm-opt %s -all --roundtrip -S -o - | filecheck %s --check-prefix EQUIREC (module - ;; CHECK: (type $super-struct (struct (field i32))) - ;; CHECK: (type $sub-struct (struct (field i32) (field i64)) (extends $super-struct)) - (type $sub-struct (struct i32 i64) (extends $super-struct)) + ;; NOMINAL: (type $super-struct (struct (field i32))) + ;; EQUIREC: (type $super-struct (struct (field i32))) (type $super-struct (struct i32)) - ;; CHECK: (type $super-array (array (ref $super-struct))) - ;; CHECK: (type $sub-array (array (ref $sub-struct)) (extends $super-array)) - (type $sub-array (array (ref $sub-struct)) (extends $super-array)) + ;; NOMINAL: (type $sub-struct (struct (field i32) (field i64)) (extends $super-struct)) + ;; EQUIREC: (type $sub-struct (struct (field i32) (field i64))) + (type $sub-struct (struct i32 i64) (extends $super-struct)) + + ;; NOMINAL: (type $super-array (array (ref $super-struct))) + ;; EQUIREC: (type $super-array (array (ref $super-struct))) (type $super-array (array (ref $super-struct))) - ;; TODO: signature types as well, once functions store their HeapTypes. + ;; NOMINAL: (type $sub-array (array (ref $sub-struct)) (extends $super-array)) + ;; EQUIREC: (type $sub-array (array (ref $sub-struct))) + (type $sub-array (array (ref $sub-struct)) (extends $super-array)) - ;; CHECK: (func $make-sub-struct (result (ref $sub-struct)) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) - (func $make-sub-struct (result (ref $sub-struct)) - (unreachable) - ) + ;; TODO: signature types as well, once functions store their HeapTypes. - ;; CHECK: (func $make-super-struct (result (ref $super-struct)) - ;; CHECK-NEXT: (call $make-sub-struct) - ;; CHECK-NEXT: ) + ;; NOMINAL: (func $make-super-struct (result (ref $super-struct)) + ;; NOMINAL-NEXT: (call $make-sub-struct) + ;; NOMINAL-NEXT: ) + ;; EQUIREC: (func $make-super-struct (result (ref $super-struct)) + ;; EQUIREC-NEXT: (call $make-sub-struct) + ;; EQUIREC-NEXT: ) (func $make-super-struct (result (ref $super-struct)) (call $make-sub-struct) ) - ;; CHECK: (func $make-sub-array (result (ref $sub-array)) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) - (func $make-sub-array (result (ref $sub-array)) + ;; NOMINAL: (func $make-sub-struct (result (ref $sub-struct)) + ;; NOMINAL-NEXT: (unreachable) + ;; NOMINAL-NEXT: ) + ;; EQUIREC: (func $make-sub-struct (result (ref $sub-struct)) + ;; EQUIREC-NEXT: (unreachable) + ;; EQUIREC-NEXT: ) + (func $make-sub-struct (result (ref $sub-struct)) (unreachable) ) - ;; CHECK: (func $make-super-array (result (ref $super-array)) - ;; CHECK-NEXT: (call $make-sub-array) - ;; CHECK-NEXT: ) + ;; NOMINAL: (func $make-super-array (result (ref $super-array)) + ;; NOMINAL-NEXT: (call $make-sub-array) + ;; NOMINAL-NEXT: ) + ;; EQUIREC: (func $make-super-array (result (ref $super-array)) + ;; EQUIREC-NEXT: (call $make-sub-array) + ;; EQUIREC-NEXT: ) (func $make-super-array (result (ref $super-array)) (call $make-sub-array) ) + + ;; NOMINAL: (func $make-sub-array (result (ref $sub-array)) + ;; NOMINAL-NEXT: (unreachable) + ;; NOMINAL-NEXT: ) + ;; EQUIREC: (func $make-sub-array (result (ref $sub-array)) + ;; EQUIREC-NEXT: (unreachable) + ;; EQUIREC-NEXT: ) + (func $make-sub-array (result (ref $sub-array)) + (unreachable) + ) ) |