diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2017-11-05 12:38:42 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2017-11-05 12:38:42 +0000 |
commit | aea5e9327a49bc73878a547d490bb32ac31df03e (patch) | |
tree | 428d69f0ccf3b22d6da4975c720054a5586d124f | |
parent | ba89e5d5a7c35ff158e749b503c017921a9dbcbc (diff) | |
download | gcc-aea5e9327a49bc73878a547d490bb32ac31df03e.zip gcc-aea5e9327a49bc73878a547d490bb32ac31df03e.tar.gz gcc-aea5e9327a49bc73878a547d490bb32ac31df03e.tar.bz2 |
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
-rw-r--r-- | gcc/fortran/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/fortran/resolve.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 21 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/alloc_comp_basics_1.f90 | 2 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/allocatable_scalar_9.f90 | 16 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/auto_dealloc_1.f90 | 4 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/class_65.f90 | 41 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/coarray_lib_realloc_1.f90 | 8 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/finalize_28.f90 | 2 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/move_alloc_15.f90 | 4 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/typebound_proc_27.f03 | 8 |
11 files changed, 112 insertions, 23 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 008d86f..1a4da46 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,13 @@ +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 diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 40c1cd3..50b4b49 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -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; } @@ -15943,7 +15960,7 @@ resolve_equivalence (gfc_equiv *eq) { gfc_use_rename *r; for (r = sym->ns->use_stmts->rename; r; r = r->next) - if (strcmp(r->use_name, sym->name) == 0) saw_sym = true; + if (strcmp(r->use_name, sym->name) == 0) saw_sym = true; } else saw_sym = true; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e4ab159..993dca9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,24 @@ +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. diff --git a/gcc/testsuite/gfortran.dg/alloc_comp_basics_1.f90 b/gcc/testsuite/gfortran.dg/alloc_comp_basics_1.f90 index 0b5ef27..44d1c8b 100644 --- a/gcc/testsuite/gfortran.dg/alloc_comp_basics_1.f90 +++ b/gcc/testsuite/gfortran.dg/alloc_comp_basics_1.f90 @@ -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" } } diff --git a/gcc/testsuite/gfortran.dg/allocatable_scalar_9.f90 b/gcc/testsuite/gfortran.dg/allocatable_scalar_9.f90 index d36175c..802c5f7 100644 --- a/gcc/testsuite/gfortran.dg/allocatable_scalar_9.f90 +++ b/gcc/testsuite/gfortran.dg/allocatable_scalar_9.f90 @@ -5,13 +5,13 @@ ! ! Contributed by Tobias Burnus <burnus@gcc.gnu.org> -module m -type st - integer , allocatable :: a1 -end type st -type at - integer , allocatable :: a2(:) -end type at +module m +type st + integer , allocatable :: a1 +end type st +type at + integer , allocatable :: a2(:) +end type at type t1 type(st), allocatable :: b1 @@ -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" } } diff --git a/gcc/testsuite/gfortran.dg/auto_dealloc_1.f90 b/gcc/testsuite/gfortran.dg/auto_dealloc_1.f90 index 4f15bcd..99ecd1d 100644 --- a/gcc/testsuite/gfortran.dg/auto_dealloc_1.f90 +++ b/gcc/testsuite/gfortran.dg/auto_dealloc_1.f90 @@ -50,7 +50,7 @@ contains m%k%i = 45 end subroutine -end module +end module -! { dg-final { scan-tree-dump-times "__builtin_free" 4 "original" } } +! { dg-final { scan-tree-dump-times "__builtin_free" 10 "original" } } diff --git a/gcc/testsuite/gfortran.dg/class_65.f90 b/gcc/testsuite/gfortran.dg/class_65.f90 new file mode 100644 index 0000000..a82918c --- /dev/null +++ b/gcc/testsuite/gfortran.dg/class_65.f90 @@ -0,0 +1,41 @@ +! { 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 diff --git a/gcc/testsuite/gfortran.dg/coarray_lib_realloc_1.f90 b/gcc/testsuite/gfortran.dg/coarray_lib_realloc_1.f90 index c55507b..559d880 100644 --- a/gcc/testsuite/gfortran.dg/coarray_lib_realloc_1.f90 +++ b/gcc/testsuite/gfortran.dg/coarray_lib_realloc_1.f90 @@ -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" } } diff --git a/gcc/testsuite/gfortran.dg/finalize_28.f90 b/gcc/testsuite/gfortran.dg/finalize_28.f90 index 03de5d0..f0c9665 100644 --- a/gcc/testsuite/gfortran.dg/finalize_28.f90 +++ b/gcc/testsuite/gfortran.dg/finalize_28.f90 @@ -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" } } diff --git a/gcc/testsuite/gfortran.dg/move_alloc_15.f90 b/gcc/testsuite/gfortran.dg/move_alloc_15.f90 index 1c96ccb..0c8cacf 100644 --- a/gcc/testsuite/gfortran.dg/move_alloc_15.f90 +++ b/gcc/testsuite/gfortran.dg/move_alloc_15.f90 @@ -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" } } diff --git a/gcc/testsuite/gfortran.dg/typebound_proc_27.f03 b/gcc/testsuite/gfortran.dg/typebound_proc_27.f03 index 29332c4..0648494 100644 --- a/gcc/testsuite/gfortran.dg/typebound_proc_27.f03 +++ b/gcc/testsuite/gfortran.dg/typebound_proc_27.f03 @@ -1,6 +1,6 @@ ! { dg-do run } ! { dg-options "-fdump-tree-original" } -! +! ! PR fortran/47586 ! Missing deep copy for data pointer returning functions when the type ! has allocatable components @@ -77,15 +77,15 @@ 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. ! { dg-final { scan-tree-dump-times "__builtin_realloc" 6 "original" } } -! +! ! 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" } } ! |