Commit aea5e932 by Paul Thomas

re PR fortran/81447 ([7/8] gfortran fails to recognize the exact dynamic type of…

re PR fortran/81447 ([7/8] gfortran fails to recognize the exact dynamic type of a polymorphic entity that was allocated in a external procedure)

2017-11-05  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/81447
	PR fortran/82783
	* resolve.c (resolve_component): There is no need to resolve
	the components of a use associated vtype.
	(resolve_fl_derived): Unconditionally generate a vtable for any
	module derived type, as long as the standard is F2003 or later
	and it is not a vtype or a PDT template.

2017-11-05  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/81447
	* gfortran.dg/class_65.f90: New test.
	* gfortran.dg/alloc_comp_basics_1.f90: Increase builtin_free
	count from 18 to 21.
	* gfortran.dg/allocatable_scalar_9.f90: Increase builtin_free
	count from 32 to 54.
	* gfortran.dg/auto_dealloc_1.f90: Increase builtin_free
	count from 4 to 10.
	* gfortran.dg/coarray_lib_realloc_1.f90: Increase builtin_free
	count from 3 to 6. Likewise _gfortran_caf_deregister from 2 to
	3, builtin_malloc from 1 to 4 and builtin_memcpy|= MEM from
	2 to 5.
	* gfortran.dg/finalize_28.f90: Increase builtin_free
	count from 3 to 6.
	* gfortran.dg/move_alloc_15.f90: Increase builtin_free and
	builtin_malloc counts from 11 to 14.
	* gfortran.dg/typebound_proc_27.f03: Increase builtin_free
	count from 7 to 10. Likewise builtin_malloc from 12 to 15.

From-SVN: r254427
parent ba89e5d5
2017-11-05 Paul Thomas <pault@gcc.gnu.org>
PR fortran/81447
PR fortran/82783
* resolve.c (resolve_component): There is no need to resolve
the components of a use associated vtype.
(resolve_fl_derived): Unconditionally generate a vtable for any
module derived type, as long as the standard is F2003 or later
and it is not a vtype or a PDT template.
2017-11-05 Tom de Vries <tom@codesourcery.com>
PR other/82784
......
......@@ -13496,6 +13496,9 @@ resolve_component (gfc_component *c, gfc_symbol *sym)
if (c->attr.artificial)
return true;
if (sym->attr.vtype && sym->attr.use_assoc)
return true;
/* F2008, C442. */
if ((!sym->attr.is_class || c != sym->components)
&& c->attr.codimension
......@@ -14075,6 +14078,20 @@ resolve_fl_derived (gfc_symbol *sym)
if (!resolve_typebound_procedures (sym))
return false;
/* Generate module vtables subject to their accessibility and their not
being vtables or pdt templates. If this is not done class declarations
in external procedures wind up with their own version and so SELECT TYPE
fails because the vptrs do not have the same address. */
if (gfc_option.allow_std & GFC_STD_F2003
&& sym->ns->proc_name
&& sym->ns->proc_name->attr.flavor == FL_MODULE
&& sym->attr.access != ACCESS_PRIVATE
&& !(sym->attr.use_assoc || sym->attr.vtype || sym->attr.pdt_template))
{
gfc_symbol *vtab = gfc_find_derived_vtab (sym);
gfc_set_sym_referenced (vtab);
}
return true;
}
......
2017-11-05 Paul Thomas <pault@gcc.gnu.org>
PR fortran/81447
* gfortran.dg/class_65.f90: New test.
* gfortran.dg/alloc_comp_basics_1.f90: Increase builtin_free
count from 18 to 21.
* gfortran.dg/allocatable_scalar_9.f90: Increase builtin_free
count from 32 to 54.
* gfortran.dg/auto_dealloc_1.f90: Increase builtin_free
count from 4 to 10.
* gfortran.dg/coarray_lib_realloc_1.f90: Increase builtin_free
count from 3 to 6. Likewise _gfortran_caf_deregister from 2 to
3, builtin_malloc from 1 to 4 and builtin_memcpy|= MEM from
2 to 5.
* gfortran.dg/finalize_28.f90: Increase builtin_free
count from 3 to 6.
* gfortran.dg/move_alloc_15.f90: Increase builtin_free and
builtin_malloc counts from 11 to 14.
* gfortran.dg/typebound_proc_27.f03: Increase builtin_free
count from 7 to 10. Likewise builtin_malloc from 12 to 15.
2017-11-04 Daniel Santos <daniel.santos@pobox.com>
gcc.target/i386/pr82002-2a.c: Change from xfail to fail.
......
......@@ -141,4 +141,4 @@ contains
end subroutine check_alloc2
end program alloc
! { dg-final { scan-tree-dump-times "builtin_free" 18 "original" } }
! { dg-final { scan-tree-dump-times "builtin_free" 21 "original" } }
......@@ -52,4 +52,4 @@ if(allocated(na4%b4)) call abort()
end block
end
! { dg-final { scan-tree-dump-times "__builtin_free" 32 "original" } }
! { dg-final { scan-tree-dump-times "__builtin_free" 54 "original" } }
......@@ -53,4 +53,4 @@ contains
end module
! { dg-final { scan-tree-dump-times "__builtin_free" 4 "original" } }
! { dg-final { scan-tree-dump-times "__builtin_free" 10 "original" } }
! { dg-do run }
!
! Test the fix for PR81447 in which a vtable was not being created
! in the module 'm' so that x->vptr in 's' did not have the same
! value as that in 'p'.
!
! Contributed by Mat Cross <mathewc@nag.co.uk>
!
Module m
Type :: t
integer :: i
End Type
End Module
Program p
Use m
Class (t), Allocatable :: x
Interface
Subroutine s(x)
Use m
Class (t), Allocatable :: x
End Subroutine
End Interface
Call s(x)
Select Type (x)
Type Is (t)
Continue
Class Is (t)
call abort
Class Default
call abort
End Select
! Print *, 'ok'
End Program
Subroutine s(x)
Use m, Only: t
Implicit None
Class (t), Allocatable :: x
Allocate (t :: x)
End Subroutine
......@@ -21,14 +21,14 @@ x = y
end
! For comp%ii: End of scope of x + y (2x) and for the LHS of the assignment (1x)
! { dg-final { scan-tree-dump-times "__builtin_free" 3 "original" } }
! { dg-final { scan-tree-dump-times "__builtin_free" 6 "original" } }
! For comp%CAF: End of scope of x + y (2x); no LHS freeing for the CAF in assignment
! { dg-final { scan-tree-dump-times "_gfortran_caf_deregister" 2 "original" } }
! { dg-final { scan-tree-dump-times "_gfortran_caf_deregister" 3 "original" } }
! Only malloc "ii":
! { dg-final { scan-tree-dump-times "__builtin_malloc" 1 "original" } }
! { dg-final { scan-tree-dump-times "__builtin_malloc" 4 "original" } }
! But copy "ii" and "CAF":
! { dg-final { scan-tree-dump-times "__builtin_memcpy|= MEM" 2 "original" } }
! { dg-final { scan-tree-dump-times "__builtin_memcpy|= MEM" 5 "original" } }
......@@ -21,4 +21,4 @@ contains
integer, intent(out) :: edges(:,:)
end subroutine coo_dump_edges
end module coo_graphs
! { dg-final { scan-tree-dump-times "__builtin_free" 3 "original" } }
! { dg-final { scan-tree-dump-times "__builtin_free" 6 "original" } }
......@@ -84,5 +84,5 @@ contains
end do
end subroutine
end program name
! { dg-final { scan-tree-dump-times "__builtin_malloc" 11 "original" } }
! { dg-final { scan-tree-dump-times "__builtin_free" 11 "original" } }
! { dg-final { scan-tree-dump-times "__builtin_malloc" 14 "original" } }
! { dg-final { scan-tree-dump-times "__builtin_free" 14 "original" } }
......@@ -77,7 +77,7 @@ end program prog
! statements.
! It is assumed that if the number of allocate is right, the number of
! deep copies is right too.
! { dg-final { scan-tree-dump-times "__builtin_malloc" 12 "original" } }
! { dg-final { scan-tree-dump-times "__builtin_malloc" 15 "original" } }
!
! Realloc are only used for assignments to `that%i'. Don't know why.
......@@ -86,6 +86,6 @@ end program prog
! No leak: Only assignments to `this' use malloc. Assignments to `that%i'
! take the realloc path after the first assignment, so don't count as a malloc.
! { dg-final { scan-tree-dump-times "__builtin_free" 7 "original" } }
! { dg-final { scan-tree-dump-times "__builtin_free" 10 "original" } }
!
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment