File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -636,6 +636,7 @@ struct Unsubtyping : Pass {
636636 info.descriptors .insert ({*desc, type});
637637 }
638638 void visitRefGetDesc (RefGetDesc* curr) {
639+ Super::visitRefGetDesc (curr);
639640 if (!curr->ref ->type .isStruct ()) {
640641 return ;
641642 }
@@ -656,6 +657,7 @@ struct Unsubtyping : Pass {
656657 noteDescriptor (curr->desc ->type .getHeapType ());
657658 }
658659 void visitStructNew (StructNew* curr) {
660+ Super::visitStructNew (curr);
659661 if (curr->type == Type::unreachable || !curr->desc ) {
660662 return ;
661663 }
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