From df0c350cce2e3c4f2b427a6ecf0d3ce8578031bf Mon Sep 17 00:00:00 2001 From: Rintaro Ishizaki Date: Wed, 26 Oct 2016 21:30:08 +0900 Subject: [PATCH 1/2] [Parse] Eliminate unneeded backtracking scope in parsing .dynamicType --- lib/Parse/ParseExpr.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp index 583943fc827bd..2935dc245476d 100644 --- a/lib/Parse/ParseExpr.cpp +++ b/lib/Parse/ParseExpr.cpp @@ -1453,9 +1453,8 @@ ParserResult Parser::parseExprPostfix(Diag<> ID, bool isExprBasic) { // Handle the deprecated 'x.dynamicType' and migrate it to `type(of: x)` if (Tok.getText() == "dynamicType") { - BacktrackingScope backtrackScope(*this); auto range = Result.get()->getSourceRange(); - auto dynamicTypeExprRange = SourceRange(TokLoc, consumeToken()); + auto dynamicTypeExprRange = SourceRange(TokLoc, Tok.getLoc()); diagnose(TokLoc, diag::expr_dynamictype_deprecated) .highlight(dynamicTypeExprRange) .fixItReplace(dynamicTypeExprRange, ")") From 47e07bc6112b4e04dce7687781f5af5d2bdbc914 Mon Sep 17 00:00:00 2001 From: Rintaro Ishizaki Date: Wed, 26 Oct 2016 21:41:23 +0900 Subject: [PATCH 2/2] [Parse] Create DiagnosticTransaction along with BacktrackingScope This prevents duplicated diagnostics. --- include/swift/Parse/Parser.h | 13 ++++++++++--- test/expr/primary/unqualified_name.swift | 11 +++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/include/swift/Parse/Parser.h b/include/swift/Parse/Parser.h index dae83a212f7e8..57243d3f37b17 100644 --- a/include/swift/Parse/Parser.h +++ b/include/swift/Parse/Parser.h @@ -350,17 +350,24 @@ class Parser { class BacktrackingScope { Parser &P; ParserPosition PP; + DiagnosticTransaction DT; bool Backtrack = true; public: - BacktrackingScope(Parser &P) : P(P), PP(P.getParserPosition()) {} + BacktrackingScope(Parser &P) + : P(P), PP(P.getParserPosition()), DT(P.Diags) {} ~BacktrackingScope() { - if (Backtrack) + if (Backtrack) { P.backtrackToPosition(PP); + DT.abort(); + } } - void cancelBacktrack() { Backtrack = false; } + void cancelBacktrack() { + Backtrack = false; + DT.commit(); + } }; /// RAII object that, when it is destructed, restores the parser and lexer to diff --git a/test/expr/primary/unqualified_name.swift b/test/expr/primary/unqualified_name.swift index 82d9f9b7baf46..8d222f5f821fa 100644 --- a/test/expr/primary/unqualified_name.swift +++ b/test/expr/primary/unqualified_name.swift @@ -73,3 +73,14 @@ class C1 : C0 { } } +struct S1 { + init(x: Int) {} // expected-note {{'init(x:)' declared here}} + + func testS1() { + _ = S1.init(x:)(1) + _ = S1.init(`x`: 1) // expected-warning {{keyword 'x' does not need to be escaped in argument list}} {{17-18=}} {{19-20=}} + + // Test for unknown token. + _ = S1.init(x: 0xG) // expected-error {{expected a digit after integer literal prefix}} expected-error {{missing argument for parameter 'x' in call}} + } +}