@@ -113,3 +113,48 @@ ignore ["1" .. "42"]
113113 |> shouldFail
114114 |> withSingleDiagnostic
115115 ( Error 1 , Line 2 , Col 9 , Line 2 , Col 12 , " The type 'string' does not support the operator 'op_Range'" )
116+
117+ // https://github.com/dotnet/fsharp/issues/9382
118+ [<Fact>]
119+ let ``Issue 9382 - SRTP stress test with matrix inverse should compile`` () =
120+ FSharp
121+ """
122+ type Matrix<'a> =
123+ { m11: 'a; m12: 'a; m13: 'a
124+ m21: 'a; m22: 'a; m23: 'a
125+ m31: 'a; m32: 'a; m33: 'a }
126+
127+ static member inline (/) (m, s) =
128+ { m11 = m.m11 / s; m12 = m.m12 / s; m13 = m.m13 / s
129+ m21 = m.m21 / s; m22 = m.m22 / s; m23 = m.m23 / s
130+ m31 = m.m31 / s; m32 = m.m32 / s; m33 = m.m33 / s }
131+
132+ static member inline (*) (a, b) =
133+ { m11 = a.m11 * b.m11 + a.m12 * b.m21 + a.m13 * b.m31
134+ m12 = a.m11 * b.m12 + a.m12 * b.m22 + a.m13 * b.m32
135+ m13 = a.m11 * b.m13 + a.m12 * b.m23 + a.m13 * b.m33
136+ m21 = a.m21 * b.m11 + a.m22 * b.m21 + a.m23 * b.m31
137+ m22 = a.m21 * b.m12 + a.m22 * b.m22 + a.m23 * b.m32
138+ m23 = a.m21 * b.m13 + a.m22 * b.m23 + a.m23 * b.m33
139+ m31 = a.m31 * b.m11 + a.m32 * b.m21 + a.m33 * b.m31
140+ m32 = a.m31 * b.m12 + a.m32 * b.m22 + a.m33 * b.m32
141+ m33 = a.m31 * b.m13 + a.m32 * b.m23 + a.m33 * b.m33 }
142+
143+ let inline determinant m =
144+ m.m11 * m.m22 * m.m33 + m.m12 * m.m23 * m.m31 + m.m13 * m.m21 * m.m32
145+ - m.m13 * m.m22 * m.m31 - m.m12 * m.m21 * m.m33 - m.m11 * m.m23 * m.m32
146+
147+ let inline inverse m =
148+ { m11 = m.m22 * m.m33 - m.m32 * m.m23
149+ m12 = m.m13 * m.m32 - m.m12 * m.m33
150+ m13 = m.m12 * m.m23 - m.m13 * m.m22
151+ m21 = m.m23 * m.m31 - m.m21 * m.m33
152+ m22 = m.m11 * m.m33 - m.m13 * m.m31
153+ m23 = m.m21 * m.m13 - m.m11 * m.m23
154+ m31 = m.m21 * m.m32 - m.m31 * m.m22
155+ m32 = m.m31 * m.m12 - m.m11 * m.m32
156+ m33 = m.m11 * m.m22 - m.m21 * m.m12 }
157+ / (determinant m)
158+ """
159+ |> typecheck
160+ |> shouldSucceed
0 commit comments