[PATCH] D53488: [clang-tidy] Improving narrowing conversions

Aaron Ballman via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sat Nov 24 05:48:46 PST 2018


aaron.ballman added inline comments.


================
Comment at: clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp:31
+          Options.get("WarnOnFloatingPointNarrowingConversion", 1)),
+      WarnOnCastingLiterals(Options.get("WarnOnCastingLiterals", 1)) {}
+
----------------
I think the concept here is more broad than the option name suggests -- this is really a "pedantic mode" for this feature, because there is a notional narrowing but no semantic difference. I would name the option `PedanticMode` and have it off-by-default, personally.


================
Comment at: clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp:127
+    // symmetric and have the same number of positive and negative values.
+    // The range of valid integer for a floating point value is:
+    // [-2^PrecisionBits, 2^PrecisionBits]
----------------
integer -> integers


================
Comment at: clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp:242-244
+  // "The resulting value is the smallest unsigned value equal to the source
+  // value modulo 2^n where n is the number of bits used to represent the
+  // destination type."
----------------
You should cite where this quotation comes from (e.g., [foo.bar]p2)


================
Comment at: clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp:259-263
+void NarrowingConversionsCheck::handleIntegralToBoolean(
+    const ASTContext &Context, SourceLocation SourceLoc, const Expr &Lhs,
+    const Expr &Rhs) {
+  // Conversion from Integral to Bool value is well defined.
+}
----------------
Why is this function needed at all?


================
Comment at: clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp:311-315
+void NarrowingConversionsCheck::handleBooleanToSignedIntegral(
+    const ASTContext &Context, SourceLocation SourceLoc, const Expr &Lhs,
+    const Expr &Rhs) {
+  // Conversion from Bool to SignedIntegral value is well defined.
+}
----------------
Why is this function needed at all?


================
Comment at: clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp:325
+    if (Constant.isFloat()) {
+      // From http://eel.is/c++draft/dcl.init.list#7.2
+      // Floating point constant narrowing only takes place when the value is
----------------
[dcl.init.list]p7.2 instead of a hyperlink.


================
Comment at: clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp:372
+  if (const auto *CO = llvm::dyn_cast<ConditionalOperator>(&Rhs)) {
+    // We create variables so we make sure both sides of the
+    // ConditionalOperator are evaluated, the || operator would short ciruit
----------------
What variables are created here?


================
Comment at: clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp:373
+    // We create variables so we make sure both sides of the
+    // ConditionalOperator are evaluated, the || operator would short ciruit
+    // the second call otherwise.
----------------
short ciruit -> short-circuit


================
Comment at: docs/clang-tidy/checks/cppcoreguidelines-narrowing-conversions.rst:59
 
+You may have encountered messages like so "narrowing conversion from
+'unsigned int' to signed type 'int' is implementation-defined".
----------------
drop the "so"


================
Comment at: docs/clang-tidy/checks/cppcoreguidelines-narrowing-conversions.rst:61
+'unsigned int' to signed type 'int' is implementation-defined".
+The C/C++ standard do not mandate two’s complement for signed integers, as
+such the compiler is free to define what is the semantic for converting an
----------------
do not -> does not
as such -> and so


================
Comment at: docs/clang-tidy/checks/cppcoreguidelines-narrowing-conversions.rst:62
+The C/C++ standard do not mandate two’s complement for signed integers, as
+such the compiler is free to define what is the semantic for converting an
+unsigned integer to signed integer. Clang's implementation uses the two’s
----------------
what is the semantic -> what the semantics are


Repository:
  rCTE Clang Tools Extra

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D53488/new/

https://reviews.llvm.org/D53488





More information about the cfe-commits mailing list