This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug fortran/55763] Issues with some simpler CLASS(*) programs
- From: "burnus at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Fri, 28 Dec 2012 12:26:15 +0000
- Subject: [Bug fortran/55763] Issues with some simpler CLASS(*) programs
- Auto-submitted: auto-generated
- References: <bug-55763-4@http.gcc.gnu.org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55763
--- Comment #9 from Tobias Burnus <burnus at gcc dot gnu.org> 2012-12-28 12:26:15 UTC ---
I think all issues have been fixed, except for the sub-pointer issue, i.e. last
example of comment 0 - see also comment 6.
The following modified version of the last example of comment 0 also uses
sub-pointers, however, it compiles but produces the wrong result. I think one
should quickly check whether that's a bug in CLASS(*) or just a problem with
subpointers. - If the former, we should fix it, if the latter, we can regard
this as WONTFIX (before the new array descriptor) - and close this PR.
With gfortran, it prints:
0.00000000 1.00000000 1.10000002
-1.00000000
while with crayftn it prints:
0., 0.200000003, 0.400000006
-1.
program change_field_type
use, intrinsic :: iso_c_binding
implicit none
REAL(kind=c_float), POINTER :: vector_comp(:)
TYPE, BIND(C) :: scalar_vector
REAL(kind=c_float) :: scalar
REAL(kind=c_float) :: vec(3)
END TYPE
TYPE, BIND(C) :: scalar_vector_matrix
REAL(kind=c_float) :: scalar
REAL(kind=c_float) :: vec(3)
REAL(kind=c_float) :: mat(3,3)
END TYPE
CLASS(*), ALLOCATABLE, TARGET :: one_d_field(:)
real, pointer :: v1(:)
allocate(one_d_field(3), &
source = (/ scalar_vector( 1.0, (/ -1.0, 0.0, 1.0 /) ), &
scalar_vector( 1.1, (/ -1.2, 0.2, 0.9 /) ), &
scalar_vector( 1.2, (/ -1.4, 0.4, 0.8 /) ) /) )
call extract_vec(one_d_field, 1, 2)
print *, vector_comp
deallocate(one_d_field) ! v1 becomes undefined
allocate(one_d_field(1), &
source = (/ scalar_vector_matrix( 1.0, (/ -1.0, 0.0, 1.0 /), &
reshape( (/ 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0 /), &
(/3, 3/) ) ) /) )
call extract_vec(one_d_field, 2, 1)
print *, vector_comp
deallocate(one_d_field) ! v1 becomes undefined
contains
subroutine extract_vec(field, tag, ic)
use, intrinsic :: iso_c_binding
CLASS(*), TARGET :: field(:)
INTEGER(kind=c_int), value :: tag, ic
type(scalar_vector), pointer :: sv(:)
type(scalar_vector_matrix), pointer :: svm(:)
select type (field)
type is (real(c_float))
vector_comp => field
class default
select case (tag)
case (1)
sv => field
vector_comp => sv(:)%vec(ic)
case (2)
svm => field
vector_comp => svm(:)%vec(ic)
end select
end select
end subroutine
end program