1627f7eb2Smrg /* Intrinsic function resolution.
24c3eb207Smrg Copyright (C) 2000-2020 Free Software Foundation, Inc.
3627f7eb2Smrg Contributed by Andy Vaught & Katherine Holcomb
4627f7eb2Smrg
5627f7eb2Smrg This file is part of GCC.
6627f7eb2Smrg
7627f7eb2Smrg GCC is free software; you can redistribute it and/or modify it under
8627f7eb2Smrg the terms of the GNU General Public License as published by the Free
9627f7eb2Smrg Software Foundation; either version 3, or (at your option) any later
10627f7eb2Smrg version.
11627f7eb2Smrg
12627f7eb2Smrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13627f7eb2Smrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
14627f7eb2Smrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15627f7eb2Smrg for more details.
16627f7eb2Smrg
17627f7eb2Smrg You should have received a copy of the GNU General Public License
18627f7eb2Smrg along with GCC; see the file COPYING3. If not see
19627f7eb2Smrg <http://www.gnu.org/licenses/>. */
20627f7eb2Smrg
21627f7eb2Smrg
22627f7eb2Smrg /* Assign name and types to intrinsic procedures. For functions, the
23627f7eb2Smrg first argument to a resolution function is an expression pointer to
24627f7eb2Smrg the original function node and the rest are pointers to the
25627f7eb2Smrg arguments of the function call. For subroutines, a pointer to the
26627f7eb2Smrg code node is passed. The result type and library subroutine name
27627f7eb2Smrg are generally set according to the function arguments. */
28627f7eb2Smrg
29627f7eb2Smrg #include "config.h"
30627f7eb2Smrg #include "system.h"
31627f7eb2Smrg #include "coretypes.h"
32627f7eb2Smrg #include "tree.h"
33627f7eb2Smrg #include "gfortran.h"
34627f7eb2Smrg #include "stringpool.h"
35627f7eb2Smrg #include "intrinsic.h"
36627f7eb2Smrg #include "constructor.h"
37627f7eb2Smrg #include "arith.h"
38627f7eb2Smrg #include "trans.h"
39627f7eb2Smrg
40627f7eb2Smrg /* Given printf-like arguments, return a stable version of the result string.
41627f7eb2Smrg
42627f7eb2Smrg We already have a working, optimized string hashing table in the form of
43627f7eb2Smrg the identifier table. Reusing this table is likely not to be wasted,
44627f7eb2Smrg since if the function name makes it to the gimple output of the frontend,
45627f7eb2Smrg we'll have to create the identifier anyway. */
46627f7eb2Smrg
47627f7eb2Smrg const char *
gfc_get_string(const char * format,...)48627f7eb2Smrg gfc_get_string (const char *format, ...)
49627f7eb2Smrg {
504c3eb207Smrg /* Provide sufficient space for "_F.caf_token__symbol.symbol_MOD_symbol". */
514c3eb207Smrg char temp_name[15 + 2*GFC_MAX_SYMBOL_LEN + 5 + GFC_MAX_SYMBOL_LEN + 1];
52627f7eb2Smrg const char *str;
53627f7eb2Smrg va_list ap;
54627f7eb2Smrg tree ident;
55627f7eb2Smrg
56627f7eb2Smrg /* Handle common case without vsnprintf and temporary buffer. */
57627f7eb2Smrg if (format[0] == '%' && format[1] == 's' && format[2] == '\0')
58627f7eb2Smrg {
59627f7eb2Smrg va_start (ap, format);
60627f7eb2Smrg str = va_arg (ap, const char *);
61627f7eb2Smrg va_end (ap);
62627f7eb2Smrg }
63627f7eb2Smrg else
64627f7eb2Smrg {
654c3eb207Smrg int ret;
66627f7eb2Smrg va_start (ap, format);
674c3eb207Smrg ret = vsnprintf (temp_name, sizeof (temp_name), format, ap);
68627f7eb2Smrg va_end (ap);
694c3eb207Smrg if (ret < 1 || ret >= (int) sizeof (temp_name)) /* Reject truncation. */
704c3eb207Smrg gfc_internal_error ("identifier overflow: %d", ret);
71627f7eb2Smrg temp_name[sizeof (temp_name) - 1] = 0;
72627f7eb2Smrg str = temp_name;
73627f7eb2Smrg }
74627f7eb2Smrg
75627f7eb2Smrg ident = get_identifier (str);
76627f7eb2Smrg return IDENTIFIER_POINTER (ident);
77627f7eb2Smrg }
78627f7eb2Smrg
79627f7eb2Smrg /* MERGE and SPREAD need to have source charlen's present for passing
80627f7eb2Smrg to the result expression. */
81627f7eb2Smrg static void
check_charlen_present(gfc_expr * source)82627f7eb2Smrg check_charlen_present (gfc_expr *source)
83627f7eb2Smrg {
84627f7eb2Smrg if (source->ts.u.cl == NULL)
85627f7eb2Smrg source->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
86627f7eb2Smrg
87627f7eb2Smrg if (source->expr_type == EXPR_CONSTANT)
88627f7eb2Smrg {
89627f7eb2Smrg source->ts.u.cl->length
90627f7eb2Smrg = gfc_get_int_expr (gfc_charlen_int_kind, NULL,
91627f7eb2Smrg source->value.character.length);
92627f7eb2Smrg source->rank = 0;
93627f7eb2Smrg }
94627f7eb2Smrg else if (source->expr_type == EXPR_ARRAY)
95627f7eb2Smrg {
96627f7eb2Smrg gfc_constructor *c = gfc_constructor_first (source->value.constructor);
97*4ac76180Smrg if (c)
98627f7eb2Smrg source->ts.u.cl->length
99627f7eb2Smrg = gfc_get_int_expr (gfc_charlen_int_kind, NULL,
100627f7eb2Smrg c->expr->value.character.length);
101*4ac76180Smrg if (source->ts.u.cl->length == NULL)
102*4ac76180Smrg gfc_internal_error ("check_charlen_present(): length not set");
103627f7eb2Smrg }
104627f7eb2Smrg }
105627f7eb2Smrg
106627f7eb2Smrg /* Helper function for resolving the "mask" argument. */
107627f7eb2Smrg
108627f7eb2Smrg static void
resolve_mask_arg(gfc_expr * mask)109627f7eb2Smrg resolve_mask_arg (gfc_expr *mask)
110627f7eb2Smrg {
111627f7eb2Smrg
112627f7eb2Smrg gfc_typespec ts;
113627f7eb2Smrg gfc_clear_ts (&ts);
114627f7eb2Smrg
115627f7eb2Smrg if (mask->rank == 0)
116627f7eb2Smrg {
117627f7eb2Smrg /* For the scalar case, coerce the mask to kind=4 unconditionally
118627f7eb2Smrg (because this is the only kind we have a library function
119627f7eb2Smrg for). */
120627f7eb2Smrg
121627f7eb2Smrg if (mask->ts.kind != 4)
122627f7eb2Smrg {
123627f7eb2Smrg ts.type = BT_LOGICAL;
124627f7eb2Smrg ts.kind = 4;
125627f7eb2Smrg gfc_convert_type (mask, &ts, 2);
126627f7eb2Smrg }
127627f7eb2Smrg }
128627f7eb2Smrg else
129627f7eb2Smrg {
130627f7eb2Smrg /* In the library, we access the mask with a GFC_LOGICAL_1
131627f7eb2Smrg argument. No need to waste memory if we are about to create
132627f7eb2Smrg a temporary array. */
133627f7eb2Smrg if (mask->expr_type == EXPR_OP && mask->ts.kind != 1)
134627f7eb2Smrg {
135627f7eb2Smrg ts.type = BT_LOGICAL;
136627f7eb2Smrg ts.kind = 1;
137627f7eb2Smrg gfc_convert_type_warn (mask, &ts, 2, 0);
138627f7eb2Smrg }
139627f7eb2Smrg }
140627f7eb2Smrg }
141627f7eb2Smrg
142627f7eb2Smrg
143627f7eb2Smrg static void
resolve_bound(gfc_expr * f,gfc_expr * array,gfc_expr * dim,gfc_expr * kind,const char * name,bool coarray)144627f7eb2Smrg resolve_bound (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *kind,
145627f7eb2Smrg const char *name, bool coarray)
146627f7eb2Smrg {
147627f7eb2Smrg f->ts.type = BT_INTEGER;
148627f7eb2Smrg if (kind)
149627f7eb2Smrg f->ts.kind = mpz_get_si (kind->value.integer);
150627f7eb2Smrg else
151627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
152627f7eb2Smrg
153627f7eb2Smrg if (dim == NULL)
154627f7eb2Smrg {
155627f7eb2Smrg f->rank = 1;
156627f7eb2Smrg if (array->rank != -1)
157627f7eb2Smrg {
158627f7eb2Smrg f->shape = gfc_get_shape (1);
159627f7eb2Smrg mpz_init_set_ui (f->shape[0], coarray ? gfc_get_corank (array)
160627f7eb2Smrg : array->rank);
161627f7eb2Smrg }
162627f7eb2Smrg }
163627f7eb2Smrg
164627f7eb2Smrg f->value.function.name = gfc_get_string ("%s", name);
165627f7eb2Smrg }
166627f7eb2Smrg
167627f7eb2Smrg
168627f7eb2Smrg static void
resolve_transformational(const char * name,gfc_expr * f,gfc_expr * array,gfc_expr * dim,gfc_expr * mask)169627f7eb2Smrg resolve_transformational (const char *name, gfc_expr *f, gfc_expr *array,
170627f7eb2Smrg gfc_expr *dim, gfc_expr *mask)
171627f7eb2Smrg {
172627f7eb2Smrg const char *prefix;
173627f7eb2Smrg
174627f7eb2Smrg f->ts = array->ts;
175627f7eb2Smrg
176627f7eb2Smrg if (mask)
177627f7eb2Smrg {
178627f7eb2Smrg if (mask->rank == 0)
179627f7eb2Smrg prefix = "s";
180627f7eb2Smrg else
181627f7eb2Smrg prefix = "m";
182627f7eb2Smrg
183627f7eb2Smrg resolve_mask_arg (mask);
184627f7eb2Smrg }
185627f7eb2Smrg else
186627f7eb2Smrg prefix = "";
187627f7eb2Smrg
188627f7eb2Smrg if (dim != NULL)
189627f7eb2Smrg {
190627f7eb2Smrg f->rank = array->rank - 1;
191627f7eb2Smrg f->shape = gfc_copy_shape_excluding (array->shape, array->rank, dim);
192627f7eb2Smrg gfc_resolve_dim_arg (dim);
193627f7eb2Smrg }
194627f7eb2Smrg
195627f7eb2Smrg f->value.function.name
196627f7eb2Smrg = gfc_get_string (PREFIX ("%s%s_%c%d"), prefix, name,
197627f7eb2Smrg gfc_type_letter (array->ts.type), array->ts.kind);
198627f7eb2Smrg }
199627f7eb2Smrg
200627f7eb2Smrg
201627f7eb2Smrg /********************** Resolution functions **********************/
202627f7eb2Smrg
203627f7eb2Smrg
204627f7eb2Smrg void
gfc_resolve_abs(gfc_expr * f,gfc_expr * a)205627f7eb2Smrg gfc_resolve_abs (gfc_expr *f, gfc_expr *a)
206627f7eb2Smrg {
207627f7eb2Smrg f->ts = a->ts;
208627f7eb2Smrg if (f->ts.type == BT_COMPLEX)
209627f7eb2Smrg f->ts.type = BT_REAL;
210627f7eb2Smrg
211627f7eb2Smrg f->value.function.name
212627f7eb2Smrg = gfc_get_string ("__abs_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
213627f7eb2Smrg }
214627f7eb2Smrg
215627f7eb2Smrg
216627f7eb2Smrg void
gfc_resolve_access(gfc_expr * f,gfc_expr * name ATTRIBUTE_UNUSED,gfc_expr * mode ATTRIBUTE_UNUSED)217627f7eb2Smrg gfc_resolve_access (gfc_expr *f, gfc_expr *name ATTRIBUTE_UNUSED,
218627f7eb2Smrg gfc_expr *mode ATTRIBUTE_UNUSED)
219627f7eb2Smrg {
220627f7eb2Smrg f->ts.type = BT_INTEGER;
221627f7eb2Smrg f->ts.kind = gfc_c_int_kind;
222627f7eb2Smrg f->value.function.name = PREFIX ("access_func");
223627f7eb2Smrg }
224627f7eb2Smrg
225627f7eb2Smrg
226627f7eb2Smrg void
gfc_resolve_adjustl(gfc_expr * f,gfc_expr * string)227627f7eb2Smrg gfc_resolve_adjustl (gfc_expr *f, gfc_expr *string)
228627f7eb2Smrg {
229627f7eb2Smrg f->ts.type = BT_CHARACTER;
230627f7eb2Smrg f->ts.kind = string->ts.kind;
231627f7eb2Smrg if (string->ts.u.cl)
232627f7eb2Smrg f->ts.u.cl = gfc_new_charlen (gfc_current_ns, string->ts.u.cl);
233627f7eb2Smrg
234627f7eb2Smrg f->value.function.name = gfc_get_string ("__adjustl_s%d", f->ts.kind);
235627f7eb2Smrg }
236627f7eb2Smrg
237627f7eb2Smrg
238627f7eb2Smrg void
gfc_resolve_adjustr(gfc_expr * f,gfc_expr * string)239627f7eb2Smrg gfc_resolve_adjustr (gfc_expr *f, gfc_expr *string)
240627f7eb2Smrg {
241627f7eb2Smrg f->ts.type = BT_CHARACTER;
242627f7eb2Smrg f->ts.kind = string->ts.kind;
243627f7eb2Smrg if (string->ts.u.cl)
244627f7eb2Smrg f->ts.u.cl = gfc_new_charlen (gfc_current_ns, string->ts.u.cl);
245627f7eb2Smrg
246627f7eb2Smrg f->value.function.name = gfc_get_string ("__adjustr_s%d", f->ts.kind);
247627f7eb2Smrg }
248627f7eb2Smrg
249627f7eb2Smrg
250627f7eb2Smrg static void
gfc_resolve_char_achar(gfc_expr * f,gfc_expr * x,gfc_expr * kind,bool is_achar)251627f7eb2Smrg gfc_resolve_char_achar (gfc_expr *f, gfc_expr *x, gfc_expr *kind,
252627f7eb2Smrg bool is_achar)
253627f7eb2Smrg {
254627f7eb2Smrg f->ts.type = BT_CHARACTER;
255627f7eb2Smrg f->ts.kind = (kind == NULL)
256627f7eb2Smrg ? gfc_default_character_kind : mpz_get_si (kind->value.integer);
257627f7eb2Smrg f->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
258627f7eb2Smrg f->ts.u.cl->length = gfc_get_int_expr (gfc_charlen_int_kind, NULL, 1);
259627f7eb2Smrg
260627f7eb2Smrg f->value.function.name
261627f7eb2Smrg = gfc_get_string ("__%schar_%d_%c%d", is_achar ? "a" : "", f->ts.kind,
262627f7eb2Smrg gfc_type_letter (x->ts.type), x->ts.kind);
263627f7eb2Smrg }
264627f7eb2Smrg
265627f7eb2Smrg
266627f7eb2Smrg void
gfc_resolve_achar(gfc_expr * f,gfc_expr * x,gfc_expr * kind)267627f7eb2Smrg gfc_resolve_achar (gfc_expr *f, gfc_expr *x, gfc_expr *kind)
268627f7eb2Smrg {
269627f7eb2Smrg gfc_resolve_char_achar (f, x, kind, true);
270627f7eb2Smrg }
271627f7eb2Smrg
272627f7eb2Smrg
273627f7eb2Smrg void
gfc_resolve_acos(gfc_expr * f,gfc_expr * x)274627f7eb2Smrg gfc_resolve_acos (gfc_expr *f, gfc_expr *x)
275627f7eb2Smrg {
276627f7eb2Smrg f->ts = x->ts;
277627f7eb2Smrg f->value.function.name
278627f7eb2Smrg = gfc_get_string ("__acos_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
279627f7eb2Smrg }
280627f7eb2Smrg
281627f7eb2Smrg
282627f7eb2Smrg void
gfc_resolve_acosh(gfc_expr * f,gfc_expr * x)283627f7eb2Smrg gfc_resolve_acosh (gfc_expr *f, gfc_expr *x)
284627f7eb2Smrg {
285627f7eb2Smrg f->ts = x->ts;
286627f7eb2Smrg f->value.function.name
287627f7eb2Smrg = gfc_get_string ("__acosh_%c%d", gfc_type_letter (x->ts.type),
288627f7eb2Smrg x->ts.kind);
289627f7eb2Smrg }
290627f7eb2Smrg
291627f7eb2Smrg
292627f7eb2Smrg void
gfc_resolve_aimag(gfc_expr * f,gfc_expr * x)293627f7eb2Smrg gfc_resolve_aimag (gfc_expr *f, gfc_expr *x)
294627f7eb2Smrg {
295627f7eb2Smrg f->ts.type = BT_REAL;
296627f7eb2Smrg f->ts.kind = x->ts.kind;
297627f7eb2Smrg f->value.function.name
298627f7eb2Smrg = gfc_get_string ("__aimag_%c%d", gfc_type_letter (x->ts.type),
299627f7eb2Smrg x->ts.kind);
300627f7eb2Smrg }
301627f7eb2Smrg
302627f7eb2Smrg
303627f7eb2Smrg void
gfc_resolve_and(gfc_expr * f,gfc_expr * i,gfc_expr * j)304627f7eb2Smrg gfc_resolve_and (gfc_expr *f, gfc_expr *i, gfc_expr *j)
305627f7eb2Smrg {
306627f7eb2Smrg f->ts.type = i->ts.type;
307627f7eb2Smrg f->ts.kind = gfc_kind_max (i, j);
308627f7eb2Smrg
309627f7eb2Smrg if (i->ts.kind != j->ts.kind)
310627f7eb2Smrg {
311627f7eb2Smrg if (i->ts.kind == gfc_kind_max (i, j))
312627f7eb2Smrg gfc_convert_type (j, &i->ts, 2);
313627f7eb2Smrg else
314627f7eb2Smrg gfc_convert_type (i, &j->ts, 2);
315627f7eb2Smrg }
316627f7eb2Smrg
317627f7eb2Smrg f->value.function.name
318627f7eb2Smrg = gfc_get_string ("__and_%c%d", gfc_type_letter (i->ts.type), f->ts.kind);
319627f7eb2Smrg }
320627f7eb2Smrg
321627f7eb2Smrg
322627f7eb2Smrg void
gfc_resolve_aint(gfc_expr * f,gfc_expr * a,gfc_expr * kind)323627f7eb2Smrg gfc_resolve_aint (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
324627f7eb2Smrg {
325627f7eb2Smrg gfc_typespec ts;
326627f7eb2Smrg gfc_clear_ts (&ts);
327627f7eb2Smrg
328627f7eb2Smrg f->ts.type = a->ts.type;
329627f7eb2Smrg f->ts.kind = (kind == NULL) ? a->ts.kind : mpz_get_si (kind->value.integer);
330627f7eb2Smrg
331627f7eb2Smrg if (a->ts.kind != f->ts.kind)
332627f7eb2Smrg {
333627f7eb2Smrg ts.type = f->ts.type;
334627f7eb2Smrg ts.kind = f->ts.kind;
335627f7eb2Smrg gfc_convert_type (a, &ts, 2);
336627f7eb2Smrg }
337627f7eb2Smrg /* The resolved name is only used for specific intrinsics where
338627f7eb2Smrg the return kind is the same as the arg kind. */
339627f7eb2Smrg f->value.function.name
340627f7eb2Smrg = gfc_get_string ("__aint_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
341627f7eb2Smrg }
342627f7eb2Smrg
343627f7eb2Smrg
344627f7eb2Smrg void
gfc_resolve_dint(gfc_expr * f,gfc_expr * a)345627f7eb2Smrg gfc_resolve_dint (gfc_expr *f, gfc_expr *a)
346627f7eb2Smrg {
347627f7eb2Smrg gfc_resolve_aint (f, a, NULL);
348627f7eb2Smrg }
349627f7eb2Smrg
350627f7eb2Smrg
351627f7eb2Smrg void
gfc_resolve_all(gfc_expr * f,gfc_expr * mask,gfc_expr * dim)352627f7eb2Smrg gfc_resolve_all (gfc_expr *f, gfc_expr *mask, gfc_expr *dim)
353627f7eb2Smrg {
354627f7eb2Smrg f->ts = mask->ts;
355627f7eb2Smrg
356627f7eb2Smrg if (dim != NULL)
357627f7eb2Smrg {
358627f7eb2Smrg gfc_resolve_dim_arg (dim);
359627f7eb2Smrg f->rank = mask->rank - 1;
360627f7eb2Smrg f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
361627f7eb2Smrg }
362627f7eb2Smrg
363627f7eb2Smrg f->value.function.name
364627f7eb2Smrg = gfc_get_string (PREFIX ("all_%c%d"), gfc_type_letter (mask->ts.type),
365627f7eb2Smrg mask->ts.kind);
366627f7eb2Smrg }
367627f7eb2Smrg
368627f7eb2Smrg
369627f7eb2Smrg void
gfc_resolve_anint(gfc_expr * f,gfc_expr * a,gfc_expr * kind)370627f7eb2Smrg gfc_resolve_anint (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
371627f7eb2Smrg {
372627f7eb2Smrg gfc_typespec ts;
373627f7eb2Smrg gfc_clear_ts (&ts);
374627f7eb2Smrg
375627f7eb2Smrg f->ts.type = a->ts.type;
376627f7eb2Smrg f->ts.kind = (kind == NULL) ? a->ts.kind : mpz_get_si (kind->value.integer);
377627f7eb2Smrg
378627f7eb2Smrg if (a->ts.kind != f->ts.kind)
379627f7eb2Smrg {
380627f7eb2Smrg ts.type = f->ts.type;
381627f7eb2Smrg ts.kind = f->ts.kind;
382627f7eb2Smrg gfc_convert_type (a, &ts, 2);
383627f7eb2Smrg }
384627f7eb2Smrg
385627f7eb2Smrg /* The resolved name is only used for specific intrinsics where
386627f7eb2Smrg the return kind is the same as the arg kind. */
387627f7eb2Smrg f->value.function.name
388627f7eb2Smrg = gfc_get_string ("__anint_%c%d", gfc_type_letter (a->ts.type),
389627f7eb2Smrg a->ts.kind);
390627f7eb2Smrg }
391627f7eb2Smrg
392627f7eb2Smrg
393627f7eb2Smrg void
gfc_resolve_dnint(gfc_expr * f,gfc_expr * a)394627f7eb2Smrg gfc_resolve_dnint (gfc_expr *f, gfc_expr *a)
395627f7eb2Smrg {
396627f7eb2Smrg gfc_resolve_anint (f, a, NULL);
397627f7eb2Smrg }
398627f7eb2Smrg
399627f7eb2Smrg
400627f7eb2Smrg void
gfc_resolve_any(gfc_expr * f,gfc_expr * mask,gfc_expr * dim)401627f7eb2Smrg gfc_resolve_any (gfc_expr *f, gfc_expr *mask, gfc_expr *dim)
402627f7eb2Smrg {
403627f7eb2Smrg f->ts = mask->ts;
404627f7eb2Smrg
405627f7eb2Smrg if (dim != NULL)
406627f7eb2Smrg {
407627f7eb2Smrg gfc_resolve_dim_arg (dim);
408627f7eb2Smrg f->rank = mask->rank - 1;
409627f7eb2Smrg f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
410627f7eb2Smrg }
411627f7eb2Smrg
412627f7eb2Smrg f->value.function.name
413627f7eb2Smrg = gfc_get_string (PREFIX ("any_%c%d"), gfc_type_letter (mask->ts.type),
414627f7eb2Smrg mask->ts.kind);
415627f7eb2Smrg }
416627f7eb2Smrg
417627f7eb2Smrg
418627f7eb2Smrg void
gfc_resolve_asin(gfc_expr * f,gfc_expr * x)419627f7eb2Smrg gfc_resolve_asin (gfc_expr *f, gfc_expr *x)
420627f7eb2Smrg {
421627f7eb2Smrg f->ts = x->ts;
422627f7eb2Smrg f->value.function.name
423627f7eb2Smrg = gfc_get_string ("__asin_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
424627f7eb2Smrg }
425627f7eb2Smrg
426627f7eb2Smrg void
gfc_resolve_asinh(gfc_expr * f,gfc_expr * x)427627f7eb2Smrg gfc_resolve_asinh (gfc_expr *f, gfc_expr *x)
428627f7eb2Smrg {
429627f7eb2Smrg f->ts = x->ts;
430627f7eb2Smrg f->value.function.name
431627f7eb2Smrg = gfc_get_string ("__asinh_%c%d", gfc_type_letter (x->ts.type),
432627f7eb2Smrg x->ts.kind);
433627f7eb2Smrg }
434627f7eb2Smrg
435627f7eb2Smrg void
gfc_resolve_atan(gfc_expr * f,gfc_expr * x)436627f7eb2Smrg gfc_resolve_atan (gfc_expr *f, gfc_expr *x)
437627f7eb2Smrg {
438627f7eb2Smrg f->ts = x->ts;
439627f7eb2Smrg f->value.function.name
440627f7eb2Smrg = gfc_get_string ("__atan_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
441627f7eb2Smrg }
442627f7eb2Smrg
443627f7eb2Smrg void
gfc_resolve_atanh(gfc_expr * f,gfc_expr * x)444627f7eb2Smrg gfc_resolve_atanh (gfc_expr *f, gfc_expr *x)
445627f7eb2Smrg {
446627f7eb2Smrg f->ts = x->ts;
447627f7eb2Smrg f->value.function.name
448627f7eb2Smrg = gfc_get_string ("__atanh_%c%d", gfc_type_letter (x->ts.type),
449627f7eb2Smrg x->ts.kind);
450627f7eb2Smrg }
451627f7eb2Smrg
452627f7eb2Smrg void
gfc_resolve_atan2(gfc_expr * f,gfc_expr * x,gfc_expr * y ATTRIBUTE_UNUSED)453627f7eb2Smrg gfc_resolve_atan2 (gfc_expr *f, gfc_expr *x, gfc_expr *y ATTRIBUTE_UNUSED)
454627f7eb2Smrg {
455627f7eb2Smrg f->ts = x->ts;
456627f7eb2Smrg f->value.function.name
457627f7eb2Smrg = gfc_get_string ("__atan2_%c%d", gfc_type_letter (x->ts.type),
458627f7eb2Smrg x->ts.kind);
459627f7eb2Smrg }
460627f7eb2Smrg
461627f7eb2Smrg
462627f7eb2Smrg /* Resolve the BESYN and BESJN intrinsics. */
463627f7eb2Smrg
464627f7eb2Smrg void
gfc_resolve_besn(gfc_expr * f,gfc_expr * n,gfc_expr * x)465627f7eb2Smrg gfc_resolve_besn (gfc_expr *f, gfc_expr *n, gfc_expr *x)
466627f7eb2Smrg {
467627f7eb2Smrg gfc_typespec ts;
468627f7eb2Smrg gfc_clear_ts (&ts);
469627f7eb2Smrg
470627f7eb2Smrg f->ts = x->ts;
471627f7eb2Smrg if (n->ts.kind != gfc_c_int_kind)
472627f7eb2Smrg {
473627f7eb2Smrg ts.type = BT_INTEGER;
474627f7eb2Smrg ts.kind = gfc_c_int_kind;
475627f7eb2Smrg gfc_convert_type (n, &ts, 2);
476627f7eb2Smrg }
477627f7eb2Smrg f->value.function.name = gfc_get_string ("<intrinsic>");
478627f7eb2Smrg }
479627f7eb2Smrg
480627f7eb2Smrg
481627f7eb2Smrg void
gfc_resolve_bessel_n2(gfc_expr * f,gfc_expr * n1,gfc_expr * n2,gfc_expr * x)482627f7eb2Smrg gfc_resolve_bessel_n2 (gfc_expr *f, gfc_expr *n1, gfc_expr *n2, gfc_expr *x)
483627f7eb2Smrg {
484627f7eb2Smrg gfc_typespec ts;
485627f7eb2Smrg gfc_clear_ts (&ts);
486627f7eb2Smrg
487627f7eb2Smrg f->ts = x->ts;
488627f7eb2Smrg f->rank = 1;
489627f7eb2Smrg if (n1->expr_type == EXPR_CONSTANT && n2->expr_type == EXPR_CONSTANT)
490627f7eb2Smrg {
491627f7eb2Smrg f->shape = gfc_get_shape (1);
492627f7eb2Smrg mpz_init (f->shape[0]);
493627f7eb2Smrg mpz_sub (f->shape[0], n2->value.integer, n1->value.integer);
494627f7eb2Smrg mpz_add_ui (f->shape[0], f->shape[0], 1);
495627f7eb2Smrg }
496627f7eb2Smrg
497627f7eb2Smrg if (n1->ts.kind != gfc_c_int_kind)
498627f7eb2Smrg {
499627f7eb2Smrg ts.type = BT_INTEGER;
500627f7eb2Smrg ts.kind = gfc_c_int_kind;
501627f7eb2Smrg gfc_convert_type (n1, &ts, 2);
502627f7eb2Smrg }
503627f7eb2Smrg
504627f7eb2Smrg if (n2->ts.kind != gfc_c_int_kind)
505627f7eb2Smrg {
506627f7eb2Smrg ts.type = BT_INTEGER;
507627f7eb2Smrg ts.kind = gfc_c_int_kind;
508627f7eb2Smrg gfc_convert_type (n2, &ts, 2);
509627f7eb2Smrg }
510627f7eb2Smrg
511627f7eb2Smrg if (f->value.function.isym->id == GFC_ISYM_JN2)
512627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("bessel_jn_r%d"),
513627f7eb2Smrg f->ts.kind);
514627f7eb2Smrg else
515627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("bessel_yn_r%d"),
516627f7eb2Smrg f->ts.kind);
517627f7eb2Smrg }
518627f7eb2Smrg
519627f7eb2Smrg
520627f7eb2Smrg void
gfc_resolve_btest(gfc_expr * f,gfc_expr * i,gfc_expr * pos)521627f7eb2Smrg gfc_resolve_btest (gfc_expr *f, gfc_expr *i, gfc_expr *pos)
522627f7eb2Smrg {
523627f7eb2Smrg f->ts.type = BT_LOGICAL;
524627f7eb2Smrg f->ts.kind = gfc_default_logical_kind;
525627f7eb2Smrg f->value.function.name
526627f7eb2Smrg = gfc_get_string ("__btest_%d_%d", i->ts.kind, pos->ts.kind);
527627f7eb2Smrg }
528627f7eb2Smrg
529627f7eb2Smrg
530627f7eb2Smrg void
gfc_resolve_c_loc(gfc_expr * f,gfc_expr * x ATTRIBUTE_UNUSED)531627f7eb2Smrg gfc_resolve_c_loc (gfc_expr *f, gfc_expr *x ATTRIBUTE_UNUSED)
532627f7eb2Smrg {
533627f7eb2Smrg f->ts = f->value.function.isym->ts;
534627f7eb2Smrg }
535627f7eb2Smrg
536627f7eb2Smrg
537627f7eb2Smrg void
gfc_resolve_c_funloc(gfc_expr * f,gfc_expr * x ATTRIBUTE_UNUSED)538627f7eb2Smrg gfc_resolve_c_funloc (gfc_expr *f, gfc_expr *x ATTRIBUTE_UNUSED)
539627f7eb2Smrg {
540627f7eb2Smrg f->ts = f->value.function.isym->ts;
541627f7eb2Smrg }
542627f7eb2Smrg
543627f7eb2Smrg
544627f7eb2Smrg void
gfc_resolve_ceiling(gfc_expr * f,gfc_expr * a,gfc_expr * kind)545627f7eb2Smrg gfc_resolve_ceiling (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
546627f7eb2Smrg {
547627f7eb2Smrg f->ts.type = BT_INTEGER;
548627f7eb2Smrg f->ts.kind = (kind == NULL)
549627f7eb2Smrg ? gfc_default_integer_kind : mpz_get_si (kind->value.integer);
550627f7eb2Smrg f->value.function.name
551627f7eb2Smrg = gfc_get_string ("__ceiling_%d_%c%d", f->ts.kind,
552627f7eb2Smrg gfc_type_letter (a->ts.type), a->ts.kind);
553627f7eb2Smrg }
554627f7eb2Smrg
555627f7eb2Smrg
556627f7eb2Smrg void
gfc_resolve_char(gfc_expr * f,gfc_expr * a,gfc_expr * kind)557627f7eb2Smrg gfc_resolve_char (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
558627f7eb2Smrg {
559627f7eb2Smrg gfc_resolve_char_achar (f, a, kind, false);
560627f7eb2Smrg }
561627f7eb2Smrg
562627f7eb2Smrg
563627f7eb2Smrg void
gfc_resolve_chdir(gfc_expr * f,gfc_expr * d ATTRIBUTE_UNUSED)564627f7eb2Smrg gfc_resolve_chdir (gfc_expr *f, gfc_expr *d ATTRIBUTE_UNUSED)
565627f7eb2Smrg {
566627f7eb2Smrg f->ts.type = BT_INTEGER;
567627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
568627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("chdir_i%d"), f->ts.kind);
569627f7eb2Smrg }
570627f7eb2Smrg
571627f7eb2Smrg
572627f7eb2Smrg void
gfc_resolve_chdir_sub(gfc_code * c)573627f7eb2Smrg gfc_resolve_chdir_sub (gfc_code *c)
574627f7eb2Smrg {
575627f7eb2Smrg const char *name;
576627f7eb2Smrg int kind;
577627f7eb2Smrg
578627f7eb2Smrg if (c->ext.actual->next->expr != NULL)
579627f7eb2Smrg kind = c->ext.actual->next->expr->ts.kind;
580627f7eb2Smrg else
581627f7eb2Smrg kind = gfc_default_integer_kind;
582627f7eb2Smrg
583627f7eb2Smrg name = gfc_get_string (PREFIX ("chdir_i%d_sub"), kind);
584627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
585627f7eb2Smrg }
586627f7eb2Smrg
587627f7eb2Smrg
588627f7eb2Smrg void
gfc_resolve_chmod(gfc_expr * f,gfc_expr * name ATTRIBUTE_UNUSED,gfc_expr * mode ATTRIBUTE_UNUSED)589627f7eb2Smrg gfc_resolve_chmod (gfc_expr *f, gfc_expr *name ATTRIBUTE_UNUSED,
590627f7eb2Smrg gfc_expr *mode ATTRIBUTE_UNUSED)
591627f7eb2Smrg {
592627f7eb2Smrg f->ts.type = BT_INTEGER;
593627f7eb2Smrg f->ts.kind = gfc_c_int_kind;
594627f7eb2Smrg f->value.function.name = PREFIX ("chmod_func");
595627f7eb2Smrg }
596627f7eb2Smrg
597627f7eb2Smrg
598627f7eb2Smrg void
gfc_resolve_chmod_sub(gfc_code * c)599627f7eb2Smrg gfc_resolve_chmod_sub (gfc_code *c)
600627f7eb2Smrg {
601627f7eb2Smrg const char *name;
602627f7eb2Smrg int kind;
603627f7eb2Smrg
604627f7eb2Smrg if (c->ext.actual->next->next->expr != NULL)
605627f7eb2Smrg kind = c->ext.actual->next->next->expr->ts.kind;
606627f7eb2Smrg else
607627f7eb2Smrg kind = gfc_default_integer_kind;
608627f7eb2Smrg
609627f7eb2Smrg name = gfc_get_string (PREFIX ("chmod_i%d_sub"), kind);
610627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
611627f7eb2Smrg }
612627f7eb2Smrg
613627f7eb2Smrg
614627f7eb2Smrg void
gfc_resolve_cmplx(gfc_expr * f,gfc_expr * x,gfc_expr * y,gfc_expr * kind)615627f7eb2Smrg gfc_resolve_cmplx (gfc_expr *f, gfc_expr *x, gfc_expr *y, gfc_expr *kind)
616627f7eb2Smrg {
617627f7eb2Smrg f->ts.type = BT_COMPLEX;
618627f7eb2Smrg f->ts.kind = (kind == NULL)
619627f7eb2Smrg ? gfc_default_real_kind : mpz_get_si (kind->value.integer);
620627f7eb2Smrg
621627f7eb2Smrg if (y == NULL)
622627f7eb2Smrg f->value.function.name
623627f7eb2Smrg = gfc_get_string ("__cmplx0_%d_%c%d", f->ts.kind,
624627f7eb2Smrg gfc_type_letter (x->ts.type), x->ts.kind);
625627f7eb2Smrg else
626627f7eb2Smrg f->value.function.name
627627f7eb2Smrg = gfc_get_string ("__cmplx1_%d_%c%d_%c%d", f->ts.kind,
628627f7eb2Smrg gfc_type_letter (x->ts.type), x->ts.kind,
629627f7eb2Smrg gfc_type_letter (y->ts.type), y->ts.kind);
630627f7eb2Smrg }
631627f7eb2Smrg
632627f7eb2Smrg
633627f7eb2Smrg void
gfc_resolve_dcmplx(gfc_expr * f,gfc_expr * x,gfc_expr * y)634627f7eb2Smrg gfc_resolve_dcmplx (gfc_expr *f, gfc_expr *x, gfc_expr *y)
635627f7eb2Smrg {
636627f7eb2Smrg gfc_resolve_cmplx (f, x, y, gfc_get_int_expr (gfc_default_integer_kind, NULL,
637627f7eb2Smrg gfc_default_double_kind));
638627f7eb2Smrg }
639627f7eb2Smrg
640627f7eb2Smrg
641627f7eb2Smrg void
gfc_resolve_complex(gfc_expr * f,gfc_expr * x,gfc_expr * y)642627f7eb2Smrg gfc_resolve_complex (gfc_expr *f, gfc_expr *x, gfc_expr *y)
643627f7eb2Smrg {
644627f7eb2Smrg int kind;
645627f7eb2Smrg
646627f7eb2Smrg if (x->ts.type == BT_INTEGER)
647627f7eb2Smrg {
648627f7eb2Smrg if (y->ts.type == BT_INTEGER)
649627f7eb2Smrg kind = gfc_default_real_kind;
650627f7eb2Smrg else
651627f7eb2Smrg kind = y->ts.kind;
652627f7eb2Smrg }
653627f7eb2Smrg else
654627f7eb2Smrg {
655627f7eb2Smrg if (y->ts.type == BT_REAL)
656627f7eb2Smrg kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
657627f7eb2Smrg else
658627f7eb2Smrg kind = x->ts.kind;
659627f7eb2Smrg }
660627f7eb2Smrg
661627f7eb2Smrg f->ts.type = BT_COMPLEX;
662627f7eb2Smrg f->ts.kind = kind;
663627f7eb2Smrg f->value.function.name
664627f7eb2Smrg = gfc_get_string ("__cmplx1_%d_%c%d_%c%d", f->ts.kind,
665627f7eb2Smrg gfc_type_letter (x->ts.type), x->ts.kind,
666627f7eb2Smrg gfc_type_letter (y->ts.type), y->ts.kind);
667627f7eb2Smrg }
668627f7eb2Smrg
669627f7eb2Smrg
670627f7eb2Smrg void
gfc_resolve_conjg(gfc_expr * f,gfc_expr * x)671627f7eb2Smrg gfc_resolve_conjg (gfc_expr *f, gfc_expr *x)
672627f7eb2Smrg {
673627f7eb2Smrg f->ts = x->ts;
674627f7eb2Smrg f->value.function.name = gfc_get_string ("__conjg_%d", x->ts.kind);
675627f7eb2Smrg }
676627f7eb2Smrg
677627f7eb2Smrg
678627f7eb2Smrg void
gfc_resolve_cos(gfc_expr * f,gfc_expr * x)679627f7eb2Smrg gfc_resolve_cos (gfc_expr *f, gfc_expr *x)
680627f7eb2Smrg {
681627f7eb2Smrg f->ts = x->ts;
682627f7eb2Smrg f->value.function.name
683627f7eb2Smrg = gfc_get_string ("__cos_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
684627f7eb2Smrg }
685627f7eb2Smrg
686627f7eb2Smrg
687627f7eb2Smrg void
gfc_resolve_cosh(gfc_expr * f,gfc_expr * x)688627f7eb2Smrg gfc_resolve_cosh (gfc_expr *f, gfc_expr *x)
689627f7eb2Smrg {
690627f7eb2Smrg f->ts = x->ts;
691627f7eb2Smrg f->value.function.name
692627f7eb2Smrg = gfc_get_string ("__cosh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
693627f7eb2Smrg }
694627f7eb2Smrg
695627f7eb2Smrg
696627f7eb2Smrg void
gfc_resolve_count(gfc_expr * f,gfc_expr * mask,gfc_expr * dim,gfc_expr * kind)697627f7eb2Smrg gfc_resolve_count (gfc_expr *f, gfc_expr *mask, gfc_expr *dim, gfc_expr *kind)
698627f7eb2Smrg {
699627f7eb2Smrg f->ts.type = BT_INTEGER;
700627f7eb2Smrg if (kind)
701627f7eb2Smrg f->ts.kind = mpz_get_si (kind->value.integer);
702627f7eb2Smrg else
703627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
704627f7eb2Smrg
705627f7eb2Smrg if (dim != NULL)
706627f7eb2Smrg {
707627f7eb2Smrg f->rank = mask->rank - 1;
708627f7eb2Smrg gfc_resolve_dim_arg (dim);
709627f7eb2Smrg f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
710627f7eb2Smrg }
711627f7eb2Smrg
712627f7eb2Smrg resolve_mask_arg (mask);
713627f7eb2Smrg
714627f7eb2Smrg f->value.function.name
715627f7eb2Smrg = gfc_get_string (PREFIX ("count_%d_%c"), f->ts.kind,
716627f7eb2Smrg gfc_type_letter (mask->ts.type));
717627f7eb2Smrg }
718627f7eb2Smrg
719627f7eb2Smrg
720627f7eb2Smrg void
gfc_resolve_cshift(gfc_expr * f,gfc_expr * array,gfc_expr * shift,gfc_expr * dim)721627f7eb2Smrg gfc_resolve_cshift (gfc_expr *f, gfc_expr *array, gfc_expr *shift,
722627f7eb2Smrg gfc_expr *dim)
723627f7eb2Smrg {
724627f7eb2Smrg int n, m;
725627f7eb2Smrg
726627f7eb2Smrg if (array->ts.type == BT_CHARACTER && array->ref)
727627f7eb2Smrg gfc_resolve_substring_charlen (array);
728627f7eb2Smrg
729627f7eb2Smrg f->ts = array->ts;
730627f7eb2Smrg f->rank = array->rank;
731627f7eb2Smrg f->shape = gfc_copy_shape (array->shape, array->rank);
732627f7eb2Smrg
733627f7eb2Smrg if (shift->rank > 0)
734627f7eb2Smrg n = 1;
735627f7eb2Smrg else
736627f7eb2Smrg n = 0;
737627f7eb2Smrg
738627f7eb2Smrg /* If dim kind is greater than default integer we need to use the larger. */
739627f7eb2Smrg m = gfc_default_integer_kind;
740627f7eb2Smrg if (dim != NULL)
741627f7eb2Smrg m = m < dim->ts.kind ? dim->ts.kind : m;
742627f7eb2Smrg
743627f7eb2Smrg /* Convert shift to at least m, so we don't need
744627f7eb2Smrg kind=1 and kind=2 versions of the library functions. */
745627f7eb2Smrg if (shift->ts.kind < m)
746627f7eb2Smrg {
747627f7eb2Smrg gfc_typespec ts;
748627f7eb2Smrg gfc_clear_ts (&ts);
749627f7eb2Smrg ts.type = BT_INTEGER;
750627f7eb2Smrg ts.kind = m;
751627f7eb2Smrg gfc_convert_type_warn (shift, &ts, 2, 0);
752627f7eb2Smrg }
753627f7eb2Smrg
754627f7eb2Smrg if (dim != NULL)
755627f7eb2Smrg {
756627f7eb2Smrg if (dim->expr_type != EXPR_CONSTANT && dim->symtree != NULL
757627f7eb2Smrg && dim->symtree->n.sym->attr.optional)
758627f7eb2Smrg {
759627f7eb2Smrg /* Mark this for later setting the type in gfc_conv_missing_dummy. */
760627f7eb2Smrg dim->representation.length = shift->ts.kind;
761627f7eb2Smrg }
762627f7eb2Smrg else
763627f7eb2Smrg {
764627f7eb2Smrg gfc_resolve_dim_arg (dim);
765627f7eb2Smrg /* Convert dim to shift's kind to reduce variations. */
766627f7eb2Smrg if (dim->ts.kind != shift->ts.kind)
767627f7eb2Smrg gfc_convert_type_warn (dim, &shift->ts, 2, 0);
768627f7eb2Smrg }
769627f7eb2Smrg }
770627f7eb2Smrg
771627f7eb2Smrg if (array->ts.type == BT_CHARACTER)
772627f7eb2Smrg {
773627f7eb2Smrg if (array->ts.kind == gfc_default_character_kind)
774627f7eb2Smrg f->value.function.name
775627f7eb2Smrg = gfc_get_string (PREFIX ("cshift%d_%d_char"), n, shift->ts.kind);
776627f7eb2Smrg else
777627f7eb2Smrg f->value.function.name
778627f7eb2Smrg = gfc_get_string (PREFIX ("cshift%d_%d_char%d"), n, shift->ts.kind,
779627f7eb2Smrg array->ts.kind);
780627f7eb2Smrg }
781627f7eb2Smrg else
782627f7eb2Smrg f->value.function.name
783627f7eb2Smrg = gfc_get_string (PREFIX ("cshift%d_%d"), n, shift->ts.kind);
784627f7eb2Smrg }
785627f7eb2Smrg
786627f7eb2Smrg
787627f7eb2Smrg void
gfc_resolve_ctime(gfc_expr * f,gfc_expr * time)788627f7eb2Smrg gfc_resolve_ctime (gfc_expr *f, gfc_expr *time)
789627f7eb2Smrg {
790627f7eb2Smrg gfc_typespec ts;
791627f7eb2Smrg gfc_clear_ts (&ts);
792627f7eb2Smrg
793627f7eb2Smrg f->ts.type = BT_CHARACTER;
794627f7eb2Smrg f->ts.kind = gfc_default_character_kind;
795627f7eb2Smrg
796627f7eb2Smrg /* ctime TIME argument is a INTEGER(KIND=8), says the doc */
797627f7eb2Smrg if (time->ts.kind != 8)
798627f7eb2Smrg {
799627f7eb2Smrg ts.type = BT_INTEGER;
800627f7eb2Smrg ts.kind = 8;
801627f7eb2Smrg ts.u.derived = NULL;
802627f7eb2Smrg ts.u.cl = NULL;
803627f7eb2Smrg gfc_convert_type (time, &ts, 2);
804627f7eb2Smrg }
805627f7eb2Smrg
806627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("ctime"));
807627f7eb2Smrg }
808627f7eb2Smrg
809627f7eb2Smrg
810627f7eb2Smrg void
gfc_resolve_dble(gfc_expr * f,gfc_expr * a)811627f7eb2Smrg gfc_resolve_dble (gfc_expr *f, gfc_expr *a)
812627f7eb2Smrg {
813627f7eb2Smrg f->ts.type = BT_REAL;
814627f7eb2Smrg f->ts.kind = gfc_default_double_kind;
815627f7eb2Smrg f->value.function.name
816627f7eb2Smrg = gfc_get_string ("__dble_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
817627f7eb2Smrg }
818627f7eb2Smrg
819627f7eb2Smrg
820627f7eb2Smrg void
gfc_resolve_dim(gfc_expr * f,gfc_expr * a,gfc_expr * p)821627f7eb2Smrg gfc_resolve_dim (gfc_expr *f, gfc_expr *a, gfc_expr *p)
822627f7eb2Smrg {
823627f7eb2Smrg f->ts.type = a->ts.type;
824627f7eb2Smrg if (p != NULL)
825627f7eb2Smrg f->ts.kind = gfc_kind_max (a,p);
826627f7eb2Smrg else
827627f7eb2Smrg f->ts.kind = a->ts.kind;
828627f7eb2Smrg
829627f7eb2Smrg if (p != NULL && a->ts.kind != p->ts.kind)
830627f7eb2Smrg {
831627f7eb2Smrg if (a->ts.kind == gfc_kind_max (a,p))
832627f7eb2Smrg gfc_convert_type (p, &a->ts, 2);
833627f7eb2Smrg else
834627f7eb2Smrg gfc_convert_type (a, &p->ts, 2);
835627f7eb2Smrg }
836627f7eb2Smrg
837627f7eb2Smrg f->value.function.name
838627f7eb2Smrg = gfc_get_string ("__dim_%c%d", gfc_type_letter (f->ts.type), f->ts.kind);
839627f7eb2Smrg }
840627f7eb2Smrg
841627f7eb2Smrg
842627f7eb2Smrg void
gfc_resolve_dot_product(gfc_expr * f,gfc_expr * a,gfc_expr * b)843627f7eb2Smrg gfc_resolve_dot_product (gfc_expr *f, gfc_expr *a, gfc_expr *b)
844627f7eb2Smrg {
845627f7eb2Smrg gfc_expr temp;
846627f7eb2Smrg
847627f7eb2Smrg temp.expr_type = EXPR_OP;
848627f7eb2Smrg gfc_clear_ts (&temp.ts);
849627f7eb2Smrg temp.value.op.op = INTRINSIC_NONE;
850627f7eb2Smrg temp.value.op.op1 = a;
851627f7eb2Smrg temp.value.op.op2 = b;
852627f7eb2Smrg gfc_type_convert_binary (&temp, 1);
853627f7eb2Smrg f->ts = temp.ts;
854627f7eb2Smrg f->value.function.name
855627f7eb2Smrg = gfc_get_string (PREFIX ("dot_product_%c%d"),
856627f7eb2Smrg gfc_type_letter (f->ts.type), f->ts.kind);
857627f7eb2Smrg }
858627f7eb2Smrg
859627f7eb2Smrg
860627f7eb2Smrg void
gfc_resolve_dprod(gfc_expr * f,gfc_expr * a ATTRIBUTE_UNUSED,gfc_expr * b ATTRIBUTE_UNUSED)861627f7eb2Smrg gfc_resolve_dprod (gfc_expr *f, gfc_expr *a ATTRIBUTE_UNUSED,
862627f7eb2Smrg gfc_expr *b ATTRIBUTE_UNUSED)
863627f7eb2Smrg {
864627f7eb2Smrg f->ts.kind = gfc_default_double_kind;
865627f7eb2Smrg f->ts.type = BT_REAL;
866627f7eb2Smrg f->value.function.name = gfc_get_string ("__dprod_r%d", f->ts.kind);
867627f7eb2Smrg }
868627f7eb2Smrg
869627f7eb2Smrg
870627f7eb2Smrg void
gfc_resolve_dshift(gfc_expr * f,gfc_expr * i,gfc_expr * j ATTRIBUTE_UNUSED,gfc_expr * shift ATTRIBUTE_UNUSED)871627f7eb2Smrg gfc_resolve_dshift (gfc_expr *f, gfc_expr *i, gfc_expr *j ATTRIBUTE_UNUSED,
872627f7eb2Smrg gfc_expr *shift ATTRIBUTE_UNUSED)
873627f7eb2Smrg {
874627f7eb2Smrg f->ts = i->ts;
875627f7eb2Smrg if (f->value.function.isym->id == GFC_ISYM_DSHIFTL)
876627f7eb2Smrg f->value.function.name = gfc_get_string ("dshiftl_i%d", f->ts.kind);
877627f7eb2Smrg else if (f->value.function.isym->id == GFC_ISYM_DSHIFTR)
878627f7eb2Smrg f->value.function.name = gfc_get_string ("dshiftr_i%d", f->ts.kind);
879627f7eb2Smrg else
880627f7eb2Smrg gcc_unreachable ();
881627f7eb2Smrg }
882627f7eb2Smrg
883627f7eb2Smrg
884627f7eb2Smrg void
gfc_resolve_eoshift(gfc_expr * f,gfc_expr * array,gfc_expr * shift,gfc_expr * boundary,gfc_expr * dim)885627f7eb2Smrg gfc_resolve_eoshift (gfc_expr *f, gfc_expr *array, gfc_expr *shift,
886627f7eb2Smrg gfc_expr *boundary, gfc_expr *dim)
887627f7eb2Smrg {
888627f7eb2Smrg int n, m;
889627f7eb2Smrg
890627f7eb2Smrg if (array->ts.type == BT_CHARACTER && array->ref)
891627f7eb2Smrg gfc_resolve_substring_charlen (array);
892627f7eb2Smrg
893627f7eb2Smrg f->ts = array->ts;
894627f7eb2Smrg f->rank = array->rank;
895627f7eb2Smrg f->shape = gfc_copy_shape (array->shape, array->rank);
896627f7eb2Smrg
897627f7eb2Smrg n = 0;
898627f7eb2Smrg if (shift->rank > 0)
899627f7eb2Smrg n = n | 1;
900627f7eb2Smrg if (boundary && boundary->rank > 0)
901627f7eb2Smrg n = n | 2;
902627f7eb2Smrg
903627f7eb2Smrg /* If dim kind is greater than default integer we need to use the larger. */
904627f7eb2Smrg m = gfc_default_integer_kind;
905627f7eb2Smrg if (dim != NULL)
906627f7eb2Smrg m = m < dim->ts.kind ? dim->ts.kind : m;
907627f7eb2Smrg
908627f7eb2Smrg /* Convert shift to at least m, so we don't need
909627f7eb2Smrg kind=1 and kind=2 versions of the library functions. */
910627f7eb2Smrg if (shift->ts.kind < m)
911627f7eb2Smrg {
912627f7eb2Smrg gfc_typespec ts;
913627f7eb2Smrg gfc_clear_ts (&ts);
914627f7eb2Smrg ts.type = BT_INTEGER;
915627f7eb2Smrg ts.kind = m;
916627f7eb2Smrg gfc_convert_type_warn (shift, &ts, 2, 0);
917627f7eb2Smrg }
918627f7eb2Smrg
919627f7eb2Smrg if (dim != NULL)
920627f7eb2Smrg {
921627f7eb2Smrg if (dim->expr_type != EXPR_CONSTANT && dim->symtree != NULL
922627f7eb2Smrg && dim->symtree->n.sym->attr.optional)
923627f7eb2Smrg {
924627f7eb2Smrg /* Mark this for later setting the type in gfc_conv_missing_dummy. */
925627f7eb2Smrg dim->representation.length = shift->ts.kind;
926627f7eb2Smrg }
927627f7eb2Smrg else
928627f7eb2Smrg {
929627f7eb2Smrg gfc_resolve_dim_arg (dim);
930627f7eb2Smrg /* Convert dim to shift's kind to reduce variations. */
931627f7eb2Smrg if (dim->ts.kind != shift->ts.kind)
932627f7eb2Smrg gfc_convert_type_warn (dim, &shift->ts, 2, 0);
933627f7eb2Smrg }
934627f7eb2Smrg }
935627f7eb2Smrg
936627f7eb2Smrg if (array->ts.type == BT_CHARACTER)
937627f7eb2Smrg {
938627f7eb2Smrg if (array->ts.kind == gfc_default_character_kind)
939627f7eb2Smrg f->value.function.name
940627f7eb2Smrg = gfc_get_string (PREFIX ("eoshift%d_%d_char"), n, shift->ts.kind);
941627f7eb2Smrg else
942627f7eb2Smrg f->value.function.name
943627f7eb2Smrg = gfc_get_string (PREFIX ("eoshift%d_%d_char%d"), n, shift->ts.kind,
944627f7eb2Smrg array->ts.kind);
945627f7eb2Smrg }
946627f7eb2Smrg else
947627f7eb2Smrg f->value.function.name
948627f7eb2Smrg = gfc_get_string (PREFIX ("eoshift%d_%d"), n, shift->ts.kind);
949627f7eb2Smrg }
950627f7eb2Smrg
951627f7eb2Smrg
952627f7eb2Smrg void
gfc_resolve_exp(gfc_expr * f,gfc_expr * x)953627f7eb2Smrg gfc_resolve_exp (gfc_expr *f, gfc_expr *x)
954627f7eb2Smrg {
955627f7eb2Smrg f->ts = x->ts;
956627f7eb2Smrg f->value.function.name
957627f7eb2Smrg = gfc_get_string ("__exp_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
958627f7eb2Smrg }
959627f7eb2Smrg
960627f7eb2Smrg
961627f7eb2Smrg void
gfc_resolve_exponent(gfc_expr * f,gfc_expr * x)962627f7eb2Smrg gfc_resolve_exponent (gfc_expr *f, gfc_expr *x)
963627f7eb2Smrg {
964627f7eb2Smrg f->ts.type = BT_INTEGER;
965627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
966627f7eb2Smrg f->value.function.name = gfc_get_string ("__exponent_%d", x->ts.kind);
967627f7eb2Smrg }
968627f7eb2Smrg
969627f7eb2Smrg
970627f7eb2Smrg /* Resolve the EXTENDS_TYPE_OF intrinsic function. */
971627f7eb2Smrg
972627f7eb2Smrg void
gfc_resolve_extends_type_of(gfc_expr * f,gfc_expr * a,gfc_expr * mo)973627f7eb2Smrg gfc_resolve_extends_type_of (gfc_expr *f, gfc_expr *a, gfc_expr *mo)
974627f7eb2Smrg {
975627f7eb2Smrg gfc_symbol *vtab;
976627f7eb2Smrg gfc_symtree *st;
977627f7eb2Smrg
978627f7eb2Smrg /* Prevent double resolution. */
979627f7eb2Smrg if (f->ts.type == BT_LOGICAL)
980627f7eb2Smrg return;
981627f7eb2Smrg
982627f7eb2Smrg /* Replace the first argument with the corresponding vtab. */
983627f7eb2Smrg if (a->ts.type == BT_CLASS)
984627f7eb2Smrg gfc_add_vptr_component (a);
985627f7eb2Smrg else if (a->ts.type == BT_DERIVED)
986627f7eb2Smrg {
987627f7eb2Smrg locus where;
988627f7eb2Smrg
989627f7eb2Smrg vtab = gfc_find_derived_vtab (a->ts.u.derived);
990627f7eb2Smrg /* Clear the old expr. */
991627f7eb2Smrg gfc_free_ref_list (a->ref);
992627f7eb2Smrg where = a->where;
993627f7eb2Smrg memset (a, '\0', sizeof (gfc_expr));
994627f7eb2Smrg /* Construct a new one. */
995627f7eb2Smrg a->expr_type = EXPR_VARIABLE;
996627f7eb2Smrg st = gfc_find_symtree (vtab->ns->sym_root, vtab->name);
997627f7eb2Smrg a->symtree = st;
998627f7eb2Smrg a->ts = vtab->ts;
999627f7eb2Smrg a->where = where;
1000627f7eb2Smrg }
1001627f7eb2Smrg
1002627f7eb2Smrg /* Replace the second argument with the corresponding vtab. */
1003627f7eb2Smrg if (mo->ts.type == BT_CLASS)
1004627f7eb2Smrg gfc_add_vptr_component (mo);
1005627f7eb2Smrg else if (mo->ts.type == BT_DERIVED)
1006627f7eb2Smrg {
1007627f7eb2Smrg locus where;
1008627f7eb2Smrg
1009627f7eb2Smrg vtab = gfc_find_derived_vtab (mo->ts.u.derived);
1010627f7eb2Smrg /* Clear the old expr. */
1011627f7eb2Smrg where = mo->where;
1012627f7eb2Smrg gfc_free_ref_list (mo->ref);
1013627f7eb2Smrg memset (mo, '\0', sizeof (gfc_expr));
1014627f7eb2Smrg /* Construct a new one. */
1015627f7eb2Smrg mo->expr_type = EXPR_VARIABLE;
1016627f7eb2Smrg st = gfc_find_symtree (vtab->ns->sym_root, vtab->name);
1017627f7eb2Smrg mo->symtree = st;
1018627f7eb2Smrg mo->ts = vtab->ts;
1019627f7eb2Smrg mo->where = where;
1020627f7eb2Smrg }
1021627f7eb2Smrg
1022627f7eb2Smrg f->ts.type = BT_LOGICAL;
1023627f7eb2Smrg f->ts.kind = 4;
1024627f7eb2Smrg
1025627f7eb2Smrg f->value.function.isym->formal->ts = a->ts;
1026627f7eb2Smrg f->value.function.isym->formal->next->ts = mo->ts;
1027627f7eb2Smrg
1028627f7eb2Smrg /* Call library function. */
1029627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("is_extension_of"));
1030627f7eb2Smrg }
1031627f7eb2Smrg
1032627f7eb2Smrg
1033627f7eb2Smrg void
gfc_resolve_fdate(gfc_expr * f)1034627f7eb2Smrg gfc_resolve_fdate (gfc_expr *f)
1035627f7eb2Smrg {
1036627f7eb2Smrg f->ts.type = BT_CHARACTER;
1037627f7eb2Smrg f->ts.kind = gfc_default_character_kind;
1038627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("fdate"));
1039627f7eb2Smrg }
1040627f7eb2Smrg
1041627f7eb2Smrg
1042627f7eb2Smrg void
gfc_resolve_floor(gfc_expr * f,gfc_expr * a,gfc_expr * kind)1043627f7eb2Smrg gfc_resolve_floor (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
1044627f7eb2Smrg {
1045627f7eb2Smrg f->ts.type = BT_INTEGER;
1046627f7eb2Smrg f->ts.kind = (kind == NULL)
1047627f7eb2Smrg ? gfc_default_integer_kind : mpz_get_si (kind->value.integer);
1048627f7eb2Smrg f->value.function.name
1049627f7eb2Smrg = gfc_get_string ("__floor%d_%c%d", f->ts.kind,
1050627f7eb2Smrg gfc_type_letter (a->ts.type), a->ts.kind);
1051627f7eb2Smrg }
1052627f7eb2Smrg
1053627f7eb2Smrg
1054627f7eb2Smrg void
gfc_resolve_fnum(gfc_expr * f,gfc_expr * n)1055627f7eb2Smrg gfc_resolve_fnum (gfc_expr *f, gfc_expr *n)
1056627f7eb2Smrg {
1057627f7eb2Smrg f->ts.type = BT_INTEGER;
1058627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
1059627f7eb2Smrg if (n->ts.kind != f->ts.kind)
1060627f7eb2Smrg gfc_convert_type (n, &f->ts, 2);
1061627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("fnum_i%d"), f->ts.kind);
1062627f7eb2Smrg }
1063627f7eb2Smrg
1064627f7eb2Smrg
1065627f7eb2Smrg void
gfc_resolve_fraction(gfc_expr * f,gfc_expr * x)1066627f7eb2Smrg gfc_resolve_fraction (gfc_expr *f, gfc_expr *x)
1067627f7eb2Smrg {
1068627f7eb2Smrg f->ts = x->ts;
1069627f7eb2Smrg f->value.function.name = gfc_get_string ("__fraction_%d", x->ts.kind);
1070627f7eb2Smrg }
1071627f7eb2Smrg
1072627f7eb2Smrg
1073627f7eb2Smrg /* Resolve single-argument g77 math intrinsics, eg BESY0, ERF. */
1074627f7eb2Smrg
1075627f7eb2Smrg void
gfc_resolve_g77_math1(gfc_expr * f,gfc_expr * x)1076627f7eb2Smrg gfc_resolve_g77_math1 (gfc_expr *f, gfc_expr *x)
1077627f7eb2Smrg {
1078627f7eb2Smrg f->ts = x->ts;
1079627f7eb2Smrg f->value.function.name = gfc_get_string ("<intrinsic>");
1080627f7eb2Smrg }
1081627f7eb2Smrg
1082627f7eb2Smrg
1083627f7eb2Smrg void
gfc_resolve_gamma(gfc_expr * f,gfc_expr * x)1084627f7eb2Smrg gfc_resolve_gamma (gfc_expr *f, gfc_expr *x)
1085627f7eb2Smrg {
1086627f7eb2Smrg f->ts = x->ts;
1087627f7eb2Smrg f->value.function.name
1088627f7eb2Smrg = gfc_get_string ("__tgamma_%d", x->ts.kind);
1089627f7eb2Smrg }
1090627f7eb2Smrg
1091627f7eb2Smrg
1092627f7eb2Smrg void
gfc_resolve_getcwd(gfc_expr * f,gfc_expr * n ATTRIBUTE_UNUSED)1093627f7eb2Smrg gfc_resolve_getcwd (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED)
1094627f7eb2Smrg {
1095627f7eb2Smrg f->ts.type = BT_INTEGER;
1096627f7eb2Smrg f->ts.kind = 4;
1097627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("getcwd"));
1098627f7eb2Smrg }
1099627f7eb2Smrg
1100627f7eb2Smrg
1101627f7eb2Smrg void
gfc_resolve_getgid(gfc_expr * f)1102627f7eb2Smrg gfc_resolve_getgid (gfc_expr *f)
1103627f7eb2Smrg {
1104627f7eb2Smrg f->ts.type = BT_INTEGER;
1105627f7eb2Smrg f->ts.kind = 4;
1106627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("getgid"));
1107627f7eb2Smrg }
1108627f7eb2Smrg
1109627f7eb2Smrg
1110627f7eb2Smrg void
gfc_resolve_getpid(gfc_expr * f)1111627f7eb2Smrg gfc_resolve_getpid (gfc_expr *f)
1112627f7eb2Smrg {
1113627f7eb2Smrg f->ts.type = BT_INTEGER;
1114627f7eb2Smrg f->ts.kind = 4;
1115627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("getpid"));
1116627f7eb2Smrg }
1117627f7eb2Smrg
1118627f7eb2Smrg
1119627f7eb2Smrg void
gfc_resolve_getuid(gfc_expr * f)1120627f7eb2Smrg gfc_resolve_getuid (gfc_expr *f)
1121627f7eb2Smrg {
1122627f7eb2Smrg f->ts.type = BT_INTEGER;
1123627f7eb2Smrg f->ts.kind = 4;
1124627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("getuid"));
1125627f7eb2Smrg }
1126627f7eb2Smrg
1127627f7eb2Smrg
1128627f7eb2Smrg void
gfc_resolve_hostnm(gfc_expr * f,gfc_expr * n ATTRIBUTE_UNUSED)1129627f7eb2Smrg gfc_resolve_hostnm (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED)
1130627f7eb2Smrg {
1131627f7eb2Smrg f->ts.type = BT_INTEGER;
1132627f7eb2Smrg f->ts.kind = 4;
1133627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("hostnm"));
1134627f7eb2Smrg }
1135627f7eb2Smrg
1136627f7eb2Smrg
1137627f7eb2Smrg void
gfc_resolve_hypot(gfc_expr * f,gfc_expr * x,gfc_expr * y ATTRIBUTE_UNUSED)1138627f7eb2Smrg gfc_resolve_hypot (gfc_expr *f, gfc_expr *x, gfc_expr *y ATTRIBUTE_UNUSED)
1139627f7eb2Smrg {
1140627f7eb2Smrg f->ts = x->ts;
1141627f7eb2Smrg f->value.function.name = gfc_get_string ("__hypot_r%d", x->ts.kind);
1142627f7eb2Smrg }
1143627f7eb2Smrg
1144627f7eb2Smrg
1145627f7eb2Smrg void
gfc_resolve_iall(gfc_expr * f,gfc_expr * array,gfc_expr * dim,gfc_expr * mask)1146627f7eb2Smrg gfc_resolve_iall (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
1147627f7eb2Smrg {
1148627f7eb2Smrg resolve_transformational ("iall", f, array, dim, mask);
1149627f7eb2Smrg }
1150627f7eb2Smrg
1151627f7eb2Smrg
1152627f7eb2Smrg void
gfc_resolve_iand(gfc_expr * f,gfc_expr * i,gfc_expr * j)1153627f7eb2Smrg gfc_resolve_iand (gfc_expr *f, gfc_expr *i, gfc_expr *j)
1154627f7eb2Smrg {
1155627f7eb2Smrg /* If the kind of i and j are different, then g77 cross-promoted the
1156627f7eb2Smrg kinds to the largest value. The Fortran 95 standard requires the
1157627f7eb2Smrg kinds to match. */
1158627f7eb2Smrg if (i->ts.kind != j->ts.kind)
1159627f7eb2Smrg {
1160627f7eb2Smrg if (i->ts.kind == gfc_kind_max (i, j))
1161627f7eb2Smrg gfc_convert_type (j, &i->ts, 2);
1162627f7eb2Smrg else
1163627f7eb2Smrg gfc_convert_type (i, &j->ts, 2);
1164627f7eb2Smrg }
1165627f7eb2Smrg
1166627f7eb2Smrg f->ts = i->ts;
1167627f7eb2Smrg f->value.function.name = gfc_get_string ("__iand_%d", i->ts.kind);
1168627f7eb2Smrg }
1169627f7eb2Smrg
1170627f7eb2Smrg
1171627f7eb2Smrg void
gfc_resolve_iany(gfc_expr * f,gfc_expr * array,gfc_expr * dim,gfc_expr * mask)1172627f7eb2Smrg gfc_resolve_iany (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
1173627f7eb2Smrg {
1174627f7eb2Smrg resolve_transformational ("iany", f, array, dim, mask);
1175627f7eb2Smrg }
1176627f7eb2Smrg
1177627f7eb2Smrg
1178627f7eb2Smrg void
gfc_resolve_ibclr(gfc_expr * f,gfc_expr * i,gfc_expr * pos ATTRIBUTE_UNUSED)1179627f7eb2Smrg gfc_resolve_ibclr (gfc_expr *f, gfc_expr *i, gfc_expr *pos ATTRIBUTE_UNUSED)
1180627f7eb2Smrg {
1181627f7eb2Smrg f->ts = i->ts;
1182627f7eb2Smrg f->value.function.name = gfc_get_string ("__ibclr_%d", i->ts.kind);
1183627f7eb2Smrg }
1184627f7eb2Smrg
1185627f7eb2Smrg
1186627f7eb2Smrg void
gfc_resolve_ibits(gfc_expr * f,gfc_expr * i,gfc_expr * pos ATTRIBUTE_UNUSED,gfc_expr * len ATTRIBUTE_UNUSED)1187627f7eb2Smrg gfc_resolve_ibits (gfc_expr *f, gfc_expr *i, gfc_expr *pos ATTRIBUTE_UNUSED,
1188627f7eb2Smrg gfc_expr *len ATTRIBUTE_UNUSED)
1189627f7eb2Smrg {
1190627f7eb2Smrg f->ts = i->ts;
1191627f7eb2Smrg f->value.function.name = gfc_get_string ("__ibits_%d", i->ts.kind);
1192627f7eb2Smrg }
1193627f7eb2Smrg
1194627f7eb2Smrg
1195627f7eb2Smrg void
gfc_resolve_ibset(gfc_expr * f,gfc_expr * i,gfc_expr * pos ATTRIBUTE_UNUSED)1196627f7eb2Smrg gfc_resolve_ibset (gfc_expr *f, gfc_expr *i, gfc_expr *pos ATTRIBUTE_UNUSED)
1197627f7eb2Smrg {
1198627f7eb2Smrg f->ts = i->ts;
1199627f7eb2Smrg f->value.function.name = gfc_get_string ("__ibset_%d", i->ts.kind);
1200627f7eb2Smrg }
1201627f7eb2Smrg
1202627f7eb2Smrg
1203627f7eb2Smrg void
gfc_resolve_iachar(gfc_expr * f,gfc_expr * c,gfc_expr * kind)1204627f7eb2Smrg gfc_resolve_iachar (gfc_expr *f, gfc_expr *c, gfc_expr *kind)
1205627f7eb2Smrg {
1206627f7eb2Smrg f->ts.type = BT_INTEGER;
1207627f7eb2Smrg if (kind)
1208627f7eb2Smrg f->ts.kind = mpz_get_si (kind->value.integer);
1209627f7eb2Smrg else
1210627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
1211627f7eb2Smrg f->value.function.name = gfc_get_string ("__ichar_%d", c->ts.kind);
1212627f7eb2Smrg }
1213627f7eb2Smrg
1214627f7eb2Smrg
1215627f7eb2Smrg void
gfc_resolve_ichar(gfc_expr * f,gfc_expr * c,gfc_expr * kind)1216627f7eb2Smrg gfc_resolve_ichar (gfc_expr *f, gfc_expr *c, gfc_expr *kind)
1217627f7eb2Smrg {
1218627f7eb2Smrg f->ts.type = BT_INTEGER;
1219627f7eb2Smrg if (kind)
1220627f7eb2Smrg f->ts.kind = mpz_get_si (kind->value.integer);
1221627f7eb2Smrg else
1222627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
1223627f7eb2Smrg f->value.function.name = gfc_get_string ("__ichar_%d", c->ts.kind);
1224627f7eb2Smrg }
1225627f7eb2Smrg
1226627f7eb2Smrg
1227627f7eb2Smrg void
gfc_resolve_idnint(gfc_expr * f,gfc_expr * a)1228627f7eb2Smrg gfc_resolve_idnint (gfc_expr *f, gfc_expr *a)
1229627f7eb2Smrg {
1230627f7eb2Smrg gfc_resolve_nint (f, a, NULL);
1231627f7eb2Smrg }
1232627f7eb2Smrg
1233627f7eb2Smrg
1234627f7eb2Smrg void
gfc_resolve_ierrno(gfc_expr * f)1235627f7eb2Smrg gfc_resolve_ierrno (gfc_expr *f)
1236627f7eb2Smrg {
1237627f7eb2Smrg f->ts.type = BT_INTEGER;
1238627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
1239627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("ierrno_i%d"), f->ts.kind);
1240627f7eb2Smrg }
1241627f7eb2Smrg
1242627f7eb2Smrg
1243627f7eb2Smrg void
gfc_resolve_ieor(gfc_expr * f,gfc_expr * i,gfc_expr * j)1244627f7eb2Smrg gfc_resolve_ieor (gfc_expr *f, gfc_expr *i, gfc_expr *j)
1245627f7eb2Smrg {
1246627f7eb2Smrg /* If the kind of i and j are different, then g77 cross-promoted the
1247627f7eb2Smrg kinds to the largest value. The Fortran 95 standard requires the
1248627f7eb2Smrg kinds to match. */
1249627f7eb2Smrg if (i->ts.kind != j->ts.kind)
1250627f7eb2Smrg {
1251627f7eb2Smrg if (i->ts.kind == gfc_kind_max (i, j))
1252627f7eb2Smrg gfc_convert_type (j, &i->ts, 2);
1253627f7eb2Smrg else
1254627f7eb2Smrg gfc_convert_type (i, &j->ts, 2);
1255627f7eb2Smrg }
1256627f7eb2Smrg
1257627f7eb2Smrg f->ts = i->ts;
1258627f7eb2Smrg f->value.function.name = gfc_get_string ("__ieor_%d", i->ts.kind);
1259627f7eb2Smrg }
1260627f7eb2Smrg
1261627f7eb2Smrg
1262627f7eb2Smrg void
gfc_resolve_ior(gfc_expr * f,gfc_expr * i,gfc_expr * j)1263627f7eb2Smrg gfc_resolve_ior (gfc_expr *f, gfc_expr *i, gfc_expr *j)
1264627f7eb2Smrg {
1265627f7eb2Smrg /* If the kind of i and j are different, then g77 cross-promoted the
1266627f7eb2Smrg kinds to the largest value. The Fortran 95 standard requires the
1267627f7eb2Smrg kinds to match. */
1268627f7eb2Smrg if (i->ts.kind != j->ts.kind)
1269627f7eb2Smrg {
1270627f7eb2Smrg if (i->ts.kind == gfc_kind_max (i, j))
1271627f7eb2Smrg gfc_convert_type (j, &i->ts, 2);
1272627f7eb2Smrg else
1273627f7eb2Smrg gfc_convert_type (i, &j->ts, 2);
1274627f7eb2Smrg }
1275627f7eb2Smrg
1276627f7eb2Smrg f->ts = i->ts;
1277627f7eb2Smrg f->value.function.name = gfc_get_string ("__ior_%d", i->ts.kind);
1278627f7eb2Smrg }
1279627f7eb2Smrg
1280627f7eb2Smrg
1281627f7eb2Smrg void
gfc_resolve_index_func(gfc_expr * f,gfc_actual_arglist * a)12824c3eb207Smrg gfc_resolve_index_func (gfc_expr *f, gfc_actual_arglist *a)
1283627f7eb2Smrg {
1284627f7eb2Smrg gfc_typespec ts;
1285627f7eb2Smrg gfc_clear_ts (&ts);
12864c3eb207Smrg gfc_expr *str, *back, *kind;
12874c3eb207Smrg gfc_actual_arglist *a_sub_str, *a_back, *a_kind;
12884c3eb207Smrg
12894c3eb207Smrg if (f->do_not_resolve_again)
12904c3eb207Smrg return;
12914c3eb207Smrg
12924c3eb207Smrg a_sub_str = a->next;
12934c3eb207Smrg a_back = a_sub_str->next;
12944c3eb207Smrg a_kind = a_back->next;
12954c3eb207Smrg
12964c3eb207Smrg str = a->expr;
12974c3eb207Smrg back = a_back->expr;
12984c3eb207Smrg kind = a_kind->expr;
1299627f7eb2Smrg
1300627f7eb2Smrg f->ts.type = BT_INTEGER;
1301627f7eb2Smrg if (kind)
13024c3eb207Smrg f->ts.kind = mpz_get_si ((kind)->value.integer);
1303627f7eb2Smrg else
1304627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
1305627f7eb2Smrg
1306627f7eb2Smrg if (back && back->ts.kind != gfc_default_integer_kind)
1307627f7eb2Smrg {
1308627f7eb2Smrg ts.type = BT_LOGICAL;
1309627f7eb2Smrg ts.kind = gfc_default_integer_kind;
1310627f7eb2Smrg ts.u.derived = NULL;
1311627f7eb2Smrg ts.u.cl = NULL;
1312627f7eb2Smrg gfc_convert_type (back, &ts, 2);
1313627f7eb2Smrg }
1314627f7eb2Smrg
1315627f7eb2Smrg f->value.function.name
1316627f7eb2Smrg = gfc_get_string ("__index_%d_i%d", str->ts.kind, f->ts.kind);
13174c3eb207Smrg
13184c3eb207Smrg f->do_not_resolve_again = 1;
1319627f7eb2Smrg }
1320627f7eb2Smrg
1321627f7eb2Smrg
1322627f7eb2Smrg void
gfc_resolve_int(gfc_expr * f,gfc_expr * a,gfc_expr * kind)1323627f7eb2Smrg gfc_resolve_int (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
1324627f7eb2Smrg {
1325627f7eb2Smrg f->ts.type = BT_INTEGER;
1326627f7eb2Smrg f->ts.kind = (kind == NULL)
1327627f7eb2Smrg ? gfc_default_integer_kind : mpz_get_si (kind->value.integer);
1328627f7eb2Smrg f->value.function.name
1329627f7eb2Smrg = gfc_get_string ("__int_%d_%c%d", f->ts.kind,
1330627f7eb2Smrg gfc_type_letter (a->ts.type), a->ts.kind);
1331627f7eb2Smrg }
1332627f7eb2Smrg
1333627f7eb2Smrg
1334627f7eb2Smrg void
gfc_resolve_int2(gfc_expr * f,gfc_expr * a)1335627f7eb2Smrg gfc_resolve_int2 (gfc_expr *f, gfc_expr *a)
1336627f7eb2Smrg {
1337627f7eb2Smrg f->ts.type = BT_INTEGER;
1338627f7eb2Smrg f->ts.kind = 2;
1339627f7eb2Smrg f->value.function.name
1340627f7eb2Smrg = gfc_get_string ("__int_%d_%c%d", f->ts.kind,
1341627f7eb2Smrg gfc_type_letter (a->ts.type), a->ts.kind);
1342627f7eb2Smrg }
1343627f7eb2Smrg
1344627f7eb2Smrg
1345627f7eb2Smrg void
gfc_resolve_int8(gfc_expr * f,gfc_expr * a)1346627f7eb2Smrg gfc_resolve_int8 (gfc_expr *f, gfc_expr *a)
1347627f7eb2Smrg {
1348627f7eb2Smrg f->ts.type = BT_INTEGER;
1349627f7eb2Smrg f->ts.kind = 8;
1350627f7eb2Smrg f->value.function.name
1351627f7eb2Smrg = gfc_get_string ("__int_%d_%c%d", f->ts.kind,
1352627f7eb2Smrg gfc_type_letter (a->ts.type), a->ts.kind);
1353627f7eb2Smrg }
1354627f7eb2Smrg
1355627f7eb2Smrg
1356627f7eb2Smrg void
gfc_resolve_long(gfc_expr * f,gfc_expr * a)1357627f7eb2Smrg gfc_resolve_long (gfc_expr *f, gfc_expr *a)
1358627f7eb2Smrg {
1359627f7eb2Smrg f->ts.type = BT_INTEGER;
1360627f7eb2Smrg f->ts.kind = 4;
1361627f7eb2Smrg f->value.function.name
1362627f7eb2Smrg = gfc_get_string ("__int_%d_%c%d", f->ts.kind,
1363627f7eb2Smrg gfc_type_letter (a->ts.type), a->ts.kind);
1364627f7eb2Smrg }
1365627f7eb2Smrg
1366627f7eb2Smrg
1367627f7eb2Smrg void
gfc_resolve_iparity(gfc_expr * f,gfc_expr * array,gfc_expr * dim,gfc_expr * mask)1368627f7eb2Smrg gfc_resolve_iparity (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
1369627f7eb2Smrg {
1370627f7eb2Smrg resolve_transformational ("iparity", f, array, dim, mask);
1371627f7eb2Smrg }
1372627f7eb2Smrg
1373627f7eb2Smrg
1374627f7eb2Smrg void
gfc_resolve_isatty(gfc_expr * f,gfc_expr * u)1375627f7eb2Smrg gfc_resolve_isatty (gfc_expr *f, gfc_expr *u)
1376627f7eb2Smrg {
1377627f7eb2Smrg gfc_typespec ts;
1378627f7eb2Smrg gfc_clear_ts (&ts);
1379627f7eb2Smrg
1380627f7eb2Smrg f->ts.type = BT_LOGICAL;
1381627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
1382627f7eb2Smrg if (u->ts.kind != gfc_c_int_kind)
1383627f7eb2Smrg {
1384627f7eb2Smrg ts.type = BT_INTEGER;
1385627f7eb2Smrg ts.kind = gfc_c_int_kind;
1386627f7eb2Smrg ts.u.derived = NULL;
1387627f7eb2Smrg ts.u.cl = NULL;
1388627f7eb2Smrg gfc_convert_type (u, &ts, 2);
1389627f7eb2Smrg }
1390627f7eb2Smrg
1391627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("isatty_l%d"), f->ts.kind);
1392627f7eb2Smrg }
1393627f7eb2Smrg
1394627f7eb2Smrg
1395627f7eb2Smrg void
gfc_resolve_is_contiguous(gfc_expr * f,gfc_expr * array ATTRIBUTE_UNUSED)1396627f7eb2Smrg gfc_resolve_is_contiguous (gfc_expr *f, gfc_expr *array ATTRIBUTE_UNUSED)
1397627f7eb2Smrg {
1398627f7eb2Smrg f->ts.type = BT_LOGICAL;
1399627f7eb2Smrg f->ts.kind = gfc_default_logical_kind;
1400627f7eb2Smrg f->value.function.name = gfc_get_string ("__is_contiguous");
1401627f7eb2Smrg }
1402627f7eb2Smrg
1403627f7eb2Smrg
1404627f7eb2Smrg void
gfc_resolve_ishft(gfc_expr * f,gfc_expr * i,gfc_expr * shift)1405627f7eb2Smrg gfc_resolve_ishft (gfc_expr *f, gfc_expr *i, gfc_expr *shift)
1406627f7eb2Smrg {
1407627f7eb2Smrg f->ts = i->ts;
1408627f7eb2Smrg f->value.function.name
1409627f7eb2Smrg = gfc_get_string ("__ishft_%d_%d", i->ts.kind, shift->ts.kind);
1410627f7eb2Smrg }
1411627f7eb2Smrg
1412627f7eb2Smrg
1413627f7eb2Smrg void
gfc_resolve_rshift(gfc_expr * f,gfc_expr * i,gfc_expr * shift)1414627f7eb2Smrg gfc_resolve_rshift (gfc_expr *f, gfc_expr *i, gfc_expr *shift)
1415627f7eb2Smrg {
1416627f7eb2Smrg f->ts = i->ts;
1417627f7eb2Smrg f->value.function.name
1418627f7eb2Smrg = gfc_get_string ("__rshift_%d_%d", i->ts.kind, shift->ts.kind);
1419627f7eb2Smrg }
1420627f7eb2Smrg
1421627f7eb2Smrg
1422627f7eb2Smrg void
gfc_resolve_lshift(gfc_expr * f,gfc_expr * i,gfc_expr * shift)1423627f7eb2Smrg gfc_resolve_lshift (gfc_expr *f, gfc_expr *i, gfc_expr *shift)
1424627f7eb2Smrg {
1425627f7eb2Smrg f->ts = i->ts;
1426627f7eb2Smrg f->value.function.name
1427627f7eb2Smrg = gfc_get_string ("__lshift_%d_%d", i->ts.kind, shift->ts.kind);
1428627f7eb2Smrg }
1429627f7eb2Smrg
1430627f7eb2Smrg
1431627f7eb2Smrg void
gfc_resolve_ishftc(gfc_expr * f,gfc_expr * i,gfc_expr * shift,gfc_expr * size)1432627f7eb2Smrg gfc_resolve_ishftc (gfc_expr *f, gfc_expr *i, gfc_expr *shift, gfc_expr *size)
1433627f7eb2Smrg {
1434627f7eb2Smrg int s_kind;
1435627f7eb2Smrg
1436627f7eb2Smrg s_kind = (size == NULL) ? gfc_default_integer_kind : size->ts.kind;
1437627f7eb2Smrg
1438627f7eb2Smrg f->ts = i->ts;
1439627f7eb2Smrg f->value.function.name
1440627f7eb2Smrg = gfc_get_string ("__ishftc_%d_%d_%d", i->ts.kind, shift->ts.kind, s_kind);
1441627f7eb2Smrg }
1442627f7eb2Smrg
1443627f7eb2Smrg
1444627f7eb2Smrg void
gfc_resolve_lbound(gfc_expr * f,gfc_expr * array,gfc_expr * dim,gfc_expr * kind)1445627f7eb2Smrg gfc_resolve_lbound (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
1446627f7eb2Smrg {
1447627f7eb2Smrg resolve_bound (f, array, dim, kind, "__lbound", false);
1448627f7eb2Smrg }
1449627f7eb2Smrg
1450627f7eb2Smrg
1451627f7eb2Smrg void
gfc_resolve_lcobound(gfc_expr * f,gfc_expr * array,gfc_expr * dim,gfc_expr * kind)1452627f7eb2Smrg gfc_resolve_lcobound (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
1453627f7eb2Smrg {
1454627f7eb2Smrg resolve_bound (f, array, dim, kind, "__lcobound", true);
1455627f7eb2Smrg }
1456627f7eb2Smrg
1457627f7eb2Smrg
1458627f7eb2Smrg void
gfc_resolve_len(gfc_expr * f,gfc_expr * string,gfc_expr * kind)1459627f7eb2Smrg gfc_resolve_len (gfc_expr *f, gfc_expr *string, gfc_expr *kind)
1460627f7eb2Smrg {
1461627f7eb2Smrg f->ts.type = BT_INTEGER;
1462627f7eb2Smrg if (kind)
1463627f7eb2Smrg f->ts.kind = mpz_get_si (kind->value.integer);
1464627f7eb2Smrg else
1465627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
1466627f7eb2Smrg f->value.function.name
1467627f7eb2Smrg = gfc_get_string ("__len_%d_i%d", string->ts.kind,
1468627f7eb2Smrg gfc_default_integer_kind);
1469627f7eb2Smrg }
1470627f7eb2Smrg
1471627f7eb2Smrg
1472627f7eb2Smrg void
gfc_resolve_len_trim(gfc_expr * f,gfc_expr * string,gfc_expr * kind)1473627f7eb2Smrg gfc_resolve_len_trim (gfc_expr *f, gfc_expr *string, gfc_expr *kind)
1474627f7eb2Smrg {
1475627f7eb2Smrg f->ts.type = BT_INTEGER;
1476627f7eb2Smrg if (kind)
1477627f7eb2Smrg f->ts.kind = mpz_get_si (kind->value.integer);
1478627f7eb2Smrg else
1479627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
1480627f7eb2Smrg f->value.function.name = gfc_get_string ("__len_trim%d", string->ts.kind);
1481627f7eb2Smrg }
1482627f7eb2Smrg
1483627f7eb2Smrg
1484627f7eb2Smrg void
gfc_resolve_lgamma(gfc_expr * f,gfc_expr * x)1485627f7eb2Smrg gfc_resolve_lgamma (gfc_expr *f, gfc_expr *x)
1486627f7eb2Smrg {
1487627f7eb2Smrg f->ts = x->ts;
1488627f7eb2Smrg f->value.function.name
1489627f7eb2Smrg = gfc_get_string ("__lgamma_%d", x->ts.kind);
1490627f7eb2Smrg }
1491627f7eb2Smrg
1492627f7eb2Smrg
1493627f7eb2Smrg void
gfc_resolve_link(gfc_expr * f,gfc_expr * p1 ATTRIBUTE_UNUSED,gfc_expr * p2 ATTRIBUTE_UNUSED)1494627f7eb2Smrg gfc_resolve_link (gfc_expr *f, gfc_expr *p1 ATTRIBUTE_UNUSED,
1495627f7eb2Smrg gfc_expr *p2 ATTRIBUTE_UNUSED)
1496627f7eb2Smrg {
1497627f7eb2Smrg f->ts.type = BT_INTEGER;
1498627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
1499627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("link_i%d"), f->ts.kind);
1500627f7eb2Smrg }
1501627f7eb2Smrg
1502627f7eb2Smrg
1503627f7eb2Smrg void
gfc_resolve_loc(gfc_expr * f,gfc_expr * x)1504627f7eb2Smrg gfc_resolve_loc (gfc_expr *f, gfc_expr *x)
1505627f7eb2Smrg {
1506627f7eb2Smrg f->ts.type= BT_INTEGER;
1507627f7eb2Smrg f->ts.kind = gfc_index_integer_kind;
1508627f7eb2Smrg f->value.function.name = gfc_get_string ("__loc_%d", x->ts.kind);
1509627f7eb2Smrg }
1510627f7eb2Smrg
1511627f7eb2Smrg
1512627f7eb2Smrg void
gfc_resolve_log(gfc_expr * f,gfc_expr * x)1513627f7eb2Smrg gfc_resolve_log (gfc_expr *f, gfc_expr *x)
1514627f7eb2Smrg {
1515627f7eb2Smrg f->ts = x->ts;
1516627f7eb2Smrg f->value.function.name
1517627f7eb2Smrg = gfc_get_string ("__log_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1518627f7eb2Smrg }
1519627f7eb2Smrg
1520627f7eb2Smrg
1521627f7eb2Smrg void
gfc_resolve_log10(gfc_expr * f,gfc_expr * x)1522627f7eb2Smrg gfc_resolve_log10 (gfc_expr *f, gfc_expr *x)
1523627f7eb2Smrg {
1524627f7eb2Smrg f->ts = x->ts;
1525627f7eb2Smrg f->value.function.name
1526627f7eb2Smrg = gfc_get_string ("__log10_%c%d", gfc_type_letter (x->ts.type),
1527627f7eb2Smrg x->ts.kind);
1528627f7eb2Smrg }
1529627f7eb2Smrg
1530627f7eb2Smrg
1531627f7eb2Smrg void
gfc_resolve_logical(gfc_expr * f,gfc_expr * a,gfc_expr * kind)1532627f7eb2Smrg gfc_resolve_logical (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
1533627f7eb2Smrg {
1534627f7eb2Smrg f->ts.type = BT_LOGICAL;
1535627f7eb2Smrg f->ts.kind = (kind == NULL)
1536627f7eb2Smrg ? gfc_default_logical_kind : mpz_get_si (kind->value.integer);
1537627f7eb2Smrg f->rank = a->rank;
1538627f7eb2Smrg
1539627f7eb2Smrg f->value.function.name
1540627f7eb2Smrg = gfc_get_string ("__logical_%d_%c%d", f->ts.kind,
1541627f7eb2Smrg gfc_type_letter (a->ts.type), a->ts.kind);
1542627f7eb2Smrg }
1543627f7eb2Smrg
1544627f7eb2Smrg
1545627f7eb2Smrg void
gfc_resolve_matmul(gfc_expr * f,gfc_expr * a,gfc_expr * b)1546627f7eb2Smrg gfc_resolve_matmul (gfc_expr *f, gfc_expr *a, gfc_expr *b)
1547627f7eb2Smrg {
1548627f7eb2Smrg gfc_expr temp;
1549627f7eb2Smrg
1550627f7eb2Smrg if (a->ts.type == BT_LOGICAL && b->ts.type == BT_LOGICAL)
1551627f7eb2Smrg {
1552627f7eb2Smrg f->ts.type = BT_LOGICAL;
1553627f7eb2Smrg f->ts.kind = gfc_default_logical_kind;
1554627f7eb2Smrg }
1555627f7eb2Smrg else
1556627f7eb2Smrg {
1557627f7eb2Smrg temp.expr_type = EXPR_OP;
1558627f7eb2Smrg gfc_clear_ts (&temp.ts);
1559627f7eb2Smrg temp.value.op.op = INTRINSIC_NONE;
1560627f7eb2Smrg temp.value.op.op1 = a;
1561627f7eb2Smrg temp.value.op.op2 = b;
1562627f7eb2Smrg gfc_type_convert_binary (&temp, 1);
1563627f7eb2Smrg f->ts = temp.ts;
1564627f7eb2Smrg }
1565627f7eb2Smrg
1566627f7eb2Smrg f->rank = (a->rank == 2 && b->rank == 2) ? 2 : 1;
1567627f7eb2Smrg
1568627f7eb2Smrg if (a->rank == 2 && b->rank == 2)
1569627f7eb2Smrg {
1570627f7eb2Smrg if (a->shape && b->shape)
1571627f7eb2Smrg {
1572627f7eb2Smrg f->shape = gfc_get_shape (f->rank);
1573627f7eb2Smrg mpz_init_set (f->shape[0], a->shape[0]);
1574627f7eb2Smrg mpz_init_set (f->shape[1], b->shape[1]);
1575627f7eb2Smrg }
1576627f7eb2Smrg }
1577627f7eb2Smrg else if (a->rank == 1)
1578627f7eb2Smrg {
1579627f7eb2Smrg if (b->shape)
1580627f7eb2Smrg {
1581627f7eb2Smrg f->shape = gfc_get_shape (f->rank);
1582627f7eb2Smrg mpz_init_set (f->shape[0], b->shape[1]);
1583627f7eb2Smrg }
1584627f7eb2Smrg }
1585627f7eb2Smrg else
1586627f7eb2Smrg {
1587627f7eb2Smrg /* b->rank == 1 and a->rank == 2 here, all other cases have
1588627f7eb2Smrg been caught in check.c. */
1589627f7eb2Smrg if (a->shape)
1590627f7eb2Smrg {
1591627f7eb2Smrg f->shape = gfc_get_shape (f->rank);
1592627f7eb2Smrg mpz_init_set (f->shape[0], a->shape[0]);
1593627f7eb2Smrg }
1594627f7eb2Smrg }
1595627f7eb2Smrg
1596627f7eb2Smrg f->value.function.name
1597627f7eb2Smrg = gfc_get_string (PREFIX ("matmul_%c%d"), gfc_type_letter (f->ts.type),
1598627f7eb2Smrg f->ts.kind);
1599627f7eb2Smrg }
1600627f7eb2Smrg
1601627f7eb2Smrg
1602627f7eb2Smrg static void
gfc_resolve_minmax(const char * name,gfc_expr * f,gfc_actual_arglist * args)1603627f7eb2Smrg gfc_resolve_minmax (const char *name, gfc_expr *f, gfc_actual_arglist *args)
1604627f7eb2Smrg {
1605627f7eb2Smrg gfc_actual_arglist *a;
1606627f7eb2Smrg
1607627f7eb2Smrg f->ts.type = args->expr->ts.type;
1608627f7eb2Smrg f->ts.kind = args->expr->ts.kind;
1609627f7eb2Smrg /* Find the largest type kind. */
1610627f7eb2Smrg for (a = args->next; a; a = a->next)
1611627f7eb2Smrg {
1612627f7eb2Smrg if (a->expr->ts.kind > f->ts.kind)
1613627f7eb2Smrg f->ts.kind = a->expr->ts.kind;
1614627f7eb2Smrg }
1615627f7eb2Smrg
1616627f7eb2Smrg /* Convert all parameters to the required kind. */
1617627f7eb2Smrg for (a = args; a; a = a->next)
1618627f7eb2Smrg {
1619627f7eb2Smrg if (a->expr->ts.kind != f->ts.kind)
1620627f7eb2Smrg gfc_convert_type (a->expr, &f->ts, 2);
1621627f7eb2Smrg }
1622627f7eb2Smrg
1623627f7eb2Smrg f->value.function.name
1624627f7eb2Smrg = gfc_get_string (name, gfc_type_letter (f->ts.type), f->ts.kind);
1625627f7eb2Smrg }
1626627f7eb2Smrg
1627627f7eb2Smrg
1628627f7eb2Smrg void
gfc_resolve_max(gfc_expr * f,gfc_actual_arglist * args)1629627f7eb2Smrg gfc_resolve_max (gfc_expr *f, gfc_actual_arglist *args)
1630627f7eb2Smrg {
1631627f7eb2Smrg gfc_resolve_minmax ("__max_%c%d", f, args);
1632627f7eb2Smrg }
1633627f7eb2Smrg
1634627f7eb2Smrg /* The smallest kind for which a minloc and maxloc implementation exists. */
1635627f7eb2Smrg
1636627f7eb2Smrg #define MINMAXLOC_MIN_KIND 4
1637627f7eb2Smrg
1638627f7eb2Smrg void
gfc_resolve_maxloc(gfc_expr * f,gfc_expr * array,gfc_expr * dim,gfc_expr * mask,gfc_expr * kind,gfc_expr * back)1639627f7eb2Smrg gfc_resolve_maxloc (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
1640627f7eb2Smrg gfc_expr *mask, gfc_expr *kind, gfc_expr *back)
1641627f7eb2Smrg {
1642627f7eb2Smrg const char *name;
1643627f7eb2Smrg int i, j, idim;
1644627f7eb2Smrg int fkind;
1645627f7eb2Smrg int d_num;
1646627f7eb2Smrg
1647627f7eb2Smrg f->ts.type = BT_INTEGER;
1648627f7eb2Smrg
1649627f7eb2Smrg /* The library versions only exist for kinds 4, 8 and 16. For smaller kinds,
1650627f7eb2Smrg we do a type conversion further down. */
1651627f7eb2Smrg if (kind)
1652627f7eb2Smrg fkind = mpz_get_si (kind->value.integer);
1653627f7eb2Smrg else
1654627f7eb2Smrg fkind = gfc_default_integer_kind;
1655627f7eb2Smrg
1656627f7eb2Smrg if (fkind < MINMAXLOC_MIN_KIND)
1657627f7eb2Smrg f->ts.kind = MINMAXLOC_MIN_KIND;
1658627f7eb2Smrg else
1659627f7eb2Smrg f->ts.kind = fkind;
1660627f7eb2Smrg
1661627f7eb2Smrg if (dim == NULL)
1662627f7eb2Smrg {
1663627f7eb2Smrg f->rank = 1;
1664627f7eb2Smrg f->shape = gfc_get_shape (1);
1665627f7eb2Smrg mpz_init_set_si (f->shape[0], array->rank);
1666627f7eb2Smrg }
1667627f7eb2Smrg else
1668627f7eb2Smrg {
1669627f7eb2Smrg f->rank = array->rank - 1;
1670627f7eb2Smrg gfc_resolve_dim_arg (dim);
1671627f7eb2Smrg if (array->shape && dim->expr_type == EXPR_CONSTANT)
1672627f7eb2Smrg {
1673627f7eb2Smrg idim = (int) mpz_get_si (dim->value.integer);
1674627f7eb2Smrg f->shape = gfc_get_shape (f->rank);
1675627f7eb2Smrg for (i = 0, j = 0; i < f->rank; i++, j++)
1676627f7eb2Smrg {
1677627f7eb2Smrg if (i == (idim - 1))
1678627f7eb2Smrg j++;
1679627f7eb2Smrg mpz_init_set (f->shape[i], array->shape[j]);
1680627f7eb2Smrg }
1681627f7eb2Smrg }
1682627f7eb2Smrg }
1683627f7eb2Smrg
1684627f7eb2Smrg if (mask)
1685627f7eb2Smrg {
1686627f7eb2Smrg if (mask->rank == 0)
1687627f7eb2Smrg name = "smaxloc";
1688627f7eb2Smrg else
1689627f7eb2Smrg name = "mmaxloc";
1690627f7eb2Smrg
1691627f7eb2Smrg resolve_mask_arg (mask);
1692627f7eb2Smrg }
1693627f7eb2Smrg else
1694627f7eb2Smrg name = "maxloc";
1695627f7eb2Smrg
1696627f7eb2Smrg if (dim)
1697627f7eb2Smrg {
1698627f7eb2Smrg if (array->ts.type != BT_CHARACTER || f->rank != 0)
1699627f7eb2Smrg d_num = 1;
1700627f7eb2Smrg else
1701627f7eb2Smrg d_num = 2;
1702627f7eb2Smrg }
1703627f7eb2Smrg else
1704627f7eb2Smrg d_num = 0;
1705627f7eb2Smrg
1706627f7eb2Smrg f->value.function.name
1707627f7eb2Smrg = gfc_get_string (PREFIX ("%s%d_%d_%c%d"), name, d_num, f->ts.kind,
1708627f7eb2Smrg gfc_type_letter (array->ts.type), array->ts.kind);
1709627f7eb2Smrg
1710627f7eb2Smrg if (kind)
1711627f7eb2Smrg fkind = mpz_get_si (kind->value.integer);
1712627f7eb2Smrg else
1713627f7eb2Smrg fkind = gfc_default_integer_kind;
1714627f7eb2Smrg
1715627f7eb2Smrg if (fkind != f->ts.kind)
1716627f7eb2Smrg {
1717627f7eb2Smrg gfc_typespec ts;
1718627f7eb2Smrg gfc_clear_ts (&ts);
1719627f7eb2Smrg
1720627f7eb2Smrg ts.type = BT_INTEGER;
1721627f7eb2Smrg ts.kind = fkind;
1722627f7eb2Smrg gfc_convert_type_warn (f, &ts, 2, 0);
1723627f7eb2Smrg }
1724627f7eb2Smrg
1725627f7eb2Smrg if (back->ts.kind != gfc_logical_4_kind)
1726627f7eb2Smrg {
1727627f7eb2Smrg gfc_typespec ts;
1728627f7eb2Smrg gfc_clear_ts (&ts);
1729627f7eb2Smrg ts.type = BT_LOGICAL;
1730627f7eb2Smrg ts.kind = gfc_logical_4_kind;
1731627f7eb2Smrg gfc_convert_type_warn (back, &ts, 2, 0);
1732627f7eb2Smrg }
1733627f7eb2Smrg }
1734627f7eb2Smrg
1735627f7eb2Smrg
1736627f7eb2Smrg void
gfc_resolve_findloc(gfc_expr * f,gfc_expr * array,gfc_expr * value,gfc_expr * dim,gfc_expr * mask,gfc_expr * kind,gfc_expr * back)1737627f7eb2Smrg gfc_resolve_findloc (gfc_expr *f, gfc_expr *array, gfc_expr *value,
1738627f7eb2Smrg gfc_expr *dim, gfc_expr *mask, gfc_expr *kind,
1739627f7eb2Smrg gfc_expr *back)
1740627f7eb2Smrg {
1741627f7eb2Smrg const char *name;
1742627f7eb2Smrg int i, j, idim;
1743627f7eb2Smrg int fkind;
1744627f7eb2Smrg int d_num;
1745627f7eb2Smrg
1746627f7eb2Smrg /* See at the end of the function for why this is necessary. */
1747627f7eb2Smrg
1748627f7eb2Smrg if (f->do_not_resolve_again)
1749627f7eb2Smrg return;
1750627f7eb2Smrg
1751627f7eb2Smrg f->ts.type = BT_INTEGER;
1752627f7eb2Smrg
1753627f7eb2Smrg /* We have a single library version, which uses index_type. */
1754627f7eb2Smrg
1755627f7eb2Smrg if (kind)
1756627f7eb2Smrg fkind = mpz_get_si (kind->value.integer);
1757627f7eb2Smrg else
1758627f7eb2Smrg fkind = gfc_default_integer_kind;
1759627f7eb2Smrg
1760627f7eb2Smrg f->ts.kind = gfc_index_integer_kind;
1761627f7eb2Smrg
1762627f7eb2Smrg /* Convert value. If array is not LOGICAL and value is, we already
1763627f7eb2Smrg issued an error earlier. */
1764627f7eb2Smrg
1765627f7eb2Smrg if ((array->ts.type != value->ts.type && value->ts.type != BT_LOGICAL)
1766627f7eb2Smrg || array->ts.kind != value->ts.kind)
1767627f7eb2Smrg gfc_convert_type_warn (value, &array->ts, 2, 0);
1768627f7eb2Smrg
1769627f7eb2Smrg if (dim == NULL)
1770627f7eb2Smrg {
1771627f7eb2Smrg f->rank = 1;
1772627f7eb2Smrg f->shape = gfc_get_shape (1);
1773627f7eb2Smrg mpz_init_set_si (f->shape[0], array->rank);
1774627f7eb2Smrg }
1775627f7eb2Smrg else
1776627f7eb2Smrg {
1777627f7eb2Smrg f->rank = array->rank - 1;
1778627f7eb2Smrg gfc_resolve_dim_arg (dim);
1779627f7eb2Smrg if (array->shape && dim->expr_type == EXPR_CONSTANT)
1780627f7eb2Smrg {
1781627f7eb2Smrg idim = (int) mpz_get_si (dim->value.integer);
1782627f7eb2Smrg f->shape = gfc_get_shape (f->rank);
1783627f7eb2Smrg for (i = 0, j = 0; i < f->rank; i++, j++)
1784627f7eb2Smrg {
1785627f7eb2Smrg if (i == (idim - 1))
1786627f7eb2Smrg j++;
1787627f7eb2Smrg mpz_init_set (f->shape[i], array->shape[j]);
1788627f7eb2Smrg }
1789627f7eb2Smrg }
1790627f7eb2Smrg }
1791627f7eb2Smrg
1792627f7eb2Smrg if (mask)
1793627f7eb2Smrg {
1794627f7eb2Smrg if (mask->rank == 0)
1795627f7eb2Smrg name = "sfindloc";
1796627f7eb2Smrg else
1797627f7eb2Smrg name = "mfindloc";
1798627f7eb2Smrg
1799627f7eb2Smrg resolve_mask_arg (mask);
1800627f7eb2Smrg }
1801627f7eb2Smrg else
1802627f7eb2Smrg name = "findloc";
1803627f7eb2Smrg
1804627f7eb2Smrg if (dim)
1805627f7eb2Smrg {
1806627f7eb2Smrg if (f->rank > 0)
1807627f7eb2Smrg d_num = 1;
1808627f7eb2Smrg else
1809627f7eb2Smrg d_num = 2;
1810627f7eb2Smrg }
1811627f7eb2Smrg else
1812627f7eb2Smrg d_num = 0;
1813627f7eb2Smrg
1814627f7eb2Smrg if (back->ts.kind != gfc_logical_4_kind)
1815627f7eb2Smrg {
1816627f7eb2Smrg gfc_typespec ts;
1817627f7eb2Smrg gfc_clear_ts (&ts);
1818627f7eb2Smrg ts.type = BT_LOGICAL;
1819627f7eb2Smrg ts.kind = gfc_logical_4_kind;
1820627f7eb2Smrg gfc_convert_type_warn (back, &ts, 2, 0);
1821627f7eb2Smrg }
1822627f7eb2Smrg
1823627f7eb2Smrg f->value.function.name
1824627f7eb2Smrg = gfc_get_string (PREFIX ("%s%d_%c%d"), name, d_num,
1825627f7eb2Smrg gfc_type_letter (array->ts.type, true), array->ts.kind);
1826627f7eb2Smrg
1827627f7eb2Smrg /* We only have a single library function, so we need to convert
1828627f7eb2Smrg here. If the function is resolved from within a convert
1829627f7eb2Smrg function generated on a previous round of resolution, endless
1830627f7eb2Smrg recursion could occur. Guard against that here. */
1831627f7eb2Smrg
1832627f7eb2Smrg if (f->ts.kind != fkind)
1833627f7eb2Smrg {
1834627f7eb2Smrg f->do_not_resolve_again = 1;
1835627f7eb2Smrg gfc_typespec ts;
1836627f7eb2Smrg gfc_clear_ts (&ts);
1837627f7eb2Smrg
1838627f7eb2Smrg ts.type = BT_INTEGER;
1839627f7eb2Smrg ts.kind = fkind;
1840627f7eb2Smrg gfc_convert_type_warn (f, &ts, 2, 0);
1841627f7eb2Smrg }
1842627f7eb2Smrg
1843627f7eb2Smrg }
1844627f7eb2Smrg
1845627f7eb2Smrg void
gfc_resolve_maxval(gfc_expr * f,gfc_expr * array,gfc_expr * dim,gfc_expr * mask)1846627f7eb2Smrg gfc_resolve_maxval (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
1847627f7eb2Smrg gfc_expr *mask)
1848627f7eb2Smrg {
1849627f7eb2Smrg const char *name;
1850627f7eb2Smrg int i, j, idim;
1851627f7eb2Smrg
1852627f7eb2Smrg f->ts = array->ts;
1853627f7eb2Smrg
1854627f7eb2Smrg if (dim != NULL)
1855627f7eb2Smrg {
1856627f7eb2Smrg f->rank = array->rank - 1;
1857627f7eb2Smrg gfc_resolve_dim_arg (dim);
1858627f7eb2Smrg
1859627f7eb2Smrg if (f->rank && array->shape && dim->expr_type == EXPR_CONSTANT)
1860627f7eb2Smrg {
1861627f7eb2Smrg idim = (int) mpz_get_si (dim->value.integer);
1862627f7eb2Smrg f->shape = gfc_get_shape (f->rank);
1863627f7eb2Smrg for (i = 0, j = 0; i < f->rank; i++, j++)
1864627f7eb2Smrg {
1865627f7eb2Smrg if (i == (idim - 1))
1866627f7eb2Smrg j++;
1867627f7eb2Smrg mpz_init_set (f->shape[i], array->shape[j]);
1868627f7eb2Smrg }
1869627f7eb2Smrg }
1870627f7eb2Smrg }
1871627f7eb2Smrg
1872627f7eb2Smrg if (mask)
1873627f7eb2Smrg {
1874627f7eb2Smrg if (mask->rank == 0)
1875627f7eb2Smrg name = "smaxval";
1876627f7eb2Smrg else
1877627f7eb2Smrg name = "mmaxval";
1878627f7eb2Smrg
1879627f7eb2Smrg resolve_mask_arg (mask);
1880627f7eb2Smrg }
1881627f7eb2Smrg else
1882627f7eb2Smrg name = "maxval";
1883627f7eb2Smrg
1884627f7eb2Smrg if (array->ts.type != BT_CHARACTER)
1885627f7eb2Smrg f->value.function.name
1886627f7eb2Smrg = gfc_get_string (PREFIX ("%s_%c%d"), name,
1887627f7eb2Smrg gfc_type_letter (array->ts.type), array->ts.kind);
1888627f7eb2Smrg else
1889627f7eb2Smrg f->value.function.name
1890627f7eb2Smrg = gfc_get_string (PREFIX ("%s%d_%c%d"), name, f->rank != 0,
1891627f7eb2Smrg gfc_type_letter (array->ts.type), array->ts.kind);
1892627f7eb2Smrg }
1893627f7eb2Smrg
1894627f7eb2Smrg
1895627f7eb2Smrg void
gfc_resolve_mclock(gfc_expr * f)1896627f7eb2Smrg gfc_resolve_mclock (gfc_expr *f)
1897627f7eb2Smrg {
1898627f7eb2Smrg f->ts.type = BT_INTEGER;
1899627f7eb2Smrg f->ts.kind = 4;
1900627f7eb2Smrg f->value.function.name = PREFIX ("mclock");
1901627f7eb2Smrg }
1902627f7eb2Smrg
1903627f7eb2Smrg
1904627f7eb2Smrg void
gfc_resolve_mclock8(gfc_expr * f)1905627f7eb2Smrg gfc_resolve_mclock8 (gfc_expr *f)
1906627f7eb2Smrg {
1907627f7eb2Smrg f->ts.type = BT_INTEGER;
1908627f7eb2Smrg f->ts.kind = 8;
1909627f7eb2Smrg f->value.function.name = PREFIX ("mclock8");
1910627f7eb2Smrg }
1911627f7eb2Smrg
1912627f7eb2Smrg
1913627f7eb2Smrg void
gfc_resolve_mask(gfc_expr * f,gfc_expr * i ATTRIBUTE_UNUSED,gfc_expr * kind)1914627f7eb2Smrg gfc_resolve_mask (gfc_expr *f, gfc_expr *i ATTRIBUTE_UNUSED,
1915627f7eb2Smrg gfc_expr *kind)
1916627f7eb2Smrg {
1917627f7eb2Smrg f->ts.type = BT_INTEGER;
1918627f7eb2Smrg f->ts.kind = kind ? mpz_get_si (kind->value.integer)
1919627f7eb2Smrg : gfc_default_integer_kind;
1920627f7eb2Smrg
1921627f7eb2Smrg if (f->value.function.isym->id == GFC_ISYM_MASKL)
1922627f7eb2Smrg f->value.function.name = gfc_get_string ("__maskl_i%d", f->ts.kind);
1923627f7eb2Smrg else
1924627f7eb2Smrg f->value.function.name = gfc_get_string ("__maskr_i%d", f->ts.kind);
1925627f7eb2Smrg }
1926627f7eb2Smrg
1927627f7eb2Smrg
1928627f7eb2Smrg void
gfc_resolve_merge(gfc_expr * f,gfc_expr * tsource,gfc_expr * fsource ATTRIBUTE_UNUSED,gfc_expr * mask ATTRIBUTE_UNUSED)1929627f7eb2Smrg gfc_resolve_merge (gfc_expr *f, gfc_expr *tsource,
1930627f7eb2Smrg gfc_expr *fsource ATTRIBUTE_UNUSED,
1931627f7eb2Smrg gfc_expr *mask ATTRIBUTE_UNUSED)
1932627f7eb2Smrg {
1933627f7eb2Smrg if (tsource->ts.type == BT_CHARACTER && tsource->ref)
1934627f7eb2Smrg gfc_resolve_substring_charlen (tsource);
1935627f7eb2Smrg
1936627f7eb2Smrg if (fsource->ts.type == BT_CHARACTER && fsource->ref)
1937627f7eb2Smrg gfc_resolve_substring_charlen (fsource);
1938627f7eb2Smrg
1939627f7eb2Smrg if (tsource->ts.type == BT_CHARACTER)
1940627f7eb2Smrg check_charlen_present (tsource);
1941627f7eb2Smrg
1942627f7eb2Smrg f->ts = tsource->ts;
1943627f7eb2Smrg f->value.function.name
1944627f7eb2Smrg = gfc_get_string ("__merge_%c%d", gfc_type_letter (tsource->ts.type),
1945627f7eb2Smrg tsource->ts.kind);
1946627f7eb2Smrg }
1947627f7eb2Smrg
1948627f7eb2Smrg
1949627f7eb2Smrg void
gfc_resolve_merge_bits(gfc_expr * f,gfc_expr * i,gfc_expr * j ATTRIBUTE_UNUSED,gfc_expr * mask ATTRIBUTE_UNUSED)1950627f7eb2Smrg gfc_resolve_merge_bits (gfc_expr *f, gfc_expr *i,
1951627f7eb2Smrg gfc_expr *j ATTRIBUTE_UNUSED,
1952627f7eb2Smrg gfc_expr *mask ATTRIBUTE_UNUSED)
1953627f7eb2Smrg {
1954627f7eb2Smrg f->ts = i->ts;
1955627f7eb2Smrg f->value.function.name = gfc_get_string ("__merge_bits_i%d", i->ts.kind);
1956627f7eb2Smrg }
1957627f7eb2Smrg
1958627f7eb2Smrg
1959627f7eb2Smrg void
gfc_resolve_min(gfc_expr * f,gfc_actual_arglist * args)1960627f7eb2Smrg gfc_resolve_min (gfc_expr *f, gfc_actual_arglist *args)
1961627f7eb2Smrg {
1962627f7eb2Smrg gfc_resolve_minmax ("__min_%c%d", f, args);
1963627f7eb2Smrg }
1964627f7eb2Smrg
1965627f7eb2Smrg
1966627f7eb2Smrg void
gfc_resolve_minloc(gfc_expr * f,gfc_expr * array,gfc_expr * dim,gfc_expr * mask,gfc_expr * kind,gfc_expr * back)1967627f7eb2Smrg gfc_resolve_minloc (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
1968627f7eb2Smrg gfc_expr *mask, gfc_expr *kind, gfc_expr *back)
1969627f7eb2Smrg {
1970627f7eb2Smrg const char *name;
1971627f7eb2Smrg int i, j, idim;
1972627f7eb2Smrg int fkind;
1973627f7eb2Smrg int d_num;
1974627f7eb2Smrg
1975627f7eb2Smrg f->ts.type = BT_INTEGER;
1976627f7eb2Smrg
1977627f7eb2Smrg /* The library versions only exist for kinds 4, 8 and 16. For smaller kinds,
1978627f7eb2Smrg we do a type conversion further down. */
1979627f7eb2Smrg if (kind)
1980627f7eb2Smrg fkind = mpz_get_si (kind->value.integer);
1981627f7eb2Smrg else
1982627f7eb2Smrg fkind = gfc_default_integer_kind;
1983627f7eb2Smrg
1984627f7eb2Smrg if (fkind < MINMAXLOC_MIN_KIND)
1985627f7eb2Smrg f->ts.kind = MINMAXLOC_MIN_KIND;
1986627f7eb2Smrg else
1987627f7eb2Smrg f->ts.kind = fkind;
1988627f7eb2Smrg
1989627f7eb2Smrg if (dim == NULL)
1990627f7eb2Smrg {
1991627f7eb2Smrg f->rank = 1;
1992627f7eb2Smrg f->shape = gfc_get_shape (1);
1993627f7eb2Smrg mpz_init_set_si (f->shape[0], array->rank);
1994627f7eb2Smrg }
1995627f7eb2Smrg else
1996627f7eb2Smrg {
1997627f7eb2Smrg f->rank = array->rank - 1;
1998627f7eb2Smrg gfc_resolve_dim_arg (dim);
1999627f7eb2Smrg if (array->shape && dim->expr_type == EXPR_CONSTANT)
2000627f7eb2Smrg {
2001627f7eb2Smrg idim = (int) mpz_get_si (dim->value.integer);
2002627f7eb2Smrg f->shape = gfc_get_shape (f->rank);
2003627f7eb2Smrg for (i = 0, j = 0; i < f->rank; i++, j++)
2004627f7eb2Smrg {
2005627f7eb2Smrg if (i == (idim - 1))
2006627f7eb2Smrg j++;
2007627f7eb2Smrg mpz_init_set (f->shape[i], array->shape[j]);
2008627f7eb2Smrg }
2009627f7eb2Smrg }
2010627f7eb2Smrg }
2011627f7eb2Smrg
2012627f7eb2Smrg if (mask)
2013627f7eb2Smrg {
2014627f7eb2Smrg if (mask->rank == 0)
2015627f7eb2Smrg name = "sminloc";
2016627f7eb2Smrg else
2017627f7eb2Smrg name = "mminloc";
2018627f7eb2Smrg
2019627f7eb2Smrg resolve_mask_arg (mask);
2020627f7eb2Smrg }
2021627f7eb2Smrg else
2022627f7eb2Smrg name = "minloc";
2023627f7eb2Smrg
2024627f7eb2Smrg if (dim)
2025627f7eb2Smrg {
2026627f7eb2Smrg if (array->ts.type != BT_CHARACTER || f->rank != 0)
2027627f7eb2Smrg d_num = 1;
2028627f7eb2Smrg else
2029627f7eb2Smrg d_num = 2;
2030627f7eb2Smrg }
2031627f7eb2Smrg else
2032627f7eb2Smrg d_num = 0;
2033627f7eb2Smrg
2034627f7eb2Smrg f->value.function.name
2035627f7eb2Smrg = gfc_get_string (PREFIX ("%s%d_%d_%c%d"), name, d_num, f->ts.kind,
2036627f7eb2Smrg gfc_type_letter (array->ts.type), array->ts.kind);
2037627f7eb2Smrg
2038627f7eb2Smrg if (fkind != f->ts.kind)
2039627f7eb2Smrg {
2040627f7eb2Smrg gfc_typespec ts;
2041627f7eb2Smrg gfc_clear_ts (&ts);
2042627f7eb2Smrg
2043627f7eb2Smrg ts.type = BT_INTEGER;
2044627f7eb2Smrg ts.kind = fkind;
2045627f7eb2Smrg gfc_convert_type_warn (f, &ts, 2, 0);
2046627f7eb2Smrg }
2047627f7eb2Smrg
2048627f7eb2Smrg if (back->ts.kind != gfc_logical_4_kind)
2049627f7eb2Smrg {
2050627f7eb2Smrg gfc_typespec ts;
2051627f7eb2Smrg gfc_clear_ts (&ts);
2052627f7eb2Smrg ts.type = BT_LOGICAL;
2053627f7eb2Smrg ts.kind = gfc_logical_4_kind;
2054627f7eb2Smrg gfc_convert_type_warn (back, &ts, 2, 0);
2055627f7eb2Smrg }
2056627f7eb2Smrg }
2057627f7eb2Smrg
2058627f7eb2Smrg
2059627f7eb2Smrg void
gfc_resolve_minval(gfc_expr * f,gfc_expr * array,gfc_expr * dim,gfc_expr * mask)2060627f7eb2Smrg gfc_resolve_minval (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
2061627f7eb2Smrg gfc_expr *mask)
2062627f7eb2Smrg {
2063627f7eb2Smrg const char *name;
2064627f7eb2Smrg int i, j, idim;
2065627f7eb2Smrg
2066627f7eb2Smrg f->ts = array->ts;
2067627f7eb2Smrg
2068627f7eb2Smrg if (dim != NULL)
2069627f7eb2Smrg {
2070627f7eb2Smrg f->rank = array->rank - 1;
2071627f7eb2Smrg gfc_resolve_dim_arg (dim);
2072627f7eb2Smrg
2073627f7eb2Smrg if (f->rank && array->shape && dim->expr_type == EXPR_CONSTANT)
2074627f7eb2Smrg {
2075627f7eb2Smrg idim = (int) mpz_get_si (dim->value.integer);
2076627f7eb2Smrg f->shape = gfc_get_shape (f->rank);
2077627f7eb2Smrg for (i = 0, j = 0; i < f->rank; i++, j++)
2078627f7eb2Smrg {
2079627f7eb2Smrg if (i == (idim - 1))
2080627f7eb2Smrg j++;
2081627f7eb2Smrg mpz_init_set (f->shape[i], array->shape[j]);
2082627f7eb2Smrg }
2083627f7eb2Smrg }
2084627f7eb2Smrg }
2085627f7eb2Smrg
2086627f7eb2Smrg if (mask)
2087627f7eb2Smrg {
2088627f7eb2Smrg if (mask->rank == 0)
2089627f7eb2Smrg name = "sminval";
2090627f7eb2Smrg else
2091627f7eb2Smrg name = "mminval";
2092627f7eb2Smrg
2093627f7eb2Smrg resolve_mask_arg (mask);
2094627f7eb2Smrg }
2095627f7eb2Smrg else
2096627f7eb2Smrg name = "minval";
2097627f7eb2Smrg
2098627f7eb2Smrg if (array->ts.type != BT_CHARACTER)
2099627f7eb2Smrg f->value.function.name
2100627f7eb2Smrg = gfc_get_string (PREFIX ("%s_%c%d"), name,
2101627f7eb2Smrg gfc_type_letter (array->ts.type), array->ts.kind);
2102627f7eb2Smrg else
2103627f7eb2Smrg f->value.function.name
2104627f7eb2Smrg = gfc_get_string (PREFIX ("%s%d_%c%d"), name, f->rank != 0,
2105627f7eb2Smrg gfc_type_letter (array->ts.type), array->ts.kind);
2106627f7eb2Smrg }
2107627f7eb2Smrg
2108627f7eb2Smrg
2109627f7eb2Smrg void
gfc_resolve_mod(gfc_expr * f,gfc_expr * a,gfc_expr * p)2110627f7eb2Smrg gfc_resolve_mod (gfc_expr *f, gfc_expr *a, gfc_expr *p)
2111627f7eb2Smrg {
2112627f7eb2Smrg f->ts.type = a->ts.type;
2113627f7eb2Smrg if (p != NULL)
2114627f7eb2Smrg f->ts.kind = gfc_kind_max (a,p);
2115627f7eb2Smrg else
2116627f7eb2Smrg f->ts.kind = a->ts.kind;
2117627f7eb2Smrg
2118627f7eb2Smrg if (p != NULL && a->ts.kind != p->ts.kind)
2119627f7eb2Smrg {
2120627f7eb2Smrg if (a->ts.kind == gfc_kind_max (a,p))
2121627f7eb2Smrg gfc_convert_type (p, &a->ts, 2);
2122627f7eb2Smrg else
2123627f7eb2Smrg gfc_convert_type (a, &p->ts, 2);
2124627f7eb2Smrg }
2125627f7eb2Smrg
2126627f7eb2Smrg f->value.function.name
2127627f7eb2Smrg = gfc_get_string ("__mod_%c%d", gfc_type_letter (f->ts.type), f->ts.kind);
2128627f7eb2Smrg }
2129627f7eb2Smrg
2130627f7eb2Smrg
2131627f7eb2Smrg void
gfc_resolve_modulo(gfc_expr * f,gfc_expr * a,gfc_expr * p)2132627f7eb2Smrg gfc_resolve_modulo (gfc_expr *f, gfc_expr *a, gfc_expr *p)
2133627f7eb2Smrg {
2134627f7eb2Smrg f->ts.type = a->ts.type;
2135627f7eb2Smrg if (p != NULL)
2136627f7eb2Smrg f->ts.kind = gfc_kind_max (a,p);
2137627f7eb2Smrg else
2138627f7eb2Smrg f->ts.kind = a->ts.kind;
2139627f7eb2Smrg
2140627f7eb2Smrg if (p != NULL && a->ts.kind != p->ts.kind)
2141627f7eb2Smrg {
2142627f7eb2Smrg if (a->ts.kind == gfc_kind_max (a,p))
2143627f7eb2Smrg gfc_convert_type (p, &a->ts, 2);
2144627f7eb2Smrg else
2145627f7eb2Smrg gfc_convert_type (a, &p->ts, 2);
2146627f7eb2Smrg }
2147627f7eb2Smrg
2148627f7eb2Smrg f->value.function.name
2149627f7eb2Smrg = gfc_get_string ("__modulo_%c%d", gfc_type_letter (f->ts.type),
2150627f7eb2Smrg f->ts.kind);
2151627f7eb2Smrg }
2152627f7eb2Smrg
2153627f7eb2Smrg void
gfc_resolve_nearest(gfc_expr * f,gfc_expr * a,gfc_expr * p)2154627f7eb2Smrg gfc_resolve_nearest (gfc_expr *f, gfc_expr *a, gfc_expr *p)
2155627f7eb2Smrg {
2156627f7eb2Smrg if (p->ts.kind != a->ts.kind)
2157627f7eb2Smrg gfc_convert_type (p, &a->ts, 2);
2158627f7eb2Smrg
2159627f7eb2Smrg f->ts = a->ts;
2160627f7eb2Smrg f->value.function.name
2161627f7eb2Smrg = gfc_get_string ("__nearest_%c%d", gfc_type_letter (a->ts.type),
2162627f7eb2Smrg a->ts.kind);
2163627f7eb2Smrg }
2164627f7eb2Smrg
2165627f7eb2Smrg void
gfc_resolve_nint(gfc_expr * f,gfc_expr * a,gfc_expr * kind)2166627f7eb2Smrg gfc_resolve_nint (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
2167627f7eb2Smrg {
2168627f7eb2Smrg f->ts.type = BT_INTEGER;
2169627f7eb2Smrg f->ts.kind = (kind == NULL)
2170627f7eb2Smrg ? gfc_default_integer_kind : mpz_get_si (kind->value.integer);
2171627f7eb2Smrg f->value.function.name
2172627f7eb2Smrg = gfc_get_string ("__nint_%d_%d", f->ts.kind, a->ts.kind);
2173627f7eb2Smrg }
2174627f7eb2Smrg
2175627f7eb2Smrg
2176627f7eb2Smrg void
gfc_resolve_norm2(gfc_expr * f,gfc_expr * array,gfc_expr * dim)2177627f7eb2Smrg gfc_resolve_norm2 (gfc_expr *f, gfc_expr *array, gfc_expr *dim)
2178627f7eb2Smrg {
2179627f7eb2Smrg resolve_transformational ("norm2", f, array, dim, NULL);
2180627f7eb2Smrg }
2181627f7eb2Smrg
2182627f7eb2Smrg
2183627f7eb2Smrg void
gfc_resolve_not(gfc_expr * f,gfc_expr * i)2184627f7eb2Smrg gfc_resolve_not (gfc_expr *f, gfc_expr *i)
2185627f7eb2Smrg {
2186627f7eb2Smrg f->ts = i->ts;
2187627f7eb2Smrg f->value.function.name = gfc_get_string ("__not_%d", i->ts.kind);
2188627f7eb2Smrg }
2189627f7eb2Smrg
2190627f7eb2Smrg
2191627f7eb2Smrg void
gfc_resolve_or(gfc_expr * f,gfc_expr * i,gfc_expr * j)2192627f7eb2Smrg gfc_resolve_or (gfc_expr *f, gfc_expr *i, gfc_expr *j)
2193627f7eb2Smrg {
2194627f7eb2Smrg f->ts.type = i->ts.type;
2195627f7eb2Smrg f->ts.kind = gfc_kind_max (i, j);
2196627f7eb2Smrg
2197627f7eb2Smrg if (i->ts.kind != j->ts.kind)
2198627f7eb2Smrg {
2199627f7eb2Smrg if (i->ts.kind == gfc_kind_max (i, j))
2200627f7eb2Smrg gfc_convert_type (j, &i->ts, 2);
2201627f7eb2Smrg else
2202627f7eb2Smrg gfc_convert_type (i, &j->ts, 2);
2203627f7eb2Smrg }
2204627f7eb2Smrg
2205627f7eb2Smrg f->value.function.name
2206627f7eb2Smrg = gfc_get_string ("__or_%c%d", gfc_type_letter (i->ts.type), f->ts.kind);
2207627f7eb2Smrg }
2208627f7eb2Smrg
2209627f7eb2Smrg
2210627f7eb2Smrg void
gfc_resolve_pack(gfc_expr * f,gfc_expr * array,gfc_expr * mask,gfc_expr * vector ATTRIBUTE_UNUSED)2211627f7eb2Smrg gfc_resolve_pack (gfc_expr *f, gfc_expr *array, gfc_expr *mask,
2212627f7eb2Smrg gfc_expr *vector ATTRIBUTE_UNUSED)
2213627f7eb2Smrg {
2214627f7eb2Smrg if (array->ts.type == BT_CHARACTER && array->ref)
2215627f7eb2Smrg gfc_resolve_substring_charlen (array);
2216627f7eb2Smrg
2217627f7eb2Smrg f->ts = array->ts;
2218627f7eb2Smrg f->rank = 1;
2219627f7eb2Smrg
2220627f7eb2Smrg resolve_mask_arg (mask);
2221627f7eb2Smrg
2222627f7eb2Smrg if (mask->rank != 0)
2223627f7eb2Smrg {
2224627f7eb2Smrg if (array->ts.type == BT_CHARACTER)
2225627f7eb2Smrg f->value.function.name
2226627f7eb2Smrg = array->ts.kind == 1 ? PREFIX ("pack_char")
2227627f7eb2Smrg : gfc_get_string
2228627f7eb2Smrg (PREFIX ("pack_char%d"),
2229627f7eb2Smrg array->ts.kind);
2230627f7eb2Smrg else
2231627f7eb2Smrg f->value.function.name = PREFIX ("pack");
2232627f7eb2Smrg }
2233627f7eb2Smrg else
2234627f7eb2Smrg {
2235627f7eb2Smrg if (array->ts.type == BT_CHARACTER)
2236627f7eb2Smrg f->value.function.name
2237627f7eb2Smrg = array->ts.kind == 1 ? PREFIX ("pack_s_char")
2238627f7eb2Smrg : gfc_get_string
2239627f7eb2Smrg (PREFIX ("pack_s_char%d"),
2240627f7eb2Smrg array->ts.kind);
2241627f7eb2Smrg else
2242627f7eb2Smrg f->value.function.name = PREFIX ("pack_s");
2243627f7eb2Smrg }
2244627f7eb2Smrg }
2245627f7eb2Smrg
2246627f7eb2Smrg
2247627f7eb2Smrg void
gfc_resolve_parity(gfc_expr * f,gfc_expr * array,gfc_expr * dim)2248627f7eb2Smrg gfc_resolve_parity (gfc_expr *f, gfc_expr *array, gfc_expr *dim)
2249627f7eb2Smrg {
2250627f7eb2Smrg resolve_transformational ("parity", f, array, dim, NULL);
2251627f7eb2Smrg }
2252627f7eb2Smrg
2253627f7eb2Smrg
2254627f7eb2Smrg void
gfc_resolve_product(gfc_expr * f,gfc_expr * array,gfc_expr * dim,gfc_expr * mask)2255627f7eb2Smrg gfc_resolve_product (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
2256627f7eb2Smrg gfc_expr *mask)
2257627f7eb2Smrg {
2258627f7eb2Smrg resolve_transformational ("product", f, array, dim, mask);
2259627f7eb2Smrg }
2260627f7eb2Smrg
2261627f7eb2Smrg
2262627f7eb2Smrg void
gfc_resolve_rank(gfc_expr * f,gfc_expr * array ATTRIBUTE_UNUSED)2263627f7eb2Smrg gfc_resolve_rank (gfc_expr *f, gfc_expr *array ATTRIBUTE_UNUSED)
2264627f7eb2Smrg {
2265627f7eb2Smrg f->ts.type = BT_INTEGER;
2266627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
2267627f7eb2Smrg f->value.function.name = gfc_get_string ("__rank");
2268627f7eb2Smrg }
2269627f7eb2Smrg
2270627f7eb2Smrg
2271627f7eb2Smrg void
gfc_resolve_real(gfc_expr * f,gfc_expr * a,gfc_expr * kind)2272627f7eb2Smrg gfc_resolve_real (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
2273627f7eb2Smrg {
2274627f7eb2Smrg f->ts.type = BT_REAL;
2275627f7eb2Smrg
2276627f7eb2Smrg if (kind != NULL)
2277627f7eb2Smrg f->ts.kind = mpz_get_si (kind->value.integer);
2278627f7eb2Smrg else
2279627f7eb2Smrg f->ts.kind = (a->ts.type == BT_COMPLEX)
2280627f7eb2Smrg ? a->ts.kind : gfc_default_real_kind;
2281627f7eb2Smrg
2282627f7eb2Smrg f->value.function.name
2283627f7eb2Smrg = gfc_get_string ("__real_%d_%c%d", f->ts.kind,
2284627f7eb2Smrg gfc_type_letter (a->ts.type), a->ts.kind);
2285627f7eb2Smrg }
2286627f7eb2Smrg
2287627f7eb2Smrg
2288627f7eb2Smrg void
gfc_resolve_realpart(gfc_expr * f,gfc_expr * a)2289627f7eb2Smrg gfc_resolve_realpart (gfc_expr *f, gfc_expr *a)
2290627f7eb2Smrg {
2291627f7eb2Smrg f->ts.type = BT_REAL;
2292627f7eb2Smrg f->ts.kind = a->ts.kind;
2293627f7eb2Smrg f->value.function.name
2294627f7eb2Smrg = gfc_get_string ("__real_%d_%c%d", f->ts.kind,
2295627f7eb2Smrg gfc_type_letter (a->ts.type), a->ts.kind);
2296627f7eb2Smrg }
2297627f7eb2Smrg
2298627f7eb2Smrg
2299627f7eb2Smrg void
gfc_resolve_rename(gfc_expr * f,gfc_expr * p1 ATTRIBUTE_UNUSED,gfc_expr * p2 ATTRIBUTE_UNUSED)2300627f7eb2Smrg gfc_resolve_rename (gfc_expr *f, gfc_expr *p1 ATTRIBUTE_UNUSED,
2301627f7eb2Smrg gfc_expr *p2 ATTRIBUTE_UNUSED)
2302627f7eb2Smrg {
2303627f7eb2Smrg f->ts.type = BT_INTEGER;
2304627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
2305627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("rename_i%d"), f->ts.kind);
2306627f7eb2Smrg }
2307627f7eb2Smrg
2308627f7eb2Smrg
2309627f7eb2Smrg void
gfc_resolve_repeat(gfc_expr * f,gfc_expr * string,gfc_expr * ncopies)2310627f7eb2Smrg gfc_resolve_repeat (gfc_expr *f, gfc_expr *string,
2311627f7eb2Smrg gfc_expr *ncopies)
2312627f7eb2Smrg {
2313627f7eb2Smrg gfc_expr *tmp;
2314627f7eb2Smrg f->ts.type = BT_CHARACTER;
2315627f7eb2Smrg f->ts.kind = string->ts.kind;
2316627f7eb2Smrg f->value.function.name = gfc_get_string ("__repeat_%d", string->ts.kind);
2317627f7eb2Smrg
2318627f7eb2Smrg /* If possible, generate a character length. */
2319627f7eb2Smrg if (f->ts.u.cl == NULL)
2320627f7eb2Smrg f->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
2321627f7eb2Smrg
2322627f7eb2Smrg tmp = NULL;
2323627f7eb2Smrg if (string->expr_type == EXPR_CONSTANT)
2324627f7eb2Smrg {
2325627f7eb2Smrg tmp = gfc_get_int_expr (gfc_charlen_int_kind, NULL,
2326627f7eb2Smrg string->value.character.length);
2327627f7eb2Smrg }
2328627f7eb2Smrg else if (string->ts.u.cl && string->ts.u.cl->length)
2329627f7eb2Smrg {
2330627f7eb2Smrg tmp = gfc_copy_expr (string->ts.u.cl->length);
2331627f7eb2Smrg }
2332627f7eb2Smrg
2333627f7eb2Smrg if (tmp)
2334627f7eb2Smrg f->ts.u.cl->length = gfc_multiply (tmp, gfc_copy_expr (ncopies));
2335627f7eb2Smrg }
2336627f7eb2Smrg
2337627f7eb2Smrg
2338627f7eb2Smrg void
gfc_resolve_reshape(gfc_expr * f,gfc_expr * source,gfc_expr * shape,gfc_expr * pad ATTRIBUTE_UNUSED,gfc_expr * order ATTRIBUTE_UNUSED)2339627f7eb2Smrg gfc_resolve_reshape (gfc_expr *f, gfc_expr *source, gfc_expr *shape,
2340627f7eb2Smrg gfc_expr *pad ATTRIBUTE_UNUSED,
2341627f7eb2Smrg gfc_expr *order ATTRIBUTE_UNUSED)
2342627f7eb2Smrg {
2343627f7eb2Smrg mpz_t rank;
2344627f7eb2Smrg int kind;
2345627f7eb2Smrg int i;
2346627f7eb2Smrg
2347627f7eb2Smrg if (source->ts.type == BT_CHARACTER && source->ref)
2348627f7eb2Smrg gfc_resolve_substring_charlen (source);
2349627f7eb2Smrg
2350627f7eb2Smrg f->ts = source->ts;
2351627f7eb2Smrg
2352627f7eb2Smrg gfc_array_size (shape, &rank);
2353627f7eb2Smrg f->rank = mpz_get_si (rank);
2354627f7eb2Smrg mpz_clear (rank);
2355627f7eb2Smrg switch (source->ts.type)
2356627f7eb2Smrg {
2357627f7eb2Smrg case BT_COMPLEX:
2358627f7eb2Smrg case BT_REAL:
2359627f7eb2Smrg case BT_INTEGER:
2360627f7eb2Smrg case BT_LOGICAL:
2361627f7eb2Smrg case BT_CHARACTER:
2362627f7eb2Smrg kind = source->ts.kind;
2363627f7eb2Smrg break;
2364627f7eb2Smrg
2365627f7eb2Smrg default:
2366627f7eb2Smrg kind = 0;
2367627f7eb2Smrg break;
2368627f7eb2Smrg }
2369627f7eb2Smrg
2370627f7eb2Smrg switch (kind)
2371627f7eb2Smrg {
2372627f7eb2Smrg case 4:
2373627f7eb2Smrg case 8:
2374627f7eb2Smrg case 10:
2375627f7eb2Smrg case 16:
2376627f7eb2Smrg if (source->ts.type == BT_COMPLEX || source->ts.type == BT_REAL)
2377627f7eb2Smrg f->value.function.name
2378627f7eb2Smrg = gfc_get_string (PREFIX ("reshape_%c%d"),
2379627f7eb2Smrg gfc_type_letter (source->ts.type),
2380627f7eb2Smrg source->ts.kind);
2381627f7eb2Smrg else if (source->ts.type == BT_CHARACTER)
2382627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("reshape_char%d"),
2383627f7eb2Smrg kind);
2384627f7eb2Smrg else
2385627f7eb2Smrg f->value.function.name
2386627f7eb2Smrg = gfc_get_string (PREFIX ("reshape_%d"), source->ts.kind);
2387627f7eb2Smrg break;
2388627f7eb2Smrg
2389627f7eb2Smrg default:
2390627f7eb2Smrg f->value.function.name = (source->ts.type == BT_CHARACTER
2391627f7eb2Smrg ? PREFIX ("reshape_char") : PREFIX ("reshape"));
2392627f7eb2Smrg break;
2393627f7eb2Smrg }
2394627f7eb2Smrg
2395627f7eb2Smrg if (shape->expr_type == EXPR_ARRAY && gfc_is_constant_expr (shape))
2396627f7eb2Smrg {
2397627f7eb2Smrg gfc_constructor *c;
2398627f7eb2Smrg f->shape = gfc_get_shape (f->rank);
2399627f7eb2Smrg c = gfc_constructor_first (shape->value.constructor);
2400627f7eb2Smrg for (i = 0; i < f->rank; i++)
2401627f7eb2Smrg {
2402627f7eb2Smrg mpz_init_set (f->shape[i], c->expr->value.integer);
2403627f7eb2Smrg c = gfc_constructor_next (c);
2404627f7eb2Smrg }
2405627f7eb2Smrg }
2406627f7eb2Smrg
2407627f7eb2Smrg /* Force-convert both SHAPE and ORDER to index_kind so that we don't need
2408627f7eb2Smrg so many runtime variations. */
2409627f7eb2Smrg if (shape->ts.kind != gfc_index_integer_kind)
2410627f7eb2Smrg {
2411627f7eb2Smrg gfc_typespec ts = shape->ts;
2412627f7eb2Smrg ts.kind = gfc_index_integer_kind;
2413627f7eb2Smrg gfc_convert_type_warn (shape, &ts, 2, 0);
2414627f7eb2Smrg }
2415627f7eb2Smrg if (order && order->ts.kind != gfc_index_integer_kind)
2416627f7eb2Smrg gfc_convert_type_warn (order, &shape->ts, 2, 0);
2417627f7eb2Smrg }
2418627f7eb2Smrg
2419627f7eb2Smrg
2420627f7eb2Smrg void
gfc_resolve_rrspacing(gfc_expr * f,gfc_expr * x)2421627f7eb2Smrg gfc_resolve_rrspacing (gfc_expr *f, gfc_expr *x)
2422627f7eb2Smrg {
2423627f7eb2Smrg f->ts = x->ts;
2424627f7eb2Smrg f->value.function.name = gfc_get_string ("__rrspacing_%d", x->ts.kind);
2425627f7eb2Smrg }
2426627f7eb2Smrg
2427627f7eb2Smrg void
gfc_resolve_fe_runtime_error(gfc_code * c)2428627f7eb2Smrg gfc_resolve_fe_runtime_error (gfc_code *c)
2429627f7eb2Smrg {
2430627f7eb2Smrg const char *name;
2431627f7eb2Smrg gfc_actual_arglist *a;
2432627f7eb2Smrg
2433627f7eb2Smrg name = gfc_get_string (PREFIX ("runtime_error"));
2434627f7eb2Smrg
2435627f7eb2Smrg for (a = c->ext.actual->next; a; a = a->next)
2436627f7eb2Smrg a->name = "%VAL";
2437627f7eb2Smrg
2438627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2439627f7eb2Smrg /* We set the backend_decl here because runtime_error is a
2440627f7eb2Smrg variadic function and we would use the wrong calling
2441627f7eb2Smrg convention otherwise. */
2442627f7eb2Smrg c->resolved_sym->backend_decl = gfor_fndecl_runtime_error;
2443627f7eb2Smrg }
2444627f7eb2Smrg
2445627f7eb2Smrg void
gfc_resolve_scale(gfc_expr * f,gfc_expr * x,gfc_expr * i ATTRIBUTE_UNUSED)2446627f7eb2Smrg gfc_resolve_scale (gfc_expr *f, gfc_expr *x, gfc_expr *i ATTRIBUTE_UNUSED)
2447627f7eb2Smrg {
2448627f7eb2Smrg f->ts = x->ts;
2449627f7eb2Smrg f->value.function.name = gfc_get_string ("__scale_%d", x->ts.kind);
2450627f7eb2Smrg }
2451627f7eb2Smrg
2452627f7eb2Smrg
2453627f7eb2Smrg void
gfc_resolve_scan(gfc_expr * f,gfc_expr * string,gfc_expr * set ATTRIBUTE_UNUSED,gfc_expr * back ATTRIBUTE_UNUSED,gfc_expr * kind)2454627f7eb2Smrg gfc_resolve_scan (gfc_expr *f, gfc_expr *string,
2455627f7eb2Smrg gfc_expr *set ATTRIBUTE_UNUSED,
2456627f7eb2Smrg gfc_expr *back ATTRIBUTE_UNUSED, gfc_expr *kind)
2457627f7eb2Smrg {
2458627f7eb2Smrg f->ts.type = BT_INTEGER;
2459627f7eb2Smrg if (kind)
2460627f7eb2Smrg f->ts.kind = mpz_get_si (kind->value.integer);
2461627f7eb2Smrg else
2462627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
2463627f7eb2Smrg f->value.function.name = gfc_get_string ("__scan_%d", string->ts.kind);
2464627f7eb2Smrg }
2465627f7eb2Smrg
2466627f7eb2Smrg
2467627f7eb2Smrg void
gfc_resolve_secnds(gfc_expr * t1,gfc_expr * t0)2468627f7eb2Smrg gfc_resolve_secnds (gfc_expr *t1, gfc_expr *t0)
2469627f7eb2Smrg {
2470627f7eb2Smrg t1->ts = t0->ts;
2471627f7eb2Smrg t1->value.function.name = gfc_get_string (PREFIX ("secnds"));
2472627f7eb2Smrg }
2473627f7eb2Smrg
2474627f7eb2Smrg
2475627f7eb2Smrg void
gfc_resolve_set_exponent(gfc_expr * f,gfc_expr * x,gfc_expr * i ATTRIBUTE_UNUSED)2476627f7eb2Smrg gfc_resolve_set_exponent (gfc_expr *f, gfc_expr *x,
2477627f7eb2Smrg gfc_expr *i ATTRIBUTE_UNUSED)
2478627f7eb2Smrg {
2479627f7eb2Smrg f->ts = x->ts;
2480627f7eb2Smrg f->value.function.name = gfc_get_string ("__set_exponent_%d", x->ts.kind);
2481627f7eb2Smrg }
2482627f7eb2Smrg
2483627f7eb2Smrg
2484627f7eb2Smrg void
gfc_resolve_shape(gfc_expr * f,gfc_expr * array,gfc_expr * kind)2485627f7eb2Smrg gfc_resolve_shape (gfc_expr *f, gfc_expr *array, gfc_expr *kind)
2486627f7eb2Smrg {
2487627f7eb2Smrg f->ts.type = BT_INTEGER;
2488627f7eb2Smrg
2489627f7eb2Smrg if (kind)
2490627f7eb2Smrg f->ts.kind = mpz_get_si (kind->value.integer);
2491627f7eb2Smrg else
2492627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
2493627f7eb2Smrg
2494627f7eb2Smrg f->rank = 1;
2495627f7eb2Smrg if (array->rank != -1)
2496627f7eb2Smrg {
2497627f7eb2Smrg f->shape = gfc_get_shape (1);
2498627f7eb2Smrg mpz_init_set_ui (f->shape[0], array->rank);
2499627f7eb2Smrg }
2500627f7eb2Smrg
2501627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("shape_%d"), f->ts.kind);
2502627f7eb2Smrg }
2503627f7eb2Smrg
2504627f7eb2Smrg
2505627f7eb2Smrg void
gfc_resolve_shift(gfc_expr * f,gfc_expr * i,gfc_expr * shift ATTRIBUTE_UNUSED)2506627f7eb2Smrg gfc_resolve_shift (gfc_expr *f, gfc_expr *i, gfc_expr *shift ATTRIBUTE_UNUSED)
2507627f7eb2Smrg {
2508627f7eb2Smrg f->ts = i->ts;
2509627f7eb2Smrg if (f->value.function.isym->id == GFC_ISYM_SHIFTA)
2510627f7eb2Smrg f->value.function.name = gfc_get_string ("shifta_i%d", f->ts.kind);
2511627f7eb2Smrg else if (f->value.function.isym->id == GFC_ISYM_SHIFTL)
2512627f7eb2Smrg f->value.function.name = gfc_get_string ("shiftl_i%d", f->ts.kind);
2513627f7eb2Smrg else if (f->value.function.isym->id == GFC_ISYM_SHIFTR)
2514627f7eb2Smrg f->value.function.name = gfc_get_string ("shiftr_i%d", f->ts.kind);
2515627f7eb2Smrg else
2516627f7eb2Smrg gcc_unreachable ();
2517627f7eb2Smrg }
2518627f7eb2Smrg
2519627f7eb2Smrg
2520627f7eb2Smrg void
gfc_resolve_sign(gfc_expr * f,gfc_expr * a,gfc_expr * b ATTRIBUTE_UNUSED)2521627f7eb2Smrg gfc_resolve_sign (gfc_expr *f, gfc_expr *a, gfc_expr *b ATTRIBUTE_UNUSED)
2522627f7eb2Smrg {
2523627f7eb2Smrg f->ts = a->ts;
2524627f7eb2Smrg f->value.function.name
2525627f7eb2Smrg = gfc_get_string ("__sign_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
2526627f7eb2Smrg }
2527627f7eb2Smrg
2528627f7eb2Smrg
2529627f7eb2Smrg void
gfc_resolve_signal(gfc_expr * f,gfc_expr * number,gfc_expr * handler)2530627f7eb2Smrg gfc_resolve_signal (gfc_expr *f, gfc_expr *number, gfc_expr *handler)
2531627f7eb2Smrg {
2532627f7eb2Smrg f->ts.type = BT_INTEGER;
2533627f7eb2Smrg f->ts.kind = gfc_c_int_kind;
2534627f7eb2Smrg
2535627f7eb2Smrg /* handler can be either BT_INTEGER or BT_PROCEDURE */
2536627f7eb2Smrg if (handler->ts.type == BT_INTEGER)
2537627f7eb2Smrg {
2538627f7eb2Smrg if (handler->ts.kind != gfc_c_int_kind)
2539627f7eb2Smrg gfc_convert_type (handler, &f->ts, 2);
2540627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("signal_func_int"));
2541627f7eb2Smrg }
2542627f7eb2Smrg else
2543627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("signal_func"));
2544627f7eb2Smrg
2545627f7eb2Smrg if (number->ts.kind != gfc_c_int_kind)
2546627f7eb2Smrg gfc_convert_type (number, &f->ts, 2);
2547627f7eb2Smrg }
2548627f7eb2Smrg
2549627f7eb2Smrg
2550627f7eb2Smrg void
gfc_resolve_sin(gfc_expr * f,gfc_expr * x)2551627f7eb2Smrg gfc_resolve_sin (gfc_expr *f, gfc_expr *x)
2552627f7eb2Smrg {
2553627f7eb2Smrg f->ts = x->ts;
2554627f7eb2Smrg f->value.function.name
2555627f7eb2Smrg = gfc_get_string ("__sin_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
2556627f7eb2Smrg }
2557627f7eb2Smrg
2558627f7eb2Smrg
2559627f7eb2Smrg void
gfc_resolve_sinh(gfc_expr * f,gfc_expr * x)2560627f7eb2Smrg gfc_resolve_sinh (gfc_expr *f, gfc_expr *x)
2561627f7eb2Smrg {
2562627f7eb2Smrg f->ts = x->ts;
2563627f7eb2Smrg f->value.function.name
2564627f7eb2Smrg = gfc_get_string ("__sinh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
2565627f7eb2Smrg }
2566627f7eb2Smrg
2567627f7eb2Smrg
2568627f7eb2Smrg void
gfc_resolve_size(gfc_expr * f,gfc_expr * array ATTRIBUTE_UNUSED,gfc_expr * dim ATTRIBUTE_UNUSED,gfc_expr * kind)2569627f7eb2Smrg gfc_resolve_size (gfc_expr *f, gfc_expr *array ATTRIBUTE_UNUSED,
2570627f7eb2Smrg gfc_expr *dim ATTRIBUTE_UNUSED, gfc_expr *kind)
2571627f7eb2Smrg {
2572627f7eb2Smrg f->ts.type = BT_INTEGER;
2573627f7eb2Smrg if (kind)
2574627f7eb2Smrg f->ts.kind = mpz_get_si (kind->value.integer);
2575627f7eb2Smrg else
2576627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
2577627f7eb2Smrg }
2578627f7eb2Smrg
2579627f7eb2Smrg
2580627f7eb2Smrg void
gfc_resolve_stride(gfc_expr * f,gfc_expr * array ATTRIBUTE_UNUSED,gfc_expr * dim ATTRIBUTE_UNUSED)2581627f7eb2Smrg gfc_resolve_stride (gfc_expr *f, gfc_expr *array ATTRIBUTE_UNUSED,
2582627f7eb2Smrg gfc_expr *dim ATTRIBUTE_UNUSED)
2583627f7eb2Smrg {
2584627f7eb2Smrg f->ts.type = BT_INTEGER;
2585627f7eb2Smrg f->ts.kind = gfc_index_integer_kind;
2586627f7eb2Smrg }
2587627f7eb2Smrg
2588627f7eb2Smrg
2589627f7eb2Smrg void
gfc_resolve_spacing(gfc_expr * f,gfc_expr * x)2590627f7eb2Smrg gfc_resolve_spacing (gfc_expr *f, gfc_expr *x)
2591627f7eb2Smrg {
2592627f7eb2Smrg f->ts = x->ts;
2593627f7eb2Smrg f->value.function.name = gfc_get_string ("__spacing_%d", x->ts.kind);
2594627f7eb2Smrg }
2595627f7eb2Smrg
2596627f7eb2Smrg
2597627f7eb2Smrg void
gfc_resolve_spread(gfc_expr * f,gfc_expr * source,gfc_expr * dim,gfc_expr * ncopies)2598627f7eb2Smrg gfc_resolve_spread (gfc_expr *f, gfc_expr *source, gfc_expr *dim,
2599627f7eb2Smrg gfc_expr *ncopies)
2600627f7eb2Smrg {
2601627f7eb2Smrg if (source->ts.type == BT_CHARACTER && source->ref)
2602627f7eb2Smrg gfc_resolve_substring_charlen (source);
2603627f7eb2Smrg
2604627f7eb2Smrg if (source->ts.type == BT_CHARACTER)
2605627f7eb2Smrg check_charlen_present (source);
2606627f7eb2Smrg
2607627f7eb2Smrg f->ts = source->ts;
2608627f7eb2Smrg f->rank = source->rank + 1;
2609627f7eb2Smrg if (source->rank == 0)
2610627f7eb2Smrg {
2611627f7eb2Smrg if (source->ts.type == BT_CHARACTER)
2612627f7eb2Smrg f->value.function.name
2613627f7eb2Smrg = source->ts.kind == 1 ? PREFIX ("spread_char_scalar")
2614627f7eb2Smrg : gfc_get_string
2615627f7eb2Smrg (PREFIX ("spread_char%d_scalar"),
2616627f7eb2Smrg source->ts.kind);
2617627f7eb2Smrg else
2618627f7eb2Smrg f->value.function.name = PREFIX ("spread_scalar");
2619627f7eb2Smrg }
2620627f7eb2Smrg else
2621627f7eb2Smrg {
2622627f7eb2Smrg if (source->ts.type == BT_CHARACTER)
2623627f7eb2Smrg f->value.function.name
2624627f7eb2Smrg = source->ts.kind == 1 ? PREFIX ("spread_char")
2625627f7eb2Smrg : gfc_get_string
2626627f7eb2Smrg (PREFIX ("spread_char%d"),
2627627f7eb2Smrg source->ts.kind);
2628627f7eb2Smrg else
2629627f7eb2Smrg f->value.function.name = PREFIX ("spread");
2630627f7eb2Smrg }
2631627f7eb2Smrg
2632627f7eb2Smrg if (dim && gfc_is_constant_expr (dim)
2633627f7eb2Smrg && ncopies && gfc_is_constant_expr (ncopies) && source->shape[0])
2634627f7eb2Smrg {
2635627f7eb2Smrg int i, idim;
2636627f7eb2Smrg idim = mpz_get_ui (dim->value.integer);
2637627f7eb2Smrg f->shape = gfc_get_shape (f->rank);
2638627f7eb2Smrg for (i = 0; i < (idim - 1); i++)
2639627f7eb2Smrg mpz_init_set (f->shape[i], source->shape[i]);
2640627f7eb2Smrg
2641627f7eb2Smrg mpz_init_set (f->shape[idim - 1], ncopies->value.integer);
2642627f7eb2Smrg
2643627f7eb2Smrg for (i = idim; i < f->rank ; i++)
2644627f7eb2Smrg mpz_init_set (f->shape[i], source->shape[i-1]);
2645627f7eb2Smrg }
2646627f7eb2Smrg
2647627f7eb2Smrg
2648627f7eb2Smrg gfc_resolve_dim_arg (dim);
2649627f7eb2Smrg gfc_resolve_index (ncopies, 1);
2650627f7eb2Smrg }
2651627f7eb2Smrg
2652627f7eb2Smrg
2653627f7eb2Smrg void
gfc_resolve_sqrt(gfc_expr * f,gfc_expr * x)2654627f7eb2Smrg gfc_resolve_sqrt (gfc_expr *f, gfc_expr *x)
2655627f7eb2Smrg {
2656627f7eb2Smrg f->ts = x->ts;
2657627f7eb2Smrg f->value.function.name
2658627f7eb2Smrg = gfc_get_string ("__sqrt_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
2659627f7eb2Smrg }
2660627f7eb2Smrg
2661627f7eb2Smrg
2662627f7eb2Smrg /* Resolve the g77 compatibility function STAT AND FSTAT. */
2663627f7eb2Smrg
2664627f7eb2Smrg void
gfc_resolve_stat(gfc_expr * f,gfc_expr * n ATTRIBUTE_UNUSED,gfc_expr * a ATTRIBUTE_UNUSED)2665627f7eb2Smrg gfc_resolve_stat (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED,
2666627f7eb2Smrg gfc_expr *a ATTRIBUTE_UNUSED)
2667627f7eb2Smrg {
2668627f7eb2Smrg f->ts.type = BT_INTEGER;
2669627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
2670627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("stat_i%d"), f->ts.kind);
2671627f7eb2Smrg }
2672627f7eb2Smrg
2673627f7eb2Smrg
2674627f7eb2Smrg void
gfc_resolve_lstat(gfc_expr * f,gfc_expr * n ATTRIBUTE_UNUSED,gfc_expr * a ATTRIBUTE_UNUSED)2675627f7eb2Smrg gfc_resolve_lstat (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED,
2676627f7eb2Smrg gfc_expr *a ATTRIBUTE_UNUSED)
2677627f7eb2Smrg {
2678627f7eb2Smrg f->ts.type = BT_INTEGER;
2679627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
2680627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("lstat_i%d"), f->ts.kind);
2681627f7eb2Smrg }
2682627f7eb2Smrg
2683627f7eb2Smrg
2684627f7eb2Smrg void
gfc_resolve_fstat(gfc_expr * f,gfc_expr * n,gfc_expr * a ATTRIBUTE_UNUSED)2685627f7eb2Smrg gfc_resolve_fstat (gfc_expr *f, gfc_expr *n, gfc_expr *a ATTRIBUTE_UNUSED)
2686627f7eb2Smrg {
2687627f7eb2Smrg f->ts.type = BT_INTEGER;
2688627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
2689627f7eb2Smrg if (n->ts.kind != f->ts.kind)
2690627f7eb2Smrg gfc_convert_type (n, &f->ts, 2);
2691627f7eb2Smrg
2692627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("fstat_i%d"), f->ts.kind);
2693627f7eb2Smrg }
2694627f7eb2Smrg
2695627f7eb2Smrg
2696627f7eb2Smrg void
gfc_resolve_fgetc(gfc_expr * f,gfc_expr * u,gfc_expr * c ATTRIBUTE_UNUSED)2697627f7eb2Smrg gfc_resolve_fgetc (gfc_expr *f, gfc_expr *u, gfc_expr *c ATTRIBUTE_UNUSED)
2698627f7eb2Smrg {
2699627f7eb2Smrg gfc_typespec ts;
2700627f7eb2Smrg gfc_clear_ts (&ts);
2701627f7eb2Smrg
2702627f7eb2Smrg f->ts.type = BT_INTEGER;
2703627f7eb2Smrg f->ts.kind = gfc_c_int_kind;
2704627f7eb2Smrg if (u->ts.kind != gfc_c_int_kind)
2705627f7eb2Smrg {
2706627f7eb2Smrg ts.type = BT_INTEGER;
2707627f7eb2Smrg ts.kind = gfc_c_int_kind;
2708627f7eb2Smrg ts.u.derived = NULL;
2709627f7eb2Smrg ts.u.cl = NULL;
2710627f7eb2Smrg gfc_convert_type (u, &ts, 2);
2711627f7eb2Smrg }
2712627f7eb2Smrg
2713627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("fgetc"));
2714627f7eb2Smrg }
2715627f7eb2Smrg
2716627f7eb2Smrg
2717627f7eb2Smrg void
gfc_resolve_fget(gfc_expr * f,gfc_expr * c ATTRIBUTE_UNUSED)2718627f7eb2Smrg gfc_resolve_fget (gfc_expr *f, gfc_expr *c ATTRIBUTE_UNUSED)
2719627f7eb2Smrg {
2720627f7eb2Smrg f->ts.type = BT_INTEGER;
2721627f7eb2Smrg f->ts.kind = gfc_c_int_kind;
2722627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("fget"));
2723627f7eb2Smrg }
2724627f7eb2Smrg
2725627f7eb2Smrg
2726627f7eb2Smrg void
gfc_resolve_fputc(gfc_expr * f,gfc_expr * u,gfc_expr * c ATTRIBUTE_UNUSED)2727627f7eb2Smrg gfc_resolve_fputc (gfc_expr *f, gfc_expr *u, gfc_expr *c ATTRIBUTE_UNUSED)
2728627f7eb2Smrg {
2729627f7eb2Smrg gfc_typespec ts;
2730627f7eb2Smrg gfc_clear_ts (&ts);
2731627f7eb2Smrg
2732627f7eb2Smrg f->ts.type = BT_INTEGER;
2733627f7eb2Smrg f->ts.kind = gfc_c_int_kind;
2734627f7eb2Smrg if (u->ts.kind != gfc_c_int_kind)
2735627f7eb2Smrg {
2736627f7eb2Smrg ts.type = BT_INTEGER;
2737627f7eb2Smrg ts.kind = gfc_c_int_kind;
2738627f7eb2Smrg ts.u.derived = NULL;
2739627f7eb2Smrg ts.u.cl = NULL;
2740627f7eb2Smrg gfc_convert_type (u, &ts, 2);
2741627f7eb2Smrg }
2742627f7eb2Smrg
2743627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("fputc"));
2744627f7eb2Smrg }
2745627f7eb2Smrg
2746627f7eb2Smrg
2747627f7eb2Smrg void
gfc_resolve_fput(gfc_expr * f,gfc_expr * c ATTRIBUTE_UNUSED)2748627f7eb2Smrg gfc_resolve_fput (gfc_expr *f, gfc_expr *c ATTRIBUTE_UNUSED)
2749627f7eb2Smrg {
2750627f7eb2Smrg f->ts.type = BT_INTEGER;
2751627f7eb2Smrg f->ts.kind = gfc_c_int_kind;
2752627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("fput"));
2753627f7eb2Smrg }
2754627f7eb2Smrg
2755627f7eb2Smrg
2756627f7eb2Smrg void
gfc_resolve_ftell(gfc_expr * f,gfc_expr * u)2757627f7eb2Smrg gfc_resolve_ftell (gfc_expr *f, gfc_expr *u)
2758627f7eb2Smrg {
2759627f7eb2Smrg gfc_typespec ts;
2760627f7eb2Smrg gfc_clear_ts (&ts);
2761627f7eb2Smrg
2762627f7eb2Smrg f->ts.type = BT_INTEGER;
2763627f7eb2Smrg f->ts.kind = gfc_intio_kind;
2764627f7eb2Smrg if (u->ts.kind != gfc_c_int_kind)
2765627f7eb2Smrg {
2766627f7eb2Smrg ts.type = BT_INTEGER;
2767627f7eb2Smrg ts.kind = gfc_c_int_kind;
2768627f7eb2Smrg ts.u.derived = NULL;
2769627f7eb2Smrg ts.u.cl = NULL;
2770627f7eb2Smrg gfc_convert_type (u, &ts, 2);
2771627f7eb2Smrg }
2772627f7eb2Smrg
2773627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("ftell"));
2774627f7eb2Smrg }
2775627f7eb2Smrg
2776627f7eb2Smrg
2777627f7eb2Smrg void
gfc_resolve_storage_size(gfc_expr * f,gfc_expr * a ATTRIBUTE_UNUSED,gfc_expr * kind)2778627f7eb2Smrg gfc_resolve_storage_size (gfc_expr *f, gfc_expr *a ATTRIBUTE_UNUSED,
2779627f7eb2Smrg gfc_expr *kind)
2780627f7eb2Smrg {
2781627f7eb2Smrg f->ts.type = BT_INTEGER;
2782627f7eb2Smrg if (kind)
2783627f7eb2Smrg f->ts.kind = mpz_get_si (kind->value.integer);
2784627f7eb2Smrg else
2785627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
2786627f7eb2Smrg }
2787627f7eb2Smrg
2788627f7eb2Smrg
2789627f7eb2Smrg void
gfc_resolve_sum(gfc_expr * f,gfc_expr * array,gfc_expr * dim,gfc_expr * mask)2790627f7eb2Smrg gfc_resolve_sum (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
2791627f7eb2Smrg {
2792627f7eb2Smrg resolve_transformational ("sum", f, array, dim, mask);
2793627f7eb2Smrg }
2794627f7eb2Smrg
2795627f7eb2Smrg
2796627f7eb2Smrg void
gfc_resolve_symlnk(gfc_expr * f,gfc_expr * p1 ATTRIBUTE_UNUSED,gfc_expr * p2 ATTRIBUTE_UNUSED)2797627f7eb2Smrg gfc_resolve_symlnk (gfc_expr *f, gfc_expr *p1 ATTRIBUTE_UNUSED,
2798627f7eb2Smrg gfc_expr *p2 ATTRIBUTE_UNUSED)
2799627f7eb2Smrg {
2800627f7eb2Smrg f->ts.type = BT_INTEGER;
2801627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
2802627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("symlnk_i%d"), f->ts.kind);
2803627f7eb2Smrg }
2804627f7eb2Smrg
2805627f7eb2Smrg
2806627f7eb2Smrg /* Resolve the g77 compatibility function SYSTEM. */
2807627f7eb2Smrg
2808627f7eb2Smrg void
gfc_resolve_system(gfc_expr * f,gfc_expr * n ATTRIBUTE_UNUSED)2809627f7eb2Smrg gfc_resolve_system (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED)
2810627f7eb2Smrg {
2811627f7eb2Smrg f->ts.type = BT_INTEGER;
2812627f7eb2Smrg f->ts.kind = 4;
2813627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("system"));
2814627f7eb2Smrg }
2815627f7eb2Smrg
2816627f7eb2Smrg
2817627f7eb2Smrg void
gfc_resolve_tan(gfc_expr * f,gfc_expr * x)2818627f7eb2Smrg gfc_resolve_tan (gfc_expr *f, gfc_expr *x)
2819627f7eb2Smrg {
2820627f7eb2Smrg f->ts = x->ts;
2821627f7eb2Smrg f->value.function.name
2822627f7eb2Smrg = gfc_get_string ("__tan_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
2823627f7eb2Smrg }
2824627f7eb2Smrg
2825627f7eb2Smrg
2826627f7eb2Smrg void
gfc_resolve_tanh(gfc_expr * f,gfc_expr * x)2827627f7eb2Smrg gfc_resolve_tanh (gfc_expr *f, gfc_expr *x)
2828627f7eb2Smrg {
2829627f7eb2Smrg f->ts = x->ts;
2830627f7eb2Smrg f->value.function.name
2831627f7eb2Smrg = gfc_get_string ("__tanh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
2832627f7eb2Smrg }
2833627f7eb2Smrg
2834627f7eb2Smrg
2835627f7eb2Smrg /* Resolve failed_images (team, kind). */
2836627f7eb2Smrg
2837627f7eb2Smrg void
gfc_resolve_failed_images(gfc_expr * f,gfc_expr * team ATTRIBUTE_UNUSED,gfc_expr * kind)2838627f7eb2Smrg gfc_resolve_failed_images (gfc_expr *f, gfc_expr *team ATTRIBUTE_UNUSED,
2839627f7eb2Smrg gfc_expr *kind)
2840627f7eb2Smrg {
2841627f7eb2Smrg static char failed_images[] = "_gfortran_caf_failed_images";
2842627f7eb2Smrg f->rank = 1;
2843627f7eb2Smrg f->ts.type = BT_INTEGER;
2844627f7eb2Smrg if (kind == NULL)
2845627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
2846627f7eb2Smrg else
2847627f7eb2Smrg gfc_extract_int (kind, &f->ts.kind);
2848627f7eb2Smrg f->value.function.name = failed_images;
2849627f7eb2Smrg }
2850627f7eb2Smrg
2851627f7eb2Smrg
2852627f7eb2Smrg /* Resolve image_status (image, team). */
2853627f7eb2Smrg
2854627f7eb2Smrg void
gfc_resolve_image_status(gfc_expr * f,gfc_expr * image ATTRIBUTE_UNUSED,gfc_expr * team ATTRIBUTE_UNUSED)2855627f7eb2Smrg gfc_resolve_image_status (gfc_expr *f, gfc_expr *image ATTRIBUTE_UNUSED,
2856627f7eb2Smrg gfc_expr *team ATTRIBUTE_UNUSED)
2857627f7eb2Smrg {
2858627f7eb2Smrg static char image_status[] = "_gfortran_caf_image_status";
2859627f7eb2Smrg f->ts.type = BT_INTEGER;
2860627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
2861627f7eb2Smrg f->value.function.name = image_status;
2862627f7eb2Smrg }
2863627f7eb2Smrg
2864627f7eb2Smrg
2865627f7eb2Smrg /* Resolve get_team (). */
2866627f7eb2Smrg
2867627f7eb2Smrg void
gfc_resolve_get_team(gfc_expr * f,gfc_expr * level ATTRIBUTE_UNUSED)2868627f7eb2Smrg gfc_resolve_get_team (gfc_expr *f, gfc_expr *level ATTRIBUTE_UNUSED)
2869627f7eb2Smrg {
2870627f7eb2Smrg static char get_team[] = "_gfortran_caf_get_team";
2871627f7eb2Smrg f->rank = 0;
2872627f7eb2Smrg f->ts.type = BT_INTEGER;
2873627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
2874627f7eb2Smrg f->value.function.name = get_team;
2875627f7eb2Smrg }
2876627f7eb2Smrg
2877627f7eb2Smrg
2878627f7eb2Smrg /* Resolve image_index (...). */
2879627f7eb2Smrg
2880627f7eb2Smrg void
gfc_resolve_image_index(gfc_expr * f,gfc_expr * array ATTRIBUTE_UNUSED,gfc_expr * sub ATTRIBUTE_UNUSED)2881627f7eb2Smrg gfc_resolve_image_index (gfc_expr *f, gfc_expr *array ATTRIBUTE_UNUSED,
2882627f7eb2Smrg gfc_expr *sub ATTRIBUTE_UNUSED)
2883627f7eb2Smrg {
2884627f7eb2Smrg static char image_index[] = "__image_index";
2885627f7eb2Smrg f->ts.type = BT_INTEGER;
2886627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
2887627f7eb2Smrg f->value.function.name = image_index;
2888627f7eb2Smrg }
2889627f7eb2Smrg
2890627f7eb2Smrg
2891627f7eb2Smrg /* Resolve stopped_images (team, kind). */
2892627f7eb2Smrg
2893627f7eb2Smrg void
gfc_resolve_stopped_images(gfc_expr * f,gfc_expr * team ATTRIBUTE_UNUSED,gfc_expr * kind)2894627f7eb2Smrg gfc_resolve_stopped_images (gfc_expr *f, gfc_expr *team ATTRIBUTE_UNUSED,
2895627f7eb2Smrg gfc_expr *kind)
2896627f7eb2Smrg {
2897627f7eb2Smrg static char stopped_images[] = "_gfortran_caf_stopped_images";
2898627f7eb2Smrg f->rank = 1;
2899627f7eb2Smrg f->ts.type = BT_INTEGER;
2900627f7eb2Smrg if (kind == NULL)
2901627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
2902627f7eb2Smrg else
2903627f7eb2Smrg gfc_extract_int (kind, &f->ts.kind);
2904627f7eb2Smrg f->value.function.name = stopped_images;
2905627f7eb2Smrg }
2906627f7eb2Smrg
2907627f7eb2Smrg
2908627f7eb2Smrg /* Resolve team_number (team). */
2909627f7eb2Smrg
2910627f7eb2Smrg void
gfc_resolve_team_number(gfc_expr * f,gfc_expr * team ATTRIBUTE_UNUSED)2911627f7eb2Smrg gfc_resolve_team_number (gfc_expr *f, gfc_expr *team ATTRIBUTE_UNUSED)
2912627f7eb2Smrg {
2913627f7eb2Smrg static char team_number[] = "_gfortran_caf_team_number";
2914627f7eb2Smrg f->rank = 0;
2915627f7eb2Smrg f->ts.type = BT_INTEGER;
2916627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
2917627f7eb2Smrg f->value.function.name = team_number;
2918627f7eb2Smrg }
2919627f7eb2Smrg
2920627f7eb2Smrg
2921627f7eb2Smrg void
gfc_resolve_this_image(gfc_expr * f,gfc_expr * array,gfc_expr * dim,gfc_expr * distance ATTRIBUTE_UNUSED)2922627f7eb2Smrg gfc_resolve_this_image (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
2923627f7eb2Smrg gfc_expr *distance ATTRIBUTE_UNUSED)
2924627f7eb2Smrg {
2925627f7eb2Smrg static char this_image[] = "__this_image";
2926627f7eb2Smrg if (array && gfc_is_coarray (array))
2927627f7eb2Smrg resolve_bound (f, array, dim, NULL, "__this_image", true);
2928627f7eb2Smrg else
2929627f7eb2Smrg {
2930627f7eb2Smrg f->ts.type = BT_INTEGER;
2931627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
2932627f7eb2Smrg f->value.function.name = this_image;
2933627f7eb2Smrg }
2934627f7eb2Smrg }
2935627f7eb2Smrg
2936627f7eb2Smrg
2937627f7eb2Smrg void
gfc_resolve_time(gfc_expr * f)2938627f7eb2Smrg gfc_resolve_time (gfc_expr *f)
2939627f7eb2Smrg {
2940627f7eb2Smrg f->ts.type = BT_INTEGER;
2941627f7eb2Smrg f->ts.kind = 4;
2942627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("time_func"));
2943627f7eb2Smrg }
2944627f7eb2Smrg
2945627f7eb2Smrg
2946627f7eb2Smrg void
gfc_resolve_time8(gfc_expr * f)2947627f7eb2Smrg gfc_resolve_time8 (gfc_expr *f)
2948627f7eb2Smrg {
2949627f7eb2Smrg f->ts.type = BT_INTEGER;
2950627f7eb2Smrg f->ts.kind = 8;
2951627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("time8_func"));
2952627f7eb2Smrg }
2953627f7eb2Smrg
2954627f7eb2Smrg
2955627f7eb2Smrg void
gfc_resolve_transfer(gfc_expr * f,gfc_expr * source ATTRIBUTE_UNUSED,gfc_expr * mold,gfc_expr * size)2956627f7eb2Smrg gfc_resolve_transfer (gfc_expr *f, gfc_expr *source ATTRIBUTE_UNUSED,
2957627f7eb2Smrg gfc_expr *mold, gfc_expr *size)
2958627f7eb2Smrg {
2959627f7eb2Smrg /* TODO: Make this do something meaningful. */
2960627f7eb2Smrg static char transfer0[] = "__transfer0", transfer1[] = "__transfer1";
2961627f7eb2Smrg
2962627f7eb2Smrg if (mold->ts.type == BT_CHARACTER
2963627f7eb2Smrg && !mold->ts.u.cl->length
2964627f7eb2Smrg && gfc_is_constant_expr (mold))
2965627f7eb2Smrg {
2966627f7eb2Smrg int len;
2967627f7eb2Smrg if (mold->expr_type == EXPR_CONSTANT)
2968627f7eb2Smrg {
2969627f7eb2Smrg len = mold->value.character.length;
2970627f7eb2Smrg mold->ts.u.cl->length = gfc_get_int_expr (gfc_charlen_int_kind,
2971627f7eb2Smrg NULL, len);
2972627f7eb2Smrg }
2973627f7eb2Smrg else
2974627f7eb2Smrg {
2975627f7eb2Smrg gfc_constructor *c = gfc_constructor_first (mold->value.constructor);
2976627f7eb2Smrg len = c->expr->value.character.length;
2977627f7eb2Smrg mold->ts.u.cl->length = gfc_get_int_expr (gfc_charlen_int_kind,
2978627f7eb2Smrg NULL, len);
2979627f7eb2Smrg }
2980627f7eb2Smrg }
2981627f7eb2Smrg
2982627f7eb2Smrg f->ts = mold->ts;
2983627f7eb2Smrg
2984627f7eb2Smrg if (size == NULL && mold->rank == 0)
2985627f7eb2Smrg {
2986627f7eb2Smrg f->rank = 0;
2987627f7eb2Smrg f->value.function.name = transfer0;
2988627f7eb2Smrg }
2989627f7eb2Smrg else
2990627f7eb2Smrg {
2991627f7eb2Smrg f->rank = 1;
2992627f7eb2Smrg f->value.function.name = transfer1;
2993627f7eb2Smrg if (size && gfc_is_constant_expr (size))
2994627f7eb2Smrg {
2995627f7eb2Smrg f->shape = gfc_get_shape (1);
2996627f7eb2Smrg mpz_init_set (f->shape[0], size->value.integer);
2997627f7eb2Smrg }
2998627f7eb2Smrg }
2999627f7eb2Smrg }
3000627f7eb2Smrg
3001627f7eb2Smrg
3002627f7eb2Smrg void
gfc_resolve_transpose(gfc_expr * f,gfc_expr * matrix)3003627f7eb2Smrg gfc_resolve_transpose (gfc_expr *f, gfc_expr *matrix)
3004627f7eb2Smrg {
3005627f7eb2Smrg
3006627f7eb2Smrg if (matrix->ts.type == BT_CHARACTER && matrix->ref)
3007627f7eb2Smrg gfc_resolve_substring_charlen (matrix);
3008627f7eb2Smrg
3009627f7eb2Smrg f->ts = matrix->ts;
3010627f7eb2Smrg f->rank = 2;
3011627f7eb2Smrg if (matrix->shape)
3012627f7eb2Smrg {
3013627f7eb2Smrg f->shape = gfc_get_shape (2);
3014627f7eb2Smrg mpz_init_set (f->shape[0], matrix->shape[1]);
3015627f7eb2Smrg mpz_init_set (f->shape[1], matrix->shape[0]);
3016627f7eb2Smrg }
3017627f7eb2Smrg
3018627f7eb2Smrg switch (matrix->ts.kind)
3019627f7eb2Smrg {
3020627f7eb2Smrg case 4:
3021627f7eb2Smrg case 8:
3022627f7eb2Smrg case 10:
3023627f7eb2Smrg case 16:
3024627f7eb2Smrg switch (matrix->ts.type)
3025627f7eb2Smrg {
3026627f7eb2Smrg case BT_REAL:
3027627f7eb2Smrg case BT_COMPLEX:
3028627f7eb2Smrg f->value.function.name
3029627f7eb2Smrg = gfc_get_string (PREFIX ("transpose_%c%d"),
3030627f7eb2Smrg gfc_type_letter (matrix->ts.type),
3031627f7eb2Smrg matrix->ts.kind);
3032627f7eb2Smrg break;
3033627f7eb2Smrg
3034627f7eb2Smrg case BT_INTEGER:
3035627f7eb2Smrg case BT_LOGICAL:
3036627f7eb2Smrg /* Use the integer routines for real and logical cases. This
3037627f7eb2Smrg assumes they all have the same alignment requirements. */
3038627f7eb2Smrg f->value.function.name
3039627f7eb2Smrg = gfc_get_string (PREFIX ("transpose_i%d"), matrix->ts.kind);
3040627f7eb2Smrg break;
3041627f7eb2Smrg
3042627f7eb2Smrg default:
3043627f7eb2Smrg if (matrix->ts.type == BT_CHARACTER && matrix->ts.kind == 4)
3044627f7eb2Smrg f->value.function.name = PREFIX ("transpose_char4");
3045627f7eb2Smrg else
3046627f7eb2Smrg f->value.function.name = PREFIX ("transpose");
3047627f7eb2Smrg break;
3048627f7eb2Smrg }
3049627f7eb2Smrg break;
3050627f7eb2Smrg
3051627f7eb2Smrg default:
3052627f7eb2Smrg f->value.function.name = (matrix->ts.type == BT_CHARACTER
3053627f7eb2Smrg ? PREFIX ("transpose_char")
3054627f7eb2Smrg : PREFIX ("transpose"));
3055627f7eb2Smrg break;
3056627f7eb2Smrg }
3057627f7eb2Smrg }
3058627f7eb2Smrg
3059627f7eb2Smrg
3060627f7eb2Smrg void
gfc_resolve_trim(gfc_expr * f,gfc_expr * string)3061627f7eb2Smrg gfc_resolve_trim (gfc_expr *f, gfc_expr *string)
3062627f7eb2Smrg {
3063627f7eb2Smrg f->ts.type = BT_CHARACTER;
3064627f7eb2Smrg f->ts.kind = string->ts.kind;
3065627f7eb2Smrg f->value.function.name = gfc_get_string ("__trim_%d", string->ts.kind);
3066627f7eb2Smrg }
3067627f7eb2Smrg
3068627f7eb2Smrg
30694c3eb207Smrg /* Resolve the degree trignometric functions. This amounts to setting
30704c3eb207Smrg the function return type-spec from its argument and building a
30714c3eb207Smrg library function names of the form _gfortran_sind_r4. */
30724c3eb207Smrg
30734c3eb207Smrg void
gfc_resolve_trigd(gfc_expr * f,gfc_expr * x)30744c3eb207Smrg gfc_resolve_trigd (gfc_expr *f, gfc_expr *x)
30754c3eb207Smrg {
30764c3eb207Smrg f->ts = x->ts;
30774c3eb207Smrg f->value.function.name
30784c3eb207Smrg = gfc_get_string (PREFIX ("%s_%c%d"), f->value.function.isym->name,
30794c3eb207Smrg gfc_type_letter (x->ts.type), x->ts.kind);
30804c3eb207Smrg }
30814c3eb207Smrg
30824c3eb207Smrg
30834c3eb207Smrg void
gfc_resolve_trigd2(gfc_expr * f,gfc_expr * y,gfc_expr * x)30844c3eb207Smrg gfc_resolve_trigd2 (gfc_expr *f, gfc_expr *y, gfc_expr *x)
30854c3eb207Smrg {
30864c3eb207Smrg f->ts = y->ts;
30874c3eb207Smrg f->value.function.name
30884c3eb207Smrg = gfc_get_string (PREFIX ("%s_%d"), f->value.function.isym->name,
30894c3eb207Smrg x->ts.kind);
30904c3eb207Smrg }
30914c3eb207Smrg
30924c3eb207Smrg
3093627f7eb2Smrg void
gfc_resolve_ubound(gfc_expr * f,gfc_expr * array,gfc_expr * dim,gfc_expr * kind)3094627f7eb2Smrg gfc_resolve_ubound (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3095627f7eb2Smrg {
3096627f7eb2Smrg resolve_bound (f, array, dim, kind, "__ubound", false);
3097627f7eb2Smrg }
3098627f7eb2Smrg
3099627f7eb2Smrg
3100627f7eb2Smrg void
gfc_resolve_ucobound(gfc_expr * f,gfc_expr * array,gfc_expr * dim,gfc_expr * kind)3101627f7eb2Smrg gfc_resolve_ucobound (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3102627f7eb2Smrg {
3103627f7eb2Smrg resolve_bound (f, array, dim, kind, "__ucobound", true);
3104627f7eb2Smrg }
3105627f7eb2Smrg
3106627f7eb2Smrg
3107627f7eb2Smrg /* Resolve the g77 compatibility function UMASK. */
3108627f7eb2Smrg
3109627f7eb2Smrg void
gfc_resolve_umask(gfc_expr * f,gfc_expr * n)3110627f7eb2Smrg gfc_resolve_umask (gfc_expr *f, gfc_expr *n)
3111627f7eb2Smrg {
3112627f7eb2Smrg f->ts.type = BT_INTEGER;
3113627f7eb2Smrg f->ts.kind = n->ts.kind;
3114627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("umask_i%d"), n->ts.kind);
3115627f7eb2Smrg }
3116627f7eb2Smrg
3117627f7eb2Smrg
3118627f7eb2Smrg /* Resolve the g77 compatibility function UNLINK. */
3119627f7eb2Smrg
3120627f7eb2Smrg void
gfc_resolve_unlink(gfc_expr * f,gfc_expr * n ATTRIBUTE_UNUSED)3121627f7eb2Smrg gfc_resolve_unlink (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED)
3122627f7eb2Smrg {
3123627f7eb2Smrg f->ts.type = BT_INTEGER;
3124627f7eb2Smrg f->ts.kind = 4;
3125627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("unlink"));
3126627f7eb2Smrg }
3127627f7eb2Smrg
3128627f7eb2Smrg
3129627f7eb2Smrg void
gfc_resolve_ttynam(gfc_expr * f,gfc_expr * unit)3130627f7eb2Smrg gfc_resolve_ttynam (gfc_expr *f, gfc_expr *unit)
3131627f7eb2Smrg {
3132627f7eb2Smrg gfc_typespec ts;
3133627f7eb2Smrg gfc_clear_ts (&ts);
3134627f7eb2Smrg
3135627f7eb2Smrg f->ts.type = BT_CHARACTER;
3136627f7eb2Smrg f->ts.kind = gfc_default_character_kind;
3137627f7eb2Smrg
3138627f7eb2Smrg if (unit->ts.kind != gfc_c_int_kind)
3139627f7eb2Smrg {
3140627f7eb2Smrg ts.type = BT_INTEGER;
3141627f7eb2Smrg ts.kind = gfc_c_int_kind;
3142627f7eb2Smrg ts.u.derived = NULL;
3143627f7eb2Smrg ts.u.cl = NULL;
3144627f7eb2Smrg gfc_convert_type (unit, &ts, 2);
3145627f7eb2Smrg }
3146627f7eb2Smrg
3147627f7eb2Smrg f->value.function.name = gfc_get_string (PREFIX ("ttynam"));
3148627f7eb2Smrg }
3149627f7eb2Smrg
3150627f7eb2Smrg
3151627f7eb2Smrg void
gfc_resolve_unpack(gfc_expr * f,gfc_expr * vector,gfc_expr * mask,gfc_expr * field ATTRIBUTE_UNUSED)3152627f7eb2Smrg gfc_resolve_unpack (gfc_expr *f, gfc_expr *vector, gfc_expr *mask,
3153627f7eb2Smrg gfc_expr *field ATTRIBUTE_UNUSED)
3154627f7eb2Smrg {
3155627f7eb2Smrg if (vector->ts.type == BT_CHARACTER && vector->ref)
3156627f7eb2Smrg gfc_resolve_substring_charlen (vector);
3157627f7eb2Smrg
3158627f7eb2Smrg f->ts = vector->ts;
3159627f7eb2Smrg f->rank = mask->rank;
3160627f7eb2Smrg resolve_mask_arg (mask);
3161627f7eb2Smrg
3162627f7eb2Smrg if (vector->ts.type == BT_CHARACTER)
3163627f7eb2Smrg {
3164627f7eb2Smrg if (vector->ts.kind == 1)
3165627f7eb2Smrg f->value.function.name
3166627f7eb2Smrg = gfc_get_string (PREFIX ("unpack%d_char"), field->rank > 0 ? 1 : 0);
3167627f7eb2Smrg else
3168627f7eb2Smrg f->value.function.name
3169627f7eb2Smrg = gfc_get_string (PREFIX ("unpack%d_char%d"),
3170627f7eb2Smrg field->rank > 0 ? 1 : 0, vector->ts.kind);
3171627f7eb2Smrg }
3172627f7eb2Smrg else
3173627f7eb2Smrg f->value.function.name
3174627f7eb2Smrg = gfc_get_string (PREFIX ("unpack%d"), field->rank > 0 ? 1 : 0);
3175627f7eb2Smrg }
3176627f7eb2Smrg
3177627f7eb2Smrg
3178627f7eb2Smrg void
gfc_resolve_verify(gfc_expr * f,gfc_expr * string,gfc_expr * set ATTRIBUTE_UNUSED,gfc_expr * back ATTRIBUTE_UNUSED,gfc_expr * kind)3179627f7eb2Smrg gfc_resolve_verify (gfc_expr *f, gfc_expr *string,
3180627f7eb2Smrg gfc_expr *set ATTRIBUTE_UNUSED,
3181627f7eb2Smrg gfc_expr *back ATTRIBUTE_UNUSED, gfc_expr *kind)
3182627f7eb2Smrg {
3183627f7eb2Smrg f->ts.type = BT_INTEGER;
3184627f7eb2Smrg if (kind)
3185627f7eb2Smrg f->ts.kind = mpz_get_si (kind->value.integer);
3186627f7eb2Smrg else
3187627f7eb2Smrg f->ts.kind = gfc_default_integer_kind;
3188627f7eb2Smrg f->value.function.name = gfc_get_string ("__verify_%d", string->ts.kind);
3189627f7eb2Smrg }
3190627f7eb2Smrg
3191627f7eb2Smrg
3192627f7eb2Smrg void
gfc_resolve_xor(gfc_expr * f,gfc_expr * i,gfc_expr * j)3193627f7eb2Smrg gfc_resolve_xor (gfc_expr *f, gfc_expr *i, gfc_expr *j)
3194627f7eb2Smrg {
3195627f7eb2Smrg f->ts.type = i->ts.type;
3196627f7eb2Smrg f->ts.kind = gfc_kind_max (i, j);
3197627f7eb2Smrg
3198627f7eb2Smrg if (i->ts.kind != j->ts.kind)
3199627f7eb2Smrg {
3200627f7eb2Smrg if (i->ts.kind == gfc_kind_max (i, j))
3201627f7eb2Smrg gfc_convert_type (j, &i->ts, 2);
3202627f7eb2Smrg else
3203627f7eb2Smrg gfc_convert_type (i, &j->ts, 2);
3204627f7eb2Smrg }
3205627f7eb2Smrg
3206627f7eb2Smrg f->value.function.name
3207627f7eb2Smrg = gfc_get_string ("__xor_%c%d", gfc_type_letter (i->ts.type), f->ts.kind);
3208627f7eb2Smrg }
3209627f7eb2Smrg
3210627f7eb2Smrg
3211627f7eb2Smrg /* Intrinsic subroutine resolution. */
3212627f7eb2Smrg
3213627f7eb2Smrg void
gfc_resolve_alarm_sub(gfc_code * c)3214627f7eb2Smrg gfc_resolve_alarm_sub (gfc_code *c)
3215627f7eb2Smrg {
3216627f7eb2Smrg const char *name;
3217627f7eb2Smrg gfc_expr *seconds, *handler;
3218627f7eb2Smrg gfc_typespec ts;
3219627f7eb2Smrg gfc_clear_ts (&ts);
3220627f7eb2Smrg
3221627f7eb2Smrg seconds = c->ext.actual->expr;
3222627f7eb2Smrg handler = c->ext.actual->next->expr;
3223627f7eb2Smrg ts.type = BT_INTEGER;
3224627f7eb2Smrg ts.kind = gfc_c_int_kind;
3225627f7eb2Smrg
3226627f7eb2Smrg /* handler can be either BT_INTEGER or BT_PROCEDURE.
3227627f7eb2Smrg In all cases, the status argument is of default integer kind
3228627f7eb2Smrg (enforced in check.c) so that the function suffix is fixed. */
3229627f7eb2Smrg if (handler->ts.type == BT_INTEGER)
3230627f7eb2Smrg {
3231627f7eb2Smrg if (handler->ts.kind != gfc_c_int_kind)
3232627f7eb2Smrg gfc_convert_type (handler, &ts, 2);
3233627f7eb2Smrg name = gfc_get_string (PREFIX ("alarm_sub_int_i%d"),
3234627f7eb2Smrg gfc_default_integer_kind);
3235627f7eb2Smrg }
3236627f7eb2Smrg else
3237627f7eb2Smrg name = gfc_get_string (PREFIX ("alarm_sub_i%d"),
3238627f7eb2Smrg gfc_default_integer_kind);
3239627f7eb2Smrg
3240627f7eb2Smrg if (seconds->ts.kind != gfc_c_int_kind)
3241627f7eb2Smrg gfc_convert_type (seconds, &ts, 2);
3242627f7eb2Smrg
3243627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3244627f7eb2Smrg }
3245627f7eb2Smrg
3246627f7eb2Smrg void
gfc_resolve_cpu_time(gfc_code * c)3247627f7eb2Smrg gfc_resolve_cpu_time (gfc_code *c)
3248627f7eb2Smrg {
3249627f7eb2Smrg const char *name;
3250627f7eb2Smrg name = gfc_get_string (PREFIX ("cpu_time_%d"), c->ext.actual->expr->ts.kind);
3251627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3252627f7eb2Smrg }
3253627f7eb2Smrg
3254627f7eb2Smrg
3255627f7eb2Smrg /* Create a formal arglist based on an actual one and set the INTENTs given. */
3256627f7eb2Smrg
3257627f7eb2Smrg static gfc_formal_arglist*
create_formal_for_intents(gfc_actual_arglist * actual,const sym_intent * ints)3258627f7eb2Smrg create_formal_for_intents (gfc_actual_arglist* actual, const sym_intent* ints)
3259627f7eb2Smrg {
3260627f7eb2Smrg gfc_formal_arglist* head;
3261627f7eb2Smrg gfc_formal_arglist* tail;
3262627f7eb2Smrg int i;
3263627f7eb2Smrg
3264627f7eb2Smrg if (!actual)
3265627f7eb2Smrg return NULL;
3266627f7eb2Smrg
3267627f7eb2Smrg head = tail = gfc_get_formal_arglist ();
3268627f7eb2Smrg for (i = 0; actual; actual = actual->next, tail = tail->next, ++i)
3269627f7eb2Smrg {
3270627f7eb2Smrg gfc_symbol* sym;
3271627f7eb2Smrg
3272627f7eb2Smrg sym = gfc_new_symbol ("dummyarg", NULL);
3273627f7eb2Smrg sym->ts = actual->expr->ts;
3274627f7eb2Smrg
3275627f7eb2Smrg sym->attr.intent = ints[i];
3276627f7eb2Smrg tail->sym = sym;
3277627f7eb2Smrg
3278627f7eb2Smrg if (actual->next)
3279627f7eb2Smrg tail->next = gfc_get_formal_arglist ();
3280627f7eb2Smrg }
3281627f7eb2Smrg
3282627f7eb2Smrg return head;
3283627f7eb2Smrg }
3284627f7eb2Smrg
3285627f7eb2Smrg
3286627f7eb2Smrg void
gfc_resolve_atomic_def(gfc_code * c)3287627f7eb2Smrg gfc_resolve_atomic_def (gfc_code *c)
3288627f7eb2Smrg {
3289627f7eb2Smrg const char *name = "atomic_define";
3290627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3291627f7eb2Smrg }
3292627f7eb2Smrg
3293627f7eb2Smrg
3294627f7eb2Smrg void
gfc_resolve_atomic_ref(gfc_code * c)3295627f7eb2Smrg gfc_resolve_atomic_ref (gfc_code *c)
3296627f7eb2Smrg {
3297627f7eb2Smrg const char *name = "atomic_ref";
3298627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3299627f7eb2Smrg }
3300627f7eb2Smrg
3301627f7eb2Smrg void
gfc_resolve_event_query(gfc_code * c)3302627f7eb2Smrg gfc_resolve_event_query (gfc_code *c)
3303627f7eb2Smrg {
3304627f7eb2Smrg const char *name = "event_query";
3305627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3306627f7eb2Smrg }
3307627f7eb2Smrg
3308627f7eb2Smrg void
gfc_resolve_mvbits(gfc_code * c)3309627f7eb2Smrg gfc_resolve_mvbits (gfc_code *c)
3310627f7eb2Smrg {
3311627f7eb2Smrg static const sym_intent INTENTS[] = {INTENT_IN, INTENT_IN, INTENT_IN,
3312627f7eb2Smrg INTENT_INOUT, INTENT_IN};
3313627f7eb2Smrg
3314627f7eb2Smrg const char *name;
3315627f7eb2Smrg gfc_typespec ts;
3316627f7eb2Smrg gfc_clear_ts (&ts);
3317627f7eb2Smrg
3318627f7eb2Smrg /* FROMPOS, LEN and TOPOS are restricted to small values. As such,
3319627f7eb2Smrg they will be converted so that they fit into a C int. */
3320627f7eb2Smrg ts.type = BT_INTEGER;
3321627f7eb2Smrg ts.kind = gfc_c_int_kind;
3322627f7eb2Smrg if (c->ext.actual->next->expr->ts.kind != gfc_c_int_kind)
3323627f7eb2Smrg gfc_convert_type (c->ext.actual->next->expr, &ts, 2);
3324627f7eb2Smrg if (c->ext.actual->next->next->expr->ts.kind != gfc_c_int_kind)
3325627f7eb2Smrg gfc_convert_type (c->ext.actual->next->next->expr, &ts, 2);
3326627f7eb2Smrg if (c->ext.actual->next->next->next->next->expr->ts.kind != gfc_c_int_kind)
3327627f7eb2Smrg gfc_convert_type (c->ext.actual->next->next->next->next->expr, &ts, 2);
3328627f7eb2Smrg
3329627f7eb2Smrg /* TO and FROM are guaranteed to have the same kind parameter. */
3330627f7eb2Smrg name = gfc_get_string (PREFIX ("mvbits_i%d"),
3331627f7eb2Smrg c->ext.actual->expr->ts.kind);
3332627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3333627f7eb2Smrg /* Mark as elemental subroutine as this does not happen automatically. */
3334627f7eb2Smrg c->resolved_sym->attr.elemental = 1;
3335627f7eb2Smrg
3336627f7eb2Smrg /* Create a dummy formal arglist so the INTENTs are known later for purpose
3337627f7eb2Smrg of creating temporaries. */
3338627f7eb2Smrg c->resolved_sym->formal = create_formal_for_intents (c->ext.actual, INTENTS);
3339627f7eb2Smrg }
3340627f7eb2Smrg
3341627f7eb2Smrg
3342627f7eb2Smrg /* Set up the call to RANDOM_INIT. */
3343627f7eb2Smrg
3344627f7eb2Smrg void
gfc_resolve_random_init(gfc_code * c)3345627f7eb2Smrg gfc_resolve_random_init (gfc_code *c)
3346627f7eb2Smrg {
3347627f7eb2Smrg const char *name;
3348627f7eb2Smrg name = gfc_get_string (PREFIX ("random_init"));
3349627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3350627f7eb2Smrg }
3351627f7eb2Smrg
3352627f7eb2Smrg
3353627f7eb2Smrg void
gfc_resolve_random_number(gfc_code * c)3354627f7eb2Smrg gfc_resolve_random_number (gfc_code *c)
3355627f7eb2Smrg {
3356627f7eb2Smrg const char *name;
3357627f7eb2Smrg int kind;
3358627f7eb2Smrg
3359627f7eb2Smrg kind = c->ext.actual->expr->ts.kind;
3360627f7eb2Smrg if (c->ext.actual->expr->rank == 0)
3361627f7eb2Smrg name = gfc_get_string (PREFIX ("random_r%d"), kind);
3362627f7eb2Smrg else
3363627f7eb2Smrg name = gfc_get_string (PREFIX ("arandom_r%d"), kind);
3364627f7eb2Smrg
3365627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3366627f7eb2Smrg }
3367627f7eb2Smrg
3368627f7eb2Smrg
3369627f7eb2Smrg void
gfc_resolve_random_seed(gfc_code * c)3370627f7eb2Smrg gfc_resolve_random_seed (gfc_code *c)
3371627f7eb2Smrg {
3372627f7eb2Smrg const char *name;
3373627f7eb2Smrg
3374627f7eb2Smrg name = gfc_get_string (PREFIX ("random_seed_i%d"), gfc_default_integer_kind);
3375627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3376627f7eb2Smrg }
3377627f7eb2Smrg
3378627f7eb2Smrg
3379627f7eb2Smrg void
gfc_resolve_rename_sub(gfc_code * c)3380627f7eb2Smrg gfc_resolve_rename_sub (gfc_code *c)
3381627f7eb2Smrg {
3382627f7eb2Smrg const char *name;
3383627f7eb2Smrg int kind;
3384627f7eb2Smrg
3385627f7eb2Smrg /* Find the type of status. If not present use default integer kind. */
3386627f7eb2Smrg if (c->ext.actual->next->next->expr != NULL)
3387627f7eb2Smrg kind = c->ext.actual->next->next->expr->ts.kind;
3388627f7eb2Smrg else
3389627f7eb2Smrg kind = gfc_default_integer_kind;
3390627f7eb2Smrg
3391627f7eb2Smrg name = gfc_get_string (PREFIX ("rename_i%d_sub"), kind);
3392627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3393627f7eb2Smrg }
3394627f7eb2Smrg
3395627f7eb2Smrg
3396627f7eb2Smrg void
gfc_resolve_link_sub(gfc_code * c)3397627f7eb2Smrg gfc_resolve_link_sub (gfc_code *c)
3398627f7eb2Smrg {
3399627f7eb2Smrg const char *name;
3400627f7eb2Smrg int kind;
3401627f7eb2Smrg
3402627f7eb2Smrg if (c->ext.actual->next->next->expr != NULL)
3403627f7eb2Smrg kind = c->ext.actual->next->next->expr->ts.kind;
3404627f7eb2Smrg else
3405627f7eb2Smrg kind = gfc_default_integer_kind;
3406627f7eb2Smrg
3407627f7eb2Smrg name = gfc_get_string (PREFIX ("link_i%d_sub"), kind);
3408627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3409627f7eb2Smrg }
3410627f7eb2Smrg
3411627f7eb2Smrg
3412627f7eb2Smrg void
gfc_resolve_symlnk_sub(gfc_code * c)3413627f7eb2Smrg gfc_resolve_symlnk_sub (gfc_code *c)
3414627f7eb2Smrg {
3415627f7eb2Smrg const char *name;
3416627f7eb2Smrg int kind;
3417627f7eb2Smrg
3418627f7eb2Smrg if (c->ext.actual->next->next->expr != NULL)
3419627f7eb2Smrg kind = c->ext.actual->next->next->expr->ts.kind;
3420627f7eb2Smrg else
3421627f7eb2Smrg kind = gfc_default_integer_kind;
3422627f7eb2Smrg
3423627f7eb2Smrg name = gfc_get_string (PREFIX ("symlnk_i%d_sub"), kind);
3424627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3425627f7eb2Smrg }
3426627f7eb2Smrg
3427627f7eb2Smrg
3428627f7eb2Smrg /* G77 compatibility subroutines dtime() and etime(). */
3429627f7eb2Smrg
3430627f7eb2Smrg void
gfc_resolve_dtime_sub(gfc_code * c)3431627f7eb2Smrg gfc_resolve_dtime_sub (gfc_code *c)
3432627f7eb2Smrg {
3433627f7eb2Smrg const char *name;
3434627f7eb2Smrg name = gfc_get_string (PREFIX ("dtime_sub"));
3435627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3436627f7eb2Smrg }
3437627f7eb2Smrg
3438627f7eb2Smrg void
gfc_resolve_etime_sub(gfc_code * c)3439627f7eb2Smrg gfc_resolve_etime_sub (gfc_code *c)
3440627f7eb2Smrg {
3441627f7eb2Smrg const char *name;
3442627f7eb2Smrg name = gfc_get_string (PREFIX ("etime_sub"));
3443627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3444627f7eb2Smrg }
3445627f7eb2Smrg
3446627f7eb2Smrg
3447627f7eb2Smrg /* G77 compatibility subroutines itime(), idate(), ltime() and gmtime(). */
3448627f7eb2Smrg
3449627f7eb2Smrg void
gfc_resolve_itime(gfc_code * c)3450627f7eb2Smrg gfc_resolve_itime (gfc_code *c)
3451627f7eb2Smrg {
3452627f7eb2Smrg c->resolved_sym
3453627f7eb2Smrg = gfc_get_intrinsic_sub_symbol (gfc_get_string (PREFIX ("itime_i%d"),
3454627f7eb2Smrg gfc_default_integer_kind));
3455627f7eb2Smrg }
3456627f7eb2Smrg
3457627f7eb2Smrg void
gfc_resolve_idate(gfc_code * c)3458627f7eb2Smrg gfc_resolve_idate (gfc_code *c)
3459627f7eb2Smrg {
3460627f7eb2Smrg c->resolved_sym
3461627f7eb2Smrg = gfc_get_intrinsic_sub_symbol (gfc_get_string (PREFIX ("idate_i%d"),
3462627f7eb2Smrg gfc_default_integer_kind));
3463627f7eb2Smrg }
3464627f7eb2Smrg
3465627f7eb2Smrg void
gfc_resolve_ltime(gfc_code * c)3466627f7eb2Smrg gfc_resolve_ltime (gfc_code *c)
3467627f7eb2Smrg {
3468627f7eb2Smrg c->resolved_sym
3469627f7eb2Smrg = gfc_get_intrinsic_sub_symbol (gfc_get_string (PREFIX ("ltime_i%d"),
3470627f7eb2Smrg gfc_default_integer_kind));
3471627f7eb2Smrg }
3472627f7eb2Smrg
3473627f7eb2Smrg void
gfc_resolve_gmtime(gfc_code * c)3474627f7eb2Smrg gfc_resolve_gmtime (gfc_code *c)
3475627f7eb2Smrg {
3476627f7eb2Smrg c->resolved_sym
3477627f7eb2Smrg = gfc_get_intrinsic_sub_symbol (gfc_get_string (PREFIX ("gmtime_i%d"),
3478627f7eb2Smrg gfc_default_integer_kind));
3479627f7eb2Smrg }
3480627f7eb2Smrg
3481627f7eb2Smrg
3482627f7eb2Smrg /* G77 compatibility subroutine second(). */
3483627f7eb2Smrg
3484627f7eb2Smrg void
gfc_resolve_second_sub(gfc_code * c)3485627f7eb2Smrg gfc_resolve_second_sub (gfc_code *c)
3486627f7eb2Smrg {
3487627f7eb2Smrg const char *name;
3488627f7eb2Smrg name = gfc_get_string (PREFIX ("second_sub"));
3489627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3490627f7eb2Smrg }
3491627f7eb2Smrg
3492627f7eb2Smrg
3493627f7eb2Smrg void
gfc_resolve_sleep_sub(gfc_code * c)3494627f7eb2Smrg gfc_resolve_sleep_sub (gfc_code *c)
3495627f7eb2Smrg {
3496627f7eb2Smrg const char *name;
3497627f7eb2Smrg int kind;
3498627f7eb2Smrg
3499627f7eb2Smrg if (c->ext.actual->expr != NULL)
3500627f7eb2Smrg kind = c->ext.actual->expr->ts.kind;
3501627f7eb2Smrg else
3502627f7eb2Smrg kind = gfc_default_integer_kind;
3503627f7eb2Smrg
3504627f7eb2Smrg name = gfc_get_string (PREFIX ("sleep_i%d_sub"), kind);
3505627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3506627f7eb2Smrg }
3507627f7eb2Smrg
3508627f7eb2Smrg
3509627f7eb2Smrg /* G77 compatibility function srand(). */
3510627f7eb2Smrg
3511627f7eb2Smrg void
gfc_resolve_srand(gfc_code * c)3512627f7eb2Smrg gfc_resolve_srand (gfc_code *c)
3513627f7eb2Smrg {
3514627f7eb2Smrg const char *name;
3515627f7eb2Smrg name = gfc_get_string (PREFIX ("srand"));
3516627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3517627f7eb2Smrg }
3518627f7eb2Smrg
3519627f7eb2Smrg
3520627f7eb2Smrg /* Resolve the getarg intrinsic subroutine. */
3521627f7eb2Smrg
3522627f7eb2Smrg void
gfc_resolve_getarg(gfc_code * c)3523627f7eb2Smrg gfc_resolve_getarg (gfc_code *c)
3524627f7eb2Smrg {
3525627f7eb2Smrg const char *name;
3526627f7eb2Smrg
3527627f7eb2Smrg if (c->ext.actual->expr->ts.kind != gfc_default_integer_kind)
3528627f7eb2Smrg {
3529627f7eb2Smrg gfc_typespec ts;
3530627f7eb2Smrg gfc_clear_ts (&ts);
3531627f7eb2Smrg
3532627f7eb2Smrg ts.type = BT_INTEGER;
3533627f7eb2Smrg ts.kind = gfc_default_integer_kind;
3534627f7eb2Smrg
3535627f7eb2Smrg gfc_convert_type (c->ext.actual->expr, &ts, 2);
3536627f7eb2Smrg }
3537627f7eb2Smrg
3538627f7eb2Smrg name = gfc_get_string (PREFIX ("getarg_i%d"), gfc_default_integer_kind);
3539627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3540627f7eb2Smrg }
3541627f7eb2Smrg
3542627f7eb2Smrg
3543627f7eb2Smrg /* Resolve the getcwd intrinsic subroutine. */
3544627f7eb2Smrg
3545627f7eb2Smrg void
gfc_resolve_getcwd_sub(gfc_code * c)3546627f7eb2Smrg gfc_resolve_getcwd_sub (gfc_code *c)
3547627f7eb2Smrg {
3548627f7eb2Smrg const char *name;
3549627f7eb2Smrg int kind;
3550627f7eb2Smrg
3551627f7eb2Smrg if (c->ext.actual->next->expr != NULL)
3552627f7eb2Smrg kind = c->ext.actual->next->expr->ts.kind;
3553627f7eb2Smrg else
3554627f7eb2Smrg kind = gfc_default_integer_kind;
3555627f7eb2Smrg
3556627f7eb2Smrg name = gfc_get_string (PREFIX ("getcwd_i%d_sub"), kind);
3557627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3558627f7eb2Smrg }
3559627f7eb2Smrg
3560627f7eb2Smrg
3561627f7eb2Smrg /* Resolve the get_command intrinsic subroutine. */
3562627f7eb2Smrg
3563627f7eb2Smrg void
gfc_resolve_get_command(gfc_code * c)3564627f7eb2Smrg gfc_resolve_get_command (gfc_code *c)
3565627f7eb2Smrg {
3566627f7eb2Smrg const char *name;
3567627f7eb2Smrg int kind;
3568627f7eb2Smrg kind = gfc_default_integer_kind;
3569627f7eb2Smrg name = gfc_get_string (PREFIX ("get_command_i%d"), kind);
3570627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3571627f7eb2Smrg }
3572627f7eb2Smrg
3573627f7eb2Smrg
3574627f7eb2Smrg /* Resolve the get_command_argument intrinsic subroutine. */
3575627f7eb2Smrg
3576627f7eb2Smrg void
gfc_resolve_get_command_argument(gfc_code * c)3577627f7eb2Smrg gfc_resolve_get_command_argument (gfc_code *c)
3578627f7eb2Smrg {
3579627f7eb2Smrg const char *name;
3580627f7eb2Smrg int kind;
3581627f7eb2Smrg kind = gfc_default_integer_kind;
3582627f7eb2Smrg name = gfc_get_string (PREFIX ("get_command_argument_i%d"), kind);
3583627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3584627f7eb2Smrg }
3585627f7eb2Smrg
3586627f7eb2Smrg
3587627f7eb2Smrg /* Resolve the get_environment_variable intrinsic subroutine. */
3588627f7eb2Smrg
3589627f7eb2Smrg void
gfc_resolve_get_environment_variable(gfc_code * code)3590627f7eb2Smrg gfc_resolve_get_environment_variable (gfc_code *code)
3591627f7eb2Smrg {
3592627f7eb2Smrg const char *name;
3593627f7eb2Smrg int kind;
3594627f7eb2Smrg kind = gfc_default_integer_kind;
3595627f7eb2Smrg name = gfc_get_string (PREFIX ("get_environment_variable_i%d"), kind);
3596627f7eb2Smrg code->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3597627f7eb2Smrg }
3598627f7eb2Smrg
3599627f7eb2Smrg
3600627f7eb2Smrg void
gfc_resolve_signal_sub(gfc_code * c)3601627f7eb2Smrg gfc_resolve_signal_sub (gfc_code *c)
3602627f7eb2Smrg {
3603627f7eb2Smrg const char *name;
3604627f7eb2Smrg gfc_expr *number, *handler, *status;
3605627f7eb2Smrg gfc_typespec ts;
3606627f7eb2Smrg gfc_clear_ts (&ts);
3607627f7eb2Smrg
3608627f7eb2Smrg number = c->ext.actual->expr;
3609627f7eb2Smrg handler = c->ext.actual->next->expr;
3610627f7eb2Smrg status = c->ext.actual->next->next->expr;
3611627f7eb2Smrg ts.type = BT_INTEGER;
3612627f7eb2Smrg ts.kind = gfc_c_int_kind;
3613627f7eb2Smrg
3614627f7eb2Smrg /* handler can be either BT_INTEGER or BT_PROCEDURE */
3615627f7eb2Smrg if (handler->ts.type == BT_INTEGER)
3616627f7eb2Smrg {
3617627f7eb2Smrg if (handler->ts.kind != gfc_c_int_kind)
3618627f7eb2Smrg gfc_convert_type (handler, &ts, 2);
3619627f7eb2Smrg name = gfc_get_string (PREFIX ("signal_sub_int"));
3620627f7eb2Smrg }
3621627f7eb2Smrg else
3622627f7eb2Smrg name = gfc_get_string (PREFIX ("signal_sub"));
3623627f7eb2Smrg
3624627f7eb2Smrg if (number->ts.kind != gfc_c_int_kind)
3625627f7eb2Smrg gfc_convert_type (number, &ts, 2);
3626627f7eb2Smrg if (status != NULL && status->ts.kind != gfc_c_int_kind)
3627627f7eb2Smrg gfc_convert_type (status, &ts, 2);
3628627f7eb2Smrg
3629627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3630627f7eb2Smrg }
3631627f7eb2Smrg
3632627f7eb2Smrg
3633627f7eb2Smrg /* Resolve the SYSTEM intrinsic subroutine. */
3634627f7eb2Smrg
3635627f7eb2Smrg void
gfc_resolve_system_sub(gfc_code * c)3636627f7eb2Smrg gfc_resolve_system_sub (gfc_code *c)
3637627f7eb2Smrg {
3638627f7eb2Smrg const char *name;
3639627f7eb2Smrg name = gfc_get_string (PREFIX ("system_sub"));
3640627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3641627f7eb2Smrg }
3642627f7eb2Smrg
3643627f7eb2Smrg
3644627f7eb2Smrg /* Determine if the arguments to SYSTEM_CLOCK are INTEGER(4) or INTEGER(8) */
3645627f7eb2Smrg
3646627f7eb2Smrg void
gfc_resolve_system_clock(gfc_code * c)3647627f7eb2Smrg gfc_resolve_system_clock (gfc_code *c)
3648627f7eb2Smrg {
3649627f7eb2Smrg const char *name;
3650627f7eb2Smrg int kind;
3651627f7eb2Smrg gfc_expr *count = c->ext.actual->expr;
3652627f7eb2Smrg gfc_expr *count_max = c->ext.actual->next->next->expr;
3653627f7eb2Smrg
3654627f7eb2Smrg /* The INTEGER(8) version has higher precision, it is used if both COUNT
3655627f7eb2Smrg and COUNT_MAX can hold 64-bit values, or are absent. */
3656627f7eb2Smrg if ((!count || count->ts.kind >= 8)
3657627f7eb2Smrg && (!count_max || count_max->ts.kind >= 8))
3658627f7eb2Smrg kind = 8;
3659627f7eb2Smrg else
3660627f7eb2Smrg kind = gfc_default_integer_kind;
3661627f7eb2Smrg
3662627f7eb2Smrg name = gfc_get_string (PREFIX ("system_clock_%d"), kind);
3663627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3664627f7eb2Smrg }
3665627f7eb2Smrg
3666627f7eb2Smrg
3667627f7eb2Smrg /* Resolve the EXECUTE_COMMAND_LINE intrinsic subroutine. */
3668627f7eb2Smrg void
gfc_resolve_execute_command_line(gfc_code * c)3669627f7eb2Smrg gfc_resolve_execute_command_line (gfc_code *c)
3670627f7eb2Smrg {
3671627f7eb2Smrg const char *name;
3672627f7eb2Smrg name = gfc_get_string (PREFIX ("execute_command_line_i%d"),
3673627f7eb2Smrg gfc_default_integer_kind);
3674627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3675627f7eb2Smrg }
3676627f7eb2Smrg
3677627f7eb2Smrg
3678627f7eb2Smrg /* Resolve the EXIT intrinsic subroutine. */
3679627f7eb2Smrg
3680627f7eb2Smrg void
gfc_resolve_exit(gfc_code * c)3681627f7eb2Smrg gfc_resolve_exit (gfc_code *c)
3682627f7eb2Smrg {
3683627f7eb2Smrg const char *name;
3684627f7eb2Smrg gfc_typespec ts;
3685627f7eb2Smrg gfc_expr *n;
3686627f7eb2Smrg gfc_clear_ts (&ts);
3687627f7eb2Smrg
3688627f7eb2Smrg /* The STATUS argument has to be of default kind. If it is not,
3689627f7eb2Smrg we convert it. */
3690627f7eb2Smrg ts.type = BT_INTEGER;
3691627f7eb2Smrg ts.kind = gfc_default_integer_kind;
3692627f7eb2Smrg n = c->ext.actual->expr;
3693627f7eb2Smrg if (n != NULL && n->ts.kind != ts.kind)
3694627f7eb2Smrg gfc_convert_type (n, &ts, 2);
3695627f7eb2Smrg
3696627f7eb2Smrg name = gfc_get_string (PREFIX ("exit_i%d"), ts.kind);
3697627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3698627f7eb2Smrg }
3699627f7eb2Smrg
3700627f7eb2Smrg
3701627f7eb2Smrg /* Resolve the FLUSH intrinsic subroutine. */
3702627f7eb2Smrg
3703627f7eb2Smrg void
gfc_resolve_flush(gfc_code * c)3704627f7eb2Smrg gfc_resolve_flush (gfc_code *c)
3705627f7eb2Smrg {
3706627f7eb2Smrg const char *name;
3707627f7eb2Smrg gfc_typespec ts;
3708627f7eb2Smrg gfc_expr *n;
3709627f7eb2Smrg gfc_clear_ts (&ts);
3710627f7eb2Smrg
3711627f7eb2Smrg ts.type = BT_INTEGER;
3712627f7eb2Smrg ts.kind = gfc_default_integer_kind;
3713627f7eb2Smrg n = c->ext.actual->expr;
3714627f7eb2Smrg if (n != NULL && n->ts.kind != ts.kind)
3715627f7eb2Smrg gfc_convert_type (n, &ts, 2);
3716627f7eb2Smrg
3717627f7eb2Smrg name = gfc_get_string (PREFIX ("flush_i%d"), ts.kind);
3718627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3719627f7eb2Smrg }
3720627f7eb2Smrg
3721627f7eb2Smrg
3722627f7eb2Smrg void
gfc_resolve_ctime_sub(gfc_code * c)3723627f7eb2Smrg gfc_resolve_ctime_sub (gfc_code *c)
3724627f7eb2Smrg {
3725627f7eb2Smrg gfc_typespec ts;
3726627f7eb2Smrg gfc_clear_ts (&ts);
3727627f7eb2Smrg
3728627f7eb2Smrg /* ctime TIME argument is a INTEGER(KIND=8), says the doc */
3729627f7eb2Smrg if (c->ext.actual->expr->ts.kind != 8)
3730627f7eb2Smrg {
3731627f7eb2Smrg ts.type = BT_INTEGER;
3732627f7eb2Smrg ts.kind = 8;
3733627f7eb2Smrg ts.u.derived = NULL;
3734627f7eb2Smrg ts.u.cl = NULL;
3735627f7eb2Smrg gfc_convert_type (c->ext.actual->expr, &ts, 2);
3736627f7eb2Smrg }
3737627f7eb2Smrg
3738627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("ctime_sub"));
3739627f7eb2Smrg }
3740627f7eb2Smrg
3741627f7eb2Smrg
3742627f7eb2Smrg void
gfc_resolve_fdate_sub(gfc_code * c)3743627f7eb2Smrg gfc_resolve_fdate_sub (gfc_code *c)
3744627f7eb2Smrg {
3745627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("fdate_sub"));
3746627f7eb2Smrg }
3747627f7eb2Smrg
3748627f7eb2Smrg
3749627f7eb2Smrg void
gfc_resolve_gerror(gfc_code * c)3750627f7eb2Smrg gfc_resolve_gerror (gfc_code *c)
3751627f7eb2Smrg {
3752627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("gerror"));
3753627f7eb2Smrg }
3754627f7eb2Smrg
3755627f7eb2Smrg
3756627f7eb2Smrg void
gfc_resolve_getlog(gfc_code * c)3757627f7eb2Smrg gfc_resolve_getlog (gfc_code *c)
3758627f7eb2Smrg {
3759627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("getlog"));
3760627f7eb2Smrg }
3761627f7eb2Smrg
3762627f7eb2Smrg
3763627f7eb2Smrg void
gfc_resolve_hostnm_sub(gfc_code * c)3764627f7eb2Smrg gfc_resolve_hostnm_sub (gfc_code *c)
3765627f7eb2Smrg {
3766627f7eb2Smrg const char *name;
3767627f7eb2Smrg int kind;
3768627f7eb2Smrg
3769627f7eb2Smrg if (c->ext.actual->next->expr != NULL)
3770627f7eb2Smrg kind = c->ext.actual->next->expr->ts.kind;
3771627f7eb2Smrg else
3772627f7eb2Smrg kind = gfc_default_integer_kind;
3773627f7eb2Smrg
3774627f7eb2Smrg name = gfc_get_string (PREFIX ("hostnm_i%d_sub"), kind);
3775627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3776627f7eb2Smrg }
3777627f7eb2Smrg
3778627f7eb2Smrg
3779627f7eb2Smrg void
gfc_resolve_perror(gfc_code * c)3780627f7eb2Smrg gfc_resolve_perror (gfc_code *c)
3781627f7eb2Smrg {
3782627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("perror_sub"));
3783627f7eb2Smrg }
3784627f7eb2Smrg
3785627f7eb2Smrg /* Resolve the STAT and FSTAT intrinsic subroutines. */
3786627f7eb2Smrg
3787627f7eb2Smrg void
gfc_resolve_stat_sub(gfc_code * c)3788627f7eb2Smrg gfc_resolve_stat_sub (gfc_code *c)
3789627f7eb2Smrg {
3790627f7eb2Smrg const char *name;
3791627f7eb2Smrg name = gfc_get_string (PREFIX ("stat_i%d_sub"), gfc_default_integer_kind);
3792627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3793627f7eb2Smrg }
3794627f7eb2Smrg
3795627f7eb2Smrg
3796627f7eb2Smrg void
gfc_resolve_lstat_sub(gfc_code * c)3797627f7eb2Smrg gfc_resolve_lstat_sub (gfc_code *c)
3798627f7eb2Smrg {
3799627f7eb2Smrg const char *name;
3800627f7eb2Smrg name = gfc_get_string (PREFIX ("lstat_i%d_sub"), gfc_default_integer_kind);
3801627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3802627f7eb2Smrg }
3803627f7eb2Smrg
3804627f7eb2Smrg
3805627f7eb2Smrg void
gfc_resolve_fstat_sub(gfc_code * c)3806627f7eb2Smrg gfc_resolve_fstat_sub (gfc_code *c)
3807627f7eb2Smrg {
3808627f7eb2Smrg const char *name;
3809627f7eb2Smrg gfc_expr *u;
3810627f7eb2Smrg gfc_typespec *ts;
3811627f7eb2Smrg
3812627f7eb2Smrg u = c->ext.actual->expr;
3813627f7eb2Smrg ts = &c->ext.actual->next->expr->ts;
3814627f7eb2Smrg if (u->ts.kind != ts->kind)
3815627f7eb2Smrg gfc_convert_type (u, ts, 2);
3816627f7eb2Smrg name = gfc_get_string (PREFIX ("fstat_i%d_sub"), ts->kind);
3817627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3818627f7eb2Smrg }
3819627f7eb2Smrg
3820627f7eb2Smrg
3821627f7eb2Smrg void
gfc_resolve_fgetc_sub(gfc_code * c)3822627f7eb2Smrg gfc_resolve_fgetc_sub (gfc_code *c)
3823627f7eb2Smrg {
3824627f7eb2Smrg const char *name;
3825627f7eb2Smrg gfc_typespec ts;
3826627f7eb2Smrg gfc_expr *u, *st;
3827627f7eb2Smrg gfc_clear_ts (&ts);
3828627f7eb2Smrg
3829627f7eb2Smrg u = c->ext.actual->expr;
3830627f7eb2Smrg st = c->ext.actual->next->next->expr;
3831627f7eb2Smrg
3832627f7eb2Smrg if (u->ts.kind != gfc_c_int_kind)
3833627f7eb2Smrg {
3834627f7eb2Smrg ts.type = BT_INTEGER;
3835627f7eb2Smrg ts.kind = gfc_c_int_kind;
3836627f7eb2Smrg ts.u.derived = NULL;
3837627f7eb2Smrg ts.u.cl = NULL;
3838627f7eb2Smrg gfc_convert_type (u, &ts, 2);
3839627f7eb2Smrg }
3840627f7eb2Smrg
3841627f7eb2Smrg if (st != NULL)
3842627f7eb2Smrg name = gfc_get_string (PREFIX ("fgetc_i%d_sub"), st->ts.kind);
3843627f7eb2Smrg else
3844627f7eb2Smrg name = gfc_get_string (PREFIX ("fgetc_i%d_sub"), gfc_default_integer_kind);
3845627f7eb2Smrg
3846627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3847627f7eb2Smrg }
3848627f7eb2Smrg
3849627f7eb2Smrg
3850627f7eb2Smrg void
gfc_resolve_fget_sub(gfc_code * c)3851627f7eb2Smrg gfc_resolve_fget_sub (gfc_code *c)
3852627f7eb2Smrg {
3853627f7eb2Smrg const char *name;
3854627f7eb2Smrg gfc_expr *st;
3855627f7eb2Smrg
3856627f7eb2Smrg st = c->ext.actual->next->expr;
3857627f7eb2Smrg if (st != NULL)
3858627f7eb2Smrg name = gfc_get_string (PREFIX ("fget_i%d_sub"), st->ts.kind);
3859627f7eb2Smrg else
3860627f7eb2Smrg name = gfc_get_string (PREFIX ("fget_i%d_sub"), gfc_default_integer_kind);
3861627f7eb2Smrg
3862627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3863627f7eb2Smrg }
3864627f7eb2Smrg
3865627f7eb2Smrg
3866627f7eb2Smrg void
gfc_resolve_fputc_sub(gfc_code * c)3867627f7eb2Smrg gfc_resolve_fputc_sub (gfc_code *c)
3868627f7eb2Smrg {
3869627f7eb2Smrg const char *name;
3870627f7eb2Smrg gfc_typespec ts;
3871627f7eb2Smrg gfc_expr *u, *st;
3872627f7eb2Smrg gfc_clear_ts (&ts);
3873627f7eb2Smrg
3874627f7eb2Smrg u = c->ext.actual->expr;
3875627f7eb2Smrg st = c->ext.actual->next->next->expr;
3876627f7eb2Smrg
3877627f7eb2Smrg if (u->ts.kind != gfc_c_int_kind)
3878627f7eb2Smrg {
3879627f7eb2Smrg ts.type = BT_INTEGER;
3880627f7eb2Smrg ts.kind = gfc_c_int_kind;
3881627f7eb2Smrg ts.u.derived = NULL;
3882627f7eb2Smrg ts.u.cl = NULL;
3883627f7eb2Smrg gfc_convert_type (u, &ts, 2);
3884627f7eb2Smrg }
3885627f7eb2Smrg
3886627f7eb2Smrg if (st != NULL)
3887627f7eb2Smrg name = gfc_get_string (PREFIX ("fputc_i%d_sub"), st->ts.kind);
3888627f7eb2Smrg else
3889627f7eb2Smrg name = gfc_get_string (PREFIX ("fputc_i%d_sub"), gfc_default_integer_kind);
3890627f7eb2Smrg
3891627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3892627f7eb2Smrg }
3893627f7eb2Smrg
3894627f7eb2Smrg
3895627f7eb2Smrg void
gfc_resolve_fput_sub(gfc_code * c)3896627f7eb2Smrg gfc_resolve_fput_sub (gfc_code *c)
3897627f7eb2Smrg {
3898627f7eb2Smrg const char *name;
3899627f7eb2Smrg gfc_expr *st;
3900627f7eb2Smrg
3901627f7eb2Smrg st = c->ext.actual->next->expr;
3902627f7eb2Smrg if (st != NULL)
3903627f7eb2Smrg name = gfc_get_string (PREFIX ("fput_i%d_sub"), st->ts.kind);
3904627f7eb2Smrg else
3905627f7eb2Smrg name = gfc_get_string (PREFIX ("fput_i%d_sub"), gfc_default_integer_kind);
3906627f7eb2Smrg
3907627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3908627f7eb2Smrg }
3909627f7eb2Smrg
3910627f7eb2Smrg
3911627f7eb2Smrg void
gfc_resolve_fseek_sub(gfc_code * c)3912627f7eb2Smrg gfc_resolve_fseek_sub (gfc_code *c)
3913627f7eb2Smrg {
3914627f7eb2Smrg gfc_expr *unit;
3915627f7eb2Smrg gfc_expr *offset;
3916627f7eb2Smrg gfc_expr *whence;
3917627f7eb2Smrg gfc_typespec ts;
3918627f7eb2Smrg gfc_clear_ts (&ts);
3919627f7eb2Smrg
3920627f7eb2Smrg unit = c->ext.actual->expr;
3921627f7eb2Smrg offset = c->ext.actual->next->expr;
3922627f7eb2Smrg whence = c->ext.actual->next->next->expr;
3923627f7eb2Smrg
3924627f7eb2Smrg if (unit->ts.kind != gfc_c_int_kind)
3925627f7eb2Smrg {
3926627f7eb2Smrg ts.type = BT_INTEGER;
3927627f7eb2Smrg ts.kind = gfc_c_int_kind;
3928627f7eb2Smrg ts.u.derived = NULL;
3929627f7eb2Smrg ts.u.cl = NULL;
3930627f7eb2Smrg gfc_convert_type (unit, &ts, 2);
3931627f7eb2Smrg }
3932627f7eb2Smrg
3933627f7eb2Smrg if (offset->ts.kind != gfc_intio_kind)
3934627f7eb2Smrg {
3935627f7eb2Smrg ts.type = BT_INTEGER;
3936627f7eb2Smrg ts.kind = gfc_intio_kind;
3937627f7eb2Smrg ts.u.derived = NULL;
3938627f7eb2Smrg ts.u.cl = NULL;
3939627f7eb2Smrg gfc_convert_type (offset, &ts, 2);
3940627f7eb2Smrg }
3941627f7eb2Smrg
3942627f7eb2Smrg if (whence->ts.kind != gfc_c_int_kind)
3943627f7eb2Smrg {
3944627f7eb2Smrg ts.type = BT_INTEGER;
3945627f7eb2Smrg ts.kind = gfc_c_int_kind;
3946627f7eb2Smrg ts.u.derived = NULL;
3947627f7eb2Smrg ts.u.cl = NULL;
3948627f7eb2Smrg gfc_convert_type (whence, &ts, 2);
3949627f7eb2Smrg }
3950627f7eb2Smrg
3951627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("fseek_sub"));
3952627f7eb2Smrg }
3953627f7eb2Smrg
3954627f7eb2Smrg void
gfc_resolve_ftell_sub(gfc_code * c)3955627f7eb2Smrg gfc_resolve_ftell_sub (gfc_code *c)
3956627f7eb2Smrg {
3957627f7eb2Smrg const char *name;
3958627f7eb2Smrg gfc_expr *unit;
3959627f7eb2Smrg gfc_expr *offset;
3960627f7eb2Smrg gfc_typespec ts;
3961627f7eb2Smrg gfc_clear_ts (&ts);
3962627f7eb2Smrg
3963627f7eb2Smrg unit = c->ext.actual->expr;
3964627f7eb2Smrg offset = c->ext.actual->next->expr;
3965627f7eb2Smrg
3966627f7eb2Smrg if (unit->ts.kind != gfc_c_int_kind)
3967627f7eb2Smrg {
3968627f7eb2Smrg ts.type = BT_INTEGER;
3969627f7eb2Smrg ts.kind = gfc_c_int_kind;
3970627f7eb2Smrg ts.u.derived = NULL;
3971627f7eb2Smrg ts.u.cl = NULL;
3972627f7eb2Smrg gfc_convert_type (unit, &ts, 2);
3973627f7eb2Smrg }
3974627f7eb2Smrg
3975627f7eb2Smrg name = gfc_get_string (PREFIX ("ftell_i%d_sub"), offset->ts.kind);
3976627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3977627f7eb2Smrg }
3978627f7eb2Smrg
3979627f7eb2Smrg
3980627f7eb2Smrg void
gfc_resolve_ttynam_sub(gfc_code * c)3981627f7eb2Smrg gfc_resolve_ttynam_sub (gfc_code *c)
3982627f7eb2Smrg {
3983627f7eb2Smrg gfc_typespec ts;
3984627f7eb2Smrg gfc_clear_ts (&ts);
3985627f7eb2Smrg
3986627f7eb2Smrg if (c->ext.actual->expr->ts.kind != gfc_c_int_kind)
3987627f7eb2Smrg {
3988627f7eb2Smrg ts.type = BT_INTEGER;
3989627f7eb2Smrg ts.kind = gfc_c_int_kind;
3990627f7eb2Smrg ts.u.derived = NULL;
3991627f7eb2Smrg ts.u.cl = NULL;
3992627f7eb2Smrg gfc_convert_type (c->ext.actual->expr, &ts, 2);
3993627f7eb2Smrg }
3994627f7eb2Smrg
3995627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("ttynam_sub"));
3996627f7eb2Smrg }
3997627f7eb2Smrg
3998627f7eb2Smrg
3999627f7eb2Smrg /* Resolve the UMASK intrinsic subroutine. */
4000627f7eb2Smrg
4001627f7eb2Smrg void
gfc_resolve_umask_sub(gfc_code * c)4002627f7eb2Smrg gfc_resolve_umask_sub (gfc_code *c)
4003627f7eb2Smrg {
4004627f7eb2Smrg const char *name;
4005627f7eb2Smrg int kind;
4006627f7eb2Smrg
4007627f7eb2Smrg if (c->ext.actual->next->expr != NULL)
4008627f7eb2Smrg kind = c->ext.actual->next->expr->ts.kind;
4009627f7eb2Smrg else
4010627f7eb2Smrg kind = gfc_default_integer_kind;
4011627f7eb2Smrg
4012627f7eb2Smrg name = gfc_get_string (PREFIX ("umask_i%d_sub"), kind);
4013627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
4014627f7eb2Smrg }
4015627f7eb2Smrg
4016627f7eb2Smrg /* Resolve the UNLINK intrinsic subroutine. */
4017627f7eb2Smrg
4018627f7eb2Smrg void
gfc_resolve_unlink_sub(gfc_code * c)4019627f7eb2Smrg gfc_resolve_unlink_sub (gfc_code *c)
4020627f7eb2Smrg {
4021627f7eb2Smrg const char *name;
4022627f7eb2Smrg int kind;
4023627f7eb2Smrg
4024627f7eb2Smrg if (c->ext.actual->next->expr != NULL)
4025627f7eb2Smrg kind = c->ext.actual->next->expr->ts.kind;
4026627f7eb2Smrg else
4027627f7eb2Smrg kind = gfc_default_integer_kind;
4028627f7eb2Smrg
4029627f7eb2Smrg name = gfc_get_string (PREFIX ("unlink_i%d_sub"), kind);
4030627f7eb2Smrg c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
4031627f7eb2Smrg }
4032