From: Steven G. Kargl Date: Fri, 30 Sep 2016 21:02:56 +0000 (+0000) Subject: backport: re PR fortran/69867 (ICE on initializing character in type with array of... X-Git-Tag: releases/gcc-5.5.0~801 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=54e020f0b416cdaf2bba7a9a379346e6f1f8c6cc;p=thirdparty%2Fgcc.git backport: re PR fortran/69867 (ICE on initializing character in type with array of incompatible data) 2016-09-30 Steven G. Kargl Backport from trunk PR fortran/69867 * decl.c (build_struct): Ensure that pointers point to something. PR fortran/69962 * decl.c (gfc_set_constant_character_len): if expr is not constant issue an error instead of an ICE. PR fortran/69962 * gfortran.dg/pr69962.f90: New test. PR fortran/69867 * gfortran.dg/pr69867.f90: New test. From-SVN: r240679 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 44a7df4faaea..2e9ec14f2152 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,14 @@ +2016-09-30 Steven G. Kargl + + Backport of trunk + + PR fortran/69867 + * decl.c (build_struct): Ensure that pointers point to something. + + PR fortran/69962 + * decl.c (gfc_set_constant_character_len): if expr is not + constant issue an error instead of an ICE. + 2016-09-30 Steven g. Kargl Backport of trunk diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 5c593a94aa2d..741e77fdbf26 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -1318,10 +1318,14 @@ gfc_set_constant_character_len (int len, gfc_expr *expr, int check_len) gfc_char_t *s; int slen; - gcc_assert (expr->expr_type == EXPR_CONSTANT); - if (expr->ts.type != BT_CHARACTER) return; + + if (expr->expr_type != EXPR_CONSTANT) + { + gfc_error_now ("CHARACTER length must be a constant at %L", &expr->where); + return; + } slen = expr->value.character.length; if (len != slen) @@ -1715,8 +1719,10 @@ build_struct (const char *name, gfc_charlen *cl, gfc_expr **init, if (c->initializer->expr_type == EXPR_CONSTANT) gfc_set_constant_character_len (len, c->initializer, -1); - else if (mpz_cmp (c->ts.u.cl->length->value.integer, - c->initializer->ts.u.cl->length->value.integer)) + else if (c->initializer + && c->initializer->ts.u.cl + && mpz_cmp (c->ts.u.cl->length->value.integer, + c->initializer->ts.u.cl->length->value.integer)) { gfc_constructor *ctor; ctor = gfc_constructor_first (c->initializer->value.constructor); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9398bf516a55..94bc71e8d306 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2016-09-30 Steven G. Kargl + + Backport from trunk + + PR fortran/69867 + * gfortran.dg/pr69867.f90: New test. + + PR fortran/69962 + * gfortran.dg/pr69962.f90: New test. + 2016-09-30 Steven g. Kargl Backport from trunk diff --git a/gcc/testsuite/gfortran.dg/pr69867.f90 b/gcc/testsuite/gfortran.dg/pr69867.f90 new file mode 100644 index 000000000000..132d5e83b161 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr69867.f90 @@ -0,0 +1,6 @@ +! { dg-do compile } +program p + type t + character(1) :: c(1)=[1] ! { dg-error "convert INTEGER.4. to CHARACTER.1." } + end type +end diff --git a/gcc/testsuite/gfortran.dg/pr69962.f90 b/gcc/testsuite/gfortran.dg/pr69962.f90 new file mode 100644 index 000000000000..2684398ee311 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr69962.f90 @@ -0,0 +1,6 @@ +! { dg-do compile } +program p + integer :: n = 1 + character(3), parameter :: x(2) = ['abc', 'xyz'] + character(2), parameter :: y(2) = [x(2)(2:3), x(n)(1:2)] ! { dg-error "CHARACTER length must be a constant" } +end