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