On Mon, Nov 22, 2021 at 04:00:56PM -0700, Martin Sebor via Gcc-patches wrote:
> While going through old -Waddress bug reports to close after
> the recent improvements to the warning I came across PR 96507
> that points out that member references aren't handled.  Since
> testing the address of a reference for equality to null is
> in general diagnosed, this seems like an oversight worth fixing.
>  Attached is a change to the C++ front end to diagnose member
> references as well.
> 
> Tested on x86_64-linux.
> 
> Martin

> Issue -Waddress also for reference members [PR96507].
> 
> Resolves:
> PR c++/96507 - missing -Waddress for member references
> 
> gcc/cp/ChangeLog:
> 
>       PR c++/96507
>       * typeck.c (warn_for_null_address): Handle reference members.
> 
> gcc/testsuite/ChangeLog:
> 
>       PR c++/96507
>       * g++.dg/warn/Waddress-8.C: New test.
> 
> diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
> index 58919aaf13e..694c53eef8a 100644
> --- a/gcc/cp/typeck.c
> +++ b/gcc/cp/typeck.c
> @@ -4676,15 +4676,21 @@ warn_for_null_address (location_t location, tree op, 
> tsubst_flags_t complain)
>                   "addition %qE and NULL", cop);
>        return;
>      }
> -  else if (CONVERT_EXPR_P (op)
> -      && TYPE_REF_P (TREE_TYPE (TREE_OPERAND (op, 0))))
> +  else if (CONVERT_EXPR_P (op))
>      {
> -      STRIP_NOPS (op);
> +      tree op0 = TREE_OPERAND (op, 0);
> +      if (TYPE_REF_P (TREE_TYPE (op0)))
> +     {

Isn't this just REFERENCE_REF_P?

> +       STRIP_NOPS (op);
> +
> +       if (TREE_CODE (op) == COMPONENT_REF)
> +         op = TREE_OPERAND (op, 1);
>  
> -      if (DECL_P (op))
> -     warned = warning_at (location, OPT_Waddress,
> -                          "the compiler can assume that the address of "
> -                          "%qD will never be NULL", op);
> +       if (DECL_P (op))
> +         warned = warning_at (location, OPT_Waddress,
> +                              "the compiler can assume that the address of "
> +                              "%qD will never be NULL", op);
> +     }
>      }
>  
>    if (warned && DECL_P (op))
> diff --git a/gcc/testsuite/g++.dg/warn/Waddress-8.C 
> b/gcc/testsuite/g++.dg/warn/Waddress-8.C
> new file mode 100644
> index 00000000000..797102d6be4
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/warn/Waddress-8.C
> @@ -0,0 +1,85 @@
> +/* PR c++/96507 - missing -Waddress for member references
> +   { dg-do compile }
> +   { dg-options "-Wall" } */
> +
> +typedef void F ();
> +
> +extern F 𝔢
> +extern int &eir;
> +
> +bool warn_ext_rfun ()
> +{
> +  return &efr != 0;           // { dg-warning "-Waddress" }
> +}
> +
> +bool warn_ext_rvar ()
> +{
> +  return &eir != 0;           // { dg-warning "-Waddress" }
> +}
> +
> +
> +bool warn_parm_rfun (F &rf)
> +{
> +  return &rf != 0;            // { dg-warning "-Waddress" }
> +}
> +
> +bool warn_parm_rvar (int &ir)
> +{
> +  return &ir != 0;            // { dg-warning "-Waddress" }
> +}
> +
> +// Comparing the address of a reference argument to null also triggers
> +// a -Wnonnull-compare (that seems like a bug, hence PR 103363).
> +// { dg-prune-output "-Wnonnull-compare" }
> +
> +
> +struct S
> +{
> +  F &fr;
> +  int &ir;
> +};
> +
> +extern S es, esa[];
> +
> +bool warn_ext_mem_rfun ()
> +{
> +  return &es.fr != 0;         // { dg-warning "-Waddress" }
> +}
> +
> +bool warn_ext_mem_rvar ()
> +{
> +  return &es.ir != 0;         // { dg-warning "-Waddress" }
> +}
> +
> +
> +bool warn_ext_arr_mem_rfun (int i)
> +{
> +  return &esa[i].fr != 0;     // { dg-warning "-Waddress" }
> +}
> +
> +bool warn_ext_arr_mem_rvar (int i)
> +{
> +  return &esa[i].ir != 0;     // { dg-warning "-Waddress" }
> +}
> +
> +
> +bool warn_parm_mem_rfun (S &s)
> +{
> +  return &s.fr != 0;          // { dg-warning "-Waddress" }
> +}
> +
> +bool warn_parm_mem_rvar (S &s)
> +{
> +  return &s.ir != 0;          // { dg-warning "-Waddress" }
> +}
> +
> +
> +bool warn_parm_arr_mem_rfun (S sa[], int i)
> +{
> +  return &sa[i].fr != 0;      // { dg-warning "-Waddress" }
> +}
> +
> +bool warn_parm_arr_mem_rvar (S sa[], int i)
> +{
> +  return &sa[i].ir != 0;      // { dg-warning "-Waddress" }
> +}


Marek

Reply via email to