On 3/22/22 16:59, Marek Polacek via Gcc-patches wrote:
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.

Indeed. Note that contrib/gcc-git-customization.sh creates a 'git gcc-commit-mklog' alias that is useful for generating a ChangeLog skeleton.

Also, you don't seem to have a copyright assignment on file, so please add a DCO sign-off; see https://gcc.gnu.org/contribute.html#legal

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