public inbox for fortran@gcc.gnu.org
 help / color / mirror / Atom feed
* [Patch, fortran] Bug 68241 - [meta-bug] Deferred-length character - PRs50221, 68216 and 67674
@ 2015-11-09 13:38 Paul Richard Thomas
  2015-11-09 14:46 ` Steve Kargl
  0 siblings, 1 reply; 8+ messages in thread
From: Paul Richard Thomas @ 2015-11-09 13:38 UTC (permalink / raw)
  To: fortran; +Cc: Dominique Dhumieres, Damian Rouson, Louis Krupp

Dear All,

Spurred by a clf thread, I have made a start on deferred length
character bugs. The meta-bug  was posted by Dominique, for which
thanks.

The change to trans-array.c is done to ensure that gfc_build_array_ref
has the DECL_CONTEXT of the symbol to compare with that of the
deferred string length variable.

That is trans-stmt.c provides the deferred string length variable for
allocations, where an explicit typespec is used. This ensures that the
dtype of the allocated array descriptor has the correct size.

The trans-types.c and trans.c modifications are sufficiently described
in the ChangeLog below.

Boostraps and regtests on FC21/x86_64 - OK for trunk?

There seems to be some irritation out in the field that gfortran's
handling of deferred length characters is not in very good shape. The
attached patch will need some adaptation to work with 4.9 and 5
branches. However, I think that it is worthwhile to do this because
the distros will not include 6 branch for quite a long time. I will
submit the patch(es) for 4.9 and 5 separately.

Louis Krupp is looking at PR49954 (ICE assigning concat expression to
an array deferred-length string (realloc on assignment)), which is a
really unpleasant bug that winds up putting code using temporary
variables before their decalarations, thereby mightily upsetting the
gimplifier. By the way, Louis, The assignment should be generating a
temporary, I think. I do not see any sign of that in the code :-(

Cheers

Paul

2015-11-09  Paul Thomas  <pault@gcc.gnu.org>

    PR fortran/50221
    PR fortran/68216
    * trans_array.c (gfc_conv_scalarized_array_ref): Pass the
    symbol decl for deferred character length array references.
    * trans-stmt.c (gfc_trans_allocate): Keep the string lengths
    to update deferred length character string lengths.
    * trans-types.c (gfc_get_dtype_rank_type); Use the string
    length of deferred character types for the dtype size.
    * trans.c (gfc_build_array_ref): For references to deferred
    character arrays, use the domain max value, if it is a variable
    to set the 'span' and use pointer arithmetic for access to the
    element.
    (trans_code): Set gfc_current_locus for diagnostic purposes.

    PR fortran/67674
    * trans-expr.c (gfc_conv_procedure_call): Do not fix deferred
    string lengths of component references.

2015-11-09  Paul Thomas  <pault@gcc.gnu.org>

    PR fortran/50221
    * gfortran.dg/deferred_character_1.f90: New test.

    PR fortran/68216
    * gfortran.dg/deferred_character_2.f90: New test.

    PR fortran/67674
    * gfortran.dg/deferred_character_3.f90: New test.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Patch, fortran] Bug 68241 - [meta-bug] Deferred-length character - PRs50221, 68216 and 67674
  2015-11-09 13:38 [Patch, fortran] Bug 68241 - [meta-bug] Deferred-length character - PRs50221, 68216 and 67674 Paul Richard Thomas
@ 2015-11-09 14:46 ` Steve Kargl
  2015-11-10  9:48   ` Paul Richard Thomas
  0 siblings, 1 reply; 8+ messages in thread
From: Steve Kargl @ 2015-11-09 14:46 UTC (permalink / raw)
  To: Paul Richard Thomas
  Cc: fortran, Dominique Dhumieres, Damian Rouson, Louis Krupp

On Mon, Nov 09, 2015 at 02:38:15PM +0100, Paul Richard Thomas wrote:
> 
> Boostraps and regtests on FC21/x86_64 - OK for trunk?
> 

Patch seems to have been left behind.

-- 
Steve

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Patch, fortran] Bug 68241 - [meta-bug] Deferred-length character - PRs50221, 68216 and 67674
  2015-11-09 14:46 ` Steve Kargl
@ 2015-11-10  9:48   ` Paul Richard Thomas
  2015-11-10 15:39     ` Dominique d'Humières
  0 siblings, 1 reply; 8+ messages in thread
From: Paul Richard Thomas @ 2015-11-10  9:48 UTC (permalink / raw)
  To: Steve Kargl; +Cc: fortran, Dominique Dhumieres, Damian Rouson, Louis Krupp

[-- Attachment #1: Type: text/plain, Size: 591 bytes --]

Dear Steve,

I was charging around like a mad thing yesterday and sent the
submission in something of a hurry. Thanks for pointing out the
omission so quickly.

Please find the patch attached.

Cheers

Paul

On 9 November 2015 at 15:46, Steve Kargl
<sgk@troutmask.apl.washington.edu> wrote:
> On Mon, Nov 09, 2015 at 02:38:15PM +0100, Paul Richard Thomas wrote:
>>
>> Boostraps and regtests on FC21/x86_64 - OK for trunk?
>>
>
> Patch seems to have been left behind.
>
> --
> Steve



-- 
Outside of a dog, a book is a man's best friend. Inside of a dog it's
too dark to read.

Groucho Marx

[-- Attachment #2: submit.diff --]
[-- Type: text/plain, Size: 11144 bytes --]

Index: /svn/trunk/gcc/fortran/trans-array.c
===================================================================
*** /svn/trunk/gcc/fortran/trans-array.c	(revision 229953)
--- /svn/trunk/gcc/fortran/trans-array.c	(working copy)
*************** gfc_conv_scalarized_array_ref (gfc_se *
*** 3168,3174 ****
      index = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
  			     index, info->offset);

!   if (expr && is_subref_array (expr))
      decl = expr->symtree->n.sym->backend_decl;

    tmp = build_fold_indirect_ref_loc (input_location, info->data);
--- 3168,3175 ----
      index = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
  			     index, info->offset);

!   if (expr && (is_subref_array (expr)
! 	       || expr->ts.deferred))
      decl = expr->symtree->n.sym->backend_decl;

    tmp = build_fold_indirect_ref_loc (input_location, info->data);
Index: /svn/trunk/gcc/fortran/trans-expr.c
===================================================================
*** /svn/trunk/gcc/fortran/trans-expr.c	(revision 229953)
--- /svn/trunk/gcc/fortran/trans-expr.c	(working copy)
*************** gfc_conv_procedure_call (gfc_se * se, gf
*** 5601,5607 ****
  	  else
  	    {
  	      tmp = parmse.string_length;
! 	      if (TREE_CODE (tmp) != VAR_DECL)
  		tmp = gfc_evaluate_now (parmse.string_length, &se->pre);
  	      parmse.string_length = gfc_build_addr_expr (NULL_TREE, tmp);
  	    }
--- 5601,5608 ----
  	  else
  	    {
  	      tmp = parmse.string_length;
! 	      if (TREE_CODE (tmp) != VAR_DECL
! 		  && TREE_CODE (tmp) != COMPONENT_REF)
  		tmp = gfc_evaluate_now (parmse.string_length, &se->pre);
  	      parmse.string_length = gfc_build_addr_expr (NULL_TREE, tmp);
  	    }
Index: /svn/trunk/gcc/fortran/trans-stmt.c
===================================================================
*** /svn/trunk/gcc/fortran/trans-stmt.c	(revision 229953)
--- /svn/trunk/gcc/fortran/trans-stmt.c	(working copy)
*************** gfc_trans_allocate (gfc_code * code)
*** 5089,5094 ****
--- 5089,5095 ----
    tree label_finish;
    tree memsz;
    tree al_vptr, al_len;
+   tree def_str_len = NULL_TREE;
    /* If an expr3 is present, then store the tree for accessing its
       _vptr, and _len components in the variables, respectively.  The
       element size, i.e. _vptr%size, is stored in expr3_esize.  Any of
*************** gfc_trans_allocate (gfc_code * code)
*** 5466,5471 ****
--- 5467,5473 ----
  	  expr3_esize = fold_build2_loc (input_location, MULT_EXPR,
  					 TREE_TYPE (se_sz.expr),
  					 tmp, se_sz.expr);
+ 	  def_str_len = gfc_evaluate_now (se_sz.expr, &block);
  	}
      }

*************** gfc_trans_allocate (gfc_code * code)
*** 5517,5522 ****
--- 5519,5535 ----

        se.want_pointer = 1;
        se.descriptor_only = 1;
+
+       if (expr->ts.type == BT_CHARACTER
+ 	  && expr->ts.deferred
+ 	  && TREE_CODE (expr->ts.u.cl->backend_decl) == VAR_DECL
+ 	  && def_str_len != NULL_TREE)
+ 	{
+ 	  tmp = expr->ts.u.cl->backend_decl;
+ 	  gfc_add_modify (&block, tmp,
+ 			  fold_convert (TREE_TYPE (tmp), def_str_len));
+ 	}
+
        gfc_conv_expr (&se, expr);
        if (expr->ts.type == BT_CHARACTER && expr->ts.deferred)
  	/* se.string_length now stores the .string_length variable of expr
Index: /svn/trunk/gcc/fortran/trans-types.c
===================================================================
*** /svn/trunk/gcc/fortran/trans-types.c	(revision 229954)
--- /svn/trunk/gcc/fortran/trans-types.c	(working copy)
*************** gfc_get_dtype_rank_type (int rank, tree
*** 1455,1460 ****
--- 1455,1468 ----
      }

    gcc_assert (rank <= GFC_DTYPE_RANK_MASK);
+
+   if (TREE_CODE (etype) == ARRAY_TYPE
+       && TYPE_MAXVAL (TYPE_DOMAIN (etype)) != NULL_TREE
+       && TREE_CODE (TYPE_MAXVAL (TYPE_DOMAIN (etype))) == VAR_DECL
+       && DECL_CONTEXT (TYPE_MAXVAL (TYPE_DOMAIN (etype)))
+ 				== current_function_decl)
+     size = TYPE_MAXVAL (TYPE_DOMAIN (etype));
+   else
      size = TYPE_SIZE_UNIT (etype);

    i = rank | (n << GFC_DTYPE_TYPE_SHIFT);
Index: /svn/trunk/gcc/fortran/trans.c
===================================================================
*** /svn/trunk/gcc/fortran/trans.c	(revision 229953)
--- /svn/trunk/gcc/fortran/trans.c	(working copy)
*************** gfc_build_array_ref (tree base, tree off
*** 334,339 ****
--- 334,351 ----

    type = TREE_TYPE (type);

+   /* Use pointer arithmetic for deferred character length array
+      references.  */
+   if (type && TREE_CODE (type) == ARRAY_TYPE
+       && TYPE_MAXVAL (TYPE_DOMAIN (type)) != NULL_TREE
+       && TREE_CODE (TYPE_MAXVAL (TYPE_DOMAIN (type))) == VAR_DECL
+       && decl
+       && DECL_CONTEXT (TYPE_MAXVAL (TYPE_DOMAIN (type)))
+ 					== DECL_CONTEXT (decl))
+     span = TYPE_MAXVAL (TYPE_DOMAIN (type));
+   else
+     span = NULL_TREE;
+
    if (DECL_P (base))
      TREE_ADDRESSABLE (base) = 1;

*************** gfc_build_array_ref (tree base, tree off
*** 348,355 ****
  		|| TREE_CODE (decl) == PARM_DECL)
         && ((GFC_DECL_SUBREF_ARRAY_P (decl)
  	    && !integer_zerop (GFC_DECL_SPAN (decl)))
! 	   || GFC_DECL_CLASS (decl)))
!       || vptr)
      {
        if (decl)
  	{
--- 360,368 ----
  		|| TREE_CODE (decl) == PARM_DECL)
         && ((GFC_DECL_SUBREF_ARRAY_P (decl)
  	    && !integer_zerop (GFC_DECL_SPAN (decl)))
! 	   || GFC_DECL_CLASS (decl)
! 	   || span != NULL_TREE))
!       || vptr != NULL_TREE)
      {
        if (decl)
  	{
*************** gfc_build_array_ref (tree base, tree off
*** 379,384 ****
--- 392,399 ----
  	    }
  	  else if (GFC_DECL_SUBREF_ARRAY_P (decl))
  	    span = GFC_DECL_SPAN (decl);
+ 	  else if (span)
+ 	    span = fold_convert (gfc_array_index_type, span);
  	  else
  	    gcc_unreachable ();
  	}
*************** trans_code (gfc_code * code, tree cond)
*** 1623,1628 ****
--- 1638,1644 ----
  	  gfc_add_expr_to_block (&block, res);
  	}

+       gfc_current_locus = code->loc;
        gfc_set_backend_locus (&code->loc);

        switch (code->op)
Index: /svn/trunk/gcc/testsuite/gfortran.dg/deferred_character_1.f90
===================================================================
*** /svn/trunk/gcc/testsuite/gfortran.dg/deferred_character_1.f90	(revision 0)
--- /svn/trunk/gcc/testsuite/gfortran.dg/deferred_character_1.f90	(working copy)
***************
*** 0 ****
--- 1,40 ----
+ ! { dg-do run }
+ !
+ ! Tests the fix for PR50221
+ !
+ ! Contributed by Clive Page  <clivegpage@gmail.com>
+ !            and Tobias Burnus  <burnus@gcc.gnu.org>
+ !
+ ! This is from comment #2 by Tobias Burnus.
+ !
+ module m
+   character(len=:), save, allocatable :: str(:)
+   character(len=2), parameter :: const(3) = ["a1", "b2", "c3"]
+ end
+
+   use m
+   call test()
+   if(allocated(str)) deallocate(str)
+   call foo
+ contains
+   subroutine test()
+     call doit()
+ !    print *, 'strlen=',len(str),' / array size =',size(str)
+ !    print '(3a)', '>',str(1),'<'
+ !    print '(3a)', '>',str(2),'<'
+ !    print '(3a)', '>',str(3),'<'
+     if (any (str .ne. const)) call abort
+   end subroutine test
+   subroutine doit()
+     str = const
+   end subroutine doit
+   subroutine foo
+ !
+ ! This is the original PR from Clive Page
+ !
+     character(:), allocatable, dimension(:) :: array
+     array = (/'xx', 'yy', 'zz'/)
+ !    print *, 'array=', array, len(array(1)), size(array)
+     if (any (array .ne. ["xx", "yy", "zz"])) call abort
+   end subroutine
+ end
Index: /svn/trunk/gcc/testsuite/gfortran.dg/deferred_character_2.f90
===================================================================
*** /svn/trunk/gcc/testsuite/gfortran.dg/deferred_character_2.f90	(revision 0)
--- /svn/trunk/gcc/testsuite/gfortran.dg/deferred_character_2.f90	(working copy)
***************
*** 0 ****
--- 1,58 ----
+ ! { dg-do run }
+ !
+ ! Tests the fix for PR68216
+ !
+ ! Reported on clf: https://groups.google.com/forum/#!topic/comp.lang.fortran/eWQTKfqKLZc
+ !
+ PROGRAM hello
+ !
+ ! This is the first testcase from Francisco (Ayyy LMAO)
+ !
+     IMPLICIT NONE
+
+     CHARACTER(LEN=:),DIMENSION(:),ALLOCATABLE :: array_lineas
+     character (3), dimension (2) :: src = ["abc","def"]
+     character (100) :: buffer
+     INTEGER :: largo , cant_lineas , i
+
+     write (buffer, "(2a3)") src
+
+ !    WRITE(*,*) ' Escriba un numero para el largo de cada linea'
+ !    READ(*,*) largo
+     largo = LEN (src)
+
+ !    WRITE(*,*) ' Escriba la cantidad de lineas'
+ !    READ(*,*) cant_lineas
+     cant_lineas = size (src, 1)
+
+     ALLOCATE(CHARACTER(LEN=largo) :: array_lineas(cant_lineas))
+
+ !    WRITE(*,*) 'Escriba el array', len(array_lineas), size(array_lineas)
+     READ(buffer,"(2a3)") (array_lineas(i),i=1,cant_lineas)
+
+ !    WRITE(*,*) 'Array guardado: '
+ !    DO i=1,cant_lineas
+ !    WRITE(*,*) array_lineas(i)
+ !    ENDDO
+      if (any (array_lineas .ne. src)) call abort
+ !    READ(*,*)
+      call testdefchar
+ contains
+      subroutine testdefchar
+ !
+ ! This is the testcase in the above thread from Blokbuster
+ !
+           implicit none
+           character(:), allocatable :: test(:)
+
+           allocate(character(3) :: test(2))
+           test(1) = 'abc'
+           test(2) = 'def'
+           if (any (test .ne. ['abc', 'def'])) call abort
+
+           test = ['aa','bb','cc']
+           if (any (test .ne. ['aa', 'bb', 'cc'])) call abort
+
+      end subroutine testdefchar
+
+ END PROGRAM
Index: /svn/trunk/gcc/testsuite/gfortran.dg/deferred_character_3.f90
===================================================================
*** /svn/trunk/gcc/testsuite/gfortran.dg/deferred_character_3.f90	(revision 0)
--- /svn/trunk/gcc/testsuite/gfortran.dg/deferred_character_3.f90	(working copy)
***************
*** 0 ****
--- 1,46 ----
+ ! {dg_do run }
+ !
+ ! Tests the fix for PR67674
+ !
+ ! Contributed by Kristopher Kuhlman  <kristopher.kuhlman@gmail.com>
+ !
+ program test
+   implicit none
+
+   type string_type
+     character(len=:), allocatable :: name
+   end type string_type
+   type(string_type), allocatable :: my_string_type
+
+   allocate(my_string_type)
+   allocate(character(len=0) :: my_string_type%name)
+
+ !  print *, 'length main program before',len(my_string_type%name)
+
+   call inputreadword1(my_string_type%name)
+
+ !  print *, 'length main program after',len(my_string_type%name)
+ !  print *, 'final result:',my_string_type%name
+   if (my_string_type%name .ne. 'here the word is finally set') call abort
+
+ contains
+   subroutine inputreadword1(word_intermediate)
+     character(len=:), allocatable :: word_intermediate
+
+ !    print *, 'length intermediate before',len(word_intermediate)
+     call inputreadword2(word_intermediate)
+ !    print *, 'length intermediate after',len(word_intermediate)
+ !    print *, word_intermediate
+
+   end subroutine inputreadword1
+
+   subroutine inputreadword2(word)
+     character(len=:), allocatable :: word
+
+ !    print *, 'length inner before',len(word)
+     word = 'here the word is finally set' ! want automatic reallocation to happen here
+ !    print *, 'length inner after',len(word)
+ !    print *, word
+
+   end subroutine inputreadword2
+ end program test

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Patch, fortran] Bug 68241 - [meta-bug] Deferred-length character - PRs50221, 68216 and 67674
  2015-11-10  9:48   ` Paul Richard Thomas
@ 2015-11-10 15:39     ` Dominique d'Humières
  2015-11-12 13:14       ` Paul Richard Thomas
  0 siblings, 1 reply; 8+ messages in thread
From: Dominique d'Humières @ 2015-11-10 15:39 UTC (permalink / raw)
  To: Paul Richard Thomas; +Cc: Steve Kargl, fortran, Damian Rouson, Louis Krupp

Dear Paul,

The patch for gcc/fortran/trans-types.c does not apply on revision r230071 and I had to use

--- ../_clean/gcc/fortran/trans-types.c	2015-11-08 18:04:13.000000000 +0100
+++ gcc/fortran/trans-types.c	2015-11-10 11:57:33.000000000 +0100
@@ -1455,7 +1455,13 @@ gfc_get_dtype_rank_type (int rank, tree 
     }
 
   gcc_assert (rank <= GFC_DTYPE_RANK_MASK);
-  size = TYPE_SIZE_UNIT (etype);
+ 
+  if (TREE_CODE (etype) == ARRAY_TYPE
+      && TYPE_MAXVAL (TYPE_DOMAIN (etype)) != NULL_TREE
+      && TREE_CODE (TYPE_MAXVAL (TYPE_DOMAIN (etype))) == VAR_DECL)
+    size = TYPE_MAXVAL (TYPE_DOMAIN (etype));
+  else
+    size = TYPE_SIZE_UNIT (etype);
 
   i = rank | (n << GFC_DTYPE_TYPE_SHIFT);
   if (size && INTEGER_CST_P (size))

which I hope is correct.

With the patch (and a few others!-) I have regstrapped without any regression. The tests in pr50221 are fixed except the one in comment 4, the output is
           4           4
A   
CDV 
?


 I have also found that pr63932 and pr66408 are fixed by the patch.

Thanks for your work on this issue,

Dominique

> Le 10 nov. 2015 à 10:48, Paul Richard Thomas <paul.richard.thomas@gmail.com> a écrit :
> 
> Dear Steve,
> 
> I was charging around like a mad thing yesterday and sent the
> submission in something of a hurry. Thanks for pointing out the
> omission so quickly.
> 
> Please find the patch attached.
> 
> Cheers
> 
> Paul
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Patch, fortran] Bug 68241 - [meta-bug] Deferred-length character - PRs50221, 68216 and 67674
  2015-11-10 15:39     ` Dominique d'Humières
@ 2015-11-12 13:14       ` Paul Richard Thomas
  2015-11-12 18:56         ` Dominique d'Humières
  0 siblings, 1 reply; 8+ messages in thread
From: Paul Richard Thomas @ 2015-11-12 13:14 UTC (permalink / raw)
  To: Dominique d'Humières
  Cc: Steve Kargl, fortran, Damian Rouson, Louis Krupp

[-- Attachment #1: Type: text/plain, Size: 2284 bytes --]

Hi Dominique,

Are you sure about pr50221 #4? It runs fine for me.

I have attached the testcases for PRs 50221#4, 63932, and 66408. I
propose to add these to the commit, once I get approval.....

I have a further patch for pr49954, which nearly fixes the testcase in
the PR but is not quite there. However, concatenation is in general
fixed, when there is no dependency. When there is, the lhs string
lengt gets updated before the concatenation, thereby shifting the op2
part of the concatenation. It'll be another few days....

Cheers

Paul



On 10 November 2015 at 16:39, Dominique d'Humières <dominiq@lps.ens.fr> wrote:
> Dear Paul,
>
> The patch for gcc/fortran/trans-types.c does not apply on revision r230071 and I had to use
>
> --- ../_clean/gcc/fortran/trans-types.c 2015-11-08 18:04:13.000000000 +0100
> +++ gcc/fortran/trans-types.c   2015-11-10 11:57:33.000000000 +0100
> @@ -1455,7 +1455,13 @@ gfc_get_dtype_rank_type (int rank, tree
>      }
>
>    gcc_assert (rank <= GFC_DTYPE_RANK_MASK);
> -  size = TYPE_SIZE_UNIT (etype);
> +
> +  if (TREE_CODE (etype) == ARRAY_TYPE
> +      && TYPE_MAXVAL (TYPE_DOMAIN (etype)) != NULL_TREE
> +      && TREE_CODE (TYPE_MAXVAL (TYPE_DOMAIN (etype))) == VAR_DECL)
> +    size = TYPE_MAXVAL (TYPE_DOMAIN (etype));
> +  else
> +    size = TYPE_SIZE_UNIT (etype);
>
>    i = rank | (n << GFC_DTYPE_TYPE_SHIFT);
>    if (size && INTEGER_CST_P (size))
>
> which I hope is correct.
>
> With the patch (and a few others!-) I have regstrapped without any regression. The tests in pr50221 are fixed except the one in comment 4, the output is
>            4           4
> A
> CDV
> ?
>
>
>  I have also found that pr63932 and pr66408 are fixed by the patch.
>
> Thanks for your work on this issue,
>
> Dominique
>
>> Le 10 nov. 2015 à 10:48, Paul Richard Thomas <paul.richard.thomas@gmail.com> a écrit :
>>
>> Dear Steve,
>>
>> I was charging around like a mad thing yesterday and sent the
>> submission in something of a hurry. Thanks for pointing out the
>> omission so quickly.
>>
>> Please find the patch attached.
>>
>> Cheers
>>
>> Paul
>>
>



-- 
Outside of a dog, a book is a man's best friend. Inside of a dog it's
too dark to read.

Groucho Marx

[-- Attachment #2: deferred_character_4.f90 --]
[-- Type: text/x-fortran, Size: 779 bytes --]

! { dg-do run }
!
! Check that PR50221 comment #4 is fixed.
!
! Contributed by Arjen Makus  <arjen.markus895@gmail.com>
!
program chk_alloc_string
    implicit none

    character(len=:), dimension(:), allocatable :: strings
    integer :: i

    allocate( character(10):: strings(1:3) )

    strings = [ "A   ", "C   ", "ABCD", "V   " ]

    if (len(strings) .ne. 4) call abort
    if (size(strings, 1) .ne. 4) call abort
    if (any (strings .ne. [character(len=4) :: "A", "C", "ABCD", "V"])) call abort

    strings = [character(len=4) :: "A", "C", "ABCDE", "V", "zzzz"]

    if (len(strings) .ne. 4) call abort
    if (size(strings, 1) .ne. 5) call abort
    if (any (strings .ne. [character(len=4) :: "A", "C", "ABCD", "V", "zzzz"])) call abort
end program chk_alloc_string

[-- Attachment #3: deferred_character_5.f90 --]
[-- Type: text/x-fortran, Size: 651 bytes --]

! { dg-do run }
!
! Tests that PR63932 stays fixed.
!
! Contributed by Valery Weber  <valeryweber@hotmail.com>
!
module mod
  type :: t
     character(:), allocatable :: c
     integer :: i
   contains
     procedure, pass :: get
  end type t
  type :: u
     character(:), allocatable :: c
  end type u
contains
  subroutine get(this, a)
    class(t), intent(in) :: this
    character(:), allocatable, intent(out), optional :: a
    if (present (a)) a = this%c
  end subroutine get
end module mod

program test
  use mod
  type(t) :: a
  type(u) :: b
  a%c = 'something'
  call a%get (a = b%c)
  if (b%c .ne. 'something') call abort
end program test

[-- Attachment #4: deferred_character_6.f90 --]
[-- Type: text/x-fortran, Size: 1137 bytes --]

! { dg-do run }
!
! Tests that PR66408 stays fixed.
!
! Contributed by <werner.blokbuster@gmail.com>
!
module mytest

    implicit none

    type vary
        character(:), allocatable :: string
    end type vary

    interface assignment(=)
        module procedure char_eq_vary
    end interface assignment(=)

contains

    subroutine char_eq_vary(my_char,my_vary)
        character(:), allocatable, intent(out) :: my_char
        type(vary), intent(in) :: my_vary
        my_char = my_vary%string
    end subroutine char_eq_vary

end module mytest


program thistest

    use mytest, only: vary, assignment(=)
    implicit none

    character(:), allocatable :: test_char
    character(14), parameter :: str = 'example string'
    type(vary) :: test_vary
    type(vary) :: my_stuff


    test_vary%string = str
    if (test_vary%string .ne. str) call abort

! This previously gave a blank string.
    my_stuff%string = test_vary
    if (my_stuff%string .ne. str) call abort

    test_char = test_vary
    if (test_char .ne. str) call abort

    my_stuff = test_vary
    if (my_stuff%string .ne. str) call abort

end program thistest

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Patch, fortran] Bug 68241 - [meta-bug] Deferred-length character - PRs50221, 68216 and 67674
  2015-11-12 13:14       ` Paul Richard Thomas
@ 2015-11-12 18:56         ` Dominique d'Humières
  2015-11-13 14:16           ` Dominique d'Humières
  0 siblings, 1 reply; 8+ messages in thread
From: Dominique d'Humières @ 2015-11-12 18:56 UTC (permalink / raw)
  To: Paul Richard Thomas; +Cc: Steve Kargl, fortran, Damian Rouson, Louis Krupp

Paul,

Quick test: your attached tests works with a manual checking. However if I do the following changes in deferred_character_4.f90

--- /opt/gcc/work/gcc/testsuite/gfortran.dg/deferred_character_4.f90	2015-11-12 19:49:04.000000000 +0100
+++ deferred_character_4_db.f90	2015-11-12 19:52:08.000000000 +0100
@@ -18,9 +18,11 @@ program chk_alloc_string
     if (size(strings, 1) .ne. 4) call abort
     if (any (strings .ne. [character(len=4) :: "A", "C", "ABCD", "V"])) call abort
 
-    strings = [character(len=4) :: "A", "C", "ABCDE", "V", "zzzz"]
+!    strings = [character(len=4) :: "A", "C", "ABCDE", "V", "zzzz"]
+    strings = [character(len=4) :: "A", "C", "ABCDE", "V"]
 
     if (len(strings) .ne. 4) call abort
     if (size(strings, 1) .ne. 5) call abort
-    if (any (strings .ne. [character(len=4) :: "A", "C", "ABCD", "V", "zzzz"])) call abort
+!    if (any (strings .ne. [character(len=4) :: "A", "C", "ABCD", "V", "zzzz"])) call abort
+    if (any (strings .ne. [character(len=4) :: "A", "C", "ABCD", "V"])) call abort
 end program chk_alloc_string

the program aborts.

Dominique

> Le 12 nov. 2015 à 14:14, Paul Richard Thomas <paul.richard.thomas@gmail.com> a écrit :
> 
> Hi Dominique,
> 
> Are you sure about pr50221 #4? It runs fine for me.
> 
> I have attached the testcases for PRs 50221#4, 63932, and 66408. I
> propose to add these to the commit, once I get approval.....
> 
> I have a further patch for pr49954, which nearly fixes the testcase in
> the PR but is not quite there. However, concatenation is in general
> fixed, when there is no dependency. When there is, the lhs string
> lengt gets updated before the concatenation, thereby shifting the op2
> part of the concatenation. It'll be another few days....
> 
> Cheers
> 
> Paul

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Patch, fortran] Bug 68241 - [meta-bug] Deferred-length character - PRs50221, 68216 and 67674
  2015-11-12 18:56         ` Dominique d'Humières
@ 2015-11-13 14:16           ` Dominique d'Humières
  2015-11-13 15:32             ` Dominique d'Humières
  0 siblings, 1 reply; 8+ messages in thread
From: Dominique d'Humières @ 2015-11-13 14:16 UTC (permalink / raw)
  To: Paul Richard Thomas; +Cc: Steve Kargl, fortran, Damian Rouson, Louis Krupp

Dear Paul,

Indeed the abort is due to the fact that I did not update the line

    if (size(strings, 1) .ne. 5) call abort

If I do, I dont get any abort. However with the updated patch

--- /opt/gcc/work/gcc/testsuite/gfortran.dg/deferred_character_4.f90	2015-11-12 19:49:04.000000000 +0100
+++ deferred_character_4_db.f90	2015-11-13 15:10:51.000000000 +0100
@@ -18,9 +18,14 @@ program chk_alloc_string
     if (size(strings, 1) .ne. 4) call abort
     if (any (strings .ne. [character(len=4) :: "A", "C", "ABCD", "V"])) call abort
 
-    strings = [character(len=4) :: "A", "C", "ABCDE", "V", "zzzz"]
+!    strings = [character(len=4) :: "A", "C", "ABCDE", "V", "zzzz"]
+    strings = [character(len=4) :: "A", "C", "ABCDE", "V"]
 
+    print *, len(strings), size(strings, 1)
+    print *, strings
     if (len(strings) .ne. 4) call abort
-    if (size(strings, 1) .ne. 5) call abort
-    if (any (strings .ne. [character(len=4) :: "A", "C", "ABCD", "V", "zzzz"])) call abort
+!    if (size(strings, 1) .ne. 5) call abort
+    if (size(strings, 1) .ne. 4) call abort
+!    if (any (strings .ne. [character(len=4) :: "A", "C", "ABCD", "V", "zzzz"])) call abort
+    if (any (strings .ne. [character(len=4) :: "A", "C", "ABCD", "V"])) call abort
 end program chk_alloc_string

the result of "print *, strings" is

 A   CDV ?

Dominique

> Le 12 nov. 2015 à 19:56, Dominique d'Humières <dominiq@lps.ens.fr> a écrit :
> 
> /opt/gcc/work/gcc/testsuite/gfortran.dg/deferred_character_4.f90

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Patch, fortran] Bug 68241 - [meta-bug] Deferred-length character - PRs50221, 68216 and 67674
  2015-11-13 14:16           ` Dominique d'Humières
@ 2015-11-13 15:32             ` Dominique d'Humières
  0 siblings, 0 replies; 8+ messages in thread
From: Dominique d'Humières @ 2015-11-13 15:32 UTC (permalink / raw)
  To: Paul Richard Thomas; +Cc: Steve Kargl, fortran, Damian Rouson, Louis Krupp

    do i = 1, size(strings, 1)
      print *, "'",strings(i),"'"
    end do

gives

 'A   '
 'C   '
 'ABCD'
 'V   ‘

print *, (strings(i), i= 1, size(strings, 1))

gives

"A   C   ABCDV   "   (double quotes added)

Both outputs seem correct, but

print *, strings

gives

" A   CDV ? »

and

print '(a)', strings

gives

A   
CDV 
?

i.e., four lines, the three last ones being wrong.

Dominique

> Le 13 nov. 2015 à 15:16, Dominique d'Humières <dominiq@lps.ens.fr> a écrit :
> 
> deferred_character_4_db.f90

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2015-11-13 15:32 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-11-09 13:38 [Patch, fortran] Bug 68241 - [meta-bug] Deferred-length character - PRs50221, 68216 and 67674 Paul Richard Thomas
2015-11-09 14:46 ` Steve Kargl
2015-11-10  9:48   ` Paul Richard Thomas
2015-11-10 15:39     ` Dominique d'Humières
2015-11-12 13:14       ` Paul Richard Thomas
2015-11-12 18:56         ` Dominique d'Humières
2015-11-13 14:16           ` Dominique d'Humières
2015-11-13 15:32             ` Dominique d'Humières

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).