[clang] a18e92d - [clang] Fix unexpected `-Wconstant-logical-operand` in C23 (#80724)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 6 04:57:40 PST 2024
Author: Mariya Podchishchaeva
Date: 2024-02-06T13:57:35+01:00
New Revision: a18e92d020b895b712175a3b13a3d021608115a7
URL: https://github.com/llvm/llvm-project/commit/a18e92d020b895b712175a3b13a3d021608115a7
DIFF: https://github.com/llvm/llvm-project/commit/a18e92d020b895b712175a3b13a3d021608115a7.diff
LOG: [clang] Fix unexpected `-Wconstant-logical-operand` in C23 (#80724)
C23 has `bool`, but logical operators still return int. Check that
we're not in C to avoid false-positive -Wconstant-logical-operand.
Fixes https://github.com/llvm/llvm-project/issues/64356
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaExpr.cpp
clang/test/Sema/warn-int-in-bool-context.c
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 4d57ea4fd55b8..802c44b6c8608 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -164,6 +164,10 @@ Bug Fixes in This Version
- Clang now accepts qualified partial/explicit specializations of variable templates that
are not nominable in the lookup context of the specialization.
+- Clang now doesn't produce false-positive warning `-Wconstant-logical-operand`
+ for logical operators in C23.
+ Fixes (`#64356 <https://github.com/llvm/llvm-project/issues/64356>`_).
+
Bug Fixes to Compiler Builtins
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index d15278bce5a6b..4049ab3bf6caf 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -14073,7 +14073,7 @@ inline QualType Sema::CheckLogicalOperands(ExprResult &LHS, ExprResult &RHS,
Expr::EvalResult EVResult;
if (RHS.get()->EvaluateAsInt(EVResult, Context)) {
llvm::APSInt Result = EVResult.Val.getInt();
- if ((getLangOpts().Bool && !RHS.get()->getType()->isBooleanType() &&
+ if ((getLangOpts().CPlusPlus && !RHS.get()->getType()->isBooleanType() &&
!RHS.get()->getExprLoc().isMacroID()) ||
(Result != 0 && Result != 1)) {
Diag(Loc, diag::warn_logical_instead_of_bitwise)
diff --git a/clang/test/Sema/warn-int-in-bool-context.c b/clang/test/Sema/warn-int-in-bool-context.c
index a6890161b5af8..c111a5af23f57 100644
--- a/clang/test/Sema/warn-int-in-bool-context.c
+++ b/clang/test/Sema/warn-int-in-bool-context.c
@@ -79,3 +79,14 @@ int test(int a, unsigned b, enum num n) {
// Don't warn in macros.
return SHIFT(1, a);
}
+
+int GH64356(int arg) {
+ if ((arg == 1) && (1 == 1)) return 1;
+ return 0;
+
+ if ((64 > 32) && (32 < 64))
+ return 2;
+
+ if ((1 == 1) && (arg == 1)) return 1;
+ return 0;
+}
More information about the cfe-commits
mailing list