diff --git a/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp b/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp --- a/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp +++ b/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp @@ -100,7 +100,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(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 --- 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 @@ ExpensiveToCopyType(); virtual ~ExpensiveToCopyType(); const ExpensiveToCopyType &reference() const; + const ExpensiveToCopyType *pointer() const; void nonConstMethod(); bool constMethod() const; }; @@ -548,6 +549,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();