@@ -159,7 +159,9 @@ static void CheckArrayDesignatorSyntax(Parser &P, SourceLocation Loc,
159
159
// /
160
160
// / \p CodeCompleteCB is called with Designation parsed so far.
161
161
ExprResult Parser::ParseInitializerWithPotentialDesignator (
162
- llvm::function_ref<void (const Designation &)> CodeCompleteCB) {
162
+ DesignatorCompletionInfo DesignatorCompletion) {
163
+ if (!getPreprocessor ().isCodeCompletionEnabled ())
164
+ DesignatorCompletion.PreferredBaseType = QualType (); // skip field lookup
163
165
164
166
// If this is the old-style GNU extension:
165
167
// designation ::= identifier ':'
@@ -183,6 +185,8 @@ ExprResult Parser::ParseInitializerWithPotentialDesignator(
183
185
184
186
Designation D;
185
187
D.AddDesignator (Designator::getField (FieldName, SourceLocation (), NameLoc));
188
+ PreferredType.enterDesignatedInitializer (
189
+ Tok.getLocation (), DesignatorCompletion.PreferredBaseType , D);
186
190
return Actions.ActOnDesignatedInitializer (D, ColonLoc, true ,
187
191
ParseInitializer ());
188
192
}
@@ -199,7 +203,8 @@ ExprResult Parser::ParseInitializerWithPotentialDesignator(
199
203
SourceLocation DotLoc = ConsumeToken ();
200
204
201
205
if (Tok.is (tok::code_completion)) {
202
- CodeCompleteCB (Desig);
206
+ Actions.CodeCompleteDesignator (DesignatorCompletion.PreferredBaseType ,
207
+ DesignatorCompletion.InitExprs , Desig);
203
208
cutOffParsing ();
204
209
return ExprError ();
205
210
}
@@ -388,6 +393,8 @@ ExprResult Parser::ParseInitializerWithPotentialDesignator(
388
393
// Handle a normal designator sequence end, which is an equal.
389
394
if (Tok.is (tok::equal)) {
390
395
SourceLocation EqualLoc = ConsumeToken ();
396
+ PreferredType.enterDesignatedInitializer (
397
+ Tok.getLocation (), DesignatorCompletion.PreferredBaseType , Desig);
391
398
return Actions.ActOnDesignatedInitializer (Desig, EqualLoc, false ,
392
399
ParseInitializer ());
393
400
}
@@ -396,6 +403,8 @@ ExprResult Parser::ParseInitializerWithPotentialDesignator(
396
403
// direct-list-initialization of the aggregate element. We allow this as an
397
404
// extension from C++11 onwards (when direct-list-initialization was added).
398
405
if (Tok.is (tok::l_brace) && getLangOpts ().CPlusPlus11 ) {
406
+ PreferredType.enterDesignatedInitializer (
407
+ Tok.getLocation (), DesignatorCompletion.PreferredBaseType , Desig);
399
408
return Actions.ActOnDesignatedInitializer (Desig, SourceLocation (), false ,
400
409
ParseBraceInitializer ());
401
410
}
@@ -453,9 +462,9 @@ ExprResult Parser::ParseBraceInitializer() {
453
462
Actions, EnterExpressionEvaluationContext::InitList);
454
463
455
464
bool InitExprsOk = true ;
456
- auto CodeCompleteDesignation = [&]( const Designation &D) {
457
- Actions. CodeCompleteDesignator (PreferredType. get (T. getOpenLocation ()) ,
458
- InitExprs, D);
465
+ DesignatorCompletionInfo DesignatorCompletion {
466
+ InitExprs ,
467
+ PreferredType. get (T. getOpenLocation ()),
459
468
};
460
469
461
470
while (1 ) {
@@ -476,7 +485,7 @@ ExprResult Parser::ParseBraceInitializer() {
476
485
// initializer directly.
477
486
ExprResult SubElt;
478
487
if (MayBeDesignationStart ())
479
- SubElt = ParseInitializerWithPotentialDesignator (CodeCompleteDesignation );
488
+ SubElt = ParseInitializerWithPotentialDesignator (DesignatorCompletion );
480
489
else
481
490
SubElt = ParseInitializer ();
482
491
@@ -556,17 +565,17 @@ bool Parser::ParseMicrosoftIfExistsBraceInitializer(ExprVector &InitExprs,
556
565
return false ;
557
566
}
558
567
559
- auto CodeCompleteDesignation = [&]( const Designation &D) {
560
- Actions. CodeCompleteDesignator (PreferredType. get (Braces. getOpenLocation ()) ,
561
- InitExprs, D);
568
+ DesignatorCompletionInfo DesignatorCompletion {
569
+ InitExprs ,
570
+ PreferredType. get (Braces. getOpenLocation ()),
562
571
};
563
572
while (!isEofOrEom ()) {
564
573
trailingComma = false ;
565
574
// If we know that this cannot be a designation, just parse the nested
566
575
// initializer directly.
567
576
ExprResult SubElt;
568
577
if (MayBeDesignationStart ())
569
- SubElt = ParseInitializerWithPotentialDesignator (CodeCompleteDesignation );
578
+ SubElt = ParseInitializerWithPotentialDesignator (DesignatorCompletion );
570
579
else
571
580
SubElt = ParseInitializer ();
572
581
0 commit comments