http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51434

--- Comment #5 from Steve Kargl <sgk at troutmask dot apl.washington.edu> 
2011-12-06 15:47:41 UTC ---
On Tue, Dec 06, 2011 at 06:40:07AM +0000, andy.nelson at lanl dot gov wrote:
> 
> character(c_char) :: raidnum(lenname) = &
> &  (/ 'r','a','i','d','n','u','m',.....  /)
> 
> Is this what you thought I was trying to do?
> Is what I am trying to do actually
> legal (would tend to think so atm, since pgi and intel don't have similar
> problems)?

What does 'character(c_char)' above declare?

What you have is an array of strings with each
string having a length of c_char.

R424 char-selector is length-selector
         or ( LEN = type-param-value ,
              KIND = scalar-int-initialization-expr )
         or ( type-param-value ,
              [ KIND = ] scalar-int-initialization-expr )
         or ( KIND = scalar-int-initialization-expr
              [ , LEN =type-param-value ] )

R425 length-selector is ( [ LEN = ] type-param-value )
         or * char-length [ , ]

Let nlen be the length and nknd the kind, you want to 
have one of the following forms:

character(len=nlen, kind=nknd) ...
character(nlen, kind=nknd) ...
character(len=nlen, nknd) ...
character(nlen, nknd) ...
character(kind=nknd) ...
character(kind=nknd, len=nlen) ...

For your case, nlen=1 and nknd=c_char.

As shown by Tobias, even if you fix your declarations, your
code will fail.

PS: I suspect yor code works with ifort and pgi because 
c_char is probably 1, default character kind is 1, and
these compilers only support a single character kind.  So,
you accidentally get want you want. 

PPS: Yes, I would use an ugly explicit array to do the
initializaton instead of transfer.  First, the explicit
array is clear and easy to understand.  Second, although
transfer should work, it is one ugly piece of code 
under the hood.

Reply via email to