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