Izaron created this revision. Izaron added reviewers: mgehre-amd, njames93, aaron.ballman. Herald added subscribers: carlosgalvezp, xazax.hun. Herald added a project: All. Izaron requested review of this revision. Herald added a project: clang-tools-extra. Herald added a subscriber: cfe-commits.
The checker should ignore parentheses when looking whether the function should be marked as `const`. Fixes https://github.com/llvm/llvm-project/issues/52838 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D122075 Files: clang-tools-extra/clang-tidy/readability/MakeMemberFunctionConstCheck.cpp clang-tools-extra/test/clang-tidy/checkers/readability-make-member-function-const.cpp Index: clang-tools-extra/test/clang-tidy/checkers/readability-make-member-function-const.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/readability-make-member-function-const.cpp +++ clang-tools-extra/test/clang-tidy/checkers/readability-make-member-function-const.cpp @@ -40,6 +40,12 @@ return ConstM; } + int read_fields_in_parentheses() { + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: method 'read_fields_in_parentheses' can be made const + // CHECK-FIXES: {{^}} int read_fields_in_parentheses() const { + return (this)->M + (((((Struct.M))))) + ((this->ConstM)); + } + void call_const_member() { // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: method 'call_const_member' can be made const // CHECK-FIXES: {{^}} void call_const_member() const { Index: clang-tools-extra/clang-tidy/readability/MakeMemberFunctionConstCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/readability/MakeMemberFunctionConstCheck.cpp +++ clang-tools-extra/clang-tidy/readability/MakeMemberFunctionConstCheck.cpp @@ -66,6 +66,15 @@ return Parents.begin()->get<T>(); } + const Stmt *getParentStmt(const Expr *E) { return getParent<Stmt>(E); } + + const Expr *getParentExpr(const Expr *E) { + const Expr *Parent = getParent<Expr>(E); + while (isa_and_nonnull<ParenExpr>(Parent)) + Parent = getParent<Expr>(Parent); + return Parent; + } + bool VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *) { // An UnresolvedMemberExpr might resolve to a non-const non-static // member function. @@ -103,7 +112,7 @@ if (!QT.isConstQualified()) return false; // Stop traversal. - const auto *Parent = getParent<Stmt>(Cast); + const auto *Parent = getParentStmt(Cast); if (!Parent) return false; // Stop traversal. @@ -140,7 +149,7 @@ return true; } - const auto *Parent = getParent<Expr>(Member); + const auto *Parent = getParentExpr(Member); if (const auto *Cast = dyn_cast_or_null<ImplicitCastExpr>(Parent)) { // A read access to a member is safe when the member either @@ -167,12 +176,12 @@ bool VisitCXXThisExpr(const CXXThisExpr *E) { Usage = Const; - const auto *Parent = getParent<Expr>(E); + const auto *Parent = getParentExpr(E); // Look through deref of this. if (const auto *UnOp = dyn_cast_or_null<UnaryOperator>(Parent)) { if (UnOp->getOpcode() == UO_Deref) { - Parent = getParent<Expr>(UnOp); + Parent = getParentExpr(UnOp); } }
Index: clang-tools-extra/test/clang-tidy/checkers/readability-make-member-function-const.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/readability-make-member-function-const.cpp +++ clang-tools-extra/test/clang-tidy/checkers/readability-make-member-function-const.cpp @@ -40,6 +40,12 @@ return ConstM; } + int read_fields_in_parentheses() { + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: method 'read_fields_in_parentheses' can be made const + // CHECK-FIXES: {{^}} int read_fields_in_parentheses() const { + return (this)->M + (((((Struct.M))))) + ((this->ConstM)); + } + void call_const_member() { // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: method 'call_const_member' can be made const // CHECK-FIXES: {{^}} void call_const_member() const { Index: clang-tools-extra/clang-tidy/readability/MakeMemberFunctionConstCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/readability/MakeMemberFunctionConstCheck.cpp +++ clang-tools-extra/clang-tidy/readability/MakeMemberFunctionConstCheck.cpp @@ -66,6 +66,15 @@ return Parents.begin()->get<T>(); } + const Stmt *getParentStmt(const Expr *E) { return getParent<Stmt>(E); } + + const Expr *getParentExpr(const Expr *E) { + const Expr *Parent = getParent<Expr>(E); + while (isa_and_nonnull<ParenExpr>(Parent)) + Parent = getParent<Expr>(Parent); + return Parent; + } + bool VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *) { // An UnresolvedMemberExpr might resolve to a non-const non-static // member function. @@ -103,7 +112,7 @@ if (!QT.isConstQualified()) return false; // Stop traversal. - const auto *Parent = getParent<Stmt>(Cast); + const auto *Parent = getParentStmt(Cast); if (!Parent) return false; // Stop traversal. @@ -140,7 +149,7 @@ return true; } - const auto *Parent = getParent<Expr>(Member); + const auto *Parent = getParentExpr(Member); if (const auto *Cast = dyn_cast_or_null<ImplicitCastExpr>(Parent)) { // A read access to a member is safe when the member either @@ -167,12 +176,12 @@ bool VisitCXXThisExpr(const CXXThisExpr *E) { Usage = Const; - const auto *Parent = getParent<Expr>(E); + const auto *Parent = getParentExpr(E); // Look through deref of this. if (const auto *UnOp = dyn_cast_or_null<UnaryOperator>(Parent)) { if (UnOp->getOpcode() == UO_Deref) { - Parent = getParent<Expr>(UnOp); + Parent = getParentExpr(UnOp); } }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits