Skip to content

Commit aecf9a1

Browse files
committed
Fix qualified name parsing syntax verification errors.
1 parent b94c097 commit aecf9a1

File tree

4 files changed

+46
-12
lines changed

4 files changed

+46
-12
lines changed

lib/Parse/ParseDecl.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,22 +1093,23 @@ bool Parser::parseDifferentiableAttributeArguments(
10931093
static bool parseBaseTypeForQualifiedDeclName(Parser &P, TypeRepr *&baseType) {
10941094
baseType = nullptr;
10951095

1096+
// If base type cannot be parsed, return false (no error).
10961097
if (!P.canParseBaseTypeForQualifiedDeclName())
10971098
return false;
10981099

10991100
auto result = P.parseTypeIdentifier(/*isParsingQualifiedDeclName*/ true);
1101+
// If base type should be parseable but the actual base type result is null,
1102+
// return true (error).
11001103
if (result.isNull())
11011104
return true;
11021105

1103-
// Consume a leading period. This is relevant only for qualified operators.
1104-
// TODO(TF-1065): Consider disallowing qualified operator names. There is no
1105-
// precedent for qualified operator syntax elsewhere in Swift.
1106-
if (P.startsWithSymbol(P.Tok, '.')) {
1107-
assert(P.Tok.isAnyOperator() &&
1108-
"Only operators should have leading period here");
1109-
P.consumeStartingCharacterOfCurrentToken(tok::period);
1110-
}
1106+
// Consume the leading period before the final declaration name component.
1107+
// `parseTypeIdentifier(/*isParsingQualifiedDeclName*/ true)` leaves the
1108+
// leading period unparsed to avoid syntax verification errors.
1109+
assert(P.startsWithSymbol(P.Tok, '.') && "false");
1110+
P.consumeStartingCharacterOfCurrentToken(tok::period);
11111111

1112+
// Set base type and return false (no error).
11121113
baseType = result.getPtrOrNull();
11131114
return false;
11141115
}

lib/Parse/ParseType.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -734,18 +734,19 @@ Parser::parseTypeIdentifier(bool isParsingQualifiedDeclBaseType) {
734734
}
735735
if (!peekToken().isContextualKeyword("Type")
736736
&& !peekToken().isContextualKeyword("Protocol")) {
737-
// Consume the period.
738-
consumeToken();
739737
// If parsing a qualified declaration name, break before parsing the
740-
// final declaration name component.
738+
// period before the final declaration name component.
741739
if (isParsingQualifiedDeclBaseType) {
742-
BacktrackingScope backtrack(*this);
743740
// If qualified name base type cannot be parsed from the current
744741
// point (i.e. the next type identifier is not followed by a '.'),
745742
// then the next identifier is the final declaration name component.
743+
BacktrackingScope backtrack(*this);
744+
consumeStartingCharacterOfCurrentToken(tok::period);
746745
if (!canParseBaseTypeForQualifiedDeclName())
747746
break;
748747
}
748+
// Consume the period.
749+
consumeToken();
749750
continue;
750751
}
751752
} else if (Tok.is(tok::code_complete)) {

test/AutoDiff/Syntax/Outputs/round_trip_parse_gen.swift.withkinds

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ func bazDerivative<FunctionSignature><ParameterClause>(<FunctionParameter>_ x: <
5050
return <TupleExpr>(<TupleExprElement><IdentifierExpr>x</IdentifierExpr>, </TupleExprElement><TupleExprElement><ClosureExpr>{ <ClosureSignature><ClosureParam>v </ClosureParam>in </ClosureSignature><IdentifierExpr>v </IdentifierExpr>}</ClosureExpr></TupleExprElement>)</TupleExpr></ReturnStmt>
5151
}</CodeBlock></FunctionDecl><FunctionDecl><Attribute>
5252

53+
@derivative(<DerivativeRegistrationAttributeArguments>of: <QualifiedDeclName><MemberTypeIdentifier><MemberTypeIdentifier><SimpleTypeIdentifier>A</SimpleTypeIdentifier>.B</MemberTypeIdentifier>.C</MemberTypeIdentifier>.foo<DeclNameArguments>(<DeclNameArgument>label:</DeclNameArgument><DeclNameArgument>_:</DeclNameArgument>)</DeclNameArguments></QualifiedDeclName>, <DifferentiationParamsClause>wrt: <DifferentiationParams>(<DifferentiationParam>x</DifferentiationParam>)</DifferentiationParams></DifferentiationParamsClause></DerivativeRegistrationAttributeArguments>)</Attribute>
54+
func qualifiedDerivative<FunctionSignature><ParameterClause>(<FunctionParameter>_ x: <SimpleTypeIdentifier>Float</SimpleTypeIdentifier>, </FunctionParameter><FunctionParameter>y: <SimpleTypeIdentifier>Float</SimpleTypeIdentifier></FunctionParameter>)</ParameterClause><ReturnClause>
55+
-> <TupleType>(<TupleTypeElement>value: <SimpleTypeIdentifier>Float</SimpleTypeIdentifier>, </TupleTypeElement><TupleTypeElement>pullback: <FunctionType>(<TupleTypeElement><SimpleTypeIdentifier>Float</SimpleTypeIdentifier></TupleTypeElement>) -> <SimpleTypeIdentifier>Float</SimpleTypeIdentifier></FunctionType></TupleTypeElement>) </TupleType></ReturnClause></FunctionSignature><CodeBlock>{<ReturnStmt>
56+
return <TupleExpr>(<TupleExprElement><IdentifierExpr>x</IdentifierExpr>, </TupleExprElement><TupleExprElement><ClosureExpr>{ <ClosureSignature><ClosureParam>v </ClosureParam>in </ClosureSignature><IdentifierExpr>v </IdentifierExpr>}</ClosureExpr></TupleExprElement>)</TupleExpr></ReturnStmt>
57+
}</CodeBlock></FunctionDecl><FunctionDecl><Attribute>
58+
5359
@transpose(<DerivativeRegistrationAttributeArguments>of: <QualifiedDeclName>+</QualifiedDeclName></DerivativeRegistrationAttributeArguments>)</Attribute>
5460
func addTranspose<FunctionSignature><ParameterClause>(<FunctionParameter>_ v: <SimpleTypeIdentifier>Float</SimpleTypeIdentifier></FunctionParameter>) </ParameterClause><ReturnClause>-> <TupleType>(<TupleTypeElement><SimpleTypeIdentifier>Float</SimpleTypeIdentifier>, </TupleTypeElement><TupleTypeElement><SimpleTypeIdentifier>Float</SimpleTypeIdentifier></TupleTypeElement>) </TupleType></ReturnClause></FunctionSignature><CodeBlock>{<ReturnStmt>
5561
return <TupleExpr>(<TupleExprElement><IdentifierExpr>v</IdentifierExpr>, </TupleExprElement><TupleExprElement><IdentifierExpr>v</IdentifierExpr></TupleExprElement>)</TupleExpr></ReturnStmt>
@@ -58,4 +64,14 @@ func addTranspose<FunctionSignature><ParameterClause>(<FunctionParameter>_ v: <S
5864
@transpose(<DerivativeRegistrationAttributeArguments>of: <QualifiedDeclName>-</QualifiedDeclName>, <DifferentiationParamsClause>wrt: <DifferentiationParams>(<DifferentiationParam>0, </DifferentiationParam><DifferentiationParam>1</DifferentiationParam>)</DifferentiationParams></DifferentiationParamsClause></DerivativeRegistrationAttributeArguments>)</Attribute>
5965
func subtractTranspose<FunctionSignature><ParameterClause>(<FunctionParameter>_ v: <SimpleTypeIdentifier>Float</SimpleTypeIdentifier></FunctionParameter>) </ParameterClause><ReturnClause>-> <TupleType>(<TupleTypeElement><SimpleTypeIdentifier>Float</SimpleTypeIdentifier>, </TupleTypeElement><TupleTypeElement><SimpleTypeIdentifier>Float</SimpleTypeIdentifier></TupleTypeElement>) </TupleType></ReturnClause></FunctionSignature><CodeBlock>{<ReturnStmt>
6066
return <TupleExpr>(<TupleExprElement><IdentifierExpr>v</IdentifierExpr>, </TupleExprElement><TupleExprElement><PrefixOperatorExpr>-<IdentifierExpr>v</IdentifierExpr></PrefixOperatorExpr></TupleExprElement>)</TupleExpr></ReturnStmt>
67+
}</CodeBlock></FunctionDecl><FunctionDecl><Attribute>
68+
69+
@transpose(<DerivativeRegistrationAttributeArguments>of: <QualifiedDeclName><SimpleTypeIdentifier>Float</SimpleTypeIdentifier>.-</QualifiedDeclName>, <DifferentiationParamsClause>wrt: <DifferentiationParams>(<DifferentiationParam>0, </DifferentiationParam><DifferentiationParam>1</DifferentiationParam>)</DifferentiationParams></DifferentiationParamsClause></DerivativeRegistrationAttributeArguments>)</Attribute>
70+
func subtractTranspose<FunctionSignature><ParameterClause>(<FunctionParameter>_ v: <SimpleTypeIdentifier>Float</SimpleTypeIdentifier></FunctionParameter>) </ParameterClause><ReturnClause>-> <TupleType>(<TupleTypeElement><SimpleTypeIdentifier>Float</SimpleTypeIdentifier>, </TupleTypeElement><TupleTypeElement><SimpleTypeIdentifier>Float</SimpleTypeIdentifier></TupleTypeElement>) </TupleType></ReturnClause></FunctionSignature><CodeBlock>{<ReturnStmt>
71+
return <TupleExpr>(<TupleExprElement><IdentifierExpr>v</IdentifierExpr>, </TupleExprElement><TupleExprElement><PrefixOperatorExpr>-<IdentifierExpr>v</IdentifierExpr></PrefixOperatorExpr></TupleExprElement>)</TupleExpr></ReturnStmt>
72+
}</CodeBlock></FunctionDecl><FunctionDecl><Attribute>
73+
74+
@transpose(<DerivativeRegistrationAttributeArguments>of: <QualifiedDeclName><MemberTypeIdentifier><MemberTypeIdentifier><SimpleTypeIdentifier>A</SimpleTypeIdentifier>.B</MemberTypeIdentifier>.C</MemberTypeIdentifier>.foo<DeclNameArguments>(<DeclNameArgument>label:</DeclNameArgument><DeclNameArgument>_:</DeclNameArgument>)</DeclNameArguments></QualifiedDeclName>, <DifferentiationParamsClause>wrt: <DifferentiationParams>(<DifferentiationParam>0</DifferentiationParam>)</DifferentiationParams></DifferentiationParamsClause></DerivativeRegistrationAttributeArguments>)</Attribute>
75+
func qualifiedTranspose<FunctionSignature><ParameterClause>(<FunctionParameter>_ v: <SimpleTypeIdentifier>Float</SimpleTypeIdentifier></FunctionParameter>) </ParameterClause><ReturnClause>-> <TupleType>(<TupleTypeElement><SimpleTypeIdentifier>Float</SimpleTypeIdentifier>, </TupleTypeElement><TupleTypeElement><SimpleTypeIdentifier>Float</SimpleTypeIdentifier></TupleTypeElement>) </TupleType></ReturnClause></FunctionSignature><CodeBlock>{<ReturnStmt>
76+
return <TupleExpr>(<TupleExprElement><IdentifierExpr>v</IdentifierExpr>, </TupleExprElement><TupleExprElement><PrefixOperatorExpr>-<IdentifierExpr>v</IdentifierExpr></PrefixOperatorExpr></TupleExprElement>)</TupleExpr></ReturnStmt>
6177
}</CodeBlock></FunctionDecl>

test/AutoDiff/Syntax/round_trip_parse_gen.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ func bazDerivative(_ x: Float, y: Float)
5050
return (x, { v in v })
5151
}
5252

53+
@derivative(of: A.B.C.foo(label:_:), wrt: (x))
54+
func qualifiedDerivative(_ x: Float, y: Float)
55+
-> (value: Float, pullback: (Float) -> Float) {
56+
return (x, { v in v })
57+
}
58+
5359
@transpose(of: +)
5460
func addTranspose(_ v: Float) -> (Float, Float) {
5561
return (v, v)
@@ -59,3 +65,13 @@ func addTranspose(_ v: Float) -> (Float, Float) {
5965
func subtractTranspose(_ v: Float) -> (Float, Float) {
6066
return (v, -v)
6167
}
68+
69+
@transpose(of: Float.-, wrt: (0, 1))
70+
func subtractTranspose(_ v: Float) -> (Float, Float) {
71+
return (v, -v)
72+
}
73+
74+
@transpose(of: A.B.C.foo(label:_:), wrt: (0))
75+
func qualifiedTranspose(_ v: Float) -> (Float, Float) {
76+
return (v, -v)
77+
}

0 commit comments

Comments
 (0)