diff options
Diffstat (limited to 'clang/lib/Parse/ParseInit.cpp')
-rw-r--r-- | clang/lib/Parse/ParseInit.cpp | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/clang/lib/Parse/ParseInit.cpp b/clang/lib/Parse/ParseInit.cpp index 9ac2b2e6f79b..9d9c03d28a97 100644 --- a/clang/lib/Parse/ParseInit.cpp +++ b/clang/lib/Parse/ParseInit.cpp @@ -159,8 +159,7 @@ static void CheckArrayDesignatorSyntax(Parser &P, SourceLocation Loc, /// /// \p CodeCompleteCB is called with Designation parsed so far. ExprResult Parser::ParseInitializerWithPotentialDesignator( - llvm::function_ref<void(const Designation &)> CodeCompleteCB) { - + DesignatorCompletionInfo DesignatorCompletion) { // If this is the old-style GNU extension: // designation ::= identifier ':' // Handle it as a field designator. Otherwise, this must be the start of a @@ -183,6 +182,8 @@ ExprResult Parser::ParseInitializerWithPotentialDesignator( Designation D; D.AddDesignator(Designator::getField(FieldName, SourceLocation(), NameLoc)); + PreferredType.enterDesignatedInitializer( + Tok.getLocation(), DesignatorCompletion.PreferredBaseType, D); return Actions.ActOnDesignatedInitializer(D, ColonLoc, true, ParseInitializer()); } @@ -199,8 +200,9 @@ ExprResult Parser::ParseInitializerWithPotentialDesignator( SourceLocation DotLoc = ConsumeToken(); if (Tok.is(tok::code_completion)) { - CodeCompleteCB(Desig); cutOffParsing(); + Actions.CodeCompleteDesignator(DesignatorCompletion.PreferredBaseType, + DesignatorCompletion.InitExprs, Desig); return ExprError(); } if (Tok.isNot(tok::identifier)) { @@ -388,6 +390,8 @@ ExprResult Parser::ParseInitializerWithPotentialDesignator( // Handle a normal designator sequence end, which is an equal. if (Tok.is(tok::equal)) { SourceLocation EqualLoc = ConsumeToken(); + PreferredType.enterDesignatedInitializer( + Tok.getLocation(), DesignatorCompletion.PreferredBaseType, Desig); return Actions.ActOnDesignatedInitializer(Desig, EqualLoc, false, ParseInitializer()); } @@ -396,6 +400,8 @@ ExprResult Parser::ParseInitializerWithPotentialDesignator( // direct-list-initialization of the aggregate element. We allow this as an // extension from C++11 onwards (when direct-list-initialization was added). if (Tok.is(tok::l_brace) && getLangOpts().CPlusPlus11) { + PreferredType.enterDesignatedInitializer( + Tok.getLocation(), DesignatorCompletion.PreferredBaseType, Desig); return Actions.ActOnDesignatedInitializer(Desig, SourceLocation(), false, ParseBraceInitializer()); } @@ -453,9 +459,9 @@ ExprResult Parser::ParseBraceInitializer() { Actions, EnterExpressionEvaluationContext::InitList); bool InitExprsOk = true; - auto CodeCompleteDesignation = [&](const Designation &D) { - Actions.CodeCompleteDesignator(PreferredType.get(T.getOpenLocation()), - InitExprs, D); + DesignatorCompletionInfo DesignatorCompletion{ + InitExprs, + PreferredType.get(T.getOpenLocation()), }; while (1) { @@ -476,7 +482,7 @@ ExprResult Parser::ParseBraceInitializer() { // initializer directly. ExprResult SubElt; if (MayBeDesignationStart()) - SubElt = ParseInitializerWithPotentialDesignator(CodeCompleteDesignation); + SubElt = ParseInitializerWithPotentialDesignator(DesignatorCompletion); else SubElt = ParseInitializer(); @@ -556,9 +562,9 @@ bool Parser::ParseMicrosoftIfExistsBraceInitializer(ExprVector &InitExprs, return false; } - auto CodeCompleteDesignation = [&](const Designation &D) { - Actions.CodeCompleteDesignator(PreferredType.get(Braces.getOpenLocation()), - InitExprs, D); + DesignatorCompletionInfo DesignatorCompletion{ + InitExprs, + PreferredType.get(Braces.getOpenLocation()), }; while (!isEofOrEom()) { trailingComma = false; @@ -566,7 +572,7 @@ bool Parser::ParseMicrosoftIfExistsBraceInitializer(ExprVector &InitExprs, // initializer directly. ExprResult SubElt; if (MayBeDesignationStart()) - SubElt = ParseInitializerWithPotentialDesignator(CodeCompleteDesignation); + SubElt = ParseInitializerWithPotentialDesignator(DesignatorCompletion); else SubElt = ParseInitializer(); |