annotate gcc/fortran/iresolve.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Intrinsic function resolution.
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 Copyright (C) 2000-2018 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3 Contributed by Andy Vaught & Katherine Holcomb
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 This file is part of GCC.
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 GCC is free software; you can redistribute it and/or modify it under
kono
parents:
diff changeset
8 the terms of the GNU General Public License as published by the Free
kono
parents:
diff changeset
9 Software Foundation; either version 3, or (at your option) any later
kono
parents:
diff changeset
10 version.
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
kono
parents:
diff changeset
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
kono
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
kono
parents:
diff changeset
15 for more details.
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
18 along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
19 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21
kono
parents:
diff changeset
22 /* Assign name and types to intrinsic procedures. For functions, the
kono
parents:
diff changeset
23 first argument to a resolution function is an expression pointer to
kono
parents:
diff changeset
24 the original function node and the rest are pointers to the
kono
parents:
diff changeset
25 arguments of the function call. For subroutines, a pointer to the
kono
parents:
diff changeset
26 code node is passed. The result type and library subroutine name
kono
parents:
diff changeset
27 are generally set according to the function arguments. */
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 #include "config.h"
kono
parents:
diff changeset
30 #include "system.h"
kono
parents:
diff changeset
31 #include "coretypes.h"
kono
parents:
diff changeset
32 #include "tree.h"
kono
parents:
diff changeset
33 #include "gfortran.h"
kono
parents:
diff changeset
34 #include "stringpool.h"
kono
parents:
diff changeset
35 #include "intrinsic.h"
kono
parents:
diff changeset
36 #include "constructor.h"
kono
parents:
diff changeset
37 #include "arith.h"
kono
parents:
diff changeset
38
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
39 /* Given printf-like arguments, return a stable version of the result string.
111
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 We already have a working, optimized string hashing table in the form of
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
42 the identifier table. Reusing this table is likely not to be wasted,
111
kono
parents:
diff changeset
43 since if the function name makes it to the gimple output of the frontend,
kono
parents:
diff changeset
44 we'll have to create the identifier anyway. */
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 const char *
kono
parents:
diff changeset
47 gfc_get_string (const char *format, ...)
kono
parents:
diff changeset
48 {
kono
parents:
diff changeset
49 char temp_name[128];
kono
parents:
diff changeset
50 const char *str;
kono
parents:
diff changeset
51 va_list ap;
kono
parents:
diff changeset
52 tree ident;
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 /* Handle common case without vsnprintf and temporary buffer. */
kono
parents:
diff changeset
55 if (format[0] == '%' && format[1] == 's' && format[2] == '\0')
kono
parents:
diff changeset
56 {
kono
parents:
diff changeset
57 va_start (ap, format);
kono
parents:
diff changeset
58 str = va_arg (ap, const char *);
kono
parents:
diff changeset
59 va_end (ap);
kono
parents:
diff changeset
60 }
kono
parents:
diff changeset
61 else
kono
parents:
diff changeset
62 {
kono
parents:
diff changeset
63 va_start (ap, format);
kono
parents:
diff changeset
64 vsnprintf (temp_name, sizeof (temp_name), format, ap);
kono
parents:
diff changeset
65 va_end (ap);
kono
parents:
diff changeset
66 temp_name[sizeof (temp_name) - 1] = 0;
kono
parents:
diff changeset
67 str = temp_name;
kono
parents:
diff changeset
68 }
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 ident = get_identifier (str);
kono
parents:
diff changeset
71 return IDENTIFIER_POINTER (ident);
kono
parents:
diff changeset
72 }
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 /* MERGE and SPREAD need to have source charlen's present for passing
kono
parents:
diff changeset
75 to the result expression. */
kono
parents:
diff changeset
76 static void
kono
parents:
diff changeset
77 check_charlen_present (gfc_expr *source)
kono
parents:
diff changeset
78 {
kono
parents:
diff changeset
79 if (source->ts.u.cl == NULL)
kono
parents:
diff changeset
80 source->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 if (source->expr_type == EXPR_CONSTANT)
kono
parents:
diff changeset
83 {
kono
parents:
diff changeset
84 source->ts.u.cl->length
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
85 = gfc_get_int_expr (gfc_charlen_int_kind, NULL,
111
kono
parents:
diff changeset
86 source->value.character.length);
kono
parents:
diff changeset
87 source->rank = 0;
kono
parents:
diff changeset
88 }
kono
parents:
diff changeset
89 else if (source->expr_type == EXPR_ARRAY)
kono
parents:
diff changeset
90 {
kono
parents:
diff changeset
91 gfc_constructor *c = gfc_constructor_first (source->value.constructor);
kono
parents:
diff changeset
92 source->ts.u.cl->length
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
93 = gfc_get_int_expr (gfc_charlen_int_kind, NULL,
111
kono
parents:
diff changeset
94 c->expr->value.character.length);
kono
parents:
diff changeset
95 }
kono
parents:
diff changeset
96 }
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 /* Helper function for resolving the "mask" argument. */
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 static void
kono
parents:
diff changeset
101 resolve_mask_arg (gfc_expr *mask)
kono
parents:
diff changeset
102 {
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 gfc_typespec ts;
kono
parents:
diff changeset
105 gfc_clear_ts (&ts);
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 if (mask->rank == 0)
kono
parents:
diff changeset
108 {
kono
parents:
diff changeset
109 /* For the scalar case, coerce the mask to kind=4 unconditionally
kono
parents:
diff changeset
110 (because this is the only kind we have a library function
kono
parents:
diff changeset
111 for). */
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 if (mask->ts.kind != 4)
kono
parents:
diff changeset
114 {
kono
parents:
diff changeset
115 ts.type = BT_LOGICAL;
kono
parents:
diff changeset
116 ts.kind = 4;
kono
parents:
diff changeset
117 gfc_convert_type (mask, &ts, 2);
kono
parents:
diff changeset
118 }
kono
parents:
diff changeset
119 }
kono
parents:
diff changeset
120 else
kono
parents:
diff changeset
121 {
kono
parents:
diff changeset
122 /* In the library, we access the mask with a GFC_LOGICAL_1
kono
parents:
diff changeset
123 argument. No need to waste memory if we are about to create
kono
parents:
diff changeset
124 a temporary array. */
kono
parents:
diff changeset
125 if (mask->expr_type == EXPR_OP && mask->ts.kind != 1)
kono
parents:
diff changeset
126 {
kono
parents:
diff changeset
127 ts.type = BT_LOGICAL;
kono
parents:
diff changeset
128 ts.kind = 1;
kono
parents:
diff changeset
129 gfc_convert_type_warn (mask, &ts, 2, 0);
kono
parents:
diff changeset
130 }
kono
parents:
diff changeset
131 }
kono
parents:
diff changeset
132 }
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134
kono
parents:
diff changeset
135 static void
kono
parents:
diff changeset
136 resolve_bound (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *kind,
kono
parents:
diff changeset
137 const char *name, bool coarray)
kono
parents:
diff changeset
138 {
kono
parents:
diff changeset
139 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
140 if (kind)
kono
parents:
diff changeset
141 f->ts.kind = mpz_get_si (kind->value.integer);
kono
parents:
diff changeset
142 else
kono
parents:
diff changeset
143 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 if (dim == NULL)
kono
parents:
diff changeset
146 {
kono
parents:
diff changeset
147 f->rank = 1;
kono
parents:
diff changeset
148 if (array->rank != -1)
kono
parents:
diff changeset
149 {
kono
parents:
diff changeset
150 f->shape = gfc_get_shape (1);
kono
parents:
diff changeset
151 mpz_init_set_ui (f->shape[0], coarray ? gfc_get_corank (array)
kono
parents:
diff changeset
152 : array->rank);
kono
parents:
diff changeset
153 }
kono
parents:
diff changeset
154 }
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 f->value.function.name = gfc_get_string ("%s", name);
kono
parents:
diff changeset
157 }
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 static void
kono
parents:
diff changeset
161 resolve_transformational (const char *name, gfc_expr *f, gfc_expr *array,
kono
parents:
diff changeset
162 gfc_expr *dim, gfc_expr *mask)
kono
parents:
diff changeset
163 {
kono
parents:
diff changeset
164 const char *prefix;
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 f->ts = array->ts;
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 if (mask)
kono
parents:
diff changeset
169 {
kono
parents:
diff changeset
170 if (mask->rank == 0)
kono
parents:
diff changeset
171 prefix = "s";
kono
parents:
diff changeset
172 else
kono
parents:
diff changeset
173 prefix = "m";
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 resolve_mask_arg (mask);
kono
parents:
diff changeset
176 }
kono
parents:
diff changeset
177 else
kono
parents:
diff changeset
178 prefix = "";
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 if (dim != NULL)
kono
parents:
diff changeset
181 {
kono
parents:
diff changeset
182 f->rank = array->rank - 1;
kono
parents:
diff changeset
183 f->shape = gfc_copy_shape_excluding (array->shape, array->rank, dim);
kono
parents:
diff changeset
184 gfc_resolve_dim_arg (dim);
kono
parents:
diff changeset
185 }
kono
parents:
diff changeset
186
kono
parents:
diff changeset
187 f->value.function.name
kono
parents:
diff changeset
188 = gfc_get_string (PREFIX ("%s%s_%c%d"), prefix, name,
kono
parents:
diff changeset
189 gfc_type_letter (array->ts.type), array->ts.kind);
kono
parents:
diff changeset
190 }
kono
parents:
diff changeset
191
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 /********************** Resolution functions **********************/
kono
parents:
diff changeset
194
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 void
kono
parents:
diff changeset
197 gfc_resolve_abs (gfc_expr *f, gfc_expr *a)
kono
parents:
diff changeset
198 {
kono
parents:
diff changeset
199 f->ts = a->ts;
kono
parents:
diff changeset
200 if (f->ts.type == BT_COMPLEX)
kono
parents:
diff changeset
201 f->ts.type = BT_REAL;
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 f->value.function.name
kono
parents:
diff changeset
204 = gfc_get_string ("__abs_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
kono
parents:
diff changeset
205 }
kono
parents:
diff changeset
206
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 void
kono
parents:
diff changeset
209 gfc_resolve_access (gfc_expr *f, gfc_expr *name ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
210 gfc_expr *mode ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
211 {
kono
parents:
diff changeset
212 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
213 f->ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
214 f->value.function.name = PREFIX ("access_func");
kono
parents:
diff changeset
215 }
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217
kono
parents:
diff changeset
218 void
kono
parents:
diff changeset
219 gfc_resolve_adjustl (gfc_expr *f, gfc_expr *string)
kono
parents:
diff changeset
220 {
kono
parents:
diff changeset
221 f->ts.type = BT_CHARACTER;
kono
parents:
diff changeset
222 f->ts.kind = string->ts.kind;
kono
parents:
diff changeset
223 if (string->ts.u.cl)
kono
parents:
diff changeset
224 f->ts.u.cl = gfc_new_charlen (gfc_current_ns, string->ts.u.cl);
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 f->value.function.name = gfc_get_string ("__adjustl_s%d", f->ts.kind);
kono
parents:
diff changeset
227 }
kono
parents:
diff changeset
228
kono
parents:
diff changeset
229
kono
parents:
diff changeset
230 void
kono
parents:
diff changeset
231 gfc_resolve_adjustr (gfc_expr *f, gfc_expr *string)
kono
parents:
diff changeset
232 {
kono
parents:
diff changeset
233 f->ts.type = BT_CHARACTER;
kono
parents:
diff changeset
234 f->ts.kind = string->ts.kind;
kono
parents:
diff changeset
235 if (string->ts.u.cl)
kono
parents:
diff changeset
236 f->ts.u.cl = gfc_new_charlen (gfc_current_ns, string->ts.u.cl);
kono
parents:
diff changeset
237
kono
parents:
diff changeset
238 f->value.function.name = gfc_get_string ("__adjustr_s%d", f->ts.kind);
kono
parents:
diff changeset
239 }
kono
parents:
diff changeset
240
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 static void
kono
parents:
diff changeset
243 gfc_resolve_char_achar (gfc_expr *f, gfc_expr *x, gfc_expr *kind,
kono
parents:
diff changeset
244 bool is_achar)
kono
parents:
diff changeset
245 {
kono
parents:
diff changeset
246 f->ts.type = BT_CHARACTER;
kono
parents:
diff changeset
247 f->ts.kind = (kind == NULL)
kono
parents:
diff changeset
248 ? gfc_default_character_kind : mpz_get_si (kind->value.integer);
kono
parents:
diff changeset
249 f->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
250 f->ts.u.cl->length = gfc_get_int_expr (gfc_charlen_int_kind, NULL, 1);
111
kono
parents:
diff changeset
251
kono
parents:
diff changeset
252 f->value.function.name
kono
parents:
diff changeset
253 = gfc_get_string ("__%schar_%d_%c%d", is_achar ? "a" : "", f->ts.kind,
kono
parents:
diff changeset
254 gfc_type_letter (x->ts.type), x->ts.kind);
kono
parents:
diff changeset
255 }
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 void
kono
parents:
diff changeset
259 gfc_resolve_achar (gfc_expr *f, gfc_expr *x, gfc_expr *kind)
kono
parents:
diff changeset
260 {
kono
parents:
diff changeset
261 gfc_resolve_char_achar (f, x, kind, true);
kono
parents:
diff changeset
262 }
kono
parents:
diff changeset
263
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 void
kono
parents:
diff changeset
266 gfc_resolve_acos (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
267 {
kono
parents:
diff changeset
268 f->ts = x->ts;
kono
parents:
diff changeset
269 f->value.function.name
kono
parents:
diff changeset
270 = gfc_get_string ("__acos_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
kono
parents:
diff changeset
271 }
kono
parents:
diff changeset
272
kono
parents:
diff changeset
273
kono
parents:
diff changeset
274 void
kono
parents:
diff changeset
275 gfc_resolve_acosh (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
276 {
kono
parents:
diff changeset
277 f->ts = x->ts;
kono
parents:
diff changeset
278 f->value.function.name
kono
parents:
diff changeset
279 = gfc_get_string ("__acosh_%c%d", gfc_type_letter (x->ts.type),
kono
parents:
diff changeset
280 x->ts.kind);
kono
parents:
diff changeset
281 }
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 void
kono
parents:
diff changeset
285 gfc_resolve_aimag (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
286 {
kono
parents:
diff changeset
287 f->ts.type = BT_REAL;
kono
parents:
diff changeset
288 f->ts.kind = x->ts.kind;
kono
parents:
diff changeset
289 f->value.function.name
kono
parents:
diff changeset
290 = gfc_get_string ("__aimag_%c%d", gfc_type_letter (x->ts.type),
kono
parents:
diff changeset
291 x->ts.kind);
kono
parents:
diff changeset
292 }
kono
parents:
diff changeset
293
kono
parents:
diff changeset
294
kono
parents:
diff changeset
295 void
kono
parents:
diff changeset
296 gfc_resolve_and (gfc_expr *f, gfc_expr *i, gfc_expr *j)
kono
parents:
diff changeset
297 {
kono
parents:
diff changeset
298 f->ts.type = i->ts.type;
kono
parents:
diff changeset
299 f->ts.kind = gfc_kind_max (i, j);
kono
parents:
diff changeset
300
kono
parents:
diff changeset
301 if (i->ts.kind != j->ts.kind)
kono
parents:
diff changeset
302 {
kono
parents:
diff changeset
303 if (i->ts.kind == gfc_kind_max (i, j))
kono
parents:
diff changeset
304 gfc_convert_type (j, &i->ts, 2);
kono
parents:
diff changeset
305 else
kono
parents:
diff changeset
306 gfc_convert_type (i, &j->ts, 2);
kono
parents:
diff changeset
307 }
kono
parents:
diff changeset
308
kono
parents:
diff changeset
309 f->value.function.name
kono
parents:
diff changeset
310 = gfc_get_string ("__and_%c%d", gfc_type_letter (i->ts.type), f->ts.kind);
kono
parents:
diff changeset
311 }
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313
kono
parents:
diff changeset
314 void
kono
parents:
diff changeset
315 gfc_resolve_aint (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
kono
parents:
diff changeset
316 {
kono
parents:
diff changeset
317 gfc_typespec ts;
kono
parents:
diff changeset
318 gfc_clear_ts (&ts);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
319
111
kono
parents:
diff changeset
320 f->ts.type = a->ts.type;
kono
parents:
diff changeset
321 f->ts.kind = (kind == NULL) ? a->ts.kind : mpz_get_si (kind->value.integer);
kono
parents:
diff changeset
322
kono
parents:
diff changeset
323 if (a->ts.kind != f->ts.kind)
kono
parents:
diff changeset
324 {
kono
parents:
diff changeset
325 ts.type = f->ts.type;
kono
parents:
diff changeset
326 ts.kind = f->ts.kind;
kono
parents:
diff changeset
327 gfc_convert_type (a, &ts, 2);
kono
parents:
diff changeset
328 }
kono
parents:
diff changeset
329 /* The resolved name is only used for specific intrinsics where
kono
parents:
diff changeset
330 the return kind is the same as the arg kind. */
kono
parents:
diff changeset
331 f->value.function.name
kono
parents:
diff changeset
332 = gfc_get_string ("__aint_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
kono
parents:
diff changeset
333 }
kono
parents:
diff changeset
334
kono
parents:
diff changeset
335
kono
parents:
diff changeset
336 void
kono
parents:
diff changeset
337 gfc_resolve_dint (gfc_expr *f, gfc_expr *a)
kono
parents:
diff changeset
338 {
kono
parents:
diff changeset
339 gfc_resolve_aint (f, a, NULL);
kono
parents:
diff changeset
340 }
kono
parents:
diff changeset
341
kono
parents:
diff changeset
342
kono
parents:
diff changeset
343 void
kono
parents:
diff changeset
344 gfc_resolve_all (gfc_expr *f, gfc_expr *mask, gfc_expr *dim)
kono
parents:
diff changeset
345 {
kono
parents:
diff changeset
346 f->ts = mask->ts;
kono
parents:
diff changeset
347
kono
parents:
diff changeset
348 if (dim != NULL)
kono
parents:
diff changeset
349 {
kono
parents:
diff changeset
350 gfc_resolve_dim_arg (dim);
kono
parents:
diff changeset
351 f->rank = mask->rank - 1;
kono
parents:
diff changeset
352 f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
kono
parents:
diff changeset
353 }
kono
parents:
diff changeset
354
kono
parents:
diff changeset
355 f->value.function.name
kono
parents:
diff changeset
356 = gfc_get_string (PREFIX ("all_%c%d"), gfc_type_letter (mask->ts.type),
kono
parents:
diff changeset
357 mask->ts.kind);
kono
parents:
diff changeset
358 }
kono
parents:
diff changeset
359
kono
parents:
diff changeset
360
kono
parents:
diff changeset
361 void
kono
parents:
diff changeset
362 gfc_resolve_anint (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
kono
parents:
diff changeset
363 {
kono
parents:
diff changeset
364 gfc_typespec ts;
kono
parents:
diff changeset
365 gfc_clear_ts (&ts);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
366
111
kono
parents:
diff changeset
367 f->ts.type = a->ts.type;
kono
parents:
diff changeset
368 f->ts.kind = (kind == NULL) ? a->ts.kind : mpz_get_si (kind->value.integer);
kono
parents:
diff changeset
369
kono
parents:
diff changeset
370 if (a->ts.kind != f->ts.kind)
kono
parents:
diff changeset
371 {
kono
parents:
diff changeset
372 ts.type = f->ts.type;
kono
parents:
diff changeset
373 ts.kind = f->ts.kind;
kono
parents:
diff changeset
374 gfc_convert_type (a, &ts, 2);
kono
parents:
diff changeset
375 }
kono
parents:
diff changeset
376
kono
parents:
diff changeset
377 /* The resolved name is only used for specific intrinsics where
kono
parents:
diff changeset
378 the return kind is the same as the arg kind. */
kono
parents:
diff changeset
379 f->value.function.name
kono
parents:
diff changeset
380 = gfc_get_string ("__anint_%c%d", gfc_type_letter (a->ts.type),
kono
parents:
diff changeset
381 a->ts.kind);
kono
parents:
diff changeset
382 }
kono
parents:
diff changeset
383
kono
parents:
diff changeset
384
kono
parents:
diff changeset
385 void
kono
parents:
diff changeset
386 gfc_resolve_dnint (gfc_expr *f, gfc_expr *a)
kono
parents:
diff changeset
387 {
kono
parents:
diff changeset
388 gfc_resolve_anint (f, a, NULL);
kono
parents:
diff changeset
389 }
kono
parents:
diff changeset
390
kono
parents:
diff changeset
391
kono
parents:
diff changeset
392 void
kono
parents:
diff changeset
393 gfc_resolve_any (gfc_expr *f, gfc_expr *mask, gfc_expr *dim)
kono
parents:
diff changeset
394 {
kono
parents:
diff changeset
395 f->ts = mask->ts;
kono
parents:
diff changeset
396
kono
parents:
diff changeset
397 if (dim != NULL)
kono
parents:
diff changeset
398 {
kono
parents:
diff changeset
399 gfc_resolve_dim_arg (dim);
kono
parents:
diff changeset
400 f->rank = mask->rank - 1;
kono
parents:
diff changeset
401 f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
kono
parents:
diff changeset
402 }
kono
parents:
diff changeset
403
kono
parents:
diff changeset
404 f->value.function.name
kono
parents:
diff changeset
405 = gfc_get_string (PREFIX ("any_%c%d"), gfc_type_letter (mask->ts.type),
kono
parents:
diff changeset
406 mask->ts.kind);
kono
parents:
diff changeset
407 }
kono
parents:
diff changeset
408
kono
parents:
diff changeset
409
kono
parents:
diff changeset
410 void
kono
parents:
diff changeset
411 gfc_resolve_asin (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
412 {
kono
parents:
diff changeset
413 f->ts = x->ts;
kono
parents:
diff changeset
414 f->value.function.name
kono
parents:
diff changeset
415 = gfc_get_string ("__asin_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
kono
parents:
diff changeset
416 }
kono
parents:
diff changeset
417
kono
parents:
diff changeset
418 void
kono
parents:
diff changeset
419 gfc_resolve_asinh (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
420 {
kono
parents:
diff changeset
421 f->ts = x->ts;
kono
parents:
diff changeset
422 f->value.function.name
kono
parents:
diff changeset
423 = gfc_get_string ("__asinh_%c%d", gfc_type_letter (x->ts.type),
kono
parents:
diff changeset
424 x->ts.kind);
kono
parents:
diff changeset
425 }
kono
parents:
diff changeset
426
kono
parents:
diff changeset
427 void
kono
parents:
diff changeset
428 gfc_resolve_atan (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
429 {
kono
parents:
diff changeset
430 f->ts = x->ts;
kono
parents:
diff changeset
431 f->value.function.name
kono
parents:
diff changeset
432 = gfc_get_string ("__atan_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
kono
parents:
diff changeset
433 }
kono
parents:
diff changeset
434
kono
parents:
diff changeset
435 void
kono
parents:
diff changeset
436 gfc_resolve_atanh (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
437 {
kono
parents:
diff changeset
438 f->ts = x->ts;
kono
parents:
diff changeset
439 f->value.function.name
kono
parents:
diff changeset
440 = gfc_get_string ("__atanh_%c%d", gfc_type_letter (x->ts.type),
kono
parents:
diff changeset
441 x->ts.kind);
kono
parents:
diff changeset
442 }
kono
parents:
diff changeset
443
kono
parents:
diff changeset
444 void
kono
parents:
diff changeset
445 gfc_resolve_atan2 (gfc_expr *f, gfc_expr *x, gfc_expr *y ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
446 {
kono
parents:
diff changeset
447 f->ts = x->ts;
kono
parents:
diff changeset
448 f->value.function.name
kono
parents:
diff changeset
449 = gfc_get_string ("__atan2_%c%d", gfc_type_letter (x->ts.type),
kono
parents:
diff changeset
450 x->ts.kind);
kono
parents:
diff changeset
451 }
kono
parents:
diff changeset
452
kono
parents:
diff changeset
453
kono
parents:
diff changeset
454 /* Resolve the BESYN and BESJN intrinsics. */
kono
parents:
diff changeset
455
kono
parents:
diff changeset
456 void
kono
parents:
diff changeset
457 gfc_resolve_besn (gfc_expr *f, gfc_expr *n, gfc_expr *x)
kono
parents:
diff changeset
458 {
kono
parents:
diff changeset
459 gfc_typespec ts;
kono
parents:
diff changeset
460 gfc_clear_ts (&ts);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
461
111
kono
parents:
diff changeset
462 f->ts = x->ts;
kono
parents:
diff changeset
463 if (n->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
464 {
kono
parents:
diff changeset
465 ts.type = BT_INTEGER;
kono
parents:
diff changeset
466 ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
467 gfc_convert_type (n, &ts, 2);
kono
parents:
diff changeset
468 }
kono
parents:
diff changeset
469 f->value.function.name = gfc_get_string ("<intrinsic>");
kono
parents:
diff changeset
470 }
kono
parents:
diff changeset
471
kono
parents:
diff changeset
472
kono
parents:
diff changeset
473 void
kono
parents:
diff changeset
474 gfc_resolve_bessel_n2 (gfc_expr *f, gfc_expr *n1, gfc_expr *n2, gfc_expr *x)
kono
parents:
diff changeset
475 {
kono
parents:
diff changeset
476 gfc_typespec ts;
kono
parents:
diff changeset
477 gfc_clear_ts (&ts);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
478
111
kono
parents:
diff changeset
479 f->ts = x->ts;
kono
parents:
diff changeset
480 f->rank = 1;
kono
parents:
diff changeset
481 if (n1->expr_type == EXPR_CONSTANT && n2->expr_type == EXPR_CONSTANT)
kono
parents:
diff changeset
482 {
kono
parents:
diff changeset
483 f->shape = gfc_get_shape (1);
kono
parents:
diff changeset
484 mpz_init (f->shape[0]);
kono
parents:
diff changeset
485 mpz_sub (f->shape[0], n2->value.integer, n1->value.integer);
kono
parents:
diff changeset
486 mpz_add_ui (f->shape[0], f->shape[0], 1);
kono
parents:
diff changeset
487 }
kono
parents:
diff changeset
488
kono
parents:
diff changeset
489 if (n1->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
490 {
kono
parents:
diff changeset
491 ts.type = BT_INTEGER;
kono
parents:
diff changeset
492 ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
493 gfc_convert_type (n1, &ts, 2);
kono
parents:
diff changeset
494 }
kono
parents:
diff changeset
495
kono
parents:
diff changeset
496 if (n2->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
497 {
kono
parents:
diff changeset
498 ts.type = BT_INTEGER;
kono
parents:
diff changeset
499 ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
500 gfc_convert_type (n2, &ts, 2);
kono
parents:
diff changeset
501 }
kono
parents:
diff changeset
502
kono
parents:
diff changeset
503 if (f->value.function.isym->id == GFC_ISYM_JN2)
kono
parents:
diff changeset
504 f->value.function.name = gfc_get_string (PREFIX ("bessel_jn_r%d"),
kono
parents:
diff changeset
505 f->ts.kind);
kono
parents:
diff changeset
506 else
kono
parents:
diff changeset
507 f->value.function.name = gfc_get_string (PREFIX ("bessel_yn_r%d"),
kono
parents:
diff changeset
508 f->ts.kind);
kono
parents:
diff changeset
509 }
kono
parents:
diff changeset
510
kono
parents:
diff changeset
511
kono
parents:
diff changeset
512 void
kono
parents:
diff changeset
513 gfc_resolve_btest (gfc_expr *f, gfc_expr *i, gfc_expr *pos)
kono
parents:
diff changeset
514 {
kono
parents:
diff changeset
515 f->ts.type = BT_LOGICAL;
kono
parents:
diff changeset
516 f->ts.kind = gfc_default_logical_kind;
kono
parents:
diff changeset
517 f->value.function.name
kono
parents:
diff changeset
518 = gfc_get_string ("__btest_%d_%d", i->ts.kind, pos->ts.kind);
kono
parents:
diff changeset
519 }
kono
parents:
diff changeset
520
kono
parents:
diff changeset
521
kono
parents:
diff changeset
522 void
kono
parents:
diff changeset
523 gfc_resolve_c_loc (gfc_expr *f, gfc_expr *x ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
524 {
kono
parents:
diff changeset
525 f->ts = f->value.function.isym->ts;
kono
parents:
diff changeset
526 }
kono
parents:
diff changeset
527
kono
parents:
diff changeset
528
kono
parents:
diff changeset
529 void
kono
parents:
diff changeset
530 gfc_resolve_c_funloc (gfc_expr *f, gfc_expr *x ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
531 {
kono
parents:
diff changeset
532 f->ts = f->value.function.isym->ts;
kono
parents:
diff changeset
533 }
kono
parents:
diff changeset
534
kono
parents:
diff changeset
535
kono
parents:
diff changeset
536 void
kono
parents:
diff changeset
537 gfc_resolve_ceiling (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
kono
parents:
diff changeset
538 {
kono
parents:
diff changeset
539 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
540 f->ts.kind = (kind == NULL)
kono
parents:
diff changeset
541 ? gfc_default_integer_kind : mpz_get_si (kind->value.integer);
kono
parents:
diff changeset
542 f->value.function.name
kono
parents:
diff changeset
543 = gfc_get_string ("__ceiling_%d_%c%d", f->ts.kind,
kono
parents:
diff changeset
544 gfc_type_letter (a->ts.type), a->ts.kind);
kono
parents:
diff changeset
545 }
kono
parents:
diff changeset
546
kono
parents:
diff changeset
547
kono
parents:
diff changeset
548 void
kono
parents:
diff changeset
549 gfc_resolve_char (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
kono
parents:
diff changeset
550 {
kono
parents:
diff changeset
551 gfc_resolve_char_achar (f, a, kind, false);
kono
parents:
diff changeset
552 }
kono
parents:
diff changeset
553
kono
parents:
diff changeset
554
kono
parents:
diff changeset
555 void
kono
parents:
diff changeset
556 gfc_resolve_chdir (gfc_expr *f, gfc_expr *d ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
557 {
kono
parents:
diff changeset
558 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
559 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
560 f->value.function.name = gfc_get_string (PREFIX ("chdir_i%d"), f->ts.kind);
kono
parents:
diff changeset
561 }
kono
parents:
diff changeset
562
kono
parents:
diff changeset
563
kono
parents:
diff changeset
564 void
kono
parents:
diff changeset
565 gfc_resolve_chdir_sub (gfc_code *c)
kono
parents:
diff changeset
566 {
kono
parents:
diff changeset
567 const char *name;
kono
parents:
diff changeset
568 int kind;
kono
parents:
diff changeset
569
kono
parents:
diff changeset
570 if (c->ext.actual->next->expr != NULL)
kono
parents:
diff changeset
571 kind = c->ext.actual->next->expr->ts.kind;
kono
parents:
diff changeset
572 else
kono
parents:
diff changeset
573 kind = gfc_default_integer_kind;
kono
parents:
diff changeset
574
kono
parents:
diff changeset
575 name = gfc_get_string (PREFIX ("chdir_i%d_sub"), kind);
kono
parents:
diff changeset
576 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
577 }
kono
parents:
diff changeset
578
kono
parents:
diff changeset
579
kono
parents:
diff changeset
580 void
kono
parents:
diff changeset
581 gfc_resolve_chmod (gfc_expr *f, gfc_expr *name ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
582 gfc_expr *mode ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
583 {
kono
parents:
diff changeset
584 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
585 f->ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
586 f->value.function.name = PREFIX ("chmod_func");
kono
parents:
diff changeset
587 }
kono
parents:
diff changeset
588
kono
parents:
diff changeset
589
kono
parents:
diff changeset
590 void
kono
parents:
diff changeset
591 gfc_resolve_chmod_sub (gfc_code *c)
kono
parents:
diff changeset
592 {
kono
parents:
diff changeset
593 const char *name;
kono
parents:
diff changeset
594 int kind;
kono
parents:
diff changeset
595
kono
parents:
diff changeset
596 if (c->ext.actual->next->next->expr != NULL)
kono
parents:
diff changeset
597 kind = c->ext.actual->next->next->expr->ts.kind;
kono
parents:
diff changeset
598 else
kono
parents:
diff changeset
599 kind = gfc_default_integer_kind;
kono
parents:
diff changeset
600
kono
parents:
diff changeset
601 name = gfc_get_string (PREFIX ("chmod_i%d_sub"), kind);
kono
parents:
diff changeset
602 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
603 }
kono
parents:
diff changeset
604
kono
parents:
diff changeset
605
kono
parents:
diff changeset
606 void
kono
parents:
diff changeset
607 gfc_resolve_cmplx (gfc_expr *f, gfc_expr *x, gfc_expr *y, gfc_expr *kind)
kono
parents:
diff changeset
608 {
kono
parents:
diff changeset
609 f->ts.type = BT_COMPLEX;
kono
parents:
diff changeset
610 f->ts.kind = (kind == NULL)
kono
parents:
diff changeset
611 ? gfc_default_real_kind : mpz_get_si (kind->value.integer);
kono
parents:
diff changeset
612
kono
parents:
diff changeset
613 if (y == NULL)
kono
parents:
diff changeset
614 f->value.function.name
kono
parents:
diff changeset
615 = gfc_get_string ("__cmplx0_%d_%c%d", f->ts.kind,
kono
parents:
diff changeset
616 gfc_type_letter (x->ts.type), x->ts.kind);
kono
parents:
diff changeset
617 else
kono
parents:
diff changeset
618 f->value.function.name
kono
parents:
diff changeset
619 = gfc_get_string ("__cmplx1_%d_%c%d_%c%d", f->ts.kind,
kono
parents:
diff changeset
620 gfc_type_letter (x->ts.type), x->ts.kind,
kono
parents:
diff changeset
621 gfc_type_letter (y->ts.type), y->ts.kind);
kono
parents:
diff changeset
622 }
kono
parents:
diff changeset
623
kono
parents:
diff changeset
624
kono
parents:
diff changeset
625 void
kono
parents:
diff changeset
626 gfc_resolve_dcmplx (gfc_expr *f, gfc_expr *x, gfc_expr *y)
kono
parents:
diff changeset
627 {
kono
parents:
diff changeset
628 gfc_resolve_cmplx (f, x, y, gfc_get_int_expr (gfc_default_integer_kind, NULL,
kono
parents:
diff changeset
629 gfc_default_double_kind));
kono
parents:
diff changeset
630 }
kono
parents:
diff changeset
631
kono
parents:
diff changeset
632
kono
parents:
diff changeset
633 void
kono
parents:
diff changeset
634 gfc_resolve_complex (gfc_expr *f, gfc_expr *x, gfc_expr *y)
kono
parents:
diff changeset
635 {
kono
parents:
diff changeset
636 int kind;
kono
parents:
diff changeset
637
kono
parents:
diff changeset
638 if (x->ts.type == BT_INTEGER)
kono
parents:
diff changeset
639 {
kono
parents:
diff changeset
640 if (y->ts.type == BT_INTEGER)
kono
parents:
diff changeset
641 kind = gfc_default_real_kind;
kono
parents:
diff changeset
642 else
kono
parents:
diff changeset
643 kind = y->ts.kind;
kono
parents:
diff changeset
644 }
kono
parents:
diff changeset
645 else
kono
parents:
diff changeset
646 {
kono
parents:
diff changeset
647 if (y->ts.type == BT_REAL)
kono
parents:
diff changeset
648 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
kono
parents:
diff changeset
649 else
kono
parents:
diff changeset
650 kind = x->ts.kind;
kono
parents:
diff changeset
651 }
kono
parents:
diff changeset
652
kono
parents:
diff changeset
653 f->ts.type = BT_COMPLEX;
kono
parents:
diff changeset
654 f->ts.kind = kind;
kono
parents:
diff changeset
655 f->value.function.name
kono
parents:
diff changeset
656 = gfc_get_string ("__cmplx1_%d_%c%d_%c%d", f->ts.kind,
kono
parents:
diff changeset
657 gfc_type_letter (x->ts.type), x->ts.kind,
kono
parents:
diff changeset
658 gfc_type_letter (y->ts.type), y->ts.kind);
kono
parents:
diff changeset
659 }
kono
parents:
diff changeset
660
kono
parents:
diff changeset
661
kono
parents:
diff changeset
662 void
kono
parents:
diff changeset
663 gfc_resolve_conjg (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
664 {
kono
parents:
diff changeset
665 f->ts = x->ts;
kono
parents:
diff changeset
666 f->value.function.name = gfc_get_string ("__conjg_%d", x->ts.kind);
kono
parents:
diff changeset
667 }
kono
parents:
diff changeset
668
kono
parents:
diff changeset
669
kono
parents:
diff changeset
670 void
kono
parents:
diff changeset
671 gfc_resolve_cos (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
672 {
kono
parents:
diff changeset
673 f->ts = x->ts;
kono
parents:
diff changeset
674 f->value.function.name
kono
parents:
diff changeset
675 = gfc_get_string ("__cos_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
kono
parents:
diff changeset
676 }
kono
parents:
diff changeset
677
kono
parents:
diff changeset
678
kono
parents:
diff changeset
679 void
kono
parents:
diff changeset
680 gfc_resolve_cosh (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
681 {
kono
parents:
diff changeset
682 f->ts = x->ts;
kono
parents:
diff changeset
683 f->value.function.name
kono
parents:
diff changeset
684 = gfc_get_string ("__cosh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
kono
parents:
diff changeset
685 }
kono
parents:
diff changeset
686
kono
parents:
diff changeset
687
kono
parents:
diff changeset
688 /* Our replacement of elements of a trig call with an EXPR_OP (e.g.
kono
parents:
diff changeset
689 multiplying the result or operands by a factor to convert to/from degrees)
kono
parents:
diff changeset
690 will cause the resolve_* function to be invoked again when resolving the
kono
parents:
diff changeset
691 freshly created EXPR_OP. See gfc_resolve_trigd, gfc_resolve_atrigd,
kono
parents:
diff changeset
692 gfc_resolve_cotan. We must observe this and avoid recursively creating
kono
parents:
diff changeset
693 layers of nested EXPR_OP expressions. */
kono
parents:
diff changeset
694
kono
parents:
diff changeset
695 static bool
kono
parents:
diff changeset
696 is_trig_resolved (gfc_expr *f)
kono
parents:
diff changeset
697 {
kono
parents:
diff changeset
698 /* We know we've already resolved the function if we see the lib call
kono
parents:
diff changeset
699 starting with '__'. */
kono
parents:
diff changeset
700 return (f->value.function.name != NULL
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
701 && gfc_str_startswith (f->value.function.name, "__"));
111
kono
parents:
diff changeset
702 }
kono
parents:
diff changeset
703
kono
parents:
diff changeset
704 /* Return a shallow copy of the function expression f. The original expression
kono
parents:
diff changeset
705 has its pointers cleared so that it may be freed without affecting the
kono
parents:
diff changeset
706 shallow copy. This is similar to gfc_copy_expr, but doesn't perform a deep
kono
parents:
diff changeset
707 copy of the argument list, allowing it to be reused somewhere else,
kono
parents:
diff changeset
708 setting the expression up nicely for gfc_replace_expr. */
kono
parents:
diff changeset
709
kono
parents:
diff changeset
710 static gfc_expr *
kono
parents:
diff changeset
711 copy_replace_function_shallow (gfc_expr *f)
kono
parents:
diff changeset
712 {
kono
parents:
diff changeset
713 gfc_expr *fcopy;
kono
parents:
diff changeset
714 gfc_actual_arglist *args;
kono
parents:
diff changeset
715
kono
parents:
diff changeset
716 /* The only thing deep-copied in gfc_copy_expr is args. */
kono
parents:
diff changeset
717 args = f->value.function.actual;
kono
parents:
diff changeset
718 f->value.function.actual = NULL;
kono
parents:
diff changeset
719 fcopy = gfc_copy_expr (f);
kono
parents:
diff changeset
720 fcopy->value.function.actual = args;
kono
parents:
diff changeset
721
kono
parents:
diff changeset
722 /* Clear the old function so the shallow copy is not affected if the old
kono
parents:
diff changeset
723 expression is freed. */
kono
parents:
diff changeset
724 f->value.function.name = NULL;
kono
parents:
diff changeset
725 f->value.function.isym = NULL;
kono
parents:
diff changeset
726 f->value.function.actual = NULL;
kono
parents:
diff changeset
727 f->value.function.esym = NULL;
kono
parents:
diff changeset
728 f->shape = NULL;
kono
parents:
diff changeset
729 f->ref = NULL;
kono
parents:
diff changeset
730
kono
parents:
diff changeset
731 return fcopy;
kono
parents:
diff changeset
732 }
kono
parents:
diff changeset
733
kono
parents:
diff changeset
734
kono
parents:
diff changeset
735 /* Resolve cotan = cos / sin. */
kono
parents:
diff changeset
736
kono
parents:
diff changeset
737 void
kono
parents:
diff changeset
738 gfc_resolve_cotan (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
739 {
kono
parents:
diff changeset
740 gfc_expr *result, *fcopy, *sin;
kono
parents:
diff changeset
741 gfc_actual_arglist *sin_args;
kono
parents:
diff changeset
742
kono
parents:
diff changeset
743 if (is_trig_resolved (f))
kono
parents:
diff changeset
744 return;
kono
parents:
diff changeset
745
kono
parents:
diff changeset
746 /* Compute cotan (x) = cos (x) / sin (x). */
kono
parents:
diff changeset
747 f->value.function.isym = gfc_intrinsic_function_by_id (GFC_ISYM_COS);
kono
parents:
diff changeset
748 gfc_resolve_cos (f, x);
kono
parents:
diff changeset
749
kono
parents:
diff changeset
750 sin_args = gfc_get_actual_arglist ();
kono
parents:
diff changeset
751 sin_args->expr = gfc_copy_expr (x);
kono
parents:
diff changeset
752
kono
parents:
diff changeset
753 sin = gfc_get_expr ();
kono
parents:
diff changeset
754 sin->ts = f->ts;
kono
parents:
diff changeset
755 sin->where = f->where;
kono
parents:
diff changeset
756 sin->expr_type = EXPR_FUNCTION;
kono
parents:
diff changeset
757 sin->value.function.isym = gfc_intrinsic_function_by_id (GFC_ISYM_SIN);
kono
parents:
diff changeset
758 sin->value.function.actual = sin_args;
kono
parents:
diff changeset
759 gfc_resolve_sin (sin, sin_args->expr);
kono
parents:
diff changeset
760
kono
parents:
diff changeset
761 /* Replace f with cos/sin - we do this in place in f for the caller. */
kono
parents:
diff changeset
762 fcopy = copy_replace_function_shallow (f);
kono
parents:
diff changeset
763 result = gfc_divide (fcopy, sin);
kono
parents:
diff changeset
764 gfc_replace_expr (f, result);
kono
parents:
diff changeset
765 }
kono
parents:
diff changeset
766
kono
parents:
diff changeset
767
kono
parents:
diff changeset
768 void
kono
parents:
diff changeset
769 gfc_resolve_count (gfc_expr *f, gfc_expr *mask, gfc_expr *dim, gfc_expr *kind)
kono
parents:
diff changeset
770 {
kono
parents:
diff changeset
771 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
772 if (kind)
kono
parents:
diff changeset
773 f->ts.kind = mpz_get_si (kind->value.integer);
kono
parents:
diff changeset
774 else
kono
parents:
diff changeset
775 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
776
kono
parents:
diff changeset
777 if (dim != NULL)
kono
parents:
diff changeset
778 {
kono
parents:
diff changeset
779 f->rank = mask->rank - 1;
kono
parents:
diff changeset
780 gfc_resolve_dim_arg (dim);
kono
parents:
diff changeset
781 f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
kono
parents:
diff changeset
782 }
kono
parents:
diff changeset
783
kono
parents:
diff changeset
784 resolve_mask_arg (mask);
kono
parents:
diff changeset
785
kono
parents:
diff changeset
786 f->value.function.name
kono
parents:
diff changeset
787 = gfc_get_string (PREFIX ("count_%d_%c"), f->ts.kind,
kono
parents:
diff changeset
788 gfc_type_letter (mask->ts.type));
kono
parents:
diff changeset
789 }
kono
parents:
diff changeset
790
kono
parents:
diff changeset
791
kono
parents:
diff changeset
792 void
kono
parents:
diff changeset
793 gfc_resolve_cshift (gfc_expr *f, gfc_expr *array, gfc_expr *shift,
kono
parents:
diff changeset
794 gfc_expr *dim)
kono
parents:
diff changeset
795 {
kono
parents:
diff changeset
796 int n, m;
kono
parents:
diff changeset
797
kono
parents:
diff changeset
798 if (array->ts.type == BT_CHARACTER && array->ref)
kono
parents:
diff changeset
799 gfc_resolve_substring_charlen (array);
kono
parents:
diff changeset
800
kono
parents:
diff changeset
801 f->ts = array->ts;
kono
parents:
diff changeset
802 f->rank = array->rank;
kono
parents:
diff changeset
803 f->shape = gfc_copy_shape (array->shape, array->rank);
kono
parents:
diff changeset
804
kono
parents:
diff changeset
805 if (shift->rank > 0)
kono
parents:
diff changeset
806 n = 1;
kono
parents:
diff changeset
807 else
kono
parents:
diff changeset
808 n = 0;
kono
parents:
diff changeset
809
kono
parents:
diff changeset
810 /* If dim kind is greater than default integer we need to use the larger. */
kono
parents:
diff changeset
811 m = gfc_default_integer_kind;
kono
parents:
diff changeset
812 if (dim != NULL)
kono
parents:
diff changeset
813 m = m < dim->ts.kind ? dim->ts.kind : m;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
814
111
kono
parents:
diff changeset
815 /* Convert shift to at least m, so we don't need
kono
parents:
diff changeset
816 kind=1 and kind=2 versions of the library functions. */
kono
parents:
diff changeset
817 if (shift->ts.kind < m)
kono
parents:
diff changeset
818 {
kono
parents:
diff changeset
819 gfc_typespec ts;
kono
parents:
diff changeset
820 gfc_clear_ts (&ts);
kono
parents:
diff changeset
821 ts.type = BT_INTEGER;
kono
parents:
diff changeset
822 ts.kind = m;
kono
parents:
diff changeset
823 gfc_convert_type_warn (shift, &ts, 2, 0);
kono
parents:
diff changeset
824 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
825
111
kono
parents:
diff changeset
826 if (dim != NULL)
kono
parents:
diff changeset
827 {
kono
parents:
diff changeset
828 if (dim->expr_type != EXPR_CONSTANT && dim->symtree != NULL
kono
parents:
diff changeset
829 && dim->symtree->n.sym->attr.optional)
kono
parents:
diff changeset
830 {
kono
parents:
diff changeset
831 /* Mark this for later setting the type in gfc_conv_missing_dummy. */
kono
parents:
diff changeset
832 dim->representation.length = shift->ts.kind;
kono
parents:
diff changeset
833 }
kono
parents:
diff changeset
834 else
kono
parents:
diff changeset
835 {
kono
parents:
diff changeset
836 gfc_resolve_dim_arg (dim);
kono
parents:
diff changeset
837 /* Convert dim to shift's kind to reduce variations. */
kono
parents:
diff changeset
838 if (dim->ts.kind != shift->ts.kind)
kono
parents:
diff changeset
839 gfc_convert_type_warn (dim, &shift->ts, 2, 0);
kono
parents:
diff changeset
840 }
kono
parents:
diff changeset
841 }
kono
parents:
diff changeset
842
kono
parents:
diff changeset
843 if (array->ts.type == BT_CHARACTER)
kono
parents:
diff changeset
844 {
kono
parents:
diff changeset
845 if (array->ts.kind == gfc_default_character_kind)
kono
parents:
diff changeset
846 f->value.function.name
kono
parents:
diff changeset
847 = gfc_get_string (PREFIX ("cshift%d_%d_char"), n, shift->ts.kind);
kono
parents:
diff changeset
848 else
kono
parents:
diff changeset
849 f->value.function.name
kono
parents:
diff changeset
850 = gfc_get_string (PREFIX ("cshift%d_%d_char%d"), n, shift->ts.kind,
kono
parents:
diff changeset
851 array->ts.kind);
kono
parents:
diff changeset
852 }
kono
parents:
diff changeset
853 else
kono
parents:
diff changeset
854 f->value.function.name
kono
parents:
diff changeset
855 = gfc_get_string (PREFIX ("cshift%d_%d"), n, shift->ts.kind);
kono
parents:
diff changeset
856 }
kono
parents:
diff changeset
857
kono
parents:
diff changeset
858
kono
parents:
diff changeset
859 void
kono
parents:
diff changeset
860 gfc_resolve_ctime (gfc_expr *f, gfc_expr *time)
kono
parents:
diff changeset
861 {
kono
parents:
diff changeset
862 gfc_typespec ts;
kono
parents:
diff changeset
863 gfc_clear_ts (&ts);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
864
111
kono
parents:
diff changeset
865 f->ts.type = BT_CHARACTER;
kono
parents:
diff changeset
866 f->ts.kind = gfc_default_character_kind;
kono
parents:
diff changeset
867
kono
parents:
diff changeset
868 /* ctime TIME argument is a INTEGER(KIND=8), says the doc */
kono
parents:
diff changeset
869 if (time->ts.kind != 8)
kono
parents:
diff changeset
870 {
kono
parents:
diff changeset
871 ts.type = BT_INTEGER;
kono
parents:
diff changeset
872 ts.kind = 8;
kono
parents:
diff changeset
873 ts.u.derived = NULL;
kono
parents:
diff changeset
874 ts.u.cl = NULL;
kono
parents:
diff changeset
875 gfc_convert_type (time, &ts, 2);
kono
parents:
diff changeset
876 }
kono
parents:
diff changeset
877
kono
parents:
diff changeset
878 f->value.function.name = gfc_get_string (PREFIX ("ctime"));
kono
parents:
diff changeset
879 }
kono
parents:
diff changeset
880
kono
parents:
diff changeset
881
kono
parents:
diff changeset
882 void
kono
parents:
diff changeset
883 gfc_resolve_dble (gfc_expr *f, gfc_expr *a)
kono
parents:
diff changeset
884 {
kono
parents:
diff changeset
885 f->ts.type = BT_REAL;
kono
parents:
diff changeset
886 f->ts.kind = gfc_default_double_kind;
kono
parents:
diff changeset
887 f->value.function.name
kono
parents:
diff changeset
888 = gfc_get_string ("__dble_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
kono
parents:
diff changeset
889 }
kono
parents:
diff changeset
890
kono
parents:
diff changeset
891
kono
parents:
diff changeset
892 void
kono
parents:
diff changeset
893 gfc_resolve_dim (gfc_expr *f, gfc_expr *a, gfc_expr *p)
kono
parents:
diff changeset
894 {
kono
parents:
diff changeset
895 f->ts.type = a->ts.type;
kono
parents:
diff changeset
896 if (p != NULL)
kono
parents:
diff changeset
897 f->ts.kind = gfc_kind_max (a,p);
kono
parents:
diff changeset
898 else
kono
parents:
diff changeset
899 f->ts.kind = a->ts.kind;
kono
parents:
diff changeset
900
kono
parents:
diff changeset
901 if (p != NULL && a->ts.kind != p->ts.kind)
kono
parents:
diff changeset
902 {
kono
parents:
diff changeset
903 if (a->ts.kind == gfc_kind_max (a,p))
kono
parents:
diff changeset
904 gfc_convert_type (p, &a->ts, 2);
kono
parents:
diff changeset
905 else
kono
parents:
diff changeset
906 gfc_convert_type (a, &p->ts, 2);
kono
parents:
diff changeset
907 }
kono
parents:
diff changeset
908
kono
parents:
diff changeset
909 f->value.function.name
kono
parents:
diff changeset
910 = gfc_get_string ("__dim_%c%d", gfc_type_letter (f->ts.type), f->ts.kind);
kono
parents:
diff changeset
911 }
kono
parents:
diff changeset
912
kono
parents:
diff changeset
913
kono
parents:
diff changeset
914 void
kono
parents:
diff changeset
915 gfc_resolve_dot_product (gfc_expr *f, gfc_expr *a, gfc_expr *b)
kono
parents:
diff changeset
916 {
kono
parents:
diff changeset
917 gfc_expr temp;
kono
parents:
diff changeset
918
kono
parents:
diff changeset
919 temp.expr_type = EXPR_OP;
kono
parents:
diff changeset
920 gfc_clear_ts (&temp.ts);
kono
parents:
diff changeset
921 temp.value.op.op = INTRINSIC_NONE;
kono
parents:
diff changeset
922 temp.value.op.op1 = a;
kono
parents:
diff changeset
923 temp.value.op.op2 = b;
kono
parents:
diff changeset
924 gfc_type_convert_binary (&temp, 1);
kono
parents:
diff changeset
925 f->ts = temp.ts;
kono
parents:
diff changeset
926 f->value.function.name
kono
parents:
diff changeset
927 = gfc_get_string (PREFIX ("dot_product_%c%d"),
kono
parents:
diff changeset
928 gfc_type_letter (f->ts.type), f->ts.kind);
kono
parents:
diff changeset
929 }
kono
parents:
diff changeset
930
kono
parents:
diff changeset
931
kono
parents:
diff changeset
932 void
kono
parents:
diff changeset
933 gfc_resolve_dprod (gfc_expr *f, gfc_expr *a ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
934 gfc_expr *b ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
935 {
kono
parents:
diff changeset
936 f->ts.kind = gfc_default_double_kind;
kono
parents:
diff changeset
937 f->ts.type = BT_REAL;
kono
parents:
diff changeset
938 f->value.function.name = gfc_get_string ("__dprod_r%d", f->ts.kind);
kono
parents:
diff changeset
939 }
kono
parents:
diff changeset
940
kono
parents:
diff changeset
941
kono
parents:
diff changeset
942 void
kono
parents:
diff changeset
943 gfc_resolve_dshift (gfc_expr *f, gfc_expr *i, gfc_expr *j ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
944 gfc_expr *shift ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
945 {
kono
parents:
diff changeset
946 f->ts = i->ts;
kono
parents:
diff changeset
947 if (f->value.function.isym->id == GFC_ISYM_DSHIFTL)
kono
parents:
diff changeset
948 f->value.function.name = gfc_get_string ("dshiftl_i%d", f->ts.kind);
kono
parents:
diff changeset
949 else if (f->value.function.isym->id == GFC_ISYM_DSHIFTR)
kono
parents:
diff changeset
950 f->value.function.name = gfc_get_string ("dshiftr_i%d", f->ts.kind);
kono
parents:
diff changeset
951 else
kono
parents:
diff changeset
952 gcc_unreachable ();
kono
parents:
diff changeset
953 }
kono
parents:
diff changeset
954
kono
parents:
diff changeset
955
kono
parents:
diff changeset
956 void
kono
parents:
diff changeset
957 gfc_resolve_eoshift (gfc_expr *f, gfc_expr *array, gfc_expr *shift,
kono
parents:
diff changeset
958 gfc_expr *boundary, gfc_expr *dim)
kono
parents:
diff changeset
959 {
kono
parents:
diff changeset
960 int n, m;
kono
parents:
diff changeset
961
kono
parents:
diff changeset
962 if (array->ts.type == BT_CHARACTER && array->ref)
kono
parents:
diff changeset
963 gfc_resolve_substring_charlen (array);
kono
parents:
diff changeset
964
kono
parents:
diff changeset
965 f->ts = array->ts;
kono
parents:
diff changeset
966 f->rank = array->rank;
kono
parents:
diff changeset
967 f->shape = gfc_copy_shape (array->shape, array->rank);
kono
parents:
diff changeset
968
kono
parents:
diff changeset
969 n = 0;
kono
parents:
diff changeset
970 if (shift->rank > 0)
kono
parents:
diff changeset
971 n = n | 1;
kono
parents:
diff changeset
972 if (boundary && boundary->rank > 0)
kono
parents:
diff changeset
973 n = n | 2;
kono
parents:
diff changeset
974
kono
parents:
diff changeset
975 /* If dim kind is greater than default integer we need to use the larger. */
kono
parents:
diff changeset
976 m = gfc_default_integer_kind;
kono
parents:
diff changeset
977 if (dim != NULL)
kono
parents:
diff changeset
978 m = m < dim->ts.kind ? dim->ts.kind : m;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
979
111
kono
parents:
diff changeset
980 /* Convert shift to at least m, so we don't need
kono
parents:
diff changeset
981 kind=1 and kind=2 versions of the library functions. */
kono
parents:
diff changeset
982 if (shift->ts.kind < m)
kono
parents:
diff changeset
983 {
kono
parents:
diff changeset
984 gfc_typespec ts;
kono
parents:
diff changeset
985 gfc_clear_ts (&ts);
kono
parents:
diff changeset
986 ts.type = BT_INTEGER;
kono
parents:
diff changeset
987 ts.kind = m;
kono
parents:
diff changeset
988 gfc_convert_type_warn (shift, &ts, 2, 0);
kono
parents:
diff changeset
989 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
990
111
kono
parents:
diff changeset
991 if (dim != NULL)
kono
parents:
diff changeset
992 {
kono
parents:
diff changeset
993 if (dim->expr_type != EXPR_CONSTANT && dim->symtree != NULL
kono
parents:
diff changeset
994 && dim->symtree->n.sym->attr.optional)
kono
parents:
diff changeset
995 {
kono
parents:
diff changeset
996 /* Mark this for later setting the type in gfc_conv_missing_dummy. */
kono
parents:
diff changeset
997 dim->representation.length = shift->ts.kind;
kono
parents:
diff changeset
998 }
kono
parents:
diff changeset
999 else
kono
parents:
diff changeset
1000 {
kono
parents:
diff changeset
1001 gfc_resolve_dim_arg (dim);
kono
parents:
diff changeset
1002 /* Convert dim to shift's kind to reduce variations. */
kono
parents:
diff changeset
1003 if (dim->ts.kind != shift->ts.kind)
kono
parents:
diff changeset
1004 gfc_convert_type_warn (dim, &shift->ts, 2, 0);
kono
parents:
diff changeset
1005 }
kono
parents:
diff changeset
1006 }
kono
parents:
diff changeset
1007
kono
parents:
diff changeset
1008 if (array->ts.type == BT_CHARACTER)
kono
parents:
diff changeset
1009 {
kono
parents:
diff changeset
1010 if (array->ts.kind == gfc_default_character_kind)
kono
parents:
diff changeset
1011 f->value.function.name
kono
parents:
diff changeset
1012 = gfc_get_string (PREFIX ("eoshift%d_%d_char"), n, shift->ts.kind);
kono
parents:
diff changeset
1013 else
kono
parents:
diff changeset
1014 f->value.function.name
kono
parents:
diff changeset
1015 = gfc_get_string (PREFIX ("eoshift%d_%d_char%d"), n, shift->ts.kind,
kono
parents:
diff changeset
1016 array->ts.kind);
kono
parents:
diff changeset
1017 }
kono
parents:
diff changeset
1018 else
kono
parents:
diff changeset
1019 f->value.function.name
kono
parents:
diff changeset
1020 = gfc_get_string (PREFIX ("eoshift%d_%d"), n, shift->ts.kind);
kono
parents:
diff changeset
1021 }
kono
parents:
diff changeset
1022
kono
parents:
diff changeset
1023
kono
parents:
diff changeset
1024 void
kono
parents:
diff changeset
1025 gfc_resolve_exp (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
1026 {
kono
parents:
diff changeset
1027 f->ts = x->ts;
kono
parents:
diff changeset
1028 f->value.function.name
kono
parents:
diff changeset
1029 = gfc_get_string ("__exp_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
kono
parents:
diff changeset
1030 }
kono
parents:
diff changeset
1031
kono
parents:
diff changeset
1032
kono
parents:
diff changeset
1033 void
kono
parents:
diff changeset
1034 gfc_resolve_exponent (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
1035 {
kono
parents:
diff changeset
1036 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
1037 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
1038 f->value.function.name = gfc_get_string ("__exponent_%d", x->ts.kind);
kono
parents:
diff changeset
1039 }
kono
parents:
diff changeset
1040
kono
parents:
diff changeset
1041
kono
parents:
diff changeset
1042 /* Resolve the EXTENDS_TYPE_OF intrinsic function. */
kono
parents:
diff changeset
1043
kono
parents:
diff changeset
1044 void
kono
parents:
diff changeset
1045 gfc_resolve_extends_type_of (gfc_expr *f, gfc_expr *a, gfc_expr *mo)
kono
parents:
diff changeset
1046 {
kono
parents:
diff changeset
1047 gfc_symbol *vtab;
kono
parents:
diff changeset
1048 gfc_symtree *st;
kono
parents:
diff changeset
1049
kono
parents:
diff changeset
1050 /* Prevent double resolution. */
kono
parents:
diff changeset
1051 if (f->ts.type == BT_LOGICAL)
kono
parents:
diff changeset
1052 return;
kono
parents:
diff changeset
1053
kono
parents:
diff changeset
1054 /* Replace the first argument with the corresponding vtab. */
kono
parents:
diff changeset
1055 if (a->ts.type == BT_CLASS)
kono
parents:
diff changeset
1056 gfc_add_vptr_component (a);
kono
parents:
diff changeset
1057 else if (a->ts.type == BT_DERIVED)
kono
parents:
diff changeset
1058 {
kono
parents:
diff changeset
1059 locus where;
kono
parents:
diff changeset
1060
kono
parents:
diff changeset
1061 vtab = gfc_find_derived_vtab (a->ts.u.derived);
kono
parents:
diff changeset
1062 /* Clear the old expr. */
kono
parents:
diff changeset
1063 gfc_free_ref_list (a->ref);
kono
parents:
diff changeset
1064 where = a->where;
kono
parents:
diff changeset
1065 memset (a, '\0', sizeof (gfc_expr));
kono
parents:
diff changeset
1066 /* Construct a new one. */
kono
parents:
diff changeset
1067 a->expr_type = EXPR_VARIABLE;
kono
parents:
diff changeset
1068 st = gfc_find_symtree (vtab->ns->sym_root, vtab->name);
kono
parents:
diff changeset
1069 a->symtree = st;
kono
parents:
diff changeset
1070 a->ts = vtab->ts;
kono
parents:
diff changeset
1071 a->where = where;
kono
parents:
diff changeset
1072 }
kono
parents:
diff changeset
1073
kono
parents:
diff changeset
1074 /* Replace the second argument with the corresponding vtab. */
kono
parents:
diff changeset
1075 if (mo->ts.type == BT_CLASS)
kono
parents:
diff changeset
1076 gfc_add_vptr_component (mo);
kono
parents:
diff changeset
1077 else if (mo->ts.type == BT_DERIVED)
kono
parents:
diff changeset
1078 {
kono
parents:
diff changeset
1079 locus where;
kono
parents:
diff changeset
1080
kono
parents:
diff changeset
1081 vtab = gfc_find_derived_vtab (mo->ts.u.derived);
kono
parents:
diff changeset
1082 /* Clear the old expr. */
kono
parents:
diff changeset
1083 where = mo->where;
kono
parents:
diff changeset
1084 gfc_free_ref_list (mo->ref);
kono
parents:
diff changeset
1085 memset (mo, '\0', sizeof (gfc_expr));
kono
parents:
diff changeset
1086 /* Construct a new one. */
kono
parents:
diff changeset
1087 mo->expr_type = EXPR_VARIABLE;
kono
parents:
diff changeset
1088 st = gfc_find_symtree (vtab->ns->sym_root, vtab->name);
kono
parents:
diff changeset
1089 mo->symtree = st;
kono
parents:
diff changeset
1090 mo->ts = vtab->ts;
kono
parents:
diff changeset
1091 mo->where = where;
kono
parents:
diff changeset
1092 }
kono
parents:
diff changeset
1093
kono
parents:
diff changeset
1094 f->ts.type = BT_LOGICAL;
kono
parents:
diff changeset
1095 f->ts.kind = 4;
kono
parents:
diff changeset
1096
kono
parents:
diff changeset
1097 f->value.function.isym->formal->ts = a->ts;
kono
parents:
diff changeset
1098 f->value.function.isym->formal->next->ts = mo->ts;
kono
parents:
diff changeset
1099
kono
parents:
diff changeset
1100 /* Call library function. */
kono
parents:
diff changeset
1101 f->value.function.name = gfc_get_string (PREFIX ("is_extension_of"));
kono
parents:
diff changeset
1102 }
kono
parents:
diff changeset
1103
kono
parents:
diff changeset
1104
kono
parents:
diff changeset
1105 void
kono
parents:
diff changeset
1106 gfc_resolve_fdate (gfc_expr *f)
kono
parents:
diff changeset
1107 {
kono
parents:
diff changeset
1108 f->ts.type = BT_CHARACTER;
kono
parents:
diff changeset
1109 f->ts.kind = gfc_default_character_kind;
kono
parents:
diff changeset
1110 f->value.function.name = gfc_get_string (PREFIX ("fdate"));
kono
parents:
diff changeset
1111 }
kono
parents:
diff changeset
1112
kono
parents:
diff changeset
1113
kono
parents:
diff changeset
1114 void
kono
parents:
diff changeset
1115 gfc_resolve_floor (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
kono
parents:
diff changeset
1116 {
kono
parents:
diff changeset
1117 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
1118 f->ts.kind = (kind == NULL)
kono
parents:
diff changeset
1119 ? gfc_default_integer_kind : mpz_get_si (kind->value.integer);
kono
parents:
diff changeset
1120 f->value.function.name
kono
parents:
diff changeset
1121 = gfc_get_string ("__floor%d_%c%d", f->ts.kind,
kono
parents:
diff changeset
1122 gfc_type_letter (a->ts.type), a->ts.kind);
kono
parents:
diff changeset
1123 }
kono
parents:
diff changeset
1124
kono
parents:
diff changeset
1125
kono
parents:
diff changeset
1126 void
kono
parents:
diff changeset
1127 gfc_resolve_fnum (gfc_expr *f, gfc_expr *n)
kono
parents:
diff changeset
1128 {
kono
parents:
diff changeset
1129 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
1130 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
1131 if (n->ts.kind != f->ts.kind)
kono
parents:
diff changeset
1132 gfc_convert_type (n, &f->ts, 2);
kono
parents:
diff changeset
1133 f->value.function.name = gfc_get_string (PREFIX ("fnum_i%d"), f->ts.kind);
kono
parents:
diff changeset
1134 }
kono
parents:
diff changeset
1135
kono
parents:
diff changeset
1136
kono
parents:
diff changeset
1137 void
kono
parents:
diff changeset
1138 gfc_resolve_fraction (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
1139 {
kono
parents:
diff changeset
1140 f->ts = x->ts;
kono
parents:
diff changeset
1141 f->value.function.name = gfc_get_string ("__fraction_%d", x->ts.kind);
kono
parents:
diff changeset
1142 }
kono
parents:
diff changeset
1143
kono
parents:
diff changeset
1144
kono
parents:
diff changeset
1145 /* Resolve single-argument g77 math intrinsics, eg BESY0, ERF. */
kono
parents:
diff changeset
1146
kono
parents:
diff changeset
1147 void
kono
parents:
diff changeset
1148 gfc_resolve_g77_math1 (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
1149 {
kono
parents:
diff changeset
1150 f->ts = x->ts;
kono
parents:
diff changeset
1151 f->value.function.name = gfc_get_string ("<intrinsic>");
kono
parents:
diff changeset
1152 }
kono
parents:
diff changeset
1153
kono
parents:
diff changeset
1154
kono
parents:
diff changeset
1155 void
kono
parents:
diff changeset
1156 gfc_resolve_gamma (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
1157 {
kono
parents:
diff changeset
1158 f->ts = x->ts;
kono
parents:
diff changeset
1159 f->value.function.name
kono
parents:
diff changeset
1160 = gfc_get_string ("__tgamma_%d", x->ts.kind);
kono
parents:
diff changeset
1161 }
kono
parents:
diff changeset
1162
kono
parents:
diff changeset
1163
kono
parents:
diff changeset
1164 void
kono
parents:
diff changeset
1165 gfc_resolve_getcwd (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
1166 {
kono
parents:
diff changeset
1167 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
1168 f->ts.kind = 4;
kono
parents:
diff changeset
1169 f->value.function.name = gfc_get_string (PREFIX ("getcwd"));
kono
parents:
diff changeset
1170 }
kono
parents:
diff changeset
1171
kono
parents:
diff changeset
1172
kono
parents:
diff changeset
1173 void
kono
parents:
diff changeset
1174 gfc_resolve_getgid (gfc_expr *f)
kono
parents:
diff changeset
1175 {
kono
parents:
diff changeset
1176 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
1177 f->ts.kind = 4;
kono
parents:
diff changeset
1178 f->value.function.name = gfc_get_string (PREFIX ("getgid"));
kono
parents:
diff changeset
1179 }
kono
parents:
diff changeset
1180
kono
parents:
diff changeset
1181
kono
parents:
diff changeset
1182 void
kono
parents:
diff changeset
1183 gfc_resolve_getpid (gfc_expr *f)
kono
parents:
diff changeset
1184 {
kono
parents:
diff changeset
1185 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
1186 f->ts.kind = 4;
kono
parents:
diff changeset
1187 f->value.function.name = gfc_get_string (PREFIX ("getpid"));
kono
parents:
diff changeset
1188 }
kono
parents:
diff changeset
1189
kono
parents:
diff changeset
1190
kono
parents:
diff changeset
1191 void
kono
parents:
diff changeset
1192 gfc_resolve_getuid (gfc_expr *f)
kono
parents:
diff changeset
1193 {
kono
parents:
diff changeset
1194 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
1195 f->ts.kind = 4;
kono
parents:
diff changeset
1196 f->value.function.name = gfc_get_string (PREFIX ("getuid"));
kono
parents:
diff changeset
1197 }
kono
parents:
diff changeset
1198
kono
parents:
diff changeset
1199
kono
parents:
diff changeset
1200 void
kono
parents:
diff changeset
1201 gfc_resolve_hostnm (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
1202 {
kono
parents:
diff changeset
1203 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
1204 f->ts.kind = 4;
kono
parents:
diff changeset
1205 f->value.function.name = gfc_get_string (PREFIX ("hostnm"));
kono
parents:
diff changeset
1206 }
kono
parents:
diff changeset
1207
kono
parents:
diff changeset
1208
kono
parents:
diff changeset
1209 void
kono
parents:
diff changeset
1210 gfc_resolve_hypot (gfc_expr *f, gfc_expr *x, gfc_expr *y ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
1211 {
kono
parents:
diff changeset
1212 f->ts = x->ts;
kono
parents:
diff changeset
1213 f->value.function.name = gfc_get_string ("__hypot_r%d", x->ts.kind);
kono
parents:
diff changeset
1214 }
kono
parents:
diff changeset
1215
kono
parents:
diff changeset
1216
kono
parents:
diff changeset
1217 void
kono
parents:
diff changeset
1218 gfc_resolve_iall (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
kono
parents:
diff changeset
1219 {
kono
parents:
diff changeset
1220 resolve_transformational ("iall", f, array, dim, mask);
kono
parents:
diff changeset
1221 }
kono
parents:
diff changeset
1222
kono
parents:
diff changeset
1223
kono
parents:
diff changeset
1224 void
kono
parents:
diff changeset
1225 gfc_resolve_iand (gfc_expr *f, gfc_expr *i, gfc_expr *j)
kono
parents:
diff changeset
1226 {
kono
parents:
diff changeset
1227 /* If the kind of i and j are different, then g77 cross-promoted the
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1228 kinds to the largest value. The Fortran 95 standard requires the
111
kono
parents:
diff changeset
1229 kinds to match. */
kono
parents:
diff changeset
1230 if (i->ts.kind != j->ts.kind)
kono
parents:
diff changeset
1231 {
kono
parents:
diff changeset
1232 if (i->ts.kind == gfc_kind_max (i, j))
kono
parents:
diff changeset
1233 gfc_convert_type (j, &i->ts, 2);
kono
parents:
diff changeset
1234 else
kono
parents:
diff changeset
1235 gfc_convert_type (i, &j->ts, 2);
kono
parents:
diff changeset
1236 }
kono
parents:
diff changeset
1237
kono
parents:
diff changeset
1238 f->ts = i->ts;
kono
parents:
diff changeset
1239 f->value.function.name = gfc_get_string ("__iand_%d", i->ts.kind);
kono
parents:
diff changeset
1240 }
kono
parents:
diff changeset
1241
kono
parents:
diff changeset
1242
kono
parents:
diff changeset
1243 void
kono
parents:
diff changeset
1244 gfc_resolve_iany (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
kono
parents:
diff changeset
1245 {
kono
parents:
diff changeset
1246 resolve_transformational ("iany", f, array, dim, mask);
kono
parents:
diff changeset
1247 }
kono
parents:
diff changeset
1248
kono
parents:
diff changeset
1249
kono
parents:
diff changeset
1250 void
kono
parents:
diff changeset
1251 gfc_resolve_ibclr (gfc_expr *f, gfc_expr *i, gfc_expr *pos ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
1252 {
kono
parents:
diff changeset
1253 f->ts = i->ts;
kono
parents:
diff changeset
1254 f->value.function.name = gfc_get_string ("__ibclr_%d", i->ts.kind);
kono
parents:
diff changeset
1255 }
kono
parents:
diff changeset
1256
kono
parents:
diff changeset
1257
kono
parents:
diff changeset
1258 void
kono
parents:
diff changeset
1259 gfc_resolve_ibits (gfc_expr *f, gfc_expr *i, gfc_expr *pos ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
1260 gfc_expr *len ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
1261 {
kono
parents:
diff changeset
1262 f->ts = i->ts;
kono
parents:
diff changeset
1263 f->value.function.name = gfc_get_string ("__ibits_%d", i->ts.kind);
kono
parents:
diff changeset
1264 }
kono
parents:
diff changeset
1265
kono
parents:
diff changeset
1266
kono
parents:
diff changeset
1267 void
kono
parents:
diff changeset
1268 gfc_resolve_ibset (gfc_expr *f, gfc_expr *i, gfc_expr *pos ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
1269 {
kono
parents:
diff changeset
1270 f->ts = i->ts;
kono
parents:
diff changeset
1271 f->value.function.name = gfc_get_string ("__ibset_%d", i->ts.kind);
kono
parents:
diff changeset
1272 }
kono
parents:
diff changeset
1273
kono
parents:
diff changeset
1274
kono
parents:
diff changeset
1275 void
kono
parents:
diff changeset
1276 gfc_resolve_iachar (gfc_expr *f, gfc_expr *c, gfc_expr *kind)
kono
parents:
diff changeset
1277 {
kono
parents:
diff changeset
1278 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
1279 if (kind)
kono
parents:
diff changeset
1280 f->ts.kind = mpz_get_si (kind->value.integer);
kono
parents:
diff changeset
1281 else
kono
parents:
diff changeset
1282 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
1283 f->value.function.name = gfc_get_string ("__ichar_%d", c->ts.kind);
kono
parents:
diff changeset
1284 }
kono
parents:
diff changeset
1285
kono
parents:
diff changeset
1286
kono
parents:
diff changeset
1287 void
kono
parents:
diff changeset
1288 gfc_resolve_ichar (gfc_expr *f, gfc_expr *c, gfc_expr *kind)
kono
parents:
diff changeset
1289 {
kono
parents:
diff changeset
1290 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
1291 if (kind)
kono
parents:
diff changeset
1292 f->ts.kind = mpz_get_si (kind->value.integer);
kono
parents:
diff changeset
1293 else
kono
parents:
diff changeset
1294 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
1295 f->value.function.name = gfc_get_string ("__ichar_%d", c->ts.kind);
kono
parents:
diff changeset
1296 }
kono
parents:
diff changeset
1297
kono
parents:
diff changeset
1298
kono
parents:
diff changeset
1299 void
kono
parents:
diff changeset
1300 gfc_resolve_idnint (gfc_expr *f, gfc_expr *a)
kono
parents:
diff changeset
1301 {
kono
parents:
diff changeset
1302 gfc_resolve_nint (f, a, NULL);
kono
parents:
diff changeset
1303 }
kono
parents:
diff changeset
1304
kono
parents:
diff changeset
1305
kono
parents:
diff changeset
1306 void
kono
parents:
diff changeset
1307 gfc_resolve_ierrno (gfc_expr *f)
kono
parents:
diff changeset
1308 {
kono
parents:
diff changeset
1309 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
1310 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
1311 f->value.function.name = gfc_get_string (PREFIX ("ierrno_i%d"), f->ts.kind);
kono
parents:
diff changeset
1312 }
kono
parents:
diff changeset
1313
kono
parents:
diff changeset
1314
kono
parents:
diff changeset
1315 void
kono
parents:
diff changeset
1316 gfc_resolve_ieor (gfc_expr *f, gfc_expr *i, gfc_expr *j)
kono
parents:
diff changeset
1317 {
kono
parents:
diff changeset
1318 /* If the kind of i and j are different, then g77 cross-promoted the
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1319 kinds to the largest value. The Fortran 95 standard requires the
111
kono
parents:
diff changeset
1320 kinds to match. */
kono
parents:
diff changeset
1321 if (i->ts.kind != j->ts.kind)
kono
parents:
diff changeset
1322 {
kono
parents:
diff changeset
1323 if (i->ts.kind == gfc_kind_max (i, j))
kono
parents:
diff changeset
1324 gfc_convert_type (j, &i->ts, 2);
kono
parents:
diff changeset
1325 else
kono
parents:
diff changeset
1326 gfc_convert_type (i, &j->ts, 2);
kono
parents:
diff changeset
1327 }
kono
parents:
diff changeset
1328
kono
parents:
diff changeset
1329 f->ts = i->ts;
kono
parents:
diff changeset
1330 f->value.function.name = gfc_get_string ("__ieor_%d", i->ts.kind);
kono
parents:
diff changeset
1331 }
kono
parents:
diff changeset
1332
kono
parents:
diff changeset
1333
kono
parents:
diff changeset
1334 void
kono
parents:
diff changeset
1335 gfc_resolve_ior (gfc_expr *f, gfc_expr *i, gfc_expr *j)
kono
parents:
diff changeset
1336 {
kono
parents:
diff changeset
1337 /* If the kind of i and j are different, then g77 cross-promoted the
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1338 kinds to the largest value. The Fortran 95 standard requires the
111
kono
parents:
diff changeset
1339 kinds to match. */
kono
parents:
diff changeset
1340 if (i->ts.kind != j->ts.kind)
kono
parents:
diff changeset
1341 {
kono
parents:
diff changeset
1342 if (i->ts.kind == gfc_kind_max (i, j))
kono
parents:
diff changeset
1343 gfc_convert_type (j, &i->ts, 2);
kono
parents:
diff changeset
1344 else
kono
parents:
diff changeset
1345 gfc_convert_type (i, &j->ts, 2);
kono
parents:
diff changeset
1346 }
kono
parents:
diff changeset
1347
kono
parents:
diff changeset
1348 f->ts = i->ts;
kono
parents:
diff changeset
1349 f->value.function.name = gfc_get_string ("__ior_%d", i->ts.kind);
kono
parents:
diff changeset
1350 }
kono
parents:
diff changeset
1351
kono
parents:
diff changeset
1352
kono
parents:
diff changeset
1353 void
kono
parents:
diff changeset
1354 gfc_resolve_index_func (gfc_expr *f, gfc_expr *str,
kono
parents:
diff changeset
1355 gfc_expr *sub_str ATTRIBUTE_UNUSED, gfc_expr *back,
kono
parents:
diff changeset
1356 gfc_expr *kind)
kono
parents:
diff changeset
1357 {
kono
parents:
diff changeset
1358 gfc_typespec ts;
kono
parents:
diff changeset
1359 gfc_clear_ts (&ts);
kono
parents:
diff changeset
1360
kono
parents:
diff changeset
1361 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
1362 if (kind)
kono
parents:
diff changeset
1363 f->ts.kind = mpz_get_si (kind->value.integer);
kono
parents:
diff changeset
1364 else
kono
parents:
diff changeset
1365 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
1366
kono
parents:
diff changeset
1367 if (back && back->ts.kind != gfc_default_integer_kind)
kono
parents:
diff changeset
1368 {
kono
parents:
diff changeset
1369 ts.type = BT_LOGICAL;
kono
parents:
diff changeset
1370 ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
1371 ts.u.derived = NULL;
kono
parents:
diff changeset
1372 ts.u.cl = NULL;
kono
parents:
diff changeset
1373 gfc_convert_type (back, &ts, 2);
kono
parents:
diff changeset
1374 }
kono
parents:
diff changeset
1375
kono
parents:
diff changeset
1376 f->value.function.name
kono
parents:
diff changeset
1377 = gfc_get_string ("__index_%d_i%d", str->ts.kind, f->ts.kind);
kono
parents:
diff changeset
1378 }
kono
parents:
diff changeset
1379
kono
parents:
diff changeset
1380
kono
parents:
diff changeset
1381 void
kono
parents:
diff changeset
1382 gfc_resolve_int (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
kono
parents:
diff changeset
1383 {
kono
parents:
diff changeset
1384 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
1385 f->ts.kind = (kind == NULL)
kono
parents:
diff changeset
1386 ? gfc_default_integer_kind : mpz_get_si (kind->value.integer);
kono
parents:
diff changeset
1387 f->value.function.name
kono
parents:
diff changeset
1388 = gfc_get_string ("__int_%d_%c%d", f->ts.kind,
kono
parents:
diff changeset
1389 gfc_type_letter (a->ts.type), a->ts.kind);
kono
parents:
diff changeset
1390 }
kono
parents:
diff changeset
1391
kono
parents:
diff changeset
1392
kono
parents:
diff changeset
1393 void
kono
parents:
diff changeset
1394 gfc_resolve_int2 (gfc_expr *f, gfc_expr *a)
kono
parents:
diff changeset
1395 {
kono
parents:
diff changeset
1396 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
1397 f->ts.kind = 2;
kono
parents:
diff changeset
1398 f->value.function.name
kono
parents:
diff changeset
1399 = gfc_get_string ("__int_%d_%c%d", f->ts.kind,
kono
parents:
diff changeset
1400 gfc_type_letter (a->ts.type), a->ts.kind);
kono
parents:
diff changeset
1401 }
kono
parents:
diff changeset
1402
kono
parents:
diff changeset
1403
kono
parents:
diff changeset
1404 void
kono
parents:
diff changeset
1405 gfc_resolve_int8 (gfc_expr *f, gfc_expr *a)
kono
parents:
diff changeset
1406 {
kono
parents:
diff changeset
1407 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
1408 f->ts.kind = 8;
kono
parents:
diff changeset
1409 f->value.function.name
kono
parents:
diff changeset
1410 = gfc_get_string ("__int_%d_%c%d", f->ts.kind,
kono
parents:
diff changeset
1411 gfc_type_letter (a->ts.type), a->ts.kind);
kono
parents:
diff changeset
1412 }
kono
parents:
diff changeset
1413
kono
parents:
diff changeset
1414
kono
parents:
diff changeset
1415 void
kono
parents:
diff changeset
1416 gfc_resolve_long (gfc_expr *f, gfc_expr *a)
kono
parents:
diff changeset
1417 {
kono
parents:
diff changeset
1418 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
1419 f->ts.kind = 4;
kono
parents:
diff changeset
1420 f->value.function.name
kono
parents:
diff changeset
1421 = gfc_get_string ("__int_%d_%c%d", f->ts.kind,
kono
parents:
diff changeset
1422 gfc_type_letter (a->ts.type), a->ts.kind);
kono
parents:
diff changeset
1423 }
kono
parents:
diff changeset
1424
kono
parents:
diff changeset
1425
kono
parents:
diff changeset
1426 void
kono
parents:
diff changeset
1427 gfc_resolve_iparity (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
kono
parents:
diff changeset
1428 {
kono
parents:
diff changeset
1429 resolve_transformational ("iparity", f, array, dim, mask);
kono
parents:
diff changeset
1430 }
kono
parents:
diff changeset
1431
kono
parents:
diff changeset
1432
kono
parents:
diff changeset
1433 void
kono
parents:
diff changeset
1434 gfc_resolve_isatty (gfc_expr *f, gfc_expr *u)
kono
parents:
diff changeset
1435 {
kono
parents:
diff changeset
1436 gfc_typespec ts;
kono
parents:
diff changeset
1437 gfc_clear_ts (&ts);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1438
111
kono
parents:
diff changeset
1439 f->ts.type = BT_LOGICAL;
kono
parents:
diff changeset
1440 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
1441 if (u->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
1442 {
kono
parents:
diff changeset
1443 ts.type = BT_INTEGER;
kono
parents:
diff changeset
1444 ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
1445 ts.u.derived = NULL;
kono
parents:
diff changeset
1446 ts.u.cl = NULL;
kono
parents:
diff changeset
1447 gfc_convert_type (u, &ts, 2);
kono
parents:
diff changeset
1448 }
kono
parents:
diff changeset
1449
kono
parents:
diff changeset
1450 f->value.function.name = gfc_get_string (PREFIX ("isatty_l%d"), f->ts.kind);
kono
parents:
diff changeset
1451 }
kono
parents:
diff changeset
1452
kono
parents:
diff changeset
1453
kono
parents:
diff changeset
1454 void
kono
parents:
diff changeset
1455 gfc_resolve_ishft (gfc_expr *f, gfc_expr *i, gfc_expr *shift)
kono
parents:
diff changeset
1456 {
kono
parents:
diff changeset
1457 f->ts = i->ts;
kono
parents:
diff changeset
1458 f->value.function.name
kono
parents:
diff changeset
1459 = gfc_get_string ("__ishft_%d_%d", i->ts.kind, shift->ts.kind);
kono
parents:
diff changeset
1460 }
kono
parents:
diff changeset
1461
kono
parents:
diff changeset
1462
kono
parents:
diff changeset
1463 void
kono
parents:
diff changeset
1464 gfc_resolve_rshift (gfc_expr *f, gfc_expr *i, gfc_expr *shift)
kono
parents:
diff changeset
1465 {
kono
parents:
diff changeset
1466 f->ts = i->ts;
kono
parents:
diff changeset
1467 f->value.function.name
kono
parents:
diff changeset
1468 = gfc_get_string ("__rshift_%d_%d", i->ts.kind, shift->ts.kind);
kono
parents:
diff changeset
1469 }
kono
parents:
diff changeset
1470
kono
parents:
diff changeset
1471
kono
parents:
diff changeset
1472 void
kono
parents:
diff changeset
1473 gfc_resolve_lshift (gfc_expr *f, gfc_expr *i, gfc_expr *shift)
kono
parents:
diff changeset
1474 {
kono
parents:
diff changeset
1475 f->ts = i->ts;
kono
parents:
diff changeset
1476 f->value.function.name
kono
parents:
diff changeset
1477 = gfc_get_string ("__lshift_%d_%d", i->ts.kind, shift->ts.kind);
kono
parents:
diff changeset
1478 }
kono
parents:
diff changeset
1479
kono
parents:
diff changeset
1480
kono
parents:
diff changeset
1481 void
kono
parents:
diff changeset
1482 gfc_resolve_ishftc (gfc_expr *f, gfc_expr *i, gfc_expr *shift, gfc_expr *size)
kono
parents:
diff changeset
1483 {
kono
parents:
diff changeset
1484 int s_kind;
kono
parents:
diff changeset
1485
kono
parents:
diff changeset
1486 s_kind = (size == NULL) ? gfc_default_integer_kind : size->ts.kind;
kono
parents:
diff changeset
1487
kono
parents:
diff changeset
1488 f->ts = i->ts;
kono
parents:
diff changeset
1489 f->value.function.name
kono
parents:
diff changeset
1490 = gfc_get_string ("__ishftc_%d_%d_%d", i->ts.kind, shift->ts.kind, s_kind);
kono
parents:
diff changeset
1491 }
kono
parents:
diff changeset
1492
kono
parents:
diff changeset
1493
kono
parents:
diff changeset
1494 void
kono
parents:
diff changeset
1495 gfc_resolve_lbound (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
kono
parents:
diff changeset
1496 {
kono
parents:
diff changeset
1497 resolve_bound (f, array, dim, kind, "__lbound", false);
kono
parents:
diff changeset
1498 }
kono
parents:
diff changeset
1499
kono
parents:
diff changeset
1500
kono
parents:
diff changeset
1501 void
kono
parents:
diff changeset
1502 gfc_resolve_lcobound (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
kono
parents:
diff changeset
1503 {
kono
parents:
diff changeset
1504 resolve_bound (f, array, dim, kind, "__lcobound", true);
kono
parents:
diff changeset
1505 }
kono
parents:
diff changeset
1506
kono
parents:
diff changeset
1507
kono
parents:
diff changeset
1508 void
kono
parents:
diff changeset
1509 gfc_resolve_len (gfc_expr *f, gfc_expr *string, gfc_expr *kind)
kono
parents:
diff changeset
1510 {
kono
parents:
diff changeset
1511 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
1512 if (kind)
kono
parents:
diff changeset
1513 f->ts.kind = mpz_get_si (kind->value.integer);
kono
parents:
diff changeset
1514 else
kono
parents:
diff changeset
1515 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
1516 f->value.function.name
kono
parents:
diff changeset
1517 = gfc_get_string ("__len_%d_i%d", string->ts.kind,
kono
parents:
diff changeset
1518 gfc_default_integer_kind);
kono
parents:
diff changeset
1519 }
kono
parents:
diff changeset
1520
kono
parents:
diff changeset
1521
kono
parents:
diff changeset
1522 void
kono
parents:
diff changeset
1523 gfc_resolve_len_trim (gfc_expr *f, gfc_expr *string, gfc_expr *kind)
kono
parents:
diff changeset
1524 {
kono
parents:
diff changeset
1525 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
1526 if (kind)
kono
parents:
diff changeset
1527 f->ts.kind = mpz_get_si (kind->value.integer);
kono
parents:
diff changeset
1528 else
kono
parents:
diff changeset
1529 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
1530 f->value.function.name = gfc_get_string ("__len_trim%d", string->ts.kind);
kono
parents:
diff changeset
1531 }
kono
parents:
diff changeset
1532
kono
parents:
diff changeset
1533
kono
parents:
diff changeset
1534 void
kono
parents:
diff changeset
1535 gfc_resolve_lgamma (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
1536 {
kono
parents:
diff changeset
1537 f->ts = x->ts;
kono
parents:
diff changeset
1538 f->value.function.name
kono
parents:
diff changeset
1539 = gfc_get_string ("__lgamma_%d", x->ts.kind);
kono
parents:
diff changeset
1540 }
kono
parents:
diff changeset
1541
kono
parents:
diff changeset
1542
kono
parents:
diff changeset
1543 void
kono
parents:
diff changeset
1544 gfc_resolve_link (gfc_expr *f, gfc_expr *p1 ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
1545 gfc_expr *p2 ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
1546 {
kono
parents:
diff changeset
1547 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
1548 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
1549 f->value.function.name = gfc_get_string (PREFIX ("link_i%d"), f->ts.kind);
kono
parents:
diff changeset
1550 }
kono
parents:
diff changeset
1551
kono
parents:
diff changeset
1552
kono
parents:
diff changeset
1553 void
kono
parents:
diff changeset
1554 gfc_resolve_loc (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
1555 {
kono
parents:
diff changeset
1556 f->ts.type= BT_INTEGER;
kono
parents:
diff changeset
1557 f->ts.kind = gfc_index_integer_kind;
kono
parents:
diff changeset
1558 f->value.function.name = gfc_get_string ("__loc_%d", x->ts.kind);
kono
parents:
diff changeset
1559 }
kono
parents:
diff changeset
1560
kono
parents:
diff changeset
1561
kono
parents:
diff changeset
1562 void
kono
parents:
diff changeset
1563 gfc_resolve_log (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
1564 {
kono
parents:
diff changeset
1565 f->ts = x->ts;
kono
parents:
diff changeset
1566 f->value.function.name
kono
parents:
diff changeset
1567 = gfc_get_string ("__log_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
kono
parents:
diff changeset
1568 }
kono
parents:
diff changeset
1569
kono
parents:
diff changeset
1570
kono
parents:
diff changeset
1571 void
kono
parents:
diff changeset
1572 gfc_resolve_log10 (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
1573 {
kono
parents:
diff changeset
1574 f->ts = x->ts;
kono
parents:
diff changeset
1575 f->value.function.name
kono
parents:
diff changeset
1576 = gfc_get_string ("__log10_%c%d", gfc_type_letter (x->ts.type),
kono
parents:
diff changeset
1577 x->ts.kind);
kono
parents:
diff changeset
1578 }
kono
parents:
diff changeset
1579
kono
parents:
diff changeset
1580
kono
parents:
diff changeset
1581 void
kono
parents:
diff changeset
1582 gfc_resolve_logical (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
kono
parents:
diff changeset
1583 {
kono
parents:
diff changeset
1584 f->ts.type = BT_LOGICAL;
kono
parents:
diff changeset
1585 f->ts.kind = (kind == NULL)
kono
parents:
diff changeset
1586 ? gfc_default_logical_kind : mpz_get_si (kind->value.integer);
kono
parents:
diff changeset
1587 f->rank = a->rank;
kono
parents:
diff changeset
1588
kono
parents:
diff changeset
1589 f->value.function.name
kono
parents:
diff changeset
1590 = gfc_get_string ("__logical_%d_%c%d", f->ts.kind,
kono
parents:
diff changeset
1591 gfc_type_letter (a->ts.type), a->ts.kind);
kono
parents:
diff changeset
1592 }
kono
parents:
diff changeset
1593
kono
parents:
diff changeset
1594
kono
parents:
diff changeset
1595 void
kono
parents:
diff changeset
1596 gfc_resolve_matmul (gfc_expr *f, gfc_expr *a, gfc_expr *b)
kono
parents:
diff changeset
1597 {
kono
parents:
diff changeset
1598 gfc_expr temp;
kono
parents:
diff changeset
1599
kono
parents:
diff changeset
1600 if (a->ts.type == BT_LOGICAL && b->ts.type == BT_LOGICAL)
kono
parents:
diff changeset
1601 {
kono
parents:
diff changeset
1602 f->ts.type = BT_LOGICAL;
kono
parents:
diff changeset
1603 f->ts.kind = gfc_default_logical_kind;
kono
parents:
diff changeset
1604 }
kono
parents:
diff changeset
1605 else
kono
parents:
diff changeset
1606 {
kono
parents:
diff changeset
1607 temp.expr_type = EXPR_OP;
kono
parents:
diff changeset
1608 gfc_clear_ts (&temp.ts);
kono
parents:
diff changeset
1609 temp.value.op.op = INTRINSIC_NONE;
kono
parents:
diff changeset
1610 temp.value.op.op1 = a;
kono
parents:
diff changeset
1611 temp.value.op.op2 = b;
kono
parents:
diff changeset
1612 gfc_type_convert_binary (&temp, 1);
kono
parents:
diff changeset
1613 f->ts = temp.ts;
kono
parents:
diff changeset
1614 }
kono
parents:
diff changeset
1615
kono
parents:
diff changeset
1616 f->rank = (a->rank == 2 && b->rank == 2) ? 2 : 1;
kono
parents:
diff changeset
1617
kono
parents:
diff changeset
1618 if (a->rank == 2 && b->rank == 2)
kono
parents:
diff changeset
1619 {
kono
parents:
diff changeset
1620 if (a->shape && b->shape)
kono
parents:
diff changeset
1621 {
kono
parents:
diff changeset
1622 f->shape = gfc_get_shape (f->rank);
kono
parents:
diff changeset
1623 mpz_init_set (f->shape[0], a->shape[0]);
kono
parents:
diff changeset
1624 mpz_init_set (f->shape[1], b->shape[1]);
kono
parents:
diff changeset
1625 }
kono
parents:
diff changeset
1626 }
kono
parents:
diff changeset
1627 else if (a->rank == 1)
kono
parents:
diff changeset
1628 {
kono
parents:
diff changeset
1629 if (b->shape)
kono
parents:
diff changeset
1630 {
kono
parents:
diff changeset
1631 f->shape = gfc_get_shape (f->rank);
kono
parents:
diff changeset
1632 mpz_init_set (f->shape[0], b->shape[1]);
kono
parents:
diff changeset
1633 }
kono
parents:
diff changeset
1634 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1635 else
111
kono
parents:
diff changeset
1636 {
kono
parents:
diff changeset
1637 /* b->rank == 1 and a->rank == 2 here, all other cases have
kono
parents:
diff changeset
1638 been caught in check.c. */
kono
parents:
diff changeset
1639 if (a->shape)
kono
parents:
diff changeset
1640 {
kono
parents:
diff changeset
1641 f->shape = gfc_get_shape (f->rank);
kono
parents:
diff changeset
1642 mpz_init_set (f->shape[0], a->shape[0]);
kono
parents:
diff changeset
1643 }
kono
parents:
diff changeset
1644 }
kono
parents:
diff changeset
1645
kono
parents:
diff changeset
1646 f->value.function.name
kono
parents:
diff changeset
1647 = gfc_get_string (PREFIX ("matmul_%c%d"), gfc_type_letter (f->ts.type),
kono
parents:
diff changeset
1648 f->ts.kind);
kono
parents:
diff changeset
1649 }
kono
parents:
diff changeset
1650
kono
parents:
diff changeset
1651
kono
parents:
diff changeset
1652 static void
kono
parents:
diff changeset
1653 gfc_resolve_minmax (const char *name, gfc_expr *f, gfc_actual_arglist *args)
kono
parents:
diff changeset
1654 {
kono
parents:
diff changeset
1655 gfc_actual_arglist *a;
kono
parents:
diff changeset
1656
kono
parents:
diff changeset
1657 f->ts.type = args->expr->ts.type;
kono
parents:
diff changeset
1658 f->ts.kind = args->expr->ts.kind;
kono
parents:
diff changeset
1659 /* Find the largest type kind. */
kono
parents:
diff changeset
1660 for (a = args->next; a; a = a->next)
kono
parents:
diff changeset
1661 {
kono
parents:
diff changeset
1662 if (a->expr->ts.kind > f->ts.kind)
kono
parents:
diff changeset
1663 f->ts.kind = a->expr->ts.kind;
kono
parents:
diff changeset
1664 }
kono
parents:
diff changeset
1665
kono
parents:
diff changeset
1666 /* Convert all parameters to the required kind. */
kono
parents:
diff changeset
1667 for (a = args; a; a = a->next)
kono
parents:
diff changeset
1668 {
kono
parents:
diff changeset
1669 if (a->expr->ts.kind != f->ts.kind)
kono
parents:
diff changeset
1670 gfc_convert_type (a->expr, &f->ts, 2);
kono
parents:
diff changeset
1671 }
kono
parents:
diff changeset
1672
kono
parents:
diff changeset
1673 f->value.function.name
kono
parents:
diff changeset
1674 = gfc_get_string (name, gfc_type_letter (f->ts.type), f->ts.kind);
kono
parents:
diff changeset
1675 }
kono
parents:
diff changeset
1676
kono
parents:
diff changeset
1677
kono
parents:
diff changeset
1678 void
kono
parents:
diff changeset
1679 gfc_resolve_max (gfc_expr *f, gfc_actual_arglist *args)
kono
parents:
diff changeset
1680 {
kono
parents:
diff changeset
1681 gfc_resolve_minmax ("__max_%c%d", f, args);
kono
parents:
diff changeset
1682 }
kono
parents:
diff changeset
1683
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1684 /* The smallest kind for which a minloc and maxloc implementation exists. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1685
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1686 #define MINMAXLOC_MIN_KIND 4
111
kono
parents:
diff changeset
1687
kono
parents:
diff changeset
1688 void
kono
parents:
diff changeset
1689 gfc_resolve_maxloc (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1690 gfc_expr *mask, gfc_expr *kind, gfc_expr *back)
111
kono
parents:
diff changeset
1691 {
kono
parents:
diff changeset
1692 const char *name;
kono
parents:
diff changeset
1693 int i, j, idim;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1694 int fkind;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1695 int d_num;
111
kono
parents:
diff changeset
1696
kono
parents:
diff changeset
1697 f->ts.type = BT_INTEGER;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1698
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1699 /* The library versions only exist for kinds 4, 8 and 16. For smaller kinds,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1700 we do a type conversion further down. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1701 if (kind)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1702 fkind = mpz_get_si (kind->value.integer);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1703 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1704 fkind = gfc_default_integer_kind;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1705
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1706 if (fkind < MINMAXLOC_MIN_KIND)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1707 f->ts.kind = MINMAXLOC_MIN_KIND;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1708 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1709 f->ts.kind = fkind;
111
kono
parents:
diff changeset
1710
kono
parents:
diff changeset
1711 if (dim == NULL)
kono
parents:
diff changeset
1712 {
kono
parents:
diff changeset
1713 f->rank = 1;
kono
parents:
diff changeset
1714 f->shape = gfc_get_shape (1);
kono
parents:
diff changeset
1715 mpz_init_set_si (f->shape[0], array->rank);
kono
parents:
diff changeset
1716 }
kono
parents:
diff changeset
1717 else
kono
parents:
diff changeset
1718 {
kono
parents:
diff changeset
1719 f->rank = array->rank - 1;
kono
parents:
diff changeset
1720 gfc_resolve_dim_arg (dim);
kono
parents:
diff changeset
1721 if (array->shape && dim->expr_type == EXPR_CONSTANT)
kono
parents:
diff changeset
1722 {
kono
parents:
diff changeset
1723 idim = (int) mpz_get_si (dim->value.integer);
kono
parents:
diff changeset
1724 f->shape = gfc_get_shape (f->rank);
kono
parents:
diff changeset
1725 for (i = 0, j = 0; i < f->rank; i++, j++)
kono
parents:
diff changeset
1726 {
kono
parents:
diff changeset
1727 if (i == (idim - 1))
kono
parents:
diff changeset
1728 j++;
kono
parents:
diff changeset
1729 mpz_init_set (f->shape[i], array->shape[j]);
kono
parents:
diff changeset
1730 }
kono
parents:
diff changeset
1731 }
kono
parents:
diff changeset
1732 }
kono
parents:
diff changeset
1733
kono
parents:
diff changeset
1734 if (mask)
kono
parents:
diff changeset
1735 {
kono
parents:
diff changeset
1736 if (mask->rank == 0)
kono
parents:
diff changeset
1737 name = "smaxloc";
kono
parents:
diff changeset
1738 else
kono
parents:
diff changeset
1739 name = "mmaxloc";
kono
parents:
diff changeset
1740
kono
parents:
diff changeset
1741 resolve_mask_arg (mask);
kono
parents:
diff changeset
1742 }
kono
parents:
diff changeset
1743 else
kono
parents:
diff changeset
1744 name = "maxloc";
kono
parents:
diff changeset
1745
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1746 if (dim)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1747 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1748 if (array->ts.type != BT_CHARACTER || f->rank != 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1749 d_num = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1750 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1751 d_num = 2;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1752 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1753 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1754 d_num = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1755
111
kono
parents:
diff changeset
1756 f->value.function.name
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1757 = gfc_get_string (PREFIX ("%s%d_%d_%c%d"), name, d_num, f->ts.kind,
111
kono
parents:
diff changeset
1758 gfc_type_letter (array->ts.type), array->ts.kind);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1759
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1760 if (kind)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1761 fkind = mpz_get_si (kind->value.integer);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1762 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1763 fkind = gfc_default_integer_kind;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1764
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1765 if (fkind != f->ts.kind)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1766 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1767 gfc_typespec ts;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1768 gfc_clear_ts (&ts);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1769
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1770 ts.type = BT_INTEGER;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1771 ts.kind = fkind;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1772 gfc_convert_type_warn (f, &ts, 2, 0);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1773 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1774
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1775 if (back->ts.kind != gfc_logical_4_kind)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1776 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1777 gfc_typespec ts;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1778 gfc_clear_ts (&ts);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1779 ts.type = BT_LOGICAL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1780 ts.kind = gfc_logical_4_kind;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1781 gfc_convert_type_warn (back, &ts, 2, 0);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1782 }
111
kono
parents:
diff changeset
1783 }
kono
parents:
diff changeset
1784
kono
parents:
diff changeset
1785
kono
parents:
diff changeset
1786 void
kono
parents:
diff changeset
1787 gfc_resolve_maxval (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
kono
parents:
diff changeset
1788 gfc_expr *mask)
kono
parents:
diff changeset
1789 {
kono
parents:
diff changeset
1790 const char *name;
kono
parents:
diff changeset
1791 int i, j, idim;
kono
parents:
diff changeset
1792
kono
parents:
diff changeset
1793 f->ts = array->ts;
kono
parents:
diff changeset
1794
kono
parents:
diff changeset
1795 if (dim != NULL)
kono
parents:
diff changeset
1796 {
kono
parents:
diff changeset
1797 f->rank = array->rank - 1;
kono
parents:
diff changeset
1798 gfc_resolve_dim_arg (dim);
kono
parents:
diff changeset
1799
kono
parents:
diff changeset
1800 if (f->rank && array->shape && dim->expr_type == EXPR_CONSTANT)
kono
parents:
diff changeset
1801 {
kono
parents:
diff changeset
1802 idim = (int) mpz_get_si (dim->value.integer);
kono
parents:
diff changeset
1803 f->shape = gfc_get_shape (f->rank);
kono
parents:
diff changeset
1804 for (i = 0, j = 0; i < f->rank; i++, j++)
kono
parents:
diff changeset
1805 {
kono
parents:
diff changeset
1806 if (i == (idim - 1))
kono
parents:
diff changeset
1807 j++;
kono
parents:
diff changeset
1808 mpz_init_set (f->shape[i], array->shape[j]);
kono
parents:
diff changeset
1809 }
kono
parents:
diff changeset
1810 }
kono
parents:
diff changeset
1811 }
kono
parents:
diff changeset
1812
kono
parents:
diff changeset
1813 if (mask)
kono
parents:
diff changeset
1814 {
kono
parents:
diff changeset
1815 if (mask->rank == 0)
kono
parents:
diff changeset
1816 name = "smaxval";
kono
parents:
diff changeset
1817 else
kono
parents:
diff changeset
1818 name = "mmaxval";
kono
parents:
diff changeset
1819
kono
parents:
diff changeset
1820 resolve_mask_arg (mask);
kono
parents:
diff changeset
1821 }
kono
parents:
diff changeset
1822 else
kono
parents:
diff changeset
1823 name = "maxval";
kono
parents:
diff changeset
1824
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1825 if (array->ts.type != BT_CHARACTER)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1826 f->value.function.name
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1827 = gfc_get_string (PREFIX ("%s_%c%d"), name,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1828 gfc_type_letter (array->ts.type), array->ts.kind);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1829 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1830 f->value.function.name
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1831 = gfc_get_string (PREFIX ("%s%d_%c%d"), name, f->rank != 0,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1832 gfc_type_letter (array->ts.type), array->ts.kind);
111
kono
parents:
diff changeset
1833 }
kono
parents:
diff changeset
1834
kono
parents:
diff changeset
1835
kono
parents:
diff changeset
1836 void
kono
parents:
diff changeset
1837 gfc_resolve_mclock (gfc_expr *f)
kono
parents:
diff changeset
1838 {
kono
parents:
diff changeset
1839 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
1840 f->ts.kind = 4;
kono
parents:
diff changeset
1841 f->value.function.name = PREFIX ("mclock");
kono
parents:
diff changeset
1842 }
kono
parents:
diff changeset
1843
kono
parents:
diff changeset
1844
kono
parents:
diff changeset
1845 void
kono
parents:
diff changeset
1846 gfc_resolve_mclock8 (gfc_expr *f)
kono
parents:
diff changeset
1847 {
kono
parents:
diff changeset
1848 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
1849 f->ts.kind = 8;
kono
parents:
diff changeset
1850 f->value.function.name = PREFIX ("mclock8");
kono
parents:
diff changeset
1851 }
kono
parents:
diff changeset
1852
kono
parents:
diff changeset
1853
kono
parents:
diff changeset
1854 void
kono
parents:
diff changeset
1855 gfc_resolve_mask (gfc_expr *f, gfc_expr *i ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
1856 gfc_expr *kind)
kono
parents:
diff changeset
1857 {
kono
parents:
diff changeset
1858 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
1859 f->ts.kind = kind ? mpz_get_si (kind->value.integer)
kono
parents:
diff changeset
1860 : gfc_default_integer_kind;
kono
parents:
diff changeset
1861
kono
parents:
diff changeset
1862 if (f->value.function.isym->id == GFC_ISYM_MASKL)
kono
parents:
diff changeset
1863 f->value.function.name = gfc_get_string ("__maskl_i%d", f->ts.kind);
kono
parents:
diff changeset
1864 else
kono
parents:
diff changeset
1865 f->value.function.name = gfc_get_string ("__maskr_i%d", f->ts.kind);
kono
parents:
diff changeset
1866 }
kono
parents:
diff changeset
1867
kono
parents:
diff changeset
1868
kono
parents:
diff changeset
1869 void
kono
parents:
diff changeset
1870 gfc_resolve_merge (gfc_expr *f, gfc_expr *tsource,
kono
parents:
diff changeset
1871 gfc_expr *fsource ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
1872 gfc_expr *mask ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
1873 {
kono
parents:
diff changeset
1874 if (tsource->ts.type == BT_CHARACTER && tsource->ref)
kono
parents:
diff changeset
1875 gfc_resolve_substring_charlen (tsource);
kono
parents:
diff changeset
1876
kono
parents:
diff changeset
1877 if (fsource->ts.type == BT_CHARACTER && fsource->ref)
kono
parents:
diff changeset
1878 gfc_resolve_substring_charlen (fsource);
kono
parents:
diff changeset
1879
kono
parents:
diff changeset
1880 if (tsource->ts.type == BT_CHARACTER)
kono
parents:
diff changeset
1881 check_charlen_present (tsource);
kono
parents:
diff changeset
1882
kono
parents:
diff changeset
1883 f->ts = tsource->ts;
kono
parents:
diff changeset
1884 f->value.function.name
kono
parents:
diff changeset
1885 = gfc_get_string ("__merge_%c%d", gfc_type_letter (tsource->ts.type),
kono
parents:
diff changeset
1886 tsource->ts.kind);
kono
parents:
diff changeset
1887 }
kono
parents:
diff changeset
1888
kono
parents:
diff changeset
1889
kono
parents:
diff changeset
1890 void
kono
parents:
diff changeset
1891 gfc_resolve_merge_bits (gfc_expr *f, gfc_expr *i,
kono
parents:
diff changeset
1892 gfc_expr *j ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
1893 gfc_expr *mask ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
1894 {
kono
parents:
diff changeset
1895 f->ts = i->ts;
kono
parents:
diff changeset
1896 f->value.function.name = gfc_get_string ("__merge_bits_i%d", i->ts.kind);
kono
parents:
diff changeset
1897 }
kono
parents:
diff changeset
1898
kono
parents:
diff changeset
1899
kono
parents:
diff changeset
1900 void
kono
parents:
diff changeset
1901 gfc_resolve_min (gfc_expr *f, gfc_actual_arglist *args)
kono
parents:
diff changeset
1902 {
kono
parents:
diff changeset
1903 gfc_resolve_minmax ("__min_%c%d", f, args);
kono
parents:
diff changeset
1904 }
kono
parents:
diff changeset
1905
kono
parents:
diff changeset
1906
kono
parents:
diff changeset
1907 void
kono
parents:
diff changeset
1908 gfc_resolve_minloc (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1909 gfc_expr *mask, gfc_expr *kind, gfc_expr *back)
111
kono
parents:
diff changeset
1910 {
kono
parents:
diff changeset
1911 const char *name;
kono
parents:
diff changeset
1912 int i, j, idim;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1913 int fkind;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1914 int d_num;
111
kono
parents:
diff changeset
1915
kono
parents:
diff changeset
1916 f->ts.type = BT_INTEGER;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1917
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1918 /* The library versions only exist for kinds 4, 8 and 16. For smaller kinds,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1919 we do a type conversion further down. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1920 if (kind)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1921 fkind = mpz_get_si (kind->value.integer);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1922 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1923 fkind = gfc_default_integer_kind;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1924
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1925 if (fkind < MINMAXLOC_MIN_KIND)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1926 f->ts.kind = MINMAXLOC_MIN_KIND;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1927 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1928 f->ts.kind = fkind;
111
kono
parents:
diff changeset
1929
kono
parents:
diff changeset
1930 if (dim == NULL)
kono
parents:
diff changeset
1931 {
kono
parents:
diff changeset
1932 f->rank = 1;
kono
parents:
diff changeset
1933 f->shape = gfc_get_shape (1);
kono
parents:
diff changeset
1934 mpz_init_set_si (f->shape[0], array->rank);
kono
parents:
diff changeset
1935 }
kono
parents:
diff changeset
1936 else
kono
parents:
diff changeset
1937 {
kono
parents:
diff changeset
1938 f->rank = array->rank - 1;
kono
parents:
diff changeset
1939 gfc_resolve_dim_arg (dim);
kono
parents:
diff changeset
1940 if (array->shape && dim->expr_type == EXPR_CONSTANT)
kono
parents:
diff changeset
1941 {
kono
parents:
diff changeset
1942 idim = (int) mpz_get_si (dim->value.integer);
kono
parents:
diff changeset
1943 f->shape = gfc_get_shape (f->rank);
kono
parents:
diff changeset
1944 for (i = 0, j = 0; i < f->rank; i++, j++)
kono
parents:
diff changeset
1945 {
kono
parents:
diff changeset
1946 if (i == (idim - 1))
kono
parents:
diff changeset
1947 j++;
kono
parents:
diff changeset
1948 mpz_init_set (f->shape[i], array->shape[j]);
kono
parents:
diff changeset
1949 }
kono
parents:
diff changeset
1950 }
kono
parents:
diff changeset
1951 }
kono
parents:
diff changeset
1952
kono
parents:
diff changeset
1953 if (mask)
kono
parents:
diff changeset
1954 {
kono
parents:
diff changeset
1955 if (mask->rank == 0)
kono
parents:
diff changeset
1956 name = "sminloc";
kono
parents:
diff changeset
1957 else
kono
parents:
diff changeset
1958 name = "mminloc";
kono
parents:
diff changeset
1959
kono
parents:
diff changeset
1960 resolve_mask_arg (mask);
kono
parents:
diff changeset
1961 }
kono
parents:
diff changeset
1962 else
kono
parents:
diff changeset
1963 name = "minloc";
kono
parents:
diff changeset
1964
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1965 if (dim)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1966 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1967 if (array->ts.type != BT_CHARACTER || f->rank != 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1968 d_num = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1969 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1970 d_num = 2;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1971 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1972 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1973 d_num = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1974
111
kono
parents:
diff changeset
1975 f->value.function.name
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1976 = gfc_get_string (PREFIX ("%s%d_%d_%c%d"), name, d_num, f->ts.kind,
111
kono
parents:
diff changeset
1977 gfc_type_letter (array->ts.type), array->ts.kind);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1978
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1979 if (fkind != f->ts.kind)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1980 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1981 gfc_typespec ts;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1982 gfc_clear_ts (&ts);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1983
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1984 ts.type = BT_INTEGER;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1985 ts.kind = fkind;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1986 gfc_convert_type_warn (f, &ts, 2, 0);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1987 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1988
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1989 if (back->ts.kind != gfc_logical_4_kind)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1990 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1991 gfc_typespec ts;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1992 gfc_clear_ts (&ts);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1993 ts.type = BT_LOGICAL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1994 ts.kind = gfc_logical_4_kind;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1995 gfc_convert_type_warn (back, &ts, 2, 0);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1996 }
111
kono
parents:
diff changeset
1997 }
kono
parents:
diff changeset
1998
kono
parents:
diff changeset
1999
kono
parents:
diff changeset
2000 void
kono
parents:
diff changeset
2001 gfc_resolve_minval (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
kono
parents:
diff changeset
2002 gfc_expr *mask)
kono
parents:
diff changeset
2003 {
kono
parents:
diff changeset
2004 const char *name;
kono
parents:
diff changeset
2005 int i, j, idim;
kono
parents:
diff changeset
2006
kono
parents:
diff changeset
2007 f->ts = array->ts;
kono
parents:
diff changeset
2008
kono
parents:
diff changeset
2009 if (dim != NULL)
kono
parents:
diff changeset
2010 {
kono
parents:
diff changeset
2011 f->rank = array->rank - 1;
kono
parents:
diff changeset
2012 gfc_resolve_dim_arg (dim);
kono
parents:
diff changeset
2013
kono
parents:
diff changeset
2014 if (f->rank && array->shape && dim->expr_type == EXPR_CONSTANT)
kono
parents:
diff changeset
2015 {
kono
parents:
diff changeset
2016 idim = (int) mpz_get_si (dim->value.integer);
kono
parents:
diff changeset
2017 f->shape = gfc_get_shape (f->rank);
kono
parents:
diff changeset
2018 for (i = 0, j = 0; i < f->rank; i++, j++)
kono
parents:
diff changeset
2019 {
kono
parents:
diff changeset
2020 if (i == (idim - 1))
kono
parents:
diff changeset
2021 j++;
kono
parents:
diff changeset
2022 mpz_init_set (f->shape[i], array->shape[j]);
kono
parents:
diff changeset
2023 }
kono
parents:
diff changeset
2024 }
kono
parents:
diff changeset
2025 }
kono
parents:
diff changeset
2026
kono
parents:
diff changeset
2027 if (mask)
kono
parents:
diff changeset
2028 {
kono
parents:
diff changeset
2029 if (mask->rank == 0)
kono
parents:
diff changeset
2030 name = "sminval";
kono
parents:
diff changeset
2031 else
kono
parents:
diff changeset
2032 name = "mminval";
kono
parents:
diff changeset
2033
kono
parents:
diff changeset
2034 resolve_mask_arg (mask);
kono
parents:
diff changeset
2035 }
kono
parents:
diff changeset
2036 else
kono
parents:
diff changeset
2037 name = "minval";
kono
parents:
diff changeset
2038
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2039 if (array->ts.type != BT_CHARACTER)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2040 f->value.function.name
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2041 = gfc_get_string (PREFIX ("%s_%c%d"), name,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2042 gfc_type_letter (array->ts.type), array->ts.kind);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2043 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2044 f->value.function.name
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2045 = gfc_get_string (PREFIX ("%s%d_%c%d"), name, f->rank != 0,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2046 gfc_type_letter (array->ts.type), array->ts.kind);
111
kono
parents:
diff changeset
2047 }
kono
parents:
diff changeset
2048
kono
parents:
diff changeset
2049
kono
parents:
diff changeset
2050 void
kono
parents:
diff changeset
2051 gfc_resolve_mod (gfc_expr *f, gfc_expr *a, gfc_expr *p)
kono
parents:
diff changeset
2052 {
kono
parents:
diff changeset
2053 f->ts.type = a->ts.type;
kono
parents:
diff changeset
2054 if (p != NULL)
kono
parents:
diff changeset
2055 f->ts.kind = gfc_kind_max (a,p);
kono
parents:
diff changeset
2056 else
kono
parents:
diff changeset
2057 f->ts.kind = a->ts.kind;
kono
parents:
diff changeset
2058
kono
parents:
diff changeset
2059 if (p != NULL && a->ts.kind != p->ts.kind)
kono
parents:
diff changeset
2060 {
kono
parents:
diff changeset
2061 if (a->ts.kind == gfc_kind_max (a,p))
kono
parents:
diff changeset
2062 gfc_convert_type (p, &a->ts, 2);
kono
parents:
diff changeset
2063 else
kono
parents:
diff changeset
2064 gfc_convert_type (a, &p->ts, 2);
kono
parents:
diff changeset
2065 }
kono
parents:
diff changeset
2066
kono
parents:
diff changeset
2067 f->value.function.name
kono
parents:
diff changeset
2068 = gfc_get_string ("__mod_%c%d", gfc_type_letter (f->ts.type), f->ts.kind);
kono
parents:
diff changeset
2069 }
kono
parents:
diff changeset
2070
kono
parents:
diff changeset
2071
kono
parents:
diff changeset
2072 void
kono
parents:
diff changeset
2073 gfc_resolve_modulo (gfc_expr *f, gfc_expr *a, gfc_expr *p)
kono
parents:
diff changeset
2074 {
kono
parents:
diff changeset
2075 f->ts.type = a->ts.type;
kono
parents:
diff changeset
2076 if (p != NULL)
kono
parents:
diff changeset
2077 f->ts.kind = gfc_kind_max (a,p);
kono
parents:
diff changeset
2078 else
kono
parents:
diff changeset
2079 f->ts.kind = a->ts.kind;
kono
parents:
diff changeset
2080
kono
parents:
diff changeset
2081 if (p != NULL && a->ts.kind != p->ts.kind)
kono
parents:
diff changeset
2082 {
kono
parents:
diff changeset
2083 if (a->ts.kind == gfc_kind_max (a,p))
kono
parents:
diff changeset
2084 gfc_convert_type (p, &a->ts, 2);
kono
parents:
diff changeset
2085 else
kono
parents:
diff changeset
2086 gfc_convert_type (a, &p->ts, 2);
kono
parents:
diff changeset
2087 }
kono
parents:
diff changeset
2088
kono
parents:
diff changeset
2089 f->value.function.name
kono
parents:
diff changeset
2090 = gfc_get_string ("__modulo_%c%d", gfc_type_letter (f->ts.type),
kono
parents:
diff changeset
2091 f->ts.kind);
kono
parents:
diff changeset
2092 }
kono
parents:
diff changeset
2093
kono
parents:
diff changeset
2094 void
kono
parents:
diff changeset
2095 gfc_resolve_nearest (gfc_expr *f, gfc_expr *a, gfc_expr *p)
kono
parents:
diff changeset
2096 {
kono
parents:
diff changeset
2097 if (p->ts.kind != a->ts.kind)
kono
parents:
diff changeset
2098 gfc_convert_type (p, &a->ts, 2);
kono
parents:
diff changeset
2099
kono
parents:
diff changeset
2100 f->ts = a->ts;
kono
parents:
diff changeset
2101 f->value.function.name
kono
parents:
diff changeset
2102 = gfc_get_string ("__nearest_%c%d", gfc_type_letter (a->ts.type),
kono
parents:
diff changeset
2103 a->ts.kind);
kono
parents:
diff changeset
2104 }
kono
parents:
diff changeset
2105
kono
parents:
diff changeset
2106 void
kono
parents:
diff changeset
2107 gfc_resolve_nint (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
kono
parents:
diff changeset
2108 {
kono
parents:
diff changeset
2109 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2110 f->ts.kind = (kind == NULL)
kono
parents:
diff changeset
2111 ? gfc_default_integer_kind : mpz_get_si (kind->value.integer);
kono
parents:
diff changeset
2112 f->value.function.name
kono
parents:
diff changeset
2113 = gfc_get_string ("__nint_%d_%d", f->ts.kind, a->ts.kind);
kono
parents:
diff changeset
2114 }
kono
parents:
diff changeset
2115
kono
parents:
diff changeset
2116
kono
parents:
diff changeset
2117 void
kono
parents:
diff changeset
2118 gfc_resolve_norm2 (gfc_expr *f, gfc_expr *array, gfc_expr *dim)
kono
parents:
diff changeset
2119 {
kono
parents:
diff changeset
2120 resolve_transformational ("norm2", f, array, dim, NULL);
kono
parents:
diff changeset
2121 }
kono
parents:
diff changeset
2122
kono
parents:
diff changeset
2123
kono
parents:
diff changeset
2124 void
kono
parents:
diff changeset
2125 gfc_resolve_not (gfc_expr *f, gfc_expr *i)
kono
parents:
diff changeset
2126 {
kono
parents:
diff changeset
2127 f->ts = i->ts;
kono
parents:
diff changeset
2128 f->value.function.name = gfc_get_string ("__not_%d", i->ts.kind);
kono
parents:
diff changeset
2129 }
kono
parents:
diff changeset
2130
kono
parents:
diff changeset
2131
kono
parents:
diff changeset
2132 void
kono
parents:
diff changeset
2133 gfc_resolve_or (gfc_expr *f, gfc_expr *i, gfc_expr *j)
kono
parents:
diff changeset
2134 {
kono
parents:
diff changeset
2135 f->ts.type = i->ts.type;
kono
parents:
diff changeset
2136 f->ts.kind = gfc_kind_max (i, j);
kono
parents:
diff changeset
2137
kono
parents:
diff changeset
2138 if (i->ts.kind != j->ts.kind)
kono
parents:
diff changeset
2139 {
kono
parents:
diff changeset
2140 if (i->ts.kind == gfc_kind_max (i, j))
kono
parents:
diff changeset
2141 gfc_convert_type (j, &i->ts, 2);
kono
parents:
diff changeset
2142 else
kono
parents:
diff changeset
2143 gfc_convert_type (i, &j->ts, 2);
kono
parents:
diff changeset
2144 }
kono
parents:
diff changeset
2145
kono
parents:
diff changeset
2146 f->value.function.name
kono
parents:
diff changeset
2147 = gfc_get_string ("__or_%c%d", gfc_type_letter (i->ts.type), f->ts.kind);
kono
parents:
diff changeset
2148 }
kono
parents:
diff changeset
2149
kono
parents:
diff changeset
2150
kono
parents:
diff changeset
2151 void
kono
parents:
diff changeset
2152 gfc_resolve_pack (gfc_expr *f, gfc_expr *array, gfc_expr *mask,
kono
parents:
diff changeset
2153 gfc_expr *vector ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
2154 {
kono
parents:
diff changeset
2155 if (array->ts.type == BT_CHARACTER && array->ref)
kono
parents:
diff changeset
2156 gfc_resolve_substring_charlen (array);
kono
parents:
diff changeset
2157
kono
parents:
diff changeset
2158 f->ts = array->ts;
kono
parents:
diff changeset
2159 f->rank = 1;
kono
parents:
diff changeset
2160
kono
parents:
diff changeset
2161 resolve_mask_arg (mask);
kono
parents:
diff changeset
2162
kono
parents:
diff changeset
2163 if (mask->rank != 0)
kono
parents:
diff changeset
2164 {
kono
parents:
diff changeset
2165 if (array->ts.type == BT_CHARACTER)
kono
parents:
diff changeset
2166 f->value.function.name
kono
parents:
diff changeset
2167 = array->ts.kind == 1 ? PREFIX ("pack_char")
kono
parents:
diff changeset
2168 : gfc_get_string
kono
parents:
diff changeset
2169 (PREFIX ("pack_char%d"),
kono
parents:
diff changeset
2170 array->ts.kind);
kono
parents:
diff changeset
2171 else
kono
parents:
diff changeset
2172 f->value.function.name = PREFIX ("pack");
kono
parents:
diff changeset
2173 }
kono
parents:
diff changeset
2174 else
kono
parents:
diff changeset
2175 {
kono
parents:
diff changeset
2176 if (array->ts.type == BT_CHARACTER)
kono
parents:
diff changeset
2177 f->value.function.name
kono
parents:
diff changeset
2178 = array->ts.kind == 1 ? PREFIX ("pack_s_char")
kono
parents:
diff changeset
2179 : gfc_get_string
kono
parents:
diff changeset
2180 (PREFIX ("pack_s_char%d"),
kono
parents:
diff changeset
2181 array->ts.kind);
kono
parents:
diff changeset
2182 else
kono
parents:
diff changeset
2183 f->value.function.name = PREFIX ("pack_s");
kono
parents:
diff changeset
2184 }
kono
parents:
diff changeset
2185 }
kono
parents:
diff changeset
2186
kono
parents:
diff changeset
2187
kono
parents:
diff changeset
2188 void
kono
parents:
diff changeset
2189 gfc_resolve_parity (gfc_expr *f, gfc_expr *array, gfc_expr *dim)
kono
parents:
diff changeset
2190 {
kono
parents:
diff changeset
2191 resolve_transformational ("parity", f, array, dim, NULL);
kono
parents:
diff changeset
2192 }
kono
parents:
diff changeset
2193
kono
parents:
diff changeset
2194
kono
parents:
diff changeset
2195 void
kono
parents:
diff changeset
2196 gfc_resolve_product (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
kono
parents:
diff changeset
2197 gfc_expr *mask)
kono
parents:
diff changeset
2198 {
kono
parents:
diff changeset
2199 resolve_transformational ("product", f, array, dim, mask);
kono
parents:
diff changeset
2200 }
kono
parents:
diff changeset
2201
kono
parents:
diff changeset
2202
kono
parents:
diff changeset
2203 void
kono
parents:
diff changeset
2204 gfc_resolve_rank (gfc_expr *f, gfc_expr *array ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
2205 {
kono
parents:
diff changeset
2206 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2207 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
2208 f->value.function.name = gfc_get_string ("__rank");
kono
parents:
diff changeset
2209 }
kono
parents:
diff changeset
2210
kono
parents:
diff changeset
2211
kono
parents:
diff changeset
2212 void
kono
parents:
diff changeset
2213 gfc_resolve_real (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
kono
parents:
diff changeset
2214 {
kono
parents:
diff changeset
2215 f->ts.type = BT_REAL;
kono
parents:
diff changeset
2216
kono
parents:
diff changeset
2217 if (kind != NULL)
kono
parents:
diff changeset
2218 f->ts.kind = mpz_get_si (kind->value.integer);
kono
parents:
diff changeset
2219 else
kono
parents:
diff changeset
2220 f->ts.kind = (a->ts.type == BT_COMPLEX)
kono
parents:
diff changeset
2221 ? a->ts.kind : gfc_default_real_kind;
kono
parents:
diff changeset
2222
kono
parents:
diff changeset
2223 f->value.function.name
kono
parents:
diff changeset
2224 = gfc_get_string ("__real_%d_%c%d", f->ts.kind,
kono
parents:
diff changeset
2225 gfc_type_letter (a->ts.type), a->ts.kind);
kono
parents:
diff changeset
2226 }
kono
parents:
diff changeset
2227
kono
parents:
diff changeset
2228
kono
parents:
diff changeset
2229 void
kono
parents:
diff changeset
2230 gfc_resolve_realpart (gfc_expr *f, gfc_expr *a)
kono
parents:
diff changeset
2231 {
kono
parents:
diff changeset
2232 f->ts.type = BT_REAL;
kono
parents:
diff changeset
2233 f->ts.kind = a->ts.kind;
kono
parents:
diff changeset
2234 f->value.function.name
kono
parents:
diff changeset
2235 = gfc_get_string ("__real_%d_%c%d", f->ts.kind,
kono
parents:
diff changeset
2236 gfc_type_letter (a->ts.type), a->ts.kind);
kono
parents:
diff changeset
2237 }
kono
parents:
diff changeset
2238
kono
parents:
diff changeset
2239
kono
parents:
diff changeset
2240 void
kono
parents:
diff changeset
2241 gfc_resolve_rename (gfc_expr *f, gfc_expr *p1 ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
2242 gfc_expr *p2 ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
2243 {
kono
parents:
diff changeset
2244 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2245 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
2246 f->value.function.name = gfc_get_string (PREFIX ("rename_i%d"), f->ts.kind);
kono
parents:
diff changeset
2247 }
kono
parents:
diff changeset
2248
kono
parents:
diff changeset
2249
kono
parents:
diff changeset
2250 void
kono
parents:
diff changeset
2251 gfc_resolve_repeat (gfc_expr *f, gfc_expr *string,
kono
parents:
diff changeset
2252 gfc_expr *ncopies)
kono
parents:
diff changeset
2253 {
kono
parents:
diff changeset
2254 gfc_expr *tmp;
kono
parents:
diff changeset
2255 f->ts.type = BT_CHARACTER;
kono
parents:
diff changeset
2256 f->ts.kind = string->ts.kind;
kono
parents:
diff changeset
2257 f->value.function.name = gfc_get_string ("__repeat_%d", string->ts.kind);
kono
parents:
diff changeset
2258
kono
parents:
diff changeset
2259 /* If possible, generate a character length. */
kono
parents:
diff changeset
2260 if (f->ts.u.cl == NULL)
kono
parents:
diff changeset
2261 f->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
kono
parents:
diff changeset
2262
kono
parents:
diff changeset
2263 tmp = NULL;
kono
parents:
diff changeset
2264 if (string->expr_type == EXPR_CONSTANT)
kono
parents:
diff changeset
2265 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2266 tmp = gfc_get_int_expr (gfc_charlen_int_kind, NULL,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2267 string->value.character.length);
111
kono
parents:
diff changeset
2268 }
kono
parents:
diff changeset
2269 else if (string->ts.u.cl && string->ts.u.cl->length)
kono
parents:
diff changeset
2270 {
kono
parents:
diff changeset
2271 tmp = gfc_copy_expr (string->ts.u.cl->length);
kono
parents:
diff changeset
2272 }
kono
parents:
diff changeset
2273
kono
parents:
diff changeset
2274 if (tmp)
kono
parents:
diff changeset
2275 f->ts.u.cl->length = gfc_multiply (tmp, gfc_copy_expr (ncopies));
kono
parents:
diff changeset
2276 }
kono
parents:
diff changeset
2277
kono
parents:
diff changeset
2278
kono
parents:
diff changeset
2279 void
kono
parents:
diff changeset
2280 gfc_resolve_reshape (gfc_expr *f, gfc_expr *source, gfc_expr *shape,
kono
parents:
diff changeset
2281 gfc_expr *pad ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
2282 gfc_expr *order ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
2283 {
kono
parents:
diff changeset
2284 mpz_t rank;
kono
parents:
diff changeset
2285 int kind;
kono
parents:
diff changeset
2286 int i;
kono
parents:
diff changeset
2287
kono
parents:
diff changeset
2288 if (source->ts.type == BT_CHARACTER && source->ref)
kono
parents:
diff changeset
2289 gfc_resolve_substring_charlen (source);
kono
parents:
diff changeset
2290
kono
parents:
diff changeset
2291 f->ts = source->ts;
kono
parents:
diff changeset
2292
kono
parents:
diff changeset
2293 gfc_array_size (shape, &rank);
kono
parents:
diff changeset
2294 f->rank = mpz_get_si (rank);
kono
parents:
diff changeset
2295 mpz_clear (rank);
kono
parents:
diff changeset
2296 switch (source->ts.type)
kono
parents:
diff changeset
2297 {
kono
parents:
diff changeset
2298 case BT_COMPLEX:
kono
parents:
diff changeset
2299 case BT_REAL:
kono
parents:
diff changeset
2300 case BT_INTEGER:
kono
parents:
diff changeset
2301 case BT_LOGICAL:
kono
parents:
diff changeset
2302 case BT_CHARACTER:
kono
parents:
diff changeset
2303 kind = source->ts.kind;
kono
parents:
diff changeset
2304 break;
kono
parents:
diff changeset
2305
kono
parents:
diff changeset
2306 default:
kono
parents:
diff changeset
2307 kind = 0;
kono
parents:
diff changeset
2308 break;
kono
parents:
diff changeset
2309 }
kono
parents:
diff changeset
2310
kono
parents:
diff changeset
2311 switch (kind)
kono
parents:
diff changeset
2312 {
kono
parents:
diff changeset
2313 case 4:
kono
parents:
diff changeset
2314 case 8:
kono
parents:
diff changeset
2315 case 10:
kono
parents:
diff changeset
2316 case 16:
kono
parents:
diff changeset
2317 if (source->ts.type == BT_COMPLEX || source->ts.type == BT_REAL)
kono
parents:
diff changeset
2318 f->value.function.name
kono
parents:
diff changeset
2319 = gfc_get_string (PREFIX ("reshape_%c%d"),
kono
parents:
diff changeset
2320 gfc_type_letter (source->ts.type),
kono
parents:
diff changeset
2321 source->ts.kind);
kono
parents:
diff changeset
2322 else if (source->ts.type == BT_CHARACTER)
kono
parents:
diff changeset
2323 f->value.function.name = gfc_get_string (PREFIX ("reshape_char%d"),
kono
parents:
diff changeset
2324 kind);
kono
parents:
diff changeset
2325 else
kono
parents:
diff changeset
2326 f->value.function.name
kono
parents:
diff changeset
2327 = gfc_get_string (PREFIX ("reshape_%d"), source->ts.kind);
kono
parents:
diff changeset
2328 break;
kono
parents:
diff changeset
2329
kono
parents:
diff changeset
2330 default:
kono
parents:
diff changeset
2331 f->value.function.name = (source->ts.type == BT_CHARACTER
kono
parents:
diff changeset
2332 ? PREFIX ("reshape_char") : PREFIX ("reshape"));
kono
parents:
diff changeset
2333 break;
kono
parents:
diff changeset
2334 }
kono
parents:
diff changeset
2335
kono
parents:
diff changeset
2336 if (shape->expr_type == EXPR_ARRAY && gfc_is_constant_expr (shape))
kono
parents:
diff changeset
2337 {
kono
parents:
diff changeset
2338 gfc_constructor *c;
kono
parents:
diff changeset
2339 f->shape = gfc_get_shape (f->rank);
kono
parents:
diff changeset
2340 c = gfc_constructor_first (shape->value.constructor);
kono
parents:
diff changeset
2341 for (i = 0; i < f->rank; i++)
kono
parents:
diff changeset
2342 {
kono
parents:
diff changeset
2343 mpz_init_set (f->shape[i], c->expr->value.integer);
kono
parents:
diff changeset
2344 c = gfc_constructor_next (c);
kono
parents:
diff changeset
2345 }
kono
parents:
diff changeset
2346 }
kono
parents:
diff changeset
2347
kono
parents:
diff changeset
2348 /* Force-convert both SHAPE and ORDER to index_kind so that we don't need
kono
parents:
diff changeset
2349 so many runtime variations. */
kono
parents:
diff changeset
2350 if (shape->ts.kind != gfc_index_integer_kind)
kono
parents:
diff changeset
2351 {
kono
parents:
diff changeset
2352 gfc_typespec ts = shape->ts;
kono
parents:
diff changeset
2353 ts.kind = gfc_index_integer_kind;
kono
parents:
diff changeset
2354 gfc_convert_type_warn (shape, &ts, 2, 0);
kono
parents:
diff changeset
2355 }
kono
parents:
diff changeset
2356 if (order && order->ts.kind != gfc_index_integer_kind)
kono
parents:
diff changeset
2357 gfc_convert_type_warn (order, &shape->ts, 2, 0);
kono
parents:
diff changeset
2358 }
kono
parents:
diff changeset
2359
kono
parents:
diff changeset
2360
kono
parents:
diff changeset
2361 void
kono
parents:
diff changeset
2362 gfc_resolve_rrspacing (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
2363 {
kono
parents:
diff changeset
2364 f->ts = x->ts;
kono
parents:
diff changeset
2365 f->value.function.name = gfc_get_string ("__rrspacing_%d", x->ts.kind);
kono
parents:
diff changeset
2366 }
kono
parents:
diff changeset
2367
kono
parents:
diff changeset
2368 void
kono
parents:
diff changeset
2369 gfc_resolve_fe_runtime_error (gfc_code *c)
kono
parents:
diff changeset
2370 {
kono
parents:
diff changeset
2371 const char *name;
kono
parents:
diff changeset
2372 gfc_actual_arglist *a;
kono
parents:
diff changeset
2373
kono
parents:
diff changeset
2374 name = gfc_get_string (PREFIX ("runtime_error"));
kono
parents:
diff changeset
2375
kono
parents:
diff changeset
2376 for (a = c->ext.actual->next; a; a = a->next)
kono
parents:
diff changeset
2377 a->name = "%VAL";
kono
parents:
diff changeset
2378
kono
parents:
diff changeset
2379 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
2380 }
kono
parents:
diff changeset
2381
kono
parents:
diff changeset
2382 void
kono
parents:
diff changeset
2383 gfc_resolve_scale (gfc_expr *f, gfc_expr *x, gfc_expr *i ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
2384 {
kono
parents:
diff changeset
2385 f->ts = x->ts;
kono
parents:
diff changeset
2386 f->value.function.name = gfc_get_string ("__scale_%d", x->ts.kind);
kono
parents:
diff changeset
2387 }
kono
parents:
diff changeset
2388
kono
parents:
diff changeset
2389
kono
parents:
diff changeset
2390 void
kono
parents:
diff changeset
2391 gfc_resolve_scan (gfc_expr *f, gfc_expr *string,
kono
parents:
diff changeset
2392 gfc_expr *set ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
2393 gfc_expr *back ATTRIBUTE_UNUSED, gfc_expr *kind)
kono
parents:
diff changeset
2394 {
kono
parents:
diff changeset
2395 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2396 if (kind)
kono
parents:
diff changeset
2397 f->ts.kind = mpz_get_si (kind->value.integer);
kono
parents:
diff changeset
2398 else
kono
parents:
diff changeset
2399 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
2400 f->value.function.name = gfc_get_string ("__scan_%d", string->ts.kind);
kono
parents:
diff changeset
2401 }
kono
parents:
diff changeset
2402
kono
parents:
diff changeset
2403
kono
parents:
diff changeset
2404 void
kono
parents:
diff changeset
2405 gfc_resolve_secnds (gfc_expr *t1, gfc_expr *t0)
kono
parents:
diff changeset
2406 {
kono
parents:
diff changeset
2407 t1->ts = t0->ts;
kono
parents:
diff changeset
2408 t1->value.function.name = gfc_get_string (PREFIX ("secnds"));
kono
parents:
diff changeset
2409 }
kono
parents:
diff changeset
2410
kono
parents:
diff changeset
2411
kono
parents:
diff changeset
2412 void
kono
parents:
diff changeset
2413 gfc_resolve_set_exponent (gfc_expr *f, gfc_expr *x,
kono
parents:
diff changeset
2414 gfc_expr *i ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
2415 {
kono
parents:
diff changeset
2416 f->ts = x->ts;
kono
parents:
diff changeset
2417 f->value.function.name = gfc_get_string ("__set_exponent_%d", x->ts.kind);
kono
parents:
diff changeset
2418 }
kono
parents:
diff changeset
2419
kono
parents:
diff changeset
2420
kono
parents:
diff changeset
2421 void
kono
parents:
diff changeset
2422 gfc_resolve_shape (gfc_expr *f, gfc_expr *array, gfc_expr *kind)
kono
parents:
diff changeset
2423 {
kono
parents:
diff changeset
2424 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2425
kono
parents:
diff changeset
2426 if (kind)
kono
parents:
diff changeset
2427 f->ts.kind = mpz_get_si (kind->value.integer);
kono
parents:
diff changeset
2428 else
kono
parents:
diff changeset
2429 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
2430
kono
parents:
diff changeset
2431 f->rank = 1;
kono
parents:
diff changeset
2432 if (array->rank != -1)
kono
parents:
diff changeset
2433 {
kono
parents:
diff changeset
2434 f->shape = gfc_get_shape (1);
kono
parents:
diff changeset
2435 mpz_init_set_ui (f->shape[0], array->rank);
kono
parents:
diff changeset
2436 }
kono
parents:
diff changeset
2437
kono
parents:
diff changeset
2438 f->value.function.name = gfc_get_string (PREFIX ("shape_%d"), f->ts.kind);
kono
parents:
diff changeset
2439 }
kono
parents:
diff changeset
2440
kono
parents:
diff changeset
2441
kono
parents:
diff changeset
2442 void
kono
parents:
diff changeset
2443 gfc_resolve_shift (gfc_expr *f, gfc_expr *i, gfc_expr *shift ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
2444 {
kono
parents:
diff changeset
2445 f->ts = i->ts;
kono
parents:
diff changeset
2446 if (f->value.function.isym->id == GFC_ISYM_SHIFTA)
kono
parents:
diff changeset
2447 f->value.function.name = gfc_get_string ("shifta_i%d", f->ts.kind);
kono
parents:
diff changeset
2448 else if (f->value.function.isym->id == GFC_ISYM_SHIFTL)
kono
parents:
diff changeset
2449 f->value.function.name = gfc_get_string ("shiftl_i%d", f->ts.kind);
kono
parents:
diff changeset
2450 else if (f->value.function.isym->id == GFC_ISYM_SHIFTR)
kono
parents:
diff changeset
2451 f->value.function.name = gfc_get_string ("shiftr_i%d", f->ts.kind);
kono
parents:
diff changeset
2452 else
kono
parents:
diff changeset
2453 gcc_unreachable ();
kono
parents:
diff changeset
2454 }
kono
parents:
diff changeset
2455
kono
parents:
diff changeset
2456
kono
parents:
diff changeset
2457 void
kono
parents:
diff changeset
2458 gfc_resolve_sign (gfc_expr *f, gfc_expr *a, gfc_expr *b ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
2459 {
kono
parents:
diff changeset
2460 f->ts = a->ts;
kono
parents:
diff changeset
2461 f->value.function.name
kono
parents:
diff changeset
2462 = gfc_get_string ("__sign_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
kono
parents:
diff changeset
2463 }
kono
parents:
diff changeset
2464
kono
parents:
diff changeset
2465
kono
parents:
diff changeset
2466 void
kono
parents:
diff changeset
2467 gfc_resolve_signal (gfc_expr *f, gfc_expr *number, gfc_expr *handler)
kono
parents:
diff changeset
2468 {
kono
parents:
diff changeset
2469 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2470 f->ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
2471
kono
parents:
diff changeset
2472 /* handler can be either BT_INTEGER or BT_PROCEDURE */
kono
parents:
diff changeset
2473 if (handler->ts.type == BT_INTEGER)
kono
parents:
diff changeset
2474 {
kono
parents:
diff changeset
2475 if (handler->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
2476 gfc_convert_type (handler, &f->ts, 2);
kono
parents:
diff changeset
2477 f->value.function.name = gfc_get_string (PREFIX ("signal_func_int"));
kono
parents:
diff changeset
2478 }
kono
parents:
diff changeset
2479 else
kono
parents:
diff changeset
2480 f->value.function.name = gfc_get_string (PREFIX ("signal_func"));
kono
parents:
diff changeset
2481
kono
parents:
diff changeset
2482 if (number->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
2483 gfc_convert_type (number, &f->ts, 2);
kono
parents:
diff changeset
2484 }
kono
parents:
diff changeset
2485
kono
parents:
diff changeset
2486
kono
parents:
diff changeset
2487 void
kono
parents:
diff changeset
2488 gfc_resolve_sin (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
2489 {
kono
parents:
diff changeset
2490 f->ts = x->ts;
kono
parents:
diff changeset
2491 f->value.function.name
kono
parents:
diff changeset
2492 = gfc_get_string ("__sin_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
kono
parents:
diff changeset
2493 }
kono
parents:
diff changeset
2494
kono
parents:
diff changeset
2495
kono
parents:
diff changeset
2496 void
kono
parents:
diff changeset
2497 gfc_resolve_sinh (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
2498 {
kono
parents:
diff changeset
2499 f->ts = x->ts;
kono
parents:
diff changeset
2500 f->value.function.name
kono
parents:
diff changeset
2501 = gfc_get_string ("__sinh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
kono
parents:
diff changeset
2502 }
kono
parents:
diff changeset
2503
kono
parents:
diff changeset
2504
kono
parents:
diff changeset
2505 void
kono
parents:
diff changeset
2506 gfc_resolve_size (gfc_expr *f, gfc_expr *array ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
2507 gfc_expr *dim ATTRIBUTE_UNUSED, gfc_expr *kind)
kono
parents:
diff changeset
2508 {
kono
parents:
diff changeset
2509 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2510 if (kind)
kono
parents:
diff changeset
2511 f->ts.kind = mpz_get_si (kind->value.integer);
kono
parents:
diff changeset
2512 else
kono
parents:
diff changeset
2513 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
2514 }
kono
parents:
diff changeset
2515
kono
parents:
diff changeset
2516
kono
parents:
diff changeset
2517 void
kono
parents:
diff changeset
2518 gfc_resolve_stride (gfc_expr *f, gfc_expr *array ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
2519 gfc_expr *dim ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
2520 {
kono
parents:
diff changeset
2521 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2522 f->ts.kind = gfc_index_integer_kind;
kono
parents:
diff changeset
2523 }
kono
parents:
diff changeset
2524
kono
parents:
diff changeset
2525
kono
parents:
diff changeset
2526 void
kono
parents:
diff changeset
2527 gfc_resolve_spacing (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
2528 {
kono
parents:
diff changeset
2529 f->ts = x->ts;
kono
parents:
diff changeset
2530 f->value.function.name = gfc_get_string ("__spacing_%d", x->ts.kind);
kono
parents:
diff changeset
2531 }
kono
parents:
diff changeset
2532
kono
parents:
diff changeset
2533
kono
parents:
diff changeset
2534 void
kono
parents:
diff changeset
2535 gfc_resolve_spread (gfc_expr *f, gfc_expr *source, gfc_expr *dim,
kono
parents:
diff changeset
2536 gfc_expr *ncopies)
kono
parents:
diff changeset
2537 {
kono
parents:
diff changeset
2538 if (source->ts.type == BT_CHARACTER && source->ref)
kono
parents:
diff changeset
2539 gfc_resolve_substring_charlen (source);
kono
parents:
diff changeset
2540
kono
parents:
diff changeset
2541 if (source->ts.type == BT_CHARACTER)
kono
parents:
diff changeset
2542 check_charlen_present (source);
kono
parents:
diff changeset
2543
kono
parents:
diff changeset
2544 f->ts = source->ts;
kono
parents:
diff changeset
2545 f->rank = source->rank + 1;
kono
parents:
diff changeset
2546 if (source->rank == 0)
kono
parents:
diff changeset
2547 {
kono
parents:
diff changeset
2548 if (source->ts.type == BT_CHARACTER)
kono
parents:
diff changeset
2549 f->value.function.name
kono
parents:
diff changeset
2550 = source->ts.kind == 1 ? PREFIX ("spread_char_scalar")
kono
parents:
diff changeset
2551 : gfc_get_string
kono
parents:
diff changeset
2552 (PREFIX ("spread_char%d_scalar"),
kono
parents:
diff changeset
2553 source->ts.kind);
kono
parents:
diff changeset
2554 else
kono
parents:
diff changeset
2555 f->value.function.name = PREFIX ("spread_scalar");
kono
parents:
diff changeset
2556 }
kono
parents:
diff changeset
2557 else
kono
parents:
diff changeset
2558 {
kono
parents:
diff changeset
2559 if (source->ts.type == BT_CHARACTER)
kono
parents:
diff changeset
2560 f->value.function.name
kono
parents:
diff changeset
2561 = source->ts.kind == 1 ? PREFIX ("spread_char")
kono
parents:
diff changeset
2562 : gfc_get_string
kono
parents:
diff changeset
2563 (PREFIX ("spread_char%d"),
kono
parents:
diff changeset
2564 source->ts.kind);
kono
parents:
diff changeset
2565 else
kono
parents:
diff changeset
2566 f->value.function.name = PREFIX ("spread");
kono
parents:
diff changeset
2567 }
kono
parents:
diff changeset
2568
kono
parents:
diff changeset
2569 if (dim && gfc_is_constant_expr (dim)
kono
parents:
diff changeset
2570 && ncopies && gfc_is_constant_expr (ncopies) && source->shape[0])
kono
parents:
diff changeset
2571 {
kono
parents:
diff changeset
2572 int i, idim;
kono
parents:
diff changeset
2573 idim = mpz_get_ui (dim->value.integer);
kono
parents:
diff changeset
2574 f->shape = gfc_get_shape (f->rank);
kono
parents:
diff changeset
2575 for (i = 0; i < (idim - 1); i++)
kono
parents:
diff changeset
2576 mpz_init_set (f->shape[i], source->shape[i]);
kono
parents:
diff changeset
2577
kono
parents:
diff changeset
2578 mpz_init_set (f->shape[idim - 1], ncopies->value.integer);
kono
parents:
diff changeset
2579
kono
parents:
diff changeset
2580 for (i = idim; i < f->rank ; i++)
kono
parents:
diff changeset
2581 mpz_init_set (f->shape[i], source->shape[i-1]);
kono
parents:
diff changeset
2582 }
kono
parents:
diff changeset
2583
kono
parents:
diff changeset
2584
kono
parents:
diff changeset
2585 gfc_resolve_dim_arg (dim);
kono
parents:
diff changeset
2586 gfc_resolve_index (ncopies, 1);
kono
parents:
diff changeset
2587 }
kono
parents:
diff changeset
2588
kono
parents:
diff changeset
2589
kono
parents:
diff changeset
2590 void
kono
parents:
diff changeset
2591 gfc_resolve_sqrt (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
2592 {
kono
parents:
diff changeset
2593 f->ts = x->ts;
kono
parents:
diff changeset
2594 f->value.function.name
kono
parents:
diff changeset
2595 = gfc_get_string ("__sqrt_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
kono
parents:
diff changeset
2596 }
kono
parents:
diff changeset
2597
kono
parents:
diff changeset
2598
kono
parents:
diff changeset
2599 /* Resolve the g77 compatibility function STAT AND FSTAT. */
kono
parents:
diff changeset
2600
kono
parents:
diff changeset
2601 void
kono
parents:
diff changeset
2602 gfc_resolve_stat (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
2603 gfc_expr *a ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
2604 {
kono
parents:
diff changeset
2605 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2606 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
2607 f->value.function.name = gfc_get_string (PREFIX ("stat_i%d"), f->ts.kind);
kono
parents:
diff changeset
2608 }
kono
parents:
diff changeset
2609
kono
parents:
diff changeset
2610
kono
parents:
diff changeset
2611 void
kono
parents:
diff changeset
2612 gfc_resolve_lstat (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
2613 gfc_expr *a ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
2614 {
kono
parents:
diff changeset
2615 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2616 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
2617 f->value.function.name = gfc_get_string (PREFIX ("lstat_i%d"), f->ts.kind);
kono
parents:
diff changeset
2618 }
kono
parents:
diff changeset
2619
kono
parents:
diff changeset
2620
kono
parents:
diff changeset
2621 void
kono
parents:
diff changeset
2622 gfc_resolve_fstat (gfc_expr *f, gfc_expr *n, gfc_expr *a ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
2623 {
kono
parents:
diff changeset
2624 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2625 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
2626 if (n->ts.kind != f->ts.kind)
kono
parents:
diff changeset
2627 gfc_convert_type (n, &f->ts, 2);
kono
parents:
diff changeset
2628
kono
parents:
diff changeset
2629 f->value.function.name = gfc_get_string (PREFIX ("fstat_i%d"), f->ts.kind);
kono
parents:
diff changeset
2630 }
kono
parents:
diff changeset
2631
kono
parents:
diff changeset
2632
kono
parents:
diff changeset
2633 void
kono
parents:
diff changeset
2634 gfc_resolve_fgetc (gfc_expr *f, gfc_expr *u, gfc_expr *c ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
2635 {
kono
parents:
diff changeset
2636 gfc_typespec ts;
kono
parents:
diff changeset
2637 gfc_clear_ts (&ts);
kono
parents:
diff changeset
2638
kono
parents:
diff changeset
2639 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2640 f->ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
2641 if (u->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
2642 {
kono
parents:
diff changeset
2643 ts.type = BT_INTEGER;
kono
parents:
diff changeset
2644 ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
2645 ts.u.derived = NULL;
kono
parents:
diff changeset
2646 ts.u.cl = NULL;
kono
parents:
diff changeset
2647 gfc_convert_type (u, &ts, 2);
kono
parents:
diff changeset
2648 }
kono
parents:
diff changeset
2649
kono
parents:
diff changeset
2650 f->value.function.name = gfc_get_string (PREFIX ("fgetc"));
kono
parents:
diff changeset
2651 }
kono
parents:
diff changeset
2652
kono
parents:
diff changeset
2653
kono
parents:
diff changeset
2654 void
kono
parents:
diff changeset
2655 gfc_resolve_fget (gfc_expr *f, gfc_expr *c ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
2656 {
kono
parents:
diff changeset
2657 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2658 f->ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
2659 f->value.function.name = gfc_get_string (PREFIX ("fget"));
kono
parents:
diff changeset
2660 }
kono
parents:
diff changeset
2661
kono
parents:
diff changeset
2662
kono
parents:
diff changeset
2663 void
kono
parents:
diff changeset
2664 gfc_resolve_fputc (gfc_expr *f, gfc_expr *u, gfc_expr *c ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
2665 {
kono
parents:
diff changeset
2666 gfc_typespec ts;
kono
parents:
diff changeset
2667 gfc_clear_ts (&ts);
kono
parents:
diff changeset
2668
kono
parents:
diff changeset
2669 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2670 f->ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
2671 if (u->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
2672 {
kono
parents:
diff changeset
2673 ts.type = BT_INTEGER;
kono
parents:
diff changeset
2674 ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
2675 ts.u.derived = NULL;
kono
parents:
diff changeset
2676 ts.u.cl = NULL;
kono
parents:
diff changeset
2677 gfc_convert_type (u, &ts, 2);
kono
parents:
diff changeset
2678 }
kono
parents:
diff changeset
2679
kono
parents:
diff changeset
2680 f->value.function.name = gfc_get_string (PREFIX ("fputc"));
kono
parents:
diff changeset
2681 }
kono
parents:
diff changeset
2682
kono
parents:
diff changeset
2683
kono
parents:
diff changeset
2684 void
kono
parents:
diff changeset
2685 gfc_resolve_fput (gfc_expr *f, gfc_expr *c ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
2686 {
kono
parents:
diff changeset
2687 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2688 f->ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
2689 f->value.function.name = gfc_get_string (PREFIX ("fput"));
kono
parents:
diff changeset
2690 }
kono
parents:
diff changeset
2691
kono
parents:
diff changeset
2692
kono
parents:
diff changeset
2693 void
kono
parents:
diff changeset
2694 gfc_resolve_ftell (gfc_expr *f, gfc_expr *u)
kono
parents:
diff changeset
2695 {
kono
parents:
diff changeset
2696 gfc_typespec ts;
kono
parents:
diff changeset
2697 gfc_clear_ts (&ts);
kono
parents:
diff changeset
2698
kono
parents:
diff changeset
2699 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2700 f->ts.kind = gfc_intio_kind;
kono
parents:
diff changeset
2701 if (u->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
2702 {
kono
parents:
diff changeset
2703 ts.type = BT_INTEGER;
kono
parents:
diff changeset
2704 ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
2705 ts.u.derived = NULL;
kono
parents:
diff changeset
2706 ts.u.cl = NULL;
kono
parents:
diff changeset
2707 gfc_convert_type (u, &ts, 2);
kono
parents:
diff changeset
2708 }
kono
parents:
diff changeset
2709
kono
parents:
diff changeset
2710 f->value.function.name = gfc_get_string (PREFIX ("ftell"));
kono
parents:
diff changeset
2711 }
kono
parents:
diff changeset
2712
kono
parents:
diff changeset
2713
kono
parents:
diff changeset
2714 void
kono
parents:
diff changeset
2715 gfc_resolve_storage_size (gfc_expr *f, gfc_expr *a ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
2716 gfc_expr *kind)
kono
parents:
diff changeset
2717 {
kono
parents:
diff changeset
2718 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2719 if (kind)
kono
parents:
diff changeset
2720 f->ts.kind = mpz_get_si (kind->value.integer);
kono
parents:
diff changeset
2721 else
kono
parents:
diff changeset
2722 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
2723 }
kono
parents:
diff changeset
2724
kono
parents:
diff changeset
2725
kono
parents:
diff changeset
2726 void
kono
parents:
diff changeset
2727 gfc_resolve_sum (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
kono
parents:
diff changeset
2728 {
kono
parents:
diff changeset
2729 resolve_transformational ("sum", f, array, dim, mask);
kono
parents:
diff changeset
2730 }
kono
parents:
diff changeset
2731
kono
parents:
diff changeset
2732
kono
parents:
diff changeset
2733 void
kono
parents:
diff changeset
2734 gfc_resolve_symlnk (gfc_expr *f, gfc_expr *p1 ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
2735 gfc_expr *p2 ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
2736 {
kono
parents:
diff changeset
2737 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2738 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
2739 f->value.function.name = gfc_get_string (PREFIX ("symlnk_i%d"), f->ts.kind);
kono
parents:
diff changeset
2740 }
kono
parents:
diff changeset
2741
kono
parents:
diff changeset
2742
kono
parents:
diff changeset
2743 /* Resolve the g77 compatibility function SYSTEM. */
kono
parents:
diff changeset
2744
kono
parents:
diff changeset
2745 void
kono
parents:
diff changeset
2746 gfc_resolve_system (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
2747 {
kono
parents:
diff changeset
2748 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2749 f->ts.kind = 4;
kono
parents:
diff changeset
2750 f->value.function.name = gfc_get_string (PREFIX ("system"));
kono
parents:
diff changeset
2751 }
kono
parents:
diff changeset
2752
kono
parents:
diff changeset
2753
kono
parents:
diff changeset
2754 void
kono
parents:
diff changeset
2755 gfc_resolve_tan (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
2756 {
kono
parents:
diff changeset
2757 f->ts = x->ts;
kono
parents:
diff changeset
2758 f->value.function.name
kono
parents:
diff changeset
2759 = gfc_get_string ("__tan_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
kono
parents:
diff changeset
2760 }
kono
parents:
diff changeset
2761
kono
parents:
diff changeset
2762
kono
parents:
diff changeset
2763 void
kono
parents:
diff changeset
2764 gfc_resolve_tanh (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
2765 {
kono
parents:
diff changeset
2766 f->ts = x->ts;
kono
parents:
diff changeset
2767 f->value.function.name
kono
parents:
diff changeset
2768 = gfc_get_string ("__tanh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
kono
parents:
diff changeset
2769 }
kono
parents:
diff changeset
2770
kono
parents:
diff changeset
2771
kono
parents:
diff changeset
2772 /* Build an expression for converting degrees to radians. */
kono
parents:
diff changeset
2773
kono
parents:
diff changeset
2774 static gfc_expr *
kono
parents:
diff changeset
2775 get_radians (gfc_expr *deg)
kono
parents:
diff changeset
2776 {
kono
parents:
diff changeset
2777 gfc_expr *result, *factor;
kono
parents:
diff changeset
2778 gfc_actual_arglist *mod_args;
kono
parents:
diff changeset
2779
kono
parents:
diff changeset
2780 gcc_assert (deg->ts.type == BT_REAL);
kono
parents:
diff changeset
2781
kono
parents:
diff changeset
2782 /* Set deg = deg % 360 to avoid offsets from large angles. */
kono
parents:
diff changeset
2783 factor = gfc_get_constant_expr (deg->ts.type, deg->ts.kind, &deg->where);
kono
parents:
diff changeset
2784 mpfr_set_d (factor->value.real, 360.0, GFC_RND_MODE);
kono
parents:
diff changeset
2785
kono
parents:
diff changeset
2786 mod_args = gfc_get_actual_arglist ();
kono
parents:
diff changeset
2787 mod_args->expr = deg;
kono
parents:
diff changeset
2788 mod_args->next = gfc_get_actual_arglist ();
kono
parents:
diff changeset
2789 mod_args->next->expr = factor;
kono
parents:
diff changeset
2790
kono
parents:
diff changeset
2791 result = gfc_get_expr ();
kono
parents:
diff changeset
2792 result->ts = deg->ts;
kono
parents:
diff changeset
2793 result->where = deg->where;
kono
parents:
diff changeset
2794 result->expr_type = EXPR_FUNCTION;
kono
parents:
diff changeset
2795 result->value.function.isym = gfc_intrinsic_function_by_id (GFC_ISYM_MOD);
kono
parents:
diff changeset
2796 result->value.function.actual = mod_args;
kono
parents:
diff changeset
2797
kono
parents:
diff changeset
2798 /* Set factor = pi / 180. */
kono
parents:
diff changeset
2799 factor = gfc_get_constant_expr (deg->ts.type, deg->ts.kind, &deg->where);
kono
parents:
diff changeset
2800 mpfr_const_pi (factor->value.real, GFC_RND_MODE);
kono
parents:
diff changeset
2801 mpfr_div_ui (factor->value.real, factor->value.real, 180, GFC_RND_MODE);
kono
parents:
diff changeset
2802
kono
parents:
diff changeset
2803 /* Result is rad = (deg % 360) * (pi / 180). */
kono
parents:
diff changeset
2804 result = gfc_multiply (result, factor);
kono
parents:
diff changeset
2805 return result;
kono
parents:
diff changeset
2806 }
kono
parents:
diff changeset
2807
kono
parents:
diff changeset
2808
kono
parents:
diff changeset
2809 /* Build an expression for converting radians to degrees. */
kono
parents:
diff changeset
2810
kono
parents:
diff changeset
2811 static gfc_expr *
kono
parents:
diff changeset
2812 get_degrees (gfc_expr *rad)
kono
parents:
diff changeset
2813 {
kono
parents:
diff changeset
2814 gfc_expr *result, *factor;
kono
parents:
diff changeset
2815 gfc_actual_arglist *mod_args;
kono
parents:
diff changeset
2816 mpfr_t tmp;
kono
parents:
diff changeset
2817
kono
parents:
diff changeset
2818 gcc_assert (rad->ts.type == BT_REAL);
kono
parents:
diff changeset
2819
kono
parents:
diff changeset
2820 /* Set rad = rad % 2pi to avoid offsets from large angles. */
kono
parents:
diff changeset
2821 factor = gfc_get_constant_expr (rad->ts.type, rad->ts.kind, &rad->where);
kono
parents:
diff changeset
2822 mpfr_const_pi (factor->value.real, GFC_RND_MODE);
kono
parents:
diff changeset
2823 mpfr_mul_ui (factor->value.real, factor->value.real, 2, GFC_RND_MODE);
kono
parents:
diff changeset
2824
kono
parents:
diff changeset
2825 mod_args = gfc_get_actual_arglist ();
kono
parents:
diff changeset
2826 mod_args->expr = rad;
kono
parents:
diff changeset
2827 mod_args->next = gfc_get_actual_arglist ();
kono
parents:
diff changeset
2828 mod_args->next->expr = factor;
kono
parents:
diff changeset
2829
kono
parents:
diff changeset
2830 result = gfc_get_expr ();
kono
parents:
diff changeset
2831 result->ts = rad->ts;
kono
parents:
diff changeset
2832 result->where = rad->where;
kono
parents:
diff changeset
2833 result->expr_type = EXPR_FUNCTION;
kono
parents:
diff changeset
2834 result->value.function.isym = gfc_intrinsic_function_by_id (GFC_ISYM_MOD);
kono
parents:
diff changeset
2835 result->value.function.actual = mod_args;
kono
parents:
diff changeset
2836
kono
parents:
diff changeset
2837 /* Set factor = 180 / pi. */
kono
parents:
diff changeset
2838 factor = gfc_get_constant_expr (rad->ts.type, rad->ts.kind, &rad->where);
kono
parents:
diff changeset
2839 mpfr_set_ui (factor->value.real, 180, GFC_RND_MODE);
kono
parents:
diff changeset
2840 mpfr_init (tmp);
kono
parents:
diff changeset
2841 mpfr_const_pi (tmp, GFC_RND_MODE);
kono
parents:
diff changeset
2842 mpfr_div (factor->value.real, factor->value.real, tmp, GFC_RND_MODE);
kono
parents:
diff changeset
2843 mpfr_clear (tmp);
kono
parents:
diff changeset
2844
kono
parents:
diff changeset
2845 /* Result is deg = (rad % 2pi) * (180 / pi). */
kono
parents:
diff changeset
2846 result = gfc_multiply (result, factor);
kono
parents:
diff changeset
2847 return result;
kono
parents:
diff changeset
2848 }
kono
parents:
diff changeset
2849
kono
parents:
diff changeset
2850
kono
parents:
diff changeset
2851 /* Resolve a call to a trig function. */
kono
parents:
diff changeset
2852
kono
parents:
diff changeset
2853 static void
kono
parents:
diff changeset
2854 resolve_trig_call (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
2855 {
kono
parents:
diff changeset
2856 switch (f->value.function.isym->id)
kono
parents:
diff changeset
2857 {
kono
parents:
diff changeset
2858 case GFC_ISYM_ACOS:
kono
parents:
diff changeset
2859 return gfc_resolve_acos (f, x);
kono
parents:
diff changeset
2860 case GFC_ISYM_ASIN:
kono
parents:
diff changeset
2861 return gfc_resolve_asin (f, x);
kono
parents:
diff changeset
2862 case GFC_ISYM_ATAN:
kono
parents:
diff changeset
2863 return gfc_resolve_atan (f, x);
kono
parents:
diff changeset
2864 case GFC_ISYM_ATAN2:
kono
parents:
diff changeset
2865 /* NB. arg3 is unused for atan2 */
kono
parents:
diff changeset
2866 return gfc_resolve_atan2 (f, x, NULL);
kono
parents:
diff changeset
2867 case GFC_ISYM_COS:
kono
parents:
diff changeset
2868 return gfc_resolve_cos (f, x);
kono
parents:
diff changeset
2869 case GFC_ISYM_COTAN:
kono
parents:
diff changeset
2870 return gfc_resolve_cotan (f, x);
kono
parents:
diff changeset
2871 case GFC_ISYM_SIN:
kono
parents:
diff changeset
2872 return gfc_resolve_sin (f, x);
kono
parents:
diff changeset
2873 case GFC_ISYM_TAN:
kono
parents:
diff changeset
2874 return gfc_resolve_tan (f, x);
kono
parents:
diff changeset
2875 default:
kono
parents:
diff changeset
2876 gcc_unreachable ();
kono
parents:
diff changeset
2877 }
kono
parents:
diff changeset
2878 }
kono
parents:
diff changeset
2879
kono
parents:
diff changeset
2880 /* Resolve degree trig function as trigd (x) = trig (radians (x)). */
kono
parents:
diff changeset
2881
kono
parents:
diff changeset
2882 void
kono
parents:
diff changeset
2883 gfc_resolve_trigd (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
2884 {
kono
parents:
diff changeset
2885 if (is_trig_resolved (f))
kono
parents:
diff changeset
2886 return;
kono
parents:
diff changeset
2887
kono
parents:
diff changeset
2888 x = get_radians (x);
kono
parents:
diff changeset
2889 f->value.function.actual->expr = x;
kono
parents:
diff changeset
2890
kono
parents:
diff changeset
2891 resolve_trig_call (f, x);
kono
parents:
diff changeset
2892 }
kono
parents:
diff changeset
2893
kono
parents:
diff changeset
2894
kono
parents:
diff changeset
2895 /* Resolve degree inverse trig function as atrigd (x) = degrees (atrig (x)). */
kono
parents:
diff changeset
2896
kono
parents:
diff changeset
2897 void
kono
parents:
diff changeset
2898 gfc_resolve_atrigd (gfc_expr *f, gfc_expr *x)
kono
parents:
diff changeset
2899 {
kono
parents:
diff changeset
2900 gfc_expr *result, *fcopy;
kono
parents:
diff changeset
2901
kono
parents:
diff changeset
2902 if (is_trig_resolved (f))
kono
parents:
diff changeset
2903 return;
kono
parents:
diff changeset
2904
kono
parents:
diff changeset
2905 resolve_trig_call (f, x);
kono
parents:
diff changeset
2906
kono
parents:
diff changeset
2907 fcopy = copy_replace_function_shallow (f);
kono
parents:
diff changeset
2908 result = get_degrees (fcopy);
kono
parents:
diff changeset
2909 gfc_replace_expr (f, result);
kono
parents:
diff changeset
2910 }
kono
parents:
diff changeset
2911
kono
parents:
diff changeset
2912
kono
parents:
diff changeset
2913 /* Resolve atan2d(x) = degrees(atan2(x)). */
kono
parents:
diff changeset
2914
kono
parents:
diff changeset
2915 void
kono
parents:
diff changeset
2916 gfc_resolve_atan2d (gfc_expr *f, gfc_expr *x, gfc_expr *y ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
2917 {
kono
parents:
diff changeset
2918 /* Note that we lose the second arg here - that's okay because it is
kono
parents:
diff changeset
2919 unused in gfc_resolve_atan2 anyway. */
kono
parents:
diff changeset
2920 gfc_resolve_atrigd (f, x);
kono
parents:
diff changeset
2921 }
kono
parents:
diff changeset
2922
kono
parents:
diff changeset
2923
kono
parents:
diff changeset
2924 /* Resolve failed_images (team, kind). */
kono
parents:
diff changeset
2925
kono
parents:
diff changeset
2926 void
kono
parents:
diff changeset
2927 gfc_resolve_failed_images (gfc_expr *f, gfc_expr *team ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
2928 gfc_expr *kind)
kono
parents:
diff changeset
2929 {
kono
parents:
diff changeset
2930 static char failed_images[] = "_gfortran_caf_failed_images";
kono
parents:
diff changeset
2931 f->rank = 1;
kono
parents:
diff changeset
2932 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2933 if (kind == NULL)
kono
parents:
diff changeset
2934 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
2935 else
kono
parents:
diff changeset
2936 gfc_extract_int (kind, &f->ts.kind);
kono
parents:
diff changeset
2937 f->value.function.name = failed_images;
kono
parents:
diff changeset
2938 }
kono
parents:
diff changeset
2939
kono
parents:
diff changeset
2940
kono
parents:
diff changeset
2941 /* Resolve image_status (image, team). */
kono
parents:
diff changeset
2942
kono
parents:
diff changeset
2943 void
kono
parents:
diff changeset
2944 gfc_resolve_image_status (gfc_expr *f, gfc_expr *image ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
2945 gfc_expr *team ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
2946 {
kono
parents:
diff changeset
2947 static char image_status[] = "_gfortran_caf_image_status";
kono
parents:
diff changeset
2948 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2949 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
2950 f->value.function.name = image_status;
kono
parents:
diff changeset
2951 }
kono
parents:
diff changeset
2952
kono
parents:
diff changeset
2953
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2954 /* Resolve get_team (). */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2955
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2956 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2957 gfc_resolve_get_team (gfc_expr *f, gfc_expr *level ATTRIBUTE_UNUSED)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2958 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2959 static char get_team[] = "_gfortran_caf_get_team";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2960 f->rank = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2961 f->ts.type = BT_INTEGER;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2962 f->ts.kind = gfc_default_integer_kind;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2963 f->value.function.name = get_team;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2964 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2965
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2966
111
kono
parents:
diff changeset
2967 /* Resolve image_index (...). */
kono
parents:
diff changeset
2968
kono
parents:
diff changeset
2969 void
kono
parents:
diff changeset
2970 gfc_resolve_image_index (gfc_expr *f, gfc_expr *array ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
2971 gfc_expr *sub ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
2972 {
kono
parents:
diff changeset
2973 static char image_index[] = "__image_index";
kono
parents:
diff changeset
2974 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2975 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
2976 f->value.function.name = image_index;
kono
parents:
diff changeset
2977 }
kono
parents:
diff changeset
2978
kono
parents:
diff changeset
2979
kono
parents:
diff changeset
2980 /* Resolve stopped_images (team, kind). */
kono
parents:
diff changeset
2981
kono
parents:
diff changeset
2982 void
kono
parents:
diff changeset
2983 gfc_resolve_stopped_images (gfc_expr *f, gfc_expr *team ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
2984 gfc_expr *kind)
kono
parents:
diff changeset
2985 {
kono
parents:
diff changeset
2986 static char stopped_images[] = "_gfortran_caf_stopped_images";
kono
parents:
diff changeset
2987 f->rank = 1;
kono
parents:
diff changeset
2988 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
2989 if (kind == NULL)
kono
parents:
diff changeset
2990 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
2991 else
kono
parents:
diff changeset
2992 gfc_extract_int (kind, &f->ts.kind);
kono
parents:
diff changeset
2993 f->value.function.name = stopped_images;
kono
parents:
diff changeset
2994 }
kono
parents:
diff changeset
2995
kono
parents:
diff changeset
2996
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2997 /* Resolve team_number (team). */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2998
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2999 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3000 gfc_resolve_team_number (gfc_expr *f, gfc_expr *team ATTRIBUTE_UNUSED)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3001 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3002 static char team_number[] = "_gfortran_caf_team_number";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3003 f->rank = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3004 f->ts.type = BT_INTEGER;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3005 f->ts.kind = gfc_default_integer_kind;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3006 f->value.function.name = team_number;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3007 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3008
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3009
111
kono
parents:
diff changeset
3010 void
kono
parents:
diff changeset
3011 gfc_resolve_this_image (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
kono
parents:
diff changeset
3012 gfc_expr *distance ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
3013 {
kono
parents:
diff changeset
3014 static char this_image[] = "__this_image";
kono
parents:
diff changeset
3015 if (array && gfc_is_coarray (array))
kono
parents:
diff changeset
3016 resolve_bound (f, array, dim, NULL, "__this_image", true);
kono
parents:
diff changeset
3017 else
kono
parents:
diff changeset
3018 {
kono
parents:
diff changeset
3019 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
3020 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
3021 f->value.function.name = this_image;
kono
parents:
diff changeset
3022 }
kono
parents:
diff changeset
3023 }
kono
parents:
diff changeset
3024
kono
parents:
diff changeset
3025
kono
parents:
diff changeset
3026 void
kono
parents:
diff changeset
3027 gfc_resolve_time (gfc_expr *f)
kono
parents:
diff changeset
3028 {
kono
parents:
diff changeset
3029 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
3030 f->ts.kind = 4;
kono
parents:
diff changeset
3031 f->value.function.name = gfc_get_string (PREFIX ("time_func"));
kono
parents:
diff changeset
3032 }
kono
parents:
diff changeset
3033
kono
parents:
diff changeset
3034
kono
parents:
diff changeset
3035 void
kono
parents:
diff changeset
3036 gfc_resolve_time8 (gfc_expr *f)
kono
parents:
diff changeset
3037 {
kono
parents:
diff changeset
3038 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
3039 f->ts.kind = 8;
kono
parents:
diff changeset
3040 f->value.function.name = gfc_get_string (PREFIX ("time8_func"));
kono
parents:
diff changeset
3041 }
kono
parents:
diff changeset
3042
kono
parents:
diff changeset
3043
kono
parents:
diff changeset
3044 void
kono
parents:
diff changeset
3045 gfc_resolve_transfer (gfc_expr *f, gfc_expr *source ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
3046 gfc_expr *mold, gfc_expr *size)
kono
parents:
diff changeset
3047 {
kono
parents:
diff changeset
3048 /* TODO: Make this do something meaningful. */
kono
parents:
diff changeset
3049 static char transfer0[] = "__transfer0", transfer1[] = "__transfer1";
kono
parents:
diff changeset
3050
kono
parents:
diff changeset
3051 if (mold->ts.type == BT_CHARACTER
kono
parents:
diff changeset
3052 && !mold->ts.u.cl->length
kono
parents:
diff changeset
3053 && gfc_is_constant_expr (mold))
kono
parents:
diff changeset
3054 {
kono
parents:
diff changeset
3055 int len;
kono
parents:
diff changeset
3056 if (mold->expr_type == EXPR_CONSTANT)
kono
parents:
diff changeset
3057 {
kono
parents:
diff changeset
3058 len = mold->value.character.length;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3059 mold->ts.u.cl->length = gfc_get_int_expr (gfc_charlen_int_kind,
111
kono
parents:
diff changeset
3060 NULL, len);
kono
parents:
diff changeset
3061 }
kono
parents:
diff changeset
3062 else
kono
parents:
diff changeset
3063 {
kono
parents:
diff changeset
3064 gfc_constructor *c = gfc_constructor_first (mold->value.constructor);
kono
parents:
diff changeset
3065 len = c->expr->value.character.length;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3066 mold->ts.u.cl->length = gfc_get_int_expr (gfc_charlen_int_kind,
111
kono
parents:
diff changeset
3067 NULL, len);
kono
parents:
diff changeset
3068 }
kono
parents:
diff changeset
3069 }
kono
parents:
diff changeset
3070
kono
parents:
diff changeset
3071 f->ts = mold->ts;
kono
parents:
diff changeset
3072
kono
parents:
diff changeset
3073 if (size == NULL && mold->rank == 0)
kono
parents:
diff changeset
3074 {
kono
parents:
diff changeset
3075 f->rank = 0;
kono
parents:
diff changeset
3076 f->value.function.name = transfer0;
kono
parents:
diff changeset
3077 }
kono
parents:
diff changeset
3078 else
kono
parents:
diff changeset
3079 {
kono
parents:
diff changeset
3080 f->rank = 1;
kono
parents:
diff changeset
3081 f->value.function.name = transfer1;
kono
parents:
diff changeset
3082 if (size && gfc_is_constant_expr (size))
kono
parents:
diff changeset
3083 {
kono
parents:
diff changeset
3084 f->shape = gfc_get_shape (1);
kono
parents:
diff changeset
3085 mpz_init_set (f->shape[0], size->value.integer);
kono
parents:
diff changeset
3086 }
kono
parents:
diff changeset
3087 }
kono
parents:
diff changeset
3088 }
kono
parents:
diff changeset
3089
kono
parents:
diff changeset
3090
kono
parents:
diff changeset
3091 void
kono
parents:
diff changeset
3092 gfc_resolve_transpose (gfc_expr *f, gfc_expr *matrix)
kono
parents:
diff changeset
3093 {
kono
parents:
diff changeset
3094
kono
parents:
diff changeset
3095 if (matrix->ts.type == BT_CHARACTER && matrix->ref)
kono
parents:
diff changeset
3096 gfc_resolve_substring_charlen (matrix);
kono
parents:
diff changeset
3097
kono
parents:
diff changeset
3098 f->ts = matrix->ts;
kono
parents:
diff changeset
3099 f->rank = 2;
kono
parents:
diff changeset
3100 if (matrix->shape)
kono
parents:
diff changeset
3101 {
kono
parents:
diff changeset
3102 f->shape = gfc_get_shape (2);
kono
parents:
diff changeset
3103 mpz_init_set (f->shape[0], matrix->shape[1]);
kono
parents:
diff changeset
3104 mpz_init_set (f->shape[1], matrix->shape[0]);
kono
parents:
diff changeset
3105 }
kono
parents:
diff changeset
3106
kono
parents:
diff changeset
3107 switch (matrix->ts.kind)
kono
parents:
diff changeset
3108 {
kono
parents:
diff changeset
3109 case 4:
kono
parents:
diff changeset
3110 case 8:
kono
parents:
diff changeset
3111 case 10:
kono
parents:
diff changeset
3112 case 16:
kono
parents:
diff changeset
3113 switch (matrix->ts.type)
kono
parents:
diff changeset
3114 {
kono
parents:
diff changeset
3115 case BT_REAL:
kono
parents:
diff changeset
3116 case BT_COMPLEX:
kono
parents:
diff changeset
3117 f->value.function.name
kono
parents:
diff changeset
3118 = gfc_get_string (PREFIX ("transpose_%c%d"),
kono
parents:
diff changeset
3119 gfc_type_letter (matrix->ts.type),
kono
parents:
diff changeset
3120 matrix->ts.kind);
kono
parents:
diff changeset
3121 break;
kono
parents:
diff changeset
3122
kono
parents:
diff changeset
3123 case BT_INTEGER:
kono
parents:
diff changeset
3124 case BT_LOGICAL:
kono
parents:
diff changeset
3125 /* Use the integer routines for real and logical cases. This
kono
parents:
diff changeset
3126 assumes they all have the same alignment requirements. */
kono
parents:
diff changeset
3127 f->value.function.name
kono
parents:
diff changeset
3128 = gfc_get_string (PREFIX ("transpose_i%d"), matrix->ts.kind);
kono
parents:
diff changeset
3129 break;
kono
parents:
diff changeset
3130
kono
parents:
diff changeset
3131 default:
kono
parents:
diff changeset
3132 if (matrix->ts.type == BT_CHARACTER && matrix->ts.kind == 4)
kono
parents:
diff changeset
3133 f->value.function.name = PREFIX ("transpose_char4");
kono
parents:
diff changeset
3134 else
kono
parents:
diff changeset
3135 f->value.function.name = PREFIX ("transpose");
kono
parents:
diff changeset
3136 break;
kono
parents:
diff changeset
3137 }
kono
parents:
diff changeset
3138 break;
kono
parents:
diff changeset
3139
kono
parents:
diff changeset
3140 default:
kono
parents:
diff changeset
3141 f->value.function.name = (matrix->ts.type == BT_CHARACTER
kono
parents:
diff changeset
3142 ? PREFIX ("transpose_char")
kono
parents:
diff changeset
3143 : PREFIX ("transpose"));
kono
parents:
diff changeset
3144 break;
kono
parents:
diff changeset
3145 }
kono
parents:
diff changeset
3146 }
kono
parents:
diff changeset
3147
kono
parents:
diff changeset
3148
kono
parents:
diff changeset
3149 void
kono
parents:
diff changeset
3150 gfc_resolve_trim (gfc_expr *f, gfc_expr *string)
kono
parents:
diff changeset
3151 {
kono
parents:
diff changeset
3152 f->ts.type = BT_CHARACTER;
kono
parents:
diff changeset
3153 f->ts.kind = string->ts.kind;
kono
parents:
diff changeset
3154 f->value.function.name = gfc_get_string ("__trim_%d", string->ts.kind);
kono
parents:
diff changeset
3155 }
kono
parents:
diff changeset
3156
kono
parents:
diff changeset
3157
kono
parents:
diff changeset
3158 void
kono
parents:
diff changeset
3159 gfc_resolve_ubound (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
kono
parents:
diff changeset
3160 {
kono
parents:
diff changeset
3161 resolve_bound (f, array, dim, kind, "__ubound", false);
kono
parents:
diff changeset
3162 }
kono
parents:
diff changeset
3163
kono
parents:
diff changeset
3164
kono
parents:
diff changeset
3165 void
kono
parents:
diff changeset
3166 gfc_resolve_ucobound (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
kono
parents:
diff changeset
3167 {
kono
parents:
diff changeset
3168 resolve_bound (f, array, dim, kind, "__ucobound", true);
kono
parents:
diff changeset
3169 }
kono
parents:
diff changeset
3170
kono
parents:
diff changeset
3171
kono
parents:
diff changeset
3172 /* Resolve the g77 compatibility function UMASK. */
kono
parents:
diff changeset
3173
kono
parents:
diff changeset
3174 void
kono
parents:
diff changeset
3175 gfc_resolve_umask (gfc_expr *f, gfc_expr *n)
kono
parents:
diff changeset
3176 {
kono
parents:
diff changeset
3177 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
3178 f->ts.kind = n->ts.kind;
kono
parents:
diff changeset
3179 f->value.function.name = gfc_get_string (PREFIX ("umask_i%d"), n->ts.kind);
kono
parents:
diff changeset
3180 }
kono
parents:
diff changeset
3181
kono
parents:
diff changeset
3182
kono
parents:
diff changeset
3183 /* Resolve the g77 compatibility function UNLINK. */
kono
parents:
diff changeset
3184
kono
parents:
diff changeset
3185 void
kono
parents:
diff changeset
3186 gfc_resolve_unlink (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
3187 {
kono
parents:
diff changeset
3188 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
3189 f->ts.kind = 4;
kono
parents:
diff changeset
3190 f->value.function.name = gfc_get_string (PREFIX ("unlink"));
kono
parents:
diff changeset
3191 }
kono
parents:
diff changeset
3192
kono
parents:
diff changeset
3193
kono
parents:
diff changeset
3194 void
kono
parents:
diff changeset
3195 gfc_resolve_ttynam (gfc_expr *f, gfc_expr *unit)
kono
parents:
diff changeset
3196 {
kono
parents:
diff changeset
3197 gfc_typespec ts;
kono
parents:
diff changeset
3198 gfc_clear_ts (&ts);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3199
111
kono
parents:
diff changeset
3200 f->ts.type = BT_CHARACTER;
kono
parents:
diff changeset
3201 f->ts.kind = gfc_default_character_kind;
kono
parents:
diff changeset
3202
kono
parents:
diff changeset
3203 if (unit->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
3204 {
kono
parents:
diff changeset
3205 ts.type = BT_INTEGER;
kono
parents:
diff changeset
3206 ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
3207 ts.u.derived = NULL;
kono
parents:
diff changeset
3208 ts.u.cl = NULL;
kono
parents:
diff changeset
3209 gfc_convert_type (unit, &ts, 2);
kono
parents:
diff changeset
3210 }
kono
parents:
diff changeset
3211
kono
parents:
diff changeset
3212 f->value.function.name = gfc_get_string (PREFIX ("ttynam"));
kono
parents:
diff changeset
3213 }
kono
parents:
diff changeset
3214
kono
parents:
diff changeset
3215
kono
parents:
diff changeset
3216 void
kono
parents:
diff changeset
3217 gfc_resolve_unpack (gfc_expr *f, gfc_expr *vector, gfc_expr *mask,
kono
parents:
diff changeset
3218 gfc_expr *field ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
3219 {
kono
parents:
diff changeset
3220 if (vector->ts.type == BT_CHARACTER && vector->ref)
kono
parents:
diff changeset
3221 gfc_resolve_substring_charlen (vector);
kono
parents:
diff changeset
3222
kono
parents:
diff changeset
3223 f->ts = vector->ts;
kono
parents:
diff changeset
3224 f->rank = mask->rank;
kono
parents:
diff changeset
3225 resolve_mask_arg (mask);
kono
parents:
diff changeset
3226
kono
parents:
diff changeset
3227 if (vector->ts.type == BT_CHARACTER)
kono
parents:
diff changeset
3228 {
kono
parents:
diff changeset
3229 if (vector->ts.kind == 1)
kono
parents:
diff changeset
3230 f->value.function.name
kono
parents:
diff changeset
3231 = gfc_get_string (PREFIX ("unpack%d_char"), field->rank > 0 ? 1 : 0);
kono
parents:
diff changeset
3232 else
kono
parents:
diff changeset
3233 f->value.function.name
kono
parents:
diff changeset
3234 = gfc_get_string (PREFIX ("unpack%d_char%d"),
kono
parents:
diff changeset
3235 field->rank > 0 ? 1 : 0, vector->ts.kind);
kono
parents:
diff changeset
3236 }
kono
parents:
diff changeset
3237 else
kono
parents:
diff changeset
3238 f->value.function.name
kono
parents:
diff changeset
3239 = gfc_get_string (PREFIX ("unpack%d"), field->rank > 0 ? 1 : 0);
kono
parents:
diff changeset
3240 }
kono
parents:
diff changeset
3241
kono
parents:
diff changeset
3242
kono
parents:
diff changeset
3243 void
kono
parents:
diff changeset
3244 gfc_resolve_verify (gfc_expr *f, gfc_expr *string,
kono
parents:
diff changeset
3245 gfc_expr *set ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
3246 gfc_expr *back ATTRIBUTE_UNUSED, gfc_expr *kind)
kono
parents:
diff changeset
3247 {
kono
parents:
diff changeset
3248 f->ts.type = BT_INTEGER;
kono
parents:
diff changeset
3249 if (kind)
kono
parents:
diff changeset
3250 f->ts.kind = mpz_get_si (kind->value.integer);
kono
parents:
diff changeset
3251 else
kono
parents:
diff changeset
3252 f->ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
3253 f->value.function.name = gfc_get_string ("__verify_%d", string->ts.kind);
kono
parents:
diff changeset
3254 }
kono
parents:
diff changeset
3255
kono
parents:
diff changeset
3256
kono
parents:
diff changeset
3257 void
kono
parents:
diff changeset
3258 gfc_resolve_xor (gfc_expr *f, gfc_expr *i, gfc_expr *j)
kono
parents:
diff changeset
3259 {
kono
parents:
diff changeset
3260 f->ts.type = i->ts.type;
kono
parents:
diff changeset
3261 f->ts.kind = gfc_kind_max (i, j);
kono
parents:
diff changeset
3262
kono
parents:
diff changeset
3263 if (i->ts.kind != j->ts.kind)
kono
parents:
diff changeset
3264 {
kono
parents:
diff changeset
3265 if (i->ts.kind == gfc_kind_max (i, j))
kono
parents:
diff changeset
3266 gfc_convert_type (j, &i->ts, 2);
kono
parents:
diff changeset
3267 else
kono
parents:
diff changeset
3268 gfc_convert_type (i, &j->ts, 2);
kono
parents:
diff changeset
3269 }
kono
parents:
diff changeset
3270
kono
parents:
diff changeset
3271 f->value.function.name
kono
parents:
diff changeset
3272 = gfc_get_string ("__xor_%c%d", gfc_type_letter (i->ts.type), f->ts.kind);
kono
parents:
diff changeset
3273 }
kono
parents:
diff changeset
3274
kono
parents:
diff changeset
3275
kono
parents:
diff changeset
3276 /* Intrinsic subroutine resolution. */
kono
parents:
diff changeset
3277
kono
parents:
diff changeset
3278 void
kono
parents:
diff changeset
3279 gfc_resolve_alarm_sub (gfc_code *c)
kono
parents:
diff changeset
3280 {
kono
parents:
diff changeset
3281 const char *name;
kono
parents:
diff changeset
3282 gfc_expr *seconds, *handler;
kono
parents:
diff changeset
3283 gfc_typespec ts;
kono
parents:
diff changeset
3284 gfc_clear_ts (&ts);
kono
parents:
diff changeset
3285
kono
parents:
diff changeset
3286 seconds = c->ext.actual->expr;
kono
parents:
diff changeset
3287 handler = c->ext.actual->next->expr;
kono
parents:
diff changeset
3288 ts.type = BT_INTEGER;
kono
parents:
diff changeset
3289 ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
3290
kono
parents:
diff changeset
3291 /* handler can be either BT_INTEGER or BT_PROCEDURE.
kono
parents:
diff changeset
3292 In all cases, the status argument is of default integer kind
kono
parents:
diff changeset
3293 (enforced in check.c) so that the function suffix is fixed. */
kono
parents:
diff changeset
3294 if (handler->ts.type == BT_INTEGER)
kono
parents:
diff changeset
3295 {
kono
parents:
diff changeset
3296 if (handler->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
3297 gfc_convert_type (handler, &ts, 2);
kono
parents:
diff changeset
3298 name = gfc_get_string (PREFIX ("alarm_sub_int_i%d"),
kono
parents:
diff changeset
3299 gfc_default_integer_kind);
kono
parents:
diff changeset
3300 }
kono
parents:
diff changeset
3301 else
kono
parents:
diff changeset
3302 name = gfc_get_string (PREFIX ("alarm_sub_i%d"),
kono
parents:
diff changeset
3303 gfc_default_integer_kind);
kono
parents:
diff changeset
3304
kono
parents:
diff changeset
3305 if (seconds->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
3306 gfc_convert_type (seconds, &ts, 2);
kono
parents:
diff changeset
3307
kono
parents:
diff changeset
3308 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3309 }
kono
parents:
diff changeset
3310
kono
parents:
diff changeset
3311 void
kono
parents:
diff changeset
3312 gfc_resolve_cpu_time (gfc_code *c)
kono
parents:
diff changeset
3313 {
kono
parents:
diff changeset
3314 const char *name;
kono
parents:
diff changeset
3315 name = gfc_get_string (PREFIX ("cpu_time_%d"), c->ext.actual->expr->ts.kind);
kono
parents:
diff changeset
3316 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3317 }
kono
parents:
diff changeset
3318
kono
parents:
diff changeset
3319
kono
parents:
diff changeset
3320 /* Create a formal arglist based on an actual one and set the INTENTs given. */
kono
parents:
diff changeset
3321
kono
parents:
diff changeset
3322 static gfc_formal_arglist*
kono
parents:
diff changeset
3323 create_formal_for_intents (gfc_actual_arglist* actual, const sym_intent* ints)
kono
parents:
diff changeset
3324 {
kono
parents:
diff changeset
3325 gfc_formal_arglist* head;
kono
parents:
diff changeset
3326 gfc_formal_arglist* tail;
kono
parents:
diff changeset
3327 int i;
kono
parents:
diff changeset
3328
kono
parents:
diff changeset
3329 if (!actual)
kono
parents:
diff changeset
3330 return NULL;
kono
parents:
diff changeset
3331
kono
parents:
diff changeset
3332 head = tail = gfc_get_formal_arglist ();
kono
parents:
diff changeset
3333 for (i = 0; actual; actual = actual->next, tail = tail->next, ++i)
kono
parents:
diff changeset
3334 {
kono
parents:
diff changeset
3335 gfc_symbol* sym;
kono
parents:
diff changeset
3336
kono
parents:
diff changeset
3337 sym = gfc_new_symbol ("dummyarg", NULL);
kono
parents:
diff changeset
3338 sym->ts = actual->expr->ts;
kono
parents:
diff changeset
3339
kono
parents:
diff changeset
3340 sym->attr.intent = ints[i];
kono
parents:
diff changeset
3341 tail->sym = sym;
kono
parents:
diff changeset
3342
kono
parents:
diff changeset
3343 if (actual->next)
kono
parents:
diff changeset
3344 tail->next = gfc_get_formal_arglist ();
kono
parents:
diff changeset
3345 }
kono
parents:
diff changeset
3346
kono
parents:
diff changeset
3347 return head;
kono
parents:
diff changeset
3348 }
kono
parents:
diff changeset
3349
kono
parents:
diff changeset
3350
kono
parents:
diff changeset
3351 void
kono
parents:
diff changeset
3352 gfc_resolve_atomic_def (gfc_code *c)
kono
parents:
diff changeset
3353 {
kono
parents:
diff changeset
3354 const char *name = "atomic_define";
kono
parents:
diff changeset
3355 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3356 }
kono
parents:
diff changeset
3357
kono
parents:
diff changeset
3358
kono
parents:
diff changeset
3359 void
kono
parents:
diff changeset
3360 gfc_resolve_atomic_ref (gfc_code *c)
kono
parents:
diff changeset
3361 {
kono
parents:
diff changeset
3362 const char *name = "atomic_ref";
kono
parents:
diff changeset
3363 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3364 }
kono
parents:
diff changeset
3365
kono
parents:
diff changeset
3366 void
kono
parents:
diff changeset
3367 gfc_resolve_event_query (gfc_code *c)
kono
parents:
diff changeset
3368 {
kono
parents:
diff changeset
3369 const char *name = "event_query";
kono
parents:
diff changeset
3370 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3371 }
kono
parents:
diff changeset
3372
kono
parents:
diff changeset
3373 void
kono
parents:
diff changeset
3374 gfc_resolve_mvbits (gfc_code *c)
kono
parents:
diff changeset
3375 {
kono
parents:
diff changeset
3376 static const sym_intent INTENTS[] = {INTENT_IN, INTENT_IN, INTENT_IN,
kono
parents:
diff changeset
3377 INTENT_INOUT, INTENT_IN};
kono
parents:
diff changeset
3378
kono
parents:
diff changeset
3379 const char *name;
kono
parents:
diff changeset
3380 gfc_typespec ts;
kono
parents:
diff changeset
3381 gfc_clear_ts (&ts);
kono
parents:
diff changeset
3382
kono
parents:
diff changeset
3383 /* FROMPOS, LEN and TOPOS are restricted to small values. As such,
kono
parents:
diff changeset
3384 they will be converted so that they fit into a C int. */
kono
parents:
diff changeset
3385 ts.type = BT_INTEGER;
kono
parents:
diff changeset
3386 ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
3387 if (c->ext.actual->next->expr->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
3388 gfc_convert_type (c->ext.actual->next->expr, &ts, 2);
kono
parents:
diff changeset
3389 if (c->ext.actual->next->next->expr->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
3390 gfc_convert_type (c->ext.actual->next->next->expr, &ts, 2);
kono
parents:
diff changeset
3391 if (c->ext.actual->next->next->next->next->expr->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
3392 gfc_convert_type (c->ext.actual->next->next->next->next->expr, &ts, 2);
kono
parents:
diff changeset
3393
kono
parents:
diff changeset
3394 /* TO and FROM are guaranteed to have the same kind parameter. */
kono
parents:
diff changeset
3395 name = gfc_get_string (PREFIX ("mvbits_i%d"),
kono
parents:
diff changeset
3396 c->ext.actual->expr->ts.kind);
kono
parents:
diff changeset
3397 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3398 /* Mark as elemental subroutine as this does not happen automatically. */
kono
parents:
diff changeset
3399 c->resolved_sym->attr.elemental = 1;
kono
parents:
diff changeset
3400
kono
parents:
diff changeset
3401 /* Create a dummy formal arglist so the INTENTs are known later for purpose
kono
parents:
diff changeset
3402 of creating temporaries. */
kono
parents:
diff changeset
3403 c->resolved_sym->formal = create_formal_for_intents (c->ext.actual, INTENTS);
kono
parents:
diff changeset
3404 }
kono
parents:
diff changeset
3405
kono
parents:
diff changeset
3406
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3407 /* Set up the call to RANDOM_INIT. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3408
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3409 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3410 gfc_resolve_random_init (gfc_code *c)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3411 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3412 const char *name;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3413 name = gfc_get_string (PREFIX ("random_init"));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3414 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3415 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3416
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3417
111
kono
parents:
diff changeset
3418 void
kono
parents:
diff changeset
3419 gfc_resolve_random_number (gfc_code *c)
kono
parents:
diff changeset
3420 {
kono
parents:
diff changeset
3421 const char *name;
kono
parents:
diff changeset
3422 int kind;
kono
parents:
diff changeset
3423
kono
parents:
diff changeset
3424 kind = c->ext.actual->expr->ts.kind;
kono
parents:
diff changeset
3425 if (c->ext.actual->expr->rank == 0)
kono
parents:
diff changeset
3426 name = gfc_get_string (PREFIX ("random_r%d"), kind);
kono
parents:
diff changeset
3427 else
kono
parents:
diff changeset
3428 name = gfc_get_string (PREFIX ("arandom_r%d"), kind);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3429
111
kono
parents:
diff changeset
3430 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3431 }
kono
parents:
diff changeset
3432
kono
parents:
diff changeset
3433
kono
parents:
diff changeset
3434 void
kono
parents:
diff changeset
3435 gfc_resolve_random_seed (gfc_code *c)
kono
parents:
diff changeset
3436 {
kono
parents:
diff changeset
3437 const char *name;
kono
parents:
diff changeset
3438
kono
parents:
diff changeset
3439 name = gfc_get_string (PREFIX ("random_seed_i%d"), gfc_default_integer_kind);
kono
parents:
diff changeset
3440 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3441 }
kono
parents:
diff changeset
3442
kono
parents:
diff changeset
3443
kono
parents:
diff changeset
3444 void
kono
parents:
diff changeset
3445 gfc_resolve_rename_sub (gfc_code *c)
kono
parents:
diff changeset
3446 {
kono
parents:
diff changeset
3447 const char *name;
kono
parents:
diff changeset
3448 int kind;
kono
parents:
diff changeset
3449
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3450 /* Find the type of status. If not present use default integer kind. */
111
kono
parents:
diff changeset
3451 if (c->ext.actual->next->next->expr != NULL)
kono
parents:
diff changeset
3452 kind = c->ext.actual->next->next->expr->ts.kind;
kono
parents:
diff changeset
3453 else
kono
parents:
diff changeset
3454 kind = gfc_default_integer_kind;
kono
parents:
diff changeset
3455
kono
parents:
diff changeset
3456 name = gfc_get_string (PREFIX ("rename_i%d_sub"), kind);
kono
parents:
diff changeset
3457 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3458 }
kono
parents:
diff changeset
3459
kono
parents:
diff changeset
3460
kono
parents:
diff changeset
3461 void
kono
parents:
diff changeset
3462 gfc_resolve_link_sub (gfc_code *c)
kono
parents:
diff changeset
3463 {
kono
parents:
diff changeset
3464 const char *name;
kono
parents:
diff changeset
3465 int kind;
kono
parents:
diff changeset
3466
kono
parents:
diff changeset
3467 if (c->ext.actual->next->next->expr != NULL)
kono
parents:
diff changeset
3468 kind = c->ext.actual->next->next->expr->ts.kind;
kono
parents:
diff changeset
3469 else
kono
parents:
diff changeset
3470 kind = gfc_default_integer_kind;
kono
parents:
diff changeset
3471
kono
parents:
diff changeset
3472 name = gfc_get_string (PREFIX ("link_i%d_sub"), kind);
kono
parents:
diff changeset
3473 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3474 }
kono
parents:
diff changeset
3475
kono
parents:
diff changeset
3476
kono
parents:
diff changeset
3477 void
kono
parents:
diff changeset
3478 gfc_resolve_symlnk_sub (gfc_code *c)
kono
parents:
diff changeset
3479 {
kono
parents:
diff changeset
3480 const char *name;
kono
parents:
diff changeset
3481 int kind;
kono
parents:
diff changeset
3482
kono
parents:
diff changeset
3483 if (c->ext.actual->next->next->expr != NULL)
kono
parents:
diff changeset
3484 kind = c->ext.actual->next->next->expr->ts.kind;
kono
parents:
diff changeset
3485 else
kono
parents:
diff changeset
3486 kind = gfc_default_integer_kind;
kono
parents:
diff changeset
3487
kono
parents:
diff changeset
3488 name = gfc_get_string (PREFIX ("symlnk_i%d_sub"), kind);
kono
parents:
diff changeset
3489 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3490 }
kono
parents:
diff changeset
3491
kono
parents:
diff changeset
3492
kono
parents:
diff changeset
3493 /* G77 compatibility subroutines dtime() and etime(). */
kono
parents:
diff changeset
3494
kono
parents:
diff changeset
3495 void
kono
parents:
diff changeset
3496 gfc_resolve_dtime_sub (gfc_code *c)
kono
parents:
diff changeset
3497 {
kono
parents:
diff changeset
3498 const char *name;
kono
parents:
diff changeset
3499 name = gfc_get_string (PREFIX ("dtime_sub"));
kono
parents:
diff changeset
3500 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3501 }
kono
parents:
diff changeset
3502
kono
parents:
diff changeset
3503 void
kono
parents:
diff changeset
3504 gfc_resolve_etime_sub (gfc_code *c)
kono
parents:
diff changeset
3505 {
kono
parents:
diff changeset
3506 const char *name;
kono
parents:
diff changeset
3507 name = gfc_get_string (PREFIX ("etime_sub"));
kono
parents:
diff changeset
3508 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3509 }
kono
parents:
diff changeset
3510
kono
parents:
diff changeset
3511
kono
parents:
diff changeset
3512 /* G77 compatibility subroutines itime(), idate(), ltime() and gmtime(). */
kono
parents:
diff changeset
3513
kono
parents:
diff changeset
3514 void
kono
parents:
diff changeset
3515 gfc_resolve_itime (gfc_code *c)
kono
parents:
diff changeset
3516 {
kono
parents:
diff changeset
3517 c->resolved_sym
kono
parents:
diff changeset
3518 = gfc_get_intrinsic_sub_symbol (gfc_get_string (PREFIX ("itime_i%d"),
kono
parents:
diff changeset
3519 gfc_default_integer_kind));
kono
parents:
diff changeset
3520 }
kono
parents:
diff changeset
3521
kono
parents:
diff changeset
3522 void
kono
parents:
diff changeset
3523 gfc_resolve_idate (gfc_code *c)
kono
parents:
diff changeset
3524 {
kono
parents:
diff changeset
3525 c->resolved_sym
kono
parents:
diff changeset
3526 = gfc_get_intrinsic_sub_symbol (gfc_get_string (PREFIX ("idate_i%d"),
kono
parents:
diff changeset
3527 gfc_default_integer_kind));
kono
parents:
diff changeset
3528 }
kono
parents:
diff changeset
3529
kono
parents:
diff changeset
3530 void
kono
parents:
diff changeset
3531 gfc_resolve_ltime (gfc_code *c)
kono
parents:
diff changeset
3532 {
kono
parents:
diff changeset
3533 c->resolved_sym
kono
parents:
diff changeset
3534 = gfc_get_intrinsic_sub_symbol (gfc_get_string (PREFIX ("ltime_i%d"),
kono
parents:
diff changeset
3535 gfc_default_integer_kind));
kono
parents:
diff changeset
3536 }
kono
parents:
diff changeset
3537
kono
parents:
diff changeset
3538 void
kono
parents:
diff changeset
3539 gfc_resolve_gmtime (gfc_code *c)
kono
parents:
diff changeset
3540 {
kono
parents:
diff changeset
3541 c->resolved_sym
kono
parents:
diff changeset
3542 = gfc_get_intrinsic_sub_symbol (gfc_get_string (PREFIX ("gmtime_i%d"),
kono
parents:
diff changeset
3543 gfc_default_integer_kind));
kono
parents:
diff changeset
3544 }
kono
parents:
diff changeset
3545
kono
parents:
diff changeset
3546
kono
parents:
diff changeset
3547 /* G77 compatibility subroutine second(). */
kono
parents:
diff changeset
3548
kono
parents:
diff changeset
3549 void
kono
parents:
diff changeset
3550 gfc_resolve_second_sub (gfc_code *c)
kono
parents:
diff changeset
3551 {
kono
parents:
diff changeset
3552 const char *name;
kono
parents:
diff changeset
3553 name = gfc_get_string (PREFIX ("second_sub"));
kono
parents:
diff changeset
3554 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3555 }
kono
parents:
diff changeset
3556
kono
parents:
diff changeset
3557
kono
parents:
diff changeset
3558 void
kono
parents:
diff changeset
3559 gfc_resolve_sleep_sub (gfc_code *c)
kono
parents:
diff changeset
3560 {
kono
parents:
diff changeset
3561 const char *name;
kono
parents:
diff changeset
3562 int kind;
kono
parents:
diff changeset
3563
kono
parents:
diff changeset
3564 if (c->ext.actual->expr != NULL)
kono
parents:
diff changeset
3565 kind = c->ext.actual->expr->ts.kind;
kono
parents:
diff changeset
3566 else
kono
parents:
diff changeset
3567 kind = gfc_default_integer_kind;
kono
parents:
diff changeset
3568
kono
parents:
diff changeset
3569 name = gfc_get_string (PREFIX ("sleep_i%d_sub"), kind);
kono
parents:
diff changeset
3570 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3571 }
kono
parents:
diff changeset
3572
kono
parents:
diff changeset
3573
kono
parents:
diff changeset
3574 /* G77 compatibility function srand(). */
kono
parents:
diff changeset
3575
kono
parents:
diff changeset
3576 void
kono
parents:
diff changeset
3577 gfc_resolve_srand (gfc_code *c)
kono
parents:
diff changeset
3578 {
kono
parents:
diff changeset
3579 const char *name;
kono
parents:
diff changeset
3580 name = gfc_get_string (PREFIX ("srand"));
kono
parents:
diff changeset
3581 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3582 }
kono
parents:
diff changeset
3583
kono
parents:
diff changeset
3584
kono
parents:
diff changeset
3585 /* Resolve the getarg intrinsic subroutine. */
kono
parents:
diff changeset
3586
kono
parents:
diff changeset
3587 void
kono
parents:
diff changeset
3588 gfc_resolve_getarg (gfc_code *c)
kono
parents:
diff changeset
3589 {
kono
parents:
diff changeset
3590 const char *name;
kono
parents:
diff changeset
3591
kono
parents:
diff changeset
3592 if (c->ext.actual->expr->ts.kind != gfc_default_integer_kind)
kono
parents:
diff changeset
3593 {
kono
parents:
diff changeset
3594 gfc_typespec ts;
kono
parents:
diff changeset
3595 gfc_clear_ts (&ts);
kono
parents:
diff changeset
3596
kono
parents:
diff changeset
3597 ts.type = BT_INTEGER;
kono
parents:
diff changeset
3598 ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
3599
kono
parents:
diff changeset
3600 gfc_convert_type (c->ext.actual->expr, &ts, 2);
kono
parents:
diff changeset
3601 }
kono
parents:
diff changeset
3602
kono
parents:
diff changeset
3603 name = gfc_get_string (PREFIX ("getarg_i%d"), gfc_default_integer_kind);
kono
parents:
diff changeset
3604 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3605 }
kono
parents:
diff changeset
3606
kono
parents:
diff changeset
3607
kono
parents:
diff changeset
3608 /* Resolve the getcwd intrinsic subroutine. */
kono
parents:
diff changeset
3609
kono
parents:
diff changeset
3610 void
kono
parents:
diff changeset
3611 gfc_resolve_getcwd_sub (gfc_code *c)
kono
parents:
diff changeset
3612 {
kono
parents:
diff changeset
3613 const char *name;
kono
parents:
diff changeset
3614 int kind;
kono
parents:
diff changeset
3615
kono
parents:
diff changeset
3616 if (c->ext.actual->next->expr != NULL)
kono
parents:
diff changeset
3617 kind = c->ext.actual->next->expr->ts.kind;
kono
parents:
diff changeset
3618 else
kono
parents:
diff changeset
3619 kind = gfc_default_integer_kind;
kono
parents:
diff changeset
3620
kono
parents:
diff changeset
3621 name = gfc_get_string (PREFIX ("getcwd_i%d_sub"), kind);
kono
parents:
diff changeset
3622 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3623 }
kono
parents:
diff changeset
3624
kono
parents:
diff changeset
3625
kono
parents:
diff changeset
3626 /* Resolve the get_command intrinsic subroutine. */
kono
parents:
diff changeset
3627
kono
parents:
diff changeset
3628 void
kono
parents:
diff changeset
3629 gfc_resolve_get_command (gfc_code *c)
kono
parents:
diff changeset
3630 {
kono
parents:
diff changeset
3631 const char *name;
kono
parents:
diff changeset
3632 int kind;
kono
parents:
diff changeset
3633 kind = gfc_default_integer_kind;
kono
parents:
diff changeset
3634 name = gfc_get_string (PREFIX ("get_command_i%d"), kind);
kono
parents:
diff changeset
3635 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3636 }
kono
parents:
diff changeset
3637
kono
parents:
diff changeset
3638
kono
parents:
diff changeset
3639 /* Resolve the get_command_argument intrinsic subroutine. */
kono
parents:
diff changeset
3640
kono
parents:
diff changeset
3641 void
kono
parents:
diff changeset
3642 gfc_resolve_get_command_argument (gfc_code *c)
kono
parents:
diff changeset
3643 {
kono
parents:
diff changeset
3644 const char *name;
kono
parents:
diff changeset
3645 int kind;
kono
parents:
diff changeset
3646 kind = gfc_default_integer_kind;
kono
parents:
diff changeset
3647 name = gfc_get_string (PREFIX ("get_command_argument_i%d"), kind);
kono
parents:
diff changeset
3648 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3649 }
kono
parents:
diff changeset
3650
kono
parents:
diff changeset
3651
kono
parents:
diff changeset
3652 /* Resolve the get_environment_variable intrinsic subroutine. */
kono
parents:
diff changeset
3653
kono
parents:
diff changeset
3654 void
kono
parents:
diff changeset
3655 gfc_resolve_get_environment_variable (gfc_code *code)
kono
parents:
diff changeset
3656 {
kono
parents:
diff changeset
3657 const char *name;
kono
parents:
diff changeset
3658 int kind;
kono
parents:
diff changeset
3659 kind = gfc_default_integer_kind;
kono
parents:
diff changeset
3660 name = gfc_get_string (PREFIX ("get_environment_variable_i%d"), kind);
kono
parents:
diff changeset
3661 code->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3662 }
kono
parents:
diff changeset
3663
kono
parents:
diff changeset
3664
kono
parents:
diff changeset
3665 void
kono
parents:
diff changeset
3666 gfc_resolve_signal_sub (gfc_code *c)
kono
parents:
diff changeset
3667 {
kono
parents:
diff changeset
3668 const char *name;
kono
parents:
diff changeset
3669 gfc_expr *number, *handler, *status;
kono
parents:
diff changeset
3670 gfc_typespec ts;
kono
parents:
diff changeset
3671 gfc_clear_ts (&ts);
kono
parents:
diff changeset
3672
kono
parents:
diff changeset
3673 number = c->ext.actual->expr;
kono
parents:
diff changeset
3674 handler = c->ext.actual->next->expr;
kono
parents:
diff changeset
3675 status = c->ext.actual->next->next->expr;
kono
parents:
diff changeset
3676 ts.type = BT_INTEGER;
kono
parents:
diff changeset
3677 ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
3678
kono
parents:
diff changeset
3679 /* handler can be either BT_INTEGER or BT_PROCEDURE */
kono
parents:
diff changeset
3680 if (handler->ts.type == BT_INTEGER)
kono
parents:
diff changeset
3681 {
kono
parents:
diff changeset
3682 if (handler->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
3683 gfc_convert_type (handler, &ts, 2);
kono
parents:
diff changeset
3684 name = gfc_get_string (PREFIX ("signal_sub_int"));
kono
parents:
diff changeset
3685 }
kono
parents:
diff changeset
3686 else
kono
parents:
diff changeset
3687 name = gfc_get_string (PREFIX ("signal_sub"));
kono
parents:
diff changeset
3688
kono
parents:
diff changeset
3689 if (number->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
3690 gfc_convert_type (number, &ts, 2);
kono
parents:
diff changeset
3691 if (status != NULL && status->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
3692 gfc_convert_type (status, &ts, 2);
kono
parents:
diff changeset
3693
kono
parents:
diff changeset
3694 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3695 }
kono
parents:
diff changeset
3696
kono
parents:
diff changeset
3697
kono
parents:
diff changeset
3698 /* Resolve the SYSTEM intrinsic subroutine. */
kono
parents:
diff changeset
3699
kono
parents:
diff changeset
3700 void
kono
parents:
diff changeset
3701 gfc_resolve_system_sub (gfc_code *c)
kono
parents:
diff changeset
3702 {
kono
parents:
diff changeset
3703 const char *name;
kono
parents:
diff changeset
3704 name = gfc_get_string (PREFIX ("system_sub"));
kono
parents:
diff changeset
3705 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3706 }
kono
parents:
diff changeset
3707
kono
parents:
diff changeset
3708
kono
parents:
diff changeset
3709 /* Determine if the arguments to SYSTEM_CLOCK are INTEGER(4) or INTEGER(8) */
kono
parents:
diff changeset
3710
kono
parents:
diff changeset
3711 void
kono
parents:
diff changeset
3712 gfc_resolve_system_clock (gfc_code *c)
kono
parents:
diff changeset
3713 {
kono
parents:
diff changeset
3714 const char *name;
kono
parents:
diff changeset
3715 int kind;
kono
parents:
diff changeset
3716 gfc_expr *count = c->ext.actual->expr;
kono
parents:
diff changeset
3717 gfc_expr *count_max = c->ext.actual->next->next->expr;
kono
parents:
diff changeset
3718
kono
parents:
diff changeset
3719 /* The INTEGER(8) version has higher precision, it is used if both COUNT
kono
parents:
diff changeset
3720 and COUNT_MAX can hold 64-bit values, or are absent. */
kono
parents:
diff changeset
3721 if ((!count || count->ts.kind >= 8)
kono
parents:
diff changeset
3722 && (!count_max || count_max->ts.kind >= 8))
kono
parents:
diff changeset
3723 kind = 8;
kono
parents:
diff changeset
3724 else
kono
parents:
diff changeset
3725 kind = gfc_default_integer_kind;
kono
parents:
diff changeset
3726
kono
parents:
diff changeset
3727 name = gfc_get_string (PREFIX ("system_clock_%d"), kind);
kono
parents:
diff changeset
3728 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3729 }
kono
parents:
diff changeset
3730
kono
parents:
diff changeset
3731
kono
parents:
diff changeset
3732 /* Resolve the EXECUTE_COMMAND_LINE intrinsic subroutine. */
kono
parents:
diff changeset
3733 void
kono
parents:
diff changeset
3734 gfc_resolve_execute_command_line (gfc_code *c)
kono
parents:
diff changeset
3735 {
kono
parents:
diff changeset
3736 const char *name;
kono
parents:
diff changeset
3737 name = gfc_get_string (PREFIX ("execute_command_line_i%d"),
kono
parents:
diff changeset
3738 gfc_default_integer_kind);
kono
parents:
diff changeset
3739 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3740 }
kono
parents:
diff changeset
3741
kono
parents:
diff changeset
3742
kono
parents:
diff changeset
3743 /* Resolve the EXIT intrinsic subroutine. */
kono
parents:
diff changeset
3744
kono
parents:
diff changeset
3745 void
kono
parents:
diff changeset
3746 gfc_resolve_exit (gfc_code *c)
kono
parents:
diff changeset
3747 {
kono
parents:
diff changeset
3748 const char *name;
kono
parents:
diff changeset
3749 gfc_typespec ts;
kono
parents:
diff changeset
3750 gfc_expr *n;
kono
parents:
diff changeset
3751 gfc_clear_ts (&ts);
kono
parents:
diff changeset
3752
kono
parents:
diff changeset
3753 /* The STATUS argument has to be of default kind. If it is not,
kono
parents:
diff changeset
3754 we convert it. */
kono
parents:
diff changeset
3755 ts.type = BT_INTEGER;
kono
parents:
diff changeset
3756 ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
3757 n = c->ext.actual->expr;
kono
parents:
diff changeset
3758 if (n != NULL && n->ts.kind != ts.kind)
kono
parents:
diff changeset
3759 gfc_convert_type (n, &ts, 2);
kono
parents:
diff changeset
3760
kono
parents:
diff changeset
3761 name = gfc_get_string (PREFIX ("exit_i%d"), ts.kind);
kono
parents:
diff changeset
3762 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3763 }
kono
parents:
diff changeset
3764
kono
parents:
diff changeset
3765
kono
parents:
diff changeset
3766 /* Resolve the FLUSH intrinsic subroutine. */
kono
parents:
diff changeset
3767
kono
parents:
diff changeset
3768 void
kono
parents:
diff changeset
3769 gfc_resolve_flush (gfc_code *c)
kono
parents:
diff changeset
3770 {
kono
parents:
diff changeset
3771 const char *name;
kono
parents:
diff changeset
3772 gfc_typespec ts;
kono
parents:
diff changeset
3773 gfc_expr *n;
kono
parents:
diff changeset
3774 gfc_clear_ts (&ts);
kono
parents:
diff changeset
3775
kono
parents:
diff changeset
3776 ts.type = BT_INTEGER;
kono
parents:
diff changeset
3777 ts.kind = gfc_default_integer_kind;
kono
parents:
diff changeset
3778 n = c->ext.actual->expr;
kono
parents:
diff changeset
3779 if (n != NULL && n->ts.kind != ts.kind)
kono
parents:
diff changeset
3780 gfc_convert_type (n, &ts, 2);
kono
parents:
diff changeset
3781
kono
parents:
diff changeset
3782 name = gfc_get_string (PREFIX ("flush_i%d"), ts.kind);
kono
parents:
diff changeset
3783 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3784 }
kono
parents:
diff changeset
3785
kono
parents:
diff changeset
3786
kono
parents:
diff changeset
3787 void
kono
parents:
diff changeset
3788 gfc_resolve_ctime_sub (gfc_code *c)
kono
parents:
diff changeset
3789 {
kono
parents:
diff changeset
3790 gfc_typespec ts;
kono
parents:
diff changeset
3791 gfc_clear_ts (&ts);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3792
111
kono
parents:
diff changeset
3793 /* ctime TIME argument is a INTEGER(KIND=8), says the doc */
kono
parents:
diff changeset
3794 if (c->ext.actual->expr->ts.kind != 8)
kono
parents:
diff changeset
3795 {
kono
parents:
diff changeset
3796 ts.type = BT_INTEGER;
kono
parents:
diff changeset
3797 ts.kind = 8;
kono
parents:
diff changeset
3798 ts.u.derived = NULL;
kono
parents:
diff changeset
3799 ts.u.cl = NULL;
kono
parents:
diff changeset
3800 gfc_convert_type (c->ext.actual->expr, &ts, 2);
kono
parents:
diff changeset
3801 }
kono
parents:
diff changeset
3802
kono
parents:
diff changeset
3803 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("ctime_sub"));
kono
parents:
diff changeset
3804 }
kono
parents:
diff changeset
3805
kono
parents:
diff changeset
3806
kono
parents:
diff changeset
3807 void
kono
parents:
diff changeset
3808 gfc_resolve_fdate_sub (gfc_code *c)
kono
parents:
diff changeset
3809 {
kono
parents:
diff changeset
3810 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("fdate_sub"));
kono
parents:
diff changeset
3811 }
kono
parents:
diff changeset
3812
kono
parents:
diff changeset
3813
kono
parents:
diff changeset
3814 void
kono
parents:
diff changeset
3815 gfc_resolve_gerror (gfc_code *c)
kono
parents:
diff changeset
3816 {
kono
parents:
diff changeset
3817 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("gerror"));
kono
parents:
diff changeset
3818 }
kono
parents:
diff changeset
3819
kono
parents:
diff changeset
3820
kono
parents:
diff changeset
3821 void
kono
parents:
diff changeset
3822 gfc_resolve_getlog (gfc_code *c)
kono
parents:
diff changeset
3823 {
kono
parents:
diff changeset
3824 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("getlog"));
kono
parents:
diff changeset
3825 }
kono
parents:
diff changeset
3826
kono
parents:
diff changeset
3827
kono
parents:
diff changeset
3828 void
kono
parents:
diff changeset
3829 gfc_resolve_hostnm_sub (gfc_code *c)
kono
parents:
diff changeset
3830 {
kono
parents:
diff changeset
3831 const char *name;
kono
parents:
diff changeset
3832 int kind;
kono
parents:
diff changeset
3833
kono
parents:
diff changeset
3834 if (c->ext.actual->next->expr != NULL)
kono
parents:
diff changeset
3835 kind = c->ext.actual->next->expr->ts.kind;
kono
parents:
diff changeset
3836 else
kono
parents:
diff changeset
3837 kind = gfc_default_integer_kind;
kono
parents:
diff changeset
3838
kono
parents:
diff changeset
3839 name = gfc_get_string (PREFIX ("hostnm_i%d_sub"), kind);
kono
parents:
diff changeset
3840 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3841 }
kono
parents:
diff changeset
3842
kono
parents:
diff changeset
3843
kono
parents:
diff changeset
3844 void
kono
parents:
diff changeset
3845 gfc_resolve_perror (gfc_code *c)
kono
parents:
diff changeset
3846 {
kono
parents:
diff changeset
3847 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("perror_sub"));
kono
parents:
diff changeset
3848 }
kono
parents:
diff changeset
3849
kono
parents:
diff changeset
3850 /* Resolve the STAT and FSTAT intrinsic subroutines. */
kono
parents:
diff changeset
3851
kono
parents:
diff changeset
3852 void
kono
parents:
diff changeset
3853 gfc_resolve_stat_sub (gfc_code *c)
kono
parents:
diff changeset
3854 {
kono
parents:
diff changeset
3855 const char *name;
kono
parents:
diff changeset
3856 name = gfc_get_string (PREFIX ("stat_i%d_sub"), gfc_default_integer_kind);
kono
parents:
diff changeset
3857 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3858 }
kono
parents:
diff changeset
3859
kono
parents:
diff changeset
3860
kono
parents:
diff changeset
3861 void
kono
parents:
diff changeset
3862 gfc_resolve_lstat_sub (gfc_code *c)
kono
parents:
diff changeset
3863 {
kono
parents:
diff changeset
3864 const char *name;
kono
parents:
diff changeset
3865 name = gfc_get_string (PREFIX ("lstat_i%d_sub"), gfc_default_integer_kind);
kono
parents:
diff changeset
3866 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3867 }
kono
parents:
diff changeset
3868
kono
parents:
diff changeset
3869
kono
parents:
diff changeset
3870 void
kono
parents:
diff changeset
3871 gfc_resolve_fstat_sub (gfc_code *c)
kono
parents:
diff changeset
3872 {
kono
parents:
diff changeset
3873 const char *name;
kono
parents:
diff changeset
3874 gfc_expr *u;
kono
parents:
diff changeset
3875 gfc_typespec *ts;
kono
parents:
diff changeset
3876
kono
parents:
diff changeset
3877 u = c->ext.actual->expr;
kono
parents:
diff changeset
3878 ts = &c->ext.actual->next->expr->ts;
kono
parents:
diff changeset
3879 if (u->ts.kind != ts->kind)
kono
parents:
diff changeset
3880 gfc_convert_type (u, ts, 2);
kono
parents:
diff changeset
3881 name = gfc_get_string (PREFIX ("fstat_i%d_sub"), ts->kind);
kono
parents:
diff changeset
3882 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3883 }
kono
parents:
diff changeset
3884
kono
parents:
diff changeset
3885
kono
parents:
diff changeset
3886 void
kono
parents:
diff changeset
3887 gfc_resolve_fgetc_sub (gfc_code *c)
kono
parents:
diff changeset
3888 {
kono
parents:
diff changeset
3889 const char *name;
kono
parents:
diff changeset
3890 gfc_typespec ts;
kono
parents:
diff changeset
3891 gfc_expr *u, *st;
kono
parents:
diff changeset
3892 gfc_clear_ts (&ts);
kono
parents:
diff changeset
3893
kono
parents:
diff changeset
3894 u = c->ext.actual->expr;
kono
parents:
diff changeset
3895 st = c->ext.actual->next->next->expr;
kono
parents:
diff changeset
3896
kono
parents:
diff changeset
3897 if (u->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
3898 {
kono
parents:
diff changeset
3899 ts.type = BT_INTEGER;
kono
parents:
diff changeset
3900 ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
3901 ts.u.derived = NULL;
kono
parents:
diff changeset
3902 ts.u.cl = NULL;
kono
parents:
diff changeset
3903 gfc_convert_type (u, &ts, 2);
kono
parents:
diff changeset
3904 }
kono
parents:
diff changeset
3905
kono
parents:
diff changeset
3906 if (st != NULL)
kono
parents:
diff changeset
3907 name = gfc_get_string (PREFIX ("fgetc_i%d_sub"), st->ts.kind);
kono
parents:
diff changeset
3908 else
kono
parents:
diff changeset
3909 name = gfc_get_string (PREFIX ("fgetc_i%d_sub"), gfc_default_integer_kind);
kono
parents:
diff changeset
3910
kono
parents:
diff changeset
3911 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3912 }
kono
parents:
diff changeset
3913
kono
parents:
diff changeset
3914
kono
parents:
diff changeset
3915 void
kono
parents:
diff changeset
3916 gfc_resolve_fget_sub (gfc_code *c)
kono
parents:
diff changeset
3917 {
kono
parents:
diff changeset
3918 const char *name;
kono
parents:
diff changeset
3919 gfc_expr *st;
kono
parents:
diff changeset
3920
kono
parents:
diff changeset
3921 st = c->ext.actual->next->expr;
kono
parents:
diff changeset
3922 if (st != NULL)
kono
parents:
diff changeset
3923 name = gfc_get_string (PREFIX ("fget_i%d_sub"), st->ts.kind);
kono
parents:
diff changeset
3924 else
kono
parents:
diff changeset
3925 name = gfc_get_string (PREFIX ("fget_i%d_sub"), gfc_default_integer_kind);
kono
parents:
diff changeset
3926
kono
parents:
diff changeset
3927 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3928 }
kono
parents:
diff changeset
3929
kono
parents:
diff changeset
3930
kono
parents:
diff changeset
3931 void
kono
parents:
diff changeset
3932 gfc_resolve_fputc_sub (gfc_code *c)
kono
parents:
diff changeset
3933 {
kono
parents:
diff changeset
3934 const char *name;
kono
parents:
diff changeset
3935 gfc_typespec ts;
kono
parents:
diff changeset
3936 gfc_expr *u, *st;
kono
parents:
diff changeset
3937 gfc_clear_ts (&ts);
kono
parents:
diff changeset
3938
kono
parents:
diff changeset
3939 u = c->ext.actual->expr;
kono
parents:
diff changeset
3940 st = c->ext.actual->next->next->expr;
kono
parents:
diff changeset
3941
kono
parents:
diff changeset
3942 if (u->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
3943 {
kono
parents:
diff changeset
3944 ts.type = BT_INTEGER;
kono
parents:
diff changeset
3945 ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
3946 ts.u.derived = NULL;
kono
parents:
diff changeset
3947 ts.u.cl = NULL;
kono
parents:
diff changeset
3948 gfc_convert_type (u, &ts, 2);
kono
parents:
diff changeset
3949 }
kono
parents:
diff changeset
3950
kono
parents:
diff changeset
3951 if (st != NULL)
kono
parents:
diff changeset
3952 name = gfc_get_string (PREFIX ("fputc_i%d_sub"), st->ts.kind);
kono
parents:
diff changeset
3953 else
kono
parents:
diff changeset
3954 name = gfc_get_string (PREFIX ("fputc_i%d_sub"), gfc_default_integer_kind);
kono
parents:
diff changeset
3955
kono
parents:
diff changeset
3956 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3957 }
kono
parents:
diff changeset
3958
kono
parents:
diff changeset
3959
kono
parents:
diff changeset
3960 void
kono
parents:
diff changeset
3961 gfc_resolve_fput_sub (gfc_code *c)
kono
parents:
diff changeset
3962 {
kono
parents:
diff changeset
3963 const char *name;
kono
parents:
diff changeset
3964 gfc_expr *st;
kono
parents:
diff changeset
3965
kono
parents:
diff changeset
3966 st = c->ext.actual->next->expr;
kono
parents:
diff changeset
3967 if (st != NULL)
kono
parents:
diff changeset
3968 name = gfc_get_string (PREFIX ("fput_i%d_sub"), st->ts.kind);
kono
parents:
diff changeset
3969 else
kono
parents:
diff changeset
3970 name = gfc_get_string (PREFIX ("fput_i%d_sub"), gfc_default_integer_kind);
kono
parents:
diff changeset
3971
kono
parents:
diff changeset
3972 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
3973 }
kono
parents:
diff changeset
3974
kono
parents:
diff changeset
3975
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3976 void
111
kono
parents:
diff changeset
3977 gfc_resolve_fseek_sub (gfc_code *c)
kono
parents:
diff changeset
3978 {
kono
parents:
diff changeset
3979 gfc_expr *unit;
kono
parents:
diff changeset
3980 gfc_expr *offset;
kono
parents:
diff changeset
3981 gfc_expr *whence;
kono
parents:
diff changeset
3982 gfc_typespec ts;
kono
parents:
diff changeset
3983 gfc_clear_ts (&ts);
kono
parents:
diff changeset
3984
kono
parents:
diff changeset
3985 unit = c->ext.actual->expr;
kono
parents:
diff changeset
3986 offset = c->ext.actual->next->expr;
kono
parents:
diff changeset
3987 whence = c->ext.actual->next->next->expr;
kono
parents:
diff changeset
3988
kono
parents:
diff changeset
3989 if (unit->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
3990 {
kono
parents:
diff changeset
3991 ts.type = BT_INTEGER;
kono
parents:
diff changeset
3992 ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
3993 ts.u.derived = NULL;
kono
parents:
diff changeset
3994 ts.u.cl = NULL;
kono
parents:
diff changeset
3995 gfc_convert_type (unit, &ts, 2);
kono
parents:
diff changeset
3996 }
kono
parents:
diff changeset
3997
kono
parents:
diff changeset
3998 if (offset->ts.kind != gfc_intio_kind)
kono
parents:
diff changeset
3999 {
kono
parents:
diff changeset
4000 ts.type = BT_INTEGER;
kono
parents:
diff changeset
4001 ts.kind = gfc_intio_kind;
kono
parents:
diff changeset
4002 ts.u.derived = NULL;
kono
parents:
diff changeset
4003 ts.u.cl = NULL;
kono
parents:
diff changeset
4004 gfc_convert_type (offset, &ts, 2);
kono
parents:
diff changeset
4005 }
kono
parents:
diff changeset
4006
kono
parents:
diff changeset
4007 if (whence->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
4008 {
kono
parents:
diff changeset
4009 ts.type = BT_INTEGER;
kono
parents:
diff changeset
4010 ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
4011 ts.u.derived = NULL;
kono
parents:
diff changeset
4012 ts.u.cl = NULL;
kono
parents:
diff changeset
4013 gfc_convert_type (whence, &ts, 2);
kono
parents:
diff changeset
4014 }
kono
parents:
diff changeset
4015
kono
parents:
diff changeset
4016 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("fseek_sub"));
kono
parents:
diff changeset
4017 }
kono
parents:
diff changeset
4018
kono
parents:
diff changeset
4019 void
kono
parents:
diff changeset
4020 gfc_resolve_ftell_sub (gfc_code *c)
kono
parents:
diff changeset
4021 {
kono
parents:
diff changeset
4022 const char *name;
kono
parents:
diff changeset
4023 gfc_expr *unit;
kono
parents:
diff changeset
4024 gfc_expr *offset;
kono
parents:
diff changeset
4025 gfc_typespec ts;
kono
parents:
diff changeset
4026 gfc_clear_ts (&ts);
kono
parents:
diff changeset
4027
kono
parents:
diff changeset
4028 unit = c->ext.actual->expr;
kono
parents:
diff changeset
4029 offset = c->ext.actual->next->expr;
kono
parents:
diff changeset
4030
kono
parents:
diff changeset
4031 if (unit->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
4032 {
kono
parents:
diff changeset
4033 ts.type = BT_INTEGER;
kono
parents:
diff changeset
4034 ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
4035 ts.u.derived = NULL;
kono
parents:
diff changeset
4036 ts.u.cl = NULL;
kono
parents:
diff changeset
4037 gfc_convert_type (unit, &ts, 2);
kono
parents:
diff changeset
4038 }
kono
parents:
diff changeset
4039
kono
parents:
diff changeset
4040 name = gfc_get_string (PREFIX ("ftell_i%d_sub"), offset->ts.kind);
kono
parents:
diff changeset
4041 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
4042 }
kono
parents:
diff changeset
4043
kono
parents:
diff changeset
4044
kono
parents:
diff changeset
4045 void
kono
parents:
diff changeset
4046 gfc_resolve_ttynam_sub (gfc_code *c)
kono
parents:
diff changeset
4047 {
kono
parents:
diff changeset
4048 gfc_typespec ts;
kono
parents:
diff changeset
4049 gfc_clear_ts (&ts);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
4050
111
kono
parents:
diff changeset
4051 if (c->ext.actual->expr->ts.kind != gfc_c_int_kind)
kono
parents:
diff changeset
4052 {
kono
parents:
diff changeset
4053 ts.type = BT_INTEGER;
kono
parents:
diff changeset
4054 ts.kind = gfc_c_int_kind;
kono
parents:
diff changeset
4055 ts.u.derived = NULL;
kono
parents:
diff changeset
4056 ts.u.cl = NULL;
kono
parents:
diff changeset
4057 gfc_convert_type (c->ext.actual->expr, &ts, 2);
kono
parents:
diff changeset
4058 }
kono
parents:
diff changeset
4059
kono
parents:
diff changeset
4060 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("ttynam_sub"));
kono
parents:
diff changeset
4061 }
kono
parents:
diff changeset
4062
kono
parents:
diff changeset
4063
kono
parents:
diff changeset
4064 /* Resolve the UMASK intrinsic subroutine. */
kono
parents:
diff changeset
4065
kono
parents:
diff changeset
4066 void
kono
parents:
diff changeset
4067 gfc_resolve_umask_sub (gfc_code *c)
kono
parents:
diff changeset
4068 {
kono
parents:
diff changeset
4069 const char *name;
kono
parents:
diff changeset
4070 int kind;
kono
parents:
diff changeset
4071
kono
parents:
diff changeset
4072 if (c->ext.actual->next->expr != NULL)
kono
parents:
diff changeset
4073 kind = c->ext.actual->next->expr->ts.kind;
kono
parents:
diff changeset
4074 else
kono
parents:
diff changeset
4075 kind = gfc_default_integer_kind;
kono
parents:
diff changeset
4076
kono
parents:
diff changeset
4077 name = gfc_get_string (PREFIX ("umask_i%d_sub"), kind);
kono
parents:
diff changeset
4078 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
4079 }
kono
parents:
diff changeset
4080
kono
parents:
diff changeset
4081 /* Resolve the UNLINK intrinsic subroutine. */
kono
parents:
diff changeset
4082
kono
parents:
diff changeset
4083 void
kono
parents:
diff changeset
4084 gfc_resolve_unlink_sub (gfc_code *c)
kono
parents:
diff changeset
4085 {
kono
parents:
diff changeset
4086 const char *name;
kono
parents:
diff changeset
4087 int kind;
kono
parents:
diff changeset
4088
kono
parents:
diff changeset
4089 if (c->ext.actual->next->expr != NULL)
kono
parents:
diff changeset
4090 kind = c->ext.actual->next->expr->ts.kind;
kono
parents:
diff changeset
4091 else
kono
parents:
diff changeset
4092 kind = gfc_default_integer_kind;
kono
parents:
diff changeset
4093
kono
parents:
diff changeset
4094 name = gfc_get_string (PREFIX ("unlink_i%d_sub"), kind);
kono
parents:
diff changeset
4095 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
kono
parents:
diff changeset
4096 }