On Tue, Feb 11, 2020 at 01:00:05PM -0700, Martin Sebor wrote:
> r270155, committed in GCC 9, introduced a transformation that strips
> redundant trailing zero initializers from array initializer lists in
> order to support string literals as template arguments.
> 
> The transformation neglected to consider the case of array elements
> of trivial class types with user-defined conversion ctors and either
> defaulted or deleted default ctors.  (It didn't occur to me that
> those qualify as trivial types despite the user-defined ctors.)  As
> a result, some valid initialization expressions are rejected when
> the explicit zero-initializers are dropped in favor of the (deleted)
> default ctor, and others are eliminated in favor of the defaulted
> ctor instead of invoking a user-defined conversion ctor, leading to
> wrong code.
> 
> The attached patch fixes that but avoiding this transformation for
> such types.
> 
> Tested on x86_64-linux.  I'd like to commit the patch to both trunk
> and to GCC 9 (with testsuite adjustments if necessary).
> 
> Martin

> PR c++/90938 - Initializing array with {1} works but not {0}
> 
> gcc/cp/ChangeLog:
> 
>       PR c++/90938
>       * decl.c (reshape_init_array_1): Avoid types with non-trivial
>       user-defined ctors.
> 
> gcc/testsuite/ChangeLog:
> 
>       PR c++/90938
>       * g++.dg/init/array55.C: New test.
>       * g++.dg/init/array56.C: New test.
> 
> diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
> index 31a556a0a1f..60731cb3f9d 100644
> --- a/gcc/cp/decl.c
> +++ b/gcc/cp/decl.c
> @@ -6051,11 +6051,14 @@ reshape_init_array_1 (tree elt_type, tree max_index, 
> reshape_iter *d,
>       break;
>      }
>  
> -  if (sized_array_p && trivial_type_p (elt_type))
> +  if (sized_array_p
> +      && trivial_type_p (elt_type)
> +      && !TYPE_NEEDS_CONSTRUCTING (elt_type))

Looks like this will still do the wrong thing for

struct X
{
  X () = delete;
  X (int) = delete;
};

X x1[1] { 0 }; // use of deleted function

which should be rejected since we use a deleted function, but
TYPE_NEEDS_CONSTRUCTING will be 0 fox X, so we'd do the truncation
and the initialization would succeed.

Marek

Reply via email to