Bug 27113 - TODO: Complex array constructors in tonto-2.2
Summary: TODO: Complex array constructors in tonto-2.2
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: fortran (show other bugs)
Version: 4.2.0
: P3 normal
Target Milestone: ---
Assignee: Paul Thomas
URL:
Keywords: FIXME, ice-on-valid-code
Depends on:
Blocks:
 
Reported: 2006-04-11 04:54 UTC by Paul Thomas
Modified: 2006-04-22 15:49 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2006-04-11 17:39:34


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Paul Thomas 2006-04-11 04:54:38 UTC
Compiling tonto-2.2 reveals that structure components cannot be used in array constructors:

   subroutine complex_constructor

     type BASIS_TYPE
       character(len=512) :: label
     end type

     type(BASIS_TYPE), dimension(:), pointer :: var

     call read_library_data_((/var%label/))
   end subroutine complex_constructor

emits..

complex_constructor.f90: In function ‘complex_constructor’:
complex_constructor.f90:1: fatal error: gfc_todo: Not Implemented: complex character array constructors
compilation terminated.

I am on to it....

Paul
Comment 1 Andrew Pinski 2006-04-11 17:39:34 UTC
Confirmed.
Comment 2 Paul Thomas 2006-04-18 16:10:53 UTC
The fix turns out to be almost insulting: One type and one unnecessary gfc_todo (not the original one, by the way!)

Index: gcc/fortran/trans-array.c
===================================================================
*** gcc/fortran/trans-array.c	(revision 112981)
--- gcc/fortran/trans-array.c	(working copy)
*************** gfc_trans_array_constructor_subarray (st
*** 1035,1043 ****
    gfc_copy_loopinfo_to_se (&se, &loop);
    se.ss = ss;
  
-   if (expr->ts.type == BT_CHARACTER)
-     gfc_todo_error ("character arrays in constructors");
- 
    gfc_trans_array_ctor_element (&body, desc, *poffset, &se, expr);
    gcc_assert (se.ss == gfc_ss_terminator);
  
--- 1035,1040 ----
*************** get_array_ctor_var_strlen (gfc_expr * ex
*** 1311,1317 ****
  	  /* Array references don't change the string length.  */
  	  break;
  
! 	case COMPONENT_REF:
  	  /* Use the length of the component.  */
  	  ts = &ref->u.c.component->ts;
  	  break;
--- 1308,1314 ----
  	  /* Array references don't change the string length.  */
  	  break;
  
! 	case REF_COMPONENT:
  	  /* Use the length of the component.  */
  	  ts = &ref->u.c.component->ts;
  	  break;

I will try to compile tonto-2.2 before submitting

Paul
Comment 3 patchapp@dberlin.org 2006-04-18 21:15:16 UTC
Subject: Bug number PR27113

A patch for this bug has been added to the patch tracker.
The mailing list url for the patch is http://gcc.gnu.org/ml/gcc-patches/2006-04/msg00681.html
Comment 4 Paul Thomas 2006-04-21 05:10:28 UTC
Subject: Bug 27113

Author: pault
Date: Fri Apr 21 05:10:22 2006
New Revision: 113133

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=113133
Log:
2006-04-21 Paul Thomas <pault@gcc.gnu.org>

	PR fortran/27122
	* resolve.c (resolve_function): Remove general restriction on auto
	character length function interfaces.
	(gfc_resolve_uops): Check restrictions on defined operator
	procedures.
	(resolve_types): Call the check for defined operators.

	PR fortran/27113
	* trans-array.c (gfc_trans_array_constructor_subarray): Remove
	redundant gfc_todo_error.
	(get_array_ctor_var_strlen): Remove typo in enum.

2006-04-21 Paul Thomas <pault@gcc.gnu.org>

	PR fortran/27122
	* gfortran.dg/defined_operators_1.f90: New test.
	* gfortran.dg/assumed_charlen_function_1.f90: Add new error and
	remove old ones associated, incorrectly, with Note 5.46.

	PR fortran/27113
	* gfortran.dg/character_array_constructor_1.f90: New test.

Added:
    trunk/gcc/testsuite/gfortran.dg/character_array_constructor_1.f90
    trunk/gcc/testsuite/gfortran.dg/defined_operators_1.f90
Modified:
    trunk/gcc/fortran/ChangeLog
    trunk/gcc/fortran/resolve.c
    trunk/gcc/fortran/trans-array.c
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/testsuite/gfortran.dg/assumed_charlen_function_1.f90

Comment 5 Paul Thomas 2006-04-22 15:49:16 UTC
trunk and 4.1 have diverged too far, especially in characters, for the fix to work on 4.1.  I started trying to make up the difference but it is just too much to be worthwhile.

I am marking this as fixed on trunk.

Paul
Comment 6 Paul Thomas 2006-04-23 05:33:25 UTC
Subject: Bug 27113

Author: pault
Date: Sun Apr 23 05:33:16 2006
New Revision: 113191

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=113191
Log:
2006-04-23  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/27122
	* resolve.c (resolve_function): Remove general restriction on auto
	character length function interfaces.
	(gfc_resolve_uops): Check restrictions on defined operator
	procedures.
	(resolve_types): Call the check for defined operators.

	PR fortran/27113
	* trans-array.c (get_array_ctor_var_strlen): Remove typo in enum.
	Part of the fix in 4.2, which does not work in 4.1 because the
	divergence is now too great.

	PR fortran/26822
	* intrinsic.c (add_functions): Mark LOGICAL as elemental.

	PR fortran/26787
	* expr.c (gfc_check_assign): Extend scope of error to include
	assignments to a procedure in the main program or, from a
	module or internal procedure that is not that represented by
	the lhs symbol. Use VARIABLE rather than l-value in message.

	PR fortran/25597
	* trans-decl.c (gfc_trans_deferred_vars): Check if an array
	result, is also automatic character length.  If so, process
	the character length. Note that this fixes the bug in 4.2
	but not here in 4.1 because the trees have diverged too much.
	Manifestly correct, so applied anyway.

	PR fortran/18803
	PR fortran/25669
	PR fortran/26834
	* trans_intrinsic.c (gfc_walk_intrinsic_bound): Set
	data.info.dimen for bound intrinsics.
	* trans_array.c (gfc_conv_ss_startstride): Pick out LBOUND and
	UBOUND intrinsics and supply their shape information to the ss
	and the loop.

	PR fortran/27124
	* trans_expr.c (gfc_trans_function_call):  Add a new block, post,
	in to which all the argument post blocks are put.  Add this block
	to se->pre after a byref call or to se->post, otherwise.

2006-04-23  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/27122
	* gfortran.dg/defined_operators_1.f90: New test.
	* gfortran.dg/assumed_charlen_function_1.f90: Add new error and
	remove old ones associated, incorrectly, with Note 5.46.

	PR fortran/26787
	* gfortran.dg/proc_assign_1.f90: New test.
	* gfortran.dg/procedure_lvalue.f90: Change message.
	* gfortran.dg/namelist_4.f90: Add new error.

	PR fortran/27089
	* gfortran.dg/specification_type_resolution_1.f90

	PR fortran/18803
	PR fortran/25669
	PR fortran/26834
	* gfortran.dg/bounds_temporaries_1.f90: New test.

	PR fortran/27124
	* gfortran.dg/array_return_value_1.f90: New test.



Added:
    branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/array_return_value_1.f90
    branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/bounds_temporaries_1.f90
    branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/defined_operators_1.f90
    branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/proc_assign_1.f90
    branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/specification_type_resolution_1.f90
Modified:
    branches/gcc-4_1-branch/gcc/fortran/ChangeLog
    branches/gcc-4_1-branch/gcc/fortran/expr.c
    branches/gcc-4_1-branch/gcc/fortran/intrinsic.c
    branches/gcc-4_1-branch/gcc/fortran/resolve.c
    branches/gcc-4_1-branch/gcc/fortran/trans-array.c
    branches/gcc-4_1-branch/gcc/fortran/trans-decl.c
    branches/gcc-4_1-branch/gcc/fortran/trans-expr.c
    branches/gcc-4_1-branch/gcc/fortran/trans-intrinsic.c
    branches/gcc-4_1-branch/gcc/testsuite/ChangeLog
    branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/assumed_charlen_function_1.f90
    branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/namelist_4.f90
    branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/procedure_lvalue.f90