================ @@ -273,6 +273,18 @@ void UnnecessaryCopyInitialization::registerMatchers(MatchFinder *Finder) { Finder->addMatcher(LocalVarCopiedFrom(declRefExpr( to(varDecl(hasLocalStorage()).bind(OldVarDeclId)))), this); + + auto DeclRefToConstVar = + declRefExpr(to(varDecl(anyOf(hasType(isConstQualified()), + hasType(references(isConstQualified())))) + .bind(OldVarDeclId))); + Finder->addMatcher( + LocalVarCopiedFrom( + memberExpr(hasObjectExpression(anyOf(hasDescendant(DeclRefToConstVar), ---------------- movie-travel-code wrote:
Good catch, vbvictor! However the current check results are reasonable, although they don't quite meet expectations🤔, pretty wierd! ```c++ struct NestedStruct { Struct s; const Struct& getConstRefS() const { return s; } const Struct getConstS() const { return s; } Struct getS() const { return s; } }; const auto m1 = ns.getConstRefS().Member; // warn const auto m2 = ns.getConstS().Member; // not warn const auto m3 = ns.getS().Member; // not warn ``` I suspect that another matcher is at work, but these checks are currently mixed together. I will analyze the reasons next week and try to give a reasonable explanation. ``` Finder->addMatcher( LocalVarCopiedFrom(anyOf( isConstRefReturningFunctionCall(), isRefReturningMethodCallWithConstOverloads(ExcludedContainerTypes))), this); ``` btw, I added more tests to analyze these behaviors. https://github.com/llvm/llvm-project/pull/151936 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits