From: Mark Eggleston Date: Wed, 19 Feb 2020 09:36:42 +0000 (+0000) Subject: [Fortran] ICE assign character pointer to non target PR93714 X-Git-Tag: releases/gcc-9.3.0~105 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=44ea6508f1009086018d0db4347a14b9c4eec2c0;p=thirdparty%2Fgcc.git [Fortran] ICE assign character pointer to non target PR93714 An ICE occurred if an attempt was made to assign a pointer to a character variable that has an length incorrectly specified using a real constant and does not have the target attribute. Backported from mainline 2020-02-18 Mark Eggleston PR fortran/93714 * expr.c (gfc_check_pointer_assign): Move check for matching character length to after checking the lvalue attributes for target or pointer. PR fortran/93714 * gfortran.dg/char_pointer_assign_6.f90: Look for no target message instead of length mismatch. * gfortran.dg/pr93714_1.f90 * gfortran.dg/pr93714_2.f90 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index c4257c1c7f7c..8fccf0db5cc3 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,13 @@ +2020-02-19 Mark Eggleston + + Backported from mainline + 2020-02-18 Mark Eggleston + + PR fortran/93714 + * expr.c (gfc_check_pointer_assign): Move check for + matching character length to after checking the lvalue + attributes for target or pointer. + 2020-02-18 Mark Eggleston Backported from mainline diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 5663d91fe0ff..94f9eb00f71c 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -4196,13 +4196,6 @@ gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue, if (rvalue->expr_type == EXPR_NULL) return true; - if (lvalue->ts.type == BT_CHARACTER) - { - bool t = gfc_check_same_strlen (lvalue, rvalue, "pointer assignment"); - if (!t) - return false; - } - if (rvalue->expr_type == EXPR_VARIABLE && is_subref_array (rvalue)) lvalue->symtree->n.sym->attr.subref_array_pointer = 1; @@ -4258,6 +4251,13 @@ gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue, } } + if (lvalue->ts.type == BT_CHARACTER) + { + bool t = gfc_check_same_strlen (lvalue, rvalue, "pointer assignment"); + if (!t) + return false; + } + if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym)) { gfc_error ("Bad target in pointer assignment in PURE " diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6a476067c058..54beb3d5b0a0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2020-02-19 Mark Eggleston + + Backported from mainline + 2020-02-18 Mark Eggleston + + PR fortran/93714 + * gfortran.dg/char_pointer_assign_6.f90: Look for no target + message instead of length mismatch. + * gfortran.dg/pr93714_1.f90 + * gfortran.dg/pr93714_2.f90 + 2020-02-18 Hongtao Liu * g++.dg/other/i386-2.C: Add -mavx512vbmi2. diff --git a/gcc/testsuite/gfortran.dg/char_pointer_assign_6.f90 b/gcc/testsuite/gfortran.dg/char_pointer_assign_6.f90 index cd90bfc06e34..e0e116074aee 100644 --- a/gcc/testsuite/gfortran.dg/char_pointer_assign_6.f90 +++ b/gcc/testsuite/gfortran.dg/char_pointer_assign_6.f90 @@ -6,6 +6,6 @@ program main character (len=4) :: c s1 = 'abcd' p1 => s1(2:3) ! { dg-error "Unequal character lengths \\(20/2\\)" } - p1 => c(1:) ! { dg-error "Unequal character lengths \\(20/4\\)" } - p1 => c(:4) ! { dg-error "Unequal character lengths \\(20/4\\)" } + p1 => c(1:) ! { dg-error "Pointer assignment target" } + p1 => c(:4) ! { dg-error "Pointer assignment target" } end diff --git a/gcc/testsuite/gfortran.dg/pr93714_1.f90 b/gcc/testsuite/gfortran.dg/pr93714_1.f90 new file mode 100644 index 000000000000..40f4a4bf89f0 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr93714_1.f90 @@ -0,0 +1,11 @@ +! { dg-do compile } +! PR 93714 +! Original test case from G. Steinmetz + +program test + character((1.)) :: a + character, pointer :: b => a +end program + +! { dg-error "must be of INTEGER type" " " { target *-*-* } 6 } +! { dg-error "does not have the TARGET attribute" " " { target *-*-* } 7 } diff --git a/gcc/testsuite/gfortran.dg/pr93714_2.f90 b/gcc/testsuite/gfortran.dg/pr93714_2.f90 new file mode 100644 index 000000000000..86658f288594 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr93714_2.f90 @@ -0,0 +1,11 @@ +! { dg-do compile } +! PR 93714 +! Original test case from G. Steinmetz + +program test + character((9.)) :: a + character(:), pointer :: b => a +end program + +! { dg-error "must be of INTEGER type" " " { target *-*-* } 6 } +! { dg-error "does not have the TARGET attribute" " " { target *-*-* } 7 }