aboutsummaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2026-03-09 10:24:39 +0100
committerlemon <lsof@mailbox.org>2026-03-09 10:24:39 +0100
commit1529b5221389c75371d0f3f181957a77a158a53c (patch)
tree89f2c9893c38fc74a4ed08c11c7d20c894bcf7b5 /test
parent9f1e1fa5d89b0cd1ae5bef585eadd97870994344 (diff)
c: relax constexpr constraints, fix alignof
- Allow short-circuiting of constant logical expressions where the unevaluated operand is not a constant expression (`1 || 0/0`) - Allow constant integer expressions that evaluate to zero to be used as null pointer constants (GNU extension). + According to the standard, `int *x = 5*0;` should be rejected. But compilers evaluate `5*0 -> 0` and allow it as if a null pointer literal.
Diffstat (limited to 'test')
-rw-r--r--test/17-misc.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/test/17-misc.c b/test/17-misc.c
index ecff06c..521b948 100644
--- a/test/17-misc.c
+++ b/test/17-misc.c
@@ -13,6 +13,19 @@ int fn1(uvlong p_9) {
return q;
}
+/* Excerpt from linux/kernel.h */
+/*
+ * This returns a constant expression while determining if an argument is
+ * a constant expression, most importantly without evaluating the argument.
+ * Glory to Martin Uecker <Martin.Uecker@med.uni-goettingen.de>
+ */
+#define __is_constexpr(x) \
+ (sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8)))
+
+_Static_assert(__is_constexpr(5 &&(1<<3) || 0/0), "");
+_Static_assert(!__is_constexpr(5/0), "");
+_Static_assert(!__is_constexpr(fn1(0)), "");
+
extern int printf(const char *, ...);
int main() {
printf("%d\n", fn1(-77ull));