public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug fortran/41539] [OOP] Calling function which takes CLASS: Rank comparison does not work
[not found] <bug-41539-4@http.gcc.gnu.org/bugzilla/>
@ 2011-12-11 20:45 ` pault at gcc dot gnu.org
2011-12-12 8:03 ` burnus at gcc dot gnu.org
1 sibling, 0 replies; 5+ messages in thread
From: pault at gcc dot gnu.org @ 2011-12-11 20:45 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41539
--- Comment #6 from Paul Thomas <pault at gcc dot gnu.org> 2011-12-11 20:42:29 UTC ---
Author: pault
Date: Sun Dec 11 20:42:23 2011
New Revision: 182210
URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=182210
Log:
2011-12-11 Paul Thomas <pault@gcc.gnu.org>
Tobias Burnus <burnus@gcc.gnu.org>
PR fortran/41539
PR fortran/43214
PR fortran/43969
PR fortran/44568
PR fortran/46356
PR fortran/46990
PR fortran/49074
* interface.c(symbol_rank): Return the rank of the _data
component of class objects.
(compare_parameter): Also compare the derived type of the class
_data component for type mismatch. Similarly, return 1 if the
formal and _data ranks match.
(compare_actual_formal): Do not compare storage sizes for class
expressions. It is an error if an actual class array, passed to
a formal class array is not full.
* trans-expr.c (gfc_class_data_get, gfc_class_vptr_get,
gfc_vtable_field_get, gfc_vtable_hash_get, gfc_vtable_size_get,
gfc_vtable_extends_get, gfc_vtable_def_init_get,
gfc_vtable_copy_get): New functions for class API.
(gfc_conv_derived_to_class): For an array reference in an
elemental procedure call retain the ss to provide the
scalarized array reference. Moved in file.
(gfc_conv_class_to_class): New function.
(gfc_conv_subref_array_arg): Use the type of the
class _data component as a basetype.
(gfc_conv_procedure_call): Ensure that class array expressions
have both the _data reference and an array reference. Use
gfc_conv_class_to_class to handle class arrays for elemental
functions in scalarized loops, class array elements and full
class arrays. Use a call to gfc_conv_subref_array_arg in order
that the copy-in/copy-out for passing class arrays to derived
type arrays occurs correctly.
(gfc_conv_expr): If it is missing, add the _data component
between a class object or component and an array reference.
(gfc_trans_class_array_init_assign): New function.
(gfc_trans_class_init_assign): Call it for array expressions.
* trans-array.c (gfc_add_loop_ss_code): Do not use a temp for
class scalars since their size will depend on the dynamic type.
(build_class_array_ref): New function.
(gfc_conv_scalarized_array_ref): Call build_class_array_ref.
(gfc_array_init_size): Add extra argument, expr3, that represents
the SOURCE argument. If present,use this for the element size.
(gfc_array_allocate): Also add argument expr3 and use it when
calling gfc_array_init_size.
(structure_alloc_comps): Enable class arrays.
* class.c (gfc_add_component_ref): Carry over the derived type
of the _data component.
(gfc_add_class_array_ref): New function.
(class_array_ref_detected): New static function.
(gfc_is_class_array_ref): New function that calls previous.
(gfc_is_class_scalar_expr): New function.
(gfc_build_class_symbol): Throw not implemented error for
assumed size class arrays. Remove error that prevents
CLASS arrays.
(gfc_build_class_symbol): Prevent pointer/allocatable conflict.
Also unset codimension.
(gfc_find_derived_vtab): Make 'copy' elemental and set the
intent of the arguments accordingly.:
* trans-array.h : Update prototype for gfc_array_allocate.
* array.c (gfc_array_dimen_size): Return failure if class expr.
(gfc_array_size): Likewise.
* gfortran.h : New prototypes for gfc_add_class_array_ref,
gfc_is_class_array_ref and gfc_is_class_scalar_expr.
* trans-stmt.c (trans_associate_var): Exclude class targets
from test. Move the allocation of the _vptr to an earlier time
for class objects.
(trans_associate_var): Assign the descriptor directly for class
arrays.
(gfc_trans_allocate): Add expr3 to gfc_array_allocate arguments.
Convert array element references into sections. Do not invoke
gfc_conv_procedure_call, use gfc_trans_call instead.
* expr.c (gfc_get_corank): Fix for BT_CLASS.
(gfc_is_simply_contiguous): Exclude class from test.
* trans.c (gfc_build_array_ref): Include class array refs.
* trans.h : Include prototypes for class API functions that are
new in trans-expr. Define GFC_DECL_CLASS(node).
* resolve.c (check_typebound_baseobject ): Remove error for
non-scalar base object.
(resolve_allocate_expr): Ensure that class _data component is
present. If array, call gfc_expr_to_intialize.
(resolve_select): Remove scalar error for SELECT statement as a
temporary measure.
(resolve_assoc_var): Update 'target' (aka 'selector') as
needed. Ensure that the target expression has the right rank.
(resolve_select_type): Ensure that target expressions have a
valid locus.
(resolve_allocate_expr, resolve_fl_derived0): Fix for BT_CLASS.
* trans-decl.c (gfc_get_symbol_decl): Set GFC_DECL_CLASS, where
appropriate.
(gfc_trans_deferred_vars): Get class arrays right.
* match.c(select_type_set_tmp): Add array spec to temporary.
(gfc_match_select_type): Allow class arrays.
* check.c (array_check): Ensure that class arrays have refs.
(dim_corank_check, dim_rank_check): Retrun success if class.
* primary.c (gfc_match_varspec): Fix for class arrays and
co-arrays. Make sure that class _data is present.
(gfc_match_rvalue): Handle class arrays.
*trans-intrinsic.c (gfc_conv_intrinsic_size): Add class array
reference.
(gfc_conv_allocated): Add _data component to class expressions.
(gfc_add_intrinsic_ss_code): ditto.
* simplify.c (simplify_cobound): Fix for BT_CLASS.
(simplify_bound): Return NULL for class arrays.
(simplify_cobound): Obtain correct array_spec. Use cotype as
appropriate. Use arrayspec for bounds.
2011-12-11 Paul Thomas <pault@gcc.gnu.org>
Tobias Burnus <burnus@gcc.gnu.org>
PR fortran/41539
PR fortran/43214
PR fortran/43969
PR fortran/44568
PR fortran/46356
PR fortran/46990
PR fortran/49074
* gfortran.dg/class_array_1.f03: New.
* gfortran.dg/class_array_2.f03: New.
* gfortran.dg/class_array_3.f03: New.
* gfortran.dg/class_array_4.f03: New.
* gfortran.dg/class_array_5.f03: New.
* gfortran.dg/class_array_6.f03: New.
* gfortran.dg/class_array_7.f03: New.
* gfortran.dg/class_array_8.f03: New.
* gfortran.dg/coarray_poly_1.f90: New.
* gfortran.dg/coarray_poly_2.f90: New.
* gfortran.dg/coarray/poly_run_1.f90: New.
* gfortran.dg/coarray/poly_run_2.f90: New.
* gfortran.dg/class_to_type_1.f03: New.
* gfortran.dg/type_to_class_1.f03: New.
* gfortran.dg/typebound_assignment_3.f03: Remove the error.
* gfortran.dg/auto_dealloc_2.f90: Occurences of __builtin_free
now 2.
* gfortran.dg/class_19.f03: Occurences of __builtin_free now 8.
Added:
trunk/gcc/testsuite/gfortran.dg/class_array_1.f03
trunk/gcc/testsuite/gfortran.dg/class_array_2.f03
trunk/gcc/testsuite/gfortran.dg/class_array_3.f03
trunk/gcc/testsuite/gfortran.dg/class_array_4.f03
trunk/gcc/testsuite/gfortran.dg/class_array_5.f03
trunk/gcc/testsuite/gfortran.dg/class_array_6.f03
trunk/gcc/testsuite/gfortran.dg/class_array_7.f03
trunk/gcc/testsuite/gfortran.dg/class_array_8.f03
trunk/gcc/testsuite/gfortran.dg/class_to_type_1.f03
trunk/gcc/testsuite/gfortran.dg/coarray/poly_run_1.f90
trunk/gcc/testsuite/gfortran.dg/coarray/poly_run_2.f90
trunk/gcc/testsuite/gfortran.dg/coarray_poly_1.f90
trunk/gcc/testsuite/gfortran.dg/coarray_poly_2.f90
trunk/gcc/testsuite/gfortran.dg/type_to_class_1.f03
Modified:
trunk/gcc/fortran/ChangeLog
trunk/gcc/fortran/array.c
trunk/gcc/fortran/check.c
trunk/gcc/fortran/class.c
trunk/gcc/fortran/expr.c
trunk/gcc/fortran/gfortran.h
trunk/gcc/fortran/interface.c
trunk/gcc/fortran/match.c
trunk/gcc/fortran/primary.c
trunk/gcc/fortran/resolve.c
trunk/gcc/fortran/simplify.c
trunk/gcc/fortran/trans-array.c
trunk/gcc/fortran/trans-array.h
trunk/gcc/fortran/trans-decl.c
trunk/gcc/fortran/trans-expr.c
trunk/gcc/fortran/trans-intrinsic.c
trunk/gcc/fortran/trans-stmt.c
trunk/gcc/fortran/trans.c
trunk/gcc/fortran/trans.h
trunk/gcc/testsuite/ChangeLog
trunk/gcc/testsuite/gfortran.dg/auto_dealloc_2.f90
trunk/gcc/testsuite/gfortran.dg/class_19.f03
trunk/gcc/testsuite/gfortran.dg/typebound_assignment_3.f03
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug fortran/41539] [OOP] Calling function which takes CLASS: Rank comparison does not work
[not found] <bug-41539-4@http.gcc.gnu.org/bugzilla/>
2011-12-11 20:45 ` [Bug fortran/41539] [OOP] Calling function which takes CLASS: Rank comparison does not work pault at gcc dot gnu.org
@ 2011-12-12 8:03 ` burnus at gcc dot gnu.org
1 sibling, 0 replies; 5+ messages in thread
From: burnus at gcc dot gnu.org @ 2011-12-12 8:03 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41539
Tobias Burnus <burnus at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|ASSIGNED |RESOLVED
Resolution| |FIXED
--- Comment #7 from Tobias Burnus <burnus at gcc dot gnu.org> 2011-12-12 07:53:11 UTC ---
FIXED on the 4.7 trunk
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug fortran/41539] New: Calling function which takes CLASS: Rank comparison does not work
@ 2009-10-01 22:02 burnus at gcc dot gnu dot org
2010-03-04 15:00 ` [Bug fortran/41539] [OOP] " pault at gcc dot gnu dot org
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: burnus at gcc dot gnu dot org @ 2009-10-01 22:02 UTC (permalink / raw)
To: gcc-bugs
The following program compiles with ifort and with NAG f95 but fails with
gfortran with:
call qsort(A,tmp)
1
Error: Rank mismatch in argument 'a' at (1) (0 and 1)
( The program was motivated by
http://groups.google.com/group/comp.lang.fortran/msg/cde7f6104f6c29c7 )
module m_qsort
implicit none
type, abstract :: sort_t
contains
procedure(lt_cmp), deferred :: lt_cmp
end type sort_t
interface
logical function lt_cmp(a,b)
import
class(sort_t), intent(in) :: a, b
end function lt_cmp
end interface
contains
subroutine qsort(a,tmp)
class(sort_t), intent(inout) :: a(:),tmp
! Fixme: Replace "tmp" by a local var and "allocate(tmp, source=a)"
end subroutine qsort
end module m_qsort
module test
use m_qsort
implicit none
type, extends(sort_t) :: sort_int_t
integer :: i
contains
procedure :: lt_cmp => lt_cmp_int
end type
contains
logical function lt_cmp_int(a,b) result(cmp)
class(sort_int_t), intent(in) :: a
class(sort_t), intent(in) :: b
select type(b)
type is(sort_int_t)
if (a%i < b%i) then
cmp = .true.
else
cmp = .false.
end if
class default
stop 'Something went wrong'
end select
end function lt_cmp_int
end module test
program main
use test
type(sort_int_t) :: A(5), tmp
A(:)%i = [1 , 4, 5, 2, 3]
print *, A
call qsort(A,tmp)
print *, A
end program main
--
Summary: Calling function which takes CLASS: Rank comparison does
not work
Product: gcc
Version: 4.5.0
Status: UNCONFIRMED
Keywords: rejects-valid
Severity: normal
Priority: P3
Component: fortran
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: burnus at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41539
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2011-12-12 7:53 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <bug-41539-4@http.gcc.gnu.org/bugzilla/>
2011-12-11 20:45 ` [Bug fortran/41539] [OOP] Calling function which takes CLASS: Rank comparison does not work pault at gcc dot gnu.org
2011-12-12 8:03 ` burnus at gcc dot gnu.org
2009-10-01 22:02 [Bug fortran/41539] New: " burnus at gcc dot gnu dot org
2010-03-04 15:00 ` [Bug fortran/41539] [OOP] " pault at gcc dot gnu dot org
2010-03-04 15:00 ` pault at gcc dot gnu dot org
2010-07-15 21:39 ` dfranke at gcc dot gnu dot org
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).