[Bug c++/69531] Implement CWG 1307; Differently bounded array parameters

2016-04-29 Thread msebor at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69531

Martin Sebor  changed:

   What|Removed |Added

 Status|UNCONFIRMED |NEW
   Last reconfirmed||2016-04-29
 CC||msebor at gcc dot gnu.org
 Ever confirmed|0   |1
  Known to fail||5.3.0, 6.0

--- Comment #1 from Martin Sebor  ---
The example in the core issue compiles fine with both 6.0 and 5.3 (see below)
but the provided test case does not.  Based on my reading of the relevant
paragraphs of the current working paper (N4567) I agree the test case is valid
and the call should resolve to the first overload of f (i.e., int
f(int(&&)[1])).

$ cat x.cpp && g++ -S -Wall -Wextra -Wpedantic -std=c++14 -xc++ x.cpp
void f (int const(&)[1]);
void f (int const(&)[2]);

int main ()
{
  f ({1});
}
x.cpp: In function ‘int main()’:
x.cpp:6:9: error: call of overloaded ‘f()’ is
ambiguous
   f ({1});
 ^
x.cpp:1:6: note: candidate: void f(const int (&)[1])
 void f (int const(&)[1]);
  ^
x.cpp:2:6: note: candidate: void f(const int (&)[2])
 void f (int const(&)[2]);
  ^

Test case from core issue 1307:
$ cat x.cpp && ~/bin/gcc-5.1.0/bin/g++ -S -Wall -Wextra -Wpedantic -std=c++14
-xc++ x.cpp
void f (int const(&)[2]);
void f (int const(&)[3]);

int main ()
{
  f ({1, 2, 3});
}
$

[Bug c++/69531] Implement CWG 1307; Differently bounded array parameters

2019-10-01 Thread mpolacek at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69531

Marek Polacek  changed:

   What|Removed |Added

 Status|NEW |ASSIGNED
 CC||mpolacek at gcc dot gnu.org
 Blocks||91364
   Assignee|unassigned at gcc dot gnu.org  |mpolacek at gcc dot 
gnu.org

--- Comment #2 from Marek Polacek  ---
Will be fixed as part of P0388R4.


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91364
[Bug 91364] Implement P0388R4: Permit conversions to arrays of unknown bound

[Bug c++/69531] Implement CWG 1307; Differently bounded array parameters

2019-10-09 Thread mpolacek at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69531

--- Comment #3 from Marek Polacek  ---
Author: mpolacek
Date: Wed Oct  9 20:58:00 2019
New Revision: 276771

URL: https://gcc.gnu.org/viewcvs?rev=276771&root=gcc&view=rev
Log:
Implement C++20 P0388R4, DR 1307, and DR 330.

This patch implements P0388R4, Permit conversions to arrays of unknown bound,
.  CWG 393 allowed references to arrays of unknown
bound and this C++20 feature allows conversions like

  void f(int(&)[]);
  int arr[1];

  void g() { f(arr); }
  int(&r)[] = arr;

The proposal seemed fairly straightforward but it turned out to be quite
shifty.  I found out that I needed to implement DR 2352 (done), and also
DR 1307 (done in this patch).  The latter DR added wording for
list-initialization ranking of references to arrays which this proposal
extends.  DR 330 was also implemented in this patch.

PR c++/91364 - P0388R4: Permit conversions to arrays of unknown bound.
PR c++/69531 - DR 1307: Differently bounded array parameters.
PR c++/88128 - DR 330: Qual convs and pointers to arrays of pointers.
* call.c (build_array_conv): Build ck_identity at the beginning
of the conversion.
(standard_conversion): Pass bounds_none to comp_ptr_ttypes_const.
(maybe_warn_array_conv): New.
(convert_like_real): Call it.  Add an error message about converting
from arrays of unknown bounds.
(conv_get_original_expr): New.
(nelts_initialized_by_list_init): New.
(conv_binds_to_array_of_unknown_bound): New.
(compare_ics): Implement list-initialization ranking based on
array sizes, as specified in DR 1307 and P0388R.
* cp-tree.h (comp_ptr_ttypes_const): Adjust declaration.
(compare_bounds_t): New enum.
* typeck.c (comp_array_types): New bool and compare_bounds_t
parameters.  Use them.
(structural_comptypes): Adjust the call to comp_array_types.
(similar_type_p): Handle ARRAY_TYPE.
(build_const_cast_1): Pass bounds_none to comp_ptr_ttypes_const.
(comp_ptr_ttypes_real): Don't check cv-quals of ARRAY_TYPEs.  Use
comp_array_types to compare array types.  Look through arrays as per
DR 330.
(comp_ptr_ttypes_const): Use comp_array_types to compare array types.
Look through arrays as per DR 330.

* g++.dg/conversion/qual1.C: New test.
* g++.dg/conversion/qual2.C: New test.
* g++.dg/conversion/qual3.C: New test.
* g++.dg/conversion/ref2.C: New test.
* g++.dg/conversion/ref3.C: New test.
* g++.dg/cpp0x/initlist-array3.C: Remove dg-error.
* g++.dg/cpp0x/initlist-array7.C: New test.
* g++.dg/cpp0x/initlist-array8.C: New test.
* g++.dg/cpp2a/array-conv1.C: New test.
* g++.dg/cpp2a/array-conv10.C: New test.
* g++.dg/cpp2a/array-conv11.C: New test.
* g++.dg/cpp2a/array-conv12.C: New test.
* g++.dg/cpp2a/array-conv13.C: New test.
* g++.dg/cpp2a/array-conv14.C: New test.
* g++.dg/cpp2a/array-conv15.C: New test.
* g++.dg/cpp2a/array-conv16.C: New test.
* g++.dg/cpp2a/array-conv17.C: New test.
* g++.dg/cpp2a/array-conv2.C: New test.
* g++.dg/cpp2a/array-conv3.C: New test.
* g++.dg/cpp2a/array-conv4.C: New test.
* g++.dg/cpp2a/array-conv5.C: New test.
* g++.dg/cpp2a/array-conv6.C: New test.
* g++.dg/cpp2a/array-conv7.C: New test.
* g++.dg/cpp2a/array-conv8.C: New test.
* g++.dg/cpp2a/array-conv9.C: New test.
* g++.old-deja/g++.bugs/900321_01.C: Adjust dg-error.

* testsuite/23_containers/span/lwg3255.cc: Adjust test to match the
post-P0388R4 behavior.


Added:
trunk/gcc/testsuite/g++.dg/conversion/qual1.C
trunk/gcc/testsuite/g++.dg/conversion/qual2.C
trunk/gcc/testsuite/g++.dg/conversion/qual3.C
trunk/gcc/testsuite/g++.dg/conversion/ref2.C
trunk/gcc/testsuite/g++.dg/conversion/ref3.C
trunk/gcc/testsuite/g++.dg/cpp0x/initlist-array7.C
trunk/gcc/testsuite/g++.dg/cpp0x/initlist-array8.C
trunk/gcc/testsuite/g++.dg/cpp2a/array-conv1.C
trunk/gcc/testsuite/g++.dg/cpp2a/array-conv10.C
trunk/gcc/testsuite/g++.dg/cpp2a/array-conv11.C
trunk/gcc/testsuite/g++.dg/cpp2a/array-conv12.C
trunk/gcc/testsuite/g++.dg/cpp2a/array-conv13.C
trunk/gcc/testsuite/g++.dg/cpp2a/array-conv14.C
trunk/gcc/testsuite/g++.dg/cpp2a/array-conv15.C
trunk/gcc/testsuite/g++.dg/cpp2a/array-conv16.C
trunk/gcc/testsuite/g++.dg/cpp2a/array-conv17.C
trunk/gcc/testsuite/g++.dg/cpp2a/array-conv2.C
trunk/gcc/testsuite/g++.dg/cpp2a/array-conv3.C
trunk/gcc/testsuite/g++.dg/cpp2a/array-conv4.C
trunk/gcc/testsuite/g++.dg/cpp2a/array-conv5.C
trunk/gcc/testsuite/g++.dg/cpp2a/array-conv6.C
trunk/gcc/testsuite/g++.dg/cpp2a/array-conv7.C
trunk/gcc/testsuite/g++.dg/cpp2a/array-conv8.C
trunk/gcc/testsuit

[Bug c++/69531] Implement CWG 1307; Differently bounded array parameters

2019-10-09 Thread mpolacek at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69531

Marek Polacek  changed:

   What|Removed |Added

 Status|ASSIGNED|RESOLVED
 Resolution|--- |FIXED

--- Comment #4 from Marek Polacek  ---
Implemented for GCC 10.