[clang] [Clang][Sema]: Diagnose lambda to bool implicit casts (PR #83152)

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Tue Feb 27 11:15:11 PST 2024


================
@@ -16538,6 +16538,27 @@ void Sema::DiagnoseAlwaysNonNullPointer(Expr *E,
     }
   }
 
+  // Complain if we are converting a lambda expression to a boolean value
+  if (auto *MCallExpr = dyn_cast<CXXMemberCallExpr>(E)) {
+    if (MCallExpr->getObjectType()->isRecordType()) {
+      if (auto *MRecordDecl = MCallExpr->getRecordDecl()) {
+        if (MRecordDecl->isLambda()) {
+          std::string Str;
+          llvm::raw_string_ostream S(Str);
+          const unsigned DiagID = diag::warn_impcast_pointer_to_bool;
+          // For lambdas, the pointer type is function, which corresponds to 1.
+          const unsigned FunctionPointerType = 1;
+          // Pretty print the diagnostic for the warning
+          E->printPretty(S, nullptr, getPrintingPolicy());
+          Diag(E->getExprLoc(), DiagID)
+              << FunctionPointerType << S.str() << E->getSourceRange() << Range
+              << IsEqual;
+          return;
----------------
AaronBallman wrote:

```suggestion
          Diag(E->getExprLoc(), diag::warn_impcast_pointer_to_bool)
              << /*FunctionPointerType*/ 1 << S.str() << E->getSourceRange() << Range
              << IsEqual;
           return;
```
Two changes happening here: 1) moves some constant variables inline, 2) removes the call to `printPretty()`.

(2) is because we expect diagnostic output to all be piped through the diagnostics engine, so that we can do things like format it differently (e.g., perhaps print it as SARIF rather than text)

https://github.com/llvm/llvm-project/pull/83152


More information about the cfe-commits mailing list