On 3/24/22 17:06, Jason Merrill wrote:
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
Hi Ed, we're getting close to the GCC release and I would like to
include this patch, just need the above adjustments.
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