// RUN: %target-swift-frontend -parse -verify %s /// Good @transpose(of: foo) func transpose(v: Float) -> Float @transpose(of: foo(_:_:)) func transpose(v: Float) -> Float @transpose(of: wrt, wrt: 0) func transpose(v: Float) -> Float @transpose(of: foo, wrt: 0) func transpose(v: Float) -> Float @transpose(of: foo, wrt: (0, 1)) func transpose(v: Float) -> (Float, Float) @transpose(of: foo, wrt: (self, 0, 1, 2)) func transpose(v: Float) -> (Float, Float, Float, Float) // Qualified declaration. @transpose(of: A.B.C.foo(x:y:_:z:)) func transpose(v: Float) -> Float // Qualified declaration with specialized generic type. @transpose(of: A.B.C.foo(x:y:_:z:)) func transpose(v: Float) -> Float // Qualified operator. // TODO(TF-1065): Consider disallowing qualified operators. @transpose(of: Swift.Float.+) func transpose(v: Float) -> Float // Qualified leading-period operator (confusing). // TODO(TF-1065): Consider disallowing qualified operators. @transpose(of: Swift.Float..<) func transpose(v: Float) -> Float // `init` keyword edge case. @transpose(of: Swift.Float.init(_:)) func transpose(v: Float) -> Float // `subscript` keyword edge case. @transpose(of: Swift.Array.subscript(_:)) func transpose(v: Float) -> Float /// Bad // expected-error @+2 {{expected an original function name}} // expected-error @+1 {{expected declaration}} @transpose(of: 3) func transpose(v: Float) -> Float // expected-error @+1 {{expected label 'wrt:' in '@transpose' attribute}} @transpose(of: foo, blah) func transpose(v: Float) -> Float // expected-error @+1 {{expected a colon ':' after 'wrt'}} @transpose(of: foo, wrt) func transpose(v: Float) -> Float // expected-error @+1 {{unexpected ',' separator}} @transpose(of: foo,) func transpose(v: Float) -> Float // expected-error @+2 {{expected ')' in 'transpose' attribute}} // expected-error @+1 {{expected declaration}} @transpose(of: foo, wrt: 0,) func transpose(v: Float) -> Float // expected-error @+1 {{expected a parameter, which can be a function parameter index or 'self'}} @transpose(of: foo, wrt: v) func transpose(v: Float) -> Float // expected-error @+1 {{expected a parameter, which can be a function parameter index or 'self'}} @transpose(of: foo, wrt: (0, v)) func transpose(v: Float) -> Float // NOTE: The "expected ',' separator" diagnostic is not ideal. // Ideally, the diagnostic should point out that `Swift.Float.+(_:_)` is // not a valid declaration name (missing colon after second argument label). // expected-error @+2 {{expected ',' separator}} // expected-error @+1 {{expected declaration}} @transpose(of: Swift.Float.+(_:_)) func transpose(v: Float) -> Float // NOTE: The "expected ',' separator" diagnostic is not ideal. // Ideally, the diagnostic should point out that `Swift.Float.+.a` is // not a valid declaration name. // expected-error @+2 {{expected ',' separator}} // expected-error @+1 {{expected declaration}} @transpose(of: Swift.Float.+.a) func transpose(v: Float) -> Float // TF-1168: missing comma before `wrt:`. // expected-error @+2 {{expected ',' separator}} // expected-error @+1 {{expected declaration}} @transpose(of: foo wrt: x) func transpose(v: Float) -> Float func testLocalTransposeRegistration() { // Transpose registration can only be non-local. // expected-error @+1 {{attribute '@transpose' can only be used in a non-local scope}} @transpose(of: +) func transpose(_ x: Float) -> (Float, Float) }