diff options
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/trans-expr.c | 26 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/string_length_4.f90 | 16 |
4 files changed, 40 insertions, 13 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index e4bc0e8cafc..6bec5e794db 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2016-12-21 Janne Blomqvist <jb@gcc.gnu.org> + + PR fortran/78867 + * trans-expr.c (gfc_conv_procedure_call): Emit DECL_EXPR also for + non-pointer character results. + 2016-12-21 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> * iresolve.c (gfc_resolve_ftell): Call "ftell" instead of "ftell2". diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 823c96aa4cd..6ebdc8b3559 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -6002,6 +6002,19 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, type = gfc_get_character_type (ts.kind, ts.u.cl); type = build_pointer_type (type); + /* Emit a DECL_EXPR for the VLA type. */ + tmp = TREE_TYPE (type); + if (TYPE_SIZE (tmp) + && TREE_CODE (TYPE_SIZE (tmp)) != INTEGER_CST) + { + tmp = build_decl (input_location, TYPE_DECL, NULL_TREE, tmp); + DECL_ARTIFICIAL (tmp) = 1; + DECL_IGNORED_P (tmp) = 1; + tmp = fold_build1_loc (input_location, DECL_EXPR, + TREE_TYPE (tmp), tmp); + gfc_add_expr_to_block (&se->pre, tmp); + } + /* Return an address to a char[0:len-1]* temporary for character pointers. */ if ((!comp && (sym->attr.pointer || sym->attr.allocatable)) @@ -6009,19 +6022,6 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, { var = gfc_create_var (type, "pstr"); - /* Emit a DECL_EXPR for the VLA type. */ - tmp = TREE_TYPE (type); - if (TYPE_SIZE (tmp) - && TREE_CODE (TYPE_SIZE (tmp)) != INTEGER_CST) - { - tmp = build_decl (input_location, TYPE_DECL, NULL_TREE, tmp); - DECL_ARTIFICIAL (tmp) = 1; - DECL_IGNORED_P (tmp) = 1; - tmp = fold_build1_loc (input_location, DECL_EXPR, - TREE_TYPE (tmp), tmp); - gfc_add_expr_to_block (&se->pre, tmp); - } - if ((!comp && sym->attr.allocatable) || (comp && comp->attr.allocatable)) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4f5b6ae4702..4a23c1f05ce 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-12-21 Janne Blomqvist <jb@gcc.gnu.org> + + PR fortran/78867 + * gfortran.dg/string_length_4.f90: New test. + 2016-12-21 Georg-Johann Lay <avr@gjlay.de> * gcc.target/avr/mmcu: New folder for compile-tests with -mmcu=. diff --git a/gcc/testsuite/gfortran.dg/string_length_4.f90 b/gcc/testsuite/gfortran.dg/string_length_4.f90 new file mode 100644 index 00000000000..759066b078a --- /dev/null +++ b/gcc/testsuite/gfortran.dg/string_length_4.f90 @@ -0,0 +1,16 @@ +! { dg-do compile } +! { dg-require-effective-target lto } +! { dg-options "-flto" } +! PR 78867, test case adapted from gfortran.dg/string_length_1.f90 +program pr78867 + if (len(bar(2_8)) /= 2) call abort +contains + + function bar(i) + integer(8), intent(in) :: i + character(len=i) :: bar + + bar = "" + end function bar + +end program pr78867 |