diff options
Diffstat (limited to 'lib/Parse/ParseInit.cpp')
| -rw-r--r-- | lib/Parse/ParseInit.cpp | 38 | 
1 files changed, 23 insertions, 15 deletions
| diff --git a/lib/Parse/ParseInit.cpp b/lib/Parse/ParseInit.cpp index 7742a5087cf01..7a455484b902f 100644 --- a/lib/Parse/ParseInit.cpp +++ b/lib/Parse/ParseInit.cpp @@ -1,9 +1,8 @@  //===--- ParseInit.cpp - Initializer Parsing ------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception  //  //===----------------------------------------------------------------------===//  // @@ -66,15 +65,28 @@ bool Parser::MayBeDesignationStart() {    // Parse up to (at most) the token after the closing ']' to determine    // whether this is a C99 designator or a lambda. -  TentativeParsingAction Tentative(*this); +  RevertingTentativeParsingAction Tentative(*this);    LambdaIntroducer Intro; -  bool SkippedInits = false; -  Optional<unsigned> DiagID(ParseLambdaIntroducer(Intro, &SkippedInits)); +  LambdaIntroducerTentativeParse ParseResult; +  if (ParseLambdaIntroducer(Intro, &ParseResult)) { +    // Hit and diagnosed an error in a lambda. +    // FIXME: Tell the caller this happened so they can recover. +    return true; +  } + +  switch (ParseResult) { +  case LambdaIntroducerTentativeParse::Success: +  case LambdaIntroducerTentativeParse::Incomplete: +    // Might be a lambda-expression. Keep looking. +    // FIXME: If our tentative parse was not incomplete, parse the lambda from +    // here rather than throwing away then reparsing the LambdaIntroducer. +    break; -  if (DiagID) { -    // If this can't be a lambda capture list, it's a designator. -    Tentative.Revert(); +  case LambdaIntroducerTentativeParse::MessageSend: +  case LambdaIntroducerTentativeParse::Invalid: +    // Can't be a lambda-expression. Treat it as a designator. +    // FIXME: Should we disambiguate against a message-send?      return true;    } @@ -83,11 +95,7 @@ bool Parser::MayBeDesignationStart() {    // lambda expression. This decision favors lambdas over the older    // GNU designator syntax, which allows one to omit the '=', but is    // consistent with GCC. -  tok::TokenKind Kind = Tok.getKind(); -  // FIXME: If we didn't skip any inits, parse the lambda from here -  // rather than throwing away then reparsing the LambdaIntroducer. -  Tentative.Revert(); -  return Kind == tok::equal; +  return Tok.is(tok::equal);  }  static void CheckArrayDesignatorSyntax(Parser &P, SourceLocation Loc, | 
