diff options
Diffstat (limited to 'gcc/fortran/iresolve.c')
-rw-r--r-- | gcc/fortran/iresolve.c | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/gcc/fortran/iresolve.c b/gcc/fortran/iresolve.c index 5c3ad42..f5a4462 100644 --- a/gcc/fortran/iresolve.c +++ b/gcc/fortran/iresolve.c @@ -47,15 +47,27 @@ const char * gfc_get_string (const char *format, ...) { char temp_name[128]; + const char *str; va_list ap; tree ident; - va_start (ap, format); - vsnprintf (temp_name, sizeof (temp_name), format, ap); - va_end (ap); - temp_name[sizeof (temp_name) - 1] = 0; + /* Handle common case without vsnprintf and temporary buffer. */ + if (format[0] == '%' && format[1] == 's' && format[2] == '\0') + { + va_start (ap, format); + str = va_arg (ap, const char *); + va_end (ap); + } + else + { + va_start (ap, format); + vsnprintf (temp_name, sizeof (temp_name), format, ap); + va_end (ap); + temp_name[sizeof (temp_name) - 1] = 0; + str = temp_name; + } - ident = get_identifier (temp_name); + ident = get_identifier (str); return IDENTIFIER_POINTER (ident); } @@ -141,7 +153,7 @@ resolve_bound (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *kind, } } - f->value.function.name = gfc_get_string (name); + f->value.function.name = gfc_get_string ("%s", name); } @@ -174,7 +186,7 @@ resolve_transformational (const char *name, gfc_expr *f, gfc_expr *array, f->value.function.name = gfc_get_string (PREFIX ("%s%s_%c%d"), prefix, name, - gfc_type_letter (array->ts.type), array->ts.kind); + gfc_type_letter (array->ts.type), array->ts.kind); } @@ -229,7 +241,7 @@ gfc_resolve_adjustr (gfc_expr *f, gfc_expr *string) static void gfc_resolve_char_achar (gfc_expr *f, gfc_expr *x, gfc_expr *kind, - const char *name) + bool is_achar) { f->ts.type = BT_CHARACTER; f->ts.kind = (kind == NULL) @@ -237,16 +249,16 @@ gfc_resolve_char_achar (gfc_expr *f, gfc_expr *x, gfc_expr *kind, f->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL); f->ts.u.cl->length = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1); - f->value.function.name = gfc_get_string (name, f->ts.kind, - gfc_type_letter (x->ts.type), - x->ts.kind); + f->value.function.name + = gfc_get_string ("__%schar_%d_%c%d", is_achar ? "a" : "", f->ts.kind, + gfc_type_letter (x->ts.type), x->ts.kind); } void gfc_resolve_achar (gfc_expr *f, gfc_expr *x, gfc_expr *kind) { - gfc_resolve_char_achar (f, x, kind, "__achar_%d_%c%d"); + gfc_resolve_char_achar (f, x, kind, true); } @@ -536,7 +548,7 @@ gfc_resolve_ceiling (gfc_expr *f, gfc_expr *a, gfc_expr *kind) void gfc_resolve_char (gfc_expr *f, gfc_expr *a, gfc_expr *kind) { - gfc_resolve_char_achar (f, a, kind, "__char_%d_%c%d"); + gfc_resolve_char_achar (f, a, kind, false); } |