This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug fortran/55978] [4.8 Regression] class_optional_2.f90 -Os fails
- From: "janus at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Wed, 06 Feb 2013 10:54:39 +0000
- Subject: [Bug fortran/55978] [4.8 Regression] class_optional_2.f90 -Os fails
- Auto-submitted: auto-generated
- References: <bug-55978-4@http.gcc.gnu.org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55978
--- Comment #16 from janus at gcc dot gnu.org 2013-02-06 10:54:39 UTC ---
(In reply to comment #15)
> (In reply to comment #14)
> > + if (fsym && fsym->attr.optional && sym && sym->attr.pointer)
>
> Shouldn't you use something like
> gfc_expr_attr(expr).pointer
> Otherwise, I fear it will fail for var%comp
Agreed.
> Additionally, one might have to handle
> - unallocated allocatables
> - NULL() [= EXPR_NULL]
> - CLASS(), (pointer|allocatable)?
Huh, good point. Here is an extended test case which tests some of these:
program main
implicit none
integer, pointer :: p(:)
integer, allocatable :: a(:)
type t
integer, pointer :: p(:)
integer, allocatable :: a(:)
end type
type(t) :: d
! (1) pointer
p => null()
call sub(p)
! (2) allocatable
call sub(a)
! (3) pointer component
d%p => null ()
call sub(d%p)
! (4) NULL
call sub(null())
contains
subroutine sub(x)
integer, intent(in), optional :: x(4)
end subroutine
end
In fact the NULL case is rejected with (certainly a bug):
call sub(null())
1
Warning: Actual argument contains too few elements for dummy argument 'x' (1/4)
at (1)
For the allocatable case, no packing is done at all (I guess it's just not
needed there, since an allocatable array, contrary to a pointer, is always
contiguous, right?).
The pointer component case looks completely analogous to the simple pointer
case in the dump, but for some reason I do not see the valgrind errors there.