forked from OSchip/llvm-project
[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:
parent
a56bd7dec8
commit
efa4dbc32c
|
@ -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))
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue