[clang-tools-extra] efa4dbc - [clang-tidy] performance-unnecessary-copy-initialization: Look at the canonical type when checking for aliases.
Felix Berger via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 9 13:37:22 PDT 2021
Author: Felix Berger
Date: 2021-06-09T16:36:53-04:00
New Revision: efa4dbc32ca9b7f3319edbcc6ac502ea962c8f0a
URL: https://github.com/llvm/llvm-project/commit/efa4dbc32ca9b7f3319edbcc6ac502ea962c8f0a
DIFF: https://github.com/llvm/llvm-project/commit/efa4dbc32ca9b7f3319edbcc6ac502ea962c8f0a.diff
LOG: [clang-tidy] performance-unnecessary-copy-initialization: Look at the canonical type when checking for aliases.
This fixes a false positive case where for instance a pointer is obtained and declared using `auto`.
Differential Revision: https://reviews.llvm.org/D103018
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 57a2310e779fb..27ce36e49a073 100644
--- a/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp
+++ b/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp
@@ -100,7 +100,7 @@ static bool isInitializingVariableImmutable(const VarDecl &InitializingVar,
if (!isOnlyUsedAsConst(InitializingVar, BlockStmt, Context))
return false;
- QualType T = InitializingVar.getType();
+ QualType T = InitializingVar.getType().getCanonicalType();
// The variable is a value type and we know it is only used as const. Safe
// to reference it and avoid the copy.
if (!isa<ReferenceType, PointerType>(T))
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 3a4c3ec869e1c..e894f84f11d8c 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
@@ -4,6 +4,7 @@ struct ExpensiveToCopyType {
ExpensiveToCopyType();
virtual ~ExpensiveToCopyType();
const ExpensiveToCopyType &reference() const;
+ const ExpensiveToCopyType *pointer() const;
void nonConstMethod();
bool constMethod() const;
};
@@ -548,6 +549,25 @@ void negativeCopiedFromGetterOfReferenceToModifiedVar() {
Orig.nonConstMethod();
}
+void negativeAliasNonCanonicalPointerType() {
+ ExpensiveToCopyType Orig;
+ // The use of auto here hides that the type is a pointer type. The check needs
+ // to look at the canonical type to detect the aliasing through this pointer.
+ const auto Pointer = Orig.pointer();
+ const auto NecessaryCopy = Pointer->reference();
+ Orig.nonConstMethod();
+}
+
+void negativeAliasTypedefedType() {
+ typedef const ExpensiveToCopyType &ReferenceType;
+ ExpensiveToCopyType Orig;
+ // The typedef hides the fact that this is a reference type. The check needs
+ // to look at the canonical type to detect the aliasing.
+ ReferenceType Ref = Orig.reference();
+ const auto NecessaryCopy = Ref.reference();
+ Orig.nonConstMethod();
+}
+
void positiveCopiedFromGetterOfReferenceToConstVar() {
ExpensiveToCopyType Orig;
const auto &Ref = Orig.reference();
More information about the cfe-commits
mailing list