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