[clang-tools-extra] 0ec8120 - [clang-tidy] performance-unnecessary-copy-initialization: Do not remove comments on new lines.
Felix Berger via cfe-commits
cfe-commits at lists.llvm.org
Mon Jul 12 13:23:26 PDT 2021
Author: Felix Berger
Date: 2021-07-12T16:23:04-04:00
New Revision: 0ec812023b43992810499b04222348fdbdb41ef2
URL: https://github.com/llvm/llvm-project/commit/0ec812023b43992810499b04222348fdbdb41ef2
DIFF: https://github.com/llvm/llvm-project/commit/0ec812023b43992810499b04222348fdbdb41ef2.diff
LOG: [clang-tidy] performance-unnecessary-copy-initialization: Do not remove comments on new lines.
When deleting the copy assignment statement because copied variable is not used
only remove trailing comments on the same line.
Differential Revision: https://reviews.llvm.org/D105734
Reviewed-by: ymandel
Added:
Modified:
clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp
clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-copy-initialization.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp b/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp
index f69a2079e4ba1..f6b8e44785b5f 100644
--- a/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp
+++ b/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp
@@ -39,14 +39,35 @@ void recordFixes(const VarDecl &Var, ASTContext &Context,
}
}
+llvm::Optional<SourceLocation> firstLocAfterNewLine(SourceLocation Loc,
+ SourceManager &SM) {
+ bool Invalid;
+ const char *TextAfter = SM.getCharacterData(Loc, &Invalid);
+ if (Invalid) {
+ return llvm::None;
+ }
+ size_t Offset = std::strcspn(TextAfter, "\n");
+ return Loc.getLocWithOffset(TextAfter[Offset] == '\0' ? Offset : Offset + 1);
+}
+
void recordRemoval(const DeclStmt &Stmt, ASTContext &Context,
DiagnosticBuilder &Diagnostic) {
- // Attempt to remove the whole line until the next non-comment token.
- auto Tok = utils::lexer::findNextTokenSkippingComments(
- Stmt.getEndLoc(), Context.getSourceManager(), Context.getLangOpts());
- if (Tok) {
- Diagnostic << FixItHint::CreateRemoval(SourceRange(
- Stmt.getBeginLoc(), Tok->getLocation().getLocWithOffset(-1)));
+ auto &SM = Context.getSourceManager();
+ // Attempt to remove trailing comments as well.
+ auto Tok = utils::lexer::findNextTokenSkippingComments(Stmt.getEndLoc(), SM,
+ Context.getLangOpts());
+ llvm::Optional<SourceLocation> PastNewLine =
+ firstLocAfterNewLine(Stmt.getEndLoc(), SM);
+ if (Tok && PastNewLine) {
+ auto BeforeFirstTokenAfterComment = Tok->getLocation().getLocWithOffset(-1);
+ // Remove until the end of the line or the end of a trailing comment which
+ // ever comes first.
+ auto End =
+ SM.isBeforeInTranslationUnit(*PastNewLine, BeforeFirstTokenAfterComment)
+ ? *PastNewLine
+ : BeforeFirstTokenAfterComment;
+ Diagnostic << FixItHint::CreateRemoval(
+ SourceRange(Stmt.getBeginLoc(), End));
} else {
Diagnostic << FixItHint::CreateRemoval(Stmt.getSourceRange());
}
diff --git a/clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-copy-initialization.cpp b/clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-copy-initialization.cpp
index b66a88e5cf81f..3ce151035d5be 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-copy-initialization.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-copy-initialization.cpp
@@ -596,8 +596,15 @@ void positiveUnusedReferenceIsRemoved() {
// CHECK-FIXES: int i = 0; // Foo bar.
auto TrailingCommentRemoved = ExpensiveTypeReference(); // Trailing comment.
// CHECK-MESSAGES: [[@LINE-1]]:8: warning: the variable 'TrailingCommentRemoved' is copy-constructed from a const reference but is never used;
- // CHECK-FIXES-NOT: auto TrailingCommentRemoved = ExpensiveTypeReference(); // Trailing comment.
+ // CHECK-FIXES-NOT: auto TrailingCommentRemoved = ExpensiveTypeReference();
+ // CHECK-FIXES-NOT: // Trailing comment.
// clang-format on
+
+ auto UnusedAndUnnecessary = ExpensiveTypeReference();
+ // Comments on a new line should not be deleted.
+ // CHECK-MESSAGES: [[@LINE-2]]:8: warning: the variable 'UnusedAndUnnecessary' is copy-constructed
+ // CHECK-FIXES-NOT: auto UnusedAndUnnecessary = ExpensiveTypeReference();
+ // CHECK-FIXES: // Comments on a new line should not be deleted.
}
void negativeloopedOverObjectIsModified() {
More information about the cfe-commits
mailing list