]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/fortran/primary.c
PR libstdc++/83626 handle ENOENT due to filesystem race
[thirdparty/gcc.git] / gcc / fortran / primary.c
CommitLineData
6de9cd9a 1/* Primary expression subroutines
85ec4feb 2 Copyright (C) 2000-2018 Free Software Foundation, Inc.
6de9cd9a
DN
3 Contributed by Andy Vaught
4
d1d61a00 5This file is part of GCC.
6de9cd9a 6
d1d61a00
TS
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
d234d788 9Software Foundation; either version 3, or (at your option) any later
d1d61a00 10version.
6de9cd9a 11
d1d61a00
TS
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
6de9cd9a
DN
16
17You should have received a copy of the GNU General Public License
d234d788
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
6de9cd9a 20
6de9cd9a
DN
21#include "config.h"
22#include "system.h"
953bee7c 23#include "coretypes.h"
1916bcb5 24#include "options.h"
6de9cd9a
DN
25#include "gfortran.h"
26#include "arith.h"
27#include "match.h"
28#include "parse.h"
b7e75771 29#include "constructor.h"
6de9cd9a 30
837c4b78
JW
31int matching_actual_arglist = 0;
32
6de9cd9a
DN
33/* Matches a kind-parameter expression, which is either a named
34 symbolic constant or a nonnegative integer constant. If
bee64a2b
JW
35 successful, sets the kind value to the correct integer.
36 The argument 'is_iso_c' signals whether the kind is an ISO_C_BINDING
37 symbol like e.g. 'c_int'. */
6de9cd9a
DN
38
39static match
bee64a2b 40match_kind_param (int *kind, int *is_iso_c)
6de9cd9a
DN
41{
42 char name[GFC_MAX_SYMBOL_LEN + 1];
43 gfc_symbol *sym;
6de9cd9a
DN
44 match m;
45
bee64a2b
JW
46 *is_iso_c = 0;
47
5cf54585 48 m = gfc_match_small_literal_int (kind, NULL);
6de9cd9a
DN
49 if (m != MATCH_NO)
50 return m;
51
52 m = gfc_match_name (name);
53 if (m != MATCH_YES)
54 return m;
55
56 if (gfc_find_symbol (name, NULL, 1, &sym))
57 return MATCH_ERROR;
58
59 if (sym == NULL)
60 return MATCH_NO;
61
fbe468a5
JW
62 *is_iso_c = sym->attr.is_iso_c;
63
6de9cd9a
DN
64 if (sym->attr.flavor != FL_PARAMETER)
65 return MATCH_NO;
66
1d8e1d5d
PT
67 if (sym->value == NULL)
68 return MATCH_NO;
69
51f03c6b 70 if (gfc_extract_int (sym->value, kind))
6de9cd9a
DN
71 return MATCH_NO;
72
a39fafac
FXC
73 gfc_set_sym_referenced (sym);
74
6de9cd9a
DN
75 if (*kind < 0)
76 return MATCH_NO;
77
78 return MATCH_YES;
79}
80
81
82/* Get a trailing kind-specification for non-character variables.
83 Returns:
bee64a2b
JW
84 * the integer kind value or
85 * -1 if an error was generated,
86 * -2 if no kind was found.
87 The argument 'is_iso_c' signals whether the kind is an ISO_C_BINDING
88 symbol like e.g. 'c_int'. */
6de9cd9a
DN
89
90static int
bee64a2b 91get_kind (int *is_iso_c)
6de9cd9a
DN
92{
93 int kind;
94 match m;
95
bee64a2b
JW
96 *is_iso_c = 0;
97
6de9cd9a
DN
98 if (gfc_match_char ('_') != MATCH_YES)
99 return -2;
100
bee64a2b 101 m = match_kind_param (&kind, is_iso_c);
6de9cd9a
DN
102 if (m == MATCH_NO)
103 gfc_error ("Missing kind-parameter at %C");
104
105 return (m == MATCH_YES) ? kind : -1;
106}
107
108
109/* Given a character and a radix, see if the character is a valid
110 digit in that radix. */
111
8fc541d3
FXC
112int
113gfc_check_digit (char c, int radix)
6de9cd9a
DN
114{
115 int r;
116
117 switch (radix)
118 {
119 case 2:
120 r = ('0' <= c && c <= '1');
121 break;
122
123 case 8:
124 r = ('0' <= c && c <= '7');
125 break;
126
127 case 10:
128 r = ('0' <= c && c <= '9');
129 break;
130
131 case 16:
da8309c6 132 r = ISXDIGIT (c);
6de9cd9a
DN
133 break;
134
135 default:
8fc541d3 136 gfc_internal_error ("gfc_check_digit(): bad radix");
6de9cd9a
DN
137 }
138
139 return r;
140}
141
142
143/* Match the digit string part of an integer if signflag is not set,
bf1b77dd
PT
144 the signed digit string part if signflag is set. If the buffer
145 is NULL, we just count characters for the resolution pass. Returns
6de9cd9a
DN
146 the number of characters matched, -1 for no match. */
147
148static int
149match_digits (int signflag, int radix, char *buffer)
150{
151 locus old_loc;
8fc541d3
FXC
152 int length;
153 char c;
6de9cd9a
DN
154
155 length = 0;
8fc541d3 156 c = gfc_next_ascii_char ();
6de9cd9a
DN
157
158 if (signflag && (c == '+' || c == '-'))
159 {
160 if (buffer != NULL)
161 *buffer++ = c;
69029c61 162 gfc_gobble_whitespace ();
8fc541d3 163 c = gfc_next_ascii_char ();
6de9cd9a
DN
164 length++;
165 }
166
8fc541d3 167 if (!gfc_check_digit (c, radix))
6de9cd9a
DN
168 return -1;
169
170 length++;
171 if (buffer != NULL)
172 *buffer++ = c;
173
174 for (;;)
175 {
63645982 176 old_loc = gfc_current_locus;
8fc541d3 177 c = gfc_next_ascii_char ();
6de9cd9a 178
8fc541d3 179 if (!gfc_check_digit (c, radix))
6de9cd9a
DN
180 break;
181
182 if (buffer != NULL)
183 *buffer++ = c;
184 length++;
185 }
186
63645982 187 gfc_current_locus = old_loc;
6de9cd9a
DN
188
189 return length;
190}
191
192
bf1b77dd 193/* Match an integer (digit string and optional kind).
6de9cd9a
DN
194 A sign will be accepted if signflag is set. */
195
196static match
edf1eac2 197match_integer_constant (gfc_expr **result, int signflag)
6de9cd9a 198{
bee64a2b 199 int length, kind, is_iso_c;
6de9cd9a
DN
200 locus old_loc;
201 char *buffer;
202 gfc_expr *e;
203
63645982 204 old_loc = gfc_current_locus;
6de9cd9a
DN
205 gfc_gobble_whitespace ();
206
207 length = match_digits (signflag, 10, NULL);
63645982 208 gfc_current_locus = old_loc;
6de9cd9a
DN
209 if (length == -1)
210 return MATCH_NO;
211
ece3f663 212 buffer = (char *) alloca (length + 1);
6de9cd9a
DN
213 memset (buffer, '\0', length + 1);
214
215 gfc_gobble_whitespace ();
216
217 match_digits (signflag, 10, buffer);
218
bee64a2b 219 kind = get_kind (&is_iso_c);
6de9cd9a 220 if (kind == -2)
9d64df18 221 kind = gfc_default_integer_kind;
6de9cd9a
DN
222 if (kind == -1)
223 return MATCH_ERROR;
224
203c7ebf 225 if (kind == 4 && flag_integer4_kind == 8)
f4347334
ZG
226 kind = 8;
227
e7a2d5fb 228 if (gfc_validate_kind (BT_INTEGER, kind, true) < 0)
6de9cd9a
DN
229 {
230 gfc_error ("Integer kind %d at %C not available", kind);
231 return MATCH_ERROR;
232 }
233
63645982 234 e = gfc_convert_integer (buffer, kind, 10, &gfc_current_locus);
bee64a2b 235 e->ts.is_c_interop = is_iso_c;
6de9cd9a
DN
236
237 if (gfc_range_check (e) != ARITH_OK)
238 {
b2458f91
TB
239 gfc_error ("Integer too big for its kind at %C. This check can be "
240 "disabled with the option -fno-range-check");
6de9cd9a
DN
241
242 gfc_free_expr (e);
243 return MATCH_ERROR;
244 }
245
246 *result = e;
247 return MATCH_YES;
248}
249
250
d3642f89
FW
251/* Match a Hollerith constant. */
252
253static match
edf1eac2 254match_hollerith_constant (gfc_expr **result)
d3642f89
FW
255{
256 locus old_loc;
edf1eac2 257 gfc_expr *e = NULL;
401fcd3b 258 int num, pad;
bf1b77dd 259 int i;
d3642f89
FW
260
261 old_loc = gfc_current_locus;
262 gfc_gobble_whitespace ();
263
264 if (match_integer_constant (&e, 0) == MATCH_YES
edf1eac2 265 && gfc_match_char ('h') == MATCH_YES)
d3642f89 266 {
524af0d6 267 if (!gfc_notify_std (GFC_STD_LEGACY, "Hollerith constant at %C"))
d3642f89
FW
268 goto cleanup;
269
51f03c6b
JJ
270 if (gfc_extract_int (e, &num, 1))
271 goto cleanup;
d3642f89
FW
272 if (num == 0)
273 {
edf1eac2
SK
274 gfc_error ("Invalid Hollerith constant: %L must contain at least "
275 "one character", &old_loc);
d3642f89
FW
276 goto cleanup;
277 }
278 if (e->ts.kind != gfc_default_integer_kind)
279 {
eb6d74fa 280 gfc_error ("Invalid Hollerith constant: Integer kind at %L "
edf1eac2 281 "should be default", &old_loc);
d3642f89
FW
282 goto cleanup;
283 }
284 else
285 {
d3642f89 286 gfc_free_expr (e);
b7e75771
JD
287 e = gfc_get_constant_expr (BT_HOLLERITH, gfc_default_character_kind,
288 &gfc_current_locus);
20585ad6 289
401fcd3b
JD
290 /* Calculate padding needed to fit default integer memory. */
291 pad = gfc_default_integer_kind - (num % gfc_default_integer_kind);
292
293 e->representation.string = XCNEWVEC (char, num + pad + 1);
8fc541d3 294
20585ad6 295 for (i = 0; i < num; i++)
00660189 296 {
696abb30 297 gfc_char_t c = gfc_next_char_literal (INSTRING_WARN);
00660189
FXC
298 if (! gfc_wide_fits_in_byte (c))
299 {
300 gfc_error ("Invalid Hollerith constant at %L contains a "
301 "wide character", &old_loc);
302 goto cleanup;
303 }
304
305 e->representation.string[i] = (unsigned char) c;
306 }
8fc541d3 307
401fcd3b
JD
308 /* Now pad with blanks and end with a null char. */
309 for (i = 0; i < pad; i++)
310 e->representation.string[num + i] = ' ';
311
312 e->representation.string[num + i] = '\0';
313 e->representation.length = num + pad;
314 e->ts.u.pad = pad;
20585ad6 315
d3642f89
FW
316 *result = e;
317 return MATCH_YES;
318 }
319 }
320
321 gfc_free_expr (e);
322 gfc_current_locus = old_loc;
323 return MATCH_NO;
324
325cleanup:
326 gfc_free_expr (e);
327 return MATCH_ERROR;
328}
329
330
6de9cd9a 331/* Match a binary, octal or hexadecimal constant that can be found in
78019d16
SK
332 a DATA statement. The standard permits b'010...', o'73...', and
333 z'a1...' where b, o, and z can be capital letters. This function
334 also accepts postfixed forms of the constants: '01...'b, '73...'o,
335 and 'a1...'z. An additional extension is the use of x for z. */
6de9cd9a
DN
336
337static match
edf1eac2 338match_boz_constant (gfc_expr **result)
6de9cd9a 339{
8fc541d3 340 int radix, length, x_hex, kind;
78019d16 341 locus old_loc, start_loc;
8fc541d3 342 char *buffer, post, delim;
6de9cd9a 343 gfc_expr *e;
6de9cd9a 344
78019d16 345 start_loc = old_loc = gfc_current_locus;
6de9cd9a
DN
346 gfc_gobble_whitespace ();
347
88199e7c 348 x_hex = 0;
8fc541d3 349 switch (post = gfc_next_ascii_char ())
6de9cd9a
DN
350 {
351 case 'b':
352 radix = 2;
78019d16 353 post = 0;
6de9cd9a
DN
354 break;
355 case 'o':
356 radix = 8;
78019d16 357 post = 0;
6de9cd9a
DN
358 break;
359 case 'x':
88199e7c 360 x_hex = 1;
6de9cd9a
DN
361 /* Fall through. */
362 case 'z':
363 radix = 16;
78019d16
SK
364 post = 0;
365 break;
366 case '\'':
367 /* Fall through. */
368 case '\"':
369 delim = post;
370 post = 1;
371 radix = 16; /* Set to accept any valid digit string. */
6de9cd9a
DN
372 break;
373 default:
374 goto backup;
375 }
376
377 /* No whitespace allowed here. */
378
78019d16 379 if (post == 0)
8fc541d3 380 delim = gfc_next_ascii_char ();
78019d16 381
6de9cd9a
DN
382 if (delim != '\'' && delim != '\"')
383 goto backup;
384
00a4618b 385 if (x_hex
524af0d6
JB
386 && (!gfc_notify_std(GFC_STD_GNU, "Hexadecimal "
387 "constant at %C uses non-standard syntax")))
5d874166
TS
388 return MATCH_ERROR;
389
63645982 390 old_loc = gfc_current_locus;
6de9cd9a
DN
391
392 length = match_digits (0, radix, NULL);
393 if (length == -1)
394 {
78019d16 395 gfc_error ("Empty set of digits in BOZ constant at %C");
6de9cd9a
DN
396 return MATCH_ERROR;
397 }
398
8fc541d3 399 if (gfc_next_ascii_char () != delim)
6de9cd9a 400 {
78019d16
SK
401 gfc_error ("Illegal character in BOZ constant at %C");
402 return MATCH_ERROR;
403 }
404
405 if (post == 1)
406 {
8fc541d3 407 switch (gfc_next_ascii_char ())
78019d16
SK
408 {
409 case 'b':
410 radix = 2;
21dac32c 411 break;
78019d16
SK
412 case 'o':
413 radix = 8;
21dac32c 414 break;
78019d16
SK
415 case 'x':
416 /* Fall through. */
417 case 'z':
418 radix = 16;
21dac32c 419 break;
31043f6c 420 default:
78019d16 421 goto backup;
31043f6c 422 }
0bf0efd5 423
524af0d6
JB
424 if (!gfc_notify_std (GFC_STD_GNU, "BOZ constant "
425 "at %C uses non-standard postfix syntax"))
0bf0efd5 426 return MATCH_ERROR;
6de9cd9a
DN
427 }
428
63645982 429 gfc_current_locus = old_loc;
6de9cd9a 430
ece3f663 431 buffer = (char *) alloca (length + 1);
6de9cd9a
DN
432 memset (buffer, '\0', length + 1);
433
434 match_digits (0, radix, buffer);
8fc541d3 435 gfc_next_ascii_char (); /* Eat delimiter. */
78019d16 436 if (post == 1)
8fc541d3 437 gfc_next_ascii_char (); /* Eat postfixed b, o, z, or x. */
6de9cd9a 438
f4e7375a
SK
439 /* In section 5.2.5 and following C567 in the Fortran 2003 standard, we find
440 "If a data-stmt-constant is a boz-literal-constant, the corresponding
441 variable shall be of type integer. The boz-literal-constant is treated
442 as if it were an int-literal-constant with a kind-param that specifies
443 the representation method with the largest decimal exponent range
444 supported by the processor." */
445
446 kind = gfc_max_integer_kind;
5d874166 447 e = gfc_convert_integer (buffer, kind, radix, &gfc_current_locus);
6de9cd9a 448
00a4618b
TB
449 /* Mark as boz variable. */
450 e->is_boz = 1;
451
6de9cd9a
DN
452 if (gfc_range_check (e) != ARITH_OK)
453 {
5d874166 454 gfc_error ("Integer too big for integer kind %i at %C", kind);
88199e7c
TS
455 gfc_free_expr (e);
456 return MATCH_ERROR;
457 }
458
0bf0efd5 459 if (!gfc_in_match_data ()
524af0d6
JB
460 && (!gfc_notify_std(GFC_STD_F2003, "BOZ used outside a DATA "
461 "statement at %C")))
0bf0efd5
TB
462 return MATCH_ERROR;
463
6de9cd9a
DN
464 *result = e;
465 return MATCH_YES;
466
467backup:
78019d16 468 gfc_current_locus = start_loc;
6de9cd9a
DN
469 return MATCH_NO;
470}
471
472
69029c61 473/* Match a real constant of some sort. Allow a signed constant if signflag
00a4618b 474 is nonzero. */
6de9cd9a
DN
475
476static match
edf1eac2 477match_real_constant (gfc_expr **result, int signflag)
6de9cd9a 478{
6869e9c6 479 int kind, count, seen_dp, seen_digits, is_iso_c, default_exponent;
6de9cd9a 480 locus old_loc, temp_loc;
8fc541d3 481 char *p, *buffer, c, exp_char;
6de9cd9a 482 gfc_expr *e;
69029c61 483 bool negate;
6de9cd9a 484
63645982 485 old_loc = gfc_current_locus;
6de9cd9a
DN
486 gfc_gobble_whitespace ();
487
488 e = NULL;
489
6869e9c6 490 default_exponent = 0;
6de9cd9a
DN
491 count = 0;
492 seen_dp = 0;
493 seen_digits = 0;
494 exp_char = ' ';
69029c61 495 negate = FALSE;
6de9cd9a 496
8fc541d3 497 c = gfc_next_ascii_char ();
6de9cd9a
DN
498 if (signflag && (c == '+' || c == '-'))
499 {
69029c61
PB
500 if (c == '-')
501 negate = TRUE;
502
503 gfc_gobble_whitespace ();
8fc541d3 504 c = gfc_next_ascii_char ();
6de9cd9a
DN
505 }
506
02712c16 507 /* Scan significand. */
8fc541d3 508 for (;; c = gfc_next_ascii_char (), count++)
6de9cd9a
DN
509 {
510 if (c == '.')
511 {
512 if (seen_dp)
513 goto done;
514
bf1b77dd 515 /* Check to see if "." goes with a following operator like
edf1eac2 516 ".eq.". */
63645982 517 temp_loc = gfc_current_locus;
8fc541d3 518 c = gfc_next_ascii_char ();
6de9cd9a
DN
519
520 if (c == 'e' || c == 'd' || c == 'q')
521 {
8fc541d3 522 c = gfc_next_ascii_char ();
6de9cd9a 523 if (c == '.')
f7b529fa 524 goto done; /* Operator named .e. or .d. */
6de9cd9a
DN
525 }
526
527 if (ISALPHA (c))
528 goto done; /* Distinguish 1.e9 from 1.eq.2 */
529
63645982 530 gfc_current_locus = temp_loc;
6de9cd9a
DN
531 seen_dp = 1;
532 continue;
533 }
534
535 if (ISDIGIT (c))
536 {
537 seen_digits = 1;
538 continue;
539 }
540
541 break;
542 }
543
edf1eac2 544 if (!seen_digits || (c != 'e' && c != 'd' && c != 'q'))
6de9cd9a
DN
545 goto done;
546 exp_char = c;
547
5a17346a
SK
548
549 if (c == 'q')
550 {
524af0d6
JB
551 if (!gfc_notify_std (GFC_STD_GNU, "exponent-letter 'q' in "
552 "real-literal-constant at %C"))
5a17346a 553 return MATCH_ERROR;
73e42eef 554 else if (warn_real_q_constant)
48749dbc
MLI
555 gfc_warning (OPT_Wreal_q_constant,
556 "Extension: exponent-letter %<q%> in real-literal-constant "
557 "at %C");
5a17346a
SK
558 }
559
6de9cd9a 560 /* Scan exponent. */
8fc541d3 561 c = gfc_next_ascii_char ();
6de9cd9a
DN
562 count++;
563
564 if (c == '+' || c == '-')
565 { /* optional sign */
8fc541d3 566 c = gfc_next_ascii_char ();
6de9cd9a
DN
567 count++;
568 }
569
570 if (!ISDIGIT (c))
571 {
6869e9c6
FR
572 /* With -fdec, default exponent to 0 instead of complaining. */
573 if (flag_dec)
574 default_exponent = 1;
575 else
576 {
577 gfc_error ("Missing exponent in real number at %C");
578 return MATCH_ERROR;
579 }
6de9cd9a
DN
580 }
581
582 while (ISDIGIT (c))
583 {
8fc541d3 584 c = gfc_next_ascii_char ();
6de9cd9a
DN
585 count++;
586 }
587
588done:
69029c61 589 /* Check that we have a numeric constant. */
6de9cd9a
DN
590 if (!seen_digits || (!seen_dp && exp_char == ' '))
591 {
63645982 592 gfc_current_locus = old_loc;
6de9cd9a
DN
593 return MATCH_NO;
594 }
595
596 /* Convert the number. */
63645982 597 gfc_current_locus = old_loc;
6de9cd9a
DN
598 gfc_gobble_whitespace ();
599
6869e9c6
FR
600 buffer = (char *) alloca (count + default_exponent + 1);
601 memset (buffer, '\0', count + default_exponent + 1);
6de9cd9a 602
6de9cd9a 603 p = buffer;
8fc541d3 604 c = gfc_next_ascii_char ();
69029c61 605 if (c == '+' || c == '-')
6de9cd9a 606 {
69029c61 607 gfc_gobble_whitespace ();
8fc541d3 608 c = gfc_next_ascii_char ();
69029c61
PB
609 }
610
611 /* Hack for mpfr_set_str(). */
612 for (;;)
613 {
614 if (c == 'd' || c == 'q')
6de9cd9a 615 *p = 'e';
69029c61
PB
616 else
617 *p = c;
6de9cd9a 618 p++;
69029c61
PB
619 if (--count == 0)
620 break;
621
8fc541d3 622 c = gfc_next_ascii_char ();
6de9cd9a 623 }
6869e9c6
FR
624 if (default_exponent)
625 *p++ = '0';
6de9cd9a 626
bee64a2b 627 kind = get_kind (&is_iso_c);
6de9cd9a
DN
628 if (kind == -1)
629 goto cleanup;
630
631 switch (exp_char)
632 {
633 case 'd':
634 if (kind != -2)
635 {
a4d9b221 636 gfc_error ("Real number at %C has a %<d%> exponent and an explicit "
edf1eac2 637 "kind");
6de9cd9a
DN
638 goto cleanup;
639 }
9d64df18 640 kind = gfc_default_double_kind;
f4347334
ZG
641
642 if (kind == 4)
643 {
203c7ebf 644 if (flag_real4_kind == 8)
f4347334 645 kind = 8;
203c7ebf 646 if (flag_real4_kind == 10)
f4347334 647 kind = 10;
203c7ebf 648 if (flag_real4_kind == 16)
f4347334
ZG
649 kind = 16;
650 }
651
652 if (kind == 8)
653 {
203c7ebf 654 if (flag_real8_kind == 4)
f4347334 655 kind = 4;
203c7ebf 656 if (flag_real8_kind == 10)
f4347334 657 kind = 10;
203c7ebf 658 if (flag_real8_kind == 16)
f4347334
ZG
659 kind = 16;
660 }
6de9cd9a
DN
661 break;
662
5a17346a
SK
663 case 'q':
664 if (kind != -2)
665 {
a4d9b221 666 gfc_error ("Real number at %C has a %<q%> exponent and an explicit "
5a17346a
SK
667 "kind");
668 goto cleanup;
669 }
670
671 /* The maximum possible real kind type parameter is 16. First, try
672 that for the kind, then fallback to trying kind=10 (Intel 80 bit)
673 extended precision. If neither value works, just given up. */
674 kind = 16;
675 if (gfc_validate_kind (BT_REAL, kind, true) < 0)
676 {
677 kind = 10;
678 if (gfc_validate_kind (BT_REAL, kind, true) < 0)
679 {
a4d9b221 680 gfc_error ("Invalid exponent-letter %<q%> in "
5a17346a
SK
681 "real-literal-constant at %C");
682 goto cleanup;
683 }
684 }
685 break;
686
6de9cd9a
DN
687 default:
688 if (kind == -2)
9d64df18 689 kind = gfc_default_real_kind;
6de9cd9a 690
f4347334
ZG
691 if (kind == 4)
692 {
203c7ebf 693 if (flag_real4_kind == 8)
f4347334 694 kind = 8;
203c7ebf 695 if (flag_real4_kind == 10)
f4347334 696 kind = 10;
203c7ebf 697 if (flag_real4_kind == 16)
f4347334
ZG
698 kind = 16;
699 }
700
701 if (kind == 8)
702 {
203c7ebf 703 if (flag_real8_kind == 4)
f4347334 704 kind = 4;
203c7ebf 705 if (flag_real8_kind == 10)
f4347334 706 kind = 10;
203c7ebf 707 if (flag_real8_kind == 16)
f4347334
ZG
708 kind = 16;
709 }
710
e7a2d5fb 711 if (gfc_validate_kind (BT_REAL, kind, true) < 0)
6de9cd9a
DN
712 {
713 gfc_error ("Invalid real kind %d at %C", kind);
714 goto cleanup;
715 }
716 }
717
63645982 718 e = gfc_convert_real (buffer, kind, &gfc_current_locus);
69029c61
PB
719 if (negate)
720 mpfr_neg (e->value.real, e->value.real, GFC_RND_MODE);
bee64a2b 721 e->ts.is_c_interop = is_iso_c;
6de9cd9a
DN
722
723 switch (gfc_range_check (e))
724 {
725 case ARITH_OK:
726 break;
727 case ARITH_OVERFLOW:
728 gfc_error ("Real constant overflows its kind at %C");
729 goto cleanup;
730
731 case ARITH_UNDERFLOW:
73e42eef 732 if (warn_underflow)
48749dbc 733 gfc_warning (OPT_Wunderflow, "Real constant underflows its kind at %C");
f8e566e5 734 mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
2d8b59df 735 break;
6de9cd9a
DN
736
737 default:
738 gfc_internal_error ("gfc_range_check() returned bad value");
739 }
740
cbf560d7
TK
741 /* Warn about trailing digits which suggest the user added too many
742 trailing digits, which may cause the appearance of higher pecision
743 than the kind kan support.
744
745 This is done by replacing the rightmost non-zero digit with zero
746 and comparing with the original value. If these are equal, we
747 assume the user supplied more digits than intended (or forgot to
748 convert to the correct kind).
749 */
750
751 if (warn_conversion_extra)
752 {
753 mpfr_t r;
754 char *c, *p;
755 bool did_break;
756
757 c = strchr (buffer, 'e');
758 if (c == NULL)
759 c = buffer + strlen(buffer);
760
761 did_break = false;
762 for (p = c - 1; p >= buffer; p--)
763 {
764 if (*p == '.')
765 continue;
38217d3e 766
cbf560d7
TK
767 if (*p != '0')
768 {
769 *p = '0';
770 did_break = true;
771 break;
772 }
773 }
774
775 if (did_break)
776 {
777 mpfr_init (r);
778 mpfr_set_str (r, buffer, 10, GFC_RND_MODE);
779 if (negate)
780 mpfr_neg (r, r, GFC_RND_MODE);
781
782 mpfr_sub (r, r, e->value.real, GFC_RND_MODE);
783
784 if (mpfr_cmp_ui (r, 0) == 0)
785 gfc_warning (OPT_Wconversion_extra, "Non-significant digits "
786 "in %qs number at %C, maybe incorrect KIND",
787 gfc_typename (&e->ts));
788
789 mpfr_clear (r);
790 }
791 }
792
6de9cd9a
DN
793 *result = e;
794 return MATCH_YES;
795
796cleanup:
797 gfc_free_expr (e);
798 return MATCH_ERROR;
799}
800
801
802/* Match a substring reference. */
803
804static match
38217d3e 805match_substring (gfc_charlen *cl, int init, gfc_ref **result, bool deferred)
6de9cd9a
DN
806{
807 gfc_expr *start, *end;
808 locus old_loc;
809 gfc_ref *ref;
810 match m;
811
812 start = NULL;
813 end = NULL;
814
63645982 815 old_loc = gfc_current_locus;
6de9cd9a
DN
816
817 m = gfc_match_char ('(');
818 if (m != MATCH_YES)
819 return MATCH_NO;
820
821 if (gfc_match_char (':') != MATCH_YES)
822 {
823 if (init)
824 m = gfc_match_init_expr (&start);
825 else
826 m = gfc_match_expr (&start);
827
828 if (m != MATCH_YES)
829 {
830 m = MATCH_NO;
831 goto cleanup;
832 }
833
834 m = gfc_match_char (':');
835 if (m != MATCH_YES)
836 goto cleanup;
837 }
838
839 if (gfc_match_char (')') != MATCH_YES)
840 {
841 if (init)
842 m = gfc_match_init_expr (&end);
843 else
844 m = gfc_match_expr (&end);
845
846 if (m == MATCH_NO)
847 goto syntax;
848 if (m == MATCH_ERROR)
849 goto cleanup;
850
851 m = gfc_match_char (')');
852 if (m == MATCH_NO)
853 goto syntax;
854 }
855
856 /* Optimize away the (:) reference. */
38217d3e 857 if (start == NULL && end == NULL && !deferred)
6de9cd9a
DN
858 ref = NULL;
859 else
860 {
861 ref = gfc_get_ref ();
862
863 ref->type = REF_SUBSTRING;
864 if (start == NULL)
b7e75771 865 start = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
6de9cd9a
DN
866 ref->u.ss.start = start;
867 if (end == NULL && cl)
868 end = gfc_copy_expr (cl->length);
869 ref->u.ss.end = end;
870 ref->u.ss.length = cl;
871 }
872
873 *result = ref;
874 return MATCH_YES;
875
876syntax:
877 gfc_error ("Syntax error in SUBSTRING specification at %C");
878 m = MATCH_ERROR;
879
880cleanup:
881 gfc_free_expr (start);
882 gfc_free_expr (end);
883
63645982 884 gfc_current_locus = old_loc;
6de9cd9a
DN
885 return m;
886}
887
888
889/* Reads the next character of a string constant, taking care to
890 return doubled delimiters on the input as a single instance of
891 the delimiter.
892
8fc541d3 893 Special return values for "ret" argument are:
6de9cd9a
DN
894 -1 End of the string, as determined by the delimiter
895 -2 Unterminated string detected
896
897 Backslash codes are also expanded at this time. */
898
8fc541d3
FXC
899static gfc_char_t
900next_string_char (gfc_char_t delimiter, int *ret)
6de9cd9a
DN
901{
902 locus old_locus;
8fc541d3 903 gfc_char_t c;
6de9cd9a 904
696abb30 905 c = gfc_next_char_literal (INSTRING_WARN);
8fc541d3 906 *ret = 0;
6de9cd9a
DN
907
908 if (c == '\n')
8fc541d3
FXC
909 {
910 *ret = -2;
911 return 0;
912 }
6de9cd9a 913
c61819ff 914 if (flag_backslash && c == '\\')
6de9cd9a 915 {
63645982 916 old_locus = gfc_current_locus;
6de9cd9a 917
a88a266c
SK
918 if (gfc_match_special_char (&c) == MATCH_NO)
919 gfc_current_locus = old_locus;
2e6a83a7
SK
920
921 if (!(gfc_option.allow_std & GFC_STD_GNU) && !inhibit_warnings)
db30e21c 922 gfc_warning (0, "Extension: backslash character at %C");
6de9cd9a
DN
923 }
924
925 if (c != delimiter)
926 return c;
927
63645982 928 old_locus = gfc_current_locus;
696abb30 929 c = gfc_next_char_literal (NONSTRING);
6de9cd9a
DN
930
931 if (c == delimiter)
932 return c;
63645982 933 gfc_current_locus = old_locus;
6de9cd9a 934
8fc541d3
FXC
935 *ret = -1;
936 return 0;
6de9cd9a
DN
937}
938
939
940/* Special case of gfc_match_name() that matches a parameter kind name
941 before a string constant. This takes case of the weird but legal
4f8ea09e 942 case of:
6de9cd9a
DN
943
944 kind_____'string'
945
946 where kind____ is a parameter. gfc_match_name() will happily slurp
947 up all the underscores, which leads to problems. If we return
948 MATCH_YES, the parse pointer points to the final underscore, which
949 is not part of the name. We never return MATCH_ERROR-- errors in
950 the name will be detected later. */
951
952static match
953match_charkind_name (char *name)
954{
955 locus old_loc;
956 char c, peek;
957 int len;
958
959 gfc_gobble_whitespace ();
8fc541d3 960 c = gfc_next_ascii_char ();
6de9cd9a
DN
961 if (!ISALPHA (c))
962 return MATCH_NO;
963
964 *name++ = c;
965 len = 1;
966
967 for (;;)
968 {
63645982 969 old_loc = gfc_current_locus;
8fc541d3 970 c = gfc_next_ascii_char ();
6de9cd9a
DN
971
972 if (c == '_')
973 {
8fc541d3 974 peek = gfc_peek_ascii_char ();
6de9cd9a
DN
975
976 if (peek == '\'' || peek == '\"')
977 {
63645982 978 gfc_current_locus = old_loc;
6de9cd9a
DN
979 *name = '\0';
980 return MATCH_YES;
981 }
982 }
983
984 if (!ISALNUM (c)
985 && c != '_'
c61819ff 986 && (c != '$' || !flag_dollar_ok))
6de9cd9a
DN
987 break;
988
989 *name++ = c;
990 if (++len > GFC_MAX_SYMBOL_LEN)
991 break;
992 }
993
994 return MATCH_NO;
995}
996
997
998/* See if the current input matches a character constant. Lots of
999 contortions have to be done to match the kind parameter which comes
1000 before the actual string. The main consideration is that we don't
1001 want to error out too quickly. For example, we don't actually do
1002 any validation of the kinds until we have actually seen a legal
1003 delimiter. Using match_kind_param() generates errors too quickly. */
1004
1005static match
edf1eac2 1006match_string_constant (gfc_expr **result)
6de9cd9a 1007{
00660189 1008 char name[GFC_MAX_SYMBOL_LEN + 1], peek;
73e42eef 1009 int i, kind, length, save_warn_ampersand, ret;
6de9cd9a
DN
1010 locus old_locus, start_locus;
1011 gfc_symbol *sym;
1012 gfc_expr *e;
6de9cd9a 1013 match m;
00660189 1014 gfc_char_t c, delimiter, *p;
6de9cd9a 1015
63645982 1016 old_locus = gfc_current_locus;
6de9cd9a
DN
1017
1018 gfc_gobble_whitespace ();
1019
6de9cd9a
DN
1020 c = gfc_next_char ();
1021 if (c == '\'' || c == '"')
1022 {
9d64df18 1023 kind = gfc_default_character_kind;
66faed76 1024 start_locus = gfc_current_locus;
6de9cd9a
DN
1025 goto got_delim;
1026 }
1027
8fc541d3 1028 if (gfc_wide_is_digit (c))
6de9cd9a
DN
1029 {
1030 kind = 0;
1031
8fc541d3 1032 while (gfc_wide_is_digit (c))
6de9cd9a
DN
1033 {
1034 kind = kind * 10 + c - '0';
1035 if (kind > 9999999)
1036 goto no_match;
1037 c = gfc_next_char ();
1038 }
1039
1040 }
1041 else
1042 {
63645982 1043 gfc_current_locus = old_locus;
6de9cd9a
DN
1044
1045 m = match_charkind_name (name);
1046 if (m != MATCH_YES)
1047 goto no_match;
1048
1049 if (gfc_find_symbol (name, NULL, 1, &sym)
1050 || sym == NULL
1051 || sym->attr.flavor != FL_PARAMETER)
1052 goto no_match;
1053
1054 kind = -1;
1055 c = gfc_next_char ();
1056 }
1057
1058 if (c == ' ')
1059 {
1060 gfc_gobble_whitespace ();
1061 c = gfc_next_char ();
1062 }
1063
1064 if (c != '_')
1065 goto no_match;
1066
1067 gfc_gobble_whitespace ();
6de9cd9a
DN
1068
1069 c = gfc_next_char ();
1070 if (c != '\'' && c != '"')
1071 goto no_match;
1072
66faed76
DF
1073 start_locus = gfc_current_locus;
1074
6de9cd9a
DN
1075 if (kind == -1)
1076 {
51f03c6b
JJ
1077 if (gfc_extract_int (sym->value, &kind, 1))
1078 return MATCH_ERROR;
a39fafac 1079 gfc_set_sym_referenced (sym);
6de9cd9a
DN
1080 }
1081
e7a2d5fb 1082 if (gfc_validate_kind (BT_CHARACTER, kind, true) < 0)
6de9cd9a
DN
1083 {
1084 gfc_error ("Invalid kind %d for CHARACTER constant at %C", kind);
1085 return MATCH_ERROR;
1086 }
1087
1088got_delim:
1089 /* Scan the string into a block of memory by first figuring out how
1090 long it is, allocating the structure, then re-reading it. This
1091 isn't particularly efficient, but string constants aren't that
1092 common in most code. TODO: Use obstacks? */
1093
1094 delimiter = c;
1095 length = 0;
1096
1097 for (;;)
1098 {
8fc541d3
FXC
1099 c = next_string_char (delimiter, &ret);
1100 if (ret == -1)
6de9cd9a 1101 break;
8fc541d3 1102 if (ret == -2)
6de9cd9a 1103 {
63645982 1104 gfc_current_locus = start_locus;
6de9cd9a
DN
1105 gfc_error ("Unterminated character constant beginning at %C");
1106 return MATCH_ERROR;
1107 }
1108
1109 length++;
1110 }
1111
78019d16
SK
1112 /* Peek at the next character to see if it is a b, o, z, or x for the
1113 postfixed BOZ literal constants. */
8fc541d3
FXC
1114 peek = gfc_peek_ascii_char ();
1115 if (peek == 'b' || peek == 'o' || peek =='z' || peek == 'x')
78019d16
SK
1116 goto no_match;
1117
b7e75771 1118 e = gfc_get_character_expr (kind, &start_locus, NULL, length);
6de9cd9a 1119
63645982 1120 gfc_current_locus = start_locus;
6de9cd9a 1121
1355d8e7
TB
1122 /* We disable the warning for the following loop as the warning has already
1123 been printed in the loop above. */
73e42eef 1124 save_warn_ampersand = warn_ampersand;
48749dbc 1125 warn_ampersand = false;
1355d8e7 1126
b7e75771 1127 p = e->value.character.string;
6de9cd9a 1128 for (i = 0; i < length; i++)
8fc541d3
FXC
1129 {
1130 c = next_string_char (delimiter, &ret);
1131
d393bbd7 1132 if (!gfc_check_character_range (c, kind))
8fc541d3 1133 {
efb63364 1134 gfc_free_expr (e);
a4d9b221 1135 gfc_error ("Character %qs in string at %C is not representable "
d393bbd7 1136 "in character kind %d", gfc_print_wide_char (c), kind);
8fc541d3
FXC
1137 return MATCH_ERROR;
1138 }
1139
00660189 1140 *p++ = c;
8fc541d3 1141 }
6de9cd9a
DN
1142
1143 *p = '\0'; /* TODO: C-style string is for development/debug purposes. */
73e42eef 1144 warn_ampersand = save_warn_ampersand;
6de9cd9a 1145
8fc541d3
FXC
1146 next_string_char (delimiter, &ret);
1147 if (ret != -1)
6de9cd9a
DN
1148 gfc_internal_error ("match_string_constant(): Delimiter not found");
1149
38217d3e 1150 if (match_substring (NULL, 0, &e->ref, false) != MATCH_NO)
6de9cd9a
DN
1151 e->expr_type = EXPR_SUBSTRING;
1152
1153 *result = e;
1154
1155 return MATCH_YES;
1156
1157no_match:
63645982 1158 gfc_current_locus = old_locus;
6de9cd9a
DN
1159 return MATCH_NO;
1160}
1161
1162
500f8f7b
RS
1163/* Match a .true. or .false. Returns 1 if a .true. was found,
1164 0 if a .false. was found, and -1 otherwise. */
1165static int
1166match_logical_constant_string (void)
1167{
1168 locus orig_loc = gfc_current_locus;
1169
1170 gfc_gobble_whitespace ();
8fc541d3 1171 if (gfc_next_ascii_char () == '.')
500f8f7b 1172 {
8fc541d3 1173 char ch = gfc_next_ascii_char ();
500f8f7b
RS
1174 if (ch == 'f')
1175 {
8fc541d3
FXC
1176 if (gfc_next_ascii_char () == 'a'
1177 && gfc_next_ascii_char () == 'l'
1178 && gfc_next_ascii_char () == 's'
1179 && gfc_next_ascii_char () == 'e'
1180 && gfc_next_ascii_char () == '.')
500f8f7b
RS
1181 /* Matched ".false.". */
1182 return 0;
1183 }
1184 else if (ch == 't')
1185 {
8fc541d3
FXC
1186 if (gfc_next_ascii_char () == 'r'
1187 && gfc_next_ascii_char () == 'u'
1188 && gfc_next_ascii_char () == 'e'
1189 && gfc_next_ascii_char () == '.')
500f8f7b
RS
1190 /* Matched ".true.". */
1191 return 1;
1192 }
1193 }
1194 gfc_current_locus = orig_loc;
1195 return -1;
1196}
1197
6de9cd9a
DN
1198/* Match a .true. or .false. */
1199
1200static match
edf1eac2 1201match_logical_constant (gfc_expr **result)
6de9cd9a 1202{
6de9cd9a 1203 gfc_expr *e;
bee64a2b 1204 int i, kind, is_iso_c;
6de9cd9a 1205
500f8f7b 1206 i = match_logical_constant_string ();
6de9cd9a
DN
1207 if (i == -1)
1208 return MATCH_NO;
1209
bee64a2b 1210 kind = get_kind (&is_iso_c);
6de9cd9a
DN
1211 if (kind == -1)
1212 return MATCH_ERROR;
1213 if (kind == -2)
9d64df18 1214 kind = gfc_default_logical_kind;
6de9cd9a 1215
e7a2d5fb 1216 if (gfc_validate_kind (BT_LOGICAL, kind, true) < 0)
eb62be44
SK
1217 {
1218 gfc_error ("Bad kind for logical constant at %C");
1219 return MATCH_ERROR;
1220 }
6de9cd9a 1221
b7e75771 1222 e = gfc_get_logical_expr (kind, &gfc_current_locus, i);
bee64a2b 1223 e->ts.is_c_interop = is_iso_c;
6de9cd9a
DN
1224
1225 *result = e;
1226 return MATCH_YES;
1227}
1228
1229
1230/* Match a real or imaginary part of a complex constant that is a
1231 symbolic constant. */
1232
1233static match
edf1eac2 1234match_sym_complex_part (gfc_expr **result)
6de9cd9a
DN
1235{
1236 char name[GFC_MAX_SYMBOL_LEN + 1];
1237 gfc_symbol *sym;
1238 gfc_expr *e;
1239 match m;
1240
1241 m = gfc_match_name (name);
1242 if (m != MATCH_YES)
1243 return m;
1244
1245 if (gfc_find_symbol (name, NULL, 1, &sym) || sym == NULL)
1246 return MATCH_NO;
1247
1248 if (sym->attr.flavor != FL_PARAMETER)
1249 {
1250 gfc_error ("Expected PARAMETER symbol in complex constant at %C");
1251 return MATCH_ERROR;
1252 }
1253
70db5f02
SK
1254 if (!sym->value)
1255 goto error;
1256
6de9cd9a
DN
1257 if (!gfc_numeric_ts (&sym->value->ts))
1258 {
1259 gfc_error ("Numeric PARAMETER required in complex constant at %C");
1260 return MATCH_ERROR;
1261 }
1262
1263 if (sym->value->rank != 0)
1264 {
1265 gfc_error ("Scalar PARAMETER required in complex constant at %C");
1266 return MATCH_ERROR;
1267 }
1268
524af0d6
JB
1269 if (!gfc_notify_std (GFC_STD_F2003, "PARAMETER symbol in "
1270 "complex constant at %C"))
e227ac57
FXC
1271 return MATCH_ERROR;
1272
6de9cd9a
DN
1273 switch (sym->value->ts.type)
1274 {
1275 case BT_REAL:
1276 e = gfc_copy_expr (sym->value);
1277 break;
1278
1279 case BT_COMPLEX:
1280 e = gfc_complex2real (sym->value, sym->value->ts.kind);
1281 if (e == NULL)
1282 goto error;
1283 break;
1284
1285 case BT_INTEGER:
9d64df18 1286 e = gfc_int2real (sym->value, gfc_default_real_kind);
6de9cd9a
DN
1287 if (e == NULL)
1288 goto error;
1289 break;
1290
1291 default:
1292 gfc_internal_error ("gfc_match_sym_complex_part(): Bad type");
1293 }
1294
edf1eac2 1295 *result = e; /* e is a scalar, real, constant expression. */
6de9cd9a
DN
1296 return MATCH_YES;
1297
1298error:
1299 gfc_error ("Error converting PARAMETER constant in complex constant at %C");
1300 return MATCH_ERROR;
1301}
1302
1303
6de9cd9a
DN
1304/* Match a real or imaginary part of a complex number. */
1305
1306static match
edf1eac2 1307match_complex_part (gfc_expr **result)
6de9cd9a
DN
1308{
1309 match m;
1310
1311 m = match_sym_complex_part (result);
1312 if (m != MATCH_NO)
1313 return m;
1314
69029c61
PB
1315 m = match_real_constant (result, 1);
1316 if (m != MATCH_NO)
1317 return m;
1318
1319 return match_integer_constant (result, 1);
6de9cd9a
DN
1320}
1321
1322
1323/* Try to match a complex constant. */
1324
1325static match
edf1eac2 1326match_complex_constant (gfc_expr **result)
6de9cd9a
DN
1327{
1328 gfc_expr *e, *real, *imag;
fea70c99 1329 gfc_error_buffer old_error;
6de9cd9a
DN
1330 gfc_typespec target;
1331 locus old_loc;
1332 int kind;
1333 match m;
1334
63645982 1335 old_loc = gfc_current_locus;
6de9cd9a
DN
1336 real = imag = e = NULL;
1337
1338 m = gfc_match_char ('(');
1339 if (m != MATCH_YES)
1340 return m;
1341
fea70c99 1342 gfc_push_error (&old_error);
6de9cd9a
DN
1343
1344 m = match_complex_part (&real);
1345 if (m == MATCH_NO)
d71b89ca 1346 {
fea70c99 1347 gfc_free_error (&old_error);
d71b89ca
JJ
1348 goto cleanup;
1349 }
6de9cd9a
DN
1350
1351 if (gfc_match_char (',') == MATCH_NO)
1352 {
396e56d2
TK
1353 /* It is possible that gfc_int2real issued a warning when
1354 converting an integer to real. Throw this away here. */
1355
1356 gfc_clear_warning ();
fea70c99 1357 gfc_pop_error (&old_error);
6de9cd9a
DN
1358 m = MATCH_NO;
1359 goto cleanup;
1360 }
1361
1362 /* If m is error, then something was wrong with the real part and we
1363 assume we have a complex constant because we've seen the ','. An
1364 ambiguous case here is the start of an iterator list of some
1365 sort. These sort of lists are matched prior to coming here. */
1366
1367 if (m == MATCH_ERROR)
d71b89ca 1368 {
fea70c99 1369 gfc_free_error (&old_error);
d71b89ca
JJ
1370 goto cleanup;
1371 }
fea70c99 1372 gfc_pop_error (&old_error);
6de9cd9a
DN
1373
1374 m = match_complex_part (&imag);
1375 if (m == MATCH_NO)
1376 goto syntax;
1377 if (m == MATCH_ERROR)
1378 goto cleanup;
1379
1380 m = gfc_match_char (')');
1381 if (m == MATCH_NO)
87ebdf2f
SK
1382 {
1383 /* Give the matcher for implied do-loops a chance to run. This
1384 yields a much saner error message for (/ (i, 4=i, 6) /). */
8fc541d3 1385 if (gfc_peek_ascii_char () == '=')
87ebdf2f
SK
1386 {
1387 m = MATCH_ERROR;
1388 goto cleanup;
1389 }
1390 else
6de9cd9a 1391 goto syntax;
87ebdf2f 1392 }
6de9cd9a
DN
1393
1394 if (m == MATCH_ERROR)
1395 goto cleanup;
1396
1397 /* Decide on the kind of this complex number. */
69029c61
PB
1398 if (real->ts.type == BT_REAL)
1399 {
1400 if (imag->ts.type == BT_REAL)
1401 kind = gfc_kind_max (real, imag);
1402 else
1403 kind = real->ts.kind;
1404 }
1405 else
1406 {
1407 if (imag->ts.type == BT_REAL)
1408 kind = imag->ts.kind;
1409 else
1410 kind = gfc_default_real_kind;
1411 }
d91909c0 1412 gfc_clear_ts (&target);
6de9cd9a
DN
1413 target.type = BT_REAL;
1414 target.kind = kind;
1415
69029c61 1416 if (real->ts.type != BT_REAL || kind != real->ts.kind)
6de9cd9a 1417 gfc_convert_type (real, &target, 2);
69029c61 1418 if (imag->ts.type != BT_REAL || kind != imag->ts.kind)
6de9cd9a
DN
1419 gfc_convert_type (imag, &target, 2);
1420
1421 e = gfc_convert_complex (real, imag, kind);
63645982 1422 e->where = gfc_current_locus;
6de9cd9a
DN
1423
1424 gfc_free_expr (real);
1425 gfc_free_expr (imag);
1426
1427 *result = e;
1428 return MATCH_YES;
1429
1430syntax:
1431 gfc_error ("Syntax error in COMPLEX constant at %C");
1432 m = MATCH_ERROR;
1433
1434cleanup:
1435 gfc_free_expr (e);
1436 gfc_free_expr (real);
1437 gfc_free_expr (imag);
63645982 1438 gfc_current_locus = old_loc;
6de9cd9a
DN
1439
1440 return m;
1441}
1442
1443
1444/* Match constants in any of several forms. Returns nonzero for a
1445 match, zero for no match. */
1446
1447match
edf1eac2 1448gfc_match_literal_constant (gfc_expr **result, int signflag)
6de9cd9a
DN
1449{
1450 match m;
1451
1452 m = match_complex_constant (result);
1453 if (m != MATCH_NO)
1454 return m;
1455
1456 m = match_string_constant (result);
1457 if (m != MATCH_NO)
1458 return m;
1459
1460 m = match_boz_constant (result);
1461 if (m != MATCH_NO)
1462 return m;
1463
1464 m = match_real_constant (result, signflag);
1465 if (m != MATCH_NO)
1466 return m;
1467
d3642f89
FW
1468 m = match_hollerith_constant (result);
1469 if (m != MATCH_NO)
1470 return m;
1471
6de9cd9a
DN
1472 m = match_integer_constant (result, signflag);
1473 if (m != MATCH_NO)
1474 return m;
1475
1476 m = match_logical_constant (result);
1477 if (m != MATCH_NO)
1478 return m;
1479
1480 return MATCH_NO;
1481}
1482
1483
2d71b918
JW
1484/* This checks if a symbol is the return value of an encompassing function.
1485 Function nesting can be maximally two levels deep, but we may have
1486 additional local namespaces like BLOCK etc. */
1487
1488bool
1489gfc_is_function_return_value (gfc_symbol *sym, gfc_namespace *ns)
1490{
1491 if (!sym->attr.function || (sym->result != sym))
1492 return false;
1493 while (ns)
1494 {
1495 if (ns->proc_name == sym)
1496 return true;
1497 ns = ns->parent;
1498 }
1499 return false;
1500}
1501
1502
6de9cd9a
DN
1503/* Match a single actual argument value. An actual argument is
1504 usually an expression, but can also be a procedure name. If the
1505 argument is a single name, it is not always possible to tell
1506 whether the name is a dummy procedure or not. We treat these cases
1507 by creating an argument that looks like a dummy procedure and
1508 fixing things later during resolution. */
1509
1510static match
edf1eac2 1511match_actual_arg (gfc_expr **result)
6de9cd9a
DN
1512{
1513 char name[GFC_MAX_SYMBOL_LEN + 1];
1514 gfc_symtree *symtree;
1515 locus where, w;
1516 gfc_expr *e;
8fc541d3 1517 char c;
6de9cd9a 1518
618f4f46 1519 gfc_gobble_whitespace ();
63645982 1520 where = gfc_current_locus;
6de9cd9a
DN
1521
1522 switch (gfc_match_name (name))
1523 {
1524 case MATCH_ERROR:
1525 return MATCH_ERROR;
1526
1527 case MATCH_NO:
1528 break;
1529
1530 case MATCH_YES:
63645982 1531 w = gfc_current_locus;
6de9cd9a 1532 gfc_gobble_whitespace ();
8fc541d3 1533 c = gfc_next_ascii_char ();
63645982 1534 gfc_current_locus = w;
6de9cd9a
DN
1535
1536 if (c != ',' && c != ')')
1537 break;
1538
1539 if (gfc_find_sym_tree (name, NULL, 1, &symtree))
1540 break;
1541 /* Handle error elsewhere. */
1542
1543 /* Eliminate a couple of common cases where we know we don't
edf1eac2 1544 have a function argument. */
6de9cd9a 1545 if (symtree == NULL)
edf1eac2 1546 {
08a6b8e0 1547 gfc_get_sym_tree (name, NULL, &symtree, false);
edf1eac2
SK
1548 gfc_set_sym_referenced (symtree->n.sym);
1549 }
6de9cd9a
DN
1550 else
1551 {
edf1eac2 1552 gfc_symbol *sym;
6de9cd9a 1553
edf1eac2
SK
1554 sym = symtree->n.sym;
1555 gfc_set_sym_referenced (sym);
c0f0e35a
JD
1556 if (sym->attr.flavor == FL_NAMELIST)
1557 {
2f029c08 1558 gfc_error ("Namelist %qs can not be an argument at %L",
c0f0e35a
JD
1559 sym->name, &where);
1560 break;
1561 }
6de9cd9a
DN
1562 if (sym->attr.flavor != FL_PROCEDURE
1563 && sym->attr.flavor != FL_UNKNOWN)
1564 break;
1565
6f9c9d6d
TB
1566 if (sym->attr.in_common && !sym->attr.proc_pointer)
1567 {
bf1b77dd 1568 if (!gfc_add_flavor (&sym->attr, FL_VARIABLE,
524af0d6 1569 sym->name, &sym->declared_at))
efb63364 1570 return MATCH_ERROR;
6f9c9d6d
TB
1571 break;
1572 }
1573
6de9cd9a
DN
1574 /* If the symbol is a function with itself as the result and
1575 is being defined, then we have a variable. */
7a4ef45b
JJ
1576 if (sym->attr.function && sym->result == sym)
1577 {
2d71b918 1578 if (gfc_is_function_return_value (sym, gfc_current_ns))
7a4ef45b
JJ
1579 break;
1580
1581 if (sym->attr.entry
1582 && (sym->ns == gfc_current_ns
1583 || sym->ns == gfc_current_ns->parent))
1584 {
1585 gfc_entry_list *el = NULL;
1586
1587 for (el = sym->ns->entries; el; el = el->next)
1588 if (sym == el->sym)
1589 break;
1590
1591 if (el)
1592 break;
1593 }
1594 }
6de9cd9a
DN
1595 }
1596
1597 e = gfc_get_expr (); /* Leave it unknown for now */
1598 e->symtree = symtree;
1599 e->expr_type = EXPR_VARIABLE;
1600 e->ts.type = BT_PROCEDURE;
1601 e->where = where;
1602
1603 *result = e;
1604 return MATCH_YES;
1605 }
1606
63645982 1607 gfc_current_locus = where;
6de9cd9a
DN
1608 return gfc_match_expr (result);
1609}
1610
1611
5bab4c96 1612/* Match a keyword argument or type parameter spec list.. */
6de9cd9a
DN
1613
1614static match
5bab4c96 1615match_keyword_arg (gfc_actual_arglist *actual, gfc_actual_arglist *base, bool pdt)
6de9cd9a
DN
1616{
1617 char name[GFC_MAX_SYMBOL_LEN + 1];
1618 gfc_actual_arglist *a;
1619 locus name_locus;
1620 match m;
1621
63645982 1622 name_locus = gfc_current_locus;
6de9cd9a
DN
1623 m = gfc_match_name (name);
1624
1625 if (m != MATCH_YES)
1626 goto cleanup;
1627 if (gfc_match_char ('=') != MATCH_YES)
1628 {
1629 m = MATCH_NO;
1630 goto cleanup;
1631 }
1632
5bab4c96
PT
1633 if (pdt)
1634 {
1635 if (gfc_match_char ('*') == MATCH_YES)
1636 {
1637 actual->spec_type = SPEC_ASSUMED;
1638 goto add_name;
1639 }
1640 else if (gfc_match_char (':') == MATCH_YES)
1641 {
1642 actual->spec_type = SPEC_DEFERRED;
1643 goto add_name;
1644 }
1645 else
1646 actual->spec_type = SPEC_EXPLICIT;
1647 }
1648
6de9cd9a
DN
1649 m = match_actual_arg (&actual->expr);
1650 if (m != MATCH_YES)
1651 goto cleanup;
1652
1653 /* Make sure this name has not appeared yet. */
5bab4c96 1654add_name:
6de9cd9a
DN
1655 if (name[0] != '\0')
1656 {
1657 for (a = base; a; a = a->next)
cb9e4f55 1658 if (a->name != NULL && strcmp (a->name, name) == 0)
6de9cd9a 1659 {
a4d9b221 1660 gfc_error ("Keyword %qs at %C has already appeared in the "
edf1eac2 1661 "current argument list", name);
6de9cd9a
DN
1662 return MATCH_ERROR;
1663 }
1664 }
1665
51f03c6b 1666 actual->name = gfc_get_string ("%s", name);
6de9cd9a
DN
1667 return MATCH_YES;
1668
1669cleanup:
63645982 1670 gfc_current_locus = name_locus;
6de9cd9a
DN
1671 return m;
1672}
1673
1674
7fcafa71
PT
1675/* Match an argument list function, such as %VAL. */
1676
1677static match
1678match_arg_list_function (gfc_actual_arglist *result)
1679{
1680 char name[GFC_MAX_SYMBOL_LEN + 1];
1681 locus old_locus;
1682 match m;
1683
1684 old_locus = gfc_current_locus;
1685
1686 if (gfc_match_char ('%') != MATCH_YES)
1687 {
1688 m = MATCH_NO;
1689 goto cleanup;
1690 }
1691
1692 m = gfc_match ("%n (", name);
1693 if (m != MATCH_YES)
1694 goto cleanup;
1695
1696 if (name[0] != '\0')
1697 {
1698 switch (name[0])
1699 {
1700 case 'l':
edf1eac2 1701 if (strncmp (name, "loc", 3) == 0)
7fcafa71
PT
1702 {
1703 result->name = "%LOC";
1704 break;
1705 }
191816a3 1706 /* FALLTHRU */
7fcafa71 1707 case 'r':
edf1eac2 1708 if (strncmp (name, "ref", 3) == 0)
7fcafa71
PT
1709 {
1710 result->name = "%REF";
1711 break;
1712 }
191816a3 1713 /* FALLTHRU */
7fcafa71 1714 case 'v':
edf1eac2 1715 if (strncmp (name, "val", 3) == 0)
7fcafa71
PT
1716 {
1717 result->name = "%VAL";
1718 break;
1719 }
191816a3 1720 /* FALLTHRU */
7fcafa71
PT
1721 default:
1722 m = MATCH_ERROR;
1723 goto cleanup;
1724 }
1725 }
1726
524af0d6 1727 if (!gfc_notify_std (GFC_STD_GNU, "argument list function at %C"))
7fcafa71
PT
1728 {
1729 m = MATCH_ERROR;
1730 goto cleanup;
1731 }
1732
1733 m = match_actual_arg (&result->expr);
1734 if (m != MATCH_YES)
1735 goto cleanup;
1736
1737 if (gfc_match_char (')') != MATCH_YES)
1738 {
1739 m = MATCH_NO;
1740 goto cleanup;
1741 }
1742
1743 return MATCH_YES;
1744
1745cleanup:
1746 gfc_current_locus = old_locus;
1747 return m;
1748}
1749
1750
6de9cd9a
DN
1751/* Matches an actual argument list of a function or subroutine, from
1752 the opening parenthesis to the closing parenthesis. The argument
1753 list is assumed to allow keyword arguments because we don't know if
1754 the symbol associated with the procedure has an implicit interface
ed5ee445 1755 or not. We make sure keywords are unique. If sub_flag is set,
5bab4c96
PT
1756 we're matching the argument list of a subroutine.
1757
1758 NOTE: An alternative use for this function is to match type parameter
1759 spec lists, which are so similar to actual argument lists that the
1760 machinery can be reused. This use is flagged by the optional argument
1761 'pdt'. */
6de9cd9a
DN
1762
1763match
5bab4c96 1764gfc_match_actual_arglist (int sub_flag, gfc_actual_arglist **argp, bool pdt)
6de9cd9a
DN
1765{
1766 gfc_actual_arglist *head, *tail;
1767 int seen_keyword;
1768 gfc_st_label *label;
1769 locus old_loc;
1770 match m;
1771
1772 *argp = tail = NULL;
63645982 1773 old_loc = gfc_current_locus;
6de9cd9a
DN
1774
1775 seen_keyword = 0;
1776
1777 if (gfc_match_char ('(') == MATCH_NO)
1778 return (sub_flag) ? MATCH_YES : MATCH_NO;
1779
1780 if (gfc_match_char (')') == MATCH_YES)
1781 return MATCH_YES;
5bab4c96 1782
6de9cd9a
DN
1783 head = NULL;
1784
837c4b78
JW
1785 matching_actual_arglist++;
1786
6de9cd9a
DN
1787 for (;;)
1788 {
1789 if (head == NULL)
1790 head = tail = gfc_get_actual_arglist ();
1791 else
1792 {
1793 tail->next = gfc_get_actual_arglist ();
1794 tail = tail->next;
1795 }
1796
5bab4c96 1797 if (sub_flag && !pdt && gfc_match_char ('*') == MATCH_YES)
6de9cd9a 1798 {
a34a91f0 1799 m = gfc_match_st_label (&label);
6de9cd9a
DN
1800 if (m == MATCH_NO)
1801 gfc_error ("Expected alternate return label at %C");
1802 if (m != MATCH_YES)
1803 goto cleanup;
1804
524af0d6
JB
1805 if (!gfc_notify_std (GFC_STD_F95_OBS, "Alternate-return argument "
1806 "at %C"))
fbdeeaac
JW
1807 goto cleanup;
1808
6de9cd9a
DN
1809 tail->label = label;
1810 goto next;
1811 }
1812
5bab4c96
PT
1813 if (pdt && !seen_keyword)
1814 {
1815 if (gfc_match_char (':') == MATCH_YES)
1816 {
1817 tail->spec_type = SPEC_DEFERRED;
1818 goto next;
1819 }
1820 else if (gfc_match_char ('*') == MATCH_YES)
1821 {
1822 tail->spec_type = SPEC_ASSUMED;
1823 goto next;
1824 }
1825 else
1826 tail->spec_type = SPEC_EXPLICIT;
18a4e7e3
PT
1827
1828 m = match_keyword_arg (tail, head, pdt);
1829 if (m == MATCH_YES)
1830 {
1831 seen_keyword = 1;
1832 goto next;
1833 }
1834 if (m == MATCH_ERROR)
1835 goto cleanup;
5bab4c96
PT
1836 }
1837
6de9cd9a 1838 /* After the first keyword argument is seen, the following
edf1eac2 1839 arguments must also have keywords. */
6de9cd9a
DN
1840 if (seen_keyword)
1841 {
5bab4c96 1842 m = match_keyword_arg (tail, head, pdt);
6de9cd9a
DN
1843
1844 if (m == MATCH_ERROR)
1845 goto cleanup;
1846 if (m == MATCH_NO)
1847 {
edf1eac2 1848 gfc_error ("Missing keyword name in actual argument list at %C");
6de9cd9a
DN
1849 goto cleanup;
1850 }
1851
1852 }
1853 else
1854 {
7fcafa71
PT
1855 /* Try an argument list function, like %VAL. */
1856 m = match_arg_list_function (tail);
6de9cd9a
DN
1857 if (m == MATCH_ERROR)
1858 goto cleanup;
1859
7fcafa71
PT
1860 /* See if we have the first keyword argument. */
1861 if (m == MATCH_NO)
1862 {
5bab4c96 1863 m = match_keyword_arg (tail, head, false);
7fcafa71
PT
1864 if (m == MATCH_YES)
1865 seen_keyword = 1;
1866 if (m == MATCH_ERROR)
1867 goto cleanup;
1868 }
1869
6de9cd9a
DN
1870 if (m == MATCH_NO)
1871 {
1872 /* Try for a non-keyword argument. */
1873 m = match_actual_arg (&tail->expr);
1874 if (m == MATCH_ERROR)
1875 goto cleanup;
1876 if (m == MATCH_NO)
1877 goto syntax;
1878 }
1879 }
1880
7fcafa71 1881
6de9cd9a
DN
1882 next:
1883 if (gfc_match_char (')') == MATCH_YES)
1884 break;
1885 if (gfc_match_char (',') != MATCH_YES)
1886 goto syntax;
1887 }
1888
1889 *argp = head;
837c4b78 1890 matching_actual_arglist--;
6de9cd9a
DN
1891 return MATCH_YES;
1892
1893syntax:
1894 gfc_error ("Syntax error in argument list at %C");
1895
1896cleanup:
1897 gfc_free_actual_arglist (head);
63645982 1898 gfc_current_locus = old_loc;
837c4b78 1899 matching_actual_arglist--;
6de9cd9a
DN
1900 return MATCH_ERROR;
1901}
1902
1903
8e1f752a 1904/* Used by gfc_match_varspec() to extend the reference list by one
6de9cd9a
DN
1905 element. */
1906
1907static gfc_ref *
edf1eac2 1908extend_ref (gfc_expr *primary, gfc_ref *tail)
6de9cd9a 1909{
6de9cd9a
DN
1910 if (primary->ref == NULL)
1911 primary->ref = tail = gfc_get_ref ();
1912 else
1913 {
1914 if (tail == NULL)
1915 gfc_internal_error ("extend_ref(): Bad tail");
1916 tail->next = gfc_get_ref ();
1917 tail = tail->next;
1918 }
1919
1920 return tail;
1921}
1922
1923
1924/* Match any additional specifications associated with the current
1925 variable like member references or substrings. If equiv_flag is
1926 set we only match stuff that is allowed inside an EQUIVALENCE
8e1f752a 1927 statement. sub_flag tells whether we expect a type-bound procedure found
713485cc
JW
1928 to be a subroutine as part of CALL or a FUNCTION. For procedure pointer
1929 components, 'ppc_arg' determines whether the PPC may be called (with an
1930 argument list), or whether it may just be referred to as a pointer. */
6de9cd9a 1931
8e1f752a 1932match
713485cc
JW
1933gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag,
1934 bool ppc_arg)
6de9cd9a
DN
1935{
1936 char name[GFC_MAX_SYMBOL_LEN + 1];
f6288c24 1937 gfc_ref *substring, *tail, *tmp;
6de9cd9a 1938 gfc_component *component;
a8006d09 1939 gfc_symbol *sym = primary->symtree->n.sym;
b89a63b9 1940 gfc_expr *tgt_expr = NULL;
6de9cd9a 1941 match m;
f2d3cb25 1942 bool unknown;
f6288c24 1943 char sep;
6de9cd9a
DN
1944
1945 tail = NULL;
1946
3c721513 1947 gfc_gobble_whitespace ();
d3a9eea2
TB
1948
1949 if (gfc_peek_ascii_char () == '[')
1950 {
c49ea23d
PT
1951 if ((sym->ts.type != BT_CLASS && sym->attr.dimension)
1952 || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
1953 && CLASS_DATA (sym)->attr.dimension))
d3a9eea2
TB
1954 {
1955 gfc_error ("Array section designator, e.g. '(:)', is required "
1956 "besides the coarray designator '[...]' at %C");
1957 return MATCH_ERROR;
1958 }
c49ea23d
PT
1959 if ((sym->ts.type != BT_CLASS && !sym->attr.codimension)
1960 || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
1961 && !CLASS_DATA (sym)->attr.codimension))
d3a9eea2 1962 {
a4d9b221 1963 gfc_error ("Coarray designator at %C but %qs is not a coarray",
d3a9eea2
TB
1964 sym->name);
1965 return MATCH_ERROR;
1966 }
1967 }
1968
b89a63b9
PT
1969 if (sym->assoc && sym->assoc->target)
1970 tgt_expr = sym->assoc->target;
1971
52bf62f9 1972 /* For associate names, we may not yet know whether they are arrays or not.
b125dc1e
PT
1973 If the selector expression is unambiguously an array; eg. a full array
1974 or an array section, then the associate name must be an array and we can
1975 fix it now. Otherwise, if parentheses follow and it is not a character
1976 type, we have to assume that it actually is one for now. The final
1977 decision will be made at resolution, of course. */
1978 if (sym->assoc
1979 && gfc_peek_ascii_char () == '('
1980 && sym->ts.type != BT_CLASS
1981 && !sym->attr.dimension)
1982 {
b89a63b9
PT
1983 gfc_ref *ref = NULL;
1984
1985 if (!sym->assoc->dangling && tgt_expr)
1986 {
1987 if (tgt_expr->expr_type == EXPR_VARIABLE)
1988 gfc_resolve_expr (tgt_expr);
1989
1990 ref = tgt_expr->ref;
1991 for (; ref; ref = ref->next)
1992 if (ref->type == REF_ARRAY
1993 && (ref->u.ar.type == AR_FULL
1994 || ref->u.ar.type == AR_SECTION))
1995 break;
1996 }
1997
1998 if (ref || (!(sym->assoc->dangling || sym->ts.type == BT_CHARACTER)
1999 && sym->assoc->st
2000 && sym->assoc->st->n.sym
2001 && sym->assoc->st->n.sym->attr.dimension == 0))
b125dc1e 2002 {
b89a63b9
PT
2003 sym->attr.dimension = 1;
2004 if (sym->as == NULL
b125dc1e
PT
2005 && sym->assoc->st
2006 && sym->assoc->st->n.sym
2007 && sym->assoc->st->n.sym->as)
2008 sym->as = gfc_copy_array_spec (sym->assoc->st->n.sym->as);
2009 }
2010 }
b89a63b9
PT
2011 else if (sym->ts.type == BT_CLASS
2012 && tgt_expr
2013 && tgt_expr->expr_type == EXPR_VARIABLE
2014 && sym->ts.u.derived != tgt_expr->ts.u.derived)
2015 {
2016 gfc_resolve_expr (tgt_expr);
2017 if (tgt_expr->rank)
2018 sym->ts.u.derived = tgt_expr->ts.u.derived;
2019 }
52bf62f9 2020
c74b74a8 2021 if ((equiv_flag && gfc_peek_ascii_char () == '(')
d3a9eea2 2022 || gfc_peek_ascii_char () == '[' || sym->attr.codimension
ce2ab24c 2023 || (sym->attr.dimension && sym->ts.type != BT_CLASS
2a573572 2024 && !sym->attr.proc_pointer && !gfc_is_proc_ptr_comp (primary)
f64edc8b 2025 && !(gfc_matching_procptr_assignment
cf2b3c22 2026 && sym->attr.flavor == FL_PROCEDURE))
22061030 2027 || (sym->ts.type == BT_CLASS && sym->attr.class_ok
492792ed
TB
2028 && (CLASS_DATA (sym)->attr.dimension
2029 || CLASS_DATA (sym)->attr.codimension)))
6de9cd9a 2030 {
102344e2
TB
2031 gfc_array_spec *as;
2032
2033 tail = extend_ref (primary, tail);
2034 tail->type = REF_ARRAY;
2035
a8006d09
JJ
2036 /* In EQUIVALENCE, we don't know yet whether we are seeing
2037 an array, character variable or array of character
edf1eac2 2038 variables. We'll leave the decision till resolve time. */
6de9cd9a 2039
102344e2
TB
2040 if (equiv_flag)
2041 as = NULL;
2042 else if (sym->ts.type == BT_CLASS && CLASS_DATA (sym))
2043 as = CLASS_DATA (sym)->as;
2044 else
2045 as = sym->as;
2046
2047 m = gfc_match_array_ref (&tail->u.ar, as, equiv_flag,
2048 as ? as->corank : 0);
6de9cd9a
DN
2049 if (m != MATCH_YES)
2050 return m;
a8006d09 2051
3c721513 2052 gfc_gobble_whitespace ();
8fc541d3 2053 if (equiv_flag && gfc_peek_ascii_char () == '(')
a8006d09
JJ
2054 {
2055 tail = extend_ref (primary, tail);
2056 tail->type = REF_ARRAY;
2057
d3a9eea2 2058 m = gfc_match_array_ref (&tail->u.ar, NULL, equiv_flag, 0);
a8006d09
JJ
2059 if (m != MATCH_YES)
2060 return m;
2061 }
6de9cd9a
DN
2062 }
2063
6de9cd9a
DN
2064 primary->ts = sym->ts;
2065
a8006d09
JJ
2066 if (equiv_flag)
2067 return MATCH_YES;
2068
f6288c24
FR
2069 /* With DEC extensions, member separator may be '.' or '%'. */
2070 sep = gfc_peek_ascii_char ();
2071 m = gfc_match_member_sep (sym);
2072 if (m == MATCH_ERROR)
2073 return MATCH_ERROR;
2074
2075 if (sym->ts.type == BT_UNKNOWN && m == MATCH_YES
713485cc 2076 && gfc_get_default_type (sym->name, sym->ns)->type == BT_DERIVED)
ebac6d9c
DK
2077 gfc_set_default_type (sym, 0, sym->ns);
2078
b89a63b9 2079 /* See if there is a usable typespec in the "no IMPLICIT type" error. */
f6288c24 2080 if (sym->ts.type == BT_UNKNOWN && m == MATCH_YES)
6ee65df3 2081 {
b89a63b9
PT
2082 bool permissible;
2083
2084 /* These target expressions can ge resolved at any time. */
2085 permissible = tgt_expr && tgt_expr->symtree && tgt_expr->symtree->n.sym
2086 && (tgt_expr->symtree->n.sym->attr.use_assoc
2087 || tgt_expr->symtree->n.sym->attr.host_assoc
2088 || tgt_expr->symtree->n.sym->attr.if_source
2089 == IFSRC_DECL);
2090 permissible = permissible
2091 || (tgt_expr && tgt_expr->expr_type == EXPR_OP);
2092
2093 if (permissible)
62d3c075 2094 {
b89a63b9
PT
2095 gfc_resolve_expr (tgt_expr);
2096 sym->ts = tgt_expr->ts;
62d3c075
PT
2097 }
2098
2099 if (sym->ts.type == BT_UNKNOWN)
2100 {
2101 gfc_error ("Symbol %qs at %C has no IMPLICIT type", sym->name);
2102 return MATCH_ERROR;
2103 }
6ee65df3
TB
2104 }
2105 else if ((sym->ts.type != BT_DERIVED && sym->ts.type != BT_CLASS)
f6288c24 2106 && m == MATCH_YES)
6ee65df3 2107 {
f6288c24
FR
2108 gfc_error ("Unexpected %<%c%> for nonderived-type variable %qs at %C",
2109 sep, sym->name);
6ee65df3
TB
2110 return MATCH_ERROR;
2111 }
2112
cf2b3c22 2113 if ((sym->ts.type != BT_DERIVED && sym->ts.type != BT_CLASS)
f6288c24 2114 || m != MATCH_YES)
6de9cd9a
DN
2115 goto check_substring;
2116
bc21d315 2117 sym = sym->ts.u.derived;
6de9cd9a
DN
2118
2119 for (;;)
2120 {
524af0d6 2121 bool t;
e157f736 2122 gfc_symtree *tbp;
8e1f752a 2123
6de9cd9a
DN
2124 m = gfc_match_name (name);
2125 if (m == MATCH_NO)
2126 gfc_error ("Expected structure component name at %C");
2127 if (m != MATCH_YES)
2128 return MATCH_ERROR;
2129
d5c50b02 2130 if (sym && sym->f2k_derived)
b2acf594
PT
2131 tbp = gfc_find_typebound_proc (sym, &t, name, false, &gfc_current_locus);
2132 else
2133 tbp = NULL;
2134
8e1f752a
DK
2135 if (tbp)
2136 {
2137 gfc_symbol* tbp_sym;
2138
524af0d6 2139 if (!t)
8e1f752a
DK
2140 return MATCH_ERROR;
2141
2142 gcc_assert (!tail || !tail->next);
236e3815
JW
2143
2144 if (!(primary->expr_type == EXPR_VARIABLE
2145 || (primary->expr_type == EXPR_STRUCTURE
2146 && primary->symtree && primary->symtree->n.sym
2147 && primary->symtree->n.sym->attr.flavor)))
2148 return MATCH_ERROR;
8e1f752a 2149
e34ccb4c 2150 if (tbp->n.tb->is_generic)
e157f736
DK
2151 tbp_sym = NULL;
2152 else
e34ccb4c 2153 tbp_sym = tbp->n.tb->u.specific->n.sym;
8e1f752a
DK
2154
2155 primary->expr_type = EXPR_COMPCALL;
e34ccb4c 2156 primary->value.compcall.tbp = tbp->n.tb;
e157f736 2157 primary->value.compcall.name = tbp->name;
4a44a72d
DK
2158 primary->value.compcall.ignore_pass = 0;
2159 primary->value.compcall.assign = 0;
2160 primary->value.compcall.base_object = NULL;
e157f736
DK
2161 gcc_assert (primary->symtree->n.sym->attr.referenced);
2162 if (tbp_sym)
2163 primary->ts = tbp_sym->ts;
049bb74e
JW
2164 else
2165 gfc_clear_ts (&primary->ts);
e157f736 2166
e34ccb4c 2167 m = gfc_match_actual_arglist (tbp->n.tb->subroutine,
8e1f752a
DK
2168 &primary->value.compcall.actual);
2169 if (m == MATCH_ERROR)
2170 return MATCH_ERROR;
2171 if (m == MATCH_NO)
2172 {
2173 if (sub_flag)
2174 primary->value.compcall.actual = NULL;
2175 else
2176 {
2177 gfc_error ("Expected argument list at %C");
2178 return MATCH_ERROR;
2179 }
2180 }
2181
8e1f752a
DK
2182 break;
2183 }
2184
f6288c24 2185 component = gfc_find_component (sym, name, false, false, &tmp);
6de9cd9a
DN
2186 if (component == NULL)
2187 return MATCH_ERROR;
2188
f6288c24
FR
2189 /* Extend the reference chain determined by gfc_find_component. */
2190 if (primary->ref == NULL)
2191 primary->ref = tmp;
2192 else
2193 {
2194 /* Set by the for loop below for the last component ref. */
2195 gcc_assert (tail != NULL);
2196 tail->next = tmp;
2197 }
6de9cd9a 2198
f6288c24
FR
2199 /* The reference chain may be longer than one hop for union
2200 subcomponents; find the new tail. */
2201 for (tail = tmp; tail->next; tail = tail->next)
2202 ;
6de9cd9a
DN
2203
2204 primary->ts = component->ts;
2205
a4a76e52 2206 if (component->attr.proc_pointer && ppc_arg)
713485cc 2207 {
837c4b78 2208 /* Procedure pointer component call: Look for argument list. */
23878536 2209 m = gfc_match_actual_arglist (sub_flag,
713485cc
JW
2210 &primary->value.compcall.actual);
2211 if (m == MATCH_ERROR)
2212 return MATCH_ERROR;
837c4b78
JW
2213
2214 if (m == MATCH_NO && !gfc_matching_ptr_assignment
a4a76e52 2215 && !gfc_matching_procptr_assignment && !matching_actual_arglist)
837c4b78 2216 {
a4d9b221 2217 gfc_error ("Procedure pointer component %qs requires an "
837c4b78
JW
2218 "argument list at %C", component->name);
2219 return MATCH_ERROR;
2220 }
2221
23878536
JW
2222 if (m == MATCH_YES)
2223 primary->expr_type = EXPR_PPC;
713485cc
JW
2224
2225 break;
2226 }
2227
c74b74a8 2228 if (component->as != NULL && !component->attr.proc_pointer)
6de9cd9a
DN
2229 {
2230 tail = extend_ref (primary, tail);
2231 tail->type = REF_ARRAY;
2232
d3a9eea2
TB
2233 m = gfc_match_array_ref (&tail->u.ar, component->as, equiv_flag,
2234 component->as->corank);
6de9cd9a
DN
2235 if (m != MATCH_YES)
2236 return m;
2237 }
156c0160
JW
2238 else if (component->ts.type == BT_CLASS && component->attr.class_ok
2239 && CLASS_DATA (component)->as && !component->attr.proc_pointer)
cf2b3c22
TB
2240 {
2241 tail = extend_ref (primary, tail);
2242 tail->type = REF_ARRAY;
6de9cd9a 2243
7a08eda1 2244 m = gfc_match_array_ref (&tail->u.ar, CLASS_DATA (component)->as,
d3a9eea2 2245 equiv_flag,
7a08eda1 2246 CLASS_DATA (component)->as->corank);
cf2b3c22
TB
2247 if (m != MATCH_YES)
2248 return m;
2249 }
2250
2251 if ((component->ts.type != BT_DERIVED && component->ts.type != BT_CLASS)
f6288c24 2252 || gfc_match_member_sep (component->ts.u.derived) != MATCH_YES)
6de9cd9a
DN
2253 break;
2254
bc21d315 2255 sym = component->ts.u.derived;
6de9cd9a
DN
2256 }
2257
2258check_substring:
f2d3cb25 2259 unknown = false;
f6288c24 2260 if (primary->ts.type == BT_UNKNOWN && !gfc_fl_struct (sym->attr.flavor))
c040ffff 2261 {
713485cc 2262 if (gfc_get_default_type (sym->name, sym->ns)->type == BT_CHARACTER)
c040ffff 2263 {
edf1eac2
SK
2264 gfc_set_default_type (sym, 0, sym->ns);
2265 primary->ts = sym->ts;
f2d3cb25 2266 unknown = true;
c040ffff
TS
2267 }
2268 }
2269
6de9cd9a
DN
2270 if (primary->ts.type == BT_CHARACTER)
2271 {
38217d3e
PT
2272 bool def = primary->ts.deferred == 1;
2273 switch (match_substring (primary->ts.u.cl, equiv_flag, &substring, def))
6de9cd9a
DN
2274 {
2275 case MATCH_YES:
2276 if (tail == NULL)
2277 primary->ref = substring;
2278 else
2279 tail->next = substring;
2280
2281 if (primary->expr_type == EXPR_CONSTANT)
2282 primary->expr_type = EXPR_SUBSTRING;
2283
860c8f3b 2284 if (substring)
bc21d315 2285 primary->ts.u.cl = NULL;
860c8f3b 2286
6de9cd9a
DN
2287 break;
2288
2289 case MATCH_NO:
f2d3cb25 2290 if (unknown)
858f1fa2
DK
2291 {
2292 gfc_clear_ts (&primary->ts);
2293 gfc_clear_ts (&sym->ts);
2294 }
6de9cd9a
DN
2295 break;
2296
2297 case MATCH_ERROR:
2298 return MATCH_ERROR;
2299 }
2300 }
2301
4ceda204
JW
2302 /* F08:C611. */
2303 if (primary->ts.type == BT_DERIVED && primary->ref
2304 && primary->ts.u.derived && primary->ts.u.derived->attr.abstract)
2305 {
2306 gfc_error ("Nonpolymorphic reference to abstract type at %C");
2307 return MATCH_ERROR;
2308 }
2309
2310 /* F08:C727. */
d3a9eea2
TB
2311 if (primary->expr_type == EXPR_PPC && gfc_is_coindexed (primary))
2312 {
2313 gfc_error ("Coindexed procedure-pointer component at %C");
2314 return MATCH_ERROR;
2315 }
2316
6de9cd9a
DN
2317 return MATCH_YES;
2318}
2319
2320
2321/* Given an expression that is a variable, figure out what the
2322 ultimate variable's type and attribute is, traversing the reference
2323 structures if necessary.
2324
2325 This subroutine is trickier than it looks. We start at the base
2326 symbol and store the attribute. Component references load a
2327 completely new attribute.
2328
2329 A couple of rules come into play. Subobjects of targets are always
2330 targets themselves. If we see a component that goes through a
2331 pointer, then the expression must also be a target, since the
2332 pointer is associated with something (if it isn't core will soon be
2333 dumped). If we see a full part or section of an array, the
2334 expression is also an array.
2335
f7b529fa 2336 We can have at most one full array reference. */
6de9cd9a
DN
2337
2338symbol_attribute
edf1eac2 2339gfc_variable_attr (gfc_expr *expr, gfc_typespec *ts)
6de9cd9a 2340{
16acb1a8 2341 int dimension, codimension, pointer, allocatable, target;
6de9cd9a
DN
2342 symbol_attribute attr;
2343 gfc_ref *ref;
cf2b3c22
TB
2344 gfc_symbol *sym;
2345 gfc_component *comp;
6de9cd9a 2346
50dbf0b4 2347 if (expr->expr_type != EXPR_VARIABLE && expr->expr_type != EXPR_FUNCTION)
6de9cd9a
DN
2348 gfc_internal_error ("gfc_variable_attr(): Expression isn't a variable");
2349
cf2b3c22
TB
2350 sym = expr->symtree->n.sym;
2351 attr = sym->attr;
6de9cd9a 2352
528622fd 2353 if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
cf2b3c22 2354 {
7a08eda1 2355 dimension = CLASS_DATA (sym)->attr.dimension;
83ba23b7 2356 codimension = CLASS_DATA (sym)->attr.codimension;
d40477b4 2357 pointer = CLASS_DATA (sym)->attr.class_pointer;
7a08eda1 2358 allocatable = CLASS_DATA (sym)->attr.allocatable;
cf2b3c22
TB
2359 }
2360 else
2361 {
2362 dimension = attr.dimension;
83ba23b7 2363 codimension = attr.codimension;
cf2b3c22
TB
2364 pointer = attr.pointer;
2365 allocatable = attr.allocatable;
2366 }
6de9cd9a
DN
2367
2368 target = attr.target;
713485cc 2369 if (pointer || attr.proc_pointer)
6de9cd9a
DN
2370 target = 1;
2371
2372 if (ts != NULL && expr->ts.type == BT_UNKNOWN)
cf2b3c22 2373 *ts = sym->ts;
6de9cd9a 2374
8c91ab34 2375 for (ref = expr->ref; ref; ref = ref->next)
6de9cd9a
DN
2376 switch (ref->type)
2377 {
2378 case REF_ARRAY:
2379
2380 switch (ref->u.ar.type)
2381 {
2382 case AR_FULL:
2383 dimension = 1;
2384 break;
2385
2386 case AR_SECTION:
5046aff5 2387 allocatable = pointer = 0;
6de9cd9a
DN
2388 dimension = 1;
2389 break;
2390
2391 case AR_ELEMENT:
d3a9eea2
TB
2392 /* Handle coarrays. */
2393 if (ref->u.ar.dimen > 0)
2394 allocatable = pointer = 0;
6de9cd9a
DN
2395 break;
2396
2397 case AR_UNKNOWN:
bf1b77dd
PT
2398 /* If any of start, end or stride is not integer, there will
2399 already have been an error issued. */
16acb1a8
DH
2400 int errors;
2401 gfc_get_errors (NULL, &errors);
2402 if (errors == 0)
bf1b77dd 2403 gfc_internal_error ("gfc_variable_attr(): Bad array reference");
6de9cd9a
DN
2404 }
2405
2406 break;
2407
2408 case REF_COMPONENT:
cf2b3c22
TB
2409 comp = ref->u.c.component;
2410 attr = comp->attr;
6de9cd9a 2411 if (ts != NULL)
e8a25349 2412 {
cf2b3c22 2413 *ts = comp->ts;
e8a25349
TS
2414 /* Don't set the string length if a substring reference
2415 follows. */
2416 if (ts->type == BT_CHARACTER
2417 && ref->next && ref->next->type == REF_SUBSTRING)
bc21d315 2418 ts->u.cl = NULL;
e8a25349 2419 }
6de9cd9a 2420
cf2b3c22
TB
2421 if (comp->ts.type == BT_CLASS)
2422 {
83ba23b7 2423 codimension = CLASS_DATA (comp)->attr.codimension;
d40477b4 2424 pointer = CLASS_DATA (comp)->attr.class_pointer;
7a08eda1 2425 allocatable = CLASS_DATA (comp)->attr.allocatable;
cf2b3c22
TB
2426 }
2427 else
2428 {
83ba23b7 2429 codimension = comp->attr.codimension;
cf2b3c22
TB
2430 pointer = comp->attr.pointer;
2431 allocatable = comp->attr.allocatable;
2432 }
713485cc 2433 if (pointer || attr.proc_pointer)
6de9cd9a
DN
2434 target = 1;
2435
2436 break;
2437
2438 case REF_SUBSTRING:
5046aff5 2439 allocatable = pointer = 0;
6de9cd9a
DN
2440 break;
2441 }
2442
2443 attr.dimension = dimension;
83ba23b7 2444 attr.codimension = codimension;
6de9cd9a 2445 attr.pointer = pointer;
5046aff5 2446 attr.allocatable = allocatable;
6de9cd9a 2447 attr.target = target;
80f95228 2448 attr.save = sym->attr.save;
6de9cd9a
DN
2449
2450 return attr;
2451}
2452
2453
2454/* Return the attribute from a general expression. */
2455
2456symbol_attribute
edf1eac2 2457gfc_expr_attr (gfc_expr *e)
6de9cd9a
DN
2458{
2459 symbol_attribute attr;
2460
2461 switch (e->expr_type)
2462 {
2463 case EXPR_VARIABLE:
2464 attr = gfc_variable_attr (e, NULL);
2465 break;
2466
2467 case EXPR_FUNCTION:
2468 gfc_clear_attr (&attr);
2469
50c7654b 2470 if (e->value.function.esym && e->value.function.esym->result)
cf2b3c22
TB
2471 {
2472 gfc_symbol *sym = e->value.function.esym->result;
2473 attr = sym->attr;
2474 if (sym->ts.type == BT_CLASS)
2475 {
7a08eda1 2476 attr.dimension = CLASS_DATA (sym)->attr.dimension;
d40477b4 2477 attr.pointer = CLASS_DATA (sym)->attr.class_pointer;
7a08eda1 2478 attr.allocatable = CLASS_DATA (sym)->attr.allocatable;
cf2b3c22
TB
2479 }
2480 }
574284e9
AV
2481 else if (e->value.function.isym
2482 && e->value.function.isym->transformational
2483 && e->ts.type == BT_CLASS)
2484 attr = CLASS_DATA (e)->attr;
50dbf0b4
JW
2485 else
2486 attr = gfc_variable_attr (e, NULL);
6de9cd9a
DN
2487
2488 /* TODO: NULL() returns pointers. May have to take care of this
edf1eac2 2489 here. */
6de9cd9a
DN
2490
2491 break;
2492
2493 default:
3c9f5092
AV
2494 gfc_clear_attr (&attr);
2495 break;
2496 }
2497
2498 return attr;
2499}
2500
2501
2502/* Given an expression, figure out what the ultimate expression
2503 attribute is. This routine is similar to gfc_variable_attr with
2504 parts of gfc_expr_attr, but focuses more on the needs of
2505 coarrays. For coarrays a codimension attribute is kind of
ba85c8c3
AV
2506 "infectious" being propagated once set and never cleared.
2507 The coarray_comp is only set, when the expression refs a coarray
2508 component. REFS_COMP is set when present to true only, when this EXPR
2509 refs a (non-_data) component. To check whether EXPR refs an allocatable
2510 component in a derived type coarray *refs_comp needs to be set and
2511 coarray_comp has to false. */
3c9f5092
AV
2512
2513static symbol_attribute
ba85c8c3 2514caf_variable_attr (gfc_expr *expr, bool in_allocate, bool *refs_comp)
3c9f5092 2515{
de91486c 2516 int dimension, codimension, pointer, allocatable, target, coarray_comp;
3c9f5092
AV
2517 symbol_attribute attr;
2518 gfc_ref *ref;
2519 gfc_symbol *sym;
2520 gfc_component *comp;
2521
2522 if (expr->expr_type != EXPR_VARIABLE && expr->expr_type != EXPR_FUNCTION)
2523 gfc_internal_error ("gfc_caf_attr(): Expression isn't a variable");
2524
2525 sym = expr->symtree->n.sym;
2526 gfc_clear_attr (&attr);
2527
ba85c8c3 2528 if (refs_comp)
525a5e33 2529 *refs_comp = false;
ba85c8c3 2530
3c9f5092
AV
2531 if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
2532 {
2533 dimension = CLASS_DATA (sym)->attr.dimension;
2534 codimension = CLASS_DATA (sym)->attr.codimension;
2535 pointer = CLASS_DATA (sym)->attr.class_pointer;
2536 allocatable = CLASS_DATA (sym)->attr.allocatable;
de91486c
AV
2537 attr.alloc_comp = CLASS_DATA (sym)->ts.u.derived->attr.alloc_comp;
2538 attr.pointer_comp = CLASS_DATA (sym)->ts.u.derived->attr.pointer_comp;
3c9f5092
AV
2539 }
2540 else
2541 {
2542 dimension = sym->attr.dimension;
2543 codimension = sym->attr.codimension;
2544 pointer = sym->attr.pointer;
2545 allocatable = sym->attr.allocatable;
de91486c 2546 attr.alloc_comp = sym->ts.type == BT_DERIVED
3c9f5092 2547 ? sym->ts.u.derived->attr.alloc_comp : 0;
de91486c
AV
2548 attr.pointer_comp = sym->ts.type == BT_DERIVED
2549 ? sym->ts.u.derived->attr.pointer_comp : 0;
3c9f5092
AV
2550 }
2551
ba85c8c3 2552 target = coarray_comp = 0;
3c9f5092
AV
2553 if (pointer || attr.proc_pointer)
2554 target = 1;
2555
2556 for (ref = expr->ref; ref; ref = ref->next)
2557 switch (ref->type)
2558 {
2559 case REF_ARRAY:
2560
2561 switch (ref->u.ar.type)
2562 {
2563 case AR_FULL:
2564 case AR_SECTION:
2565 dimension = 1;
2566 break;
2567
2568 case AR_ELEMENT:
2569 /* Handle coarrays. */
2570 if (ref->u.ar.dimen > 0 && !in_allocate)
2571 allocatable = pointer = 0;
2572 break;
2573
2574 case AR_UNKNOWN:
2575 /* If any of start, end or stride is not integer, there will
2576 already have been an error issued. */
2577 int errors;
2578 gfc_get_errors (NULL, &errors);
2579 if (errors == 0)
2580 gfc_internal_error ("gfc_caf_attr(): Bad array reference");
2581 }
2582
2583 break;
2584
2585 case REF_COMPONENT:
2586 comp = ref->u.c.component;
2587
2588 if (comp->ts.type == BT_CLASS)
2589 {
ba85c8c3
AV
2590 /* Set coarray_comp only, when this component introduces the
2591 coarray. */
2592 coarray_comp = !codimension && CLASS_DATA (comp)->attr.codimension;
3c9f5092
AV
2593 codimension |= CLASS_DATA (comp)->attr.codimension;
2594 pointer = CLASS_DATA (comp)->attr.class_pointer;
2595 allocatable = CLASS_DATA (comp)->attr.allocatable;
3c9f5092
AV
2596 }
2597 else
2598 {
ba85c8c3
AV
2599 /* Set coarray_comp only, when this component introduces the
2600 coarray. */
2601 coarray_comp = !codimension && comp->attr.codimension;
3c9f5092
AV
2602 codimension |= comp->attr.codimension;
2603 pointer = comp->attr.pointer;
2604 allocatable = comp->attr.allocatable;
3c9f5092
AV
2605 }
2606
525a5e33
AV
2607 if (refs_comp && strcmp (comp->name, "_data") != 0
2608 && (ref->next == NULL
2609 || (ref->next->type == REF_ARRAY && ref->next->next == NULL)))
2610 *refs_comp = true;
ba85c8c3 2611
3c9f5092
AV
2612 if (pointer || attr.proc_pointer)
2613 target = 1;
2614
2615 break;
2616
2617 case REF_SUBSTRING:
2618 allocatable = pointer = 0;
2619 break;
2620 }
2621
2622 attr.dimension = dimension;
2623 attr.codimension = codimension;
2624 attr.pointer = pointer;
2625 attr.allocatable = allocatable;
2626 attr.target = target;
2627 attr.save = sym->attr.save;
2628 attr.coarray_comp = coarray_comp;
3c9f5092
AV
2629
2630 return attr;
2631}
2632
2633
2634symbol_attribute
ba85c8c3 2635gfc_caf_attr (gfc_expr *e, bool in_allocate, bool *refs_comp)
3c9f5092
AV
2636{
2637 symbol_attribute attr;
2638
2639 switch (e->expr_type)
2640 {
2641 case EXPR_VARIABLE:
ba85c8c3 2642 attr = caf_variable_attr (e, in_allocate, refs_comp);
3c9f5092
AV
2643 break;
2644
2645 case EXPR_FUNCTION:
2646 gfc_clear_attr (&attr);
2647
2648 if (e->value.function.esym && e->value.function.esym->result)
2649 {
2650 gfc_symbol *sym = e->value.function.esym->result;
2651 attr = sym->attr;
2652 if (sym->ts.type == BT_CLASS)
2653 {
2654 attr.dimension = CLASS_DATA (sym)->attr.dimension;
2655 attr.pointer = CLASS_DATA (sym)->attr.class_pointer;
2656 attr.allocatable = CLASS_DATA (sym)->attr.allocatable;
2657 attr.alloc_comp = CLASS_DATA (sym)->ts.u.derived->attr.alloc_comp;
de91486c
AV
2658 attr.pointer_comp = CLASS_DATA (sym)->ts.u.derived
2659 ->attr.pointer_comp;
3c9f5092
AV
2660 }
2661 }
2662 else if (e->symtree)
ba85c8c3 2663 attr = caf_variable_attr (e, in_allocate, refs_comp);
3c9f5092
AV
2664 else
2665 gfc_clear_attr (&attr);
2666 break;
2667
2668 default:
6de9cd9a
DN
2669 gfc_clear_attr (&attr);
2670 break;
2671 }
2672
2673 return attr;
2674}
2675
2676
2677/* Match a structure constructor. The initial symbol has already been
2678 seen. */
2679
fa9290d3
DK
2680typedef struct gfc_structure_ctor_component
2681{
2682 char* name;
2683 gfc_expr* val;
2684 locus where;
2685 struct gfc_structure_ctor_component* next;
2686}
2687gfc_structure_ctor_component;
2688
ece3f663 2689#define gfc_get_structure_ctor_component() XCNEW (gfc_structure_ctor_component)
fa9290d3
DK
2690
2691static void
2692gfc_free_structure_ctor_component (gfc_structure_ctor_component *comp)
2693{
cede9502 2694 free (comp->name);
fa9290d3 2695 gfc_free_expr (comp->val);
cede9502 2696 free (comp);
fa9290d3
DK
2697}
2698
7d1f1e61
PT
2699
2700/* Translate the component list into the actual constructor by sorting it in
2701 the order required; this also checks along the way that each and every
2702 component actually has an initializer and handles default initializers
2703 for components without explicit value given. */
524af0d6 2704static bool
7d1f1e61 2705build_actual_constructor (gfc_structure_ctor_component **comp_head,
b7e75771 2706 gfc_constructor_base *ctor_head, gfc_symbol *sym)
6de9cd9a 2707{
fa9290d3 2708 gfc_structure_ctor_component *comp_iter;
7d1f1e61
PT
2709 gfc_component *comp;
2710
2711 for (comp = sym->components; comp; comp = comp->next)
2712 {
2713 gfc_structure_ctor_component **next_ptr;
2714 gfc_expr *value = NULL;
2715
2716 /* Try to find the initializer for the current component by name. */
2717 next_ptr = comp_head;
2718 for (comp_iter = *comp_head; comp_iter; comp_iter = comp_iter->next)
2719 {
2720 if (!strcmp (comp_iter->name, comp->name))
2721 break;
2722 next_ptr = &comp_iter->next;
2723 }
2724
2725 /* If an extension, try building the parent derived type by building
2726 a value expression for the parent derived type and calling self. */
2727 if (!comp_iter && comp == sym->components && sym->attr.extension)
2728 {
b7e75771
JD
2729 value = gfc_get_structure_constructor_expr (comp->ts.type,
2730 comp->ts.kind,
2731 &gfc_current_locus);
7d1f1e61 2732 value->ts = comp->ts;
7d1f1e61 2733
bf1b77dd
PT
2734 if (!build_actual_constructor (comp_head,
2735 &value->value.constructor,
524af0d6 2736 comp->ts.u.derived))
7d1f1e61
PT
2737 {
2738 gfc_free_expr (value);
524af0d6 2739 return false;
7d1f1e61 2740 }
b7e75771
JD
2741
2742 gfc_constructor_append_expr (ctor_head, value, NULL);
7d1f1e61
PT
2743 continue;
2744 }
2745
2746 /* If it was not found, try the default initializer if there's any;
2b3dc0db 2747 otherwise, it's an error unless this is a deferred parameter. */
7d1f1e61
PT
2748 if (!comp_iter)
2749 {
2750 if (comp->initializer)
2751 {
524af0d6
JB
2752 if (!gfc_notify_std (GFC_STD_F2003, "Structure constructor "
2753 "with missing optional arguments at %C"))
2754 return false;
7d1f1e61
PT
2755 value = gfc_copy_expr (comp->initializer);
2756 }
9b548517
AV
2757 else if (comp->attr.allocatable
2758 || (comp->ts.type == BT_CLASS
2759 && CLASS_DATA (comp)->attr.allocatable))
7430df97
JW
2760 {
2761 if (!gfc_notify_std (GFC_STD_F2008, "No initializer for "
2f029c08 2762 "allocatable component %qs given in the "
9b548517 2763 "structure constructor at %C", comp->name))
7430df97
JW
2764 return false;
2765 }
9b548517 2766 else if (!comp->attr.artificial)
7d1f1e61 2767 {
a4d9b221 2768 gfc_error ("No initializer for component %qs given in the"
546c8974 2769 " structure constructor at %C", comp->name);
524af0d6 2770 return false;
7d1f1e61
PT
2771 }
2772 }
2773 else
2774 value = comp_iter->val;
2775
2776 /* Add the value to the constructor chain built. */
b7e75771 2777 gfc_constructor_append_expr (ctor_head, value, NULL);
7d1f1e61
PT
2778
2779 /* Remove the entry from the component list. We don't want the expression
2780 value to be free'd, so set it to NULL. */
2781 if (comp_iter)
2782 {
2783 *next_ptr = comp_iter->next;
2784 comp_iter->val = NULL;
2785 gfc_free_structure_ctor_component (comp_iter);
2786 }
2787 }
524af0d6 2788 return true;
7d1f1e61
PT
2789}
2790
c3f34952 2791
524af0d6 2792bool
c3f34952
TB
2793gfc_convert_to_structure_constructor (gfc_expr *e, gfc_symbol *sym, gfc_expr **cexpr,
2794 gfc_actual_arglist **arglist,
2795 bool parent)
7d1f1e61 2796{
c3f34952 2797 gfc_actual_arglist *actual;
7d1f1e61 2798 gfc_structure_ctor_component *comp_tail, *comp_head, *comp_iter;
b7e75771 2799 gfc_constructor_base ctor_head = NULL;
fa9290d3 2800 gfc_component *comp; /* Is set NULL when named component is first seen */
fa9290d3 2801 const char* last_name = NULL;
c3f34952
TB
2802 locus old_locus;
2803 gfc_expr *expr;
6de9cd9a 2804
c3f34952
TB
2805 expr = parent ? *cexpr : e;
2806 old_locus = gfc_current_locus;
2807 if (parent)
2808 ; /* gfc_current_locus = *arglist->expr ? ->where;*/
2809 else
2810 gfc_current_locus = expr->where;
6de9cd9a 2811
c3f34952 2812 comp_tail = comp_head = NULL;
6de9cd9a 2813
52f49934
DK
2814 if (!parent && sym->attr.abstract)
2815 {
a4d9b221 2816 gfc_error ("Can't construct ABSTRACT type %qs at %L",
c3f34952
TB
2817 sym->name, &expr->where);
2818 goto cleanup;
52f49934
DK
2819 }
2820
c3f34952
TB
2821 comp = sym->components;
2822 actual = parent ? *arglist : expr->value.function.actual;
2823 for ( ; actual; )
6de9cd9a 2824 {
c3f34952 2825 gfc_component *this_comp = NULL;
6de9cd9a 2826
c3f34952
TB
2827 if (!comp_head)
2828 comp_tail = comp_head = gfc_get_structure_ctor_component ();
2829 else
2830 {
2831 comp_tail->next = gfc_get_structure_ctor_component ();
2832 comp_tail = comp_tail->next;
2833 }
2834 if (actual->name)
2835 {
524af0d6
JB
2836 if (!gfc_notify_std (GFC_STD_F2003, "Structure"
2837 " constructor with named arguments at %C"))
c3f34952 2838 goto cleanup;
6de9cd9a 2839
c3f34952
TB
2840 comp_tail->name = xstrdup (actual->name);
2841 last_name = comp_tail->name;
2842 comp = NULL;
2843 }
2844 else
2845 {
2846 /* Components without name are not allowed after the first named
2847 component initializer! */
9b548517 2848 if (!comp || comp->attr.artificial)
fa9290d3 2849 {
c3f34952
TB
2850 if (last_name)
2851 gfc_error ("Component initializer without name after component"
546c8974 2852 " named %s at %L", last_name,
c3f34952
TB
2853 actual->expr ? &actual->expr->where
2854 : &gfc_current_locus);
2855 else
2856 gfc_error ("Too many components in structure constructor at "
546c8974
DM
2857 "%L", actual->expr ? &actual->expr->where
2858 : &gfc_current_locus);
c3f34952 2859 goto cleanup;
fa9290d3 2860 }
fa9290d3 2861
c3f34952
TB
2862 comp_tail->name = xstrdup (comp->name);
2863 }
fa9290d3 2864
c3f34952 2865 /* Find the current component in the structure definition and check
9d1210f4 2866 its access is not private. */
c3f34952 2867 if (comp)
f6288c24 2868 this_comp = gfc_find_component (sym, comp->name, false, false, NULL);
c3f34952
TB
2869 else
2870 {
2871 this_comp = gfc_find_component (sym, (const char *)comp_tail->name,
f6288c24 2872 false, false, NULL);
c3f34952
TB
2873 comp = NULL; /* Reset needed! */
2874 }
6de9cd9a 2875
c3f34952
TB
2876 /* Here we can check if a component name is given which does not
2877 correspond to any component of the defined structure. */
2878 if (!this_comp)
2879 goto cleanup;
fa9290d3 2880
c3f34952
TB
2881 comp_tail->val = actual->expr;
2882 if (actual->expr != NULL)
2883 comp_tail->where = actual->expr->where;
2884 actual->expr = NULL;
fa9290d3 2885
c3f34952 2886 /* Check if this component is already given a value. */
bf1b77dd 2887 for (comp_iter = comp_head; comp_iter != comp_tail;
c3f34952
TB
2888 comp_iter = comp_iter->next)
2889 {
2890 gcc_assert (comp_iter);
2891 if (!strcmp (comp_iter->name, comp_tail->name))
d3a9eea2 2892 {
c4100eae 2893 gfc_error ("Component %qs is initialized twice in the structure"
546c8974 2894 " constructor at %L", comp_tail->name,
c3f34952
TB
2895 comp_tail->val ? &comp_tail->where
2896 : &gfc_current_locus);
d3a9eea2 2897 goto cleanup;
c3f34952
TB
2898 }
2899 }
d3a9eea2 2900
c3f34952
TB
2901 /* F2008, R457/C725, for PURE C1283. */
2902 if (this_comp->attr.pointer && comp_tail->val
2903 && gfc_is_coindexed (comp_tail->val))
2904 {
a4d9b221 2905 gfc_error ("Coindexed expression to pointer component %qs in "
546c8974 2906 "structure constructor at %L", comp_tail->name,
c3f34952
TB
2907 &comp_tail->where);
2908 goto cleanup;
2909 }
d3a9eea2 2910
c3f34952
TB
2911 /* If not explicitly a parent constructor, gather up the components
2912 and build one. */
2913 if (comp && comp == sym->components
2914 && sym->attr.extension
2915 && comp_tail->val
f6288c24 2916 && (!gfc_bt_struct (comp_tail->val->ts.type)
c3f34952
TB
2917 ||
2918 comp_tail->val->ts.u.derived != this_comp->ts.u.derived))
2919 {
524af0d6 2920 bool m;
c3f34952 2921 gfc_actual_arglist *arg_null = NULL;
6de9cd9a 2922
c3f34952
TB
2923 actual->expr = comp_tail->val;
2924 comp_tail->val = NULL;
6de9cd9a 2925
c3f34952
TB
2926 m = gfc_convert_to_structure_constructor (NULL,
2927 comp->ts.u.derived, &comp_tail->val,
2928 comp->ts.u.derived->attr.zero_comp
2929 ? &arg_null : &actual, true);
524af0d6 2930 if (!m)
c3f34952 2931 goto cleanup;
2eae3dc7 2932
c3f34952
TB
2933 if (comp->ts.u.derived->attr.zero_comp)
2934 {
2935 comp = comp->next;
2936 continue;
2937 }
2938 }
fa9290d3 2939
c3f34952
TB
2940 if (comp)
2941 comp = comp->next;
2942 if (parent && !comp)
2943 break;
fa9290d3 2944
792f7301
MM
2945 if (actual)
2946 actual = actual->next;
6de9cd9a
DN
2947 }
2948
524af0d6 2949 if (!build_actual_constructor (&comp_head, &ctor_head, sym))
7d1f1e61
PT
2950 goto cleanup;
2951
fa9290d3
DK
2952 /* No component should be left, as this should have caused an error in the
2953 loop constructing the component-list (name that does not correspond to any
2954 component in the structure definition). */
c3f34952 2955 if (comp_head && sym->attr.extension)
7d1f1e61
PT
2956 {
2957 for (comp_iter = comp_head; comp_iter; comp_iter = comp_iter->next)
2958 {
a4d9b221 2959 gfc_error ("component %qs at %L has already been set by a "
7d1f1e61
PT
2960 "parent derived type constructor", comp_iter->name,
2961 &comp_iter->where);
2962 }
2963 goto cleanup;
2964 }
c3f34952
TB
2965 else
2966 gcc_assert (!comp_head);
fa9290d3 2967
c3f34952
TB
2968 if (parent)
2969 {
2970 expr = gfc_get_structure_constructor_expr (BT_DERIVED, 0, &gfc_current_locus);
2971 expr->ts.u.derived = sym;
2972 expr->value.constructor = ctor_head;
2973 *cexpr = expr;
2974 }
2975 else
2976 {
2977 expr->ts.u.derived = sym;
2978 expr->ts.kind = 0;
2979 expr->ts.type = BT_DERIVED;
2980 expr->value.constructor = ctor_head;
2981 expr->expr_type = EXPR_STRUCTURE;
2982 }
6de9cd9a 2983
bf1b77dd 2984 gfc_current_locus = old_locus;
c3f34952
TB
2985 if (parent)
2986 *arglist = actual;
524af0d6 2987 return true;
6de9cd9a 2988
c3f34952 2989 cleanup:
bf1b77dd 2990 gfc_current_locus = old_locus;
6de9cd9a 2991
fa9290d3
DK
2992 for (comp_iter = comp_head; comp_iter; )
2993 {
2994 gfc_structure_ctor_component *next = comp_iter->next;
2995 gfc_free_structure_ctor_component (comp_iter);
2996 comp_iter = next;
2997 }
b7e75771 2998 gfc_constructor_free (ctor_head);
c3f34952 2999
524af0d6 3000 return false;
c3f34952
TB
3001}
3002
3003
3004match
3005gfc_match_structure_constructor (gfc_symbol *sym, gfc_expr **result)
3006{
3007 match m;
3008 gfc_expr *e;
3009 gfc_symtree *symtree;
3010
b64c3d06 3011 gfc_get_ha_sym_tree (sym->name, &symtree);
c3f34952
TB
3012
3013 e = gfc_get_expr ();
3014 e->symtree = symtree;
3015 e->expr_type = EXPR_FUNCTION;
3016
f6288c24 3017 gcc_assert (gfc_fl_struct (sym->attr.flavor)
c3f34952
TB
3018 && symtree->n.sym->attr.flavor == FL_PROCEDURE);
3019 e->value.function.esym = sym;
3020 e->symtree->n.sym->attr.generic = 1;
3021
49032565
SK
3022 m = gfc_match_actual_arglist (0, &e->value.function.actual);
3023 if (m != MATCH_YES)
3024 {
3025 gfc_free_expr (e);
3026 return m;
3027 }
3028
3029 if (!gfc_convert_to_structure_constructor (e, sym, NULL, NULL, false))
3030 {
3031 gfc_free_expr (e);
3032 return MATCH_ERROR;
3033 }
3034
586dc38b
SK
3035 /* If a structure constructor is in a DATA statement, then each entity
3036 in the structure constructor must be a constant. Try to reduce the
3037 expression here. */
3038 if (gfc_in_match_data ())
3039 gfc_reduce_init_expr (e);
5bab4c96 3040
49032565
SK
3041 *result = e;
3042 return MATCH_YES;
6de9cd9a
DN
3043}
3044
3045
9a3db5a3
PT
3046/* If the symbol is an implicit do loop index and implicitly typed,
3047 it should not be host associated. Provide a symtree from the
3048 current namespace. */
3049static match
3050check_for_implicit_index (gfc_symtree **st, gfc_symbol **sym)
3051{
3052 if ((*sym)->attr.flavor == FL_VARIABLE
3053 && (*sym)->ns != gfc_current_ns
3054 && (*sym)->attr.implied_index
3055 && (*sym)->attr.implicit_type
3056 && !(*sym)->attr.use_assoc)
3057 {
3058 int i;
08a6b8e0 3059 i = gfc_get_sym_tree ((*sym)->name, NULL, st, false);
9a3db5a3
PT
3060 if (i)
3061 return MATCH_ERROR;
3062 *sym = (*st)->n.sym;
3063 }
3064 return MATCH_YES;
3065}
3066
3067
3070bab4
JW
3068/* Procedure pointer as function result: Replace the function symbol by the
3069 auto-generated hidden result variable named "ppr@". */
3070
524af0d6 3071static bool
3070bab4
JW
3072replace_hidden_procptr_result (gfc_symbol **sym, gfc_symtree **st)
3073{
3074 /* Check for procedure pointer result variable. */
3075 if ((*sym)->attr.function && !(*sym)->attr.external
3076 && (*sym)->result && (*sym)->result != *sym
3077 && (*sym)->result->attr.proc_pointer
3078 && (*sym) == gfc_current_ns->proc_name
3079 && (*sym) == (*sym)->result->ns->proc_name
3080 && strcmp ("ppr@", (*sym)->result->name) == 0)
3081 {
3082 /* Automatic replacement with "hidden" result variable. */
3083 (*sym)->result->attr.referenced = (*sym)->attr.referenced;
3084 *sym = (*sym)->result;
3085 *st = gfc_find_symtree ((*sym)->ns->sym_root, (*sym)->name);
524af0d6 3086 return true;
3070bab4 3087 }
524af0d6 3088 return false;
3070bab4
JW
3089}
3090
3091
6de9cd9a
DN
3092/* Matches a variable name followed by anything that might follow it--
3093 array reference, argument list of a function, etc. */
3094
3095match
edf1eac2 3096gfc_match_rvalue (gfc_expr **result)
6de9cd9a
DN
3097{
3098 gfc_actual_arglist *actual_arglist;
d3fcc995 3099 char name[GFC_MAX_SYMBOL_LEN + 1], argname[GFC_MAX_SYMBOL_LEN + 1];
6de9cd9a
DN
3100 gfc_state_data *st;
3101 gfc_symbol *sym;
3102 gfc_symtree *symtree;
d3fcc995 3103 locus where, old_loc;
6de9cd9a 3104 gfc_expr *e;
d3fcc995 3105 match m, m2;
6de9cd9a 3106 int i;
5270c302
AL
3107 gfc_typespec *ts;
3108 bool implicit_char;
a99288e5 3109 gfc_ref *ref;
6de9cd9a 3110
cd714e1e
FR
3111 m = gfc_match ("%%loc");
3112 if (m == MATCH_YES)
3113 {
3114 if (!gfc_notify_std (GFC_STD_LEGACY, "%%LOC() as an rvalue at %C"))
3115 return MATCH_ERROR;
3116 strncpy (name, "loc", 4);
3117 }
3118
3119 else
3120 {
3121 m = gfc_match_name (name);
3122 if (m != MATCH_YES)
3123 return m;
3124 }
6de9cd9a 3125
f6288c24
FR
3126 /* Check if the symbol exists. */
3127 if (gfc_find_sym_tree (name, NULL, 1, &symtree))
6de9cd9a
DN
3128 return MATCH_ERROR;
3129
f6288c24
FR
3130 /* If the symbol doesn't exist, create it unless the name matches a FL_STRUCT
3131 type. For derived types we create a generic symbol which links to the
3132 derived type symbol; STRUCTUREs are simpler and must not conflict with
3133 variables. */
3134 if (!symtree)
3135 if (gfc_find_sym_tree (gfc_dt_upper_string (name), NULL, 1, &symtree))
3136 return MATCH_ERROR;
3137 if (!symtree || symtree->n.sym->attr.flavor != FL_STRUCT)
3138 {
3139 if (gfc_find_state (COMP_INTERFACE)
3140 && !gfc_current_ns->has_import_set)
3141 i = gfc_get_sym_tree (name, NULL, &symtree, false);
3142 else
3143 i = gfc_get_ha_sym_tree (name, &symtree);
3144 if (i)
3145 return MATCH_ERROR;
3146 }
3147
3148
6de9cd9a
DN
3149 sym = symtree->n.sym;
3150 e = NULL;
63645982 3151 where = gfc_current_locus;
6de9cd9a 3152
3070bab4
JW
3153 replace_hidden_procptr_result (&sym, &symtree);
3154
9a3db5a3
PT
3155 /* If this is an implicit do loop index and implicitly typed,
3156 it should not be host associated. */
3157 m = check_for_implicit_index (&symtree, &sym);
3158 if (m != MATCH_YES)
3159 return m;
3160
6de9cd9a 3161 gfc_set_sym_referenced (sym);
9a3db5a3 3162 sym->attr.implied_index = 0;
6de9cd9a 3163
0921bc44
JJ
3164 if (sym->attr.function && sym->result == sym)
3165 {
811849c0
PT
3166 /* See if this is a directly recursive function call. */
3167 gfc_gobble_whitespace ();
3168 if (sym->attr.recursive
8fc541d3 3169 && gfc_peek_ascii_char () == '('
fc2d8680
PT
3170 && gfc_current_ns->proc_name == sym
3171 && !sym->attr.dimension)
811849c0 3172 {
a4d9b221 3173 gfc_error ("%qs at %C is the name of a recursive function "
fc2d8680
PT
3174 "and so refers to the result variable. Use an "
3175 "explicit RESULT variable for direct recursion "
3176 "(12.5.2.1)", sym->name);
811849c0
PT
3177 return MATCH_ERROR;
3178 }
fc2d8680 3179
2d71b918 3180 if (gfc_is_function_return_value (sym, gfc_current_ns))
0921bc44
JJ
3181 goto variable;
3182
3183 if (sym->attr.entry
3184 && (sym->ns == gfc_current_ns
3185 || sym->ns == gfc_current_ns->parent))
3186 {
3187 gfc_entry_list *el = NULL;
bf1b77dd 3188
0921bc44
JJ
3189 for (el = sym->ns->entries; el; el = el->next)
3190 if (sym == el->sym)
3191 goto variable;
3192 }
3193 }
6de9cd9a 3194
8fb74da4
JW
3195 if (gfc_matching_procptr_assignment)
3196 goto procptr0;
3197
6de9cd9a
DN
3198 if (sym->attr.function || sym->attr.external || sym->attr.intrinsic)
3199 goto function0;
3200
3201 if (sym->attr.generic)
3202 goto generic_function;
3203
3204 switch (sym->attr.flavor)
3205 {
3206 case FL_VARIABLE:
3207 variable:
6de9cd9a
DN
3208 e = gfc_get_expr ();
3209
3210 e->expr_type = EXPR_VARIABLE;
3211 e->symtree = symtree;
3212
713485cc 3213 m = gfc_match_varspec (e, 0, false, true);
6de9cd9a
DN
3214 break;
3215
3216 case FL_PARAMETER:
b7263e8f 3217 /* A statement of the form "REAL, parameter :: a(0:10) = 1" will
bf1b77dd 3218 end up here. Unfortunately, sym->value->expr_type is set to
b7263e8f
EE
3219 EXPR_CONSTANT, and so the if () branch would be followed without
3220 the !sym->as check. */
3221 if (sym->value && sym->value->expr_type != EXPR_ARRAY && !sym->as)
6de9cd9a
DN
3222 e = gfc_copy_expr (sym->value);
3223 else
3224 {
3225 e = gfc_get_expr ();
3226 e->expr_type = EXPR_VARIABLE;
3227 }
3228
3229 e->symtree = symtree;
713485cc 3230 m = gfc_match_varspec (e, 0, false, true);
a99288e5
PT
3231
3232 if (sym->ts.is_c_interop || sym->ts.is_iso_c)
3233 break;
3234
927171bf
PT
3235 /* Variable array references to derived type parameters cause
3236 all sorts of headaches in simplification. Treating such
3237 expressions as variable works just fine for all array
3238 references. */
3239 if (sym->value && sym->ts.type == BT_DERIVED && e->ref)
a99288e5
PT
3240 {
3241 for (ref = e->ref; ref; ref = ref->next)
3242 if (ref->type == REF_ARRAY)
3243 break;
3244
927171bf 3245 if (ref == NULL || ref->u.ar.type == AR_FULL)
a99288e5
PT
3246 break;
3247
3248 ref = e->ref;
3249 e->ref = NULL;
3250 gfc_free_expr (e);
3251 e = gfc_get_expr ();
3252 e->expr_type = EXPR_VARIABLE;
3253 e->symtree = symtree;
3254 e->ref = ref;
a99288e5
PT
3255 }
3256
6de9cd9a
DN
3257 break;
3258
f6288c24 3259 case FL_STRUCT:
6de9cd9a
DN
3260 case FL_DERIVED:
3261 sym = gfc_use_derived (sym);
3262 if (sym == NULL)
3263 m = MATCH_ERROR;
3264 else
c3f34952 3265 goto generic_function;
6de9cd9a
DN
3266 break;
3267
3268 /* If we're here, then the name is known to be the name of a
3269 procedure, yet it is not sure to be the name of a function. */
3270 case FL_PROCEDURE:
8fb74da4 3271
1cc0e193 3272 /* Procedure Pointer Assignments. */
8fb74da4
JW
3273 procptr0:
3274 if (gfc_matching_procptr_assignment)
3275 {
3276 gfc_gobble_whitespace ();
e35bbb23 3277 if (!sym->attr.dimension && gfc_peek_ascii_char () == '(')
8fb74da4
JW
3278 /* Parse functions returning a procptr. */
3279 goto function0;
3280
8fb74da4
JW
3281 e = gfc_get_expr ();
3282 e->expr_type = EXPR_VARIABLE;
3283 e->symtree = symtree;
713485cc 3284 m = gfc_match_varspec (e, 0, false, true);
2dda89a8
JW
3285 if (!e->ref && sym->attr.flavor == FL_UNKNOWN
3286 && sym->ts.type == BT_UNKNOWN
524af0d6 3287 && !gfc_add_flavor (&sym->attr, FL_PROCEDURE, sym->name, NULL))
2dda89a8
JW
3288 {
3289 m = MATCH_ERROR;
3290 break;
3291 }
8fb74da4
JW
3292 break;
3293 }
3294
6de9cd9a
DN
3295 if (sym->attr.subroutine)
3296 {
a4d9b221 3297 gfc_error ("Unexpected use of subroutine name %qs at %C",
6de9cd9a
DN
3298 sym->name);
3299 m = MATCH_ERROR;
3300 break;
3301 }
3302
3303 /* At this point, the name has to be a non-statement function.
edf1eac2
SK
3304 If the name is the same as the current function being
3305 compiled, then we have a variable reference (to the function
3306 result) if the name is non-recursive. */
6de9cd9a
DN
3307
3308 st = gfc_enclosing_unit (NULL);
3309
4668d6f9
PT
3310 if (st != NULL
3311 && st->state == COMP_FUNCTION
6de9cd9a
DN
3312 && st->sym == sym
3313 && !sym->attr.recursive)
3314 {
3315 e = gfc_get_expr ();
3316 e->symtree = symtree;
3317 e->expr_type = EXPR_VARIABLE;
3318
713485cc 3319 m = gfc_match_varspec (e, 0, false, true);
6de9cd9a
DN
3320 break;
3321 }
3322
3323 /* Match a function reference. */
3324 function0:
3325 m = gfc_match_actual_arglist (0, &actual_arglist);
3326 if (m == MATCH_NO)
3327 {
3328 if (sym->attr.proc == PROC_ST_FUNCTION)
a4d9b221 3329 gfc_error ("Statement function %qs requires argument list at %C",
6de9cd9a
DN
3330 sym->name);
3331 else
a4d9b221 3332 gfc_error ("Function %qs requires an argument list at %C",
6de9cd9a
DN
3333 sym->name);
3334
3335 m = MATCH_ERROR;
3336 break;
3337 }
3338
3339 if (m != MATCH_YES)
3340 {
3341 m = MATCH_ERROR;
3342 break;
3343 }
3344
3345 gfc_get_ha_sym_tree (name, &symtree); /* Can't fail */
3346 sym = symtree->n.sym;
3347
3070bab4
JW
3348 replace_hidden_procptr_result (&sym, &symtree);
3349
6de9cd9a
DN
3350 e = gfc_get_expr ();
3351 e->symtree = symtree;
3352 e->expr_type = EXPR_FUNCTION;
3353 e->value.function.actual = actual_arglist;
63645982 3354 e->where = gfc_current_locus;
6de9cd9a 3355
102344e2
TB
3356 if (sym->ts.type == BT_CLASS && sym->attr.class_ok
3357 && CLASS_DATA (sym)->as)
3358 e->rank = CLASS_DATA (sym)->as->rank;
3359 else if (sym->as != NULL)
6de9cd9a
DN
3360 e->rank = sym->as->rank;
3361
3362 if (!sym->attr.function
524af0d6 3363 && !gfc_add_function (&sym->attr, sym->name, NULL))
6de9cd9a
DN
3364 {
3365 m = MATCH_ERROR;
3366 break;
3367 }
3368
a8b3b0b6
CR
3369 /* Check here for the existence of at least one argument for the
3370 iso_c_binding functions C_LOC, C_FUNLOC, and C_ASSOCIATED. The
3371 argument(s) given will be checked in gfc_iso_c_func_interface,
3372 during resolution of the function call. */
3373 if (sym->attr.is_iso_c == 1
3374 && (sym->from_intmod == INTMOD_ISO_C_BINDING
3375 && (sym->intmod_sym_id == ISOCBINDING_LOC
3376 || sym->intmod_sym_id == ISOCBINDING_FUNLOC
3377 || sym->intmod_sym_id == ISOCBINDING_ASSOCIATED)))
3378 {
3379 /* make sure we were given a param */
3380 if (actual_arglist == NULL)
3381 {
a4d9b221 3382 gfc_error ("Missing argument to %qs at %C", sym->name);
a8b3b0b6
CR
3383 m = MATCH_ERROR;
3384 break;
3385 }
3386 }
3387
6de9cd9a
DN
3388 if (sym->result == NULL)
3389 sym->result = sym;
3390
20fee4a9
JW
3391 gfc_gobble_whitespace ();
3392 /* F08:C612. */
3393 if (gfc_peek_ascii_char() == '%')
3394 {
3395 gfc_error ("The leftmost part-ref in a data-ref can not be a "
3396 "function reference at %C");
3397 m = MATCH_ERROR;
3398 }
3399
6de9cd9a
DN
3400 m = MATCH_YES;
3401 break;
3402
3403 case FL_UNKNOWN:
3404
3405 /* Special case for derived type variables that get their types
edf1eac2
SK
3406 via an IMPLICIT statement. This can't wait for the
3407 resolution phase. */
6de9cd9a 3408
f6288c24
FR
3409 old_loc = gfc_current_locus;
3410 if (gfc_match_member_sep (sym) == MATCH_YES
0dd973dd 3411 && sym->ts.type == BT_UNKNOWN
713485cc 3412 && gfc_get_default_type (sym->name, sym->ns)->type == BT_DERIVED)
6de9cd9a 3413 gfc_set_default_type (sym, 0, sym->ns);
f6288c24 3414 gfc_current_locus = old_loc;
6de9cd9a 3415
492792ed 3416 /* If the symbol has a (co)dimension attribute, the expression is a
edf1eac2 3417 variable. */
6de9cd9a 3418
492792ed 3419 if (sym->attr.dimension || sym->attr.codimension)
6de9cd9a 3420 {
524af0d6 3421 if (!gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, NULL))
6de9cd9a
DN
3422 {
3423 m = MATCH_ERROR;
3424 break;
3425 }
3426
3427 e = gfc_get_expr ();
3428 e->symtree = symtree;
3429 e->expr_type = EXPR_VARIABLE;
713485cc 3430 m = gfc_match_varspec (e, 0, false, true);
6de9cd9a
DN
3431 break;
3432 }
3433
cd99c23c 3434 if (sym->ts.type == BT_CLASS && sym->attr.class_ok
492792ed
TB
3435 && (CLASS_DATA (sym)->attr.dimension
3436 || CLASS_DATA (sym)->attr.codimension))
c49ea23d 3437 {
524af0d6 3438 if (!gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, NULL))
c49ea23d
PT
3439 {
3440 m = MATCH_ERROR;
3441 break;
3442 }
3443
3444 e = gfc_get_expr ();
3445 e->symtree = symtree;
3446 e->expr_type = EXPR_VARIABLE;
3447 m = gfc_match_varspec (e, 0, false, true);
3448 break;
3449 }
3450
6de9cd9a 3451 /* Name is not an array, so we peek to see if a '(' implies a
edf1eac2
SK
3452 function call or a substring reference. Otherwise the
3453 variable is just a scalar. */
6de9cd9a
DN
3454
3455 gfc_gobble_whitespace ();
8fc541d3 3456 if (gfc_peek_ascii_char () != '(')
6de9cd9a
DN
3457 {
3458 /* Assume a scalar variable */
3459 e = gfc_get_expr ();
3460 e->symtree = symtree;
3461 e->expr_type = EXPR_VARIABLE;
3462
524af0d6 3463 if (!gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, NULL))
6de9cd9a
DN
3464 {
3465 m = MATCH_ERROR;
3466 break;
3467 }
3468
8e1f752a 3469 /*FIXME:??? gfc_match_varspec does set this for us: */
6de9cd9a 3470 e->ts = sym->ts;
713485cc 3471 m = gfc_match_varspec (e, 0, false, true);
6de9cd9a
DN
3472 break;
3473 }
3474
d3fcc995
TS
3475 /* See if this is a function reference with a keyword argument
3476 as first argument. We do this because otherwise a spurious
3477 symbol would end up in the symbol table. */
3478
3479 old_loc = gfc_current_locus;
3480 m2 = gfc_match (" ( %n =", argname);
3481 gfc_current_locus = old_loc;
6de9cd9a
DN
3482
3483 e = gfc_get_expr ();
3484 e->symtree = symtree;
3485
d3fcc995 3486 if (m2 != MATCH_YES)
6de9cd9a 3487 {
5270c302 3488 /* Try to figure out whether we're dealing with a character type.
bf1b77dd 3489 We're peeking ahead here, because we don't want to call
5270c302
AL
3490 match_substring if we're dealing with an implicitly typed
3491 non-character variable. */
3492 implicit_char = false;
3493 if (sym->ts.type == BT_UNKNOWN)
3494 {
713485cc 3495 ts = gfc_get_default_type (sym->name, NULL);
5270c302
AL
3496 if (ts->type == BT_CHARACTER)
3497 implicit_char = true;
3498 }
3499
d3fcc995
TS
3500 /* See if this could possibly be a substring reference of a name
3501 that we're not sure is a variable yet. */
6de9cd9a 3502
5270c302 3503 if ((implicit_char || sym->ts.type == BT_CHARACTER)
38217d3e 3504 && match_substring (sym->ts.u.cl, 0, &e->ref, false) == MATCH_YES)
6de9cd9a 3505 {
6de9cd9a 3506
d3fcc995
TS
3507 e->expr_type = EXPR_VARIABLE;
3508
3509 if (sym->attr.flavor != FL_VARIABLE
bf1b77dd 3510 && !gfc_add_flavor (&sym->attr, FL_VARIABLE,
524af0d6 3511 sym->name, NULL))
d3fcc995
TS
3512 {
3513 m = MATCH_ERROR;
3514 break;
3515 }
3516
3517 if (sym->ts.type == BT_UNKNOWN
524af0d6 3518 && !gfc_set_default_type (sym, 1, NULL))
d3fcc995
TS
3519 {
3520 m = MATCH_ERROR;
3521 break;
3522 }
3523
3524 e->ts = sym->ts;
860c8f3b 3525 if (e->ref)
bc21d315 3526 e->ts.u.cl = NULL;
d3fcc995 3527 m = MATCH_YES;
6de9cd9a
DN
3528 break;
3529 }
6de9cd9a
DN
3530 }
3531
3532 /* Give up, assume we have a function. */
3533
08a6b8e0 3534 gfc_get_sym_tree (name, NULL, &symtree, false); /* Can't fail */
6de9cd9a
DN
3535 sym = symtree->n.sym;
3536 e->expr_type = EXPR_FUNCTION;
3537
3538 if (!sym->attr.function
524af0d6 3539 && !gfc_add_function (&sym->attr, sym->name, NULL))
6de9cd9a
DN
3540 {
3541 m = MATCH_ERROR;
3542 break;
3543 }
3544
3545 sym->result = sym;
3546
3547 m = gfc_match_actual_arglist (0, &e->value.function.actual);
3548 if (m == MATCH_NO)
a4d9b221 3549 gfc_error ("Missing argument list in function %qs at %C", sym->name);
6de9cd9a
DN
3550
3551 if (m != MATCH_YES)
3552 {
3553 m = MATCH_ERROR;
3554 break;
3555 }
3556
3557 /* If our new function returns a character, array or structure
edf1eac2 3558 type, it might have subsequent references. */
6de9cd9a 3559
713485cc 3560 m = gfc_match_varspec (e, 0, false, true);
6de9cd9a
DN
3561 if (m == MATCH_NO)
3562 m = MATCH_YES;
3563
3564 break;
3565
3566 generic_function:
f6288c24
FR
3567 /* Look for symbol first; if not found, look for STRUCTURE type symbol
3568 specially. Creates a generic symbol for derived types. */
3569 gfc_find_sym_tree (name, NULL, 1, &symtree);
3570 if (!symtree)
3571 gfc_find_sym_tree (gfc_dt_upper_string (name), NULL, 1, &symtree);
3572 if (!symtree || symtree->n.sym->attr.flavor != FL_STRUCT)
3573 gfc_get_sym_tree (name, NULL, &symtree, false); /* Can't fail */
6de9cd9a
DN
3574
3575 e = gfc_get_expr ();
3576 e->symtree = symtree;
3577 e->expr_type = EXPR_FUNCTION;
3578
f6288c24 3579 if (gfc_fl_struct (sym->attr.flavor))
c3f34952
TB
3580 {
3581 e->value.function.esym = sym;
3582 e->symtree->n.sym->attr.generic = 1;
3583 }
3584
6de9cd9a
DN
3585 m = gfc_match_actual_arglist (0, &e->value.function.actual);
3586 break;
3587
c0f0e35a
JD
3588 case FL_NAMELIST:
3589 m = MATCH_ERROR;
3590 break;
3591
6de9cd9a
DN
3592 default:
3593 gfc_error ("Symbol at %C is not appropriate for an expression");
3594 return MATCH_ERROR;
3595 }
3596
3597 if (m == MATCH_YES)
3598 {
3599 e->where = where;
3600 *result = e;
3601 }
3602 else
3603 gfc_free_expr (e);
3604
3605 return m;
3606}
3607
3608
df2fba9e 3609/* Match a variable, i.e. something that can be assigned to. This
6de9cd9a
DN
3610 starts as a symbol, can be a structure component or an array
3611 reference. It can be a function if the function doesn't have a
3612 separate RESULT variable. If the symbol has not been previously
30aabb86 3613 seen, we assume it is a variable.
6de9cd9a 3614
30aabb86
PT
3615 This function is called by two interface functions:
3616 gfc_match_variable, which has host_flag = 1, and
3617 gfc_match_equiv_variable, with host_flag = 0, to restrict the
3618 match of the symbol to the local scope. */
3619
3620static match
edf1eac2 3621match_variable (gfc_expr **result, int equiv_flag, int host_flag)
6de9cd9a 3622{
f6288c24 3623 gfc_symbol *sym, *dt_sym;
6de9cd9a
DN
3624 gfc_symtree *st;
3625 gfc_expr *expr;
f6288c24 3626 locus where, old_loc;
6de9cd9a
DN
3627 match m;
3628
fd2aa7ad
PT
3629 /* Since nothing has any business being an lvalue in a module
3630 specification block, an interface block or a contains section,
3631 we force the changed_symbols mechanism to work by setting
3632 host_flag to 0. This prevents valid symbols that have the name
3633 of keywords, such as 'end', being turned into variables by
df2fba9e 3634 failed matching to assignments for, e.g., END INTERFACE. */
fd2aa7ad 3635 if (gfc_current_state () == COMP_MODULE
4668d6f9 3636 || gfc_current_state () == COMP_SUBMODULE
fd2aa7ad
PT
3637 || gfc_current_state () == COMP_INTERFACE
3638 || gfc_current_state () == COMP_CONTAINS)
3639 host_flag = 0;
3640
618f4f46 3641 where = gfc_current_locus;
30aabb86 3642 m = gfc_match_sym_tree (&st, host_flag);
6de9cd9a
DN
3643 if (m != MATCH_YES)
3644 return m;
6de9cd9a
DN
3645
3646 sym = st->n.sym;
9a3db5a3
PT
3647
3648 /* If this is an implicit do loop index and implicitly typed,
3649 it should not be host associated. */
3650 m = check_for_implicit_index (&st, &sym);
3651 if (m != MATCH_YES)
3652 return m;
3653
3654 sym->attr.implied_index = 0;
3655
6de9cd9a 3656 gfc_set_sym_referenced (sym);
f6288c24
FR
3657
3658 /* STRUCTUREs may share names with variables, but derived types may not. */
3659 if (sym->attr.flavor == FL_PROCEDURE && sym->generic
3660 && (dt_sym = gfc_find_dt_in_generic (sym)))
3661 {
3662 if (dt_sym->attr.flavor == FL_DERIVED)
2f029c08 3663 gfc_error ("Derived type %qs cannot be used as a variable at %C",
f6288c24
FR
3664 sym->name);
3665 return MATCH_ERROR;
3666 }
3667
6de9cd9a
DN
3668 switch (sym->attr.flavor)
3669 {
3670 case FL_VARIABLE:
8c91ab34 3671 /* Everything is alright. */
6de9cd9a
DN
3672 break;
3673
3674 case FL_UNKNOWN:
d7e2fcd0
TB
3675 {
3676 sym_flavor flavor = FL_UNKNOWN;
3677
3678 gfc_gobble_whitespace ();
3679
3680 if (sym->attr.external || sym->attr.procedure
3681 || sym->attr.function || sym->attr.subroutine)
3682 flavor = FL_PROCEDURE;
b9332b09
PT
3683
3684 /* If it is not a procedure, is not typed and is host associated,
3685 we cannot give it a flavor yet. */
3686 else if (sym->ns == gfc_current_ns->parent
3687 && sym->ts.type == BT_UNKNOWN)
3688 break;
3689
3690 /* These are definitive indicators that this is a variable. */
8fc541d3 3691 else if (gfc_peek_ascii_char () != '(' || sym->ts.type != BT_UNKNOWN
d7e2fcd0
TB
3692 || sym->attr.pointer || sym->as != NULL)
3693 flavor = FL_VARIABLE;
3694
3695 if (flavor != FL_UNKNOWN
524af0d6 3696 && !gfc_add_flavor (&sym->attr, flavor, sym->name, NULL))
d7e2fcd0
TB
3697 return MATCH_ERROR;
3698 }
6de9cd9a
DN
3699 break;
3700
5056a350
SK
3701 case FL_PARAMETER:
3702 if (equiv_flag)
8c91ab34
DK
3703 {
3704 gfc_error ("Named constant at %C in an EQUIVALENCE");
3705 return MATCH_ERROR;
3706 }
3707 /* Otherwise this is checked for and an error given in the
3708 variable definition context checks. */
5056a350
SK
3709 break;
3710
6de9cd9a 3711 case FL_PROCEDURE:
01d2a7d7
DF
3712 /* Check for a nonrecursive function result variable. */
3713 if (sym->attr.function
8c91ab34
DK
3714 && !sym->attr.external
3715 && sym->result == sym
3716 && (gfc_is_function_return_value (sym, gfc_current_ns)
3717 || (sym->attr.entry
3718 && sym->ns == gfc_current_ns)
3719 || (sym->attr.entry
3720 && sym->ns == gfc_current_ns->parent)))
6de9cd9a 3721 {
6de9cd9a
DN
3722 /* If a function result is a derived type, then the derived
3723 type may still have to be resolved. */
3724
3725 if (sym->ts.type == BT_DERIVED
bc21d315 3726 && gfc_use_derived (sym->ts.u.derived) == NULL)
6de9cd9a 3727 return MATCH_ERROR;
6de9cd9a
DN
3728 break;
3729 }
3730
3070bab4 3731 if (sym->attr.proc_pointer
524af0d6 3732 || replace_hidden_procptr_result (&sym, &st))
8fb74da4
JW
3733 break;
3734
6de9cd9a 3735 /* Fall through to error */
81fea426 3736 gcc_fallthrough ();
6de9cd9a
DN
3737
3738 default:
a4d9b221 3739 gfc_error ("%qs at %C is not a variable", sym->name);
6de9cd9a
DN
3740 return MATCH_ERROR;
3741 }
3742
0dd973dd
PB
3743 /* Special case for derived type variables that get their types
3744 via an IMPLICIT statement. This can't wait for the
3745 resolution phase. */
3746
3747 {
3748 gfc_namespace * implicit_ns;
3749
3750 if (gfc_current_ns->proc_name == sym)
3751 implicit_ns = gfc_current_ns;
3752 else
3753 implicit_ns = sym->ns;
5bab4c96 3754
f6288c24
FR
3755 old_loc = gfc_current_locus;
3756 if (gfc_match_member_sep (sym) == MATCH_YES
0dd973dd 3757 && sym->ts.type == BT_UNKNOWN
713485cc 3758 && gfc_get_default_type (sym->name, implicit_ns)->type == BT_DERIVED)
0dd973dd 3759 gfc_set_default_type (sym, 0, implicit_ns);
f6288c24 3760 gfc_current_locus = old_loc;
0dd973dd
PB
3761 }
3762
6de9cd9a
DN
3763 expr = gfc_get_expr ();
3764
3765 expr->expr_type = EXPR_VARIABLE;
3766 expr->symtree = st;
3767 expr->ts = sym->ts;
3768 expr->where = where;
3769
3770 /* Now see if we have to do more. */
713485cc 3771 m = gfc_match_varspec (expr, equiv_flag, false, false);
6de9cd9a
DN
3772 if (m != MATCH_YES)
3773 {
3774 gfc_free_expr (expr);
3775 return m;
3776 }
3777
3778 *result = expr;
3779 return MATCH_YES;
3780}
30aabb86 3781
edf1eac2 3782
30aabb86 3783match
edf1eac2 3784gfc_match_variable (gfc_expr **result, int equiv_flag)
30aabb86
PT
3785{
3786 return match_variable (result, equiv_flag, 1);
3787}
3788
edf1eac2 3789
30aabb86 3790match
edf1eac2 3791gfc_match_equiv_variable (gfc_expr **result)
30aabb86
PT
3792{
3793 return match_variable (result, 1, 0);
3794}
3795