From cc5943136ccb41123914dc4055d3c5e4c7eb0865 Mon Sep 17 00:00:00 2001 From: pault Date: Sun, 5 Nov 2017 12:38:42 +0000 Subject: 2017-11-05 Paul Thomas 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 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@254427 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/resolve.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'gcc/fortran/resolve.c') diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 40c1cd3c96f..50b4b49fe97 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; -- cgit v1.2.1 From 27146a8d6a6c72e209681e159327102c4470d013 Mon Sep 17 00:00:00 2001 From: pault Date: Sun, 5 Nov 2017 14:32:05 +0000 Subject: 2017-11-05 Paul Thomas PR fortran/78641 * resolve.c (resolve_ordinary_assign): Do not add the _data component for class valued array constructors being assigned to derived type arrays. * trans-array.c (gfc_trans_array_ctor_element): Take the _data of class valued elements for assignment to derived type arrays. 2017-11-05 Paul Thomas PR fortran/78641 * gfortran.dg/class_66.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@254428 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/resolve.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'gcc/fortran/resolve.c') diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 50b4b49fe97..1dde0d3ce1a 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -10324,7 +10324,8 @@ resolve_ordinary_assign (gfc_code *code, gfc_namespace *ns) /* Assign the 'data' of a class object to a derived type. */ if (lhs->ts.type == BT_DERIVED - && rhs->ts.type == BT_CLASS) + && rhs->ts.type == BT_CLASS + && rhs->expr_type != EXPR_ARRAY) gfc_add_data_component (rhs); bool caf_convert_to_send = flag_coarray == GFC_FCOARRAY_LIB -- cgit v1.2.1 From 179137d80882c7b6b58ee59eacf56fe6f8cc7596 Mon Sep 17 00:00:00 2001 From: janus Date: Sat, 11 Nov 2017 21:54:41 +0000 Subject: 2017-11-11 Janus Weil PR fortran/82932 * resolve.c (update_compcall_arglist): Improve error recovery, remove a gcc_assert. 2017-11-11 Janus Weil PR fortran/82932 * gfortran.dg/typebound_call_29.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@254660 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/resolve.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'gcc/fortran/resolve.c') diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 1dde0d3ce1a..28a0c9e74b0 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -5834,7 +5834,9 @@ update_compcall_arglist (gfc_expr* e) return true; } - gcc_assert (tbp->pass_arg_num > 0); + if (tbp->pass_arg_num <= 0) + return false; + e->value.compcall.actual = update_arglist_pass (e->value.compcall.actual, po, tbp->pass_arg_num, tbp->pass_arg); -- cgit v1.2.1 From f1e4e020706d2761e2860b8bad1e5689b64c2211 Mon Sep 17 00:00:00 2001 From: foreese Date: Tue, 14 Nov 2017 01:25:26 +0000 Subject: 2017-11-13 Fritz Reese PR fortran/78240 gcc/fortran/ChangeLog: PR fortran/78240 * decl.c (match_clist_expr): Replace gcc_assert with proper handling of bad result from spec_size(). * resolve.c (check_data_variable): Avoid NULL dereference when passing locus to gfc_error. gcc/testsuite/ChangeLog: PR fortran/78240 * gfortran.dg/dec_structure_23.f90: New. * gfortran.dg/pr78240.f90: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@254718 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/resolve.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gcc/fortran/resolve.c') diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 28a0c9e74b0..bdb4015b34d 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -15286,7 +15286,7 @@ check_data_variable (gfc_data_variable *var, locus *where) if (!gfc_array_size (e, &size)) { gfc_error ("Nonconstant array section at %L in DATA statement", - &e->where); + where); mpz_clear (offset); return false; } -- cgit v1.2.1