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