On Wed, Aug 08, 2018 at 07:17:07PM -0500, Martin Sebor wrote:
> On 08/08/2018 05:08 AM, Jason Merrill wrote:
> > On Wed, Aug 8, 2018 at 9:04 AM, Martin Sebor <mse...@gmail.com> wrote:
> >> On 08/07/2018 02:57 AM, Jason Merrill wrote:
> >>>
> >>> On Wed, Aug 1, 2018 at 12:49 AM, Martin Sebor <mse...@gmail.com> wrote:
> >>>>
> >>>> On 07/31/2018 07:38 AM, Jason Merrill wrote:

<snip>

> Done in the attached patch.  I've also avoided dealing with
> zero-length arrays and added tests to make sure their size
> stays is regardless of the form of their initializer and
> the appropriate warnings are issued.
> 
> Using build_string() rather than build_string_literal() needed
> a tweak in digest_init_r().  It didn't break anything but since
> the array type may not have a domain yet, neither will the
> string.  It looks like that may get adjusted later on but I've
> temporarily guarded the code with #if 1.  If the change is
> fine I'll remove the #if before committing.
> 
> This initial patch only handles narrow character initializers
> (i.e., those with TYPE_STRING_FLAG set).  Once this gets some
> exposure I'd like to extend it to other character types,
> including wchar_t.

Hi Martin,

This causes issues for the AArch64 tests (full list below).

I see an error message on the following construct:

  void foo (void)
  {
    __Poly8_t x[4] = { 1, 2, 3, 4 };
  }

  init.c:3:20: error: array of inappropriate type initialized from string 
constant
  3 |   __Poly8_t x[4] = { 1, 2, 3, 4 };
    |

__Poly8_t is a type we define in our backend, through a convoluted set of
functions, which operates a lot like an unsigned, QI mode type.

A second set of tests fail due to changed inlining behaviour for functions
with char array initialization:

  gcc.target/aarch64/vset_lane_1.c
  gcc.target/aarch64/vneg_s.c
  gcc.target/aarch64/vclz.c

Thanks,
James

-----

New failures in: 


gcc.target/aarch64/advsimd-intrinsics/vmax.c
gcc.target/aarch64/simd/vzipqp8_1.c
gcc.target/aarch64/vldN_dup_1.c
gcc.target/aarch64/advsimd-intrinsics/vcle.c
gcc.target/aarch64/advsimd-intrinsics/vadd.c
gcc.target/aarch64/advsimd-intrinsics/vhadd.c
gcc.target/aarch64/advsimd-intrinsics/vmull_n.c
gcc.target/aarch64/advsimd-intrinsics/vrndn.c
gcc.target/aarch64/simd/vtrnqp8_1.c
gcc.target/aarch64/advsimd-intrinsics/vpadal.c
gcc.target/aarch64/advsimd-intrinsics/vtrn_half.c
gcc.target/aarch64/advsimd-intrinsics/vqdmlal_n.c
gcc.target/aarch64/advsimd-intrinsics/vqdmulh.c
gcc.target/aarch64/advsimd-intrinsics/vqsub.c
gcc.target/aarch64/advsimd-intrinsics/vqdmlal_lane.c
gcc.target/aarch64/advsimd-intrinsics/vqdmlsl_n.c
gcc.target/aarch64/advsimd-intrinsics/vuzp_half.c
gcc.target/aarch64/advsimd-intrinsics/vst1_lane.c
gcc.target/aarch64/advsimd-intrinsics/vmla_lane.c
gcc.target/aarch64/advsimd-intrinsics/vqdmulh_lane.c
gcc.target/aarch64/advsimd-intrinsics/vrsqrte.c
gcc.target/aarch64/advsimd-intrinsics/vneg.c
gcc.target/aarch64/simd/vuzpqp8_1.c
gcc.target/aarch64/advsimd-intrinsics/vcale.c
gcc.target/aarch64/advsimd-intrinsics/vmla_n.c
gcc.target/aarch64/advsimd-intrinsics/vsub.c
gcc.target/aarch64/advsimd-intrinsics/vrev.c
gcc.target/aarch64/advsimd-intrinsics/vmul.c
gcc.target/aarch64/advsimd-intrinsics/vldX.c
gcc.target/aarch64/advsimd-intrinsics/vsubl.c
gcc.target/aarch64/advsimd-intrinsics/vfms.c
gcc.target/aarch64/advsimd-intrinsics/vmlsl.c
gcc.target/aarch64/advsimd-intrinsics/vsli_n.c
gcc.target/aarch64/advsimd-intrinsics/vcombine.c
gcc.target/aarch64/advsimd-intrinsics/vmul_n.c
gcc.target/aarch64/advsimd-intrinsics/vldX_dup.c
gcc.target/aarch64/advsimd-intrinsics/vpaddl.c
gcc.target/aarch64/advsimd-intrinsics/vqshrn_n.c
gcc.target/aarch64/advsimd-intrinsics/vstX_lane.c
gcc.target/aarch64/advsimd-intrinsics/vqtbX.c
gcc.target/aarch64/advsimd-intrinsics/vext.c
gcc.target/aarch64/advsimd-intrinsics/vtrn.c
gcc.target/aarch64/advsimd-intrinsics/vtst.c
gcc.target/aarch64/advsimd-intrinsics/vbic.c
gcc.target/aarch64/advsimd-intrinsics/vqdmlsl.c
gcc.target/aarch64/advsimd-intrinsics/vqshl.c
gcc.target/aarch64/advsimd-intrinsics/vrsqrts.c
gcc.target/aarch64/advsimd-intrinsics/vqdmull_n.c
gcc.target/aarch64/advsimd-intrinsics/vqdmlsl_lane.c
gcc.target/aarch64/advsimd-intrinsics/vqdmulh_n.c
gcc.target/aarch64/advsimd-intrinsics/vsubw.c
gcc.target/aarch64/advsimd-intrinsics/vdup_lane.c
gcc.target/aarch64/advsimd-intrinsics/vget_high.c
gcc.target/aarch64/advsimd-intrinsics/vuzp.c
gcc.target/aarch64/advsimd-intrinsics/vqshl_n.c
gcc.target/aarch64/advsimd-intrinsics/vrsra_n.c
gcc.target/aarch64/advsimd-intrinsics/vcgt.c
gcc.target/aarch64/advsimd-intrinsics/vld1_dup.c
gcc.target/aarch64/advsimd-intrinsics/vaddhn.c
gcc.target/aarch64/advsimd-intrinsics/vqshlu_n.c
gcc.target/aarch64/advsimd-intrinsics/vabs.c
gcc.target/aarch64/advsimd-intrinsics/vshll_n.c
gcc.target/aarch64/advsimd-intrinsics/vsubhn.c
gcc.target/aarch64/advsimd-intrinsics/vmlal.c
gcc.target/aarch64/advsimd-intrinsics/vqdmlal.c
gcc.target/aarch64/advsimd-intrinsics/vrecpe.c
gcc.target/aarch64/advsimd-intrinsics/vqneg.c
gcc.target/aarch64/advsimd-intrinsics/veor.c
gcc.target/aarch64/simd/extq_p8_1.c
gcc.target/aarch64/advsimd-intrinsics/vclz.c
gcc.target/aarch64/simd/ext_p8_1.c
gcc.target/aarch64/advsimd-intrinsics/vqrdmulh_lane.c
gcc.target/aarch64/advsimd-intrinsics/vqrshl.c
gcc.target/aarch64/advsimd-intrinsics/vqrshrun_n.c
gcc.target/aarch64/advsimd-intrinsics/vqrshrn_n.c
gcc.target/aarch64/advsimd-intrinsics/vceq.c
gcc.target/aarch64/advsimd-intrinsics/vrndm.c
gcc.target/aarch64/advsimd-intrinsics/vmlsl_n.c
gcc.target/aarch64/advsimd-intrinsics/vmlal_n.c
gcc.target/aarch64/advsimd-intrinsics/vqmovun.c
gcc.target/aarch64/advsimd-intrinsics/vrshr_n.c
gcc.target/aarch64/advsimd-intrinsics/vmls_n.c
gcc.target/aarch64/advsimd-intrinsics/vmlsl_lane.c
gcc.target/aarch64/advsimd-intrinsics/vqdmull_lane.c
gcc.target/aarch64/advsimd-intrinsics/vfms_vfma_n.c
gcc.target/aarch64/advsimd-intrinsics/vorr.c
gcc.target/aarch64/advsimd-intrinsics/vaddl.c
gcc.target/aarch64/advsimd-intrinsics/vmovl.c
gcc.target/aarch64/advsimd-intrinsics/vbsl.c
gcc.target/aarch64/advsimd-intrinsics/vld1_lane.c
gcc.target/aarch64/advsimd-intrinsics/vqmovn.c
gcc.target/aarch64/advsimd-intrinsics/vcalt.c
gcc.target/aarch64/advsimd-intrinsics/vmul_lane.c
gcc.target/aarch64/advsimd-intrinsics/vqshrun_n.c
gcc.target/aarch64/advsimd-intrinsics/vset_lane.c
gcc.target/aarch64/advsimd-intrinsics/vrsubhn.c
gcc.target/aarch64/advsimd-intrinsics/vshl_n.c
gcc.target/aarch64/advsimd-intrinsics/vmovn.c
gcc.target/aarch64/advsimd-intrinsics/vcls.c
gcc.target/aarch64/advsimd-intrinsics/vcage.c
gcc.target/aarch64/advsimd-intrinsics/vcnt.c
gcc.target/aarch64/advsimd-intrinsics/vmull.c
gcc.target/aarch64/simd/vuzpp8_1.c
gcc.target/aarch64/advsimd-intrinsics/vreinterpret_p64.c
gcc.target/aarch64/advsimd-intrinsics/vfma.c
gcc.target/aarch64/advsimd-intrinsics/vld1.c
gcc.target/aarch64/advsimd-intrinsics/vhsub.c
gcc.target/aarch64/advsimd-intrinsics/vget_low.c
gcc.target/aarch64/advsimd-intrinsics/p64_p128.c
gcc.target/aarch64/advsimd-intrinsics/vcvt.c
gcc.target/aarch64/advsimd-intrinsics/vqdmull.c
gcc.target/aarch64/advsimd-intrinsics/vmvn.c
gcc.target/aarch64/advsimd-intrinsics/vmin.c
gcc.target/aarch64/advsimd-intrinsics/vaba.c
gcc.target/aarch64/advsimd-intrinsics/vqrdmulh_n.c
gcc.target/aarch64/simd/vtrnp8_1.c
gcc.target/aarch64/advsimd-intrinsics/vcagt.c
gcc.target/aarch64/advsimd-intrinsics/vdup-vmov.c
gcc.target/aarch64/advsimd-intrinsics/vrhadd.c
gcc.target/aarch64/advsimd-intrinsics/vabal.c
gcc.target/aarch64/advsimd-intrinsics/vrshrn_n.c
gcc.target/aarch64/advsimd-intrinsics/vpmax.c
gcc.target/aarch64/advsimd-intrinsics/vmls.c
gcc.target/aarch64/advsimd-intrinsics/vshrn_n.c
gcc.target/aarch64/advsimd-intrinsics/vrnd.c
gcc.target/aarch64/advsimd-intrinsics/vabd.c
gcc.target/aarch64/simd/vzipp8_1.c
gcc.target/aarch64/advsimd-intrinsics/vduph_lane.c
gcc.target/aarch64/advsimd-intrinsics/vreinterpret_p128.c
gcc.target/aarch64/advsimd-intrinsics/vrshl.c
gcc.target/aarch64/advsimd-intrinsics/vcreate.c
gcc.target/aarch64/advsimd-intrinsics/vqabs.c
gcc.target/aarch64/advsimd-intrinsics/vmull_lane.c
gcc.target/aarch64/advsimd-intrinsics/vreinterpret.c
gcc.target/aarch64/advsimd-intrinsics/vmlal_lane.c
gcc.target/aarch64/advsimd-intrinsics/vshr_n.c
gcc.target/aarch64/advsimd-intrinsics/vzip.c
gcc.target/aarch64/vldN_lane_1.c
gcc.target/aarch64/advsimd-intrinsics/vabdl.c
gcc.target/aarch64/advsimd-intrinsics/vpmin.c
gcc.target/aarch64/advsimd-intrinsics/vqadd.c
gcc.target/aarch64/advsimd-intrinsics/vzip_half.c
gcc.target/aarch64/advsimd-intrinsics/vand.c
gcc.target/aarch64/advsimd-intrinsics/vpadd.c
gcc.target/aarch64/advsimd-intrinsics/vrndx.c
gcc.target/aarch64/advsimd-intrinsics/vmla.c
gcc.target/aarch64/advsimd-intrinsics/vsra_n.c
gcc.target/aarch64/advsimd-intrinsics/vget_lane.c
gcc.target/aarch64/advsimd-intrinsics/vqrdmulh.c
gcc.target/aarch64/advsimd-intrinsics/vrndp.c
gcc.target/aarch64/advsimd-intrinsics/vmls_lane.c
gcc.target/aarch64/advsimd-intrinsics/vclt.c
gcc.target/aarch64/advsimd-intrinsics/vfma_n.c
gcc.target/aarch64/advsimd-intrinsics/vaddw.c
gcc.target/aarch64/advsimd-intrinsics/vsri_n.c
gcc.target/aarch64/advsimd-intrinsics/vorn.c
gcc.target/aarch64/advsimd-intrinsics/vcvt_f16.c
gcc.target/aarch64/advsimd-intrinsics/vldX_lane.c
gcc.target/aarch64/advsimd-intrinsics/vcge.c
gcc.target/aarch64/advsimd-intrinsics/vshl.c
gcc.target/aarch64/advsimd-intrinsics/vtbX.c
gcc.target/aarch64/advsimd-intrinsics/vraddhn.c
gcc.target/aarch64/advsimd-intrinsics/vrnda.c
gcc.target/aarch64/advsimd-intrinsics/vrecps.c





> 
> Martin

> PR tree-optimization/71625 - missing strlen optimization on different array 
> initialization style
> 
> gcc/c/ChangeLog:
> 
>       PR tree-optimization/71625
>       * c-parser.c (c_parser_declaration_or_fndef): Call
>       braced_list_to_string.
> 
> gcc/c-family/ChangeLog:
> 
>       PR tree-optimization/71625
>       * c-common.c (braced_list_to_string): New function.
>       * c-common.h (braced_list_to_string): Declare it.
> 
> gcc/cp/ChangeLog:
> 
>       PR tree-optimization/71625
>       * decl.c (check_initializer):  Call braced_list_to_string.
>       (eval_check_narrowing): New function.
>       * gcc/cp/typeck2.c (digest_init_r): Accept strings literals
>       as initilizers for all narrow character types.
> 
> gcc/testsuite/ChangeLog:
> 
>       PR tree-optimization/71625
>       * g++.dg/init/string2.C: New test.
>       * g++.dg/init/string3.C: New test.
>       * g++.dg/init/string4.C: New test.
>       * gcc.dg/init-string-3.c: New test.
>       * gcc.dg/strlenopt-55.c: New test.
>       * gcc.dg/strlenopt-56.c: New test.

Reply via email to