https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65168

--- Comment #3 from Manuel López-Ibáñez <manu at gcc dot gnu.org> ---
I got confused by Clang's message. The problem is not the pointer or NULL. The
problem is converting the address of a reference to bool:


int fii(int *p) {
  int &r=*p;
  return !&r;
}

This is trivial to implement in GCC:

manuel@gcc14:~$ ~/test1/221557M/build/gcc/cc1plus -Waddress ~/pr65168.cc
/home/manuel/pr65168.cc:3:12: warning: address of reference ‘r’ may be assumed
to always convert to true because in C++ a reference cannot be bound to
dereferenced null pointer [-Waddress]
   return !&r;
            ^

Does this patch work in your real-world code?

Index: c-common.c
===================================================================
--- c-common.c  (revision 221557)
+++ c-common.c  (working copy)
@@ -4776,11 +4776,18 @@ c_common_truthvalue_conversion (location
        }

     CASE_CONVERT:
       {
        tree totype = TREE_TYPE (expr);
-       tree fromtype = TREE_TYPE (TREE_OPERAND (expr, 0));
+       tree op0 = TREE_OPERAND (expr, 0);
+       tree fromtype = TREE_TYPE (op0);
+
+       if (TREE_CODE (fromtype) == REFERENCE_TYPE
+           && POINTER_TYPE_P (totype) && DECL_P (op0))
+         warning_at (location, OPT_Waddress,
+                     "address of reference %qD may be assumed to always
convert to true"
+                     " because in C++ a reference cannot be bound to
dereferenced null pointer", op0);

        /* Don't cancel the effect of a CONVERT_EXPR from a REFERENCE_TYPE,
           since that affects how `default_conversion' will behave.  */
        if (TREE_CODE (totype) == REFERENCE_TYPE
            || TREE_CODE (fromtype) == REFERENCE_TYPE)

Reply via email to