This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch, fortran] PR29431 - Not Implemented: complex character array constructors


:ADDPATCH fortran:

This patch permits character functions to be elements of array constructors, as long as the character length is constant. It is a very straightforward addition to trans-array.c. The testcase is a slight mutilation of the reporter's.

Regtested on Suse10.1/amd64.

OK for trunk, 4.2 and 4.1?

Paul

2006-11-08 Paul Thomas <pault@gcc.gnu.org>

   PR fortran/29431
   * trans-array.c    (get_array_ctor_strlen): If we fall through to
   default, use a constant character length if it is available.

2006-11-08 Paul Thomas <pault@gcc.gnu.org>

   PR fortran/29431
   * gfortran.dg/array_constructor_13.f90: New test.



Index: gcc/fortran/trans-array.c
===================================================================
*** gcc/fortran/trans-array.c	(revision 118597)
--- gcc/fortran/trans-array.c	(working copy)
*************** get_array_ctor_strlen (gfc_constructor *
*** 1416,1422 ****
  
  	case EXPR_ARRAY:
  	  if (!get_array_ctor_strlen (c->expr->value.constructor, len))
! 	    is_const = FALSE;
  	  break;
  
  	case EXPR_VARIABLE:
--- 1416,1422 ----
  
  	case EXPR_ARRAY:
  	  if (!get_array_ctor_strlen (c->expr->value.constructor, len))
! 	    is_const = false;
  	  break;
  
  	case EXPR_VARIABLE:
*************** get_array_ctor_strlen (gfc_constructor *
*** 1425,1431 ****
  	  break;
  
  	default:
! 	  is_const = FALSE;
  	  /* TODO: For now we just ignore anything we don't know how to
  	     handle, and hope we can figure it out a different way.  */
  	  break;
--- 1425,1439 ----
  	  break;
  
  	default:
! 	  is_const = false;
! 
! 	  /* Hope that whatever we have possesses a constant character
! 	     length!  */
! 	  if (!(*len && INTEGER_CST_P (*len)) && c->expr->ts.cl)
! 	    {
! 	      gfc_conv_const_charlen (c->expr->ts.cl);
! 	      *len = c->expr->ts.cl->backend_decl;
! 	    }
  	  /* TODO: For now we just ignore anything we don't know how to
  	     handle, and hope we can figure it out a different way.  */
  	  break;
Index: gcc/testsuite/gfortran.dg/array_constructor_13.f90
===================================================================
*** gcc/testsuite/gfortran.dg/array_constructor_13.f90	(revision 0)
--- gcc/testsuite/gfortran.dg/array_constructor_13.f90	(revision 0)
***************
*** 0 ****
--- 1,24 ----
+ ! { dg-do compile }
+ ! Tests patch for PR29431, which arose from PR29373.
+ !
+ ! Contributed by Tobias Schlueter  <tobi@gcc.gnu.org>
+ !
+   implicit none
+   CHARACTER(len=6), DIMENSION(2,2)  :: a
+ 
+ ! Reporters original triggered another error:
+ ! gfc_todo: Not Implemented: complex character array
+ ! constructors.
+ 
+   a = reshape([to_string(1.0), trim("abcdef"), &
+                to_string(7.0), trim("hijklm")], &
+                [2, 2])
+   print *, a
+ 
+   CONTAINS
+     FUNCTION to_string(x)
+       character*6 to_string
+       REAL, INTENT(in) :: x
+       WRITE(to_string, FMT="(F6.3)") x
+     END FUNCTION
+ END PROGRAM

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]