@@ -454,62 +454,41 @@ void DiagnosticRenderer::emitSingleMacroExpansion(
454
454
SpellingRanges, {});
455
455
}
456
456
457
- // / Check that the macro argument location of Loc starts with ArgumentLoc.
458
- // / The starting location of the macro expansions is used to differeniate
459
- // / different macro expansions.
460
- static bool checkLocForMacroArgExpansion (SourceLocation Loc,
461
- const SourceManager &SM,
462
- SourceLocation ArgumentLoc) {
463
- SourceLocation MacroLoc;
464
- if (SM.isMacroArgExpansion (Loc, &MacroLoc)) {
465
- if (ArgumentLoc == MacroLoc) return true ;
466
- }
467
-
468
- return false ;
469
- }
470
-
471
- // / Check if all the locations in the range have the same macro argument
472
- // / expansion, and that the expansion starts with ArgumentLoc.
473
- static bool checkRangeForMacroArgExpansion (CharSourceRange Range,
474
- const SourceManager &SM,
475
- SourceLocation ArgumentLoc) {
476
- SourceLocation BegLoc = Range.getBegin (), EndLoc = Range.getEnd ();
477
- while (BegLoc != EndLoc) {
478
- if (!checkLocForMacroArgExpansion (BegLoc, SM, ArgumentLoc))
479
- return false ;
480
- BegLoc.getLocWithOffset (1 );
481
- }
482
-
483
- return checkLocForMacroArgExpansion (BegLoc, SM, ArgumentLoc);
484
- }
485
-
486
457
// / A helper function to check if the current ranges are all inside the same
487
458
// / macro argument expansion as Loc.
488
- static bool checkRangesForMacroArgExpansion (FullSourceLoc Loc,
489
- ArrayRef<CharSourceRange> Ranges) {
459
+ static bool
460
+ rangesInsideSameMacroArgExpansion (FullSourceLoc Loc,
461
+ ArrayRef<CharSourceRange> Ranges) {
490
462
assert (Loc.isMacroID () && " Must be a macro expansion!" );
491
463
492
- SmallVector<CharSourceRange, 4 > SpellingRanges;
464
+ SmallVector<CharSourceRange> SpellingRanges;
493
465
mapDiagnosticRanges (Loc, Ranges, SpellingRanges);
494
466
495
- // Count all valid ranges.
496
467
unsigned ValidCount =
497
468
llvm::count_if (Ranges, [](const auto &R) { return R.isValid (); });
498
-
499
469
if (ValidCount > SpellingRanges.size ())
500
470
return false ;
501
471
502
- // To store the source location of the argument location.
503
- FullSourceLoc ArgumentLoc;
472
+ const SourceManager &SM = Loc.getManager ();
473
+ for (const auto &R : Ranges) {
474
+ // All positions in the range need to point to Loc.
475
+ SourceLocation Begin = R.getBegin ();
476
+ if (Begin == R.getEnd ()) {
477
+ if (!SM.isMacroArgExpansion (Begin))
478
+ return false ;
479
+ continue ;
480
+ }
504
481
505
- // Set the ArgumentLoc to the beginning location of the expansion of Loc
506
- // so to check if the ranges expands to the same beginning location.
507
- if (!Loc.isMacroArgExpansion (&ArgumentLoc))
508
- return false ;
482
+ while (Begin != R.getEnd ()) {
483
+ SourceLocation MacroLoc;
484
+ if (!SM.isMacroArgExpansion (Begin, &MacroLoc))
485
+ return false ;
486
+ if (MacroLoc != Loc)
487
+ return false ;
509
488
510
- for ( const auto &Range : SpellingRanges)
511
- if (! checkRangeForMacroArgExpansion (Range, Loc. getManager (), ArgumentLoc))
512
- return false ;
489
+ Begin = Begin. getLocWithOffset ( 1 );
490
+ }
491
+ }
513
492
514
493
return true ;
515
494
}
@@ -539,13 +518,13 @@ void DiagnosticRenderer::emitMacroExpansions(FullSourceLoc Loc,
539
518
while (L.isMacroID ()) {
540
519
// If this is the expansion of a macro argument, point the caret at the
541
520
// use of the argument in the definition of the macro, not the expansion.
542
- if (SM.isMacroArgExpansion (L))
521
+ if (SM.isMacroArgExpansion (L)) {
543
522
LocationStack.push_back (SM.getImmediateExpansionRange (L).getBegin ());
544
- else
545
- LocationStack.push_back (L);
546
523
547
- if (checkRangesForMacroArgExpansion (FullSourceLoc (L, SM), Ranges))
548
- IgnoredEnd = LocationStack.size ();
524
+ if (rangesInsideSameMacroArgExpansion (FullSourceLoc (L, SM), Ranges))
525
+ IgnoredEnd = LocationStack.size ();
526
+ } else
527
+ LocationStack.push_back (L);
549
528
550
529
L = SM.getImmediateMacroCallerLoc (L);
551
530
0 commit comments