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(); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits