diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2024-11-24 08:50:58 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2024-11-24 08:50:58 +0000 |
commit | dd6dbbb5111fba960ad0ee7999a225783e0ae80e (patch) | |
tree | 4859fa586938a82e1b43bd56c372f5419baf3278 /gcc/fortran | |
parent | bbe9ff74c86904e1e6be81aa099b6298e386fc9f (diff) | |
download | gcc-dd6dbbb5111fba960ad0ee7999a225783e0ae80e.zip gcc-dd6dbbb5111fba960ad0ee7999a225783e0ae80e.tar.gz gcc-dd6dbbb5111fba960ad0ee7999a225783e0ae80e.tar.bz2 |
Fortran: Fix non_overridable typebound proc problems [PR84674/117730].
2024-11-24 Paul Thomas <pault@gcc.gnu.org>
gcc/fortran/ChangeLog
PR fortran/117730
* class.cc (add_proc_comp): Only reject a non_overridable if it
has no overridden procedure and the component is already
present in the vtype.
PR fortran/84674
* resolve.cc (resolve_fl_derived): Do not build a vtable for a
derived type extension that is completely empty.
gcc/testsuite/ChangeLog
PR fortran/117730
* gfortran.dg/pr117730_a.f90: New test.
* gfortran.dg/pr117730_b.f90: New test.
PR fortran/84674
* gfortran.dg/pr84674.f90: New test.
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/class.cc | 5 | ||||
-rw-r--r-- | gcc/fortran/resolve.cc | 4 |
2 files changed, 7 insertions, 2 deletions
diff --git a/gcc/fortran/class.cc b/gcc/fortran/class.cc index da09d21..59ac0d9 100644 --- a/gcc/fortran/class.cc +++ b/gcc/fortran/class.cc @@ -885,11 +885,12 @@ add_proc_comp (gfc_symbol *vtype, const char *name, gfc_typebound_proc *tb) { gfc_component *c; - if (tb->non_overridable && !tb->overridden) - return; c = gfc_find_component (vtype, name, true, true, NULL); + if (tb->non_overridable && !tb->overridden && c) + return; + if (c == NULL) { /* Add procedure component. */ diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc index b817192..b1740ce 100644 --- a/gcc/fortran/resolve.cc +++ b/gcc/fortran/resolve.cc @@ -16287,6 +16287,10 @@ resolve_fl_derived (gfc_symbol *sym) && sym->ns->proc_name && sym->ns->proc_name->attr.flavor == FL_MODULE && sym->attr.access != ACCESS_PRIVATE + && !(sym->attr.extension + && sym->attr.zero_comp + && !sym->f2k_derived->tb_sym_root + && !sym->f2k_derived->tb_uop_root) && !(sym->attr.vtype || sym->attr.pdt_template)) { gfc_symbol *vtab = gfc_find_derived_vtab (sym); |