aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2024-11-24 08:50:58 +0000
committerPaul Thomas <pault@gcc.gnu.org>2024-11-24 08:50:58 +0000
commitdd6dbbb5111fba960ad0ee7999a225783e0ae80e (patch)
tree4859fa586938a82e1b43bd56c372f5419baf3278 /gcc/fortran
parentbbe9ff74c86904e1e6be81aa099b6298e386fc9f (diff)
downloadgcc-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.cc5
-rw-r--r--gcc/fortran/resolve.cc4
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);