sberg created this revision. sberg added a reviewer: mbenfield. sberg added a project: clang. sberg requested review of this revision.
At least LibreOffice has, for mainly historic reasons that would be hard to change now, a class `Any` with an overloaded `operator >>=` that semantically does not assign to the LHS but rather extracts into the (by-reference) RHS. Which thus caused false positive `-Wunused-but-set-parameter` and `-Wunused-but-set-variable` after those have been introduced recently. This change is more conservative about the assumed semantics of overloaded operators, excluding compound assignment operators but keeping plain `operator =` ones. At least for LibreOffice, that strikes a good balance of not producing false positives but still finding lots of true ones. https://reviews.llvm.org/D103949 Files: clang/lib/Sema/SemaExprCXX.cpp clang/test/SemaCXX/warn-unused-but-set-variables-cpp.cpp Index: clang/test/SemaCXX/warn-unused-but-set-variables-cpp.cpp =================================================================== --- clang/test/SemaCXX/warn-unused-but-set-variables-cpp.cpp +++ clang/test/SemaCXX/warn-unused-but-set-variables-cpp.cpp @@ -6,6 +6,7 @@ struct __attribute__((warn_unused)) SWarnUnused { int j; + void operator +=(int); }; int f0() { @@ -48,3 +49,16 @@ char a[x]; char b[y]; } + +void f3(int n) { + // Don't warn for overloaded compound assignment operators. + SWarnUnused swu; + swu += n; +} + +template<typename T> void f4(T n) { + // Don't warn for (potentially) overloaded compound assignment operators in + // template code. + SWarnUnused swu; + swu += n; +} Index: clang/lib/Sema/SemaExprCXX.cpp =================================================================== --- clang/lib/Sema/SemaExprCXX.cpp +++ clang/lib/Sema/SemaExprCXX.cpp @@ -7791,11 +7791,16 @@ Expr *E, llvm::DenseMap<const VarDecl *, int> &RefsMinusAssignments) { DeclRefExpr *LHS = nullptr; if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) { - if (!BO->isAssignmentOp()) + if (BO->getLHS()->getType()->isDependentType() || + BO->getRHS()->getType()->isDependentType()) + { + if (BO->getOpcode() != BO_Assign) + return; + } else if (!BO->isAssignmentOp()) return; LHS = dyn_cast<DeclRefExpr>(BO->getLHS()); } else if (CXXOperatorCallExpr *COCE = dyn_cast<CXXOperatorCallExpr>(E)) { - if (!COCE->isAssignmentOp()) + if (COCE->getOperator() != OO_Equal) return; LHS = dyn_cast<DeclRefExpr>(COCE->getArg(0)); }
Index: clang/test/SemaCXX/warn-unused-but-set-variables-cpp.cpp =================================================================== --- clang/test/SemaCXX/warn-unused-but-set-variables-cpp.cpp +++ clang/test/SemaCXX/warn-unused-but-set-variables-cpp.cpp @@ -6,6 +6,7 @@ struct __attribute__((warn_unused)) SWarnUnused { int j; + void operator +=(int); }; int f0() { @@ -48,3 +49,16 @@ char a[x]; char b[y]; } + +void f3(int n) { + // Don't warn for overloaded compound assignment operators. + SWarnUnused swu; + swu += n; +} + +template<typename T> void f4(T n) { + // Don't warn for (potentially) overloaded compound assignment operators in + // template code. + SWarnUnused swu; + swu += n; +} Index: clang/lib/Sema/SemaExprCXX.cpp =================================================================== --- clang/lib/Sema/SemaExprCXX.cpp +++ clang/lib/Sema/SemaExprCXX.cpp @@ -7791,11 +7791,16 @@ Expr *E, llvm::DenseMap<const VarDecl *, int> &RefsMinusAssignments) { DeclRefExpr *LHS = nullptr; if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) { - if (!BO->isAssignmentOp()) + if (BO->getLHS()->getType()->isDependentType() || + BO->getRHS()->getType()->isDependentType()) + { + if (BO->getOpcode() != BO_Assign) + return; + } else if (!BO->isAssignmentOp()) return; LHS = dyn_cast<DeclRefExpr>(BO->getLHS()); } else if (CXXOperatorCallExpr *COCE = dyn_cast<CXXOperatorCallExpr>(E)) { - if (!COCE->isAssignmentOp()) + if (COCE->getOperator() != OO_Equal) return; LHS = dyn_cast<DeclRefExpr>(COCE->getArg(0)); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits