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