function_subtyping.js (3176B)
1 // Validate rules for function subtyping: 2 // - Same number of parameters and results 3 // - Function return types are covariant 4 // - Function parameter types are contravariant 5 wasmValidateText( 6 `(module 7 (type $A (sub (struct (field i32)))) 8 (type $B (sub $A (struct (field i32) (field i32)))) 9 (type $C (sub $B (struct (field i32) (field i32) (field i64)))) 10 (type $D (sub $B (struct (field i32) (field i32) (field f32)))) 11 12 ;; Same types (invariant) 13 (type $func1 (sub (func (param (ref $A) (ref $A)) (result (ref $C))))) 14 (type $func2 (sub $func1 (func (param (ref $A) (ref $A)) (result (ref $C))))) 15 16 ;; Covariant return types are valid 17 (type $func3 (sub (func (param (ref $A) (ref $A)) (result (ref $B))))) 18 (type $func4 (sub $func3 (func (param (ref $A) (ref $A)) (result (ref $C))))) 19 (type $func5 (sub (func (param (ref $A) (ref $A)) (result (ref $A) (ref $B))))) 20 (type $func6 (sub $func5 (func (param (ref $A) (ref $A)) (result (ref $D) (ref $C))))) 21 22 ;; Contravariant parameter types are valid 23 (type $func7 (sub (func (param (ref $A) (ref $C)) (result (ref $C))))) 24 (type $func8 (sub $func7 (func (param (ref $A) (ref $B)) (result (ref $C))))) 25 (type $func9 (sub (func (param (ref $D) (ref $C)) (result (ref $C))))) 26 (type $func10 (sub $func9 (func (param (ref $A) (ref $B)) (result (ref $C))))) 27 28 ;; Mixing covariance and contravariance 29 (type $func11 (sub (func (param (ref $D) (ref $C)) (result (ref $A))))) 30 (type $func12 (sub $func11 (func (param (ref $A) (ref $B)) (result (ref $C))))) 31 ) 32 `); 33 34 // Validate that incorrect subtyping examples are failing as expected 35 const typeError = /incompatible super type/; 36 37 var code =` 38 (module 39 (type $A (struct (field i32))) 40 (type $B (sub $A (struct (field i32) (field i32)))) 41 (type $C (sub $B (struct (field i32) (field i32) (field i64)))) 42 (type $D (sub $B (struct (field i32) (field i32) (field f32)))) 43 44 ;; Not the same number of arguments/results 45 (type $func1 (func (param (ref $A) (ref $A)) (result (ref $C)))) 46 (type $func2 (sub $func1 (func (param (ref $A) (ref $A)) (result (ref $C) (ref $A))))) 47 )`; 48 49 wasmFailValidateText(code, typeError); 50 51 code =` 52 (module 53 (type $A (sub (struct (field i32)))) 54 (type $B (sub $A (struct (field i32) (field i32)))) 55 (type $C (sub $B (struct (field i32) (field i32) (field i64)))) 56 (type $D (sub $B (struct (field i32) (field i32) (field f32)))) 57 58 ;; Contravariant result types are invalid 59 (type $func3 (sub (func (param (ref $A) (ref $A)) (result (ref $C))))) 60 (type $func4 (sub $func3 (func (param (ref $A) (ref $A)) (result (ref $A))))) 61 )`; 62 63 wasmFailValidateText(code, typeError); 64 65 code =` 66 (module 67 (type $A (sub (struct (field i32)))) 68 (type $B (sub $A (struct (field i32) (field i32)))) 69 (type $C (sub $B (struct (field i32) (field i32) (field i64)))) 70 (type $D (sub $B (struct (field i32) (field i32) (field f32)))) 71 72 ;; Covariant parameters are invalid 73 (type $func5 (sub (func (param (ref $A) (ref $A)) (result (ref $C))))) 74 (type $func6 (sub $func5 (func (param (ref $B) (ref $A)) (result (ref $C))))) 75 )`; 76 77 wasmFailValidateText(code, typeError);