[gcc(refs/users/marxin/heads/opt-parse-enum-sanity)] Commit for PR92785
Martin Liska
marxin@gcc.gnu.org
Tue Mar 17 15:58:36 GMT 2020
https://gcc.gnu.org/g:7485ace81de9ec9dd5c87edf67e359d31ce35a20
commit 7485ace81de9ec9dd5c87edf67e359d31ce35a20
Author: Paul Thomas <pault@pc30.home>
Date: Fri Feb 28 18:30:57 2020 +0000
Commit for PR92785
Diff:
---
gcc/fortran/ChangeLog | 6 +++
gcc/fortran/trans-expr.c | 11 +++++
gcc/testsuite/ChangeLog | 7 ++-
.../gfortran.dg/unlimited_polymorphic_31.f03 | 55 ++++++++++++++++++++++
4 files changed, 78 insertions(+), 1 deletion(-)
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index d9dd618cc87..b9293de9da9 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2020-02-28 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/92785
+ * trans-expr.c (gfc_conv_intrinsic_to_class): Renormalise non-
+ variable expressions to be unity lbound based.
+
2020-02-25 Steven G. Kargl <kargl@gcc.gnu.org>
* simplify.c (degrees_f): Remove unused code.
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index 5825a4b8ce3..9d0921eeed3 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -843,6 +843,7 @@ gfc_conv_intrinsic_to_class (gfc_se *parmse, gfc_expr *e,
tree ctree;
tree var;
tree tmp;
+ int dim;
/* The intrinsic type needs to be converted to a temporary
CLASS object. */
@@ -892,6 +893,16 @@ gfc_conv_intrinsic_to_class (gfc_se *parmse, gfc_expr *e,
parmse->ss = ss;
parmse->use_offset = 1;
gfc_conv_expr_descriptor (parmse, e);
+
+ /* Array references with vector subscripts and non-variable expressions
+ need be converted to a one-based descriptor. */
+ if (e->expr_type != EXPR_VARIABLE)
+ {
+ for (dim = 0; dim < e->rank; ++dim)
+ gfc_conv_shift_descriptor_lbound (&parmse->pre, parmse->expr,
+ dim, gfc_index_one_node);
+ }
+
if (class_ts.u.derived->components->as->rank != e->rank)
{
tmp = fold_build1_loc (input_location, VIEW_CONVERT_EXPR,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3727ae255fe..c14935705fb 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-02-28 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/92785
+ * gfortran.dg/unlimited_polymorphic_31.f03 : New test.
+
2020-02-28 Jakub Jelinek <jakub@redhat.com>
P1937R2 - Fixing inconsistencies between const{expr,eval} functions
@@ -987,7 +992,7 @@
PR c++/93559 - ICE with CONSTRUCTOR flags verification.
* g++.dg/cpp0x/initlist119.C: New test.
* g++.dg/cpp0x/initlist120.C: New test.
-
+
2020-02-05 Jakub Jelinek <jakub@redhat.com>
PR c++/93557
diff --git a/gcc/testsuite/gfortran.dg/unlimited_polymorphic_31.f03 b/gcc/testsuite/gfortran.dg/unlimited_polymorphic_31.f03
new file mode 100644
index 00000000000..dd47c34989e
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/unlimited_polymorphic_31.f03
@@ -0,0 +1,55 @@
+! { dg-do run }
+!
+! Test the fix for PR92785, where the array passed to 'write scalar' was not
+! normalised to LBOUND = 1.
+!
+! Contributed by <urbanjost@comcast.net>
+!
+ program tst
+ use iso_fortran_env, only : compiler_version, compiler_options
+ implicit none
+ integer :: i
+ integer :: ibad=0
+ integer :: iarr(10) = [(i*10, i = 1,size (iarr))]
+ character(len=:), allocatable :: line
+ character(len=*), parameter :: expected = '10 20 30 40 50 60 70 80 90 100'
+ character(len=*), parameter :: expected_minus = '-10 -20 -30 -40 -50 -60 -70 -80 -90 -100'
+ print '(4a)', &
+ 'This file was compiled by ', compiler_version(), &
+ ' using the options ', compiler_options()
+ call write_row ('iarr ', iarr) ! pass in the array, OK
+ call write_row ('iarr+0 ', iarr+0) ! pass in an expression, NOT OK
+ call write_row ('-iarr ', -iarr) ! pass in an expression, NOT OK
+ call write_row ('iarr(::1) ', iarr(::1)) ! pass in the array, OK
+ call write_row ('[iarr(::1)] ', [iarr(::1)]) ! pass in compound constructor, NOT OK
+ call write_row ('[(i*10,i=1,size(iarr))]', [(i*10,i=1,size(iarr))]) ! pass in constructor, OK
+ call write_row ('10*[(i,i=1,size(iarr))]', 10*[(i,i=1,size(iarr))]) ! pass in constructor, OK
+ if (ibad .gt. 0) stop 'FAILED'
+ contains
+ subroutine write_scalar (g1)
+ class(*) :: g1
+ character(len = 20) :: word
+ select type(g1)
+ type is (integer)
+ write (word, '(i0)') g1
+ line = line // trim( word) // ' '
+ end select
+ end subroutine write_scalar
+ subroutine write_row (string,array)
+ character(len = *) :: string
+ class(*) :: array(:)
+ integer :: i
+ line = ''
+ do i = 1, size (array)
+ call write_scalar (array(i))
+ enddo
+ if (expected .eq. line) then
+ write (*, *) string, ':GOOD'
+ else if (expected_minus .eq. line) then
+ write (*, *) string, ':GOOD'
+ else
+ write (*, *) string, ':BAD. EXPECTED [', expected, '] got [', trim (line),']'
+ ibad = ibad + 1
+ endif
+ end subroutine write_row
+ end program tst
More information about the Gcc-cvs
mailing list