Skip to content

Commit 807e3f3

Browse files
committed
[SyntaxParse] Fix round-trip issue in generic argument parsing
When type parsing inside generic argument fails, '<' must be before other parsed arguments.
1 parent cb308b7 commit 807e3f3

File tree

2 files changed

+4
-4
lines changed

2 files changed

+4
-4
lines changed

lib/Parse/ParseType.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -547,12 +547,12 @@ Parser::parseGenericArgumentClauseSyntax() {
547547

548548
SmallVector<ParsedGenericArgumentSyntax, 4> Args;
549549
SmallVector<ParsedSyntax, 0> Junk;
550+
Junk.push_back(LAngle);
550551

551552
while (true) {
552553
ParserResult<TypeRepr> Ty = parseType(diag::expected_type);
553554
auto Type = SyntaxContext->popIf<ParsedTypeSyntax>();
554555
if (Ty.isParseError() || Ty.hasCodeCompletion()) {
555-
Junk.push_back(LAngle);
556556
Junk.append(Args.begin(), Args.end());
557557
if (Type)
558558
Junk.push_back(*Type);
@@ -571,9 +571,7 @@ Parser::parseGenericArgumentClauseSyntax() {
571571
diagnose(Tok, diag::expected_rangle_generic_arg_list);
572572
diagnose(LAngleLoc, diag::opening_angle);
573573

574-
Junk.push_back(LAngle);
575-
for (auto &&Arg : Args)
576-
Junk.push_back(Arg);
574+
Junk.append(Args.begin(), Args.end());
577575
skipUntilGreaterInTypeListSyntax(Junk);
578576
return makeParsedError<ParsedGenericArgumentClauseSyntax>(Junk);
579577
}

test/Syntax/round_trip_misc.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ class C {
44
// Erroneous typealias decl.
55
typealias Inner: Foo = Int
66

7+
typealias Inner: Foo2 = [Generic<Int
8+
79
// Implict accessor with attribute at the top of its body.
810
var x: Int {
911
@objc

0 commit comments

Comments
 (0)