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.