[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
This commit is contained in:
Felix Berger 2021-05-24 09:14:59 -04:00
parent a56bd7dec8
commit efa4dbc32c
2 changed files with 21 additions and 1 deletions

View File

@ -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))

View File

@ -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();