Skip to content

Commit 53dfecd

Browse files
committed
[libSyntax] Fix a crash that happened when parsing an invalid type
1 parent 3045067 commit 53dfecd

File tree

4 files changed

+18
-6
lines changed

4 files changed

+18
-6
lines changed

lib/Parse/ParseType.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1180,11 +1180,17 @@ Parser::parseTypeOptional(TypeRepr *base) {
11801180
auto TyR = new (Context) OptionalTypeRepr(base, questionLoc);
11811181
llvm::Optional<TypeSyntax> SyntaxNode;
11821182
if (SyntaxContext->isEnabled()) {
1183-
OptionalTypeSyntaxBuilder Builder(Context.getSyntaxArena());
1184-
Builder
1185-
.useQuestionMark(SyntaxContext->popToken())
1186-
.useWrappedType(SyntaxContext->popIf<TypeSyntax>().getValue());
1187-
SyntaxNode.emplace(Builder.build());
1183+
auto QuestionMark = SyntaxContext->popToken();
1184+
if (auto WrappedType = SyntaxContext->popIf<TypeSyntax>()) {
1185+
OptionalTypeSyntaxBuilder Builder(Context.getSyntaxArena());
1186+
Builder
1187+
.useQuestionMark(QuestionMark)
1188+
.useWrappedType(WrappedType.getValue());
1189+
SyntaxNode.emplace(Builder.build());
1190+
} else {
1191+
// Undo the popping of the question mark
1192+
SyntaxContext->addSyntax(QuestionMark);
1193+
}
11881194
}
11891195
return makeSyntaxResult(SyntaxNode, TyR);
11901196
}

test/Syntax/Outputs/round_trip_invalid.swift.withkinds

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<FunctionDecl>// RUN: rm -rf %t
1+
<VariableDecl>// RUN: rm -rf %t
22
// RUN: %swift-syntax-test -input-source-filename %s -parse-gen > %t
33
// RUN: diff -u %s %t
44
// RUN: %swift-syntax-test -input-source-filename %s -parse-gen -print-node-kind > %t.withkinds
@@ -9,6 +9,8 @@
99
// RUN: %swift-syntax-test -deserialize-raw-tree -input-source-filename %t.dump -output-filename %t
1010
// RUN: diff -u %s %t
1111

12+
let <PatternBinding><IdentifierPattern>strings</IdentifierPattern><TypeAnnotation>: [<SimpleTypeIdentifier>Strin</SimpleTypeIdentifier>[<UnresolvedPatternExpr><IdentifierPattern>g</IdentifierPattern></UnresolvedPatternExpr>]?</TypeAnnotation></PatternBinding></VariableDecl><FunctionDecl>
13+
1214
// Function body without closing brace token.
1315
func foo<FunctionSignature><ParameterClause>() </ParameterClause></FunctionSignature><CodeBlock>{<VariableDecl>
1416
var <PatternBinding><IdentifierPattern>a </IdentifierPattern><InitializerClause>= <IntegerLiteralExpr>2</IntegerLiteralExpr></InitializerClause></PatternBinding></VariableDecl></CodeBlock></FunctionDecl>

test/Syntax/round_trip_invalid.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
// RUN: %swift-syntax-test -deserialize-raw-tree -input-source-filename %t.dump -output-filename %t
1010
// RUN: diff -u %s %t
1111

12+
let strings: [Strin[g]?
13+
1214
// Function body without closing brace token.
1315
func foo() {
1416
var a = 2

test/Syntax/round_trip_misc.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,5 @@ typealias c = @foobar(a) () -> Void
2828
let d = \.foo
2929
let e = \.[1]
3030
let f = \.?.bar
31+
32+
let optionalArray: [Int]?

0 commit comments

Comments
 (0)