This revision was automatically updated to reflect the committed changes. Closed by commit rGfc1b24d7360f: [clang-tidy]performance-unnecessary-copy-initialization: fix false negative (authored by courbet).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D112722/new/ https://reviews.llvm.org/D112722 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 @@ -12,6 +12,8 @@ ExpensiveToCopyType(); virtual ~ExpensiveToCopyType(); const ExpensiveToCopyType &reference() const; + using ConstRef = const ExpensiveToCopyType &; + ConstRef referenceWithAlias() const; const ExpensiveToCopyType *pointer() const; Iterator<ExpensiveToCopyType> begin() const; Iterator<ExpensiveToCopyType> 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(); 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 @@ -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);
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 @@ -12,6 +12,8 @@ ExpensiveToCopyType(); virtual ~ExpensiveToCopyType(); const ExpensiveToCopyType &reference() const; + using ConstRef = const ExpensiveToCopyType &; + ConstRef referenceWithAlias() const; const ExpensiveToCopyType *pointer() const; Iterator<ExpensiveToCopyType> begin() const; Iterator<ExpensiveToCopyType> 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(); 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 @@ -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);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits