xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/fortran/iresolve.c (revision 4ac76180e904e771b9d522c7e57296d371f06499)
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