Skip to content

Commit c8e0c52

Browse files
authored
---
yaml --- r: 348850 b: refs/heads/master c: e7c0172 h: refs/heads/master
1 parent 54f79a0 commit c8e0c52

34 files changed

+285
-177
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 52cf3659b5741c3c82c6dd515d8ae2118ccb7b1b
2+
refs/heads/master: e7c0172c671e27053a159e9a323ea456ba70cb2c
33
refs/heads/master-next: 203b3026584ecad859eb328b2e12490099409cd5
44
refs/tags/osx-passed: b6b74147ef8a386f532cf9357a1bde006e552c54
55
refs/tags/swift-2.2-SNAPSHOT-2015-12-01-a: 6bb18e013c2284f2b45f5f84f2df2887dc0f7dea

trunk/include/swift/Basic/LangOptions.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,10 @@ namespace swift {
325325
/// set to true.
326326
bool ExperimentalDependenciesIncludeIntrafileOnes = false;
327327

328+
/// Whether to enable experimental differentiable programming features:
329+
/// `@differentiable` declaration attribute, etc.
330+
bool EnableExperimentalDifferentiableProgramming = false;
331+
328332
/// Sets the target we are building for and updates platform conditions
329333
/// to match.
330334
///

trunk/include/swift/Option/Options.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,11 @@ def disable_bridging_pch : Flag<["-"], "disable-bridging-pch">,
424424
Flags<[HelpHidden]>,
425425
HelpText<"Disable automatic generation of bridging PCH files">;
426426

427+
// Experimental feature options
428+
def enable_experimental_differentiable_programming : Flag<["-"], "enable-experimental-differentiable-programming">,
429+
Flags<[FrontendOption]>,
430+
HelpText<"Enable experimental differentiable programming features">;
431+
427432
// Diagnostic control options
428433
def suppress_warnings : Flag<["-"], "suppress-warnings">,
429434
Flags<[FrontendOption]>,

trunk/include/swift/Parse/Parser.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -895,9 +895,9 @@ class Parser {
895895
bool parseMatchingToken(tok K, SourceLoc &TokLoc, Diag<> ErrorDiag,
896896
SourceLoc OtherLoc);
897897

898-
llvm::Optional<ParsedTokenSyntax>
899-
parseMatchingTokenSyntax(tok K, SourceLoc &TokLoc, Diag<> ErrorDiag,
900-
SourceLoc OtherLoc);
898+
ParsedSyntaxResult<ParsedTokenSyntax>
899+
parseMatchingTokenSyntax(tok K, Diag<> ErrorDiag, SourceLoc OtherLoc,
900+
bool silenceDiag = false);
901901

902902
/// Returns the proper location for a missing right brace, parenthesis, etc.
903903
SourceLoc getLocForMissingMatchingToken() const;
@@ -919,7 +919,6 @@ class Parser {
919919
llvm::function_ref<ParserStatus()> callback);
920920
ParserStatus parseListSyntax(tok RightK, SourceLoc LeftLoc,
921921
llvm::Optional<ParsedTokenSyntax> &LastComma,
922-
SourceLoc &RightLoc,
923922
llvm::Optional<ParsedTokenSyntax> &Right,
924923
llvm::SmallVectorImpl<ParsedSyntax>& Junk,
925924
bool AllowSepAfterLast, Diag<> ErrorDiag,

trunk/lib/Parse/ASTGen.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -976,6 +976,9 @@ GenericParamList *ASTGen::generate(const GenericParameterClauseSyntax &clause,
976976
params.reserve(clause.getGenericParameterList().getNumChildren());
977977

978978
for (auto elem : clause.getGenericParameterList()) {
979+
auto nameTok = elem.getName();
980+
if (nameTok.isMissing())
981+
break;
979982

980983
DeclAttributes attrs = generateDeclAttributes(elem, Loc, false);
981984
Identifier name = Context.getIdentifier(elem.getName().getIdentifierText());

trunk/lib/Parse/ParseDecl.cpp

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1632,6 +1632,9 @@ ParserStatus Parser::parseDeclAttribute(DeclAttributes &Attributes, SourceLoc At
16321632
}
16331633
consumeToken(tok::code_complete);
16341634
return makeParserCodeCompletionStatus();
1635+
} else {
1636+
// Synthesize an r_brace syntax node if the token is absent
1637+
SyntaxContext->synthesize(tok::identifier, AtLoc.getAdvancedLoc(1));
16351638
}
16361639

16371640
diagnose(Tok, diag::expected_attribute_name);
@@ -1999,13 +2002,11 @@ ParsedSyntaxResult<ParsedAttributeSyntax> Parser::parseTypeAttributeSyntax() {
19992002
}
20002003

20012004
// Parse ')'.
2002-
SourceLoc RParenLoc;
20032005
auto RParen = parseMatchingTokenSyntax(
2004-
tok::r_paren, RParenLoc, diag::convention_attribute_expected_rparen,
2005-
LParenLoc);
2006-
if (!RParen)
2006+
tok::r_paren, diag::convention_attribute_expected_rparen, LParenLoc);
2007+
if (RParen.isError())
20072008
return makeParserError();
2008-
builder.useRightParen(std::move(*RParen));
2009+
builder.useRightParen(RParen.get());
20092010

20102011
return makeParserSuccess();
20112012
}();
@@ -2033,13 +2034,11 @@ ParsedSyntaxResult<ParsedAttributeSyntax> Parser::parseTypeAttributeSyntax() {
20332034
builder.useArgument(consumeTokenSyntax(tok::string_literal));
20342035

20352036
// Parse ')'.
2036-
SourceLoc RParenLoc;
20372037
auto RParen = parseMatchingTokenSyntax(
2038-
tok::r_paren, RParenLoc, diag::opened_attribute_expected_rparen,
2039-
LParenLoc);
2040-
if (!RParen)
2038+
tok::r_paren, diag::opened_attribute_expected_rparen, LParenLoc);
2039+
if (RParen.isError())
20412040
return makeParserError();
2042-
builder.useRightParen(std::move(*RParen));
2041+
builder.useRightParen(RParen.get());
20432042

20442043
return makeParserSuccess();
20452044
}();
@@ -2085,12 +2084,11 @@ ParsedSyntaxResult<ParsedAttributeSyntax> Parser::parseTypeAttributeSyntax() {
20852084
builder.useArgument(argBuilder.build());
20862085

20872086
// Parse ')'.
2088-
SourceLoc RParenLoc;
20892087
auto RParen = parseMatchingTokenSyntax(
2090-
tok::r_paren, RParenLoc, diag::expected_rparen_expr_list, LParenLoc);
2091-
if (!RParen)
2088+
tok::r_paren, diag::expected_rparen_expr_list, LParenLoc);
2089+
if (RParen.isError())
20922090
return makeParserError();
2093-
builder.useRightParen(std::move(*RParen));
2091+
builder.useRightParen(RParen.get());
20942092

20952093
return makeParserSuccess();
20962094
}();

trunk/lib/Parse/ParseGeneric.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ Parser::parseGenericParameterClauseSyntax() {
7474

7575
// Parse attributes.
7676
// TODO: Implement syntax attribute parsing.
77+
Optional<ParsedAttributeListSyntax> attrs;
7778
if (Tok.is(tok::at_sign)) {
7879
SyntaxParsingContext TmpCtxt(SyntaxContext);
7980
TmpCtxt.setTransparent();
@@ -83,18 +84,23 @@ Parser::parseGenericParameterClauseSyntax() {
8384
parseDeclAttributeList(attrsAST);
8485
if (!attrsAST.isEmpty())
8586
Generator.addDeclAttributes(attrsAST, AttrsLoc);
86-
auto attrs = SyntaxContext->popIf<ParsedAttributeListSyntax>();
87-
if (attrs)
88-
paramBuilder.useAttributes(std::move(*attrs));
87+
attrs = SyntaxContext->popIf<ParsedAttributeListSyntax>();
8988
}
9089

9190
// Parse the name of the parameter.
9291
auto ident = Context.getIdentifier(Tok.getText());
9392
auto name = parseIdentifierSyntax(diag::expected_generics_parameter_name);
9493
if (!name) {
94+
if (attrs) {
95+
paramBuilder.useAttributes(std::move(*attrs));
96+
builder.addGenericParameterListMember(paramBuilder.build());
97+
}
9598
status.setIsParseError();
9699
break;
97100
}
101+
102+
if (attrs)
103+
paramBuilder.useAttributes(std::move(*attrs));
98104
paramBuilder.useName(std::move(*name));
99105

100106
// Parse the ':' followed by a type.

trunk/lib/Parse/ParseType.cpp

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -130,18 +130,15 @@ Parser::parseLayoutConstraintSyntax() {
130130
return false;
131131
};
132132

133-
if (parseTrivialConstraintBody()) {
133+
auto hasError = parseTrivialConstraintBody();
134+
if (hasError)
134135
ignoreUntil(tok::r_paren);
135-
if (Tok.is(tok::r_paren))
136-
builder.useRightParen(consumeTokenSyntax(tok::r_paren));
137-
} else {
138-
SourceLoc rParenLoc;
139-
auto rParen = parseMatchingTokenSyntax(tok::r_paren, rParenLoc,
140-
diag::expected_rparen_layout_constraint,
141-
lParenLoc);
142-
if (rParen)
143-
builder.useRightParen(std::move(*rParen));
144-
}
136+
auto rParen = parseMatchingTokenSyntax(
137+
tok::r_paren, diag::expected_rparen_layout_constraint, lParenLoc,
138+
/*silenceDiag=*/hasError);
139+
if (!rParen.isNull())
140+
builder.useRightParen(rParen.get());
141+
145142
return makeParsedResult(builder.build());
146143
}
147144

@@ -979,11 +976,10 @@ ParsedSyntaxResult<ParsedTypeSyntax> Parser::parseTypeTupleBody() {
979976

980977
Optional<ParsedTokenSyntax> Comma;
981978

982-
SourceLoc RParenLoc;
983979
Optional<ParsedTokenSyntax> RParen;
984980

985981
ParserStatus Status =
986-
parseListSyntax(tok::r_paren, LParenLoc, Comma, RParenLoc, RParen, Junk,
982+
parseListSyntax(tok::r_paren, LParenLoc, Comma, RParen, Junk,
987983
false, diag::expected_rparen_tuple_type_list, [&]() {
988984
Optional<BacktrackingScope> Backtracking;
989985
SmallVector<ParsedSyntax, 0> LocalJunk;
@@ -1231,11 +1227,11 @@ Parser::parseTypeArray(ParsedTypeSyntax Base, SourceLoc BaseLoc) {
12311227
// Ignore integer literal between '[' and ']'
12321228
ignoreIf(tok::integer_literal);
12331229

1234-
SourceLoc RSquareLoc;
1230+
auto RSquareLoc = Tok.getLoc();
12351231
auto RSquare = parseMatchingTokenSyntax(
1236-
tok::r_square, RSquareLoc, diag::expected_rbracket_array_type, LSquareLoc);
1232+
tok::r_square, diag::expected_rbracket_array_type, LSquareLoc);
12371233

1238-
if (RSquare) {
1234+
if (!RSquare.isNull()) {
12391235
// If we parsed something valid, diagnose it with a fixit to rewrite it to
12401236
// Swift syntax.
12411237
diagnose(LSquareLoc, diag::new_array_syntax)
@@ -1247,11 +1243,9 @@ Parser::parseTypeArray(ParsedTypeSyntax Base, SourceLoc BaseLoc) {
12471243
ParserStatus status;
12481244

12491245
builder.useElementType(std::move(Base));
1250-
if (RSquare) {
1251-
builder.useRightSquareBracket(std::move(*RSquare));
1252-
} else {
1253-
status.setIsParseError();
1254-
}
1246+
if (!RSquare.isNull())
1247+
builder.useRightSquareBracket(RSquare.get());
1248+
status |= RSquare.getStatus();
12551249

12561250
return makeParsedResult(builder.build(), status);
12571251
}
@@ -1289,27 +1283,24 @@ ParsedSyntaxResult<ParsedTypeSyntax> Parser::parseTypeCollection() {
12891283
auto Diag = Colon ? diag::expected_rbracket_dictionary_type
12901284
: diag::expected_rbracket_array_type;
12911285

1292-
SourceLoc RSquareLoc;
1293-
auto RSquare =
1294-
parseMatchingTokenSyntax(tok::r_square, RSquareLoc, Diag, LSquareLoc);
1295-
if (!RSquare)
1296-
Status.setIsParseError();
1286+
auto RSquare = parseMatchingTokenSyntax(tok::r_square, Diag, LSquareLoc);
1287+
Status |= RSquare.getStatus();
12971288

12981289
if (Colon) {
12991290
ParsedDictionaryTypeSyntaxBuilder builder(*SyntaxContext);
13001291
builder.useLeftSquareBracket(std::move(LSquare));
13011292
builder.useKeyType(std::move(*ElementType));
13021293
builder.useColon(std::move(*Colon));
13031294
builder.useValueType(std::move(*ValueType));
1304-
if (RSquare)
1305-
builder.useRightSquareBracket(std::move(*RSquare));
1295+
if (!RSquare.isNull())
1296+
builder.useRightSquareBracket(RSquare.get());
13061297
return makeParsedResult(builder.build(), Status);
13071298
} else {
13081299
ParsedArrayTypeSyntaxBuilder builder(*SyntaxContext);
13091300
builder.useLeftSquareBracket(std::move(LSquare));
13101301
builder.useElementType(std::move(*ElementType));
1311-
if (RSquare)
1312-
builder.useRightSquareBracket(std::move(*RSquare));
1302+
if (!RSquare.isNull())
1303+
builder.useRightSquareBracket(RSquare.get());
13131304
return makeParsedResult(builder.build(), Status);
13141305
}
13151306
}

trunk/lib/Parse/Parser.cpp

Lines changed: 21 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,22 +1254,26 @@ Optional<ParsedTokenSyntax> Parser::parseTokenSyntax(tok K, SourceLoc &TokLoc,
12541254
return None;
12551255
}
12561256

1257-
Optional<ParsedTokenSyntax>
1258-
Parser::parseMatchingTokenSyntax(tok K, SourceLoc &TokLoc, Diag<> ErrorDiag, SourceLoc OtherLoc) {
1259-
Diag<> OtherNote;
1260-
switch (K) {
1261-
case tok::r_paren: OtherNote = diag::opening_paren; break;
1262-
case tok::r_square: OtherNote = diag::opening_bracket; break;
1263-
case tok::r_brace: OtherNote = diag::opening_brace; break;
1264-
default: llvm_unreachable("unknown matching token!");
1265-
}
1257+
ParsedSyntaxResult<ParsedTokenSyntax>
1258+
Parser::parseMatchingTokenSyntax(tok K, Diag<> ErrorDiag, SourceLoc OtherLoc,
1259+
bool silenceDiag) {
1260+
if (Tok.is(K))
1261+
return makeParsedResult(consumeTokenSyntax(K));
1262+
checkForInputIncomplete();
12661263

1267-
auto Token = parseTokenSyntax(K, TokLoc, ErrorDiag);
1268-
if (!Token) {
1269-
TokLoc = getLocForMissingMatchingToken();
1264+
if (!silenceDiag) {
1265+
diagnose(Tok, ErrorDiag);
1266+
1267+
Diag<> OtherNote;
1268+
switch (K) {
1269+
case tok::r_paren: OtherNote = diag::opening_paren; break;
1270+
case tok::r_square: OtherNote = diag::opening_bracket; break;
1271+
case tok::r_brace: OtherNote = diag::opening_brace; break;
1272+
default: llvm_unreachable("unknown matching token!");
1273+
}
12701274
diagnose(OtherLoc, OtherNote);
12711275
}
1272-
return Token;
1276+
return makeParserError();
12731277
}
12741278

12751279
SourceLoc Parser::getLocForMissingMatchingToken() const {
@@ -1317,7 +1321,6 @@ static SyntaxKind getListElementKind(SyntaxKind ListKind) {
13171321
ParserStatus
13181322
Parser::parseListSyntax(tok RightK, SourceLoc LeftLoc,
13191323
Optional<ParsedTokenSyntax> &LastComma,
1320-
SourceLoc &RightLoc,
13211324
Optional<ParsedTokenSyntax> &Right,
13221325
SmallVectorImpl<ParsedSyntax>& Junk,
13231326
bool AllowSepAfterLast, Diag<> ErrorDiag,
@@ -1327,13 +1330,11 @@ Parser::parseListSyntax(tok RightK, SourceLoc LeftLoc,
13271330
};
13281331

13291332
if (Tok.is(RightK)) {
1330-
RightLoc = Tok.getLoc();
13311333
Right = consumeTokenSyntax(RightK);
13321334
return makeParserSuccess();
13331335
}
13341336
if (TokIsStringInterpolationEOF()) {
13351337
Tok.setKind(RightK);
1336-
RightLoc = Tok.getLoc();
13371338
Right = consumeTokenSyntax();
13381339
return makeParserSuccess();
13391340
}
@@ -1356,7 +1357,6 @@ Parser::parseListSyntax(tok RightK, SourceLoc LeftLoc,
13561357
// Just accept the ")" and build the tuple as we usually do.
13571358
if (TokIsStringInterpolationEOF()) {
13581359
Tok.setKind(RightK);
1359-
RightLoc = Tok.getLoc();
13601360
Right = consumeTokenSyntax();
13611361
return Status;
13621362
}
@@ -1393,20 +1393,10 @@ Parser::parseListSyntax(tok RightK, SourceLoc LeftLoc,
13931393
Status.setIsParseError();
13941394
}
13951395

1396-
if (Status.isError()) {
1397-
// If we've already got errors, don't emit missing RightK diagnostics.
1398-
if (Tok.is(RightK)) {
1399-
RightLoc = Tok.getLoc();
1400-
Right = consumeTokenSyntax(RightK);
1401-
} else {
1402-
RightLoc = getLocForMissingMatchingToken();
1403-
}
1404-
} else {
1405-
Right = parseMatchingTokenSyntax(RightK, RightLoc, ErrorDiag, LeftLoc);
1406-
if (!Right)
1407-
Status.setIsParseError();
1408-
}
1409-
1396+
auto RightResult = parseMatchingTokenSyntax(RightK, ErrorDiag, LeftLoc,
1397+
Status.isError());
1398+
Status |= RightResult.getStatus();
1399+
Right = RightResult.getOrNull();
14101400
return Status;
14111401
}
14121402

0 commit comments

Comments
 (0)