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