[clang] [clang] Print static_assert values of arithmetic binary operators (PR #71671)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Wed Nov 8 04:34:34 PST 2023
https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/71671
These are actually quite useful to print.
>From 2b257a11a78db4769af6751dbc9bd2f37a2b4c71 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Wed, 8 Nov 2023 13:32:41 +0100
Subject: [PATCH] [clang] Print static_assert values of arithmetic binary
operators
These are actually quite useful to print.
---
clang/lib/Sema/SemaDeclCXX.cpp | 8 ++++----
clang/test/SemaCXX/complex-folding.cpp | 27 +++++++++++++++++---------
clang/test/SemaCXX/static-assert.cpp | 10 ++++++++++
3 files changed, 32 insertions(+), 13 deletions(-)
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 60786a880b9d3fd..b326d87a72c2815 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -17219,10 +17219,10 @@ static bool UsefulToPrintExpr(const Expr *E) {
if (const auto *UnaryOp = dyn_cast<UnaryOperator>(E))
return UsefulToPrintExpr(UnaryOp->getSubExpr());
- // Ignore nested binary operators. This could be a FIXME for improvements
- // to the diagnostics in the future.
- if (isa<BinaryOperator>(E))
- return false;
+ // Only print nested arithmetic operators.
+ if (const auto *BO = dyn_cast<BinaryOperator>(E))
+ return (BO->isShiftOp() || BO->isAdditiveOp() || BO->isMultiplicativeOp() ||
+ BO->isBitwiseOp());
return true;
}
diff --git a/clang/test/SemaCXX/complex-folding.cpp b/clang/test/SemaCXX/complex-folding.cpp
index 8c56cf0e5d984b0..054f159e9ce0dd2 100644
--- a/clang/test/SemaCXX/complex-folding.cpp
+++ b/clang/test/SemaCXX/complex-folding.cpp
@@ -3,7 +3,8 @@
// Test the constant folding of builtin complex numbers.
static_assert((0.0 + 0.0j) == (0.0 + 0.0j));
-static_assert((0.0 + 0.0j) != (0.0 + 0.0j)); // expected-error {{static assertion}}
+static_assert((0.0 + 0.0j) != (0.0 + 0.0j)); // expected-error {{static assertion}} \
+ // expected-note {{evaluates to}}
static_assert((0.0 + 0.0j) == 0.0);
static_assert(0.0 == (0.0 + 0.0j));
@@ -14,21 +15,29 @@ static_assert(0.0 != 1.0j);
// Walk around the complex plane stepping between angular differences and
// equality.
-static_assert((1.0 + 0.0j) == (0.0 + 0.0j)); // expected-error {{static assertion}}
+static_assert((1.0 + 0.0j) == (0.0 + 0.0j)); // expected-error {{static assertion}} \
+ // expected-note {{evaluates to}}
static_assert((1.0 + 0.0j) == (1.0 + 0.0j));
-static_assert((1.0 + 1.0j) == (1.0 + 0.0j)); // expected-error {{static assertion}}
+static_assert((1.0 + 1.0j) == (1.0 + 0.0j)); // expected-error {{static assertion}} \
+ // expected-note {{evaluates to}}
static_assert((1.0 + 1.0j) == (1.0 + 1.0j));
-static_assert((0.0 + 1.0j) == (1.0 + 1.0j)); // expected-error {{static assertion}}
+static_assert((0.0 + 1.0j) == (1.0 + 1.0j)); // expected-error {{static assertion}} \
+ // expected-note {{evaluates to}}
static_assert((0.0 + 1.0j) == (0.0 + 1.0j));
-static_assert((-1.0 + 1.0j) == (0.0 + 1.0j)); // expected-error {{static assertion}}
+static_assert((-1.0 + 1.0j) == (0.0 + 1.0j)); // expected-error {{static assertion}} \
+ // expected-note {{evaluates to}}
static_assert((-1.0 + 1.0j) == (-1.0 + 1.0j));
-static_assert((-1.0 + 0.0j) == (-1.0 + 1.0j)); // expected-error {{static assertion}}
+static_assert((-1.0 + 0.0j) == (-1.0 + 1.0j)); // expected-error {{static assertion}} \
+ // expected-note {{evaluates to}}
static_assert((-1.0 + 0.0j) == (-1.0 + 0.0j));
-static_assert((-1.0 - 1.0j) == (-1.0 + 0.0j)); // expected-error {{static assertion}}
+static_assert((-1.0 - 1.0j) == (-1.0 + 0.0j)); // expected-error {{static assertion}} \
+ // expected-note {{evaluates to}}
static_assert((-1.0 - 1.0j) == (-1.0 - 1.0j));
-static_assert((0.0 - 1.0j) == (-1.0 - 1.0j)); // expected-error {{static assertion}}
+static_assert((0.0 - 1.0j) == (-1.0 - 1.0j)); // expected-error {{static assertion}} \
+ // expected-note {{evaluates to}}
static_assert((0.0 - 1.0j) == (0.0 - 1.0j));
-static_assert((1.0 - 1.0j) == (0.0 - 1.0j)); // expected-error {{static assertion}}
+static_assert((1.0 - 1.0j) == (0.0 - 1.0j)); // expected-error {{static assertion}} \
+ // expected-note {{evaluates to}}
static_assert((1.0 - 1.0j) == (1.0 - 1.0j));
// Test basic mathematical folding of both complex and real operands.
diff --git a/clang/test/SemaCXX/static-assert.cpp b/clang/test/SemaCXX/static-assert.cpp
index 4200d821339edeb..6e1701602ae30cf 100644
--- a/clang/test/SemaCXX/static-assert.cpp
+++ b/clang/test/SemaCXX/static-assert.cpp
@@ -351,4 +351,14 @@ namespace Diagnostics {
""
);
+ static_assert(1 + 1 != 2, ""); // expected-error {{failed}} \
+ // expected-note {{evaluates to '2 != 2'}}
+ static_assert(1 - 1 == 2, ""); // expected-error {{failed}} \
+ // expected-note {{evaluates to '0 == 2'}}
+ static_assert(1 * 1 == 2, ""); // expected-error {{failed}} \
+ // expected-note {{evaluates to '1 == 2'}}
+ static_assert(1 / 1 == 2, ""); // expected-error {{failed}} \
+ // expected-note {{evaluates to '1 == 2'}}
+ static_assert(1 << 3 != 8, ""); // expected-error {{failed}} \
+ // expected-note {{evaluates to '8 != 8'}}
}
More information about the cfe-commits
mailing list