@@ -46,38 +46,41 @@ void AvoidEndlCheck::check(const MatchFinder::MatchResult &Result) {
4646 // Handle the more common streaming '... << std::endl' case
4747 const CharSourceRange TokenRange =
4848 CharSourceRange::getTokenRange (Expression->getSourceRange ());
49- const StringRef SourceText = Lexer::getSourceText (
49+ StringRef SourceText = Lexer::getSourceText (
5050 TokenRange, *Result.SourceManager , Result.Context ->getLangOpts ());
51-
51+ if (SourceText.empty ())
52+ SourceText = " std::endl" ;
5253 auto Diag = diag (Expression->getBeginLoc (),
5354 " do not use '%0' with streams; use '\\ n' instead" )
5455 << SourceText;
55-
56- Diag << FixItHint::CreateReplacement (TokenRange, " '\\ n'" );
56+ if (TokenRange. isValid ())
57+ Diag << FixItHint::CreateReplacement (TokenRange, " '\\ n'" );
5758 } else {
5859 // Handle the less common function call 'std::endl(...)' case
5960 const auto *CallExpression = llvm::cast<CallExpr>(Expression);
6061 assert (CallExpression->getNumArgs () == 1 );
6162
62- const StringRef SourceText = Lexer::getSourceText (
63+ StringRef SourceText = Lexer::getSourceText (
6364 CharSourceRange::getTokenRange (
6465 CallExpression->getCallee ()->getSourceRange ()),
6566 *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;
6672
6773 const CharSourceRange ArgTokenRange = CharSourceRange::getTokenRange (
6874 CallExpression->getArg (0 )->getSourceRange ());
6975 const StringRef ArgSourceText = Lexer::getSourceText (
7076 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+ }
8184 }
8285}
8386
0 commit comments