flx created this revision. flx added reviewers: hokein, ymandel, aaron.ballman. Herald added subscribers: jeroen.dobbelaere, xazax.hun. flx requested review of this revision. Herald added a project: clang-tools-extra. Herald added a subscriber: cfe-commits.
This fixes a false positive case where for instance a pointer is obtained and declared using `auto`. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D103018 Files: clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-copy-initialization.cpp Index: clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-copy-initialization.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-copy-initialization.cpp +++ clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-copy-initialization.cpp @@ -4,6 +4,7 @@ ExpensiveToCopyType(); virtual ~ExpensiveToCopyType(); const ExpensiveToCopyType &reference() const; + const ExpensiveToCopyType *pointer() const; void nonConstMethod(); bool constMethod() const; }; @@ -500,6 +501,25 @@ 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(); Index: clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp =================================================================== --- clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp +++ clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp @@ -86,7 +86,7 @@ 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))
Index: clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-copy-initialization.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-copy-initialization.cpp +++ clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-copy-initialization.cpp @@ -4,6 +4,7 @@ ExpensiveToCopyType(); virtual ~ExpensiveToCopyType(); const ExpensiveToCopyType &reference() const; + const ExpensiveToCopyType *pointer() const; void nonConstMethod(); bool constMethod() const; }; @@ -500,6 +501,25 @@ 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(); Index: clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp =================================================================== --- clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp +++ clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp @@ -86,7 +86,7 @@ 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))
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits