Skip to content

Commit d28d407

Browse files
authored
Merge pull request #13173 from rintaro/parse-specifier-typesimple
[Parse] Skip type specifiers in middle of composition types
2 parents 4274233 + e7be78b commit d28d407

File tree

4 files changed

+14
-44
lines changed

4 files changed

+14
-44
lines changed

include/swift/AST/DiagnosticsParse.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1280,6 +1280,8 @@ ERROR(attr_interpolated_string,none,
12801280

12811281
ERROR(attr_only_at_non_local_scope, none,
12821282
"attribute '%0' can only be used in a non-local scope", (StringRef))
1283+
ERROR(attr_only_on_parameters_parse, none,
1284+
"'%0' may only be used on parameters", (StringRef))
12831285

12841286
// Access control
12851287
ERROR(attr_access_expected_set,none,

include/swift/Parse/Parser.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -933,12 +933,10 @@ class Parser {
933933
bool HandleCodeCompletion = true,
934934
bool IsSILFuncDecl = false);
935935

936-
ParserResult<TypeRepr> parseTypeSimpleOrComposition();
937936
ParserResult<TypeRepr>
938937
parseTypeSimpleOrComposition(Diag<> MessageID,
939938
bool HandleCodeCompletion = true);
940939

941-
ParserResult<TypeRepr> parseTypeSimple();
942940
ParserResult<TypeRepr> parseTypeSimple(Diag<> MessageID,
943941
bool HandleCodeCompletion = true);
944942

lib/Parse/ParseType.cpp

Lines changed: 8 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,6 @@ LayoutConstraint Parser::parseLayoutConstraint(Identifier LayoutConstraintID) {
157157
alignment, Context);
158158
}
159159

160-
ParserResult<TypeRepr> Parser::parseTypeSimple() {
161-
return parseTypeSimple(diag::expected_type);
162-
}
163-
164160
/// parseTypeSimple
165161
/// type-simple:
166162
/// type-identifier
@@ -176,22 +172,14 @@ ParserResult<TypeRepr> Parser::parseTypeSimple() {
176172
ParserResult<TypeRepr> Parser::parseTypeSimple(Diag<> MessageID,
177173
bool HandleCodeCompletion) {
178174
ParserResult<TypeRepr> ty;
179-
// If this is an "inout" marker for an identifier type, consume the inout.
180-
SourceLoc SpecifierLoc;
181-
VarDecl::Specifier TypeSpecifier;
182-
if (Tok.is(tok::kw_inout)) {
183-
SpecifierLoc = consumeToken();
184-
TypeSpecifier = VarDecl::Specifier::InOut;
185-
} else if (Tok.is(tok::identifier)) {
186-
if (Tok.getRawText().equals("__shared")) {
187-
assert(false);
188-
SpecifierLoc = consumeToken();
189-
TypeSpecifier = VarDecl::Specifier::Shared;
190-
} else if (Tok.getRawText().equals("__owned")) {
191-
assert(false);
192-
SpecifierLoc = consumeToken();
193-
TypeSpecifier = VarDecl::Specifier::Owned;
194-
}
175+
176+
if (Tok.is(tok::kw_inout) ||
177+
(Tok.is(tok::identifier) && (Tok.getRawText().equals("__shared") ||
178+
Tok.getRawText().equals("__owned")))) {
179+
// Type specifier should already be parsed before here. This only happens
180+
// for construct like 'P1 & inout P2'.
181+
diagnose(Tok.getLoc(), diag::attr_only_on_parameters_parse, Tok.getText());
182+
consumeToken();
195183
}
196184

197185
switch (Tok.getKind()) {
@@ -301,24 +289,6 @@ ParserResult<TypeRepr> Parser::parseTypeSimple(Diag<> MessageID,
301289
break;
302290
}
303291

304-
// If we parsed any specifier, prepend it.
305-
if (SpecifierLoc.isValid() && ty.isNonNull()) {
306-
TypeRepr *repr = ty.get();
307-
switch (TypeSpecifier) {
308-
case VarDecl::Specifier::InOut:
309-
repr = new (Context) InOutTypeRepr(repr, SpecifierLoc);
310-
break;
311-
case VarDecl::Specifier::Shared:
312-
repr = new (Context) SharedTypeRepr(repr, SpecifierLoc);
313-
break;
314-
case VarDecl::Specifier::Owned:
315-
break;
316-
case VarDecl::Specifier::Var:
317-
llvm_unreachable("tried to create var type specifier?");
318-
}
319-
ty = makeParserResult(repr);
320-
}
321-
322292
return ty;
323293
}
324294

@@ -677,10 +647,6 @@ SyntaxParserResult<TypeSyntax, TypeRepr> Parser::parseTypeIdentifier() {
677647
return makeSyntaxResult(Status, SyntaxNode, ITR);
678648
}
679649

680-
ParserResult<TypeRepr> Parser::parseTypeSimpleOrComposition() {
681-
return parseTypeSimpleOrComposition(diag::expected_identifier_for_type);
682-
}
683-
684650
/// parseTypeSimpleOrComposition
685651
///
686652
/// type-composition:

test/type/protocol_composition.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,3 +174,7 @@ takesP1AndP2([AnyObject & protocol_composition.P1 & P2]())
174174
takesP1AndP2([AnyObject & P1 & protocol_composition.P2]())
175175
takesP1AndP2([DoesNotExist & P1 & P2]()) // expected-error {{use of unresolved identifier 'DoesNotExist'}}
176176
takesP1AndP2([Swift.DoesNotExist & P1 & P2]()) // expected-error {{module 'Swift' has no member named 'DoesNotExist'}}
177+
178+
typealias T08 = P1 & inout P2 // expected-error {{'inout' may only be used on parameters}}
179+
typealias T09 = P1 & __shared P2 // expected-error {{'__shared' may only be used on parameters}}
180+
typealias T10 = P1 & __owned P2 // expected-error {{'__owned' may only be used on parameters}}

0 commit comments

Comments
 (0)