]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/fortran/primary.c
search.c (check_final_overrider): Use inform instead of error for the diagnostics...
[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)
f622221a 865 start = gfc_get_int_expr (gfc_charlen_int_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;
6b271a2e
JB
1009 size_t length;
1010 int kind,save_warn_ampersand, ret;
6de9cd9a
DN
1011 locus old_locus, start_locus;
1012 gfc_symbol *sym;
1013 gfc_expr *e;
6de9cd9a 1014 match m;
00660189 1015 gfc_char_t c, delimiter, *p;
6de9cd9a 1016
63645982 1017 old_locus = gfc_current_locus;
6de9cd9a
DN
1018
1019 gfc_gobble_whitespace ();
1020
6de9cd9a
DN
1021 c = gfc_next_char ();
1022 if (c == '\'' || c == '"')
1023 {
9d64df18 1024 kind = gfc_default_character_kind;
66faed76 1025 start_locus = gfc_current_locus;
6de9cd9a
DN
1026 goto got_delim;
1027 }
1028
8fc541d3 1029 if (gfc_wide_is_digit (c))
6de9cd9a
DN
1030 {
1031 kind = 0;
1032
8fc541d3 1033 while (gfc_wide_is_digit (c))
6de9cd9a
DN
1034 {
1035 kind = kind * 10 + c - '0';
1036 if (kind > 9999999)
1037 goto no_match;
1038 c = gfc_next_char ();
1039 }
1040
1041 }
1042 else
1043 {
63645982 1044 gfc_current_locus = old_locus;
6de9cd9a
DN
1045
1046 m = match_charkind_name (name);
1047 if (m != MATCH_YES)
1048 goto no_match;
1049
1050 if (gfc_find_symbol (name, NULL, 1, &sym)
1051 || sym == NULL
1052 || sym->attr.flavor != FL_PARAMETER)
1053 goto no_match;
1054
1055 kind = -1;
1056 c = gfc_next_char ();
1057 }
1058
1059 if (c == ' ')
1060 {
1061 gfc_gobble_whitespace ();
1062 c = gfc_next_char ();
1063 }
1064
1065 if (c != '_')
1066 goto no_match;
1067
1068 gfc_gobble_whitespace ();
6de9cd9a
DN
1069
1070 c = gfc_next_char ();
1071 if (c != '\'' && c != '"')
1072 goto no_match;
1073
66faed76
DF
1074 start_locus = gfc_current_locus;
1075
6de9cd9a
DN
1076 if (kind == -1)
1077 {
51f03c6b
JJ
1078 if (gfc_extract_int (sym->value, &kind, 1))
1079 return MATCH_ERROR;
a39fafac 1080 gfc_set_sym_referenced (sym);
6de9cd9a
DN
1081 }
1082
e7a2d5fb 1083 if (gfc_validate_kind (BT_CHARACTER, kind, true) < 0)
6de9cd9a
DN
1084 {
1085 gfc_error ("Invalid kind %d for CHARACTER constant at %C", kind);
1086 return MATCH_ERROR;
1087 }
1088
1089got_delim:
1090 /* Scan the string into a block of memory by first figuring out how
1091 long it is, allocating the structure, then re-reading it. This
1092 isn't particularly efficient, but string constants aren't that
1093 common in most code. TODO: Use obstacks? */
1094
1095 delimiter = c;
1096 length = 0;
1097
1098 for (;;)
1099 {
8fc541d3
FXC
1100 c = next_string_char (delimiter, &ret);
1101 if (ret == -1)
6de9cd9a 1102 break;
8fc541d3 1103 if (ret == -2)
6de9cd9a 1104 {
63645982 1105 gfc_current_locus = start_locus;
6de9cd9a
DN
1106 gfc_error ("Unterminated character constant beginning at %C");
1107 return MATCH_ERROR;
1108 }
1109
1110 length++;
1111 }
1112
78019d16
SK
1113 /* Peek at the next character to see if it is a b, o, z, or x for the
1114 postfixed BOZ literal constants. */
8fc541d3
FXC
1115 peek = gfc_peek_ascii_char ();
1116 if (peek == 'b' || peek == 'o' || peek =='z' || peek == 'x')
78019d16
SK
1117 goto no_match;
1118
b7e75771 1119 e = gfc_get_character_expr (kind, &start_locus, NULL, length);
6de9cd9a 1120
63645982 1121 gfc_current_locus = start_locus;
6de9cd9a 1122
1355d8e7
TB
1123 /* We disable the warning for the following loop as the warning has already
1124 been printed in the loop above. */
73e42eef 1125 save_warn_ampersand = warn_ampersand;
48749dbc 1126 warn_ampersand = false;
1355d8e7 1127
b7e75771 1128 p = e->value.character.string;
6b271a2e 1129 for (size_t i = 0; i < length; i++)
8fc541d3
FXC
1130 {
1131 c = next_string_char (delimiter, &ret);
1132
d393bbd7 1133 if (!gfc_check_character_range (c, kind))
8fc541d3 1134 {
efb63364 1135 gfc_free_expr (e);
a4d9b221 1136 gfc_error ("Character %qs in string at %C is not representable "
d393bbd7 1137 "in character kind %d", gfc_print_wide_char (c), kind);
8fc541d3
FXC
1138 return MATCH_ERROR;
1139 }
1140
00660189 1141 *p++ = c;
8fc541d3 1142 }
6de9cd9a
DN
1143
1144 *p = '\0'; /* TODO: C-style string is for development/debug purposes. */
73e42eef 1145 warn_ampersand = save_warn_ampersand;
6de9cd9a 1146
8fc541d3
FXC
1147 next_string_char (delimiter, &ret);
1148 if (ret != -1)
6de9cd9a
DN
1149 gfc_internal_error ("match_string_constant(): Delimiter not found");
1150
38217d3e 1151 if (match_substring (NULL, 0, &e->ref, false) != MATCH_NO)
6de9cd9a
DN
1152 e->expr_type = EXPR_SUBSTRING;
1153
1154 *result = e;
1155
1156 return MATCH_YES;
1157
1158no_match:
63645982 1159 gfc_current_locus = old_locus;
6de9cd9a
DN
1160 return MATCH_NO;
1161}
1162
1163
500f8f7b
RS
1164/* Match a .true. or .false. Returns 1 if a .true. was found,
1165 0 if a .false. was found, and -1 otherwise. */
1166static int
1167match_logical_constant_string (void)
1168{
1169 locus orig_loc = gfc_current_locus;
1170
1171 gfc_gobble_whitespace ();
8fc541d3 1172 if (gfc_next_ascii_char () == '.')
500f8f7b 1173 {
8fc541d3 1174 char ch = gfc_next_ascii_char ();
500f8f7b
RS
1175 if (ch == 'f')
1176 {
8fc541d3
FXC
1177 if (gfc_next_ascii_char () == 'a'
1178 && gfc_next_ascii_char () == 'l'
1179 && gfc_next_ascii_char () == 's'
1180 && gfc_next_ascii_char () == 'e'
1181 && gfc_next_ascii_char () == '.')
500f8f7b
RS
1182 /* Matched ".false.". */
1183 return 0;
1184 }
1185 else if (ch == 't')
1186 {
8fc541d3
FXC
1187 if (gfc_next_ascii_char () == 'r'
1188 && gfc_next_ascii_char () == 'u'
1189 && gfc_next_ascii_char () == 'e'
1190 && gfc_next_ascii_char () == '.')
500f8f7b
RS
1191 /* Matched ".true.". */
1192 return 1;
1193 }
1194 }
1195 gfc_current_locus = orig_loc;
1196 return -1;
1197}
1198
6de9cd9a
DN
1199/* Match a .true. or .false. */
1200
1201static match
edf1eac2 1202match_logical_constant (gfc_expr **result)
6de9cd9a 1203{
6de9cd9a 1204 gfc_expr *e;
bee64a2b 1205 int i, kind, is_iso_c;
6de9cd9a 1206
500f8f7b 1207 i = match_logical_constant_string ();
6de9cd9a
DN
1208 if (i == -1)
1209 return MATCH_NO;
1210
bee64a2b 1211 kind = get_kind (&is_iso_c);
6de9cd9a
DN
1212 if (kind == -1)
1213 return MATCH_ERROR;
1214 if (kind == -2)
9d64df18 1215 kind = gfc_default_logical_kind;
6de9cd9a 1216
e7a2d5fb 1217 if (gfc_validate_kind (BT_LOGICAL, kind, true) < 0)
eb62be44
SK
1218 {
1219 gfc_error ("Bad kind for logical constant at %C");
1220 return MATCH_ERROR;
1221 }
6de9cd9a 1222
b7e75771 1223 e = gfc_get_logical_expr (kind, &gfc_current_locus, i);
bee64a2b 1224 e->ts.is_c_interop = is_iso_c;
6de9cd9a
DN
1225
1226 *result = e;
1227 return MATCH_YES;
1228}
1229
1230
1231/* Match a real or imaginary part of a complex constant that is a
1232 symbolic constant. */
1233
1234static match
edf1eac2 1235match_sym_complex_part (gfc_expr **result)
6de9cd9a
DN
1236{
1237 char name[GFC_MAX_SYMBOL_LEN + 1];
1238 gfc_symbol *sym;
1239 gfc_expr *e;
1240 match m;
1241
1242 m = gfc_match_name (name);
1243 if (m != MATCH_YES)
1244 return m;
1245
1246 if (gfc_find_symbol (name, NULL, 1, &sym) || sym == NULL)
1247 return MATCH_NO;
1248
1249 if (sym->attr.flavor != FL_PARAMETER)
1250 {
284ee475
SK
1251 /* Give the matcher for implied do-loops a chance to run. This yields
1252 a much saner error message for "write(*,*) (i, i=1, 6" where the
1253 right parenthesis is missing. */
1254 char c;
1255 gfc_gobble_whitespace ();
1256 c = gfc_peek_ascii_char ();
1257 if (c == '=' || c == ',')
1258 {
1259 m = MATCH_NO;
1260 }
1261 else
1262 {
1263 gfc_error ("Expected PARAMETER symbol in complex constant at %C");
1264 m = MATCH_ERROR;
1265 }
1266 return m;
6de9cd9a
DN
1267 }
1268
70db5f02
SK
1269 if (!sym->value)
1270 goto error;
1271
6de9cd9a
DN
1272 if (!gfc_numeric_ts (&sym->value->ts))
1273 {
1274 gfc_error ("Numeric PARAMETER required in complex constant at %C");
1275 return MATCH_ERROR;
1276 }
1277
1278 if (sym->value->rank != 0)
1279 {
1280 gfc_error ("Scalar PARAMETER required in complex constant at %C");
1281 return MATCH_ERROR;
1282 }
1283
524af0d6
JB
1284 if (!gfc_notify_std (GFC_STD_F2003, "PARAMETER symbol in "
1285 "complex constant at %C"))
e227ac57
FXC
1286 return MATCH_ERROR;
1287
6de9cd9a
DN
1288 switch (sym->value->ts.type)
1289 {
1290 case BT_REAL:
1291 e = gfc_copy_expr (sym->value);
1292 break;
1293
1294 case BT_COMPLEX:
1295 e = gfc_complex2real (sym->value, sym->value->ts.kind);
1296 if (e == NULL)
1297 goto error;
1298 break;
1299
1300 case BT_INTEGER:
9d64df18 1301 e = gfc_int2real (sym->value, gfc_default_real_kind);
6de9cd9a
DN
1302 if (e == NULL)
1303 goto error;
1304 break;
1305
1306 default:
1307 gfc_internal_error ("gfc_match_sym_complex_part(): Bad type");
1308 }
1309
edf1eac2 1310 *result = e; /* e is a scalar, real, constant expression. */
6de9cd9a
DN
1311 return MATCH_YES;
1312
1313error:
1314 gfc_error ("Error converting PARAMETER constant in complex constant at %C");
1315 return MATCH_ERROR;
1316}
1317
1318
6de9cd9a
DN
1319/* Match a real or imaginary part of a complex number. */
1320
1321static match
edf1eac2 1322match_complex_part (gfc_expr **result)
6de9cd9a
DN
1323{
1324 match m;
1325
1326 m = match_sym_complex_part (result);
1327 if (m != MATCH_NO)
1328 return m;
1329
69029c61
PB
1330 m = match_real_constant (result, 1);
1331 if (m != MATCH_NO)
1332 return m;
1333
1334 return match_integer_constant (result, 1);
6de9cd9a
DN
1335}
1336
1337
1338/* Try to match a complex constant. */
1339
1340static match
edf1eac2 1341match_complex_constant (gfc_expr **result)
6de9cd9a
DN
1342{
1343 gfc_expr *e, *real, *imag;
fea70c99 1344 gfc_error_buffer old_error;
6de9cd9a
DN
1345 gfc_typespec target;
1346 locus old_loc;
1347 int kind;
1348 match m;
1349
63645982 1350 old_loc = gfc_current_locus;
6de9cd9a
DN
1351 real = imag = e = NULL;
1352
1353 m = gfc_match_char ('(');
1354 if (m != MATCH_YES)
1355 return m;
1356
fea70c99 1357 gfc_push_error (&old_error);
6de9cd9a
DN
1358
1359 m = match_complex_part (&real);
1360 if (m == MATCH_NO)
d71b89ca 1361 {
fea70c99 1362 gfc_free_error (&old_error);
d71b89ca
JJ
1363 goto cleanup;
1364 }
6de9cd9a
DN
1365
1366 if (gfc_match_char (',') == MATCH_NO)
1367 {
396e56d2
TK
1368 /* It is possible that gfc_int2real issued a warning when
1369 converting an integer to real. Throw this away here. */
1370
1371 gfc_clear_warning ();
fea70c99 1372 gfc_pop_error (&old_error);
6de9cd9a
DN
1373 m = MATCH_NO;
1374 goto cleanup;
1375 }
1376
1377 /* If m is error, then something was wrong with the real part and we
1378 assume we have a complex constant because we've seen the ','. An
1379 ambiguous case here is the start of an iterator list of some
1380 sort. These sort of lists are matched prior to coming here. */
1381
1382 if (m == MATCH_ERROR)
d71b89ca 1383 {
fea70c99 1384 gfc_free_error (&old_error);
d71b89ca
JJ
1385 goto cleanup;
1386 }
fea70c99 1387 gfc_pop_error (&old_error);
6de9cd9a
DN
1388
1389 m = match_complex_part (&imag);
1390 if (m == MATCH_NO)
1391 goto syntax;
1392 if (m == MATCH_ERROR)
1393 goto cleanup;
1394
1395 m = gfc_match_char (')');
1396 if (m == MATCH_NO)
87ebdf2f
SK
1397 {
1398 /* Give the matcher for implied do-loops a chance to run. This
1399 yields a much saner error message for (/ (i, 4=i, 6) /). */
8fc541d3 1400 if (gfc_peek_ascii_char () == '=')
87ebdf2f
SK
1401 {
1402 m = MATCH_ERROR;
1403 goto cleanup;
1404 }
1405 else
6de9cd9a 1406 goto syntax;
87ebdf2f 1407 }
6de9cd9a
DN
1408
1409 if (m == MATCH_ERROR)
1410 goto cleanup;
1411
1412 /* Decide on the kind of this complex number. */
69029c61
PB
1413 if (real->ts.type == BT_REAL)
1414 {
1415 if (imag->ts.type == BT_REAL)
1416 kind = gfc_kind_max (real, imag);
1417 else
1418 kind = real->ts.kind;
1419 }
1420 else
1421 {
1422 if (imag->ts.type == BT_REAL)
1423 kind = imag->ts.kind;
1424 else
1425 kind = gfc_default_real_kind;
1426 }
d91909c0 1427 gfc_clear_ts (&target);
6de9cd9a
DN
1428 target.type = BT_REAL;
1429 target.kind = kind;
1430
69029c61 1431 if (real->ts.type != BT_REAL || kind != real->ts.kind)
6de9cd9a 1432 gfc_convert_type (real, &target, 2);
69029c61 1433 if (imag->ts.type != BT_REAL || kind != imag->ts.kind)
6de9cd9a
DN
1434 gfc_convert_type (imag, &target, 2);
1435
1436 e = gfc_convert_complex (real, imag, kind);
63645982 1437 e->where = gfc_current_locus;
6de9cd9a
DN
1438
1439 gfc_free_expr (real);
1440 gfc_free_expr (imag);
1441
1442 *result = e;
1443 return MATCH_YES;
1444
1445syntax:
1446 gfc_error ("Syntax error in COMPLEX constant at %C");
1447 m = MATCH_ERROR;
1448
1449cleanup:
1450 gfc_free_expr (e);
1451 gfc_free_expr (real);
1452 gfc_free_expr (imag);
63645982 1453 gfc_current_locus = old_loc;
6de9cd9a
DN
1454
1455 return m;
1456}
1457
1458
1459/* Match constants in any of several forms. Returns nonzero for a
1460 match, zero for no match. */
1461
1462match
edf1eac2 1463gfc_match_literal_constant (gfc_expr **result, int signflag)
6de9cd9a
DN
1464{
1465 match m;
1466
1467 m = match_complex_constant (result);
1468 if (m != MATCH_NO)
1469 return m;
1470
1471 m = match_string_constant (result);
1472 if (m != MATCH_NO)
1473 return m;
1474
1475 m = match_boz_constant (result);
1476 if (m != MATCH_NO)
1477 return m;
1478
1479 m = match_real_constant (result, signflag);
1480 if (m != MATCH_NO)
1481 return m;
1482
d3642f89
FW
1483 m = match_hollerith_constant (result);
1484 if (m != MATCH_NO)
1485 return m;
1486
6de9cd9a
DN
1487 m = match_integer_constant (result, signflag);
1488 if (m != MATCH_NO)
1489 return m;
1490
1491 m = match_logical_constant (result);
1492 if (m != MATCH_NO)
1493 return m;
1494
1495 return MATCH_NO;
1496}
1497
1498
2d71b918
JW
1499/* This checks if a symbol is the return value of an encompassing function.
1500 Function nesting can be maximally two levels deep, but we may have
1501 additional local namespaces like BLOCK etc. */
1502
1503bool
1504gfc_is_function_return_value (gfc_symbol *sym, gfc_namespace *ns)
1505{
1506 if (!sym->attr.function || (sym->result != sym))
1507 return false;
1508 while (ns)
1509 {
1510 if (ns->proc_name == sym)
1511 return true;
1512 ns = ns->parent;
1513 }
1514 return false;
1515}
1516
1517
6de9cd9a
DN
1518/* Match a single actual argument value. An actual argument is
1519 usually an expression, but can also be a procedure name. If the
1520 argument is a single name, it is not always possible to tell
1521 whether the name is a dummy procedure or not. We treat these cases
1522 by creating an argument that looks like a dummy procedure and
1523 fixing things later during resolution. */
1524
1525static match
edf1eac2 1526match_actual_arg (gfc_expr **result)
6de9cd9a
DN
1527{
1528 char name[GFC_MAX_SYMBOL_LEN + 1];
1529 gfc_symtree *symtree;
1530 locus where, w;
1531 gfc_expr *e;
8fc541d3 1532 char c;
6de9cd9a 1533
618f4f46 1534 gfc_gobble_whitespace ();
63645982 1535 where = gfc_current_locus;
6de9cd9a
DN
1536
1537 switch (gfc_match_name (name))
1538 {
1539 case MATCH_ERROR:
1540 return MATCH_ERROR;
1541
1542 case MATCH_NO:
1543 break;
1544
1545 case MATCH_YES:
63645982 1546 w = gfc_current_locus;
6de9cd9a 1547 gfc_gobble_whitespace ();
8fc541d3 1548 c = gfc_next_ascii_char ();
63645982 1549 gfc_current_locus = w;
6de9cd9a
DN
1550
1551 if (c != ',' && c != ')')
1552 break;
1553
1554 if (gfc_find_sym_tree (name, NULL, 1, &symtree))
1555 break;
1556 /* Handle error elsewhere. */
1557
1558 /* Eliminate a couple of common cases where we know we don't
edf1eac2 1559 have a function argument. */
6de9cd9a 1560 if (symtree == NULL)
edf1eac2 1561 {
08a6b8e0 1562 gfc_get_sym_tree (name, NULL, &symtree, false);
edf1eac2
SK
1563 gfc_set_sym_referenced (symtree->n.sym);
1564 }
6de9cd9a
DN
1565 else
1566 {
edf1eac2 1567 gfc_symbol *sym;
6de9cd9a 1568
edf1eac2
SK
1569 sym = symtree->n.sym;
1570 gfc_set_sym_referenced (sym);
c0f0e35a
JD
1571 if (sym->attr.flavor == FL_NAMELIST)
1572 {
2f029c08 1573 gfc_error ("Namelist %qs can not be an argument at %L",
c0f0e35a
JD
1574 sym->name, &where);
1575 break;
1576 }
6de9cd9a
DN
1577 if (sym->attr.flavor != FL_PROCEDURE
1578 && sym->attr.flavor != FL_UNKNOWN)
1579 break;
1580
6f9c9d6d
TB
1581 if (sym->attr.in_common && !sym->attr.proc_pointer)
1582 {
bf1b77dd 1583 if (!gfc_add_flavor (&sym->attr, FL_VARIABLE,
524af0d6 1584 sym->name, &sym->declared_at))
efb63364 1585 return MATCH_ERROR;
6f9c9d6d
TB
1586 break;
1587 }
1588
6de9cd9a
DN
1589 /* If the symbol is a function with itself as the result and
1590 is being defined, then we have a variable. */
7a4ef45b
JJ
1591 if (sym->attr.function && sym->result == sym)
1592 {
2d71b918 1593 if (gfc_is_function_return_value (sym, gfc_current_ns))
7a4ef45b
JJ
1594 break;
1595
1596 if (sym->attr.entry
1597 && (sym->ns == gfc_current_ns
1598 || sym->ns == gfc_current_ns->parent))
1599 {
1600 gfc_entry_list *el = NULL;
1601
1602 for (el = sym->ns->entries; el; el = el->next)
1603 if (sym == el->sym)
1604 break;
1605
1606 if (el)
1607 break;
1608 }
1609 }
6de9cd9a
DN
1610 }
1611
1612 e = gfc_get_expr (); /* Leave it unknown for now */
1613 e->symtree = symtree;
1614 e->expr_type = EXPR_VARIABLE;
1615 e->ts.type = BT_PROCEDURE;
1616 e->where = where;
1617
1618 *result = e;
1619 return MATCH_YES;
1620 }
1621
63645982 1622 gfc_current_locus = where;
6de9cd9a
DN
1623 return gfc_match_expr (result);
1624}
1625
1626
5bab4c96 1627/* Match a keyword argument or type parameter spec list.. */
6de9cd9a
DN
1628
1629static match
5bab4c96 1630match_keyword_arg (gfc_actual_arglist *actual, gfc_actual_arglist *base, bool pdt)
6de9cd9a
DN
1631{
1632 char name[GFC_MAX_SYMBOL_LEN + 1];
1633 gfc_actual_arglist *a;
1634 locus name_locus;
1635 match m;
1636
63645982 1637 name_locus = gfc_current_locus;
6de9cd9a
DN
1638 m = gfc_match_name (name);
1639
1640 if (m != MATCH_YES)
1641 goto cleanup;
1642 if (gfc_match_char ('=') != MATCH_YES)
1643 {
1644 m = MATCH_NO;
1645 goto cleanup;
1646 }
1647
5bab4c96
PT
1648 if (pdt)
1649 {
1650 if (gfc_match_char ('*') == MATCH_YES)
1651 {
1652 actual->spec_type = SPEC_ASSUMED;
1653 goto add_name;
1654 }
1655 else if (gfc_match_char (':') == MATCH_YES)
1656 {
1657 actual->spec_type = SPEC_DEFERRED;
1658 goto add_name;
1659 }
1660 else
1661 actual->spec_type = SPEC_EXPLICIT;
1662 }
1663
6de9cd9a
DN
1664 m = match_actual_arg (&actual->expr);
1665 if (m != MATCH_YES)
1666 goto cleanup;
1667
1668 /* Make sure this name has not appeared yet. */
5bab4c96 1669add_name:
6de9cd9a
DN
1670 if (name[0] != '\0')
1671 {
1672 for (a = base; a; a = a->next)
cb9e4f55 1673 if (a->name != NULL && strcmp (a->name, name) == 0)
6de9cd9a 1674 {
a4d9b221 1675 gfc_error ("Keyword %qs at %C has already appeared in the "
edf1eac2 1676 "current argument list", name);
6de9cd9a
DN
1677 return MATCH_ERROR;
1678 }
1679 }
1680
51f03c6b 1681 actual->name = gfc_get_string ("%s", name);
6de9cd9a
DN
1682 return MATCH_YES;
1683
1684cleanup:
63645982 1685 gfc_current_locus = name_locus;
6de9cd9a
DN
1686 return m;
1687}
1688
1689
7fcafa71
PT
1690/* Match an argument list function, such as %VAL. */
1691
1692static match
1693match_arg_list_function (gfc_actual_arglist *result)
1694{
1695 char name[GFC_MAX_SYMBOL_LEN + 1];
1696 locus old_locus;
1697 match m;
1698
1699 old_locus = gfc_current_locus;
1700
1701 if (gfc_match_char ('%') != MATCH_YES)
1702 {
1703 m = MATCH_NO;
1704 goto cleanup;
1705 }
1706
1707 m = gfc_match ("%n (", name);
1708 if (m != MATCH_YES)
1709 goto cleanup;
1710
1711 if (name[0] != '\0')
1712 {
1713 switch (name[0])
1714 {
1715 case 'l':
edf1eac2 1716 if (strncmp (name, "loc", 3) == 0)
7fcafa71
PT
1717 {
1718 result->name = "%LOC";
1719 break;
1720 }
191816a3 1721 /* FALLTHRU */
7fcafa71 1722 case 'r':
edf1eac2 1723 if (strncmp (name, "ref", 3) == 0)
7fcafa71
PT
1724 {
1725 result->name = "%REF";
1726 break;
1727 }
191816a3 1728 /* FALLTHRU */
7fcafa71 1729 case 'v':
edf1eac2 1730 if (strncmp (name, "val", 3) == 0)
7fcafa71
PT
1731 {
1732 result->name = "%VAL";
1733 break;
1734 }
191816a3 1735 /* FALLTHRU */
7fcafa71
PT
1736 default:
1737 m = MATCH_ERROR;
1738 goto cleanup;
1739 }
1740 }
1741
524af0d6 1742 if (!gfc_notify_std (GFC_STD_GNU, "argument list function at %C"))
7fcafa71
PT
1743 {
1744 m = MATCH_ERROR;
1745 goto cleanup;
1746 }
1747
1748 m = match_actual_arg (&result->expr);
1749 if (m != MATCH_YES)
1750 goto cleanup;
1751
1752 if (gfc_match_char (')') != MATCH_YES)
1753 {
1754 m = MATCH_NO;
1755 goto cleanup;
1756 }
1757
1758 return MATCH_YES;
1759
1760cleanup:
1761 gfc_current_locus = old_locus;
1762 return m;
1763}
1764
1765
6de9cd9a
DN
1766/* Matches an actual argument list of a function or subroutine, from
1767 the opening parenthesis to the closing parenthesis. The argument
1768 list is assumed to allow keyword arguments because we don't know if
1769 the symbol associated with the procedure has an implicit interface
ed5ee445 1770 or not. We make sure keywords are unique. If sub_flag is set,
5bab4c96
PT
1771 we're matching the argument list of a subroutine.
1772
1773 NOTE: An alternative use for this function is to match type parameter
1774 spec lists, which are so similar to actual argument lists that the
1775 machinery can be reused. This use is flagged by the optional argument
1776 'pdt'. */
6de9cd9a
DN
1777
1778match
5bab4c96 1779gfc_match_actual_arglist (int sub_flag, gfc_actual_arglist **argp, bool pdt)
6de9cd9a
DN
1780{
1781 gfc_actual_arglist *head, *tail;
1782 int seen_keyword;
1783 gfc_st_label *label;
1784 locus old_loc;
1785 match m;
1786
1787 *argp = tail = NULL;
63645982 1788 old_loc = gfc_current_locus;
6de9cd9a
DN
1789
1790 seen_keyword = 0;
1791
1792 if (gfc_match_char ('(') == MATCH_NO)
1793 return (sub_flag) ? MATCH_YES : MATCH_NO;
1794
1795 if (gfc_match_char (')') == MATCH_YES)
1796 return MATCH_YES;
5bab4c96 1797
6de9cd9a
DN
1798 head = NULL;
1799
837c4b78
JW
1800 matching_actual_arglist++;
1801
6de9cd9a
DN
1802 for (;;)
1803 {
1804 if (head == NULL)
1805 head = tail = gfc_get_actual_arglist ();
1806 else
1807 {
1808 tail->next = gfc_get_actual_arglist ();
1809 tail = tail->next;
1810 }
1811
5bab4c96 1812 if (sub_flag && !pdt && gfc_match_char ('*') == MATCH_YES)
6de9cd9a 1813 {
a34a91f0 1814 m = gfc_match_st_label (&label);
6de9cd9a
DN
1815 if (m == MATCH_NO)
1816 gfc_error ("Expected alternate return label at %C");
1817 if (m != MATCH_YES)
1818 goto cleanup;
1819
524af0d6
JB
1820 if (!gfc_notify_std (GFC_STD_F95_OBS, "Alternate-return argument "
1821 "at %C"))
fbdeeaac
JW
1822 goto cleanup;
1823
6de9cd9a
DN
1824 tail->label = label;
1825 goto next;
1826 }
1827
5bab4c96
PT
1828 if (pdt && !seen_keyword)
1829 {
1830 if (gfc_match_char (':') == MATCH_YES)
1831 {
1832 tail->spec_type = SPEC_DEFERRED;
1833 goto next;
1834 }
1835 else if (gfc_match_char ('*') == MATCH_YES)
1836 {
1837 tail->spec_type = SPEC_ASSUMED;
1838 goto next;
1839 }
1840 else
1841 tail->spec_type = SPEC_EXPLICIT;
18a4e7e3
PT
1842
1843 m = match_keyword_arg (tail, head, pdt);
1844 if (m == MATCH_YES)
1845 {
1846 seen_keyword = 1;
1847 goto next;
1848 }
1849 if (m == MATCH_ERROR)
1850 goto cleanup;
5bab4c96
PT
1851 }
1852
6de9cd9a 1853 /* After the first keyword argument is seen, the following
edf1eac2 1854 arguments must also have keywords. */
6de9cd9a
DN
1855 if (seen_keyword)
1856 {
5bab4c96 1857 m = match_keyword_arg (tail, head, pdt);
6de9cd9a
DN
1858
1859 if (m == MATCH_ERROR)
1860 goto cleanup;
1861 if (m == MATCH_NO)
1862 {
edf1eac2 1863 gfc_error ("Missing keyword name in actual argument list at %C");
6de9cd9a
DN
1864 goto cleanup;
1865 }
1866
1867 }
1868 else
1869 {
7fcafa71
PT
1870 /* Try an argument list function, like %VAL. */
1871 m = match_arg_list_function (tail);
6de9cd9a
DN
1872 if (m == MATCH_ERROR)
1873 goto cleanup;
1874
7fcafa71
PT
1875 /* See if we have the first keyword argument. */
1876 if (m == MATCH_NO)
1877 {
5bab4c96 1878 m = match_keyword_arg (tail, head, false);
7fcafa71
PT
1879 if (m == MATCH_YES)
1880 seen_keyword = 1;
1881 if (m == MATCH_ERROR)
1882 goto cleanup;
1883 }
1884
6de9cd9a
DN
1885 if (m == MATCH_NO)
1886 {
1887 /* Try for a non-keyword argument. */
1888 m = match_actual_arg (&tail->expr);
1889 if (m == MATCH_ERROR)
1890 goto cleanup;
1891 if (m == MATCH_NO)
1892 goto syntax;
1893 }
1894 }
1895
7fcafa71 1896
6de9cd9a
DN
1897 next:
1898 if (gfc_match_char (')') == MATCH_YES)
1899 break;
1900 if (gfc_match_char (',') != MATCH_YES)
1901 goto syntax;
1902 }
1903
1904 *argp = head;
837c4b78 1905 matching_actual_arglist--;
6de9cd9a
DN
1906 return MATCH_YES;
1907
1908syntax:
1909 gfc_error ("Syntax error in argument list at %C");
1910
1911cleanup:
1912 gfc_free_actual_arglist (head);
63645982 1913 gfc_current_locus = old_loc;
837c4b78 1914 matching_actual_arglist--;
6de9cd9a
DN
1915 return MATCH_ERROR;
1916}
1917
1918
8e1f752a 1919/* Used by gfc_match_varspec() to extend the reference list by one
6de9cd9a
DN
1920 element. */
1921
1922static gfc_ref *
edf1eac2 1923extend_ref (gfc_expr *primary, gfc_ref *tail)
6de9cd9a 1924{
6de9cd9a
DN
1925 if (primary->ref == NULL)
1926 primary->ref = tail = gfc_get_ref ();
1927 else
1928 {
1929 if (tail == NULL)
1930 gfc_internal_error ("extend_ref(): Bad tail");
1931 tail->next = gfc_get_ref ();
1932 tail = tail->next;
1933 }
1934
1935 return tail;
1936}
1937
1938
1939/* Match any additional specifications associated with the current
1940 variable like member references or substrings. If equiv_flag is
1941 set we only match stuff that is allowed inside an EQUIVALENCE
8e1f752a 1942 statement. sub_flag tells whether we expect a type-bound procedure found
713485cc
JW
1943 to be a subroutine as part of CALL or a FUNCTION. For procedure pointer
1944 components, 'ppc_arg' determines whether the PPC may be called (with an
1945 argument list), or whether it may just be referred to as a pointer. */
6de9cd9a 1946
8e1f752a 1947match
713485cc
JW
1948gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag,
1949 bool ppc_arg)
6de9cd9a
DN
1950{
1951 char name[GFC_MAX_SYMBOL_LEN + 1];
f6288c24 1952 gfc_ref *substring, *tail, *tmp;
6de9cd9a 1953 gfc_component *component;
a8006d09 1954 gfc_symbol *sym = primary->symtree->n.sym;
b89a63b9 1955 gfc_expr *tgt_expr = NULL;
6de9cd9a 1956 match m;
f2d3cb25 1957 bool unknown;
f6288c24 1958 char sep;
6de9cd9a
DN
1959
1960 tail = NULL;
1961
3c721513 1962 gfc_gobble_whitespace ();
d3a9eea2
TB
1963
1964 if (gfc_peek_ascii_char () == '[')
1965 {
c49ea23d
PT
1966 if ((sym->ts.type != BT_CLASS && sym->attr.dimension)
1967 || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
1968 && CLASS_DATA (sym)->attr.dimension))
d3a9eea2
TB
1969 {
1970 gfc_error ("Array section designator, e.g. '(:)', is required "
1971 "besides the coarray designator '[...]' at %C");
1972 return MATCH_ERROR;
1973 }
c49ea23d
PT
1974 if ((sym->ts.type != BT_CLASS && !sym->attr.codimension)
1975 || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
1976 && !CLASS_DATA (sym)->attr.codimension))
d3a9eea2 1977 {
a4d9b221 1978 gfc_error ("Coarray designator at %C but %qs is not a coarray",
d3a9eea2
TB
1979 sym->name);
1980 return MATCH_ERROR;
1981 }
1982 }
1983
b89a63b9
PT
1984 if (sym->assoc && sym->assoc->target)
1985 tgt_expr = sym->assoc->target;
1986
52bf62f9 1987 /* For associate names, we may not yet know whether they are arrays or not.
b125dc1e
PT
1988 If the selector expression is unambiguously an array; eg. a full array
1989 or an array section, then the associate name must be an array and we can
1990 fix it now. Otherwise, if parentheses follow and it is not a character
1991 type, we have to assume that it actually is one for now. The final
1992 decision will be made at resolution, of course. */
1993 if (sym->assoc
1994 && gfc_peek_ascii_char () == '('
1995 && sym->ts.type != BT_CLASS
1996 && !sym->attr.dimension)
1997 {
b89a63b9
PT
1998 gfc_ref *ref = NULL;
1999
2000 if (!sym->assoc->dangling && tgt_expr)
2001 {
2002 if (tgt_expr->expr_type == EXPR_VARIABLE)
2003 gfc_resolve_expr (tgt_expr);
2004
2005 ref = tgt_expr->ref;
2006 for (; ref; ref = ref->next)
2007 if (ref->type == REF_ARRAY
2008 && (ref->u.ar.type == AR_FULL
2009 || ref->u.ar.type == AR_SECTION))
2010 break;
2011 }
2012
2013 if (ref || (!(sym->assoc->dangling || sym->ts.type == BT_CHARACTER)
2014 && sym->assoc->st
2015 && sym->assoc->st->n.sym
2016 && sym->assoc->st->n.sym->attr.dimension == 0))
b125dc1e 2017 {
b89a63b9
PT
2018 sym->attr.dimension = 1;
2019 if (sym->as == NULL
b125dc1e
PT
2020 && sym->assoc->st
2021 && sym->assoc->st->n.sym
2022 && sym->assoc->st->n.sym->as)
2023 sym->as = gfc_copy_array_spec (sym->assoc->st->n.sym->as);
2024 }
2025 }
b89a63b9
PT
2026 else if (sym->ts.type == BT_CLASS
2027 && tgt_expr
2028 && tgt_expr->expr_type == EXPR_VARIABLE
2029 && sym->ts.u.derived != tgt_expr->ts.u.derived)
2030 {
2031 gfc_resolve_expr (tgt_expr);
2032 if (tgt_expr->rank)
2033 sym->ts.u.derived = tgt_expr->ts.u.derived;
2034 }
52bf62f9 2035
c74b74a8 2036 if ((equiv_flag && gfc_peek_ascii_char () == '(')
d3a9eea2 2037 || gfc_peek_ascii_char () == '[' || sym->attr.codimension
ce2ab24c 2038 || (sym->attr.dimension && sym->ts.type != BT_CLASS
2a573572 2039 && !sym->attr.proc_pointer && !gfc_is_proc_ptr_comp (primary)
f64edc8b 2040 && !(gfc_matching_procptr_assignment
cf2b3c22 2041 && sym->attr.flavor == FL_PROCEDURE))
22061030 2042 || (sym->ts.type == BT_CLASS && sym->attr.class_ok
492792ed
TB
2043 && (CLASS_DATA (sym)->attr.dimension
2044 || CLASS_DATA (sym)->attr.codimension)))
6de9cd9a 2045 {
102344e2
TB
2046 gfc_array_spec *as;
2047
2048 tail = extend_ref (primary, tail);
2049 tail->type = REF_ARRAY;
2050
a8006d09
JJ
2051 /* In EQUIVALENCE, we don't know yet whether we are seeing
2052 an array, character variable or array of character
edf1eac2 2053 variables. We'll leave the decision till resolve time. */
6de9cd9a 2054
102344e2
TB
2055 if (equiv_flag)
2056 as = NULL;
2057 else if (sym->ts.type == BT_CLASS && CLASS_DATA (sym))
2058 as = CLASS_DATA (sym)->as;
2059 else
2060 as = sym->as;
2061
2062 m = gfc_match_array_ref (&tail->u.ar, as, equiv_flag,
2063 as ? as->corank : 0);
6de9cd9a
DN
2064 if (m != MATCH_YES)
2065 return m;
a8006d09 2066
3c721513 2067 gfc_gobble_whitespace ();
8fc541d3 2068 if (equiv_flag && gfc_peek_ascii_char () == '(')
a8006d09
JJ
2069 {
2070 tail = extend_ref (primary, tail);
2071 tail->type = REF_ARRAY;
2072
d3a9eea2 2073 m = gfc_match_array_ref (&tail->u.ar, NULL, equiv_flag, 0);
a8006d09
JJ
2074 if (m != MATCH_YES)
2075 return m;
2076 }
6de9cd9a
DN
2077 }
2078
6de9cd9a
DN
2079 primary->ts = sym->ts;
2080
a8006d09
JJ
2081 if (equiv_flag)
2082 return MATCH_YES;
2083
f6288c24
FR
2084 /* With DEC extensions, member separator may be '.' or '%'. */
2085 sep = gfc_peek_ascii_char ();
2086 m = gfc_match_member_sep (sym);
2087 if (m == MATCH_ERROR)
2088 return MATCH_ERROR;
2089
2090 if (sym->ts.type == BT_UNKNOWN && m == MATCH_YES
713485cc 2091 && gfc_get_default_type (sym->name, sym->ns)->type == BT_DERIVED)
ebac6d9c
DK
2092 gfc_set_default_type (sym, 0, sym->ns);
2093
b89a63b9 2094 /* See if there is a usable typespec in the "no IMPLICIT type" error. */
f6288c24 2095 if (sym->ts.type == BT_UNKNOWN && m == MATCH_YES)
6ee65df3 2096 {
b89a63b9
PT
2097 bool permissible;
2098
a8399af8 2099 /* These target expressions can be resolved at any time. */
b89a63b9
PT
2100 permissible = tgt_expr && tgt_expr->symtree && tgt_expr->symtree->n.sym
2101 && (tgt_expr->symtree->n.sym->attr.use_assoc
2102 || tgt_expr->symtree->n.sym->attr.host_assoc
2103 || tgt_expr->symtree->n.sym->attr.if_source
2104 == IFSRC_DECL);
2105 permissible = permissible
2106 || (tgt_expr && tgt_expr->expr_type == EXPR_OP);
2107
2108 if (permissible)
62d3c075 2109 {
b89a63b9
PT
2110 gfc_resolve_expr (tgt_expr);
2111 sym->ts = tgt_expr->ts;
62d3c075
PT
2112 }
2113
2114 if (sym->ts.type == BT_UNKNOWN)
2115 {
2116 gfc_error ("Symbol %qs at %C has no IMPLICIT type", sym->name);
2117 return MATCH_ERROR;
2118 }
6ee65df3
TB
2119 }
2120 else if ((sym->ts.type != BT_DERIVED && sym->ts.type != BT_CLASS)
f6288c24 2121 && m == MATCH_YES)
6ee65df3 2122 {
f6288c24
FR
2123 gfc_error ("Unexpected %<%c%> for nonderived-type variable %qs at %C",
2124 sep, sym->name);
6ee65df3
TB
2125 return MATCH_ERROR;
2126 }
2127
cf2b3c22 2128 if ((sym->ts.type != BT_DERIVED && sym->ts.type != BT_CLASS)
f6288c24 2129 || m != MATCH_YES)
6de9cd9a
DN
2130 goto check_substring;
2131
bc21d315 2132 sym = sym->ts.u.derived;
6de9cd9a
DN
2133
2134 for (;;)
2135 {
524af0d6 2136 bool t;
e157f736 2137 gfc_symtree *tbp;
8e1f752a 2138
6de9cd9a
DN
2139 m = gfc_match_name (name);
2140 if (m == MATCH_NO)
2141 gfc_error ("Expected structure component name at %C");
2142 if (m != MATCH_YES)
2143 return MATCH_ERROR;
2144
d5c50b02 2145 if (sym && sym->f2k_derived)
b2acf594
PT
2146 tbp = gfc_find_typebound_proc (sym, &t, name, false, &gfc_current_locus);
2147 else
2148 tbp = NULL;
2149
8e1f752a
DK
2150 if (tbp)
2151 {
2152 gfc_symbol* tbp_sym;
2153
524af0d6 2154 if (!t)
8e1f752a
DK
2155 return MATCH_ERROR;
2156
2157 gcc_assert (!tail || !tail->next);
236e3815
JW
2158
2159 if (!(primary->expr_type == EXPR_VARIABLE
2160 || (primary->expr_type == EXPR_STRUCTURE
2161 && primary->symtree && primary->symtree->n.sym
2162 && primary->symtree->n.sym->attr.flavor)))
2163 return MATCH_ERROR;
8e1f752a 2164
e34ccb4c 2165 if (tbp->n.tb->is_generic)
e157f736
DK
2166 tbp_sym = NULL;
2167 else
e34ccb4c 2168 tbp_sym = tbp->n.tb->u.specific->n.sym;
8e1f752a
DK
2169
2170 primary->expr_type = EXPR_COMPCALL;
e34ccb4c 2171 primary->value.compcall.tbp = tbp->n.tb;
e157f736 2172 primary->value.compcall.name = tbp->name;
4a44a72d
DK
2173 primary->value.compcall.ignore_pass = 0;
2174 primary->value.compcall.assign = 0;
2175 primary->value.compcall.base_object = NULL;
e157f736
DK
2176 gcc_assert (primary->symtree->n.sym->attr.referenced);
2177 if (tbp_sym)
2178 primary->ts = tbp_sym->ts;
049bb74e
JW
2179 else
2180 gfc_clear_ts (&primary->ts);
e157f736 2181
e34ccb4c 2182 m = gfc_match_actual_arglist (tbp->n.tb->subroutine,
8e1f752a
DK
2183 &primary->value.compcall.actual);
2184 if (m == MATCH_ERROR)
2185 return MATCH_ERROR;
2186 if (m == MATCH_NO)
2187 {
2188 if (sub_flag)
2189 primary->value.compcall.actual = NULL;
2190 else
2191 {
2192 gfc_error ("Expected argument list at %C");
2193 return MATCH_ERROR;
2194 }
2195 }
2196
8e1f752a
DK
2197 break;
2198 }
2199
f6288c24 2200 component = gfc_find_component (sym, name, false, false, &tmp);
6de9cd9a
DN
2201 if (component == NULL)
2202 return MATCH_ERROR;
2203
f6288c24
FR
2204 /* Extend the reference chain determined by gfc_find_component. */
2205 if (primary->ref == NULL)
2206 primary->ref = tmp;
2207 else
2208 {
2209 /* Set by the for loop below for the last component ref. */
2210 gcc_assert (tail != NULL);
2211 tail->next = tmp;
2212 }
6de9cd9a 2213
f6288c24
FR
2214 /* The reference chain may be longer than one hop for union
2215 subcomponents; find the new tail. */
2216 for (tail = tmp; tail->next; tail = tail->next)
2217 ;
6de9cd9a
DN
2218
2219 primary->ts = component->ts;
2220
a4a76e52 2221 if (component->attr.proc_pointer && ppc_arg)
713485cc 2222 {
837c4b78 2223 /* Procedure pointer component call: Look for argument list. */
23878536 2224 m = gfc_match_actual_arglist (sub_flag,
713485cc
JW
2225 &primary->value.compcall.actual);
2226 if (m == MATCH_ERROR)
2227 return MATCH_ERROR;
837c4b78
JW
2228
2229 if (m == MATCH_NO && !gfc_matching_ptr_assignment
a4a76e52 2230 && !gfc_matching_procptr_assignment && !matching_actual_arglist)
837c4b78 2231 {
a4d9b221 2232 gfc_error ("Procedure pointer component %qs requires an "
837c4b78
JW
2233 "argument list at %C", component->name);
2234 return MATCH_ERROR;
2235 }
2236
23878536
JW
2237 if (m == MATCH_YES)
2238 primary->expr_type = EXPR_PPC;
713485cc
JW
2239
2240 break;
2241 }
2242
c74b74a8 2243 if (component->as != NULL && !component->attr.proc_pointer)
6de9cd9a
DN
2244 {
2245 tail = extend_ref (primary, tail);
2246 tail->type = REF_ARRAY;
2247
d3a9eea2
TB
2248 m = gfc_match_array_ref (&tail->u.ar, component->as, equiv_flag,
2249 component->as->corank);
6de9cd9a
DN
2250 if (m != MATCH_YES)
2251 return m;
2252 }
156c0160
JW
2253 else if (component->ts.type == BT_CLASS && component->attr.class_ok
2254 && CLASS_DATA (component)->as && !component->attr.proc_pointer)
cf2b3c22
TB
2255 {
2256 tail = extend_ref (primary, tail);
2257 tail->type = REF_ARRAY;
6de9cd9a 2258
7a08eda1 2259 m = gfc_match_array_ref (&tail->u.ar, CLASS_DATA (component)->as,
d3a9eea2 2260 equiv_flag,
7a08eda1 2261 CLASS_DATA (component)->as->corank);
cf2b3c22
TB
2262 if (m != MATCH_YES)
2263 return m;
2264 }
2265
2266 if ((component->ts.type != BT_DERIVED && component->ts.type != BT_CLASS)
f6288c24 2267 || gfc_match_member_sep (component->ts.u.derived) != MATCH_YES)
6de9cd9a
DN
2268 break;
2269
bc21d315 2270 sym = component->ts.u.derived;
6de9cd9a
DN
2271 }
2272
2273check_substring:
f2d3cb25 2274 unknown = false;
f6288c24 2275 if (primary->ts.type == BT_UNKNOWN && !gfc_fl_struct (sym->attr.flavor))
c040ffff 2276 {
713485cc 2277 if (gfc_get_default_type (sym->name, sym->ns)->type == BT_CHARACTER)
c040ffff 2278 {
edf1eac2
SK
2279 gfc_set_default_type (sym, 0, sym->ns);
2280 primary->ts = sym->ts;
f2d3cb25 2281 unknown = true;
c040ffff
TS
2282 }
2283 }
2284
6de9cd9a
DN
2285 if (primary->ts.type == BT_CHARACTER)
2286 {
38217d3e
PT
2287 bool def = primary->ts.deferred == 1;
2288 switch (match_substring (primary->ts.u.cl, equiv_flag, &substring, def))
6de9cd9a
DN
2289 {
2290 case MATCH_YES:
2291 if (tail == NULL)
2292 primary->ref = substring;
2293 else
2294 tail->next = substring;
2295
2296 if (primary->expr_type == EXPR_CONSTANT)
2297 primary->expr_type = EXPR_SUBSTRING;
2298
860c8f3b 2299 if (substring)
bc21d315 2300 primary->ts.u.cl = NULL;
860c8f3b 2301
6de9cd9a
DN
2302 break;
2303
2304 case MATCH_NO:
f2d3cb25 2305 if (unknown)
858f1fa2
DK
2306 {
2307 gfc_clear_ts (&primary->ts);
2308 gfc_clear_ts (&sym->ts);
2309 }
6de9cd9a
DN
2310 break;
2311
2312 case MATCH_ERROR:
2313 return MATCH_ERROR;
2314 }
2315 }
2316
4ceda204
JW
2317 /* F08:C611. */
2318 if (primary->ts.type == BT_DERIVED && primary->ref
2319 && primary->ts.u.derived && primary->ts.u.derived->attr.abstract)
2320 {
2321 gfc_error ("Nonpolymorphic reference to abstract type at %C");
2322 return MATCH_ERROR;
2323 }
2324
2325 /* F08:C727. */
d3a9eea2
TB
2326 if (primary->expr_type == EXPR_PPC && gfc_is_coindexed (primary))
2327 {
2328 gfc_error ("Coindexed procedure-pointer component at %C");
2329 return MATCH_ERROR;
2330 }
2331
6de9cd9a
DN
2332 return MATCH_YES;
2333}
2334
2335
2336/* Given an expression that is a variable, figure out what the
2337 ultimate variable's type and attribute is, traversing the reference
2338 structures if necessary.
2339
2340 This subroutine is trickier than it looks. We start at the base
2341 symbol and store the attribute. Component references load a
2342 completely new attribute.
2343
2344 A couple of rules come into play. Subobjects of targets are always
2345 targets themselves. If we see a component that goes through a
2346 pointer, then the expression must also be a target, since the
2347 pointer is associated with something (if it isn't core will soon be
2348 dumped). If we see a full part or section of an array, the
2349 expression is also an array.
2350
f7b529fa 2351 We can have at most one full array reference. */
6de9cd9a
DN
2352
2353symbol_attribute
edf1eac2 2354gfc_variable_attr (gfc_expr *expr, gfc_typespec *ts)
6de9cd9a 2355{
16acb1a8 2356 int dimension, codimension, pointer, allocatable, target;
6de9cd9a
DN
2357 symbol_attribute attr;
2358 gfc_ref *ref;
cf2b3c22
TB
2359 gfc_symbol *sym;
2360 gfc_component *comp;
6de9cd9a 2361
50dbf0b4 2362 if (expr->expr_type != EXPR_VARIABLE && expr->expr_type != EXPR_FUNCTION)
6de9cd9a
DN
2363 gfc_internal_error ("gfc_variable_attr(): Expression isn't a variable");
2364
cf2b3c22
TB
2365 sym = expr->symtree->n.sym;
2366 attr = sym->attr;
6de9cd9a 2367
528622fd 2368 if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
cf2b3c22 2369 {
7a08eda1 2370 dimension = CLASS_DATA (sym)->attr.dimension;
83ba23b7 2371 codimension = CLASS_DATA (sym)->attr.codimension;
d40477b4 2372 pointer = CLASS_DATA (sym)->attr.class_pointer;
7a08eda1 2373 allocatable = CLASS_DATA (sym)->attr.allocatable;
cf2b3c22
TB
2374 }
2375 else
2376 {
2377 dimension = attr.dimension;
83ba23b7 2378 codimension = attr.codimension;
cf2b3c22
TB
2379 pointer = attr.pointer;
2380 allocatable = attr.allocatable;
2381 }
6de9cd9a
DN
2382
2383 target = attr.target;
713485cc 2384 if (pointer || attr.proc_pointer)
6de9cd9a
DN
2385 target = 1;
2386
2387 if (ts != NULL && expr->ts.type == BT_UNKNOWN)
cf2b3c22 2388 *ts = sym->ts;
6de9cd9a 2389
8c91ab34 2390 for (ref = expr->ref; ref; ref = ref->next)
6de9cd9a
DN
2391 switch (ref->type)
2392 {
2393 case REF_ARRAY:
2394
2395 switch (ref->u.ar.type)
2396 {
2397 case AR_FULL:
2398 dimension = 1;
2399 break;
2400
2401 case AR_SECTION:
5046aff5 2402 allocatable = pointer = 0;
6de9cd9a
DN
2403 dimension = 1;
2404 break;
2405
2406 case AR_ELEMENT:
d3a9eea2
TB
2407 /* Handle coarrays. */
2408 if (ref->u.ar.dimen > 0)
2409 allocatable = pointer = 0;
6de9cd9a
DN
2410 break;
2411
2412 case AR_UNKNOWN:
bf1b77dd
PT
2413 /* If any of start, end or stride is not integer, there will
2414 already have been an error issued. */
16acb1a8
DH
2415 int errors;
2416 gfc_get_errors (NULL, &errors);
2417 if (errors == 0)
bf1b77dd 2418 gfc_internal_error ("gfc_variable_attr(): Bad array reference");
6de9cd9a
DN
2419 }
2420
2421 break;
2422
2423 case REF_COMPONENT:
cf2b3c22
TB
2424 comp = ref->u.c.component;
2425 attr = comp->attr;
6de9cd9a 2426 if (ts != NULL)
e8a25349 2427 {
cf2b3c22 2428 *ts = comp->ts;
e8a25349
TS
2429 /* Don't set the string length if a substring reference
2430 follows. */
2431 if (ts->type == BT_CHARACTER
2432 && ref->next && ref->next->type == REF_SUBSTRING)
bc21d315 2433 ts->u.cl = NULL;
e8a25349 2434 }
6de9cd9a 2435
cf2b3c22
TB
2436 if (comp->ts.type == BT_CLASS)
2437 {
83ba23b7 2438 codimension = CLASS_DATA (comp)->attr.codimension;
d40477b4 2439 pointer = CLASS_DATA (comp)->attr.class_pointer;
7a08eda1 2440 allocatable = CLASS_DATA (comp)->attr.allocatable;
cf2b3c22
TB
2441 }
2442 else
2443 {
83ba23b7 2444 codimension = comp->attr.codimension;
cf2b3c22
TB
2445 pointer = comp->attr.pointer;
2446 allocatable = comp->attr.allocatable;
2447 }
713485cc 2448 if (pointer || attr.proc_pointer)
6de9cd9a
DN
2449 target = 1;
2450
2451 break;
2452
2453 case REF_SUBSTRING:
5046aff5 2454 allocatable = pointer = 0;
6de9cd9a
DN
2455 break;
2456 }
2457
2458 attr.dimension = dimension;
83ba23b7 2459 attr.codimension = codimension;
6de9cd9a 2460 attr.pointer = pointer;
5046aff5 2461 attr.allocatable = allocatable;
6de9cd9a 2462 attr.target = target;
80f95228 2463 attr.save = sym->attr.save;
6de9cd9a
DN
2464
2465 return attr;
2466}
2467
2468
2469/* Return the attribute from a general expression. */
2470
2471symbol_attribute
edf1eac2 2472gfc_expr_attr (gfc_expr *e)
6de9cd9a
DN
2473{
2474 symbol_attribute attr;
2475
2476 switch (e->expr_type)
2477 {
2478 case EXPR_VARIABLE:
2479 attr = gfc_variable_attr (e, NULL);
2480 break;
2481
2482 case EXPR_FUNCTION:
2483 gfc_clear_attr (&attr);
2484
50c7654b 2485 if (e->value.function.esym && e->value.function.esym->result)
cf2b3c22
TB
2486 {
2487 gfc_symbol *sym = e->value.function.esym->result;
2488 attr = sym->attr;
2489 if (sym->ts.type == BT_CLASS)
2490 {
7a08eda1 2491 attr.dimension = CLASS_DATA (sym)->attr.dimension;
d40477b4 2492 attr.pointer = CLASS_DATA (sym)->attr.class_pointer;
7a08eda1 2493 attr.allocatable = CLASS_DATA (sym)->attr.allocatable;
cf2b3c22
TB
2494 }
2495 }
574284e9
AV
2496 else if (e->value.function.isym
2497 && e->value.function.isym->transformational
2498 && e->ts.type == BT_CLASS)
2499 attr = CLASS_DATA (e)->attr;
50dbf0b4
JW
2500 else
2501 attr = gfc_variable_attr (e, NULL);
6de9cd9a
DN
2502
2503 /* TODO: NULL() returns pointers. May have to take care of this
edf1eac2 2504 here. */
6de9cd9a
DN
2505
2506 break;
2507
2508 default:
3c9f5092
AV
2509 gfc_clear_attr (&attr);
2510 break;
2511 }
2512
2513 return attr;
2514}
2515
2516
2517/* Given an expression, figure out what the ultimate expression
2518 attribute is. This routine is similar to gfc_variable_attr with
2519 parts of gfc_expr_attr, but focuses more on the needs of
2520 coarrays. For coarrays a codimension attribute is kind of
ba85c8c3
AV
2521 "infectious" being propagated once set and never cleared.
2522 The coarray_comp is only set, when the expression refs a coarray
2523 component. REFS_COMP is set when present to true only, when this EXPR
2524 refs a (non-_data) component. To check whether EXPR refs an allocatable
2525 component in a derived type coarray *refs_comp needs to be set and
2526 coarray_comp has to false. */
3c9f5092
AV
2527
2528static symbol_attribute
ba85c8c3 2529caf_variable_attr (gfc_expr *expr, bool in_allocate, bool *refs_comp)
3c9f5092 2530{
de91486c 2531 int dimension, codimension, pointer, allocatable, target, coarray_comp;
3c9f5092
AV
2532 symbol_attribute attr;
2533 gfc_ref *ref;
2534 gfc_symbol *sym;
2535 gfc_component *comp;
2536
2537 if (expr->expr_type != EXPR_VARIABLE && expr->expr_type != EXPR_FUNCTION)
2538 gfc_internal_error ("gfc_caf_attr(): Expression isn't a variable");
2539
2540 sym = expr->symtree->n.sym;
2541 gfc_clear_attr (&attr);
2542
ba85c8c3 2543 if (refs_comp)
525a5e33 2544 *refs_comp = false;
ba85c8c3 2545
3c9f5092
AV
2546 if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
2547 {
2548 dimension = CLASS_DATA (sym)->attr.dimension;
2549 codimension = CLASS_DATA (sym)->attr.codimension;
2550 pointer = CLASS_DATA (sym)->attr.class_pointer;
2551 allocatable = CLASS_DATA (sym)->attr.allocatable;
de91486c
AV
2552 attr.alloc_comp = CLASS_DATA (sym)->ts.u.derived->attr.alloc_comp;
2553 attr.pointer_comp = CLASS_DATA (sym)->ts.u.derived->attr.pointer_comp;
3c9f5092
AV
2554 }
2555 else
2556 {
2557 dimension = sym->attr.dimension;
2558 codimension = sym->attr.codimension;
2559 pointer = sym->attr.pointer;
2560 allocatable = sym->attr.allocatable;
de91486c 2561 attr.alloc_comp = sym->ts.type == BT_DERIVED
3c9f5092 2562 ? sym->ts.u.derived->attr.alloc_comp : 0;
de91486c
AV
2563 attr.pointer_comp = sym->ts.type == BT_DERIVED
2564 ? sym->ts.u.derived->attr.pointer_comp : 0;
3c9f5092
AV
2565 }
2566
ba85c8c3 2567 target = coarray_comp = 0;
3c9f5092
AV
2568 if (pointer || attr.proc_pointer)
2569 target = 1;
2570
2571 for (ref = expr->ref; ref; ref = ref->next)
2572 switch (ref->type)
2573 {
2574 case REF_ARRAY:
2575
2576 switch (ref->u.ar.type)
2577 {
2578 case AR_FULL:
2579 case AR_SECTION:
2580 dimension = 1;
2581 break;
2582
2583 case AR_ELEMENT:
2584 /* Handle coarrays. */
2585 if (ref->u.ar.dimen > 0 && !in_allocate)
2586 allocatable = pointer = 0;
2587 break;
2588
2589 case AR_UNKNOWN:
2590 /* If any of start, end or stride is not integer, there will
2591 already have been an error issued. */
2592 int errors;
2593 gfc_get_errors (NULL, &errors);
2594 if (errors == 0)
2595 gfc_internal_error ("gfc_caf_attr(): Bad array reference");
2596 }
2597
2598 break;
2599
2600 case REF_COMPONENT:
2601 comp = ref->u.c.component;
2602
2603 if (comp->ts.type == BT_CLASS)
2604 {
ba85c8c3
AV
2605 /* Set coarray_comp only, when this component introduces the
2606 coarray. */
2607 coarray_comp = !codimension && CLASS_DATA (comp)->attr.codimension;
3c9f5092
AV
2608 codimension |= CLASS_DATA (comp)->attr.codimension;
2609 pointer = CLASS_DATA (comp)->attr.class_pointer;
2610 allocatable = CLASS_DATA (comp)->attr.allocatable;
3c9f5092
AV
2611 }
2612 else
2613 {
ba85c8c3
AV
2614 /* Set coarray_comp only, when this component introduces the
2615 coarray. */
2616 coarray_comp = !codimension && comp->attr.codimension;
3c9f5092
AV
2617 codimension |= comp->attr.codimension;
2618 pointer = comp->attr.pointer;
2619 allocatable = comp->attr.allocatable;
3c9f5092
AV
2620 }
2621
525a5e33
AV
2622 if (refs_comp && strcmp (comp->name, "_data") != 0
2623 && (ref->next == NULL
2624 || (ref->next->type == REF_ARRAY && ref->next->next == NULL)))
2625 *refs_comp = true;
ba85c8c3 2626
3c9f5092
AV
2627 if (pointer || attr.proc_pointer)
2628 target = 1;
2629
2630 break;
2631
2632 case REF_SUBSTRING:
2633 allocatable = pointer = 0;
2634 break;
2635 }
2636
2637 attr.dimension = dimension;
2638 attr.codimension = codimension;
2639 attr.pointer = pointer;
2640 attr.allocatable = allocatable;
2641 attr.target = target;
2642 attr.save = sym->attr.save;
2643 attr.coarray_comp = coarray_comp;
3c9f5092
AV
2644
2645 return attr;
2646}
2647
2648
2649symbol_attribute
ba85c8c3 2650gfc_caf_attr (gfc_expr *e, bool in_allocate, bool *refs_comp)
3c9f5092
AV
2651{
2652 symbol_attribute attr;
2653
2654 switch (e->expr_type)
2655 {
2656 case EXPR_VARIABLE:
ba85c8c3 2657 attr = caf_variable_attr (e, in_allocate, refs_comp);
3c9f5092
AV
2658 break;
2659
2660 case EXPR_FUNCTION:
2661 gfc_clear_attr (&attr);
2662
2663 if (e->value.function.esym && e->value.function.esym->result)
2664 {
2665 gfc_symbol *sym = e->value.function.esym->result;
2666 attr = sym->attr;
2667 if (sym->ts.type == BT_CLASS)
2668 {
2669 attr.dimension = CLASS_DATA (sym)->attr.dimension;
2670 attr.pointer = CLASS_DATA (sym)->attr.class_pointer;
2671 attr.allocatable = CLASS_DATA (sym)->attr.allocatable;
2672 attr.alloc_comp = CLASS_DATA (sym)->ts.u.derived->attr.alloc_comp;
de91486c
AV
2673 attr.pointer_comp = CLASS_DATA (sym)->ts.u.derived
2674 ->attr.pointer_comp;
3c9f5092
AV
2675 }
2676 }
2677 else if (e->symtree)
ba85c8c3 2678 attr = caf_variable_attr (e, in_allocate, refs_comp);
3c9f5092
AV
2679 else
2680 gfc_clear_attr (&attr);
2681 break;
2682
2683 default:
6de9cd9a
DN
2684 gfc_clear_attr (&attr);
2685 break;
2686 }
2687
2688 return attr;
2689}
2690
2691
2692/* Match a structure constructor. The initial symbol has already been
2693 seen. */
2694
fa9290d3
DK
2695typedef struct gfc_structure_ctor_component
2696{
2697 char* name;
2698 gfc_expr* val;
2699 locus where;
2700 struct gfc_structure_ctor_component* next;
2701}
2702gfc_structure_ctor_component;
2703
ece3f663 2704#define gfc_get_structure_ctor_component() XCNEW (gfc_structure_ctor_component)
fa9290d3
DK
2705
2706static void
2707gfc_free_structure_ctor_component (gfc_structure_ctor_component *comp)
2708{
cede9502 2709 free (comp->name);
fa9290d3 2710 gfc_free_expr (comp->val);
cede9502 2711 free (comp);
fa9290d3
DK
2712}
2713
7d1f1e61
PT
2714
2715/* Translate the component list into the actual constructor by sorting it in
2716 the order required; this also checks along the way that each and every
2717 component actually has an initializer and handles default initializers
2718 for components without explicit value given. */
524af0d6 2719static bool
7d1f1e61 2720build_actual_constructor (gfc_structure_ctor_component **comp_head,
b7e75771 2721 gfc_constructor_base *ctor_head, gfc_symbol *sym)
6de9cd9a 2722{
fa9290d3 2723 gfc_structure_ctor_component *comp_iter;
7d1f1e61
PT
2724 gfc_component *comp;
2725
2726 for (comp = sym->components; comp; comp = comp->next)
2727 {
2728 gfc_structure_ctor_component **next_ptr;
2729 gfc_expr *value = NULL;
2730
2731 /* Try to find the initializer for the current component by name. */
2732 next_ptr = comp_head;
2733 for (comp_iter = *comp_head; comp_iter; comp_iter = comp_iter->next)
2734 {
2735 if (!strcmp (comp_iter->name, comp->name))
2736 break;
2737 next_ptr = &comp_iter->next;
2738 }
2739
2740 /* If an extension, try building the parent derived type by building
2741 a value expression for the parent derived type and calling self. */
2742 if (!comp_iter && comp == sym->components && sym->attr.extension)
2743 {
b7e75771
JD
2744 value = gfc_get_structure_constructor_expr (comp->ts.type,
2745 comp->ts.kind,
2746 &gfc_current_locus);
7d1f1e61 2747 value->ts = comp->ts;
7d1f1e61 2748
bf1b77dd
PT
2749 if (!build_actual_constructor (comp_head,
2750 &value->value.constructor,
524af0d6 2751 comp->ts.u.derived))
7d1f1e61
PT
2752 {
2753 gfc_free_expr (value);
524af0d6 2754 return false;
7d1f1e61 2755 }
b7e75771
JD
2756
2757 gfc_constructor_append_expr (ctor_head, value, NULL);
7d1f1e61
PT
2758 continue;
2759 }
2760
2761 /* If it was not found, try the default initializer if there's any;
2b3dc0db 2762 otherwise, it's an error unless this is a deferred parameter. */
7d1f1e61
PT
2763 if (!comp_iter)
2764 {
2765 if (comp->initializer)
2766 {
524af0d6
JB
2767 if (!gfc_notify_std (GFC_STD_F2003, "Structure constructor "
2768 "with missing optional arguments at %C"))
2769 return false;
7d1f1e61
PT
2770 value = gfc_copy_expr (comp->initializer);
2771 }
9b548517
AV
2772 else if (comp->attr.allocatable
2773 || (comp->ts.type == BT_CLASS
2774 && CLASS_DATA (comp)->attr.allocatable))
7430df97
JW
2775 {
2776 if (!gfc_notify_std (GFC_STD_F2008, "No initializer for "
2f029c08 2777 "allocatable component %qs given in the "
9b548517 2778 "structure constructor at %C", comp->name))
7430df97
JW
2779 return false;
2780 }
9b548517 2781 else if (!comp->attr.artificial)
7d1f1e61 2782 {
a4d9b221 2783 gfc_error ("No initializer for component %qs given in the"
546c8974 2784 " structure constructor at %C", comp->name);
524af0d6 2785 return false;
7d1f1e61
PT
2786 }
2787 }
2788 else
2789 value = comp_iter->val;
2790
2791 /* Add the value to the constructor chain built. */
b7e75771 2792 gfc_constructor_append_expr (ctor_head, value, NULL);
7d1f1e61
PT
2793
2794 /* Remove the entry from the component list. We don't want the expression
2795 value to be free'd, so set it to NULL. */
2796 if (comp_iter)
2797 {
2798 *next_ptr = comp_iter->next;
2799 comp_iter->val = NULL;
2800 gfc_free_structure_ctor_component (comp_iter);
2801 }
2802 }
524af0d6 2803 return true;
7d1f1e61
PT
2804}
2805
c3f34952 2806
524af0d6 2807bool
c3f34952
TB
2808gfc_convert_to_structure_constructor (gfc_expr *e, gfc_symbol *sym, gfc_expr **cexpr,
2809 gfc_actual_arglist **arglist,
2810 bool parent)
7d1f1e61 2811{
c3f34952 2812 gfc_actual_arglist *actual;
7d1f1e61 2813 gfc_structure_ctor_component *comp_tail, *comp_head, *comp_iter;
b7e75771 2814 gfc_constructor_base ctor_head = NULL;
fa9290d3 2815 gfc_component *comp; /* Is set NULL when named component is first seen */
fa9290d3 2816 const char* last_name = NULL;
c3f34952
TB
2817 locus old_locus;
2818 gfc_expr *expr;
6de9cd9a 2819
c3f34952
TB
2820 expr = parent ? *cexpr : e;
2821 old_locus = gfc_current_locus;
2822 if (parent)
2823 ; /* gfc_current_locus = *arglist->expr ? ->where;*/
2824 else
2825 gfc_current_locus = expr->where;
6de9cd9a 2826
c3f34952 2827 comp_tail = comp_head = NULL;
6de9cd9a 2828
52f49934
DK
2829 if (!parent && sym->attr.abstract)
2830 {
a4d9b221 2831 gfc_error ("Can't construct ABSTRACT type %qs at %L",
c3f34952
TB
2832 sym->name, &expr->where);
2833 goto cleanup;
52f49934
DK
2834 }
2835
c3f34952
TB
2836 comp = sym->components;
2837 actual = parent ? *arglist : expr->value.function.actual;
2838 for ( ; actual; )
6de9cd9a 2839 {
c3f34952 2840 gfc_component *this_comp = NULL;
6de9cd9a 2841
c3f34952
TB
2842 if (!comp_head)
2843 comp_tail = comp_head = gfc_get_structure_ctor_component ();
2844 else
2845 {
2846 comp_tail->next = gfc_get_structure_ctor_component ();
2847 comp_tail = comp_tail->next;
2848 }
2849 if (actual->name)
2850 {
524af0d6
JB
2851 if (!gfc_notify_std (GFC_STD_F2003, "Structure"
2852 " constructor with named arguments at %C"))
c3f34952 2853 goto cleanup;
6de9cd9a 2854
c3f34952
TB
2855 comp_tail->name = xstrdup (actual->name);
2856 last_name = comp_tail->name;
2857 comp = NULL;
2858 }
2859 else
2860 {
2861 /* Components without name are not allowed after the first named
2862 component initializer! */
9b548517 2863 if (!comp || comp->attr.artificial)
fa9290d3 2864 {
c3f34952
TB
2865 if (last_name)
2866 gfc_error ("Component initializer without name after component"
546c8974 2867 " named %s at %L", last_name,
c3f34952
TB
2868 actual->expr ? &actual->expr->where
2869 : &gfc_current_locus);
2870 else
2871 gfc_error ("Too many components in structure constructor at "
546c8974
DM
2872 "%L", actual->expr ? &actual->expr->where
2873 : &gfc_current_locus);
c3f34952 2874 goto cleanup;
fa9290d3 2875 }
fa9290d3 2876
c3f34952
TB
2877 comp_tail->name = xstrdup (comp->name);
2878 }
fa9290d3 2879
c3f34952 2880 /* Find the current component in the structure definition and check
9d1210f4 2881 its access is not private. */
c3f34952 2882 if (comp)
f6288c24 2883 this_comp = gfc_find_component (sym, comp->name, false, false, NULL);
c3f34952
TB
2884 else
2885 {
2886 this_comp = gfc_find_component (sym, (const char *)comp_tail->name,
f6288c24 2887 false, false, NULL);
c3f34952
TB
2888 comp = NULL; /* Reset needed! */
2889 }
6de9cd9a 2890
c3f34952
TB
2891 /* Here we can check if a component name is given which does not
2892 correspond to any component of the defined structure. */
2893 if (!this_comp)
2894 goto cleanup;
fa9290d3 2895
04946c6b
TK
2896 /* For a constant string constructor, make sure the length is
2897 correct; truncate of fill with blanks if needed. */
2898 if (this_comp->ts.type == BT_CHARACTER && !this_comp->attr.allocatable
2899 && this_comp->ts.u.cl && this_comp->ts.u.cl->length
2900 && this_comp->ts.u.cl->length->expr_type == EXPR_CONSTANT
2901 && actual->expr->expr_type == EXPR_CONSTANT)
2902 {
2903 ptrdiff_t c, e;
2904 c = gfc_mpz_get_hwi (this_comp->ts.u.cl->length->value.integer);
2905 e = actual->expr->value.character.length;
2906
2907 if (c != e)
2908 {
2909 ptrdiff_t i, to;
2910 gfc_char_t *dest;
2911 dest = gfc_get_wide_string (c + 1);
2912
2913 to = e < c ? e : c;
2914 for (i = 0; i < to; i++)
2915 dest[i] = actual->expr->value.character.string[i];
2916
2917 for (i = e; i < c; i++)
2918 dest[i] = ' ';
2919
2920 dest[c] = '\0';
2921 free (actual->expr->value.character.string);
2922
2923 actual->expr->value.character.length = c;
2924 actual->expr->value.character.string = dest;
2925 }
2926 }
2927
c3f34952
TB
2928 comp_tail->val = actual->expr;
2929 if (actual->expr != NULL)
2930 comp_tail->where = actual->expr->where;
2931 actual->expr = NULL;
fa9290d3 2932
c3f34952 2933 /* Check if this component is already given a value. */
bf1b77dd 2934 for (comp_iter = comp_head; comp_iter != comp_tail;
c3f34952
TB
2935 comp_iter = comp_iter->next)
2936 {
2937 gcc_assert (comp_iter);
2938 if (!strcmp (comp_iter->name, comp_tail->name))
d3a9eea2 2939 {
c4100eae 2940 gfc_error ("Component %qs is initialized twice in the structure"
546c8974 2941 " constructor at %L", comp_tail->name,
c3f34952
TB
2942 comp_tail->val ? &comp_tail->where
2943 : &gfc_current_locus);
d3a9eea2 2944 goto cleanup;
c3f34952
TB
2945 }
2946 }
d3a9eea2 2947
c3f34952
TB
2948 /* F2008, R457/C725, for PURE C1283. */
2949 if (this_comp->attr.pointer && comp_tail->val
2950 && gfc_is_coindexed (comp_tail->val))
2951 {
a4d9b221 2952 gfc_error ("Coindexed expression to pointer component %qs in "
546c8974 2953 "structure constructor at %L", comp_tail->name,
c3f34952
TB
2954 &comp_tail->where);
2955 goto cleanup;
2956 }
d3a9eea2 2957
c3f34952
TB
2958 /* If not explicitly a parent constructor, gather up the components
2959 and build one. */
2960 if (comp && comp == sym->components
2961 && sym->attr.extension
2962 && comp_tail->val
f6288c24 2963 && (!gfc_bt_struct (comp_tail->val->ts.type)
c3f34952
TB
2964 ||
2965 comp_tail->val->ts.u.derived != this_comp->ts.u.derived))
2966 {
524af0d6 2967 bool m;
c3f34952 2968 gfc_actual_arglist *arg_null = NULL;
6de9cd9a 2969
c3f34952
TB
2970 actual->expr = comp_tail->val;
2971 comp_tail->val = NULL;
6de9cd9a 2972
c3f34952
TB
2973 m = gfc_convert_to_structure_constructor (NULL,
2974 comp->ts.u.derived, &comp_tail->val,
2975 comp->ts.u.derived->attr.zero_comp
2976 ? &arg_null : &actual, true);
524af0d6 2977 if (!m)
c3f34952 2978 goto cleanup;
2eae3dc7 2979
c3f34952
TB
2980 if (comp->ts.u.derived->attr.zero_comp)
2981 {
2982 comp = comp->next;
2983 continue;
2984 }
2985 }
fa9290d3 2986
c3f34952
TB
2987 if (comp)
2988 comp = comp->next;
2989 if (parent && !comp)
2990 break;
fa9290d3 2991
792f7301
MM
2992 if (actual)
2993 actual = actual->next;
6de9cd9a
DN
2994 }
2995
524af0d6 2996 if (!build_actual_constructor (&comp_head, &ctor_head, sym))
7d1f1e61
PT
2997 goto cleanup;
2998
fa9290d3
DK
2999 /* No component should be left, as this should have caused an error in the
3000 loop constructing the component-list (name that does not correspond to any
3001 component in the structure definition). */
c3f34952 3002 if (comp_head && sym->attr.extension)
7d1f1e61
PT
3003 {
3004 for (comp_iter = comp_head; comp_iter; comp_iter = comp_iter->next)
3005 {
a4d9b221 3006 gfc_error ("component %qs at %L has already been set by a "
7d1f1e61
PT
3007 "parent derived type constructor", comp_iter->name,
3008 &comp_iter->where);
3009 }
3010 goto cleanup;
3011 }
c3f34952
TB
3012 else
3013 gcc_assert (!comp_head);
fa9290d3 3014
c3f34952
TB
3015 if (parent)
3016 {
3017 expr = gfc_get_structure_constructor_expr (BT_DERIVED, 0, &gfc_current_locus);
3018 expr->ts.u.derived = sym;
3019 expr->value.constructor = ctor_head;
3020 *cexpr = expr;
3021 }
3022 else
3023 {
3024 expr->ts.u.derived = sym;
3025 expr->ts.kind = 0;
3026 expr->ts.type = BT_DERIVED;
3027 expr->value.constructor = ctor_head;
3028 expr->expr_type = EXPR_STRUCTURE;
3029 }
6de9cd9a 3030
bf1b77dd 3031 gfc_current_locus = old_locus;
c3f34952
TB
3032 if (parent)
3033 *arglist = actual;
524af0d6 3034 return true;
6de9cd9a 3035
c3f34952 3036 cleanup:
bf1b77dd 3037 gfc_current_locus = old_locus;
6de9cd9a 3038
fa9290d3
DK
3039 for (comp_iter = comp_head; comp_iter; )
3040 {
3041 gfc_structure_ctor_component *next = comp_iter->next;
3042 gfc_free_structure_ctor_component (comp_iter);
3043 comp_iter = next;
3044 }
b7e75771 3045 gfc_constructor_free (ctor_head);
c3f34952 3046
524af0d6 3047 return false;
c3f34952
TB
3048}
3049
3050
3051match
3052gfc_match_structure_constructor (gfc_symbol *sym, gfc_expr **result)
3053{
3054 match m;
3055 gfc_expr *e;
3056 gfc_symtree *symtree;
3057
b64c3d06 3058 gfc_get_ha_sym_tree (sym->name, &symtree);
c3f34952
TB
3059
3060 e = gfc_get_expr ();
3061 e->symtree = symtree;
3062 e->expr_type = EXPR_FUNCTION;
3063
f6288c24 3064 gcc_assert (gfc_fl_struct (sym->attr.flavor)
c3f34952
TB
3065 && symtree->n.sym->attr.flavor == FL_PROCEDURE);
3066 e->value.function.esym = sym;
3067 e->symtree->n.sym->attr.generic = 1;
3068
49032565
SK
3069 m = gfc_match_actual_arglist (0, &e->value.function.actual);
3070 if (m != MATCH_YES)
3071 {
3072 gfc_free_expr (e);
3073 return m;
3074 }
3075
3076 if (!gfc_convert_to_structure_constructor (e, sym, NULL, NULL, false))
3077 {
3078 gfc_free_expr (e);
3079 return MATCH_ERROR;
3080 }
3081
586dc38b
SK
3082 /* If a structure constructor is in a DATA statement, then each entity
3083 in the structure constructor must be a constant. Try to reduce the
3084 expression here. */
3085 if (gfc_in_match_data ())
3086 gfc_reduce_init_expr (e);
5bab4c96 3087
49032565
SK
3088 *result = e;
3089 return MATCH_YES;
6de9cd9a
DN
3090}
3091
3092
9a3db5a3
PT
3093/* If the symbol is an implicit do loop index and implicitly typed,
3094 it should not be host associated. Provide a symtree from the
3095 current namespace. */
3096static match
3097check_for_implicit_index (gfc_symtree **st, gfc_symbol **sym)
3098{
3099 if ((*sym)->attr.flavor == FL_VARIABLE
3100 && (*sym)->ns != gfc_current_ns
3101 && (*sym)->attr.implied_index
3102 && (*sym)->attr.implicit_type
3103 && !(*sym)->attr.use_assoc)
3104 {
3105 int i;
08a6b8e0 3106 i = gfc_get_sym_tree ((*sym)->name, NULL, st, false);
9a3db5a3
PT
3107 if (i)
3108 return MATCH_ERROR;
3109 *sym = (*st)->n.sym;
3110 }
3111 return MATCH_YES;
3112}
3113
3114
3070bab4
JW
3115/* Procedure pointer as function result: Replace the function symbol by the
3116 auto-generated hidden result variable named "ppr@". */
3117
524af0d6 3118static bool
3070bab4
JW
3119replace_hidden_procptr_result (gfc_symbol **sym, gfc_symtree **st)
3120{
3121 /* Check for procedure pointer result variable. */
3122 if ((*sym)->attr.function && !(*sym)->attr.external
3123 && (*sym)->result && (*sym)->result != *sym
3124 && (*sym)->result->attr.proc_pointer
3125 && (*sym) == gfc_current_ns->proc_name
3126 && (*sym) == (*sym)->result->ns->proc_name
3127 && strcmp ("ppr@", (*sym)->result->name) == 0)
3128 {
3129 /* Automatic replacement with "hidden" result variable. */
3130 (*sym)->result->attr.referenced = (*sym)->attr.referenced;
3131 *sym = (*sym)->result;
3132 *st = gfc_find_symtree ((*sym)->ns->sym_root, (*sym)->name);
524af0d6 3133 return true;
3070bab4 3134 }
524af0d6 3135 return false;
3070bab4
JW
3136}
3137
3138
6de9cd9a
DN
3139/* Matches a variable name followed by anything that might follow it--
3140 array reference, argument list of a function, etc. */
3141
3142match
edf1eac2 3143gfc_match_rvalue (gfc_expr **result)
6de9cd9a
DN
3144{
3145 gfc_actual_arglist *actual_arglist;
d3fcc995 3146 char name[GFC_MAX_SYMBOL_LEN + 1], argname[GFC_MAX_SYMBOL_LEN + 1];
6de9cd9a
DN
3147 gfc_state_data *st;
3148 gfc_symbol *sym;
3149 gfc_symtree *symtree;
d3fcc995 3150 locus where, old_loc;
6de9cd9a 3151 gfc_expr *e;
d3fcc995 3152 match m, m2;
6de9cd9a 3153 int i;
5270c302
AL
3154 gfc_typespec *ts;
3155 bool implicit_char;
a99288e5 3156 gfc_ref *ref;
6de9cd9a 3157
cd714e1e
FR
3158 m = gfc_match ("%%loc");
3159 if (m == MATCH_YES)
3160 {
3161 if (!gfc_notify_std (GFC_STD_LEGACY, "%%LOC() as an rvalue at %C"))
3162 return MATCH_ERROR;
3163 strncpy (name, "loc", 4);
3164 }
3165
3166 else
3167 {
3168 m = gfc_match_name (name);
3169 if (m != MATCH_YES)
3170 return m;
3171 }
6de9cd9a 3172
f6288c24
FR
3173 /* Check if the symbol exists. */
3174 if (gfc_find_sym_tree (name, NULL, 1, &symtree))
6de9cd9a
DN
3175 return MATCH_ERROR;
3176
f6288c24
FR
3177 /* If the symbol doesn't exist, create it unless the name matches a FL_STRUCT
3178 type. For derived types we create a generic symbol which links to the
3179 derived type symbol; STRUCTUREs are simpler and must not conflict with
3180 variables. */
3181 if (!symtree)
3182 if (gfc_find_sym_tree (gfc_dt_upper_string (name), NULL, 1, &symtree))
3183 return MATCH_ERROR;
3184 if (!symtree || symtree->n.sym->attr.flavor != FL_STRUCT)
3185 {
3186 if (gfc_find_state (COMP_INTERFACE)
3187 && !gfc_current_ns->has_import_set)
3188 i = gfc_get_sym_tree (name, NULL, &symtree, false);
3189 else
3190 i = gfc_get_ha_sym_tree (name, &symtree);
3191 if (i)
3192 return MATCH_ERROR;
3193 }
3194
3195
6de9cd9a
DN
3196 sym = symtree->n.sym;
3197 e = NULL;
63645982 3198 where = gfc_current_locus;
6de9cd9a 3199
3070bab4
JW
3200 replace_hidden_procptr_result (&sym, &symtree);
3201
9a3db5a3
PT
3202 /* If this is an implicit do loop index and implicitly typed,
3203 it should not be host associated. */
3204 m = check_for_implicit_index (&symtree, &sym);
3205 if (m != MATCH_YES)
3206 return m;
3207
6de9cd9a 3208 gfc_set_sym_referenced (sym);
9a3db5a3 3209 sym->attr.implied_index = 0;
6de9cd9a 3210
0921bc44
JJ
3211 if (sym->attr.function && sym->result == sym)
3212 {
811849c0
PT
3213 /* See if this is a directly recursive function call. */
3214 gfc_gobble_whitespace ();
3215 if (sym->attr.recursive
8fc541d3 3216 && gfc_peek_ascii_char () == '('
fc2d8680
PT
3217 && gfc_current_ns->proc_name == sym
3218 && !sym->attr.dimension)
811849c0 3219 {
a4d9b221 3220 gfc_error ("%qs at %C is the name of a recursive function "
fc2d8680
PT
3221 "and so refers to the result variable. Use an "
3222 "explicit RESULT variable for direct recursion "
3223 "(12.5.2.1)", sym->name);
811849c0
PT
3224 return MATCH_ERROR;
3225 }
fc2d8680 3226
2d71b918 3227 if (gfc_is_function_return_value (sym, gfc_current_ns))
0921bc44
JJ
3228 goto variable;
3229
3230 if (sym->attr.entry
3231 && (sym->ns == gfc_current_ns
3232 || sym->ns == gfc_current_ns->parent))
3233 {
3234 gfc_entry_list *el = NULL;
bf1b77dd 3235
0921bc44
JJ
3236 for (el = sym->ns->entries; el; el = el->next)
3237 if (sym == el->sym)
3238 goto variable;
3239 }
3240 }
6de9cd9a 3241
8fb74da4
JW
3242 if (gfc_matching_procptr_assignment)
3243 goto procptr0;
3244
6de9cd9a
DN
3245 if (sym->attr.function || sym->attr.external || sym->attr.intrinsic)
3246 goto function0;
3247
3248 if (sym->attr.generic)
3249 goto generic_function;
3250
3251 switch (sym->attr.flavor)
3252 {
3253 case FL_VARIABLE:
3254 variable:
6de9cd9a
DN
3255 e = gfc_get_expr ();
3256
3257 e->expr_type = EXPR_VARIABLE;
3258 e->symtree = symtree;
3259
713485cc 3260 m = gfc_match_varspec (e, 0, false, true);
6de9cd9a
DN
3261 break;
3262
3263 case FL_PARAMETER:
b7263e8f 3264 /* A statement of the form "REAL, parameter :: a(0:10) = 1" will
bf1b77dd 3265 end up here. Unfortunately, sym->value->expr_type is set to
b7263e8f
EE
3266 EXPR_CONSTANT, and so the if () branch would be followed without
3267 the !sym->as check. */
3268 if (sym->value && sym->value->expr_type != EXPR_ARRAY && !sym->as)
6de9cd9a
DN
3269 e = gfc_copy_expr (sym->value);
3270 else
3271 {
3272 e = gfc_get_expr ();
3273 e->expr_type = EXPR_VARIABLE;
3274 }
3275
3276 e->symtree = symtree;
713485cc 3277 m = gfc_match_varspec (e, 0, false, true);
a99288e5
PT
3278
3279 if (sym->ts.is_c_interop || sym->ts.is_iso_c)
3280 break;
3281
927171bf
PT
3282 /* Variable array references to derived type parameters cause
3283 all sorts of headaches in simplification. Treating such
3284 expressions as variable works just fine for all array
3285 references. */
3286 if (sym->value && sym->ts.type == BT_DERIVED && e->ref)
a99288e5
PT
3287 {
3288 for (ref = e->ref; ref; ref = ref->next)
3289 if (ref->type == REF_ARRAY)
3290 break;
3291
927171bf 3292 if (ref == NULL || ref->u.ar.type == AR_FULL)
a99288e5
PT
3293 break;
3294
3295 ref = e->ref;
3296 e->ref = NULL;
3297 gfc_free_expr (e);
3298 e = gfc_get_expr ();
3299 e->expr_type = EXPR_VARIABLE;
3300 e->symtree = symtree;
3301 e->ref = ref;
a99288e5
PT
3302 }
3303
6de9cd9a
DN
3304 break;
3305
f6288c24 3306 case FL_STRUCT:
6de9cd9a
DN
3307 case FL_DERIVED:
3308 sym = gfc_use_derived (sym);
3309 if (sym == NULL)
3310 m = MATCH_ERROR;
3311 else
c3f34952 3312 goto generic_function;
6de9cd9a
DN
3313 break;
3314
3315 /* If we're here, then the name is known to be the name of a
3316 procedure, yet it is not sure to be the name of a function. */
3317 case FL_PROCEDURE:
8fb74da4 3318
1cc0e193 3319 /* Procedure Pointer Assignments. */
8fb74da4
JW
3320 procptr0:
3321 if (gfc_matching_procptr_assignment)
3322 {
3323 gfc_gobble_whitespace ();
e35bbb23 3324 if (!sym->attr.dimension && gfc_peek_ascii_char () == '(')
8fb74da4
JW
3325 /* Parse functions returning a procptr. */
3326 goto function0;
3327
8fb74da4
JW
3328 e = gfc_get_expr ();
3329 e->expr_type = EXPR_VARIABLE;
3330 e->symtree = symtree;
713485cc 3331 m = gfc_match_varspec (e, 0, false, true);
2dda89a8
JW
3332 if (!e->ref && sym->attr.flavor == FL_UNKNOWN
3333 && sym->ts.type == BT_UNKNOWN
524af0d6 3334 && !gfc_add_flavor (&sym->attr, FL_PROCEDURE, sym->name, NULL))
2dda89a8
JW
3335 {
3336 m = MATCH_ERROR;
3337 break;
3338 }
8fb74da4
JW
3339 break;
3340 }
3341
6de9cd9a
DN
3342 if (sym->attr.subroutine)
3343 {
a4d9b221 3344 gfc_error ("Unexpected use of subroutine name %qs at %C",
6de9cd9a
DN
3345 sym->name);
3346 m = MATCH_ERROR;
3347 break;
3348 }
3349
3350 /* At this point, the name has to be a non-statement function.
edf1eac2
SK
3351 If the name is the same as the current function being
3352 compiled, then we have a variable reference (to the function
3353 result) if the name is non-recursive. */
6de9cd9a
DN
3354
3355 st = gfc_enclosing_unit (NULL);
3356
4668d6f9
PT
3357 if (st != NULL
3358 && st->state == COMP_FUNCTION
6de9cd9a
DN
3359 && st->sym == sym
3360 && !sym->attr.recursive)
3361 {
3362 e = gfc_get_expr ();
3363 e->symtree = symtree;
3364 e->expr_type = EXPR_VARIABLE;
3365
713485cc 3366 m = gfc_match_varspec (e, 0, false, true);
6de9cd9a
DN
3367 break;
3368 }
3369
3370 /* Match a function reference. */
3371 function0:
3372 m = gfc_match_actual_arglist (0, &actual_arglist);
3373 if (m == MATCH_NO)
3374 {
3375 if (sym->attr.proc == PROC_ST_FUNCTION)
a4d9b221 3376 gfc_error ("Statement function %qs requires argument list at %C",
6de9cd9a
DN
3377 sym->name);
3378 else
a4d9b221 3379 gfc_error ("Function %qs requires an argument list at %C",
6de9cd9a
DN
3380 sym->name);
3381
3382 m = MATCH_ERROR;
3383 break;
3384 }
3385
3386 if (m != MATCH_YES)
3387 {
3388 m = MATCH_ERROR;
3389 break;
3390 }
3391
3392 gfc_get_ha_sym_tree (name, &symtree); /* Can't fail */
3393 sym = symtree->n.sym;
3394
3070bab4
JW
3395 replace_hidden_procptr_result (&sym, &symtree);
3396
6de9cd9a
DN
3397 e = gfc_get_expr ();
3398 e->symtree = symtree;
3399 e->expr_type = EXPR_FUNCTION;
3400 e->value.function.actual = actual_arglist;
63645982 3401 e->where = gfc_current_locus;
6de9cd9a 3402
102344e2
TB
3403 if (sym->ts.type == BT_CLASS && sym->attr.class_ok
3404 && CLASS_DATA (sym)->as)
3405 e->rank = CLASS_DATA (sym)->as->rank;
3406 else if (sym->as != NULL)
6de9cd9a
DN
3407 e->rank = sym->as->rank;
3408
3409 if (!sym->attr.function
524af0d6 3410 && !gfc_add_function (&sym->attr, sym->name, NULL))
6de9cd9a
DN
3411 {
3412 m = MATCH_ERROR;
3413 break;
3414 }
3415
a8b3b0b6
CR
3416 /* Check here for the existence of at least one argument for the
3417 iso_c_binding functions C_LOC, C_FUNLOC, and C_ASSOCIATED. The
3418 argument(s) given will be checked in gfc_iso_c_func_interface,
3419 during resolution of the function call. */
3420 if (sym->attr.is_iso_c == 1
3421 && (sym->from_intmod == INTMOD_ISO_C_BINDING
3422 && (sym->intmod_sym_id == ISOCBINDING_LOC
3423 || sym->intmod_sym_id == ISOCBINDING_FUNLOC
3424 || sym->intmod_sym_id == ISOCBINDING_ASSOCIATED)))
3425 {
3426 /* make sure we were given a param */
3427 if (actual_arglist == NULL)
3428 {
a4d9b221 3429 gfc_error ("Missing argument to %qs at %C", sym->name);
a8b3b0b6
CR
3430 m = MATCH_ERROR;
3431 break;
3432 }
3433 }
3434
6de9cd9a
DN
3435 if (sym->result == NULL)
3436 sym->result = sym;
3437
20fee4a9
JW
3438 gfc_gobble_whitespace ();
3439 /* F08:C612. */
3440 if (gfc_peek_ascii_char() == '%')
3441 {
3442 gfc_error ("The leftmost part-ref in a data-ref can not be a "
3443 "function reference at %C");
3444 m = MATCH_ERROR;
3445 }
3446
6de9cd9a
DN
3447 m = MATCH_YES;
3448 break;
3449
3450 case FL_UNKNOWN:
3451
3452 /* Special case for derived type variables that get their types
edf1eac2
SK
3453 via an IMPLICIT statement. This can't wait for the
3454 resolution phase. */
6de9cd9a 3455
f6288c24
FR
3456 old_loc = gfc_current_locus;
3457 if (gfc_match_member_sep (sym) == MATCH_YES
0dd973dd 3458 && sym->ts.type == BT_UNKNOWN
713485cc 3459 && gfc_get_default_type (sym->name, sym->ns)->type == BT_DERIVED)
6de9cd9a 3460 gfc_set_default_type (sym, 0, sym->ns);
f6288c24 3461 gfc_current_locus = old_loc;
6de9cd9a 3462
492792ed 3463 /* If the symbol has a (co)dimension attribute, the expression is a
edf1eac2 3464 variable. */
6de9cd9a 3465
492792ed 3466 if (sym->attr.dimension || sym->attr.codimension)
6de9cd9a 3467 {
524af0d6 3468 if (!gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, NULL))
6de9cd9a
DN
3469 {
3470 m = MATCH_ERROR;
3471 break;
3472 }
3473
3474 e = gfc_get_expr ();
3475 e->symtree = symtree;
3476 e->expr_type = EXPR_VARIABLE;
713485cc 3477 m = gfc_match_varspec (e, 0, false, true);
6de9cd9a
DN
3478 break;
3479 }
3480
cd99c23c 3481 if (sym->ts.type == BT_CLASS && sym->attr.class_ok
492792ed
TB
3482 && (CLASS_DATA (sym)->attr.dimension
3483 || CLASS_DATA (sym)->attr.codimension))
c49ea23d 3484 {
524af0d6 3485 if (!gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, NULL))
c49ea23d
PT
3486 {
3487 m = MATCH_ERROR;
3488 break;
3489 }
3490
3491 e = gfc_get_expr ();
3492 e->symtree = symtree;
3493 e->expr_type = EXPR_VARIABLE;
3494 m = gfc_match_varspec (e, 0, false, true);
3495 break;
3496 }
3497
6de9cd9a 3498 /* Name is not an array, so we peek to see if a '(' implies a
edf1eac2
SK
3499 function call or a substring reference. Otherwise the
3500 variable is just a scalar. */
6de9cd9a
DN
3501
3502 gfc_gobble_whitespace ();
8fc541d3 3503 if (gfc_peek_ascii_char () != '(')
6de9cd9a
DN
3504 {
3505 /* Assume a scalar variable */
3506 e = gfc_get_expr ();
3507 e->symtree = symtree;
3508 e->expr_type = EXPR_VARIABLE;
3509
524af0d6 3510 if (!gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, NULL))
6de9cd9a
DN
3511 {
3512 m = MATCH_ERROR;
3513 break;
3514 }
3515
8e1f752a 3516 /*FIXME:??? gfc_match_varspec does set this for us: */
6de9cd9a 3517 e->ts = sym->ts;
713485cc 3518 m = gfc_match_varspec (e, 0, false, true);
6de9cd9a
DN
3519 break;
3520 }
3521
d3fcc995
TS
3522 /* See if this is a function reference with a keyword argument
3523 as first argument. We do this because otherwise a spurious
3524 symbol would end up in the symbol table. */
3525
3526 old_loc = gfc_current_locus;
3527 m2 = gfc_match (" ( %n =", argname);
3528 gfc_current_locus = old_loc;
6de9cd9a
DN
3529
3530 e = gfc_get_expr ();
3531 e->symtree = symtree;
3532
d3fcc995 3533 if (m2 != MATCH_YES)
6de9cd9a 3534 {
5270c302 3535 /* Try to figure out whether we're dealing with a character type.
bf1b77dd 3536 We're peeking ahead here, because we don't want to call
5270c302
AL
3537 match_substring if we're dealing with an implicitly typed
3538 non-character variable. */
3539 implicit_char = false;
3540 if (sym->ts.type == BT_UNKNOWN)
3541 {
713485cc 3542 ts = gfc_get_default_type (sym->name, NULL);
5270c302
AL
3543 if (ts->type == BT_CHARACTER)
3544 implicit_char = true;
3545 }
3546
d3fcc995
TS
3547 /* See if this could possibly be a substring reference of a name
3548 that we're not sure is a variable yet. */
6de9cd9a 3549
5270c302 3550 if ((implicit_char || sym->ts.type == BT_CHARACTER)
38217d3e 3551 && match_substring (sym->ts.u.cl, 0, &e->ref, false) == MATCH_YES)
6de9cd9a 3552 {
6de9cd9a 3553
d3fcc995
TS
3554 e->expr_type = EXPR_VARIABLE;
3555
3556 if (sym->attr.flavor != FL_VARIABLE
bf1b77dd 3557 && !gfc_add_flavor (&sym->attr, FL_VARIABLE,
524af0d6 3558 sym->name, NULL))
d3fcc995
TS
3559 {
3560 m = MATCH_ERROR;
3561 break;
3562 }
3563
3564 if (sym->ts.type == BT_UNKNOWN
524af0d6 3565 && !gfc_set_default_type (sym, 1, NULL))
d3fcc995
TS
3566 {
3567 m = MATCH_ERROR;
3568 break;
3569 }
3570
3571 e->ts = sym->ts;
860c8f3b 3572 if (e->ref)
bc21d315 3573 e->ts.u.cl = NULL;
d3fcc995 3574 m = MATCH_YES;
6de9cd9a
DN
3575 break;
3576 }
6de9cd9a
DN
3577 }
3578
3579 /* Give up, assume we have a function. */
3580
08a6b8e0 3581 gfc_get_sym_tree (name, NULL, &symtree, false); /* Can't fail */
6de9cd9a
DN
3582 sym = symtree->n.sym;
3583 e->expr_type = EXPR_FUNCTION;
3584
3585 if (!sym->attr.function
524af0d6 3586 && !gfc_add_function (&sym->attr, sym->name, NULL))
6de9cd9a
DN
3587 {
3588 m = MATCH_ERROR;
3589 break;
3590 }
3591
3592 sym->result = sym;
3593
3594 m = gfc_match_actual_arglist (0, &e->value.function.actual);
3595 if (m == MATCH_NO)
a4d9b221 3596 gfc_error ("Missing argument list in function %qs at %C", sym->name);
6de9cd9a
DN
3597
3598 if (m != MATCH_YES)
3599 {
3600 m = MATCH_ERROR;
3601 break;
3602 }
3603
3604 /* If our new function returns a character, array or structure
edf1eac2 3605 type, it might have subsequent references. */
6de9cd9a 3606
713485cc 3607 m = gfc_match_varspec (e, 0, false, true);
6de9cd9a
DN
3608 if (m == MATCH_NO)
3609 m = MATCH_YES;
3610
3611 break;
3612
3613 generic_function:
f6288c24
FR
3614 /* Look for symbol first; if not found, look for STRUCTURE type symbol
3615 specially. Creates a generic symbol for derived types. */
3616 gfc_find_sym_tree (name, NULL, 1, &symtree);
3617 if (!symtree)
3618 gfc_find_sym_tree (gfc_dt_upper_string (name), NULL, 1, &symtree);
3619 if (!symtree || symtree->n.sym->attr.flavor != FL_STRUCT)
3620 gfc_get_sym_tree (name, NULL, &symtree, false); /* Can't fail */
6de9cd9a
DN
3621
3622 e = gfc_get_expr ();
3623 e->symtree = symtree;
3624 e->expr_type = EXPR_FUNCTION;
3625
f6288c24 3626 if (gfc_fl_struct (sym->attr.flavor))
c3f34952
TB
3627 {
3628 e->value.function.esym = sym;
3629 e->symtree->n.sym->attr.generic = 1;
3630 }
3631
6de9cd9a
DN
3632 m = gfc_match_actual_arglist (0, &e->value.function.actual);
3633 break;
3634
c0f0e35a
JD
3635 case FL_NAMELIST:
3636 m = MATCH_ERROR;
3637 break;
3638
6de9cd9a
DN
3639 default:
3640 gfc_error ("Symbol at %C is not appropriate for an expression");
3641 return MATCH_ERROR;
3642 }
3643
3644 if (m == MATCH_YES)
3645 {
3646 e->where = where;
3647 *result = e;
3648 }
3649 else
3650 gfc_free_expr (e);
3651
3652 return m;
3653}
3654
3655
df2fba9e 3656/* Match a variable, i.e. something that can be assigned to. This
6de9cd9a
DN
3657 starts as a symbol, can be a structure component or an array
3658 reference. It can be a function if the function doesn't have a
3659 separate RESULT variable. If the symbol has not been previously
30aabb86 3660 seen, we assume it is a variable.
6de9cd9a 3661
30aabb86
PT
3662 This function is called by two interface functions:
3663 gfc_match_variable, which has host_flag = 1, and
3664 gfc_match_equiv_variable, with host_flag = 0, to restrict the
3665 match of the symbol to the local scope. */
3666
3667static match
edf1eac2 3668match_variable (gfc_expr **result, int equiv_flag, int host_flag)
6de9cd9a 3669{
f6288c24 3670 gfc_symbol *sym, *dt_sym;
6de9cd9a
DN
3671 gfc_symtree *st;
3672 gfc_expr *expr;
f6288c24 3673 locus where, old_loc;
6de9cd9a
DN
3674 match m;
3675
fd2aa7ad
PT
3676 /* Since nothing has any business being an lvalue in a module
3677 specification block, an interface block or a contains section,
3678 we force the changed_symbols mechanism to work by setting
3679 host_flag to 0. This prevents valid symbols that have the name
3680 of keywords, such as 'end', being turned into variables by
df2fba9e 3681 failed matching to assignments for, e.g., END INTERFACE. */
fd2aa7ad 3682 if (gfc_current_state () == COMP_MODULE
4668d6f9 3683 || gfc_current_state () == COMP_SUBMODULE
fd2aa7ad
PT
3684 || gfc_current_state () == COMP_INTERFACE
3685 || gfc_current_state () == COMP_CONTAINS)
3686 host_flag = 0;
3687
618f4f46 3688 where = gfc_current_locus;
30aabb86 3689 m = gfc_match_sym_tree (&st, host_flag);
6de9cd9a
DN
3690 if (m != MATCH_YES)
3691 return m;
6de9cd9a
DN
3692
3693 sym = st->n.sym;
9a3db5a3
PT
3694
3695 /* If this is an implicit do loop index and implicitly typed,
3696 it should not be host associated. */
3697 m = check_for_implicit_index (&st, &sym);
3698 if (m != MATCH_YES)
3699 return m;
3700
3701 sym->attr.implied_index = 0;
3702
6de9cd9a 3703 gfc_set_sym_referenced (sym);
f6288c24
FR
3704
3705 /* STRUCTUREs may share names with variables, but derived types may not. */
3706 if (sym->attr.flavor == FL_PROCEDURE && sym->generic
3707 && (dt_sym = gfc_find_dt_in_generic (sym)))
3708 {
3709 if (dt_sym->attr.flavor == FL_DERIVED)
2f029c08 3710 gfc_error ("Derived type %qs cannot be used as a variable at %C",
f6288c24
FR
3711 sym->name);
3712 return MATCH_ERROR;
3713 }
3714
6de9cd9a
DN
3715 switch (sym->attr.flavor)
3716 {
3717 case FL_VARIABLE:
8c91ab34 3718 /* Everything is alright. */
6de9cd9a
DN
3719 break;
3720
3721 case FL_UNKNOWN:
d7e2fcd0
TB
3722 {
3723 sym_flavor flavor = FL_UNKNOWN;
3724
3725 gfc_gobble_whitespace ();
3726
3727 if (sym->attr.external || sym->attr.procedure
3728 || sym->attr.function || sym->attr.subroutine)
3729 flavor = FL_PROCEDURE;
b9332b09
PT
3730
3731 /* If it is not a procedure, is not typed and is host associated,
3732 we cannot give it a flavor yet. */
3733 else if (sym->ns == gfc_current_ns->parent
3734 && sym->ts.type == BT_UNKNOWN)
3735 break;
3736
3737 /* These are definitive indicators that this is a variable. */
8fc541d3 3738 else if (gfc_peek_ascii_char () != '(' || sym->ts.type != BT_UNKNOWN
d7e2fcd0
TB
3739 || sym->attr.pointer || sym->as != NULL)
3740 flavor = FL_VARIABLE;
3741
3742 if (flavor != FL_UNKNOWN
524af0d6 3743 && !gfc_add_flavor (&sym->attr, flavor, sym->name, NULL))
d7e2fcd0
TB
3744 return MATCH_ERROR;
3745 }
6de9cd9a
DN
3746 break;
3747
5056a350
SK
3748 case FL_PARAMETER:
3749 if (equiv_flag)
8c91ab34
DK
3750 {
3751 gfc_error ("Named constant at %C in an EQUIVALENCE");
3752 return MATCH_ERROR;
3753 }
3754 /* Otherwise this is checked for and an error given in the
3755 variable definition context checks. */
5056a350
SK
3756 break;
3757
6de9cd9a 3758 case FL_PROCEDURE:
01d2a7d7
DF
3759 /* Check for a nonrecursive function result variable. */
3760 if (sym->attr.function
8c91ab34
DK
3761 && !sym->attr.external
3762 && sym->result == sym
3763 && (gfc_is_function_return_value (sym, gfc_current_ns)
3764 || (sym->attr.entry
3765 && sym->ns == gfc_current_ns)
3766 || (sym->attr.entry
3767 && sym->ns == gfc_current_ns->parent)))
6de9cd9a 3768 {
6de9cd9a
DN
3769 /* If a function result is a derived type, then the derived
3770 type may still have to be resolved. */
3771
3772 if (sym->ts.type == BT_DERIVED
bc21d315 3773 && gfc_use_derived (sym->ts.u.derived) == NULL)
6de9cd9a 3774 return MATCH_ERROR;
6de9cd9a
DN
3775 break;
3776 }
3777
3070bab4 3778 if (sym->attr.proc_pointer
524af0d6 3779 || replace_hidden_procptr_result (&sym, &st))
8fb74da4
JW
3780 break;
3781
6de9cd9a 3782 /* Fall through to error */
81fea426 3783 gcc_fallthrough ();
6de9cd9a
DN
3784
3785 default:
a4d9b221 3786 gfc_error ("%qs at %C is not a variable", sym->name);
6de9cd9a
DN
3787 return MATCH_ERROR;
3788 }
3789
0dd973dd
PB
3790 /* Special case for derived type variables that get their types
3791 via an IMPLICIT statement. This can't wait for the
3792 resolution phase. */
3793
3794 {
3795 gfc_namespace * implicit_ns;
3796
3797 if (gfc_current_ns->proc_name == sym)
3798 implicit_ns = gfc_current_ns;
3799 else
3800 implicit_ns = sym->ns;
5bab4c96 3801
f6288c24
FR
3802 old_loc = gfc_current_locus;
3803 if (gfc_match_member_sep (sym) == MATCH_YES
0dd973dd 3804 && sym->ts.type == BT_UNKNOWN
713485cc 3805 && gfc_get_default_type (sym->name, implicit_ns)->type == BT_DERIVED)
0dd973dd 3806 gfc_set_default_type (sym, 0, implicit_ns);
f6288c24 3807 gfc_current_locus = old_loc;
0dd973dd
PB
3808 }
3809
6de9cd9a
DN
3810 expr = gfc_get_expr ();
3811
3812 expr->expr_type = EXPR_VARIABLE;
3813 expr->symtree = st;
3814 expr->ts = sym->ts;
3815 expr->where = where;
3816
3817 /* Now see if we have to do more. */
713485cc 3818 m = gfc_match_varspec (expr, equiv_flag, false, false);
6de9cd9a
DN
3819 if (m != MATCH_YES)
3820 {
3821 gfc_free_expr (expr);
3822 return m;
3823 }
3824
3825 *result = expr;
3826 return MATCH_YES;
3827}
30aabb86 3828
edf1eac2 3829
30aabb86 3830match
edf1eac2 3831gfc_match_variable (gfc_expr **result, int equiv_flag)
30aabb86
PT
3832{
3833 return match_variable (result, equiv_flag, 1);
3834}
3835
edf1eac2 3836
30aabb86 3837match
edf1eac2 3838gfc_match_equiv_variable (gfc_expr **result)
30aabb86
PT
3839{
3840 return match_variable (result, 1, 0);
3841}
3842