================
@@ -20584,6 +20584,61 @@ bool Sema::IsValueInFlagEnum(const EnumDecl *ED, const
llvm::APInt &Val,
return !(FlagMask & Val) || (AllowMask && !(FlagMask & ~Val));
}
+// Emits a warning when a suspicious comparison operator is used along side
+// binary operators in enum initializers.
+static void CheckForComparisonInEnumInitializer(SemaBase &Sema,
+ const EnumDecl *Enum) {
+ bool HasBitwiseOp = false;
+ SmallVector<const BinaryOperator *, 4> SuspiciousCompares;
+
+ // Iterate over all the enum values, gather suspisious comparison ops and
+ // whether any enum initialisers contain a binary operator.
+ for (const auto *ECD : Enum->enumerators()) {
+ const Expr *InitExpr = ECD->getInitExpr();
+ if (!InitExpr)
+ continue;
+
+ const Expr *E = InitExpr->IgnoreParenImpCasts();
+
+ if (const auto *BinOp = dyn_cast<BinaryOperator>(E)) {
+ BinaryOperatorKind Op = BinOp->getOpcode();
+
+ // Check for bitwise ops (<<, >>, &, |)
+ if (Op == BO_Shl || Op == BO_Shr || Op == BO_And || Op == BO_Or) {
+ HasBitwiseOp = true;
+ }
+ // Check for the typo pattern (Comparison < or >)
+ else if (Op == BO_LT || Op == BO_GT) {
+ const Expr *LHS = BinOp->getLHS()->IgnoreParenImpCasts();
+ if (const auto *IntLiteral = dyn_cast<IntegerLiteral>(LHS)) {
+ // Specifically looking for accidental bitshifts "1 < X" or "1 > X"
+ if (IntLiteral->getValue() == 1) {
+ SuspiciousCompares.push_back(BinOp);
+ }
+ }
+ }
+ }
+ }
+
+ // If we found a bitwise op and some sus compares, iterate over the compares
+ // and warn.
+ if (HasBitwiseOp && !SuspiciousCompares.empty()) {
+ for (const auto *BinOp : SuspiciousCompares) {
+ auto suggestedOp = (BinOp->getOpcode() == BO_LT)
----------------
AaronBallman wrote:
```suggestion
BinaryOperatorKind SuggestedOp = (BinOp->getOpcode() == BO_LT)
```
https://github.com/llvm/llvm-project/pull/168445
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits