public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-8208] c++: Fall through for arrays of T vs T cv [PR104996]
@ 2022-04-20 14:15 Jason Merrill
  0 siblings, 0 replies; only message in thread
From: Jason Merrill @ 2022-04-20 14:15 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:5bde80f48bcc594658c788895ad1fd86d0916fc2

commit r12-8208-g5bde80f48bcc594658c788895ad1fd86d0916fc2
Author: Ed Catmur <ed@catmur.uk>
Date:   Mon Apr 18 23:09:04 2022 +0100

    c++: Fall through for arrays of T vs T cv [PR104996]
    
    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.
    
    Signed-off-by: Ed Catmur <ed@catmur.uk>
    
            PR c++/104996
    
    gcc/cp/ChangeLog:
    
            * call.cc (compare_ics): When comparing list-initialization
            sequences, do not return early.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/cpp0x/initlist129.C: New test.

Diff:
---
 gcc/cp/call.cc                           | 7 ++-----
 gcc/testsuite/g++.dg/cpp0x/initlist129.C | 6 ++++++
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/gcc/cp/call.cc b/gcc/cp/call.cc
index 51d8f6c3fb1..fa18d7f8f9d 100644
--- a/gcc/cp/call.cc
+++ b/gcc/cp/call.cc
@@ -11546,12 +11546,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/cpp0x/initlist129.C b/gcc/testsuite/g++.dg/cpp0x/initlist129.C
new file mode 100644
index 00000000000..4d4faa9e08d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/initlist129.C
@@ -0,0 +1,6 @@
+// PR c++/104996
+// { 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, "");


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-04-20 14:15 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-20 14:15 [gcc r12-8208] c++: Fall through for arrays of T vs T cv [PR104996] Jason Merrill

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).