summaryrefslogtreecommitdiff
path: root/gcc/fortran/resolve.c
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2017-11-20 16:02:55 +0000
committerRichard Sandiford <richard.sandiford@linaro.org>2017-11-20 16:02:55 +0000
commitd58952aefb03632bbb5b441d5c0bd330711f0af1 (patch)
treed046e56bfbd6a40106ae6ab96fafc954f1dfc955 /gcc/fortran/resolve.c
parent648f8fc59b2cc39abd24f4c22388b346cdebcc31 (diff)
parent50221fae802a10fafe95e61d40504a58da33e98f (diff)
downloadgcc-linaro-dev/sve.tar.gz
Merge trunk into svelinaro-dev/sve
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r--gcc/fortran/resolve.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 40c1cd3c96f..bdb4015b34d 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);
@@ -10324,7 +10326,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
@@ -13496,6 +13499,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 +14081,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;
}
@@ -15266,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;
}
@@ -15943,7 +15963,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;