]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c: Emit -Wzero-as-null-pointer-constant for all integral types [PR117687]
authorMartin Uecker <uecker@tugraz.at>
Sun, 21 Dec 2025 19:16:19 +0000 (20:16 +0100)
committerMartin Uecker <uecker@gcc.gnu.org>
Sat, 3 Jan 2026 10:36:19 +0000 (11:36 +0100)
Also warn for boolean, _BitInts, and enumeration constants when
warning for zero as a null pointer constant.

PR c/117687

gcc/c/ChangeLog:
* c-typeck.cc (parser_build_binary_op,build_conditional_expr,
convert_for_assignment): Adapt conditions.

gcc/testsuite/ChangeLog:
* gcc.dg/Wzero-as-null-pointer-constant-2.c: New test.

gcc/c/c-typeck.cc
gcc/testsuite/gcc.dg/Wzero-as-null-pointer-constant-2.c [new file with mode: 0644]

index a2237e8a2f0227ce8474c04c778f4345b71bbf52..dd2a948872b20fab6e21a7203ffc8733045e6fc6 100644 (file)
@@ -5174,14 +5174,14 @@ parser_build_binary_op (location_t location, enum tree_code code,
     {
       if ((TREE_CODE (type1) == POINTER_TYPE
           || TREE_CODE (type1) == NULLPTR_TYPE)
-         && TREE_CODE (type2) == INTEGER_TYPE
+         && INTEGRAL_TYPE_P (type2)
          && null_pointer_constant_p (arg2.value))
        warning_at (arg2.get_location(), OPT_Wzero_as_null_pointer_constant,
                    "zero as null pointer constant");
 
       if ((TREE_CODE (type2) == POINTER_TYPE
           || TREE_CODE (type2) == NULLPTR_TYPE)
-         && TREE_CODE (type1) == INTEGER_TYPE
+         && INTEGRAL_TYPE_P (type1)
          && null_pointer_constant_p (arg1.value))
        warning_at (arg1.get_location(), OPT_Wzero_as_null_pointer_constant,
                    "zero as null pointer constant");
@@ -6524,8 +6524,6 @@ build_conditional_expr (location_t colon_loc, tree ifexp, bool ifexp_bcp,
 {
   tree type1;
   tree type2;
-  enum tree_code code1;
-  enum tree_code code2;
   tree result_type = NULL;
   tree semantic_result_type = NULL;
   tree orig_op1 = op1, orig_op2 = op2;
@@ -6558,9 +6556,9 @@ build_conditional_expr (location_t colon_loc, tree ifexp, bool ifexp_bcp,
   tree bltin1 = NULL_TREE;
   tree bltin2 = NULL_TREE;
   type1 = type_or_builtin_type (op1, &bltin1);
-  code1 = TREE_CODE (type1);
+  const enum tree_code code1 = TREE_CODE (type1);
   type2 = type_or_builtin_type (op2, &bltin2);
-  code2 = TREE_CODE (type2);
+  const enum tree_code code2 = TREE_CODE (type2);
 
   if (code1 == POINTER_TYPE && reject_gcc_builtin (op1))
     return error_mark_node;
@@ -6615,12 +6613,12 @@ build_conditional_expr (location_t colon_loc, tree ifexp, bool ifexp_bcp,
       && c_inhibit_evaluation_warnings == 0)
     {
       if ((code1 == POINTER_TYPE || code1 == NULLPTR_TYPE)
-         && code2 == INTEGER_TYPE && null_pointer_constant_p (orig_op2))
+         && INTEGRAL_TYPE_P (type2) && null_pointer_constant_p (orig_op2))
        warning_at (op2_loc, OPT_Wzero_as_null_pointer_constant,
                    "zero as null pointer constant");
 
       if ((code2 == POINTER_TYPE || code2 == NULLPTR_TYPE)
-         && code1 == INTEGER_TYPE && null_pointer_constant_p (orig_op1))
+         && INTEGRAL_TYPE_P (type1) && null_pointer_constant_p (orig_op1))
        warning_at (op1_loc, OPT_Wzero_as_null_pointer_constant,
                    "zero as null pointer constant");
     }
@@ -9168,7 +9166,7 @@ convert_for_assignment (location_t location, location_t expr_loc, tree type,
               || coder == BITINT_TYPE))
     {
       if (null_pointer_constant && c_inhibit_evaluation_warnings == 0
-         && coder == INTEGER_TYPE)
+         && coder != NULLPTR_TYPE)
        warning_at (location, OPT_Wzero_as_null_pointer_constant,
                    "zero as null pointer constant");
       /* A NULLPTR type is just a nullptr always.  */
diff --git a/gcc/testsuite/gcc.dg/Wzero-as-null-pointer-constant-2.c b/gcc/testsuite/gcc.dg/Wzero-as-null-pointer-constant-2.c
new file mode 100644 (file)
index 0000000..9b3e1c1
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-std=c23 -Wzero-as-null-pointer-constant" } */
+
+void foo(void*);
+
+void bar()
+{
+       enum { E = 0 };
+       constexpr _BitInt(4) b0 = 0;
+       foo(false);                     /* { dg-warning "zero as null pointer constant" } */
+       foo(b0);                        /* { dg-warning "zero as null pointer constant" } */
+       foo(E);                         /* { dg-warning "zero as null pointer constant" } */
+
+       void *p = false;                /* { dg-warning "zero as null pointer constant" } */
+       void *r = b0;                   /* { dg-warning "zero as null pointer constant" } */
+       void *t = E;                    /* { dg-warning "zero as null pointer constant" } */
+
+       1 ? false : p;                  /* { dg-warning "zero as null pointer constant" } */
+       1 ? p : false;                  /* { dg-warning "zero as null pointer constant" } */
+       1 ? b0 : p;                     /* { dg-warning "zero as null pointer constant" } */
+       1 ? p : b0;                     /* { dg-warning "zero as null pointer constant" } */
+       1 ? E : p;                      /* { dg-warning "zero as null pointer constant" } */
+       1 ? p : E;                      /* { dg-warning "zero as null pointer constant" } */
+
+       if (p == false);                /* { dg-warning "zero as null pointer constant" } */
+       if (false == p);                /* { dg-warning "zero as null pointer constant" } */
+       if (p == b0);                   /* { dg-warning "zero as null pointer constant" } */
+       if (b0 == p);                   /* { dg-warning "zero as null pointer constant" } */
+       if (p == E);                    /* { dg-warning "zero as null pointer constant" } */
+       if (E == p);                    /* { dg-warning "zero as null pointer constant" } */
+}
+