https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77506

            Bug ID: 77506
           Summary: stamdard for f2008 does not allow CHARACTER(LEN=*) in
                    array constructor
           Product: gcc
           Version: 5.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: urbanjost at comcast dot net
  Target Milestone: ---

I posted to fortran.comp.org a question on whether LEN=* was allowed in an
array
constructor. The concensus as that it is not standard, but gfortran 5.0.4
allows it without reporting it when -std=f2008 option is used. The dialog from
the newgroup (including two very short example programs) follows:


Can "CHARACTER(LEN=*)" be used in an array constructor? 

 The standard appears to state strings have to be the same length in an array
constructor 
 unless a length type parameter is specified (NOTE 4.74).  And a type-spec
cannot contain 
 a deferred type parameter LEN=:. I thought that C418 also prohibited LEN=*,
but 
 gfortran 5.4.0 appears to allow LEN=* as a length type parameter. Is this an
extension 
 or standard?  If standard, should the resulting length of the elements be
determined by 
 the longest value in the array constructor or by the length of the first
element or must 
 all values be the same length? This test program and it's output shows that in
this 
 particular programming environment (gfortran 5.4.0) that LEN=* is allowed and
that the 
 resulting array has elements trimmed to the length of the first element length 
 when the elements in the constructor are deferred length. 

 More specifically, can anyone clarify if the following is a standard program? 
> 
>   character(len=:),allocatable :: textblock(:) 
>   ! constants of same length 
>   ! does LEN=* violate C418? 
>   textblock=[ character(len=*) :: 'abc   ', '123456'] 
>   write(*,'(a)')textblock 
>   end 
> 
>   Output is: 
>   abc 
>   123456 
> 
 Or, is this standard? 
>   character(len=:),allocatable :: all1,all2 
>   ! deferred of different lengths in this case 
>   all1='ABC' 
>   all2='abcdefghij' 
>   textblock=[ character(len=*) :: all1, all2] 
>   write(*,'(a)')textblock 
>   end 
> 
Output is: 
>   abc 
>   ABC 

References: 
> 
>    NOTE 4.74 
>    An example of an array constructor that specifies a length type parameter: 
> 
>       [ CHARACTER(LEN=7) :: 'Takata', 'Tanaka', 'Hayashi' ] 
> 
>    In this constructor, without the type specification, it would have been 
> necessary to specify all of the constants 
>    with the same character length. 
> 

> C418  (R420 R421 R422) A type-param-value of * shall be used only 
>     · to declare a dummy argument, 
>     · to declare a named constant, 
>     · in the type-spec of an ALLOCATE statement wherein each allocate-object 
> is a dummy argument of type 
>       CHARACTER with an assumed character length, 
>     · in the type-spec or derived-type-spec of a type guard statement 
> (8.1.9), or 
>     · in an external function, to declare the character length parameter of 
> the function result. 

!XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 

Ian Harvey   

Sep 6 (34 minutes ago) 

That use of LEN=* is not standard conforming - as the constraint you 
mention and quote below indicates. 

I expect that the lack of diagnostic is just an oversight with that 
compiler, rather than a deliberate extension. 

(Another compiler I tried died with an ICE, so it is a common oversight!) 

The normative requirement for the items in an array constructor to have 
the same corresponding length parameters, in the absence of a leading 
/type-spec/, is in F2008 4.8p2, as modified by TC2. 

None of the programs are conforming, because of the above.

Reply via email to