rsmith accepted this revision.
rsmith added a comment.
This revision is now accepted and ready to land.

Thanks, this looks great.



================
Comment at: lib/Sema/SemaChecking.cpp:8940
+  } else if (!T->hasUnsignedIntegerRepresentation())
+    IsComparisonConstant = E->isIntegerConstantExpr(S.Context);
+
----------------
lebedev.ri wrote:
> rsmith wrote:
> > It seems suboptimal to evaluate both sides of the comparison and then 
> > evaluate the entire comparison again in this case. Presumably the point is 
> > to catch comparisons whose operands are not of integral type (eg, floating 
> > point), but we could get that benefit and also catch more integral cases by 
> > switching from `isIntegerConstantExpr` to the more appropriate 
> > `EvaluateAsRValue`.
> > 
> > I'm fine with a cleanup to avoid the repeated evaluation here being 
> > deferred to a later patch.
> If we look at this code closely, if `hasUnsignedIntegerRepresentation() == 
> false`, we always do `return AnalyzeImpConvsInComparison(S, E);`, regardless 
> of `E->isIntegerConstantExpr(S.Context)`.
> So if i move more stuff into `if (T->isIntegralType(S.Context))`, then ` 
> E->isIntegerConstantExpr(S.Context);` is simply gone.
> At least the current tests say so.
It looks like the old behavior was to suppress the 
`CheckTautologicalComparisonWithZero` diagnostics when:

* the comparison has a constant value, and
* the types being compared are not integral types, and
* the types being compared do not have an unsigned integer representation

However, `CheckTautologicalComparisonWithZero` only emits diagnostics for 
comparisons with integral types. So I think you're right that the old codepath 
that evaluated `E->isIntegerConstantExpr(S.Context)` was pointless.


================
Comment at: lib/Sema/SemaChecking.cpp:8924
 
-  // If this is a tautological comparison, suppress -Wsign-compare.
-  if (CheckTautologicalComparisonWithZero(S, E))
-    return AnalyzeImpConvsInComparison(S, E);
+    bool IsComparisonConstant = (IsRHSIntegralLiteral && IsLHSIntegralLiteral);
+    // We don't care about expressions whose result is a constant.
----------------
I don't think this variable pulls its weight any more, especially given the 
adjacent comment. Inline its initializer into the `if` condition, maybe?


================
Comment at: lib/Sema/SemaChecking.cpp:8930
+    // We only care about expressions where just one side is literal
+    if (IsRHSIntegralLiteral ^ IsLHSIntegralLiteral) {
+      // Is the constant on the RHS or LHS?
----------------
It would probably be more obvious to use `||` here, since you already returned 
in the case where both sides are constant.


Repository:
  rL LLVM

https://reviews.llvm.org/D38101



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to