On Tue, Mar 22, 2022 at 08:39:21PM +0000, Ed Catmur wrote:
> If two arrays do not have the exact same element type including 
> qualification, this could be e.g. f(int (&&)[]) vs. f(int const (&)[]), which 
> can still be distinguished by the lvalue-rvalue tiebreaker.
> 
> By tightening this branch (in accordance with the letter of the Standard) we 
> fall through to the next branch, which tests whether they have different 
> element type ignoring qualification and returns 0 in that case; thus we only 
> actually fall through in the T[...] vs. T cv[...] case, eventually 
> considering the lvalue-rvalue tiebreaker at the end of compare_ics.
> 
> Add test.
> 
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104996

Thanks, the patch looks reasonable.  Can you describe how it's been tested?

You're going to need a ChangeLog entry, something like

        * call.c (compare_ics): When comparing list-initialization sequences,
        do not return early.

and an entry for the test, which...

> ---
>  gcc/cp/call.cc                  | 7 ++-----
>  gcc/testsuite/g++.dg/pr104996.C | 5 +++++
>  2 files changed, 7 insertions(+), 5 deletions(-)
>  create mode 100644 gcc/testsuite/g++.dg/pr104996.C
> 
> diff --git a/gcc/cp/call.cc b/gcc/cp/call.cc
> index 23d3fc496b822..28589ab3459ea 100644
> --- a/gcc/cp/call.cc
> +++ b/gcc/cp/call.cc
> @@ -11535,12 +11535,9 @@ compare_ics (conversion *ics1, conversion *ics2)
>        P0388R4.)  */
>        else if (t1->kind == ck_aggr
>              && TREE_CODE (t1->type) == ARRAY_TYPE
> -            && TREE_CODE (t2->type) == ARRAY_TYPE)
> +            && TREE_CODE (t2->type) == ARRAY_TYPE
> +            && same_type_p (TREE_TYPE (t1->type), TREE_TYPE (t2->type)))
>       {
> -       /* The type of the array elements must be the same.  */
> -       if (!same_type_p (TREE_TYPE (t1->type), TREE_TYPE (t2->type)))
> -         return 0;
> -
>         tree n1 = nelts_initialized_by_list_init (t1);
>         tree n2 = nelts_initialized_by_list_init (t2);
>         if (tree_int_cst_lt (n1, n2))
> diff --git a/gcc/testsuite/g++.dg/pr104996.C b/gcc/testsuite/g++.dg/pr104996.C
> new file mode 100644
> index 0000000000000..2e7558c7b9c77
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/pr104996.C

...can you please rename the test to initlist129.C and put it into g++.dg/cpp0x?

> @@ -0,0 +1,5 @@

Also please add

// PR c++/104996

in the first line.

> +// { dg-do compile { target c++11 } }
> +
> +template<unsigned size> char f(int (&&)[size]);
> +template<unsigned size> int f(int const (&)[size]);
> +static_assert(sizeof(f({1, 2, 3})) == 1, "");
> 

Marek

Reply via email to