diff options
Diffstat (limited to 'gcc/fortran/trans-decl.c')
-rw-r--r-- | gcc/fortran/trans-decl.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 795057b..100ec18 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -1646,6 +1646,14 @@ gfc_get_extern_function_decl (gfc_symbol * sym) gsym = gfc_find_gsymbol (gfc_gsym_root, sym->binding_label ? sym->binding_label : sym->name); + if (gsym && !gsym->defined) + gsym = NULL; + + /* This can happen because of C binding. */ + if (gsym && gsym->ns && gsym->ns->proc_name + && gsym->ns->proc_name->attr.flavor == FL_MODULE) + goto module_sym; + if ((!sym->attr.use_assoc || sym->attr.if_source != IFSRC_DECL) && !sym->backend_decl && gsym && gsym->ns @@ -1702,12 +1710,19 @@ gfc_get_extern_function_decl (gfc_symbol * sym) if (sym->module) gsym = gfc_find_gsymbol (gfc_gsym_root, sym->module); - if (gsym && gsym->ns && gsym->type == GSYM_MODULE) +module_sym: + if (gsym && gsym->ns + && (gsym->type == GSYM_MODULE + || (gsym->ns->proc_name && gsym->ns->proc_name->attr.flavor == FL_MODULE))) { gfc_symbol *s; s = NULL; - gfc_find_symbol (sym->name, gsym->ns, 0, &s); + if (gsym->type == GSYM_MODULE) + gfc_find_symbol (sym->name, gsym->ns, 0, &s); + else + gfc_find_symbol (gsym->sym_name, gsym->ns, 0, &s); + if (s && s->backend_decl) { if (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS) |