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