16b4e30b7SRiver Riddle# RUN: toyc-ch7 %s -emit=ast 2>&1 | FileCheck %s 26b4e30b7SRiver Riddle 36b4e30b7SRiver Riddle# User defined generic function that operates on unknown shaped arguments. 46b4e30b7SRiver Riddledef multiply_transpose(a, b) { 56b4e30b7SRiver Riddle return transpose(a) * transpose(b); 66b4e30b7SRiver Riddle} 76b4e30b7SRiver Riddle 86b4e30b7SRiver Riddledef main() { 96b4e30b7SRiver Riddle # Define a variable `a` with shape <2, 3>, initialized with the literal value. 106b4e30b7SRiver Riddle # The shape is inferred from the supplied literal. 116b4e30b7SRiver Riddle var a = [[1, 2, 3], [4, 5, 6]]; 126b4e30b7SRiver Riddle # b is identical to a, the literal array is implicitly reshaped: defining new 136b4e30b7SRiver Riddle # variables is the way to reshape arrays (element count in literal must match 146b4e30b7SRiver Riddle # the size of specified shape). 156b4e30b7SRiver Riddle var b<2, 3> = [1, 2, 3, 4, 5, 6]; 166b4e30b7SRiver Riddle 176b4e30b7SRiver Riddle # This call will specialize `multiply_transpose` with <2, 3> for both 186b4e30b7SRiver Riddle # arguments and deduce a return type of <2, 2> in initialization of `c`. 196b4e30b7SRiver Riddle var c = multiply_transpose(a, b); 206b4e30b7SRiver Riddle # A second call to `multiply_transpose` with <2, 3> for both arguments will 216b4e30b7SRiver Riddle # reuse the previously specialized and inferred version and return `<2, 2>` 226b4e30b7SRiver Riddle var d = multiply_transpose(b, a); 236b4e30b7SRiver Riddle # A new call with `<2, 2>` for both dimension will trigger another 246b4e30b7SRiver Riddle # specialization of `multiply_transpose`. 256b4e30b7SRiver Riddle var e = multiply_transpose(b, c); 266b4e30b7SRiver Riddle # Finally, calling into `multiply_transpose` with incompatible shape will 276b4e30b7SRiver Riddle # trigger a shape inference error. 289f89c34fSAart Bik var f = multiply_transpose(transpose(a), c); 296b4e30b7SRiver Riddle} 306b4e30b7SRiver Riddle 316b4e30b7SRiver Riddle 326b4e30b7SRiver Riddle# CHECK: Module: 336b4e30b7SRiver Riddle# CHECK-NEXT: Function 34*5633813bSRahul Joshi# CHECK-NEXT: Proto 'multiply_transpose' @{{.*}}ast.toy:4:1 356b4e30b7SRiver Riddle# CHECK-NEXT: Params: [a, b] 366b4e30b7SRiver Riddle# CHECK-NEXT: Block { 376b4e30b7SRiver Riddle# CHECK-NEXT: Return 386b4e30b7SRiver Riddle# CHECK-NEXT: BinOp: * @{{.*}}ast.toy:5:25 396b4e30b7SRiver Riddle# CHECK-NEXT: Call 'transpose' [ @{{.*}}ast.toy:5:10 406b4e30b7SRiver Riddle# CHECK-NEXT: var: a @{{.*}}ast.toy:5:20 416b4e30b7SRiver Riddle# CHECK-NEXT: ] 426b4e30b7SRiver Riddle# CHECK-NEXT: Call 'transpose' [ @{{.*}}ast.toy:5:25 436b4e30b7SRiver Riddle# CHECK-NEXT: var: b @{{.*}}ast.toy:5:35 446b4e30b7SRiver Riddle# CHECK-NEXT: ] 456b4e30b7SRiver Riddle# CHECK-NEXT: } // Block 466b4e30b7SRiver Riddle# CHECK-NEXT: Function 47*5633813bSRahul Joshi# CHECK-NEXT: Proto 'main' @{{.*}}ast.toy:8:1 486b4e30b7SRiver Riddle# CHECK-NEXT: Params: [] 496b4e30b7SRiver Riddle# CHECK-NEXT: Block { 506b4e30b7SRiver Riddle# CHECK-NEXT: VarDecl a<> @{{.*}}ast.toy:11:3 516b4e30b7SRiver Riddle# CHECK-NEXT: Literal: <2, 3>[ <3>[ 1.000000e+00, 2.000000e+00, 3.000000e+00], <3>[ 4.000000e+00, 5.000000e+00, 6.000000e+00]] @{{.*}}ast.toy:11:11 526b4e30b7SRiver Riddle# CHECK-NEXT: VarDecl b<2, 3> @{{.*}}ast.toy:15:3 536b4e30b7SRiver Riddle# CHECK-NEXT: Literal: <6>[ 1.000000e+00, 2.000000e+00, 3.000000e+00, 4.000000e+00, 5.000000e+00, 6.000000e+00] @{{.*}}ast.toy:15:17 546b4e30b7SRiver Riddle# CHECK-NEXT: VarDecl c<> @{{.*}}ast.toy:19:3 556b4e30b7SRiver Riddle# CHECK-NEXT: Call 'multiply_transpose' [ @{{.*}}ast.toy:19:11 566b4e30b7SRiver Riddle# CHECK-NEXT: var: a @{{.*}}ast.toy:19:30 576b4e30b7SRiver Riddle# CHECK-NEXT: var: b @{{.*}}ast.toy:19:33 586b4e30b7SRiver Riddle# CHECK-NEXT: ] 596b4e30b7SRiver Riddle# CHECK-NEXT: VarDecl d<> @{{.*}}ast.toy:22:3 606b4e30b7SRiver Riddle# CHECK-NEXT: Call 'multiply_transpose' [ @{{.*}}ast.toy:22:11 616b4e30b7SRiver Riddle# CHECK-NEXT: var: b @{{.*}}ast.toy:22:30 626b4e30b7SRiver Riddle# CHECK-NEXT: var: a @{{.*}}ast.toy:22:33 636b4e30b7SRiver Riddle# CHECK-NEXT: ] 646b4e30b7SRiver Riddle# CHECK-NEXT: VarDecl e<> @{{.*}}ast.toy:25:3 656b4e30b7SRiver Riddle# CHECK-NEXT: Call 'multiply_transpose' [ @{{.*}}ast.toy:25:11 666b4e30b7SRiver Riddle# CHECK-NEXT: var: b @{{.*}}ast.toy:25:30 676b4e30b7SRiver Riddle# CHECK-NEXT: var: c @{{.*}}ast.toy:25:33 686b4e30b7SRiver Riddle# CHECK-NEXT: ] 699f89c34fSAart Bik# CHECK-NEXT: VarDecl f<> @{{.*}}ast.toy:28:3 706b4e30b7SRiver Riddle# CHECK-NEXT: Call 'multiply_transpose' [ @{{.*}}ast.toy:28:11 716b4e30b7SRiver Riddle# CHECK-NEXT: Call 'transpose' [ @{{.*}}ast.toy:28:30 726b4e30b7SRiver Riddle# CHECK-NEXT: var: a @{{.*}}ast.toy:28:40 736b4e30b7SRiver Riddle# CHECK-NEXT: ] 746b4e30b7SRiver Riddle# CHECK-NEXT: var: c @{{.*}}ast.toy:28:44 756b4e30b7SRiver Riddle# CHECK-NEXT: ] 766b4e30b7SRiver Riddle 77