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 @@ -84,7 +84,8 @@ // returned either points to a global static variable or to a member of the // called object. return cxxMemberCallExpr( - callee(cxxMethodDecl(returns(matchers::isReferenceToConst())) + callee(cxxMethodDecl( + returns(hasCanonicalType(matchers::isReferenceToConst()))) .bind(MethodDeclId)), on(declRefExpr(to( varDecl( @@ -97,7 +98,8 @@ // Only allow initialization of a const reference from a free function if it // has no arguments. Otherwise it could return an alias to one of its // arguments and the arguments need to be checked for const use as well. - return callExpr(callee(functionDecl(returns(matchers::isReferenceToConst())) + return callExpr(callee(functionDecl(returns(hasCanonicalType( + matchers::isReferenceToConst()))) .bind(FunctionDeclId)), argumentCountIs(0), unless(callee(cxxMethodDecl()))) .bind(InitFunctionCallId); 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 @@ -12,6 +12,8 @@ ExpensiveToCopyType(); virtual ~ExpensiveToCopyType(); const ExpensiveToCopyType &reference() const; + using ConstRef = const ExpensiveToCopyType &; + ConstRef referenceWithAlias() const; const ExpensiveToCopyType *pointer() const; Iterator begin() const; Iterator end() const; @@ -206,6 +208,15 @@ } } +void positiveNonConstVarInCodeBlockWithAlias(const ExpensiveToCopyType &Obj) { + { + const ExpensiveToCopyType Assigned = Obj.referenceWithAlias(); + // CHECK-MESSAGES: [[@LINE-1]]:31: warning: the const qualified variable + // CHECK-FIXES: const ExpensiveToCopyType& Assigned = Obj.referenceWithAlias(); + useAsConstReference(Assigned); + } +} + void negativeNonConstVarWithNonConstUse(const ExpensiveToCopyType &Obj) { { auto NonConstInvoked = Obj.reference();