@@ -46,38 +46,41 @@ void AvoidEndlCheck::check(const MatchFinder::MatchResult &Result) {
46
46
// Handle the more common streaming '... << std::endl' case
47
47
const CharSourceRange TokenRange =
48
48
CharSourceRange::getTokenRange (Expression->getSourceRange ());
49
- const StringRef SourceText = Lexer::getSourceText (
49
+ StringRef SourceText = Lexer::getSourceText (
50
50
TokenRange, *Result.SourceManager , Result.Context ->getLangOpts ());
51
-
51
+ if (SourceText.empty ())
52
+ SourceText = " std::endl" ;
52
53
auto Diag = diag (Expression->getBeginLoc (),
53
54
" do not use '%0' with streams; use '\\ n' instead" )
54
55
<< SourceText;
55
-
56
- Diag << FixItHint::CreateReplacement (TokenRange, " '\\ n'" );
56
+ if (TokenRange. isValid ())
57
+ Diag << FixItHint::CreateReplacement (TokenRange, " '\\ n'" );
57
58
} else {
58
59
// Handle the less common function call 'std::endl(...)' case
59
60
const auto *CallExpression = llvm::cast<CallExpr>(Expression);
60
61
assert (CallExpression->getNumArgs () == 1 );
61
62
62
- const StringRef SourceText = Lexer::getSourceText (
63
+ StringRef SourceText = Lexer::getSourceText (
63
64
CharSourceRange::getTokenRange (
64
65
CallExpression->getCallee ()->getSourceRange ()),
65
66
*Result.SourceManager , Result.Context ->getLangOpts ());
67
+ if (SourceText.empty ())
68
+ SourceText = " std::endl" ;
69
+ auto Diag = diag (CallExpression->getBeginLoc (),
70
+ " do not use '%0' with streams; use '\\ n' instead" )
71
+ << SourceText;
66
72
67
73
const CharSourceRange ArgTokenRange = CharSourceRange::getTokenRange (
68
74
CallExpression->getArg (0 )->getSourceRange ());
69
75
const StringRef ArgSourceText = Lexer::getSourceText (
70
76
ArgTokenRange, *Result.SourceManager , Result.Context ->getLangOpts ());
71
-
72
- const std::string ReplacementString =
73
- std::string (ArgSourceText) + " << '\\ n'" ;
74
-
75
- diag (CallExpression->getBeginLoc (),
76
- " do not use '%0' with streams; use '\\ n' instead" )
77
- << SourceText
78
- << FixItHint::CreateReplacement (
79
- CharSourceRange::getTokenRange (CallExpression->getSourceRange ()),
80
- ReplacementString);
77
+ const CharSourceRange ReplacementRange =
78
+ CharSourceRange::getTokenRange (CallExpression->getSourceRange ());
79
+ if (!ArgSourceText.empty () && ReplacementRange.isValid ()) {
80
+ const std::string ReplacementString =
81
+ std::string (ArgSourceText) + " << '\\ n'" ;
82
+ Diag << FixItHint::CreateReplacement (ReplacementRange, ReplacementString);
83
+ }
81
84
}
82
85
}
83
86
0 commit comments