Merge pull request #23360 from akyrtzi/fix-syntax-parser-assertion
[syntax parser] Fix assertion hit with invalid type parsing
diff --git a/lib/Parse/ParseType.cpp b/lib/Parse/ParseType.cpp
index daf6780..b062506 100644
--- a/lib/Parse/ParseType.cpp
+++ b/lib/Parse/ParseType.cpp
@@ -705,16 +705,19 @@
SyntaxContext->setCreateSyntax(SyntaxKind::CompositionType);
assert(Tok.isContextualPunctuator("&"));
do {
- consumeToken(); // consume '&'
-
- if (SyntaxContext->isEnabled() && Status.isSuccess()) {
- ParsedCompositionTypeElementSyntaxBuilder Builder(*SyntaxContext);
- auto Ampersand = SyntaxContext->popToken();
- auto Type = SyntaxContext->popIf<ParsedTypeSyntax>().getValue();
- Builder
- .useAmpersand(Ampersand)
- .useType(Type);
- SyntaxContext->addSyntax(Builder.build());
+ if (SyntaxContext->isEnabled()) {
+ auto Type = SyntaxContext->popIf<ParsedTypeSyntax>();
+ consumeToken(); // consume '&'
+ if (Type) {
+ ParsedCompositionTypeElementSyntaxBuilder Builder(*SyntaxContext);
+ auto Ampersand = SyntaxContext->popToken();
+ Builder
+ .useAmpersand(Ampersand)
+ .useType(Type.getValue());
+ SyntaxContext->addSyntax(Builder.build());
+ }
+ } else {
+ consumeToken(); // consume '&'
}
// Parse next type.
diff --git a/test/Syntax/Parser/fixed_crashers.swift b/test/Syntax/Parser/fixed_crashers.swift
new file mode 100644
index 0000000..bc9bb7c
--- /dev/null
+++ b/test/Syntax/Parser/fixed_crashers.swift
@@ -0,0 +1,5 @@
+// REQUIRES: syntax_parser_lib
+// RUN: %swift-syntax-parser-test %s -dump-tree | %FileCheck %s
+
+let x: a[i] & b
+// CHECK: |let|