diff options
Diffstat (limited to 'gcc/fortran/class.c')
-rw-r--r-- | gcc/fortran/class.c | 49 |
1 files changed, 28 insertions, 21 deletions
diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c index ebbd41b..a08fb8d 100644 --- a/gcc/fortran/class.c +++ b/gcc/fortran/class.c @@ -602,7 +602,8 @@ bool gfc_build_class_symbol (gfc_typespec *ts, symbol_attribute *attr, gfc_array_spec **as) { - char name[GFC_MAX_SYMBOL_LEN+1], tname[GFC_MAX_SYMBOL_LEN+1]; + char tname[GFC_MAX_SYMBOL_LEN+1]; + char *name; gfc_symbol *fclass; gfc_symbol *vtab; gfc_component *c; @@ -633,17 +634,17 @@ gfc_build_class_symbol (gfc_typespec *ts, symbol_attribute *attr, rank = !(*as) || (*as)->rank == -1 ? GFC_MAX_DIMENSIONS : (*as)->rank; get_unique_hashed_string (tname, ts->u.derived); if ((*as) && attr->allocatable) - sprintf (name, "__class_%s_%d_%da", tname, rank, (*as)->corank); + name = xasprintf ("__class_%s_%d_%da", tname, rank, (*as)->corank); else if ((*as) && attr->pointer) - sprintf (name, "__class_%s_%d_%dp", tname, rank, (*as)->corank); + name = xasprintf ("__class_%s_%d_%dp", tname, rank, (*as)->corank); else if ((*as)) - sprintf (name, "__class_%s_%d_%dt", tname, rank, (*as)->corank); + name = xasprintf ("__class_%s_%d_%dt", tname, rank, (*as)->corank); else if (attr->pointer) - sprintf (name, "__class_%s_p", tname); + name = xasprintf ("__class_%s_p", tname); else if (attr->allocatable) - sprintf (name, "__class_%s_a", tname); + name = xasprintf ("__class_%s_a", tname); else - sprintf (name, "__class_%s_t", tname); + name = xasprintf ("__class_%s_t", tname); if (ts->u.derived->attr.unlimited_polymorphic) { @@ -738,6 +739,7 @@ gfc_build_class_symbol (gfc_typespec *ts, symbol_attribute *attr, ts->u.derived = fclass; attr->allocatable = attr->pointer = attr->dimension = attr->codimension = 0; (*as) = NULL; + free (name); return true; } @@ -1527,7 +1529,7 @@ generate_finalization_wrapper (gfc_symbol *derived, gfc_namespace *ns, gfc_component *comp; gfc_namespace *sub_ns; gfc_code *last_code, *block; - char name[GFC_MAX_SYMBOL_LEN+1]; + char *name; bool finalizable_comp = false; bool expr_null_wrapper = false; gfc_expr *ancestor_wrapper = NULL, *rank; @@ -1606,7 +1608,7 @@ generate_finalization_wrapper (gfc_symbol *derived, gfc_namespace *ns, sub_ns->resolved = 1; /* Set up the procedure symbol. */ - sprintf (name, "__final_%s", tname); + name = xasprintf ("__final_%s", tname); gfc_get_symbol (name, sub_ns, &final); sub_ns->proc_name = final; final->attr.flavor = FL_PROCEDURE; @@ -2172,6 +2174,7 @@ generate_finalization_wrapper (gfc_symbol *derived, gfc_namespace *ns, gfc_free_expr (rank); vtab_final->initializer = gfc_lval_expr_from_sym (final); vtab_final->ts.interface = final; + free (name); } @@ -2239,10 +2242,11 @@ gfc_find_derived_vtab (gfc_symbol *derived) if (ns) { - char name[GFC_MAX_SYMBOL_LEN+1], tname[GFC_MAX_SYMBOL_LEN+1]; + char tname[GFC_MAX_SYMBOL_LEN+1]; + char *name; get_unique_hashed_string (tname, derived); - sprintf (name, "__vtab_%s", tname); + name = xasprintf ("__vtab_%s", tname); /* Look for the vtab symbol in various namespaces. */ if (gsym && gsym->ns) @@ -2270,7 +2274,7 @@ gfc_find_derived_vtab (gfc_symbol *derived) vtab->attr.vtab = 1; vtab->attr.access = ACCESS_PUBLIC; gfc_set_sym_referenced (vtab); - sprintf (name, "__vtype_%s", tname); + name = xasprintf ("__vtype_%s", tname); gfc_find_symbol (name, ns, 0, &vtype); if (vtype == NULL) @@ -2373,7 +2377,7 @@ gfc_find_derived_vtab (gfc_symbol *derived) else { /* Construct default initialization variable. */ - sprintf (name, "__def_init_%s", tname); + name = xasprintf ("__def_init_%s", tname); gfc_get_symbol (name, ns, &def_init); def_init->attr.target = 1; def_init->attr.artificial = 1; @@ -2406,7 +2410,7 @@ gfc_find_derived_vtab (gfc_symbol *derived) ns->contained = sub_ns; sub_ns->resolved = 1; /* Set up procedure symbol. */ - sprintf (name, "__copy_%s", tname); + name = xasprintf ("__copy_%s", tname); gfc_get_symbol (name, sub_ns, ©); sub_ns->proc_name = copy; copy->attr.flavor = FL_PROCEDURE; @@ -2483,7 +2487,7 @@ gfc_find_derived_vtab (gfc_symbol *derived) ns->contained = sub_ns; sub_ns->resolved = 1; /* Set up procedure symbol. */ - sprintf (name, "__deallocate_%s", tname); + name = xasprintf ("__deallocate_%s", tname); gfc_get_symbol (name, sub_ns, &dealloc); sub_ns->proc_name = dealloc; dealloc->attr.flavor = FL_PROCEDURE; @@ -2532,6 +2536,7 @@ have_vtype: vtab->ts.u.derived = vtype; vtab->value = gfc_default_initializer (&vtab->ts); } + free (name); } found_sym = vtab; @@ -2623,13 +2628,14 @@ find_intrinsic_vtab (gfc_typespec *ts) if (ns) { - char name[GFC_MAX_SYMBOL_LEN+1], tname[GFC_MAX_SYMBOL_LEN+1]; - + char tname[GFC_MAX_SYMBOL_LEN+1]; + char *name; + /* Encode all types as TYPENAME_KIND_ including especially character arrays, whose length is now consistently stored in the _len component of the class-variable. */ sprintf (tname, "%s_%d_", gfc_basic_typename (ts->type), ts->kind); - sprintf (name, "__vtab_%s", tname); + name = xasprintf ("__vtab_%s", tname); /* Look for the vtab symbol in the top-level namespace only. */ gfc_find_symbol (name, ns, 0, &vtab); @@ -2646,7 +2652,7 @@ find_intrinsic_vtab (gfc_typespec *ts) vtab->attr.vtab = 1; vtab->attr.access = ACCESS_PUBLIC; gfc_set_sym_referenced (vtab); - sprintf (name, "__vtype_%s", tname); + name = xasprintf ("__vtype_%s", tname); gfc_find_symbol (name, ns, 0, &vtype); if (vtype == NULL) @@ -2722,12 +2728,12 @@ find_intrinsic_vtab (gfc_typespec *ts) c->tb->ppc = 1; if (ts->type != BT_CHARACTER) - sprintf (name, "__copy_%s", tname); + name = xasprintf ("__copy_%s", tname); else { /* __copy is always the same for characters. Check to see if copy function already exists. */ - sprintf (name, "__copy_character_%d", ts->kind); + name = xasprintf ("__copy_character_%d", ts->kind); contained = ns->contained; for (; contained; contained = contained->sibling) if (contained->proc_name @@ -2796,6 +2802,7 @@ find_intrinsic_vtab (gfc_typespec *ts) vtab->ts.u.derived = vtype; vtab->value = gfc_default_initializer (&vtab->ts); } + free (name); } found_sym = vtab; |