]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/fortran/primary.c
re PR fortran/89363 (RANK incorrect for unallocated allocatable)
[thirdparty/gcc.git] / gcc / fortran / primary.c
CommitLineData
6de9cd9a 1/* Primary expression subroutines
a5544970 2 Copyright (C) 2000-2019 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 239 gfc_error ("Integer too big for its kind at %C. This check can be "
a3f9f006 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 1251 /* Give the matcher for implied do-loops a chance to run. This yields
a5fbc2f3 1252 a much saner error message for "write(*,*) (i, i=1, 6" where the
284ee475
SK
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 {
67914693 1573 gfc_error ("Namelist %qs cannot 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':
2eb3745a 1716 if (gfc_str_startswith (name, "loc"))
7fcafa71
PT
1717 {
1718 result->name = "%LOC";
1719 break;
1720 }
191816a3 1721 /* FALLTHRU */
7fcafa71 1722 case 'r':
2eb3745a 1723 if (gfc_str_startswith (name, "ref"))
7fcafa71
PT
1724 {
1725 result->name = "%REF";
1726 break;
1727 }
191816a3 1728 /* FALLTHRU */
7fcafa71 1729 case 'v':
2eb3745a 1730 if (gfc_str_startswith (name, "val"))
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
a5fbc2f3
PT
1939/* Used by gfc_match_varspec() to match an inquiry reference. */
1940
1941static bool
1942is_inquiry_ref (const char *name, gfc_ref **ref)
1943{
1944 inquiry_type type;
1945
1946 if (name == NULL)
1947 return false;
1948
1949 if (ref) *ref = NULL;
1950
1951 if (strcmp (name, "re") == 0)
1952 type = INQUIRY_RE;
1953 else if (strcmp (name, "im") == 0)
1954 type = INQUIRY_IM;
1955 else if (strcmp (name, "kind") == 0)
1956 type = INQUIRY_KIND;
1957 else if (strcmp (name, "len") == 0)
1958 type = INQUIRY_LEN;
1959 else
1960 return false;
1961
1962 if (ref)
1963 {
1964 *ref = gfc_get_ref ();
1965 (*ref)->type = REF_INQUIRY;
1966 (*ref)->u.i = type;
1967 }
1968
1969 return true;
1970}
1971
1972
6de9cd9a
DN
1973/* Match any additional specifications associated with the current
1974 variable like member references or substrings. If equiv_flag is
1975 set we only match stuff that is allowed inside an EQUIVALENCE
8e1f752a 1976 statement. sub_flag tells whether we expect a type-bound procedure found
713485cc
JW
1977 to be a subroutine as part of CALL or a FUNCTION. For procedure pointer
1978 components, 'ppc_arg' determines whether the PPC may be called (with an
1979 argument list), or whether it may just be referred to as a pointer. */
6de9cd9a 1980
8e1f752a 1981match
713485cc
JW
1982gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag,
1983 bool ppc_arg)
6de9cd9a
DN
1984{
1985 char name[GFC_MAX_SYMBOL_LEN + 1];
f6288c24 1986 gfc_ref *substring, *tail, *tmp;
6de9cd9a 1987 gfc_component *component;
a8006d09 1988 gfc_symbol *sym = primary->symtree->n.sym;
b89a63b9 1989 gfc_expr *tgt_expr = NULL;
6de9cd9a 1990 match m;
f2d3cb25 1991 bool unknown;
a5fbc2f3
PT
1992 bool inquiry;
1993 locus old_loc;
f6288c24 1994 char sep;
6de9cd9a
DN
1995
1996 tail = NULL;
1997
3c721513 1998 gfc_gobble_whitespace ();
d3a9eea2
TB
1999
2000 if (gfc_peek_ascii_char () == '[')
2001 {
c49ea23d
PT
2002 if ((sym->ts.type != BT_CLASS && sym->attr.dimension)
2003 || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
2004 && CLASS_DATA (sym)->attr.dimension))
d3a9eea2
TB
2005 {
2006 gfc_error ("Array section designator, e.g. '(:)', is required "
2007 "besides the coarray designator '[...]' at %C");
2008 return MATCH_ERROR;
2009 }
c49ea23d
PT
2010 if ((sym->ts.type != BT_CLASS && !sym->attr.codimension)
2011 || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
2012 && !CLASS_DATA (sym)->attr.codimension))
d3a9eea2 2013 {
a4d9b221 2014 gfc_error ("Coarray designator at %C but %qs is not a coarray",
d3a9eea2
TB
2015 sym->name);
2016 return MATCH_ERROR;
2017 }
2018 }
2019
b89a63b9
PT
2020 if (sym->assoc && sym->assoc->target)
2021 tgt_expr = sym->assoc->target;
2022
52bf62f9 2023 /* For associate names, we may not yet know whether they are arrays or not.
b125dc1e
PT
2024 If the selector expression is unambiguously an array; eg. a full array
2025 or an array section, then the associate name must be an array and we can
2026 fix it now. Otherwise, if parentheses follow and it is not a character
2027 type, we have to assume that it actually is one for now. The final
2028 decision will be made at resolution, of course. */
2029 if (sym->assoc
2030 && gfc_peek_ascii_char () == '('
2031 && sym->ts.type != BT_CLASS
2032 && !sym->attr.dimension)
2033 {
b89a63b9
PT
2034 gfc_ref *ref = NULL;
2035
2036 if (!sym->assoc->dangling && tgt_expr)
2037 {
2038 if (tgt_expr->expr_type == EXPR_VARIABLE)
2039 gfc_resolve_expr (tgt_expr);
2040
2041 ref = tgt_expr->ref;
2042 for (; ref; ref = ref->next)
2043 if (ref->type == REF_ARRAY
2044 && (ref->u.ar.type == AR_FULL
2045 || ref->u.ar.type == AR_SECTION))
2046 break;
2047 }
2048
2049 if (ref || (!(sym->assoc->dangling || sym->ts.type == BT_CHARACTER)
2050 && sym->assoc->st
2051 && sym->assoc->st->n.sym
2052 && sym->assoc->st->n.sym->attr.dimension == 0))
b125dc1e 2053 {
b89a63b9
PT
2054 sym->attr.dimension = 1;
2055 if (sym->as == NULL
b125dc1e
PT
2056 && sym->assoc->st
2057 && sym->assoc->st->n.sym
2058 && sym->assoc->st->n.sym->as)
2059 sym->as = gfc_copy_array_spec (sym->assoc->st->n.sym->as);
2060 }
2061 }
b89a63b9
PT
2062 else if (sym->ts.type == BT_CLASS
2063 && tgt_expr
2064 && tgt_expr->expr_type == EXPR_VARIABLE
2065 && sym->ts.u.derived != tgt_expr->ts.u.derived)
2066 {
2067 gfc_resolve_expr (tgt_expr);
2068 if (tgt_expr->rank)
2069 sym->ts.u.derived = tgt_expr->ts.u.derived;
2070 }
52bf62f9 2071
c74b74a8 2072 if ((equiv_flag && gfc_peek_ascii_char () == '(')
d3a9eea2 2073 || gfc_peek_ascii_char () == '[' || sym->attr.codimension
ce2ab24c 2074 || (sym->attr.dimension && sym->ts.type != BT_CLASS
2a573572 2075 && !sym->attr.proc_pointer && !gfc_is_proc_ptr_comp (primary)
f64edc8b 2076 && !(gfc_matching_procptr_assignment
cf2b3c22 2077 && sym->attr.flavor == FL_PROCEDURE))
22061030 2078 || (sym->ts.type == BT_CLASS && sym->attr.class_ok
492792ed
TB
2079 && (CLASS_DATA (sym)->attr.dimension
2080 || CLASS_DATA (sym)->attr.codimension)))
6de9cd9a 2081 {
102344e2
TB
2082 gfc_array_spec *as;
2083
2084 tail = extend_ref (primary, tail);
2085 tail->type = REF_ARRAY;
2086
a8006d09
JJ
2087 /* In EQUIVALENCE, we don't know yet whether we are seeing
2088 an array, character variable or array of character
edf1eac2 2089 variables. We'll leave the decision till resolve time. */
6de9cd9a 2090
102344e2
TB
2091 if (equiv_flag)
2092 as = NULL;
2093 else if (sym->ts.type == BT_CLASS && CLASS_DATA (sym))
2094 as = CLASS_DATA (sym)->as;
2095 else
2096 as = sym->as;
2097
2098 m = gfc_match_array_ref (&tail->u.ar, as, equiv_flag,
2099 as ? as->corank : 0);
6de9cd9a
DN
2100 if (m != MATCH_YES)
2101 return m;
a8006d09 2102
3c721513 2103 gfc_gobble_whitespace ();
8fc541d3 2104 if (equiv_flag && gfc_peek_ascii_char () == '(')
a8006d09
JJ
2105 {
2106 tail = extend_ref (primary, tail);
2107 tail->type = REF_ARRAY;
2108
d3a9eea2 2109 m = gfc_match_array_ref (&tail->u.ar, NULL, equiv_flag, 0);
a8006d09
JJ
2110 if (m != MATCH_YES)
2111 return m;
2112 }
6de9cd9a
DN
2113 }
2114
6de9cd9a
DN
2115 primary->ts = sym->ts;
2116
a8006d09
JJ
2117 if (equiv_flag)
2118 return MATCH_YES;
2119
f6288c24
FR
2120 /* With DEC extensions, member separator may be '.' or '%'. */
2121 sep = gfc_peek_ascii_char ();
2122 m = gfc_match_member_sep (sym);
2123 if (m == MATCH_ERROR)
2124 return MATCH_ERROR;
2125
a5fbc2f3
PT
2126 inquiry = false;
2127 if (m == MATCH_YES && sep == '%'
2128 && primary->ts.type != BT_CLASS
2129 && primary->ts.type != BT_DERIVED)
2130 {
2131 match mm;
2132 old_loc = gfc_current_locus;
2133 mm = gfc_match_name (name);
2134 if (mm == MATCH_YES && is_inquiry_ref (name, &tmp))
2135 inquiry = true;
2136 gfc_current_locus = old_loc;
2137 }
2138
f6288c24 2139 if (sym->ts.type == BT_UNKNOWN && m == MATCH_YES
713485cc 2140 && gfc_get_default_type (sym->name, sym->ns)->type == BT_DERIVED)
ebac6d9c
DK
2141 gfc_set_default_type (sym, 0, sym->ns);
2142
b89a63b9 2143 /* See if there is a usable typespec in the "no IMPLICIT type" error. */
f6288c24 2144 if (sym->ts.type == BT_UNKNOWN && m == MATCH_YES)
6ee65df3 2145 {
b89a63b9
PT
2146 bool permissible;
2147
a8399af8 2148 /* These target expressions can be resolved at any time. */
b89a63b9
PT
2149 permissible = tgt_expr && tgt_expr->symtree && tgt_expr->symtree->n.sym
2150 && (tgt_expr->symtree->n.sym->attr.use_assoc
2151 || tgt_expr->symtree->n.sym->attr.host_assoc
2152 || tgt_expr->symtree->n.sym->attr.if_source
2153 == IFSRC_DECL);
2154 permissible = permissible
2155 || (tgt_expr && tgt_expr->expr_type == EXPR_OP);
2156
2157 if (permissible)
62d3c075 2158 {
b89a63b9
PT
2159 gfc_resolve_expr (tgt_expr);
2160 sym->ts = tgt_expr->ts;
62d3c075
PT
2161 }
2162
2163 if (sym->ts.type == BT_UNKNOWN)
2164 {
2165 gfc_error ("Symbol %qs at %C has no IMPLICIT type", sym->name);
2166 return MATCH_ERROR;
2167 }
6ee65df3
TB
2168 }
2169 else if ((sym->ts.type != BT_DERIVED && sym->ts.type != BT_CLASS)
a5fbc2f3 2170 && m == MATCH_YES && !inquiry)
6ee65df3 2171 {
f6288c24
FR
2172 gfc_error ("Unexpected %<%c%> for nonderived-type variable %qs at %C",
2173 sep, sym->name);
6ee65df3
TB
2174 return MATCH_ERROR;
2175 }
2176
a5fbc2f3 2177 if ((sym->ts.type != BT_DERIVED && sym->ts.type != BT_CLASS && !inquiry)
f6288c24 2178 || m != MATCH_YES)
6de9cd9a
DN
2179 goto check_substring;
2180
a5fbc2f3
PT
2181 if (!inquiry)
2182 sym = sym->ts.u.derived;
2183 else
2184 sym = NULL;
6de9cd9a
DN
2185
2186 for (;;)
2187 {
524af0d6 2188 bool t;
e157f736 2189 gfc_symtree *tbp;
8e1f752a 2190
6de9cd9a
DN
2191 m = gfc_match_name (name);
2192 if (m == MATCH_NO)
2193 gfc_error ("Expected structure component name at %C");
2194 if (m != MATCH_YES)
2195 return MATCH_ERROR;
2196
a5fbc2f3
PT
2197 if (primary->ts.type != BT_CLASS && primary->ts.type != BT_DERIVED)
2198 {
2199 inquiry = is_inquiry_ref (name, &tmp);
2200 if (inquiry)
2201 sym = NULL;
2202 }
2203 else
2204 inquiry = false;
2205
d5c50b02 2206 if (sym && sym->f2k_derived)
b2acf594
PT
2207 tbp = gfc_find_typebound_proc (sym, &t, name, false, &gfc_current_locus);
2208 else
2209 tbp = NULL;
2210
8e1f752a
DK
2211 if (tbp)
2212 {
2213 gfc_symbol* tbp_sym;
2214
524af0d6 2215 if (!t)
8e1f752a
DK
2216 return MATCH_ERROR;
2217
2218 gcc_assert (!tail || !tail->next);
236e3815
JW
2219
2220 if (!(primary->expr_type == EXPR_VARIABLE
2221 || (primary->expr_type == EXPR_STRUCTURE
2222 && primary->symtree && primary->symtree->n.sym
2223 && primary->symtree->n.sym->attr.flavor)))
2224 return MATCH_ERROR;
8e1f752a 2225
e34ccb4c 2226 if (tbp->n.tb->is_generic)
e157f736
DK
2227 tbp_sym = NULL;
2228 else
e34ccb4c 2229 tbp_sym = tbp->n.tb->u.specific->n.sym;
8e1f752a
DK
2230
2231 primary->expr_type = EXPR_COMPCALL;
e34ccb4c 2232 primary->value.compcall.tbp = tbp->n.tb;
e157f736 2233 primary->value.compcall.name = tbp->name;
4a44a72d
DK
2234 primary->value.compcall.ignore_pass = 0;
2235 primary->value.compcall.assign = 0;
2236 primary->value.compcall.base_object = NULL;
e157f736
DK
2237 gcc_assert (primary->symtree->n.sym->attr.referenced);
2238 if (tbp_sym)
2239 primary->ts = tbp_sym->ts;
049bb74e
JW
2240 else
2241 gfc_clear_ts (&primary->ts);
e157f736 2242
e34ccb4c 2243 m = gfc_match_actual_arglist (tbp->n.tb->subroutine,
8e1f752a
DK
2244 &primary->value.compcall.actual);
2245 if (m == MATCH_ERROR)
2246 return MATCH_ERROR;
2247 if (m == MATCH_NO)
2248 {
2249 if (sub_flag)
2250 primary->value.compcall.actual = NULL;
2251 else
2252 {
2253 gfc_error ("Expected argument list at %C");
2254 return MATCH_ERROR;
2255 }
2256 }
2257
8e1f752a
DK
2258 break;
2259 }
2260
a5fbc2f3
PT
2261 if (!inquiry)
2262 component = gfc_find_component (sym, name, false, false, &tmp);
2263 else
2264 component = NULL;
2265
2266 if (component == NULL && !inquiry)
6de9cd9a
DN
2267 return MATCH_ERROR;
2268
a5fbc2f3
PT
2269 /* Extend the reference chain determined by gfc_find_component or
2270 is_inquiry_ref. */
f6288c24 2271 if (primary->ref == NULL)
a5fbc2f3 2272 primary->ref = tmp;
f6288c24 2273 else
a5fbc2f3
PT
2274 {
2275 /* Set by the for loop below for the last component ref. */
2276 gcc_assert (tail != NULL);
2277 tail->next = tmp;
2278 }
6de9cd9a 2279
f6288c24 2280 /* The reference chain may be longer than one hop for union
a5fbc2f3 2281 subcomponents; find the new tail. */
f6288c24 2282 for (tail = tmp; tail->next; tail = tail->next)
a5fbc2f3
PT
2283 ;
2284
2285 if (tmp && tmp->type == REF_INQUIRY)
2286 {
2287 gfc_simplify_expr (primary, 0);
2288
2289 if (primary->expr_type == EXPR_CONSTANT)
2290 goto check_done;
2291
2292 switch (tmp->u.i)
2293 {
2294 case INQUIRY_RE:
2295 case INQUIRY_IM:
2296 if (!gfc_notify_std (GFC_STD_F2008, "RE or IM part_ref at %C"))
2297 return MATCH_ERROR;
2298
2299 if (primary->ts.type != BT_COMPLEX)
2300 {
2301 gfc_error ("The RE or IM part_ref at %C must be "
2302 "applied to a COMPLEX expression");
2303 return MATCH_ERROR;
2304 }
2305 primary->ts.type = BT_REAL;
2306 break;
2307
2308 case INQUIRY_LEN:
2309 if (!gfc_notify_std (GFC_STD_F2003, "LEN part_ref at %C"))
2310 return MATCH_ERROR;
2311
2312 if (primary->ts.type != BT_CHARACTER)
2313 {
2314 gfc_error ("The LEN part_ref at %C must be applied "
2315 "to a CHARACTER expression");
2316 return MATCH_ERROR;
2317 }
2318 primary->ts.u.cl = NULL;
2319 primary->ts.type = BT_INTEGER;
2320 primary->ts.kind = gfc_default_integer_kind;
2321 break;
2322
2323 case INQUIRY_KIND:
2324 if (!gfc_notify_std (GFC_STD_F2003, "KIND part_ref at %C"))
2325 return MATCH_ERROR;
2326
2327 if (primary->ts.type == BT_CLASS
2328 || primary->ts.type == BT_DERIVED)
2329 {
2330 gfc_error ("The KIND part_ref at %C must be applied "
2331 "to an expression of intrinsic type");
2332 return MATCH_ERROR;
2333 }
2334 primary->ts.type = BT_INTEGER;
2335 primary->ts.kind = gfc_default_integer_kind;
2336 break;
2337
2338 default:
2339 gcc_unreachable ();
2340 }
2341
2342 goto check_done;
2343 }
6de9cd9a
DN
2344
2345 primary->ts = component->ts;
2346
a4a76e52 2347 if (component->attr.proc_pointer && ppc_arg)
713485cc 2348 {
837c4b78 2349 /* Procedure pointer component call: Look for argument list. */
23878536 2350 m = gfc_match_actual_arglist (sub_flag,
713485cc
JW
2351 &primary->value.compcall.actual);
2352 if (m == MATCH_ERROR)
2353 return MATCH_ERROR;
837c4b78
JW
2354
2355 if (m == MATCH_NO && !gfc_matching_ptr_assignment
a4a76e52 2356 && !gfc_matching_procptr_assignment && !matching_actual_arglist)
837c4b78 2357 {
a4d9b221 2358 gfc_error ("Procedure pointer component %qs requires an "
837c4b78
JW
2359 "argument list at %C", component->name);
2360 return MATCH_ERROR;
2361 }
2362
23878536
JW
2363 if (m == MATCH_YES)
2364 primary->expr_type = EXPR_PPC;
713485cc
JW
2365
2366 break;
2367 }
2368
c74b74a8 2369 if (component->as != NULL && !component->attr.proc_pointer)
6de9cd9a
DN
2370 {
2371 tail = extend_ref (primary, tail);
2372 tail->type = REF_ARRAY;
2373
d3a9eea2
TB
2374 m = gfc_match_array_ref (&tail->u.ar, component->as, equiv_flag,
2375 component->as->corank);
6de9cd9a
DN
2376 if (m != MATCH_YES)
2377 return m;
2378 }
156c0160
JW
2379 else if (component->ts.type == BT_CLASS && component->attr.class_ok
2380 && CLASS_DATA (component)->as && !component->attr.proc_pointer)
cf2b3c22
TB
2381 {
2382 tail = extend_ref (primary, tail);
2383 tail->type = REF_ARRAY;
6de9cd9a 2384
7a08eda1 2385 m = gfc_match_array_ref (&tail->u.ar, CLASS_DATA (component)->as,
d3a9eea2 2386 equiv_flag,
7a08eda1 2387 CLASS_DATA (component)->as->corank);
cf2b3c22
TB
2388 if (m != MATCH_YES)
2389 return m;
2390 }
2391
a5fbc2f3
PT
2392check_done:
2393 /* In principle, we could have eg. expr%re%kind so we must allow for
2394 this possibility. */
2395 if (gfc_match_char ('%') == MATCH_YES)
2396 {
2397 if (component && (component->ts.type == BT_DERIVED
2398 || component->ts.type == BT_CLASS))
2399 sym = component->ts.u.derived;
2400 continue;
2401 }
2402 else if (inquiry)
2403 break;
2404
cf2b3c22 2405 if ((component->ts.type != BT_DERIVED && component->ts.type != BT_CLASS)
a5fbc2f3 2406 || gfc_match_member_sep (component->ts.u.derived) != MATCH_YES)
6de9cd9a
DN
2407 break;
2408
a5fbc2f3
PT
2409 if (component->ts.type == BT_DERIVED || component->ts.type == BT_CLASS)
2410 sym = component->ts.u.derived;
6de9cd9a
DN
2411 }
2412
2413check_substring:
f2d3cb25 2414 unknown = false;
f6288c24 2415 if (primary->ts.type == BT_UNKNOWN && !gfc_fl_struct (sym->attr.flavor))
c040ffff 2416 {
713485cc 2417 if (gfc_get_default_type (sym->name, sym->ns)->type == BT_CHARACTER)
c040ffff 2418 {
edf1eac2
SK
2419 gfc_set_default_type (sym, 0, sym->ns);
2420 primary->ts = sym->ts;
f2d3cb25 2421 unknown = true;
c040ffff
TS
2422 }
2423 }
2424
6de9cd9a
DN
2425 if (primary->ts.type == BT_CHARACTER)
2426 {
38217d3e
PT
2427 bool def = primary->ts.deferred == 1;
2428 switch (match_substring (primary->ts.u.cl, equiv_flag, &substring, def))
6de9cd9a
DN
2429 {
2430 case MATCH_YES:
2431 if (tail == NULL)
2432 primary->ref = substring;
2433 else
2434 tail->next = substring;
2435
2436 if (primary->expr_type == EXPR_CONSTANT)
2437 primary->expr_type = EXPR_SUBSTRING;
2438
860c8f3b 2439 if (substring)
bc21d315 2440 primary->ts.u.cl = NULL;
860c8f3b 2441
6de9cd9a
DN
2442 break;
2443
2444 case MATCH_NO:
f2d3cb25 2445 if (unknown)
858f1fa2
DK
2446 {
2447 gfc_clear_ts (&primary->ts);
2448 gfc_clear_ts (&sym->ts);
2449 }
6de9cd9a
DN
2450 break;
2451
2452 case MATCH_ERROR:
2453 return MATCH_ERROR;
2454 }
2455 }
2456
4ceda204
JW
2457 /* F08:C611. */
2458 if (primary->ts.type == BT_DERIVED && primary->ref
2459 && primary->ts.u.derived && primary->ts.u.derived->attr.abstract)
2460 {
2461 gfc_error ("Nonpolymorphic reference to abstract type at %C");
2462 return MATCH_ERROR;
2463 }
2464
2465 /* F08:C727. */
d3a9eea2
TB
2466 if (primary->expr_type == EXPR_PPC && gfc_is_coindexed (primary))
2467 {
2468 gfc_error ("Coindexed procedure-pointer component at %C");
2469 return MATCH_ERROR;
2470 }
2471
6de9cd9a
DN
2472 return MATCH_YES;
2473}
2474
2475
2476/* Given an expression that is a variable, figure out what the
2477 ultimate variable's type and attribute is, traversing the reference
2478 structures if necessary.
2479
2480 This subroutine is trickier than it looks. We start at the base
2481 symbol and store the attribute. Component references load a
2482 completely new attribute.
2483
2484 A couple of rules come into play. Subobjects of targets are always
2485 targets themselves. If we see a component that goes through a
2486 pointer, then the expression must also be a target, since the
2487 pointer is associated with something (if it isn't core will soon be
2488 dumped). If we see a full part or section of an array, the
2489 expression is also an array.
2490
f7b529fa 2491 We can have at most one full array reference. */
6de9cd9a
DN
2492
2493symbol_attribute
edf1eac2 2494gfc_variable_attr (gfc_expr *expr, gfc_typespec *ts)
6de9cd9a 2495{
16acb1a8 2496 int dimension, codimension, pointer, allocatable, target;
6de9cd9a
DN
2497 symbol_attribute attr;
2498 gfc_ref *ref;
cf2b3c22
TB
2499 gfc_symbol *sym;
2500 gfc_component *comp;
a5fbc2f3 2501 bool has_inquiry_part;
6de9cd9a 2502
50dbf0b4 2503 if (expr->expr_type != EXPR_VARIABLE && expr->expr_type != EXPR_FUNCTION)
6de9cd9a
DN
2504 gfc_internal_error ("gfc_variable_attr(): Expression isn't a variable");
2505
cf2b3c22
TB
2506 sym = expr->symtree->n.sym;
2507 attr = sym->attr;
6de9cd9a 2508
528622fd 2509 if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
cf2b3c22 2510 {
7a08eda1 2511 dimension = CLASS_DATA (sym)->attr.dimension;
83ba23b7 2512 codimension = CLASS_DATA (sym)->attr.codimension;
d40477b4 2513 pointer = CLASS_DATA (sym)->attr.class_pointer;
7a08eda1 2514 allocatable = CLASS_DATA (sym)->attr.allocatable;
cf2b3c22
TB
2515 }
2516 else
2517 {
2518 dimension = attr.dimension;
83ba23b7 2519 codimension = attr.codimension;
cf2b3c22
TB
2520 pointer = attr.pointer;
2521 allocatable = attr.allocatable;
2522 }
6de9cd9a
DN
2523
2524 target = attr.target;
713485cc 2525 if (pointer || attr.proc_pointer)
6de9cd9a
DN
2526 target = 1;
2527
2528 if (ts != NULL && expr->ts.type == BT_UNKNOWN)
cf2b3c22 2529 *ts = sym->ts;
6de9cd9a 2530
a5fbc2f3
PT
2531 has_inquiry_part = false;
2532 for (ref = expr->ref; ref; ref = ref->next)
2533 if (ref->type == REF_INQUIRY)
2534 {
2535 has_inquiry_part = true;
2536 break;
2537 }
2538
8c91ab34 2539 for (ref = expr->ref; ref; ref = ref->next)
6de9cd9a
DN
2540 switch (ref->type)
2541 {
2542 case REF_ARRAY:
2543
2544 switch (ref->u.ar.type)
2545 {
2546 case AR_FULL:
2547 dimension = 1;
2548 break;
2549
2550 case AR_SECTION:
5046aff5 2551 allocatable = pointer = 0;
6de9cd9a
DN
2552 dimension = 1;
2553 break;
2554
2555 case AR_ELEMENT:
d3a9eea2
TB
2556 /* Handle coarrays. */
2557 if (ref->u.ar.dimen > 0)
2558 allocatable = pointer = 0;
6de9cd9a
DN
2559 break;
2560
2561 case AR_UNKNOWN:
bf1b77dd
PT
2562 /* If any of start, end or stride is not integer, there will
2563 already have been an error issued. */
16acb1a8
DH
2564 int errors;
2565 gfc_get_errors (NULL, &errors);
2566 if (errors == 0)
bf1b77dd 2567 gfc_internal_error ("gfc_variable_attr(): Bad array reference");
6de9cd9a
DN
2568 }
2569
2570 break;
2571
2572 case REF_COMPONENT:
cf2b3c22
TB
2573 comp = ref->u.c.component;
2574 attr = comp->attr;
a5fbc2f3 2575 if (ts != NULL && !has_inquiry_part)
e8a25349 2576 {
cf2b3c22 2577 *ts = comp->ts;
e8a25349
TS
2578 /* Don't set the string length if a substring reference
2579 follows. */
2580 if (ts->type == BT_CHARACTER
2581 && ref->next && ref->next->type == REF_SUBSTRING)
bc21d315 2582 ts->u.cl = NULL;
e8a25349 2583 }
6de9cd9a 2584
cf2b3c22
TB
2585 if (comp->ts.type == BT_CLASS)
2586 {
83ba23b7 2587 codimension = CLASS_DATA (comp)->attr.codimension;
d40477b4 2588 pointer = CLASS_DATA (comp)->attr.class_pointer;
7a08eda1 2589 allocatable = CLASS_DATA (comp)->attr.allocatable;
cf2b3c22
TB
2590 }
2591 else
2592 {
83ba23b7 2593 codimension = comp->attr.codimension;
cf2b3c22
TB
2594 pointer = comp->attr.pointer;
2595 allocatable = comp->attr.allocatable;
2596 }
713485cc 2597 if (pointer || attr.proc_pointer)
6de9cd9a
DN
2598 target = 1;
2599
2600 break;
2601
a5fbc2f3 2602 case REF_INQUIRY:
6de9cd9a 2603 case REF_SUBSTRING:
5046aff5 2604 allocatable = pointer = 0;
6de9cd9a
DN
2605 break;
2606 }
2607
2608 attr.dimension = dimension;
83ba23b7 2609 attr.codimension = codimension;
6de9cd9a 2610 attr.pointer = pointer;
5046aff5 2611 attr.allocatable = allocatable;
6de9cd9a 2612 attr.target = target;
80f95228 2613 attr.save = sym->attr.save;
6de9cd9a
DN
2614
2615 return attr;
2616}
2617
2618
2619/* Return the attribute from a general expression. */
2620
2621symbol_attribute
edf1eac2 2622gfc_expr_attr (gfc_expr *e)
6de9cd9a
DN
2623{
2624 symbol_attribute attr;
2625
2626 switch (e->expr_type)
2627 {
2628 case EXPR_VARIABLE:
2629 attr = gfc_variable_attr (e, NULL);
2630 break;
2631
2632 case EXPR_FUNCTION:
2633 gfc_clear_attr (&attr);
2634
50c7654b 2635 if (e->value.function.esym && e->value.function.esym->result)
cf2b3c22
TB
2636 {
2637 gfc_symbol *sym = e->value.function.esym->result;
2638 attr = sym->attr;
2639 if (sym->ts.type == BT_CLASS)
2640 {
7a08eda1 2641 attr.dimension = CLASS_DATA (sym)->attr.dimension;
d40477b4 2642 attr.pointer = CLASS_DATA (sym)->attr.class_pointer;
7a08eda1 2643 attr.allocatable = CLASS_DATA (sym)->attr.allocatable;
cf2b3c22
TB
2644 }
2645 }
574284e9
AV
2646 else if (e->value.function.isym
2647 && e->value.function.isym->transformational
2648 && e->ts.type == BT_CLASS)
2649 attr = CLASS_DATA (e)->attr;
50dbf0b4
JW
2650 else
2651 attr = gfc_variable_attr (e, NULL);
6de9cd9a
DN
2652
2653 /* TODO: NULL() returns pointers. May have to take care of this
edf1eac2 2654 here. */
6de9cd9a
DN
2655
2656 break;
2657
2658 default:
3c9f5092
AV
2659 gfc_clear_attr (&attr);
2660 break;
2661 }
2662
2663 return attr;
2664}
2665
2666
2667/* Given an expression, figure out what the ultimate expression
2668 attribute is. This routine is similar to gfc_variable_attr with
2669 parts of gfc_expr_attr, but focuses more on the needs of
2670 coarrays. For coarrays a codimension attribute is kind of
ba85c8c3
AV
2671 "infectious" being propagated once set and never cleared.
2672 The coarray_comp is only set, when the expression refs a coarray
2673 component. REFS_COMP is set when present to true only, when this EXPR
2674 refs a (non-_data) component. To check whether EXPR refs an allocatable
2675 component in a derived type coarray *refs_comp needs to be set and
2676 coarray_comp has to false. */
3c9f5092
AV
2677
2678static symbol_attribute
ba85c8c3 2679caf_variable_attr (gfc_expr *expr, bool in_allocate, bool *refs_comp)
3c9f5092 2680{
de91486c 2681 int dimension, codimension, pointer, allocatable, target, coarray_comp;
3c9f5092
AV
2682 symbol_attribute attr;
2683 gfc_ref *ref;
2684 gfc_symbol *sym;
2685 gfc_component *comp;
2686
2687 if (expr->expr_type != EXPR_VARIABLE && expr->expr_type != EXPR_FUNCTION)
2688 gfc_internal_error ("gfc_caf_attr(): Expression isn't a variable");
2689
2690 sym = expr->symtree->n.sym;
2691 gfc_clear_attr (&attr);
2692
ba85c8c3 2693 if (refs_comp)
525a5e33 2694 *refs_comp = false;
ba85c8c3 2695
3c9f5092
AV
2696 if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
2697 {
2698 dimension = CLASS_DATA (sym)->attr.dimension;
2699 codimension = CLASS_DATA (sym)->attr.codimension;
2700 pointer = CLASS_DATA (sym)->attr.class_pointer;
2701 allocatable = CLASS_DATA (sym)->attr.allocatable;
de91486c
AV
2702 attr.alloc_comp = CLASS_DATA (sym)->ts.u.derived->attr.alloc_comp;
2703 attr.pointer_comp = CLASS_DATA (sym)->ts.u.derived->attr.pointer_comp;
3c9f5092
AV
2704 }
2705 else
2706 {
2707 dimension = sym->attr.dimension;
2708 codimension = sym->attr.codimension;
2709 pointer = sym->attr.pointer;
2710 allocatable = sym->attr.allocatable;
de91486c 2711 attr.alloc_comp = sym->ts.type == BT_DERIVED
3c9f5092 2712 ? sym->ts.u.derived->attr.alloc_comp : 0;
de91486c
AV
2713 attr.pointer_comp = sym->ts.type == BT_DERIVED
2714 ? sym->ts.u.derived->attr.pointer_comp : 0;
3c9f5092
AV
2715 }
2716
ba85c8c3 2717 target = coarray_comp = 0;
3c9f5092
AV
2718 if (pointer || attr.proc_pointer)
2719 target = 1;
2720
2721 for (ref = expr->ref; ref; ref = ref->next)
2722 switch (ref->type)
2723 {
2724 case REF_ARRAY:
2725
2726 switch (ref->u.ar.type)
2727 {
2728 case AR_FULL:
2729 case AR_SECTION:
2730 dimension = 1;
2731 break;
2732
2733 case AR_ELEMENT:
2734 /* Handle coarrays. */
2735 if (ref->u.ar.dimen > 0 && !in_allocate)
2736 allocatable = pointer = 0;
2737 break;
2738
2739 case AR_UNKNOWN:
2740 /* If any of start, end or stride is not integer, there will
2741 already have been an error issued. */
2742 int errors;
2743 gfc_get_errors (NULL, &errors);
2744 if (errors == 0)
2745 gfc_internal_error ("gfc_caf_attr(): Bad array reference");
2746 }
2747
2748 break;
2749
2750 case REF_COMPONENT:
2751 comp = ref->u.c.component;
2752
2753 if (comp->ts.type == BT_CLASS)
2754 {
ba85c8c3
AV
2755 /* Set coarray_comp only, when this component introduces the
2756 coarray. */
2757 coarray_comp = !codimension && CLASS_DATA (comp)->attr.codimension;
3c9f5092
AV
2758 codimension |= CLASS_DATA (comp)->attr.codimension;
2759 pointer = CLASS_DATA (comp)->attr.class_pointer;
2760 allocatable = CLASS_DATA (comp)->attr.allocatable;
3c9f5092
AV
2761 }
2762 else
2763 {
ba85c8c3
AV
2764 /* Set coarray_comp only, when this component introduces the
2765 coarray. */
2766 coarray_comp = !codimension && comp->attr.codimension;
3c9f5092
AV
2767 codimension |= comp->attr.codimension;
2768 pointer = comp->attr.pointer;
2769 allocatable = comp->attr.allocatable;
3c9f5092
AV
2770 }
2771
525a5e33
AV
2772 if (refs_comp && strcmp (comp->name, "_data") != 0
2773 && (ref->next == NULL
2774 || (ref->next->type == REF_ARRAY && ref->next->next == NULL)))
2775 *refs_comp = true;
ba85c8c3 2776
3c9f5092
AV
2777 if (pointer || attr.proc_pointer)
2778 target = 1;
2779
2780 break;
2781
2782 case REF_SUBSTRING:
a5fbc2f3 2783 case REF_INQUIRY:
3c9f5092
AV
2784 allocatable = pointer = 0;
2785 break;
2786 }
2787
2788 attr.dimension = dimension;
2789 attr.codimension = codimension;
2790 attr.pointer = pointer;
2791 attr.allocatable = allocatable;
2792 attr.target = target;
2793 attr.save = sym->attr.save;
2794 attr.coarray_comp = coarray_comp;
3c9f5092
AV
2795
2796 return attr;
2797}
2798
2799
2800symbol_attribute
ba85c8c3 2801gfc_caf_attr (gfc_expr *e, bool in_allocate, bool *refs_comp)
3c9f5092
AV
2802{
2803 symbol_attribute attr;
2804
2805 switch (e->expr_type)
2806 {
2807 case EXPR_VARIABLE:
ba85c8c3 2808 attr = caf_variable_attr (e, in_allocate, refs_comp);
3c9f5092
AV
2809 break;
2810
2811 case EXPR_FUNCTION:
2812 gfc_clear_attr (&attr);
2813
2814 if (e->value.function.esym && e->value.function.esym->result)
2815 {
2816 gfc_symbol *sym = e->value.function.esym->result;
2817 attr = sym->attr;
2818 if (sym->ts.type == BT_CLASS)
2819 {
2820 attr.dimension = CLASS_DATA (sym)->attr.dimension;
2821 attr.pointer = CLASS_DATA (sym)->attr.class_pointer;
2822 attr.allocatable = CLASS_DATA (sym)->attr.allocatable;
2823 attr.alloc_comp = CLASS_DATA (sym)->ts.u.derived->attr.alloc_comp;
de91486c
AV
2824 attr.pointer_comp = CLASS_DATA (sym)->ts.u.derived
2825 ->attr.pointer_comp;
3c9f5092
AV
2826 }
2827 }
2828 else if (e->symtree)
ba85c8c3 2829 attr = caf_variable_attr (e, in_allocate, refs_comp);
3c9f5092
AV
2830 else
2831 gfc_clear_attr (&attr);
2832 break;
2833
2834 default:
6de9cd9a
DN
2835 gfc_clear_attr (&attr);
2836 break;
2837 }
2838
2839 return attr;
2840}
2841
2842
2843/* Match a structure constructor. The initial symbol has already been
2844 seen. */
2845
fa9290d3
DK
2846typedef struct gfc_structure_ctor_component
2847{
2848 char* name;
2849 gfc_expr* val;
2850 locus where;
2851 struct gfc_structure_ctor_component* next;
2852}
2853gfc_structure_ctor_component;
2854
ece3f663 2855#define gfc_get_structure_ctor_component() XCNEW (gfc_structure_ctor_component)
fa9290d3
DK
2856
2857static void
2858gfc_free_structure_ctor_component (gfc_structure_ctor_component *comp)
2859{
cede9502 2860 free (comp->name);
fa9290d3 2861 gfc_free_expr (comp->val);
cede9502 2862 free (comp);
fa9290d3
DK
2863}
2864
7d1f1e61
PT
2865
2866/* Translate the component list into the actual constructor by sorting it in
2867 the order required; this also checks along the way that each and every
2868 component actually has an initializer and handles default initializers
2869 for components without explicit value given. */
524af0d6 2870static bool
7d1f1e61 2871build_actual_constructor (gfc_structure_ctor_component **comp_head,
b7e75771 2872 gfc_constructor_base *ctor_head, gfc_symbol *sym)
6de9cd9a 2873{
fa9290d3 2874 gfc_structure_ctor_component *comp_iter;
7d1f1e61
PT
2875 gfc_component *comp;
2876
2877 for (comp = sym->components; comp; comp = comp->next)
2878 {
2879 gfc_structure_ctor_component **next_ptr;
2880 gfc_expr *value = NULL;
2881
2882 /* Try to find the initializer for the current component by name. */
2883 next_ptr = comp_head;
2884 for (comp_iter = *comp_head; comp_iter; comp_iter = comp_iter->next)
2885 {
2886 if (!strcmp (comp_iter->name, comp->name))
2887 break;
2888 next_ptr = &comp_iter->next;
2889 }
2890
2891 /* If an extension, try building the parent derived type by building
2892 a value expression for the parent derived type and calling self. */
2893 if (!comp_iter && comp == sym->components && sym->attr.extension)
2894 {
b7e75771
JD
2895 value = gfc_get_structure_constructor_expr (comp->ts.type,
2896 comp->ts.kind,
2897 &gfc_current_locus);
7d1f1e61 2898 value->ts = comp->ts;
7d1f1e61 2899
bf1b77dd
PT
2900 if (!build_actual_constructor (comp_head,
2901 &value->value.constructor,
524af0d6 2902 comp->ts.u.derived))
7d1f1e61
PT
2903 {
2904 gfc_free_expr (value);
524af0d6 2905 return false;
7d1f1e61 2906 }
b7e75771
JD
2907
2908 gfc_constructor_append_expr (ctor_head, value, NULL);
7d1f1e61
PT
2909 continue;
2910 }
2911
2912 /* If it was not found, try the default initializer if there's any;
2b3dc0db 2913 otherwise, it's an error unless this is a deferred parameter. */
7d1f1e61
PT
2914 if (!comp_iter)
2915 {
2916 if (comp->initializer)
2917 {
524af0d6
JB
2918 if (!gfc_notify_std (GFC_STD_F2003, "Structure constructor "
2919 "with missing optional arguments at %C"))
2920 return false;
7d1f1e61
PT
2921 value = gfc_copy_expr (comp->initializer);
2922 }
9b548517
AV
2923 else if (comp->attr.allocatable
2924 || (comp->ts.type == BT_CLASS
2925 && CLASS_DATA (comp)->attr.allocatable))
7430df97
JW
2926 {
2927 if (!gfc_notify_std (GFC_STD_F2008, "No initializer for "
2f029c08 2928 "allocatable component %qs given in the "
9b548517 2929 "structure constructor at %C", comp->name))
7430df97
JW
2930 return false;
2931 }
9b548517 2932 else if (!comp->attr.artificial)
7d1f1e61 2933 {
a4d9b221 2934 gfc_error ("No initializer for component %qs given in the"
546c8974 2935 " structure constructor at %C", comp->name);
524af0d6 2936 return false;
7d1f1e61
PT
2937 }
2938 }
2939 else
2940 value = comp_iter->val;
2941
2942 /* Add the value to the constructor chain built. */
b7e75771 2943 gfc_constructor_append_expr (ctor_head, value, NULL);
7d1f1e61
PT
2944
2945 /* Remove the entry from the component list. We don't want the expression
2946 value to be free'd, so set it to NULL. */
2947 if (comp_iter)
2948 {
2949 *next_ptr = comp_iter->next;
2950 comp_iter->val = NULL;
2951 gfc_free_structure_ctor_component (comp_iter);
2952 }
2953 }
524af0d6 2954 return true;
7d1f1e61
PT
2955}
2956
c3f34952 2957
524af0d6 2958bool
c3f34952
TB
2959gfc_convert_to_structure_constructor (gfc_expr *e, gfc_symbol *sym, gfc_expr **cexpr,
2960 gfc_actual_arglist **arglist,
2961 bool parent)
7d1f1e61 2962{
c3f34952 2963 gfc_actual_arglist *actual;
7d1f1e61 2964 gfc_structure_ctor_component *comp_tail, *comp_head, *comp_iter;
b7e75771 2965 gfc_constructor_base ctor_head = NULL;
fa9290d3 2966 gfc_component *comp; /* Is set NULL when named component is first seen */
fa9290d3 2967 const char* last_name = NULL;
c3f34952
TB
2968 locus old_locus;
2969 gfc_expr *expr;
6de9cd9a 2970
c3f34952
TB
2971 expr = parent ? *cexpr : e;
2972 old_locus = gfc_current_locus;
2973 if (parent)
2974 ; /* gfc_current_locus = *arglist->expr ? ->where;*/
2975 else
2976 gfc_current_locus = expr->where;
6de9cd9a 2977
c3f34952 2978 comp_tail = comp_head = NULL;
6de9cd9a 2979
52f49934
DK
2980 if (!parent && sym->attr.abstract)
2981 {
a4d9b221 2982 gfc_error ("Can't construct ABSTRACT type %qs at %L",
c3f34952
TB
2983 sym->name, &expr->where);
2984 goto cleanup;
52f49934
DK
2985 }
2986
c3f34952
TB
2987 comp = sym->components;
2988 actual = parent ? *arglist : expr->value.function.actual;
2989 for ( ; actual; )
6de9cd9a 2990 {
c3f34952 2991 gfc_component *this_comp = NULL;
6de9cd9a 2992
c3f34952
TB
2993 if (!comp_head)
2994 comp_tail = comp_head = gfc_get_structure_ctor_component ();
2995 else
2996 {
2997 comp_tail->next = gfc_get_structure_ctor_component ();
2998 comp_tail = comp_tail->next;
2999 }
3000 if (actual->name)
3001 {
524af0d6
JB
3002 if (!gfc_notify_std (GFC_STD_F2003, "Structure"
3003 " constructor with named arguments at %C"))
c3f34952 3004 goto cleanup;
6de9cd9a 3005
c3f34952
TB
3006 comp_tail->name = xstrdup (actual->name);
3007 last_name = comp_tail->name;
3008 comp = NULL;
3009 }
3010 else
3011 {
3012 /* Components without name are not allowed after the first named
3013 component initializer! */
9b548517 3014 if (!comp || comp->attr.artificial)
fa9290d3 3015 {
c3f34952
TB
3016 if (last_name)
3017 gfc_error ("Component initializer without name after component"
546c8974 3018 " named %s at %L", last_name,
c3f34952
TB
3019 actual->expr ? &actual->expr->where
3020 : &gfc_current_locus);
3021 else
3022 gfc_error ("Too many components in structure constructor at "
546c8974
DM
3023 "%L", actual->expr ? &actual->expr->where
3024 : &gfc_current_locus);
c3f34952 3025 goto cleanup;
fa9290d3 3026 }
fa9290d3 3027
c3f34952
TB
3028 comp_tail->name = xstrdup (comp->name);
3029 }
fa9290d3 3030
c3f34952 3031 /* Find the current component in the structure definition and check
9d1210f4 3032 its access is not private. */
c3f34952 3033 if (comp)
f6288c24 3034 this_comp = gfc_find_component (sym, comp->name, false, false, NULL);
c3f34952
TB
3035 else
3036 {
3037 this_comp = gfc_find_component (sym, (const char *)comp_tail->name,
f6288c24 3038 false, false, NULL);
c3f34952
TB
3039 comp = NULL; /* Reset needed! */
3040 }
6de9cd9a 3041
c3f34952
TB
3042 /* Here we can check if a component name is given which does not
3043 correspond to any component of the defined structure. */
3044 if (!this_comp)
3045 goto cleanup;
fa9290d3 3046
04946c6b
TK
3047 /* For a constant string constructor, make sure the length is
3048 correct; truncate of fill with blanks if needed. */
3049 if (this_comp->ts.type == BT_CHARACTER && !this_comp->attr.allocatable
3050 && this_comp->ts.u.cl && this_comp->ts.u.cl->length
3051 && this_comp->ts.u.cl->length->expr_type == EXPR_CONSTANT
13a7688f 3052 && actual->expr->ts.type == BT_CHARACTER
04946c6b
TK
3053 && actual->expr->expr_type == EXPR_CONSTANT)
3054 {
3055 ptrdiff_t c, e;
3056 c = gfc_mpz_get_hwi (this_comp->ts.u.cl->length->value.integer);
3057 e = actual->expr->value.character.length;
3058
3059 if (c != e)
3060 {
3061 ptrdiff_t i, to;
3062 gfc_char_t *dest;
3063 dest = gfc_get_wide_string (c + 1);
3064
3065 to = e < c ? e : c;
3066 for (i = 0; i < to; i++)
3067 dest[i] = actual->expr->value.character.string[i];
a5fbc2f3 3068
04946c6b
TK
3069 for (i = e; i < c; i++)
3070 dest[i] = ' ';
3071
3072 dest[c] = '\0';
3073 free (actual->expr->value.character.string);
3074
3075 actual->expr->value.character.length = c;
3076 actual->expr->value.character.string = dest;
cf015ca2
TK
3077
3078 if (warn_line_truncation && c < e)
3079 gfc_warning_now (OPT_Wcharacter_truncation,
3080 "CHARACTER expression will be truncated "
3081 "in constructor (%ld/%ld) at %L", (long int) c,
3082 (long int) e, &actual->expr->where);
04946c6b
TK
3083 }
3084 }
3085
c3f34952
TB
3086 comp_tail->val = actual->expr;
3087 if (actual->expr != NULL)
3088 comp_tail->where = actual->expr->where;
3089 actual->expr = NULL;
fa9290d3 3090
c3f34952 3091 /* Check if this component is already given a value. */
bf1b77dd 3092 for (comp_iter = comp_head; comp_iter != comp_tail;
c3f34952
TB
3093 comp_iter = comp_iter->next)
3094 {
3095 gcc_assert (comp_iter);
3096 if (!strcmp (comp_iter->name, comp_tail->name))
d3a9eea2 3097 {
c4100eae 3098 gfc_error ("Component %qs is initialized twice in the structure"
546c8974 3099 " constructor at %L", comp_tail->name,
c3f34952
TB
3100 comp_tail->val ? &comp_tail->where
3101 : &gfc_current_locus);
d3a9eea2 3102 goto cleanup;
c3f34952
TB
3103 }
3104 }
d3a9eea2 3105
c3f34952
TB
3106 /* F2008, R457/C725, for PURE C1283. */
3107 if (this_comp->attr.pointer && comp_tail->val
3108 && gfc_is_coindexed (comp_tail->val))
3109 {
a4d9b221 3110 gfc_error ("Coindexed expression to pointer component %qs in "
546c8974 3111 "structure constructor at %L", comp_tail->name,
c3f34952
TB
3112 &comp_tail->where);
3113 goto cleanup;
3114 }
d3a9eea2 3115
c3f34952
TB
3116 /* If not explicitly a parent constructor, gather up the components
3117 and build one. */
3118 if (comp && comp == sym->components
3119 && sym->attr.extension
3120 && comp_tail->val
f6288c24 3121 && (!gfc_bt_struct (comp_tail->val->ts.type)
c3f34952
TB
3122 ||
3123 comp_tail->val->ts.u.derived != this_comp->ts.u.derived))
3124 {
524af0d6 3125 bool m;
c3f34952 3126 gfc_actual_arglist *arg_null = NULL;
6de9cd9a 3127
c3f34952
TB
3128 actual->expr = comp_tail->val;
3129 comp_tail->val = NULL;
6de9cd9a 3130
c3f34952
TB
3131 m = gfc_convert_to_structure_constructor (NULL,
3132 comp->ts.u.derived, &comp_tail->val,
3133 comp->ts.u.derived->attr.zero_comp
3134 ? &arg_null : &actual, true);
524af0d6 3135 if (!m)
c3f34952 3136 goto cleanup;
2eae3dc7 3137
c3f34952
TB
3138 if (comp->ts.u.derived->attr.zero_comp)
3139 {
3140 comp = comp->next;
3141 continue;
3142 }
3143 }
fa9290d3 3144
c3f34952
TB
3145 if (comp)
3146 comp = comp->next;
3147 if (parent && !comp)
3148 break;
fa9290d3 3149
792f7301
MM
3150 if (actual)
3151 actual = actual->next;
6de9cd9a
DN
3152 }
3153
524af0d6 3154 if (!build_actual_constructor (&comp_head, &ctor_head, sym))
7d1f1e61
PT
3155 goto cleanup;
3156
fa9290d3
DK
3157 /* No component should be left, as this should have caused an error in the
3158 loop constructing the component-list (name that does not correspond to any
3159 component in the structure definition). */
c3f34952 3160 if (comp_head && sym->attr.extension)
7d1f1e61
PT
3161 {
3162 for (comp_iter = comp_head; comp_iter; comp_iter = comp_iter->next)
3163 {
a4d9b221 3164 gfc_error ("component %qs at %L has already been set by a "
7d1f1e61
PT
3165 "parent derived type constructor", comp_iter->name,
3166 &comp_iter->where);
3167 }
3168 goto cleanup;
3169 }
c3f34952
TB
3170 else
3171 gcc_assert (!comp_head);
fa9290d3 3172
c3f34952
TB
3173 if (parent)
3174 {
3175 expr = gfc_get_structure_constructor_expr (BT_DERIVED, 0, &gfc_current_locus);
3176 expr->ts.u.derived = sym;
3177 expr->value.constructor = ctor_head;
3178 *cexpr = expr;
3179 }
3180 else
3181 {
3182 expr->ts.u.derived = sym;
3183 expr->ts.kind = 0;
3184 expr->ts.type = BT_DERIVED;
3185 expr->value.constructor = ctor_head;
3186 expr->expr_type = EXPR_STRUCTURE;
3187 }
6de9cd9a 3188
bf1b77dd 3189 gfc_current_locus = old_locus;
c3f34952
TB
3190 if (parent)
3191 *arglist = actual;
524af0d6 3192 return true;
6de9cd9a 3193
c3f34952 3194 cleanup:
bf1b77dd 3195 gfc_current_locus = old_locus;
6de9cd9a 3196
fa9290d3
DK
3197 for (comp_iter = comp_head; comp_iter; )
3198 {
3199 gfc_structure_ctor_component *next = comp_iter->next;
3200 gfc_free_structure_ctor_component (comp_iter);
3201 comp_iter = next;
3202 }
b7e75771 3203 gfc_constructor_free (ctor_head);
c3f34952 3204
524af0d6 3205 return false;
c3f34952
TB
3206}
3207
3208
3209match
3210gfc_match_structure_constructor (gfc_symbol *sym, gfc_expr **result)
3211{
3212 match m;
3213 gfc_expr *e;
3214 gfc_symtree *symtree;
3215
b64c3d06 3216 gfc_get_ha_sym_tree (sym->name, &symtree);
c3f34952
TB
3217
3218 e = gfc_get_expr ();
3219 e->symtree = symtree;
3220 e->expr_type = EXPR_FUNCTION;
2f00fb3d 3221 e->where = gfc_current_locus;
c3f34952 3222
f6288c24 3223 gcc_assert (gfc_fl_struct (sym->attr.flavor)
c3f34952
TB
3224 && symtree->n.sym->attr.flavor == FL_PROCEDURE);
3225 e->value.function.esym = sym;
3226 e->symtree->n.sym->attr.generic = 1;
3227
49032565
SK
3228 m = gfc_match_actual_arglist (0, &e->value.function.actual);
3229 if (m != MATCH_YES)
3230 {
3231 gfc_free_expr (e);
3232 return m;
3233 }
3234
3235 if (!gfc_convert_to_structure_constructor (e, sym, NULL, NULL, false))
3236 {
3237 gfc_free_expr (e);
3238 return MATCH_ERROR;
3239 }
3240
586dc38b
SK
3241 /* If a structure constructor is in a DATA statement, then each entity
3242 in the structure constructor must be a constant. Try to reduce the
3243 expression here. */
3244 if (gfc_in_match_data ())
3245 gfc_reduce_init_expr (e);
5bab4c96 3246
49032565
SK
3247 *result = e;
3248 return MATCH_YES;
6de9cd9a
DN
3249}
3250
3251
9a3db5a3
PT
3252/* If the symbol is an implicit do loop index and implicitly typed,
3253 it should not be host associated. Provide a symtree from the
3254 current namespace. */
3255static match
3256check_for_implicit_index (gfc_symtree **st, gfc_symbol **sym)
3257{
3258 if ((*sym)->attr.flavor == FL_VARIABLE
3259 && (*sym)->ns != gfc_current_ns
3260 && (*sym)->attr.implied_index
3261 && (*sym)->attr.implicit_type
3262 && !(*sym)->attr.use_assoc)
3263 {
3264 int i;
08a6b8e0 3265 i = gfc_get_sym_tree ((*sym)->name, NULL, st, false);
9a3db5a3
PT
3266 if (i)
3267 return MATCH_ERROR;
3268 *sym = (*st)->n.sym;
3269 }
3270 return MATCH_YES;
3271}
3272
3273
3070bab4
JW
3274/* Procedure pointer as function result: Replace the function symbol by the
3275 auto-generated hidden result variable named "ppr@". */
3276
524af0d6 3277static bool
3070bab4
JW
3278replace_hidden_procptr_result (gfc_symbol **sym, gfc_symtree **st)
3279{
3280 /* Check for procedure pointer result variable. */
3281 if ((*sym)->attr.function && !(*sym)->attr.external
3282 && (*sym)->result && (*sym)->result != *sym
3283 && (*sym)->result->attr.proc_pointer
3284 && (*sym) == gfc_current_ns->proc_name
3285 && (*sym) == (*sym)->result->ns->proc_name
3286 && strcmp ("ppr@", (*sym)->result->name) == 0)
3287 {
3288 /* Automatic replacement with "hidden" result variable. */
3289 (*sym)->result->attr.referenced = (*sym)->attr.referenced;
3290 *sym = (*sym)->result;
3291 *st = gfc_find_symtree ((*sym)->ns->sym_root, (*sym)->name);
524af0d6 3292 return true;
3070bab4 3293 }
524af0d6 3294 return false;
3070bab4
JW
3295}
3296
3297
6de9cd9a
DN
3298/* Matches a variable name followed by anything that might follow it--
3299 array reference, argument list of a function, etc. */
3300
3301match
edf1eac2 3302gfc_match_rvalue (gfc_expr **result)
6de9cd9a
DN
3303{
3304 gfc_actual_arglist *actual_arglist;
d3fcc995 3305 char name[GFC_MAX_SYMBOL_LEN + 1], argname[GFC_MAX_SYMBOL_LEN + 1];
6de9cd9a
DN
3306 gfc_state_data *st;
3307 gfc_symbol *sym;
3308 gfc_symtree *symtree;
d3fcc995 3309 locus where, old_loc;
6de9cd9a 3310 gfc_expr *e;
d3fcc995 3311 match m, m2;
6de9cd9a 3312 int i;
5270c302
AL
3313 gfc_typespec *ts;
3314 bool implicit_char;
a99288e5 3315 gfc_ref *ref;
6de9cd9a 3316
cd714e1e
FR
3317 m = gfc_match ("%%loc");
3318 if (m == MATCH_YES)
3319 {
3320 if (!gfc_notify_std (GFC_STD_LEGACY, "%%LOC() as an rvalue at %C"))
3321 return MATCH_ERROR;
3322 strncpy (name, "loc", 4);
3323 }
3324
3325 else
3326 {
3327 m = gfc_match_name (name);
3328 if (m != MATCH_YES)
3329 return m;
3330 }
6de9cd9a 3331
f6288c24
FR
3332 /* Check if the symbol exists. */
3333 if (gfc_find_sym_tree (name, NULL, 1, &symtree))
6de9cd9a
DN
3334 return MATCH_ERROR;
3335
f6288c24
FR
3336 /* If the symbol doesn't exist, create it unless the name matches a FL_STRUCT
3337 type. For derived types we create a generic symbol which links to the
3338 derived type symbol; STRUCTUREs are simpler and must not conflict with
3339 variables. */
3340 if (!symtree)
3341 if (gfc_find_sym_tree (gfc_dt_upper_string (name), NULL, 1, &symtree))
3342 return MATCH_ERROR;
3343 if (!symtree || symtree->n.sym->attr.flavor != FL_STRUCT)
3344 {
3345 if (gfc_find_state (COMP_INTERFACE)
3346 && !gfc_current_ns->has_import_set)
3347 i = gfc_get_sym_tree (name, NULL, &symtree, false);
3348 else
3349 i = gfc_get_ha_sym_tree (name, &symtree);
3350 if (i)
3351 return MATCH_ERROR;
3352 }
3353
3354
6de9cd9a
DN
3355 sym = symtree->n.sym;
3356 e = NULL;
63645982 3357 where = gfc_current_locus;
6de9cd9a 3358
3070bab4
JW
3359 replace_hidden_procptr_result (&sym, &symtree);
3360
9a3db5a3
PT
3361 /* If this is an implicit do loop index and implicitly typed,
3362 it should not be host associated. */
3363 m = check_for_implicit_index (&symtree, &sym);
3364 if (m != MATCH_YES)
3365 return m;
3366
6de9cd9a 3367 gfc_set_sym_referenced (sym);
9a3db5a3 3368 sym->attr.implied_index = 0;
6de9cd9a 3369
0921bc44
JJ
3370 if (sym->attr.function && sym->result == sym)
3371 {
811849c0
PT
3372 /* See if this is a directly recursive function call. */
3373 gfc_gobble_whitespace ();
3374 if (sym->attr.recursive
8fc541d3 3375 && gfc_peek_ascii_char () == '('
fc2d8680
PT
3376 && gfc_current_ns->proc_name == sym
3377 && !sym->attr.dimension)
811849c0 3378 {
a4d9b221 3379 gfc_error ("%qs at %C is the name of a recursive function "
fc2d8680
PT
3380 "and so refers to the result variable. Use an "
3381 "explicit RESULT variable for direct recursion "
3382 "(12.5.2.1)", sym->name);
811849c0
PT
3383 return MATCH_ERROR;
3384 }
fc2d8680 3385
2d71b918 3386 if (gfc_is_function_return_value (sym, gfc_current_ns))
0921bc44
JJ
3387 goto variable;
3388
3389 if (sym->attr.entry
3390 && (sym->ns == gfc_current_ns
3391 || sym->ns == gfc_current_ns->parent))
3392 {
3393 gfc_entry_list *el = NULL;
bf1b77dd 3394
0921bc44
JJ
3395 for (el = sym->ns->entries; el; el = el->next)
3396 if (sym == el->sym)
3397 goto variable;
3398 }
3399 }
6de9cd9a 3400
8fb74da4
JW
3401 if (gfc_matching_procptr_assignment)
3402 goto procptr0;
3403
6de9cd9a
DN
3404 if (sym->attr.function || sym->attr.external || sym->attr.intrinsic)
3405 goto function0;
3406
3407 if (sym->attr.generic)
3408 goto generic_function;
3409
3410 switch (sym->attr.flavor)
3411 {
3412 case FL_VARIABLE:
3413 variable:
6de9cd9a
DN
3414 e = gfc_get_expr ();
3415
3416 e->expr_type = EXPR_VARIABLE;
3417 e->symtree = symtree;
3418
713485cc 3419 m = gfc_match_varspec (e, 0, false, true);
6de9cd9a
DN
3420 break;
3421
3422 case FL_PARAMETER:
b7263e8f 3423 /* A statement of the form "REAL, parameter :: a(0:10) = 1" will
bf1b77dd 3424 end up here. Unfortunately, sym->value->expr_type is set to
b7263e8f
EE
3425 EXPR_CONSTANT, and so the if () branch would be followed without
3426 the !sym->as check. */
3427 if (sym->value && sym->value->expr_type != EXPR_ARRAY && !sym->as)
6de9cd9a
DN
3428 e = gfc_copy_expr (sym->value);
3429 else
3430 {
3431 e = gfc_get_expr ();
3432 e->expr_type = EXPR_VARIABLE;
3433 }
3434
3435 e->symtree = symtree;
713485cc 3436 m = gfc_match_varspec (e, 0, false, true);
a99288e5
PT
3437
3438 if (sym->ts.is_c_interop || sym->ts.is_iso_c)
3439 break;
3440
927171bf
PT
3441 /* Variable array references to derived type parameters cause
3442 all sorts of headaches in simplification. Treating such
3443 expressions as variable works just fine for all array
3444 references. */
3445 if (sym->value && sym->ts.type == BT_DERIVED && e->ref)
a99288e5
PT
3446 {
3447 for (ref = e->ref; ref; ref = ref->next)
3448 if (ref->type == REF_ARRAY)
3449 break;
3450
927171bf 3451 if (ref == NULL || ref->u.ar.type == AR_FULL)
a99288e5
PT
3452 break;
3453
3454 ref = e->ref;
3455 e->ref = NULL;
3456 gfc_free_expr (e);
3457 e = gfc_get_expr ();
3458 e->expr_type = EXPR_VARIABLE;
3459 e->symtree = symtree;
3460 e->ref = ref;
a99288e5
PT
3461 }
3462
6de9cd9a
DN
3463 break;
3464
f6288c24 3465 case FL_STRUCT:
6de9cd9a
DN
3466 case FL_DERIVED:
3467 sym = gfc_use_derived (sym);
3468 if (sym == NULL)
3469 m = MATCH_ERROR;
3470 else
c3f34952 3471 goto generic_function;
6de9cd9a
DN
3472 break;
3473
3474 /* If we're here, then the name is known to be the name of a
3475 procedure, yet it is not sure to be the name of a function. */
3476 case FL_PROCEDURE:
8fb74da4 3477
1cc0e193 3478 /* Procedure Pointer Assignments. */
8fb74da4
JW
3479 procptr0:
3480 if (gfc_matching_procptr_assignment)
3481 {
3482 gfc_gobble_whitespace ();
e35bbb23 3483 if (!sym->attr.dimension && gfc_peek_ascii_char () == '(')
8fb74da4
JW
3484 /* Parse functions returning a procptr. */
3485 goto function0;
3486
8fb74da4
JW
3487 e = gfc_get_expr ();
3488 e->expr_type = EXPR_VARIABLE;
3489 e->symtree = symtree;
713485cc 3490 m = gfc_match_varspec (e, 0, false, true);
2dda89a8
JW
3491 if (!e->ref && sym->attr.flavor == FL_UNKNOWN
3492 && sym->ts.type == BT_UNKNOWN
524af0d6 3493 && !gfc_add_flavor (&sym->attr, FL_PROCEDURE, sym->name, NULL))
2dda89a8
JW
3494 {
3495 m = MATCH_ERROR;
3496 break;
3497 }
8fb74da4
JW
3498 break;
3499 }
3500
6de9cd9a
DN
3501 if (sym->attr.subroutine)
3502 {
a4d9b221 3503 gfc_error ("Unexpected use of subroutine name %qs at %C",
6de9cd9a
DN
3504 sym->name);
3505 m = MATCH_ERROR;
3506 break;
3507 }
3508
3509 /* At this point, the name has to be a non-statement function.
edf1eac2
SK
3510 If the name is the same as the current function being
3511 compiled, then we have a variable reference (to the function
3512 result) if the name is non-recursive. */
6de9cd9a
DN
3513
3514 st = gfc_enclosing_unit (NULL);
3515
4668d6f9
PT
3516 if (st != NULL
3517 && st->state == COMP_FUNCTION
6de9cd9a
DN
3518 && st->sym == sym
3519 && !sym->attr.recursive)
3520 {
3521 e = gfc_get_expr ();
3522 e->symtree = symtree;
3523 e->expr_type = EXPR_VARIABLE;
3524
713485cc 3525 m = gfc_match_varspec (e, 0, false, true);
6de9cd9a
DN
3526 break;
3527 }
3528
3529 /* Match a function reference. */
3530 function0:
3531 m = gfc_match_actual_arglist (0, &actual_arglist);
3532 if (m == MATCH_NO)
3533 {
3534 if (sym->attr.proc == PROC_ST_FUNCTION)
a4d9b221 3535 gfc_error ("Statement function %qs requires argument list at %C",
6de9cd9a
DN
3536 sym->name);
3537 else
a4d9b221 3538 gfc_error ("Function %qs requires an argument list at %C",
6de9cd9a
DN
3539 sym->name);
3540
3541 m = MATCH_ERROR;
3542 break;
3543 }
3544
3545 if (m != MATCH_YES)
3546 {
3547 m = MATCH_ERROR;
3548 break;
3549 }
3550
3551 gfc_get_ha_sym_tree (name, &symtree); /* Can't fail */
3552 sym = symtree->n.sym;
3553
3070bab4
JW
3554 replace_hidden_procptr_result (&sym, &symtree);
3555
6de9cd9a
DN
3556 e = gfc_get_expr ();
3557 e->symtree = symtree;
3558 e->expr_type = EXPR_FUNCTION;
3559 e->value.function.actual = actual_arglist;
63645982 3560 e->where = gfc_current_locus;
6de9cd9a 3561
102344e2
TB
3562 if (sym->ts.type == BT_CLASS && sym->attr.class_ok
3563 && CLASS_DATA (sym)->as)
3564 e->rank = CLASS_DATA (sym)->as->rank;
3565 else if (sym->as != NULL)
6de9cd9a
DN
3566 e->rank = sym->as->rank;
3567
3568 if (!sym->attr.function
524af0d6 3569 && !gfc_add_function (&sym->attr, sym->name, NULL))
6de9cd9a
DN
3570 {
3571 m = MATCH_ERROR;
3572 break;
3573 }
3574
a8b3b0b6
CR
3575 /* Check here for the existence of at least one argument for the
3576 iso_c_binding functions C_LOC, C_FUNLOC, and C_ASSOCIATED. The
3577 argument(s) given will be checked in gfc_iso_c_func_interface,
3578 during resolution of the function call. */
3579 if (sym->attr.is_iso_c == 1
3580 && (sym->from_intmod == INTMOD_ISO_C_BINDING
3581 && (sym->intmod_sym_id == ISOCBINDING_LOC
3582 || sym->intmod_sym_id == ISOCBINDING_FUNLOC
3583 || sym->intmod_sym_id == ISOCBINDING_ASSOCIATED)))
3584 {
3585 /* make sure we were given a param */
3586 if (actual_arglist == NULL)
3587 {
a4d9b221 3588 gfc_error ("Missing argument to %qs at %C", sym->name);
a8b3b0b6
CR
3589 m = MATCH_ERROR;
3590 break;
3591 }
3592 }
3593
6de9cd9a
DN
3594 if (sym->result == NULL)
3595 sym->result = sym;
3596
20fee4a9
JW
3597 gfc_gobble_whitespace ();
3598 /* F08:C612. */
3599 if (gfc_peek_ascii_char() == '%')
3600 {
67914693 3601 gfc_error ("The leftmost part-ref in a data-ref cannot be a "
20fee4a9
JW
3602 "function reference at %C");
3603 m = MATCH_ERROR;
3604 }
3605
6de9cd9a
DN
3606 m = MATCH_YES;
3607 break;
3608
3609 case FL_UNKNOWN:
3610
3611 /* Special case for derived type variables that get their types
edf1eac2
SK
3612 via an IMPLICIT statement. This can't wait for the
3613 resolution phase. */
6de9cd9a 3614
f6288c24
FR
3615 old_loc = gfc_current_locus;
3616 if (gfc_match_member_sep (sym) == MATCH_YES
0dd973dd 3617 && sym->ts.type == BT_UNKNOWN
713485cc 3618 && gfc_get_default_type (sym->name, sym->ns)->type == BT_DERIVED)
6de9cd9a 3619 gfc_set_default_type (sym, 0, sym->ns);
f6288c24 3620 gfc_current_locus = old_loc;
6de9cd9a 3621
492792ed 3622 /* If the symbol has a (co)dimension attribute, the expression is a
edf1eac2 3623 variable. */
6de9cd9a 3624
492792ed 3625 if (sym->attr.dimension || sym->attr.codimension)
6de9cd9a 3626 {
524af0d6 3627 if (!gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, NULL))
6de9cd9a
DN
3628 {
3629 m = MATCH_ERROR;
3630 break;
3631 }
3632
3633 e = gfc_get_expr ();
3634 e->symtree = symtree;
3635 e->expr_type = EXPR_VARIABLE;
713485cc 3636 m = gfc_match_varspec (e, 0, false, true);
6de9cd9a
DN
3637 break;
3638 }
3639
cd99c23c 3640 if (sym->ts.type == BT_CLASS && sym->attr.class_ok
492792ed
TB
3641 && (CLASS_DATA (sym)->attr.dimension
3642 || CLASS_DATA (sym)->attr.codimension))
c49ea23d 3643 {
524af0d6 3644 if (!gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, NULL))
c49ea23d
PT
3645 {
3646 m = MATCH_ERROR;
3647 break;
3648 }
3649
3650 e = gfc_get_expr ();
3651 e->symtree = symtree;
3652 e->expr_type = EXPR_VARIABLE;
3653 m = gfc_match_varspec (e, 0, false, true);
3654 break;
3655 }
3656
6de9cd9a 3657 /* Name is not an array, so we peek to see if a '(' implies a
edf1eac2
SK
3658 function call or a substring reference. Otherwise the
3659 variable is just a scalar. */
6de9cd9a
DN
3660
3661 gfc_gobble_whitespace ();
8fc541d3 3662 if (gfc_peek_ascii_char () != '(')
6de9cd9a
DN
3663 {
3664 /* Assume a scalar variable */
3665 e = gfc_get_expr ();
3666 e->symtree = symtree;
3667 e->expr_type = EXPR_VARIABLE;
3668
524af0d6 3669 if (!gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, NULL))
6de9cd9a
DN
3670 {
3671 m = MATCH_ERROR;
3672 break;
3673 }
3674
8e1f752a 3675 /*FIXME:??? gfc_match_varspec does set this for us: */
6de9cd9a 3676 e->ts = sym->ts;
713485cc 3677 m = gfc_match_varspec (e, 0, false, true);
6de9cd9a
DN
3678 break;
3679 }
3680
d3fcc995
TS
3681 /* See if this is a function reference with a keyword argument
3682 as first argument. We do this because otherwise a spurious
3683 symbol would end up in the symbol table. */
3684
3685 old_loc = gfc_current_locus;
3686 m2 = gfc_match (" ( %n =", argname);
3687 gfc_current_locus = old_loc;
6de9cd9a
DN
3688
3689 e = gfc_get_expr ();
3690 e->symtree = symtree;
3691
d3fcc995 3692 if (m2 != MATCH_YES)
6de9cd9a 3693 {
5270c302 3694 /* Try to figure out whether we're dealing with a character type.
bf1b77dd 3695 We're peeking ahead here, because we don't want to call
5270c302
AL
3696 match_substring if we're dealing with an implicitly typed
3697 non-character variable. */
3698 implicit_char = false;
3699 if (sym->ts.type == BT_UNKNOWN)
3700 {
713485cc 3701 ts = gfc_get_default_type (sym->name, NULL);
5270c302
AL
3702 if (ts->type == BT_CHARACTER)
3703 implicit_char = true;
3704 }
3705
d3fcc995
TS
3706 /* See if this could possibly be a substring reference of a name
3707 that we're not sure is a variable yet. */
6de9cd9a 3708
5270c302 3709 if ((implicit_char || sym->ts.type == BT_CHARACTER)
38217d3e 3710 && match_substring (sym->ts.u.cl, 0, &e->ref, false) == MATCH_YES)
6de9cd9a 3711 {
6de9cd9a 3712
d3fcc995
TS
3713 e->expr_type = EXPR_VARIABLE;
3714
3715 if (sym->attr.flavor != FL_VARIABLE
bf1b77dd 3716 && !gfc_add_flavor (&sym->attr, FL_VARIABLE,
524af0d6 3717 sym->name, NULL))
d3fcc995
TS
3718 {
3719 m = MATCH_ERROR;
3720 break;
3721 }
3722
3723 if (sym->ts.type == BT_UNKNOWN
524af0d6 3724 && !gfc_set_default_type (sym, 1, NULL))
d3fcc995
TS
3725 {
3726 m = MATCH_ERROR;
3727 break;
3728 }
3729
3730 e->ts = sym->ts;
860c8f3b 3731 if (e->ref)
bc21d315 3732 e->ts.u.cl = NULL;
d3fcc995 3733 m = MATCH_YES;
6de9cd9a
DN
3734 break;
3735 }
6de9cd9a
DN
3736 }
3737
3738 /* Give up, assume we have a function. */
3739
08a6b8e0 3740 gfc_get_sym_tree (name, NULL, &symtree, false); /* Can't fail */
6de9cd9a
DN
3741 sym = symtree->n.sym;
3742 e->expr_type = EXPR_FUNCTION;
3743
3744 if (!sym->attr.function
524af0d6 3745 && !gfc_add_function (&sym->attr, sym->name, NULL))
6de9cd9a
DN
3746 {
3747 m = MATCH_ERROR;
3748 break;
3749 }
3750
3751 sym->result = sym;
3752
3753 m = gfc_match_actual_arglist (0, &e->value.function.actual);
3754 if (m == MATCH_NO)
a4d9b221 3755 gfc_error ("Missing argument list in function %qs at %C", sym->name);
6de9cd9a
DN
3756
3757 if (m != MATCH_YES)
3758 {
3759 m = MATCH_ERROR;
3760 break;
3761 }
3762
3763 /* If our new function returns a character, array or structure
edf1eac2 3764 type, it might have subsequent references. */
6de9cd9a 3765
713485cc 3766 m = gfc_match_varspec (e, 0, false, true);
6de9cd9a
DN
3767 if (m == MATCH_NO)
3768 m = MATCH_YES;
3769
3770 break;
3771
3772 generic_function:
f6288c24
FR
3773 /* Look for symbol first; if not found, look for STRUCTURE type symbol
3774 specially. Creates a generic symbol for derived types. */
3775 gfc_find_sym_tree (name, NULL, 1, &symtree);
3776 if (!symtree)
3777 gfc_find_sym_tree (gfc_dt_upper_string (name), NULL, 1, &symtree);
3778 if (!symtree || symtree->n.sym->attr.flavor != FL_STRUCT)
3779 gfc_get_sym_tree (name, NULL, &symtree, false); /* Can't fail */
6de9cd9a
DN
3780
3781 e = gfc_get_expr ();
3782 e->symtree = symtree;
3783 e->expr_type = EXPR_FUNCTION;
3784
f6288c24 3785 if (gfc_fl_struct (sym->attr.flavor))
c3f34952
TB
3786 {
3787 e->value.function.esym = sym;
3788 e->symtree->n.sym->attr.generic = 1;
3789 }
3790
6de9cd9a
DN
3791 m = gfc_match_actual_arglist (0, &e->value.function.actual);
3792 break;
3793
c0f0e35a
JD
3794 case FL_NAMELIST:
3795 m = MATCH_ERROR;
3796 break;
3797
6de9cd9a
DN
3798 default:
3799 gfc_error ("Symbol at %C is not appropriate for an expression");
3800 return MATCH_ERROR;
3801 }
3802
3803 if (m == MATCH_YES)
3804 {
3805 e->where = where;
3806 *result = e;
3807 }
3808 else
3809 gfc_free_expr (e);
3810
3811 return m;
3812}
3813
3814
df2fba9e 3815/* Match a variable, i.e. something that can be assigned to. This
6de9cd9a
DN
3816 starts as a symbol, can be a structure component or an array
3817 reference. It can be a function if the function doesn't have a
3818 separate RESULT variable. If the symbol has not been previously
30aabb86 3819 seen, we assume it is a variable.
6de9cd9a 3820
30aabb86
PT
3821 This function is called by two interface functions:
3822 gfc_match_variable, which has host_flag = 1, and
3823 gfc_match_equiv_variable, with host_flag = 0, to restrict the
3824 match of the symbol to the local scope. */
3825
3826static match
edf1eac2 3827match_variable (gfc_expr **result, int equiv_flag, int host_flag)
6de9cd9a 3828{
f6288c24 3829 gfc_symbol *sym, *dt_sym;
6de9cd9a
DN
3830 gfc_symtree *st;
3831 gfc_expr *expr;
f6288c24 3832 locus where, old_loc;
6de9cd9a
DN
3833 match m;
3834
fd2aa7ad
PT
3835 /* Since nothing has any business being an lvalue in a module
3836 specification block, an interface block or a contains section,
3837 we force the changed_symbols mechanism to work by setting
3838 host_flag to 0. This prevents valid symbols that have the name
3839 of keywords, such as 'end', being turned into variables by
df2fba9e 3840 failed matching to assignments for, e.g., END INTERFACE. */
fd2aa7ad 3841 if (gfc_current_state () == COMP_MODULE
4668d6f9 3842 || gfc_current_state () == COMP_SUBMODULE
fd2aa7ad
PT
3843 || gfc_current_state () == COMP_INTERFACE
3844 || gfc_current_state () == COMP_CONTAINS)
3845 host_flag = 0;
3846
618f4f46 3847 where = gfc_current_locus;
30aabb86 3848 m = gfc_match_sym_tree (&st, host_flag);
6de9cd9a
DN
3849 if (m != MATCH_YES)
3850 return m;
6de9cd9a
DN
3851
3852 sym = st->n.sym;
9a3db5a3
PT
3853
3854 /* If this is an implicit do loop index and implicitly typed,
3855 it should not be host associated. */
3856 m = check_for_implicit_index (&st, &sym);
3857 if (m != MATCH_YES)
3858 return m;
3859
3860 sym->attr.implied_index = 0;
3861
6de9cd9a 3862 gfc_set_sym_referenced (sym);
f6288c24
FR
3863
3864 /* STRUCTUREs may share names with variables, but derived types may not. */
3865 if (sym->attr.flavor == FL_PROCEDURE && sym->generic
3866 && (dt_sym = gfc_find_dt_in_generic (sym)))
3867 {
3868 if (dt_sym->attr.flavor == FL_DERIVED)
2f029c08 3869 gfc_error ("Derived type %qs cannot be used as a variable at %C",
f6288c24
FR
3870 sym->name);
3871 return MATCH_ERROR;
3872 }
3873
6de9cd9a
DN
3874 switch (sym->attr.flavor)
3875 {
3876 case FL_VARIABLE:
8c91ab34 3877 /* Everything is alright. */
6de9cd9a
DN
3878 break;
3879
3880 case FL_UNKNOWN:
d7e2fcd0
TB
3881 {
3882 sym_flavor flavor = FL_UNKNOWN;
3883
3884 gfc_gobble_whitespace ();
3885
3886 if (sym->attr.external || sym->attr.procedure
3887 || sym->attr.function || sym->attr.subroutine)
3888 flavor = FL_PROCEDURE;
b9332b09
PT
3889
3890 /* If it is not a procedure, is not typed and is host associated,
3891 we cannot give it a flavor yet. */
3892 else if (sym->ns == gfc_current_ns->parent
3893 && sym->ts.type == BT_UNKNOWN)
3894 break;
3895
3896 /* These are definitive indicators that this is a variable. */
8fc541d3 3897 else if (gfc_peek_ascii_char () != '(' || sym->ts.type != BT_UNKNOWN
d7e2fcd0
TB
3898 || sym->attr.pointer || sym->as != NULL)
3899 flavor = FL_VARIABLE;
3900
3901 if (flavor != FL_UNKNOWN
524af0d6 3902 && !gfc_add_flavor (&sym->attr, flavor, sym->name, NULL))
d7e2fcd0
TB
3903 return MATCH_ERROR;
3904 }
6de9cd9a
DN
3905 break;
3906
5056a350
SK
3907 case FL_PARAMETER:
3908 if (equiv_flag)
8c91ab34
DK
3909 {
3910 gfc_error ("Named constant at %C in an EQUIVALENCE");
3911 return MATCH_ERROR;
3912 }
3913 /* Otherwise this is checked for and an error given in the
3914 variable definition context checks. */
5056a350
SK
3915 break;
3916
6de9cd9a 3917 case FL_PROCEDURE:
01d2a7d7
DF
3918 /* Check for a nonrecursive function result variable. */
3919 if (sym->attr.function
8c91ab34
DK
3920 && !sym->attr.external
3921 && sym->result == sym
3922 && (gfc_is_function_return_value (sym, gfc_current_ns)
3923 || (sym->attr.entry
3924 && sym->ns == gfc_current_ns)
3925 || (sym->attr.entry
3926 && sym->ns == gfc_current_ns->parent)))
6de9cd9a 3927 {
6de9cd9a
DN
3928 /* If a function result is a derived type, then the derived
3929 type may still have to be resolved. */
3930
3931 if (sym->ts.type == BT_DERIVED
bc21d315 3932 && gfc_use_derived (sym->ts.u.derived) == NULL)
6de9cd9a 3933 return MATCH_ERROR;
6de9cd9a
DN
3934 break;
3935 }
3936
3070bab4 3937 if (sym->attr.proc_pointer
524af0d6 3938 || replace_hidden_procptr_result (&sym, &st))
8fb74da4
JW
3939 break;
3940
6de9cd9a 3941 /* Fall through to error */
81fea426 3942 gcc_fallthrough ();
6de9cd9a
DN
3943
3944 default:
a4d9b221 3945 gfc_error ("%qs at %C is not a variable", sym->name);
6de9cd9a
DN
3946 return MATCH_ERROR;
3947 }
3948
0dd973dd
PB
3949 /* Special case for derived type variables that get their types
3950 via an IMPLICIT statement. This can't wait for the
3951 resolution phase. */
3952
3953 {
3954 gfc_namespace * implicit_ns;
3955
3956 if (gfc_current_ns->proc_name == sym)
3957 implicit_ns = gfc_current_ns;
3958 else
3959 implicit_ns = sym->ns;
5bab4c96 3960
f6288c24
FR
3961 old_loc = gfc_current_locus;
3962 if (gfc_match_member_sep (sym) == MATCH_YES
0dd973dd 3963 && sym->ts.type == BT_UNKNOWN
713485cc 3964 && gfc_get_default_type (sym->name, implicit_ns)->type == BT_DERIVED)
0dd973dd 3965 gfc_set_default_type (sym, 0, implicit_ns);
f6288c24 3966 gfc_current_locus = old_loc;
0dd973dd
PB
3967 }
3968
6de9cd9a
DN
3969 expr = gfc_get_expr ();
3970
3971 expr->expr_type = EXPR_VARIABLE;
3972 expr->symtree = st;
3973 expr->ts = sym->ts;
3974 expr->where = where;
3975
3976 /* Now see if we have to do more. */
713485cc 3977 m = gfc_match_varspec (expr, equiv_flag, false, false);
6de9cd9a
DN
3978 if (m != MATCH_YES)
3979 {
3980 gfc_free_expr (expr);
3981 return m;
3982 }
3983
3984 *result = expr;
3985 return MATCH_YES;
3986}
30aabb86 3987
edf1eac2 3988
30aabb86 3989match
edf1eac2 3990gfc_match_variable (gfc_expr **result, int equiv_flag)
30aabb86
PT
3991{
3992 return match_variable (result, equiv_flag, 1);
3993}
3994
edf1eac2 3995
30aabb86 3996match
edf1eac2 3997gfc_match_equiv_variable (gfc_expr **result)
30aabb86
PT
3998{
3999 return match_variable (result, 1, 0);
4000}
4001