hwright added inline comments.

================
Comment at: clang-tidy/abseil/DurationFactoryScaleCheck.cpp:57-58
+// One and only one of `IntLit` and `FloatLit` should be provided.
+static double GetValue(const IntegerLiteral *IntLit,
+                       const FloatingLiteral *FloatLit) {
+  if (IntLit) {
----------------
aaron.ballman wrote:
> hwright wrote:
> > aaron.ballman wrote:
> > > I really don't like this interface where you pass two arguments, only one 
> > > of which is ever valid. That is pretty confusing. Given that the result 
> > > of this function is only ever passed to `GetNewMultScale()`, and that 
> > > function only does integral checks, I'd prefer logic more like:
> > > 
> > > * If the literal is integral, get its value and call `GetNewMultScale()`.
> > > * If the literal is float, convert it to an integral and call 
> > > `GetNewMultScale()` only if the conversion is exact (this can be done via 
> > > `APFloat::convertToInteger()`).
> > > * `GetNewMultScale()` can now accept an integer value and removes the 
> > > questions about inexact equality tests from the function.
> > > 
> > > With that logic, I don't see a need for `GetValue()` at all, but if a 
> > > helper function is useful, I'd probably guess this is a better signature: 
> > > `int64_t getIntegralValue(const Expr *Literal, bool &ResultIsExact);`
> > >  Given that the result of this function is only ever passed to 
> > > `GetNewMultScale()`, and that function only does integral checks, I'd 
> > > prefer logic more like:
> > 
> > That's actually not true: `GetNewMultScale()` does checks against values 
> > like `1e-3` which aren't integers.  Does this change your suggestion?
> Hmm, yeah, I suppose it has to! :-D
I've reworked the bulk of this logic. It still uses doubles, but that doesn't 
trouble our test cases.  Please let me know if there's more to do here.


================
Comment at: clang-tidy/abseil/DurationFactoryScaleCheck.cpp:63
+  assert(FloatLit != nullptr && "Neither IntLit nor FloatLit set");
+  return FloatLit->getValueAsApproximateDouble();
+}
----------------
aaron.ballman wrote:
> hwright wrote:
> > aaron.ballman wrote:
> > > I believe the approximate results here can lead to bugs where the 
> > > floating-point literal is subnormal -- it may return 0.0 for literals 
> > > that are not zero.
> > Do you have an example which I could put in a test?
> `0x0.000001p-126f` should get you a new, exciting way to spell `0`.
I've added this as a test, and it resolves as normal.  Was your comment 
intended to indicate that it //should//, or that doing so would be a bug?


================
Comment at: clang-tidy/abseil/DurationFactoryScaleCheck.cpp:81-84
+    if (Multiplier == 60.0)
+      return DurationScale::Minutes;
+    if (Multiplier == 1e-3)
+      return DurationScale::Milliseconds;
----------------
aaron.ballman wrote:
> hwright wrote:
> > aaron.ballman wrote:
> > > What about scaling with a multiplier of 3600 to go from seconds to hours, 
> > > and other plausible conversions?
> > That's a good point, and part of a broader design discussion: should we 
> > support all multipliers?  (e.g., what about multiplying microseconds by 
> > `1.0/86400000000.0`?)
> > 
> > If we do think it's worth handling all of these cases, we probably want a 
> > different construct than the equivalent of a lookup table to do this 
> > computation.
> > That's a good point, and part of a broader design discussion: should we 
> > support all multipliers?
> 
> That's kind of what I'm leaning towards. It's certainly more explainable to 
> users that all the various scaling operations just work, rather than some 
> particular set.
> 
> However, maybe you know more about the user base than I do and there's a 
> sound reason to not handle all cases?
> 
> > If we do think it's worth handling all of these cases, we probably want a 
> > different construct than the equivalent of a lookup table to do this 
> > computation.
> 
> There's a part of me that wonders if we can use `std::ratio` to describe the 
> scaling operations, but I freely admit I've not thought about implementation 
> strategies all that hard.
`std::ratio` didn't look like it made much sense here (though I don't have much 
first-hand experience using it), but we do now handle multiple scaling steps.


https://reviews.llvm.org/D54246



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

Reply via email to