File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -644,6 +644,7 @@ struct Unsubtyping : Pass {
644644 info.descriptors .insert ({*desc, type});
645645 }
646646 void visitRefGetDesc (RefGetDesc* curr) {
647+ Super::visitRefGetDesc (curr);
647648 if (!curr->ref ->type .isStruct ()) {
648649 return ;
649650 }
@@ -664,6 +665,7 @@ struct Unsubtyping : Pass {
664665 noteDescriptor (curr->desc ->type .getHeapType ());
665666 }
666667 void visitStructNew (StructNew* curr) {
668+ Super::visitStructNew (curr);
667669 if (curr->type == Type::unreachable || !curr->desc ) {
668670 return ;
669671 }
Original file line number Diff line number Diff line change 18921892 )
18931893 )
18941894)
1895+
1896+ ;; Even though our analysis has its own visitor for StructNew, it should still
1897+ ;; be able to collect subtype constraints from StructNews.
1898+ (module
1899+ ;; CHECK: (rec
1900+ ;; CHECK-NEXT: (type $A (sub (struct (field (ref null $A)))))
1901+ (type $A (sub (struct (field (ref null $A )))))
1902+ ;; CHECK: (type $B (sub $A (struct (field (ref null $A)))))
1903+ (type $B (sub $A (struct (field (ref null $A )))))
1904+
1905+ ;; CHECK: (type $2 (func (param (ref null $B))))
1906+
1907+ ;; CHECK: (func $test (type $2) (param $B (ref null $B))
1908+ ;; CHECK-NEXT: (drop
1909+ ;; CHECK-NEXT: (struct.new $A
1910+ ;; CHECK-NEXT: (local.get $B)
1911+ ;; CHECK-NEXT: )
1912+ ;; CHECK-NEXT: )
1913+ ;; CHECK-NEXT: )
1914+ (func $test (param $B (ref null $B ))
1915+ (drop
1916+ ;; This requires B <: A.
1917+ (struct.new $A
1918+ (local.get $B )
1919+ )
1920+ )
1921+ )
1922+ )
You can’t perform that action at this time.
0 commit comments