Skip to content

Commit 65ebee0

Browse files
authored
[AutoDiff] Fix @differentiable(linear) type parsing ambiguity. (#27646)
Handle the case where `@differentiable(linear)` is followed by a type alias or another type attribute. ```swift typealias linear = (Float) -> Float let property: @differentiable(linear) linear // okay let property: @differentiable(linear) @convention(c) linear // okay ``` Resolves [TF-576](https://bugs.swift.org/browse/TF-576).
1 parent 7e03973 commit 65ebee0

File tree

2 files changed

+5
-5
lines changed

2 files changed

+5
-5
lines changed

lib/Parse/ParseDecl.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2529,7 +2529,8 @@ bool Parser::parseTypeAttribute(TypeAttributes &Attributes, SourceLoc AtLoc,
25292529
// Determine if we have '@differentiable(linear) (T) -> U'
25302530
// or '@differentiable (linear) -> U'.
25312531
if (Tok.getText() == "linear" && consumeIf(tok::identifier)) {
2532-
if (Tok.is(tok::r_paren) && peekToken().is(tok::l_paren)) {
2532+
if (Tok.is(tok::r_paren) &&
2533+
peekToken().isAny(tok::l_paren, tok::at_sign, tok::identifier)) {
25332534
// It is being used as an attribute argument, so cancel backtrack
25342535
// as function is linear differentiable.
25352536
linear = true;
@@ -2538,8 +2539,7 @@ bool Parser::parseTypeAttribute(TypeAttributes &Attributes, SourceLoc AtLoc,
25382539
} else if (Tok.is(tok::l_paren)) {
25392540
// Handle invalid '@differentiable(linear (T) -> U'
25402541
if (!justChecking)
2541-
diagnose(Tok,
2542-
diag::differentiable_attribute_expected_rparen);
2542+
diagnose(Tok, diag::differentiable_attribute_expected_rparen);
25432543
backtrack.cancelBacktrack();
25442544
return false;
25452545
}

test/AutoDiff/differentiable_func_type_parse.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,6 @@ struct B {
3838
let property: @differentiable(linear) (linear) -> linear // okay
3939
let property: @differentiable linear // okay
4040
let property: linear // okay
41-
// FIXME(bartchr): TF-576 have this able to be parsed.
42-
//let property: @differentiable(linear) linear // okay
41+
let property: @differentiable(linear) linear // okay
42+
let property: @differentiable(linear) @convention(c) linear // okay
4343
}

0 commit comments

Comments
 (0)