yonghong-song updated this revision to Diff 417060. yonghong-song added a comment.
- fix typo - add a new test case with typedef of volatile type. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D121715/new/ https://reviews.llvm.org/D121715 Files: clang/lib/Sema/SemaExprCXX.cpp clang/test/Sema/warn-unused-but-set-variables.c Index: clang/test/Sema/warn-unused-but-set-variables.c =================================================================== --- clang/test/Sema/warn-unused-but-set-variables.c +++ clang/test/Sema/warn-unused-but-set-variables.c @@ -23,10 +23,24 @@ int a; w = (a = 0); + int j = 0; // expected-warning{{variable 'j' set but not used}} + for (int i = 0; i < 1000; i++) + j += 1; + // Following gcc, warn for a volatile variable. volatile int b; // expected-warning{{variable 'b' set but not used}} b = 0; + // volatile variable k is used, no warning. + volatile int k = 0; + for (int i = 0; i < 1000; i++) + k += 1; + + // typedef of volatile type, no warning. + typedef volatile int volint; + volint l = 0; + l += 1; + int x; x = 0; return x; Index: clang/lib/Sema/SemaExprCXX.cpp =================================================================== --- clang/lib/Sema/SemaExprCXX.cpp +++ clang/lib/Sema/SemaExprCXX.cpp @@ -7925,6 +7925,7 @@ static void MaybeDecrementCount( Expr *E, llvm::DenseMap<const VarDecl *, int> &RefsMinusAssignments) { DeclRefExpr *LHS = nullptr; + bool IsCompoundAssign = false; if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) { if (BO->getLHS()->getType()->isDependentType() || BO->getRHS()->getType()->isDependentType()) { @@ -7932,6 +7933,8 @@ return; } else if (!BO->isAssignmentOp()) return; + else + IsCompoundAssign = BO->isCompoundAssignmentOp(); LHS = dyn_cast<DeclRefExpr>(BO->getLHS()); } else if (CXXOperatorCallExpr *COCE = dyn_cast<CXXOperatorCallExpr>(E)) { if (COCE->getOperator() != OO_Equal) @@ -7943,6 +7946,10 @@ VarDecl *VD = dyn_cast<VarDecl>(LHS->getDecl()); if (!VD) return; + // Don't decrement RefsMinusAssignments if volatile variable with compound + // assignment (+=, ...) to avoid potential unused-but-set-variable warning. + if (IsCompoundAssign && VD->getType().isVolatileQualified()) + return; auto iter = RefsMinusAssignments.find(VD); if (iter == RefsMinusAssignments.end()) return;
Index: clang/test/Sema/warn-unused-but-set-variables.c =================================================================== --- clang/test/Sema/warn-unused-but-set-variables.c +++ clang/test/Sema/warn-unused-but-set-variables.c @@ -23,10 +23,24 @@ int a; w = (a = 0); + int j = 0; // expected-warning{{variable 'j' set but not used}} + for (int i = 0; i < 1000; i++) + j += 1; + // Following gcc, warn for a volatile variable. volatile int b; // expected-warning{{variable 'b' set but not used}} b = 0; + // volatile variable k is used, no warning. + volatile int k = 0; + for (int i = 0; i < 1000; i++) + k += 1; + + // typedef of volatile type, no warning. + typedef volatile int volint; + volint l = 0; + l += 1; + int x; x = 0; return x; Index: clang/lib/Sema/SemaExprCXX.cpp =================================================================== --- clang/lib/Sema/SemaExprCXX.cpp +++ clang/lib/Sema/SemaExprCXX.cpp @@ -7925,6 +7925,7 @@ static void MaybeDecrementCount( Expr *E, llvm::DenseMap<const VarDecl *, int> &RefsMinusAssignments) { DeclRefExpr *LHS = nullptr; + bool IsCompoundAssign = false; if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) { if (BO->getLHS()->getType()->isDependentType() || BO->getRHS()->getType()->isDependentType()) { @@ -7932,6 +7933,8 @@ return; } else if (!BO->isAssignmentOp()) return; + else + IsCompoundAssign = BO->isCompoundAssignmentOp(); LHS = dyn_cast<DeclRefExpr>(BO->getLHS()); } else if (CXXOperatorCallExpr *COCE = dyn_cast<CXXOperatorCallExpr>(E)) { if (COCE->getOperator() != OO_Equal) @@ -7943,6 +7946,10 @@ VarDecl *VD = dyn_cast<VarDecl>(LHS->getDecl()); if (!VD) return; + // Don't decrement RefsMinusAssignments if volatile variable with compound + // assignment (+=, ...) to avoid potential unused-but-set-variable warning. + if (IsCompoundAssign && VD->getType().isVolatileQualified()) + return; auto iter = RefsMinusAssignments.find(VD); if (iter == RefsMinusAssignments.end()) return;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits