summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/example/type-builder.cpp26
-rw-r--r--test/example/type-builder.txt37
-rw-r--r--test/lit/recursive-types.wast25
3 files changed, 65 insertions, 23 deletions
diff --git a/test/example/type-builder.cpp b/test/example/type-builder.cpp
index 59222775b..0ac13f974 100644
--- a/test/example/type-builder.cpp
+++ b/test/example/type-builder.cpp
@@ -132,6 +132,7 @@ void test_recursive() {
std::cout << built[1] << "\n\n";
assert(built[0].getSignature().results.getHeapType() == built[1]);
assert(built[1].getSignature().results.getHeapType() == built[0]);
+ assert(built[0] == built[1]);
}
{
@@ -161,6 +162,10 @@ void test_recursive() {
assert(built[2].getSignature().results.getHeapType() == built[3]);
assert(built[3].getSignature().results.getHeapType() == built[4]);
assert(built[4].getSignature().results.getHeapType() == built[0]);
+ assert(built[0] == built[1]);
+ assert(built[1] == built[2]);
+ assert(built[2] == built[3]);
+ assert(built[3] == built[4]);
}
{
@@ -189,9 +194,9 @@ void test_recursive() {
std::cout << built[3] << "\n";
std::cout << built[4] << "\n";
std::cout << built[5] << "\n\n";
- assert(built[0] != built[1]); // TODO: canonicalize recursive types
+ assert(built[0] == built[1]);
assert(built[2] == built[3]);
- assert(built[4] != built[5]); // Contain "different" recursive types
+ assert(built[4] == built[5]);
assert(built[4].getSignature().results.getHeapType() == built[0]);
assert(built[5].getSignature().results.getHeapType() == built[1]);
assert(built[0].getSignature().results ==
@@ -199,6 +204,23 @@ void test_recursive() {
assert(built[1].getSignature().results ==
Type({Type(built[1], Nullable), Type(built[3], Nullable)}));
}
+
+ {
+ // Folded and unfolded
+ std::vector<HeapType> built;
+ {
+ TypeBuilder builder(2);
+ Type temp0 = builder.getTempRefType(0, Nullable);
+ builder.setHeapType(0, Signature(Type::none, temp0));
+ builder.setHeapType(1, Signature(Type::none, temp0));
+ built = builder.build();
+ }
+ std::cout << built[0] << "\n";
+ std::cout << built[1] << "\n\n";
+ assert(built[0].getSignature().results.getHeapType() == built[0]);
+ assert(built[1].getSignature().results.getHeapType() == built[0]);
+ assert(built[0] == built[1]);
+ }
}
int main() {
diff --git a/test/example/type-builder.txt b/test/example/type-builder.txt
index 6b42ade8c..a2985c2ed 100644
--- a/test/example/type-builder.txt
+++ b/test/example/type-builder.txt
@@ -1,17 +1,17 @@
;; Test TypeBuilder
Before setting heap types:
-(ref $sig) => (ref (func))
-(ref $struct) => (ref (func))
-(ref $array) => (ref (func))
-(ref null $array) => (ref null (func))
-(rtt 0 $array) => (rtt 0 (func))
+(ref $sig) => [T](ref [T](func))
+(ref $struct) => [T](ref [T](func))
+(ref $array) => [T](ref [T](func))
+(ref null $array) => [T](ref null [T](func))
+(rtt 0 $array) => [T](rtt 0 [T](func))
After setting heap types:
-(ref $sig) => (ref (func (param (ref (struct (field (ref null (array (mut externref))) (mut (rtt 0 (array (mut externref)))))))) (result (ref (array (mut externref))) i32)))
-(ref $struct) => (ref (struct (field (ref null (array (mut externref))) (mut (rtt 0 (array (mut externref)))))))
-(ref $array) => (ref (array (mut externref)))
-(ref null $array) => (ref null (array (mut externref)))
-(rtt 0 $array) => (rtt 0 (array (mut externref)))
+(ref $sig) => [T](ref [T](func (param [T](ref [T](struct (field [T](ref null [T](array (mut externref))) (mut [T](rtt 0 [T](array (mut externref)))))))) (result [T](ref [T](array (mut externref))) i32)))
+(ref $struct) => [T](ref [T](struct (field [T](ref null [T](array (mut externref))) (mut [T](rtt 0 [T](array (mut externref)))))))
+(ref $array) => [T](ref [T](array (mut externref)))
+(ref null $array) => [T](ref null [T](array (mut externref)))
+(rtt 0 $array) => [T](rtt 0 [T](array (mut externref)))
After building types:
(ref $sig) => (ref (func (param (ref (struct (field (ref null (array (mut externref))) (mut (rtt 0 (array (mut externref)))))))) (result (ref (array (mut externref))) i32)))
@@ -24,14 +24,14 @@ After building types:
;; Test recursive types
(func (result (ref null ...1)))
-(func (result (ref null (func (result (ref null ...3))))))
-(func (result (ref null (func (result (ref null ...3))))))
+(func (result (ref null ...1)))
+(func (result (ref null ...1)))
-(func (result (ref null (func (result (ref null (func (result (ref null (func (result (ref null (func (result (ref null ...9)))))))))))))))
-(func (result (ref null (func (result (ref null (func (result (ref null (func (result (ref null (func (result (ref null ...9)))))))))))))))
-(func (result (ref null (func (result (ref null (func (result (ref null (func (result (ref null (func (result (ref null ...9)))))))))))))))
-(func (result (ref null (func (result (ref null (func (result (ref null (func (result (ref null (func (result (ref null ...9)))))))))))))))
-(func (result (ref null (func (result (ref null (func (result (ref null (func (result (ref null (func (result (ref null ...9)))))))))))))))
+(func (result (ref null ...1)))
+(func (result (ref null ...1)))
+(func (result (ref null ...1)))
+(func (result (ref null ...1)))
+(func (result (ref null ...1)))
(func (result (ref null ...1) (ref null (func))))
(func (result (ref null ...1) (ref null (func))))
@@ -40,3 +40,6 @@ After building types:
(func (result (ref null (func (result ...1 (ref null (func)))))))
(func (result (ref null (func (result ...1 (ref null (func)))))))
+(func (result (ref null ...1)))
+(func (result (ref null ...1)))
+
diff --git a/test/lit/recursive-types.wast b/test/lit/recursive-types.wast
index 7f719a359..a5d301006 100644
--- a/test/lit/recursive-types.wast
+++ b/test/lit/recursive-types.wast
@@ -2,27 +2,44 @@
;; RUN: wasm-opt %s -all -S -o - | filecheck %s
-;; TODO: Fix the bug where structurally identical types are given the same
-;; generated name, making the wast invalid due to duplicate names.
-
;; CHECK: (module
;; CHECK-NEXT: (type $ref?|...0|_=>_ref?|...0| (func (param (ref null $ref?|...0|_=>_ref?|...0|)) (result (ref null $ref?|...0|_=>_ref?|...0|))))
-;; CHECK-NEXT: (type $ref?|...0|_=>_ref?|...0| (func (param (ref null $ref?|...0|_=>_ref?|...0|)) (result (ref null $ref?|...0|_=>_ref?|...0|))))
;; CHECK-NEXT: (func $foo (param $0 (ref null $ref?|...0|_=>_ref?|...0|)) (result (ref null $ref?|...0|_=>_ref?|...0|))
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: (func $bar (param $0 (ref null $ref?|...0|_=>_ref?|...0|)) (result (ref null $ref?|...0|_=>_ref?|...0|))
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
+;; CHECK-NEXT: (func $baz (param $0 (ref null $ref?|...0|_=>_ref?|...0|)) (result (ref null $ref?|...0|_=>_ref?|...0|))
+;; CHECK-NEXT: (unreachable)
+;; CHECK-NEXT: )
+;; CHECK-NEXT: (func $qux (param $0 (ref null $ref?|...0|_=>_ref?|...0|)) (result (ref null $ref?|...0|_=>_ref?|...0|))
+;; CHECK-NEXT: (unreachable)
+;; CHECK-NEXT: )
+;; CHECK-NEXT: (func $quux (param $0 (ref null $ref?|...0|_=>_ref?|...0|)) (result (ref null $ref?|...0|_=>_ref?|...0|))
+;; CHECK-NEXT: (unreachable)
+;; CHECK-NEXT: )
;; CHECK-NEXT: )
(module
(type (func (param (ref null 0)) (result (ref null 0))))
(type (func (param (ref null 1)) (result (ref null 1))))
+ (type (func (param (ref null 0)) (result (ref null 1))))
+ (type (func (param (ref null 3)) (result (ref null 4))))
+ (type (func (param (ref null 4)) (result (ref null 3))))
(func $foo (type 0)
(unreachable)
)
(func $bar (type 1)
(unreachable)
)
+ (func $baz (type 2)
+ (unreachable)
+ )
+ (func $qux (type 3)
+ (unreachable)
+ )
+ (func $quux (type 4)
+ (unreachable)
+ )
)