2009-07-10 Paul Thomas <pault@gcc.gnu.org>
[official-gcc.git] / gcc / fortran / primary.c
blob8013cc86d1e10aa75e539472b4334fe9b38c9162
1 /* Primary expression subroutines
2 Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008
3 Free Software Foundation, Inc.
4 Contributed by Andy Vaught
6 This file is part of GCC.
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.
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.
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/>. */
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 "toplev.h"
31 /* Matches a kind-parameter expression, which is either a named
32 symbolic constant or a nonnegative integer constant. If
33 successful, sets the kind value to the correct integer. */
35 static match
36 match_kind_param (int *kind)
38 char name[GFC_MAX_SYMBOL_LEN + 1];
39 gfc_symbol *sym;
40 const char *p;
41 match m;
43 m = gfc_match_small_literal_int (kind, NULL);
44 if (m != MATCH_NO)
45 return m;
47 m = gfc_match_name (name);
48 if (m != MATCH_YES)
49 return m;
51 if (gfc_find_symbol (name, NULL, 1, &sym))
52 return MATCH_ERROR;
54 if (sym == NULL)
55 return MATCH_NO;
57 if (sym->attr.flavor != FL_PARAMETER)
58 return MATCH_NO;
60 if (sym->value == NULL)
61 return MATCH_NO;
63 p = gfc_extract_int (sym->value, kind);
64 if (p != NULL)
65 return MATCH_NO;
67 gfc_set_sym_referenced (sym);
69 if (*kind < 0)
70 return MATCH_NO;
72 return MATCH_YES;
76 /* Get a trailing kind-specification for non-character variables.
77 Returns:
78 the integer kind value or:
79 -1 if an error was generated
80 -2 if no kind was found */
82 static int
83 get_kind (void)
85 int kind;
86 match m;
88 if (gfc_match_char ('_') != MATCH_YES)
89 return -2;
91 m = match_kind_param (&kind);
92 if (m == MATCH_NO)
93 gfc_error ("Missing kind-parameter at %C");
95 return (m == MATCH_YES) ? kind : -1;
99 /* Given a character and a radix, see if the character is a valid
100 digit in that radix. */
103 gfc_check_digit (char c, int radix)
105 int r;
107 switch (radix)
109 case 2:
110 r = ('0' <= c && c <= '1');
111 break;
113 case 8:
114 r = ('0' <= c && c <= '7');
115 break;
117 case 10:
118 r = ('0' <= c && c <= '9');
119 break;
121 case 16:
122 r = ISXDIGIT (c);
123 break;
125 default:
126 gfc_internal_error ("gfc_check_digit(): bad radix");
129 return r;
133 /* Match the digit string part of an integer if signflag is not set,
134 the signed digit string part if signflag is set. If the buffer
135 is NULL, we just count characters for the resolution pass. Returns
136 the number of characters matched, -1 for no match. */
138 static int
139 match_digits (int signflag, int radix, char *buffer)
141 locus old_loc;
142 int length;
143 char c;
145 length = 0;
146 c = gfc_next_ascii_char ();
148 if (signflag && (c == '+' || c == '-'))
150 if (buffer != NULL)
151 *buffer++ = c;
152 gfc_gobble_whitespace ();
153 c = gfc_next_ascii_char ();
154 length++;
157 if (!gfc_check_digit (c, radix))
158 return -1;
160 length++;
161 if (buffer != NULL)
162 *buffer++ = c;
164 for (;;)
166 old_loc = gfc_current_locus;
167 c = gfc_next_ascii_char ();
169 if (!gfc_check_digit (c, radix))
170 break;
172 if (buffer != NULL)
173 *buffer++ = c;
174 length++;
177 gfc_current_locus = old_loc;
179 return length;
183 /* Match an integer (digit string and optional kind).
184 A sign will be accepted if signflag is set. */
186 static match
187 match_integer_constant (gfc_expr **result, int signflag)
189 int length, kind;
190 locus old_loc;
191 char *buffer;
192 gfc_expr *e;
194 old_loc = gfc_current_locus;
195 gfc_gobble_whitespace ();
197 length = match_digits (signflag, 10, NULL);
198 gfc_current_locus = old_loc;
199 if (length == -1)
200 return MATCH_NO;
202 buffer = (char *) alloca (length + 1);
203 memset (buffer, '\0', length + 1);
205 gfc_gobble_whitespace ();
207 match_digits (signflag, 10, buffer);
209 kind = get_kind ();
210 if (kind == -2)
211 kind = gfc_default_integer_kind;
212 if (kind == -1)
213 return MATCH_ERROR;
215 if (gfc_validate_kind (BT_INTEGER, kind, true) < 0)
217 gfc_error ("Integer kind %d at %C not available", kind);
218 return MATCH_ERROR;
221 e = gfc_convert_integer (buffer, kind, 10, &gfc_current_locus);
223 if (gfc_range_check (e) != ARITH_OK)
225 gfc_error ("Integer too big for its kind at %C. This check can be "
226 "disabled with the option -fno-range-check");
228 gfc_free_expr (e);
229 return MATCH_ERROR;
232 *result = e;
233 return MATCH_YES;
237 /* Match a Hollerith constant. */
239 static match
240 match_hollerith_constant (gfc_expr **result)
242 locus old_loc;
243 gfc_expr *e = NULL;
244 const char *msg;
245 int num;
246 int i;
248 old_loc = gfc_current_locus;
249 gfc_gobble_whitespace ();
251 if (match_integer_constant (&e, 0) == MATCH_YES
252 && gfc_match_char ('h') == MATCH_YES)
254 if (gfc_notify_std (GFC_STD_LEGACY, "Extension: Hollerith constant "
255 "at %C") == FAILURE)
256 goto cleanup;
258 msg = gfc_extract_int (e, &num);
259 if (msg != NULL)
261 gfc_error (msg);
262 goto cleanup;
264 if (num == 0)
266 gfc_error ("Invalid Hollerith constant: %L must contain at least "
267 "one character", &old_loc);
268 goto cleanup;
270 if (e->ts.kind != gfc_default_integer_kind)
272 gfc_error ("Invalid Hollerith constant: Integer kind at %L "
273 "should be default", &old_loc);
274 goto cleanup;
276 else
278 gfc_free_expr (e);
279 e = gfc_constant_result (BT_HOLLERITH, gfc_default_character_kind,
280 &gfc_current_locus);
282 e->representation.string = XCNEWVEC (char, num + 1);
284 for (i = 0; i < num; i++)
286 gfc_char_t c = gfc_next_char_literal (1);
287 if (! gfc_wide_fits_in_byte (c))
289 gfc_error ("Invalid Hollerith constant at %L contains a "
290 "wide character", &old_loc);
291 goto cleanup;
294 e->representation.string[i] = (unsigned char) c;
297 e->representation.string[num] = '\0';
298 e->representation.length = num;
300 *result = e;
301 return MATCH_YES;
305 gfc_free_expr (e);
306 gfc_current_locus = old_loc;
307 return MATCH_NO;
309 cleanup:
310 gfc_free_expr (e);
311 return MATCH_ERROR;
315 /* Match a binary, octal or hexadecimal constant that can be found in
316 a DATA statement. The standard permits b'010...', o'73...', and
317 z'a1...' where b, o, and z can be capital letters. This function
318 also accepts postfixed forms of the constants: '01...'b, '73...'o,
319 and 'a1...'z. An additional extension is the use of x for z. */
321 static match
322 match_boz_constant (gfc_expr **result)
324 int radix, length, x_hex, kind;
325 locus old_loc, start_loc;
326 char *buffer, post, delim;
327 gfc_expr *e;
329 start_loc = old_loc = gfc_current_locus;
330 gfc_gobble_whitespace ();
332 x_hex = 0;
333 switch (post = gfc_next_ascii_char ())
335 case 'b':
336 radix = 2;
337 post = 0;
338 break;
339 case 'o':
340 radix = 8;
341 post = 0;
342 break;
343 case 'x':
344 x_hex = 1;
345 /* Fall through. */
346 case 'z':
347 radix = 16;
348 post = 0;
349 break;
350 case '\'':
351 /* Fall through. */
352 case '\"':
353 delim = post;
354 post = 1;
355 radix = 16; /* Set to accept any valid digit string. */
356 break;
357 default:
358 goto backup;
361 /* No whitespace allowed here. */
363 if (post == 0)
364 delim = gfc_next_ascii_char ();
366 if (delim != '\'' && delim != '\"')
367 goto backup;
369 if (x_hex
370 && (gfc_notify_std (GFC_STD_GNU, "Extension: Hexadecimal "
371 "constant at %C uses non-standard syntax")
372 == FAILURE))
373 return MATCH_ERROR;
375 old_loc = gfc_current_locus;
377 length = match_digits (0, radix, NULL);
378 if (length == -1)
380 gfc_error ("Empty set of digits in BOZ constant at %C");
381 return MATCH_ERROR;
384 if (gfc_next_ascii_char () != delim)
386 gfc_error ("Illegal character in BOZ constant at %C");
387 return MATCH_ERROR;
390 if (post == 1)
392 switch (gfc_next_ascii_char ())
394 case 'b':
395 radix = 2;
396 break;
397 case 'o':
398 radix = 8;
399 break;
400 case 'x':
401 /* Fall through. */
402 case 'z':
403 radix = 16;
404 break;
405 default:
406 goto backup;
409 if (gfc_notify_std (GFC_STD_GNU, "Extension: BOZ constant "
410 "at %C uses non-standard postfix syntax")
411 == FAILURE)
412 return MATCH_ERROR;
415 gfc_current_locus = old_loc;
417 buffer = (char *) alloca (length + 1);
418 memset (buffer, '\0', length + 1);
420 match_digits (0, radix, buffer);
421 gfc_next_ascii_char (); /* Eat delimiter. */
422 if (post == 1)
423 gfc_next_ascii_char (); /* Eat postfixed b, o, z, or x. */
425 /* In section 5.2.5 and following C567 in the Fortran 2003 standard, we find
426 "If a data-stmt-constant is a boz-literal-constant, the corresponding
427 variable shall be of type integer. The boz-literal-constant is treated
428 as if it were an int-literal-constant with a kind-param that specifies
429 the representation method with the largest decimal exponent range
430 supported by the processor." */
432 kind = gfc_max_integer_kind;
433 e = gfc_convert_integer (buffer, kind, radix, &gfc_current_locus);
435 /* Mark as boz variable. */
436 e->is_boz = 1;
438 if (gfc_range_check (e) != ARITH_OK)
440 gfc_error ("Integer too big for integer kind %i at %C", kind);
441 gfc_free_expr (e);
442 return MATCH_ERROR;
445 if (!gfc_in_match_data ()
446 && (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: BOZ used outside a DATA "
447 "statement at %C")
448 == FAILURE))
449 return MATCH_ERROR;
451 *result = e;
452 return MATCH_YES;
454 backup:
455 gfc_current_locus = start_loc;
456 return MATCH_NO;
460 /* Match a real constant of some sort. Allow a signed constant if signflag
461 is nonzero. */
463 static match
464 match_real_constant (gfc_expr **result, int signflag)
466 int kind, count, seen_dp, seen_digits;
467 locus old_loc, temp_loc;
468 char *p, *buffer, c, exp_char;
469 gfc_expr *e;
470 bool negate;
472 old_loc = gfc_current_locus;
473 gfc_gobble_whitespace ();
475 e = NULL;
477 count = 0;
478 seen_dp = 0;
479 seen_digits = 0;
480 exp_char = ' ';
481 negate = FALSE;
483 c = gfc_next_ascii_char ();
484 if (signflag && (c == '+' || c == '-'))
486 if (c == '-')
487 negate = TRUE;
489 gfc_gobble_whitespace ();
490 c = gfc_next_ascii_char ();
493 /* Scan significand. */
494 for (;; c = gfc_next_ascii_char (), count++)
496 if (c == '.')
498 if (seen_dp)
499 goto done;
501 /* Check to see if "." goes with a following operator like
502 ".eq.". */
503 temp_loc = gfc_current_locus;
504 c = gfc_next_ascii_char ();
506 if (c == 'e' || c == 'd' || c == 'q')
508 c = gfc_next_ascii_char ();
509 if (c == '.')
510 goto done; /* Operator named .e. or .d. */
513 if (ISALPHA (c))
514 goto done; /* Distinguish 1.e9 from 1.eq.2 */
516 gfc_current_locus = temp_loc;
517 seen_dp = 1;
518 continue;
521 if (ISDIGIT (c))
523 seen_digits = 1;
524 continue;
527 break;
530 if (!seen_digits || (c != 'e' && c != 'd' && c != 'q'))
531 goto done;
532 exp_char = c;
534 /* Scan exponent. */
535 c = gfc_next_ascii_char ();
536 count++;
538 if (c == '+' || c == '-')
539 { /* optional sign */
540 c = gfc_next_ascii_char ();
541 count++;
544 if (!ISDIGIT (c))
546 gfc_error ("Missing exponent in real number at %C");
547 return MATCH_ERROR;
550 while (ISDIGIT (c))
552 c = gfc_next_ascii_char ();
553 count++;
556 done:
557 /* Check that we have a numeric constant. */
558 if (!seen_digits || (!seen_dp && exp_char == ' '))
560 gfc_current_locus = old_loc;
561 return MATCH_NO;
564 /* Convert the number. */
565 gfc_current_locus = old_loc;
566 gfc_gobble_whitespace ();
568 buffer = (char *) alloca (count + 1);
569 memset (buffer, '\0', count + 1);
571 p = buffer;
572 c = gfc_next_ascii_char ();
573 if (c == '+' || c == '-')
575 gfc_gobble_whitespace ();
576 c = gfc_next_ascii_char ();
579 /* Hack for mpfr_set_str(). */
580 for (;;)
582 if (c == 'd' || c == 'q')
583 *p = 'e';
584 else
585 *p = c;
586 p++;
587 if (--count == 0)
588 break;
590 c = gfc_next_ascii_char ();
593 kind = get_kind ();
594 if (kind == -1)
595 goto cleanup;
597 switch (exp_char)
599 case 'd':
600 if (kind != -2)
602 gfc_error ("Real number at %C has a 'd' exponent and an explicit "
603 "kind");
604 goto cleanup;
606 kind = gfc_default_double_kind;
607 break;
609 default:
610 if (kind == -2)
611 kind = gfc_default_real_kind;
613 if (gfc_validate_kind (BT_REAL, kind, true) < 0)
615 gfc_error ("Invalid real kind %d at %C", kind);
616 goto cleanup;
620 e = gfc_convert_real (buffer, kind, &gfc_current_locus);
621 if (negate)
622 mpfr_neg (e->value.real, e->value.real, GFC_RND_MODE);
624 switch (gfc_range_check (e))
626 case ARITH_OK:
627 break;
628 case ARITH_OVERFLOW:
629 gfc_error ("Real constant overflows its kind at %C");
630 goto cleanup;
632 case ARITH_UNDERFLOW:
633 if (gfc_option.warn_underflow)
634 gfc_warning ("Real constant underflows its kind at %C");
635 mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
636 break;
638 default:
639 gfc_internal_error ("gfc_range_check() returned bad value");
642 *result = e;
643 return MATCH_YES;
645 cleanup:
646 gfc_free_expr (e);
647 return MATCH_ERROR;
651 /* Match a substring reference. */
653 static match
654 match_substring (gfc_charlen *cl, int init, gfc_ref **result)
656 gfc_expr *start, *end;
657 locus old_loc;
658 gfc_ref *ref;
659 match m;
661 start = NULL;
662 end = NULL;
664 old_loc = gfc_current_locus;
666 m = gfc_match_char ('(');
667 if (m != MATCH_YES)
668 return MATCH_NO;
670 if (gfc_match_char (':') != MATCH_YES)
672 if (init)
673 m = gfc_match_init_expr (&start);
674 else
675 m = gfc_match_expr (&start);
677 if (m != MATCH_YES)
679 m = MATCH_NO;
680 goto cleanup;
683 m = gfc_match_char (':');
684 if (m != MATCH_YES)
685 goto cleanup;
688 if (gfc_match_char (')') != MATCH_YES)
690 if (init)
691 m = gfc_match_init_expr (&end);
692 else
693 m = gfc_match_expr (&end);
695 if (m == MATCH_NO)
696 goto syntax;
697 if (m == MATCH_ERROR)
698 goto cleanup;
700 m = gfc_match_char (')');
701 if (m == MATCH_NO)
702 goto syntax;
705 /* Optimize away the (:) reference. */
706 if (start == NULL && end == NULL)
707 ref = NULL;
708 else
710 ref = gfc_get_ref ();
712 ref->type = REF_SUBSTRING;
713 if (start == NULL)
714 start = gfc_int_expr (1);
715 ref->u.ss.start = start;
716 if (end == NULL && cl)
717 end = gfc_copy_expr (cl->length);
718 ref->u.ss.end = end;
719 ref->u.ss.length = cl;
722 *result = ref;
723 return MATCH_YES;
725 syntax:
726 gfc_error ("Syntax error in SUBSTRING specification at %C");
727 m = MATCH_ERROR;
729 cleanup:
730 gfc_free_expr (start);
731 gfc_free_expr (end);
733 gfc_current_locus = old_loc;
734 return m;
738 /* Reads the next character of a string constant, taking care to
739 return doubled delimiters on the input as a single instance of
740 the delimiter.
742 Special return values for "ret" argument are:
743 -1 End of the string, as determined by the delimiter
744 -2 Unterminated string detected
746 Backslash codes are also expanded at this time. */
748 static gfc_char_t
749 next_string_char (gfc_char_t delimiter, int *ret)
751 locus old_locus;
752 gfc_char_t c;
754 c = gfc_next_char_literal (1);
755 *ret = 0;
757 if (c == '\n')
759 *ret = -2;
760 return 0;
763 if (gfc_option.flag_backslash && c == '\\')
765 old_locus = gfc_current_locus;
767 if (gfc_match_special_char (&c) == MATCH_NO)
768 gfc_current_locus = old_locus;
770 if (!(gfc_option.allow_std & GFC_STD_GNU) && !inhibit_warnings)
771 gfc_warning ("Extension: backslash character at %C");
774 if (c != delimiter)
775 return c;
777 old_locus = gfc_current_locus;
778 c = gfc_next_char_literal (0);
780 if (c == delimiter)
781 return c;
782 gfc_current_locus = old_locus;
784 *ret = -1;
785 return 0;
789 /* Special case of gfc_match_name() that matches a parameter kind name
790 before a string constant. This takes case of the weird but legal
791 case of:
793 kind_____'string'
795 where kind____ is a parameter. gfc_match_name() will happily slurp
796 up all the underscores, which leads to problems. If we return
797 MATCH_YES, the parse pointer points to the final underscore, which
798 is not part of the name. We never return MATCH_ERROR-- errors in
799 the name will be detected later. */
801 static match
802 match_charkind_name (char *name)
804 locus old_loc;
805 char c, peek;
806 int len;
808 gfc_gobble_whitespace ();
809 c = gfc_next_ascii_char ();
810 if (!ISALPHA (c))
811 return MATCH_NO;
813 *name++ = c;
814 len = 1;
816 for (;;)
818 old_loc = gfc_current_locus;
819 c = gfc_next_ascii_char ();
821 if (c == '_')
823 peek = gfc_peek_ascii_char ();
825 if (peek == '\'' || peek == '\"')
827 gfc_current_locus = old_loc;
828 *name = '\0';
829 return MATCH_YES;
833 if (!ISALNUM (c)
834 && c != '_'
835 && (gfc_option.flag_dollar_ok && c != '$'))
836 break;
838 *name++ = c;
839 if (++len > GFC_MAX_SYMBOL_LEN)
840 break;
843 return MATCH_NO;
847 /* See if the current input matches a character constant. Lots of
848 contortions have to be done to match the kind parameter which comes
849 before the actual string. The main consideration is that we don't
850 want to error out too quickly. For example, we don't actually do
851 any validation of the kinds until we have actually seen a legal
852 delimiter. Using match_kind_param() generates errors too quickly. */
854 static match
855 match_string_constant (gfc_expr **result)
857 char name[GFC_MAX_SYMBOL_LEN + 1], peek;
858 int i, kind, length, warn_ampersand, ret;
859 locus old_locus, start_locus;
860 gfc_symbol *sym;
861 gfc_expr *e;
862 const char *q;
863 match m;
864 gfc_char_t c, delimiter, *p;
866 old_locus = gfc_current_locus;
868 gfc_gobble_whitespace ();
870 start_locus = gfc_current_locus;
872 c = gfc_next_char ();
873 if (c == '\'' || c == '"')
875 kind = gfc_default_character_kind;
876 goto got_delim;
879 if (gfc_wide_is_digit (c))
881 kind = 0;
883 while (gfc_wide_is_digit (c))
885 kind = kind * 10 + c - '0';
886 if (kind > 9999999)
887 goto no_match;
888 c = gfc_next_char ();
892 else
894 gfc_current_locus = old_locus;
896 m = match_charkind_name (name);
897 if (m != MATCH_YES)
898 goto no_match;
900 if (gfc_find_symbol (name, NULL, 1, &sym)
901 || sym == NULL
902 || sym->attr.flavor != FL_PARAMETER)
903 goto no_match;
905 kind = -1;
906 c = gfc_next_char ();
909 if (c == ' ')
911 gfc_gobble_whitespace ();
912 c = gfc_next_char ();
915 if (c != '_')
916 goto no_match;
918 gfc_gobble_whitespace ();
919 start_locus = gfc_current_locus;
921 c = gfc_next_char ();
922 if (c != '\'' && c != '"')
923 goto no_match;
925 if (kind == -1)
927 q = gfc_extract_int (sym->value, &kind);
928 if (q != NULL)
930 gfc_error (q);
931 return MATCH_ERROR;
933 gfc_set_sym_referenced (sym);
936 if (gfc_validate_kind (BT_CHARACTER, kind, true) < 0)
938 gfc_error ("Invalid kind %d for CHARACTER constant at %C", kind);
939 return MATCH_ERROR;
942 got_delim:
943 /* Scan the string into a block of memory by first figuring out how
944 long it is, allocating the structure, then re-reading it. This
945 isn't particularly efficient, but string constants aren't that
946 common in most code. TODO: Use obstacks? */
948 delimiter = c;
949 length = 0;
951 for (;;)
953 c = next_string_char (delimiter, &ret);
954 if (ret == -1)
955 break;
956 if (ret == -2)
958 gfc_current_locus = start_locus;
959 gfc_error ("Unterminated character constant beginning at %C");
960 return MATCH_ERROR;
963 length++;
966 /* Peek at the next character to see if it is a b, o, z, or x for the
967 postfixed BOZ literal constants. */
968 peek = gfc_peek_ascii_char ();
969 if (peek == 'b' || peek == 'o' || peek =='z' || peek == 'x')
970 goto no_match;
973 e = gfc_get_expr ();
975 e->expr_type = EXPR_CONSTANT;
976 e->ref = NULL;
977 e->ts.type = BT_CHARACTER;
978 e->ts.kind = kind;
979 e->ts.is_c_interop = 0;
980 e->ts.is_iso_c = 0;
981 e->where = start_locus;
983 e->value.character.string = p = gfc_get_wide_string (length + 1);
984 e->value.character.length = length;
986 gfc_current_locus = start_locus;
987 gfc_next_char (); /* Skip delimiter */
989 /* We disable the warning for the following loop as the warning has already
990 been printed in the loop above. */
991 warn_ampersand = gfc_option.warn_ampersand;
992 gfc_option.warn_ampersand = 0;
994 for (i = 0; i < length; i++)
996 c = next_string_char (delimiter, &ret);
998 if (!gfc_check_character_range (c, kind))
1000 gfc_error ("Character '%s' in string at %C is not representable "
1001 "in character kind %d", gfc_print_wide_char (c), kind);
1002 return MATCH_ERROR;
1005 *p++ = c;
1008 *p = '\0'; /* TODO: C-style string is for development/debug purposes. */
1009 gfc_option.warn_ampersand = warn_ampersand;
1011 next_string_char (delimiter, &ret);
1012 if (ret != -1)
1013 gfc_internal_error ("match_string_constant(): Delimiter not found");
1015 if (match_substring (NULL, 0, &e->ref) != MATCH_NO)
1016 e->expr_type = EXPR_SUBSTRING;
1018 *result = e;
1020 return MATCH_YES;
1022 no_match:
1023 gfc_current_locus = old_locus;
1024 return MATCH_NO;
1028 /* Match a .true. or .false. Returns 1 if a .true. was found,
1029 0 if a .false. was found, and -1 otherwise. */
1030 static int
1031 match_logical_constant_string (void)
1033 locus orig_loc = gfc_current_locus;
1035 gfc_gobble_whitespace ();
1036 if (gfc_next_ascii_char () == '.')
1038 char ch = gfc_next_ascii_char ();
1039 if (ch == 'f')
1041 if (gfc_next_ascii_char () == 'a'
1042 && gfc_next_ascii_char () == 'l'
1043 && gfc_next_ascii_char () == 's'
1044 && gfc_next_ascii_char () == 'e'
1045 && gfc_next_ascii_char () == '.')
1046 /* Matched ".false.". */
1047 return 0;
1049 else if (ch == 't')
1051 if (gfc_next_ascii_char () == 'r'
1052 && gfc_next_ascii_char () == 'u'
1053 && gfc_next_ascii_char () == 'e'
1054 && gfc_next_ascii_char () == '.')
1055 /* Matched ".true.". */
1056 return 1;
1059 gfc_current_locus = orig_loc;
1060 return -1;
1063 /* Match a .true. or .false. */
1065 static match
1066 match_logical_constant (gfc_expr **result)
1068 gfc_expr *e;
1069 int i, kind;
1071 i = match_logical_constant_string ();
1072 if (i == -1)
1073 return MATCH_NO;
1075 kind = get_kind ();
1076 if (kind == -1)
1077 return MATCH_ERROR;
1078 if (kind == -2)
1079 kind = gfc_default_logical_kind;
1081 if (gfc_validate_kind (BT_LOGICAL, kind, true) < 0)
1083 gfc_error ("Bad kind for logical constant at %C");
1084 return MATCH_ERROR;
1087 e = gfc_get_expr ();
1089 e->expr_type = EXPR_CONSTANT;
1090 e->value.logical = i;
1091 e->ts.type = BT_LOGICAL;
1092 e->ts.kind = kind;
1093 e->ts.is_c_interop = 0;
1094 e->ts.is_iso_c = 0;
1095 e->where = gfc_current_locus;
1097 *result = e;
1098 return MATCH_YES;
1102 /* Match a real or imaginary part of a complex constant that is a
1103 symbolic constant. */
1105 static match
1106 match_sym_complex_part (gfc_expr **result)
1108 char name[GFC_MAX_SYMBOL_LEN + 1];
1109 gfc_symbol *sym;
1110 gfc_expr *e;
1111 match m;
1113 m = gfc_match_name (name);
1114 if (m != MATCH_YES)
1115 return m;
1117 if (gfc_find_symbol (name, NULL, 1, &sym) || sym == NULL)
1118 return MATCH_NO;
1120 if (sym->attr.flavor != FL_PARAMETER)
1122 gfc_error ("Expected PARAMETER symbol in complex constant at %C");
1123 return MATCH_ERROR;
1126 if (!gfc_numeric_ts (&sym->value->ts))
1128 gfc_error ("Numeric PARAMETER required in complex constant at %C");
1129 return MATCH_ERROR;
1132 if (sym->value->rank != 0)
1134 gfc_error ("Scalar PARAMETER required in complex constant at %C");
1135 return MATCH_ERROR;
1138 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: PARAMETER symbol in "
1139 "complex constant at %C") == FAILURE)
1140 return MATCH_ERROR;
1142 switch (sym->value->ts.type)
1144 case BT_REAL:
1145 e = gfc_copy_expr (sym->value);
1146 break;
1148 case BT_COMPLEX:
1149 e = gfc_complex2real (sym->value, sym->value->ts.kind);
1150 if (e == NULL)
1151 goto error;
1152 break;
1154 case BT_INTEGER:
1155 e = gfc_int2real (sym->value, gfc_default_real_kind);
1156 if (e == NULL)
1157 goto error;
1158 break;
1160 default:
1161 gfc_internal_error ("gfc_match_sym_complex_part(): Bad type");
1164 *result = e; /* e is a scalar, real, constant expression. */
1165 return MATCH_YES;
1167 error:
1168 gfc_error ("Error converting PARAMETER constant in complex constant at %C");
1169 return MATCH_ERROR;
1173 /* Match a real or imaginary part of a complex number. */
1175 static match
1176 match_complex_part (gfc_expr **result)
1178 match m;
1180 m = match_sym_complex_part (result);
1181 if (m != MATCH_NO)
1182 return m;
1184 m = match_real_constant (result, 1);
1185 if (m != MATCH_NO)
1186 return m;
1188 return match_integer_constant (result, 1);
1192 /* Try to match a complex constant. */
1194 static match
1195 match_complex_constant (gfc_expr **result)
1197 gfc_expr *e, *real, *imag;
1198 gfc_error_buf old_error;
1199 gfc_typespec target;
1200 locus old_loc;
1201 int kind;
1202 match m;
1204 old_loc = gfc_current_locus;
1205 real = imag = e = NULL;
1207 m = gfc_match_char ('(');
1208 if (m != MATCH_YES)
1209 return m;
1211 gfc_push_error (&old_error);
1213 m = match_complex_part (&real);
1214 if (m == MATCH_NO)
1216 gfc_free_error (&old_error);
1217 goto cleanup;
1220 if (gfc_match_char (',') == MATCH_NO)
1222 gfc_pop_error (&old_error);
1223 m = MATCH_NO;
1224 goto cleanup;
1227 /* If m is error, then something was wrong with the real part and we
1228 assume we have a complex constant because we've seen the ','. An
1229 ambiguous case here is the start of an iterator list of some
1230 sort. These sort of lists are matched prior to coming here. */
1232 if (m == MATCH_ERROR)
1234 gfc_free_error (&old_error);
1235 goto cleanup;
1237 gfc_pop_error (&old_error);
1239 m = match_complex_part (&imag);
1240 if (m == MATCH_NO)
1241 goto syntax;
1242 if (m == MATCH_ERROR)
1243 goto cleanup;
1245 m = gfc_match_char (')');
1246 if (m == MATCH_NO)
1248 /* Give the matcher for implied do-loops a chance to run. This
1249 yields a much saner error message for (/ (i, 4=i, 6) /). */
1250 if (gfc_peek_ascii_char () == '=')
1252 m = MATCH_ERROR;
1253 goto cleanup;
1255 else
1256 goto syntax;
1259 if (m == MATCH_ERROR)
1260 goto cleanup;
1262 /* Decide on the kind of this complex number. */
1263 if (real->ts.type == BT_REAL)
1265 if (imag->ts.type == BT_REAL)
1266 kind = gfc_kind_max (real, imag);
1267 else
1268 kind = real->ts.kind;
1270 else
1272 if (imag->ts.type == BT_REAL)
1273 kind = imag->ts.kind;
1274 else
1275 kind = gfc_default_real_kind;
1277 target.type = BT_REAL;
1278 target.kind = kind;
1279 target.is_c_interop = 0;
1280 target.is_iso_c = 0;
1282 if (real->ts.type != BT_REAL || kind != real->ts.kind)
1283 gfc_convert_type (real, &target, 2);
1284 if (imag->ts.type != BT_REAL || kind != imag->ts.kind)
1285 gfc_convert_type (imag, &target, 2);
1287 e = gfc_convert_complex (real, imag, kind);
1288 e->where = gfc_current_locus;
1290 gfc_free_expr (real);
1291 gfc_free_expr (imag);
1293 *result = e;
1294 return MATCH_YES;
1296 syntax:
1297 gfc_error ("Syntax error in COMPLEX constant at %C");
1298 m = MATCH_ERROR;
1300 cleanup:
1301 gfc_free_expr (e);
1302 gfc_free_expr (real);
1303 gfc_free_expr (imag);
1304 gfc_current_locus = old_loc;
1306 return m;
1310 /* Match constants in any of several forms. Returns nonzero for a
1311 match, zero for no match. */
1313 match
1314 gfc_match_literal_constant (gfc_expr **result, int signflag)
1316 match m;
1318 m = match_complex_constant (result);
1319 if (m != MATCH_NO)
1320 return m;
1322 m = match_string_constant (result);
1323 if (m != MATCH_NO)
1324 return m;
1326 m = match_boz_constant (result);
1327 if (m != MATCH_NO)
1328 return m;
1330 m = match_real_constant (result, signflag);
1331 if (m != MATCH_NO)
1332 return m;
1334 m = match_hollerith_constant (result);
1335 if (m != MATCH_NO)
1336 return m;
1338 m = match_integer_constant (result, signflag);
1339 if (m != MATCH_NO)
1340 return m;
1342 m = match_logical_constant (result);
1343 if (m != MATCH_NO)
1344 return m;
1346 return MATCH_NO;
1350 /* Match a single actual argument value. An actual argument is
1351 usually an expression, but can also be a procedure name. If the
1352 argument is a single name, it is not always possible to tell
1353 whether the name is a dummy procedure or not. We treat these cases
1354 by creating an argument that looks like a dummy procedure and
1355 fixing things later during resolution. */
1357 static match
1358 match_actual_arg (gfc_expr **result)
1360 char name[GFC_MAX_SYMBOL_LEN + 1];
1361 gfc_symtree *symtree;
1362 locus where, w;
1363 gfc_expr *e;
1364 char c;
1366 gfc_gobble_whitespace ();
1367 where = gfc_current_locus;
1369 switch (gfc_match_name (name))
1371 case MATCH_ERROR:
1372 return MATCH_ERROR;
1374 case MATCH_NO:
1375 break;
1377 case MATCH_YES:
1378 w = gfc_current_locus;
1379 gfc_gobble_whitespace ();
1380 c = gfc_next_ascii_char ();
1381 gfc_current_locus = w;
1383 if (c != ',' && c != ')')
1384 break;
1386 if (gfc_find_sym_tree (name, NULL, 1, &symtree))
1387 break;
1388 /* Handle error elsewhere. */
1390 /* Eliminate a couple of common cases where we know we don't
1391 have a function argument. */
1392 if (symtree == NULL)
1394 gfc_get_sym_tree (name, NULL, &symtree, false);
1395 gfc_set_sym_referenced (symtree->n.sym);
1397 else
1399 gfc_symbol *sym;
1401 sym = symtree->n.sym;
1402 gfc_set_sym_referenced (sym);
1403 if (sym->attr.flavor != FL_PROCEDURE
1404 && sym->attr.flavor != FL_UNKNOWN)
1405 break;
1407 if (sym->attr.in_common && !sym->attr.proc_pointer)
1409 gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name,
1410 &sym->declared_at);
1411 break;
1414 /* If the symbol is a function with itself as the result and
1415 is being defined, then we have a variable. */
1416 if (sym->attr.function && sym->result == sym)
1418 if (gfc_current_ns->proc_name == sym
1419 || (gfc_current_ns->parent != NULL
1420 && gfc_current_ns->parent->proc_name == sym))
1421 break;
1423 if (sym->attr.entry
1424 && (sym->ns == gfc_current_ns
1425 || sym->ns == gfc_current_ns->parent))
1427 gfc_entry_list *el = NULL;
1429 for (el = sym->ns->entries; el; el = el->next)
1430 if (sym == el->sym)
1431 break;
1433 if (el)
1434 break;
1439 e = gfc_get_expr (); /* Leave it unknown for now */
1440 e->symtree = symtree;
1441 e->expr_type = EXPR_VARIABLE;
1442 e->ts.type = BT_PROCEDURE;
1443 e->where = where;
1445 *result = e;
1446 return MATCH_YES;
1449 gfc_current_locus = where;
1450 return gfc_match_expr (result);
1454 /* Match a keyword argument. */
1456 static match
1457 match_keyword_arg (gfc_actual_arglist *actual, gfc_actual_arglist *base)
1459 char name[GFC_MAX_SYMBOL_LEN + 1];
1460 gfc_actual_arglist *a;
1461 locus name_locus;
1462 match m;
1464 name_locus = gfc_current_locus;
1465 m = gfc_match_name (name);
1467 if (m != MATCH_YES)
1468 goto cleanup;
1469 if (gfc_match_char ('=') != MATCH_YES)
1471 m = MATCH_NO;
1472 goto cleanup;
1475 m = match_actual_arg (&actual->expr);
1476 if (m != MATCH_YES)
1477 goto cleanup;
1479 /* Make sure this name has not appeared yet. */
1481 if (name[0] != '\0')
1483 for (a = base; a; a = a->next)
1484 if (a->name != NULL && strcmp (a->name, name) == 0)
1486 gfc_error ("Keyword '%s' at %C has already appeared in the "
1487 "current argument list", name);
1488 return MATCH_ERROR;
1492 actual->name = gfc_get_string (name);
1493 return MATCH_YES;
1495 cleanup:
1496 gfc_current_locus = name_locus;
1497 return m;
1501 /* Match an argument list function, such as %VAL. */
1503 static match
1504 match_arg_list_function (gfc_actual_arglist *result)
1506 char name[GFC_MAX_SYMBOL_LEN + 1];
1507 locus old_locus;
1508 match m;
1510 old_locus = gfc_current_locus;
1512 if (gfc_match_char ('%') != MATCH_YES)
1514 m = MATCH_NO;
1515 goto cleanup;
1518 m = gfc_match ("%n (", name);
1519 if (m != MATCH_YES)
1520 goto cleanup;
1522 if (name[0] != '\0')
1524 switch (name[0])
1526 case 'l':
1527 if (strncmp (name, "loc", 3) == 0)
1529 result->name = "%LOC";
1530 break;
1532 case 'r':
1533 if (strncmp (name, "ref", 3) == 0)
1535 result->name = "%REF";
1536 break;
1538 case 'v':
1539 if (strncmp (name, "val", 3) == 0)
1541 result->name = "%VAL";
1542 break;
1544 default:
1545 m = MATCH_ERROR;
1546 goto cleanup;
1550 if (gfc_notify_std (GFC_STD_GNU, "Extension: argument list "
1551 "function at %C") == FAILURE)
1553 m = MATCH_ERROR;
1554 goto cleanup;
1557 m = match_actual_arg (&result->expr);
1558 if (m != MATCH_YES)
1559 goto cleanup;
1561 if (gfc_match_char (')') != MATCH_YES)
1563 m = MATCH_NO;
1564 goto cleanup;
1567 return MATCH_YES;
1569 cleanup:
1570 gfc_current_locus = old_locus;
1571 return m;
1575 /* Matches an actual argument list of a function or subroutine, from
1576 the opening parenthesis to the closing parenthesis. The argument
1577 list is assumed to allow keyword arguments because we don't know if
1578 the symbol associated with the procedure has an implicit interface
1579 or not. We make sure keywords are unique. If sub_flag is set,
1580 we're matching the argument list of a subroutine. */
1582 match
1583 gfc_match_actual_arglist (int sub_flag, gfc_actual_arglist **argp)
1585 gfc_actual_arglist *head, *tail;
1586 int seen_keyword;
1587 gfc_st_label *label;
1588 locus old_loc;
1589 match m;
1591 *argp = tail = NULL;
1592 old_loc = gfc_current_locus;
1594 seen_keyword = 0;
1596 if (gfc_match_char ('(') == MATCH_NO)
1597 return (sub_flag) ? MATCH_YES : MATCH_NO;
1599 if (gfc_match_char (')') == MATCH_YES)
1600 return MATCH_YES;
1601 head = NULL;
1603 for (;;)
1605 if (head == NULL)
1606 head = tail = gfc_get_actual_arglist ();
1607 else
1609 tail->next = gfc_get_actual_arglist ();
1610 tail = tail->next;
1613 if (sub_flag && gfc_match_char ('*') == MATCH_YES)
1615 m = gfc_match_st_label (&label);
1616 if (m == MATCH_NO)
1617 gfc_error ("Expected alternate return label at %C");
1618 if (m != MATCH_YES)
1619 goto cleanup;
1621 tail->label = label;
1622 goto next;
1625 /* After the first keyword argument is seen, the following
1626 arguments must also have keywords. */
1627 if (seen_keyword)
1629 m = match_keyword_arg (tail, head);
1631 if (m == MATCH_ERROR)
1632 goto cleanup;
1633 if (m == MATCH_NO)
1635 gfc_error ("Missing keyword name in actual argument list at %C");
1636 goto cleanup;
1640 else
1642 /* Try an argument list function, like %VAL. */
1643 m = match_arg_list_function (tail);
1644 if (m == MATCH_ERROR)
1645 goto cleanup;
1647 /* See if we have the first keyword argument. */
1648 if (m == MATCH_NO)
1650 m = match_keyword_arg (tail, head);
1651 if (m == MATCH_YES)
1652 seen_keyword = 1;
1653 if (m == MATCH_ERROR)
1654 goto cleanup;
1657 if (m == MATCH_NO)
1659 /* Try for a non-keyword argument. */
1660 m = match_actual_arg (&tail->expr);
1661 if (m == MATCH_ERROR)
1662 goto cleanup;
1663 if (m == MATCH_NO)
1664 goto syntax;
1669 next:
1670 if (gfc_match_char (')') == MATCH_YES)
1671 break;
1672 if (gfc_match_char (',') != MATCH_YES)
1673 goto syntax;
1676 *argp = head;
1677 return MATCH_YES;
1679 syntax:
1680 gfc_error ("Syntax error in argument list at %C");
1682 cleanup:
1683 gfc_free_actual_arglist (head);
1684 gfc_current_locus = old_loc;
1686 return MATCH_ERROR;
1690 /* Used by gfc_match_varspec() to extend the reference list by one
1691 element. */
1693 static gfc_ref *
1694 extend_ref (gfc_expr *primary, gfc_ref *tail)
1696 if (primary->ref == NULL)
1697 primary->ref = tail = gfc_get_ref ();
1698 else
1700 if (tail == NULL)
1701 gfc_internal_error ("extend_ref(): Bad tail");
1702 tail->next = gfc_get_ref ();
1703 tail = tail->next;
1706 return tail;
1710 /* Match any additional specifications associated with the current
1711 variable like member references or substrings. If equiv_flag is
1712 set we only match stuff that is allowed inside an EQUIVALENCE
1713 statement. sub_flag tells whether we expect a type-bound procedure found
1714 to be a subroutine as part of CALL or a FUNCTION. For procedure pointer
1715 components, 'ppc_arg' determines whether the PPC may be called (with an
1716 argument list), or whether it may just be referred to as a pointer. */
1718 match
1719 gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag,
1720 bool ppc_arg)
1722 char name[GFC_MAX_SYMBOL_LEN + 1];
1723 gfc_ref *substring, *tail;
1724 gfc_component *component;
1725 gfc_symbol *sym = primary->symtree->n.sym;
1726 match m;
1727 bool unknown;
1729 tail = NULL;
1731 gfc_gobble_whitespace ();
1732 if ((equiv_flag && gfc_peek_ascii_char () == '(')
1733 || (sym->attr.dimension && !sym->attr.proc_pointer
1734 && !gfc_is_proc_ptr_comp (primary, NULL)
1735 && !(gfc_matching_procptr_assignment
1736 && sym->attr.flavor == FL_PROCEDURE)))
1738 /* In EQUIVALENCE, we don't know yet whether we are seeing
1739 an array, character variable or array of character
1740 variables. We'll leave the decision till resolve time. */
1741 tail = extend_ref (primary, tail);
1742 tail->type = REF_ARRAY;
1744 m = gfc_match_array_ref (&tail->u.ar, equiv_flag ? NULL : sym->as,
1745 equiv_flag);
1746 if (m != MATCH_YES)
1747 return m;
1749 gfc_gobble_whitespace ();
1750 if (equiv_flag && gfc_peek_ascii_char () == '(')
1752 tail = extend_ref (primary, tail);
1753 tail->type = REF_ARRAY;
1755 m = gfc_match_array_ref (&tail->u.ar, NULL, equiv_flag);
1756 if (m != MATCH_YES)
1757 return m;
1761 primary->ts = sym->ts;
1763 if (equiv_flag)
1764 return MATCH_YES;
1766 if (sym->ts.type == BT_UNKNOWN && gfc_peek_ascii_char () == '%'
1767 && gfc_get_default_type (sym->name, sym->ns)->type == BT_DERIVED)
1768 gfc_set_default_type (sym, 0, sym->ns);
1770 if (sym->ts.type != BT_DERIVED || gfc_match_char ('%') != MATCH_YES)
1771 goto check_substring;
1773 sym = sym->ts.derived;
1775 for (;;)
1777 gfc_try t;
1778 gfc_symtree *tbp;
1780 m = gfc_match_name (name);
1781 if (m == MATCH_NO)
1782 gfc_error ("Expected structure component name at %C");
1783 if (m != MATCH_YES)
1784 return MATCH_ERROR;
1786 tbp = gfc_find_typebound_proc (sym, &t, name, false);
1787 if (tbp)
1789 gfc_symbol* tbp_sym;
1791 if (t == FAILURE)
1792 return MATCH_ERROR;
1794 gcc_assert (!tail || !tail->next);
1795 gcc_assert (primary->expr_type == EXPR_VARIABLE);
1797 if (tbp->n.tb->is_generic)
1798 tbp_sym = NULL;
1799 else
1800 tbp_sym = tbp->n.tb->u.specific->n.sym;
1802 primary->expr_type = EXPR_COMPCALL;
1803 primary->value.compcall.tbp = tbp->n.tb;
1804 primary->value.compcall.name = tbp->name;
1805 gcc_assert (primary->symtree->n.sym->attr.referenced);
1806 if (tbp_sym)
1807 primary->ts = tbp_sym->ts;
1809 m = gfc_match_actual_arglist (tbp->n.tb->subroutine,
1810 &primary->value.compcall.actual);
1811 if (m == MATCH_ERROR)
1812 return MATCH_ERROR;
1813 if (m == MATCH_NO)
1815 if (sub_flag)
1816 primary->value.compcall.actual = NULL;
1817 else
1819 gfc_error ("Expected argument list at %C");
1820 return MATCH_ERROR;
1824 break;
1827 component = gfc_find_component (sym, name, false, false);
1828 if (component == NULL)
1829 return MATCH_ERROR;
1831 tail = extend_ref (primary, tail);
1832 tail->type = REF_COMPONENT;
1834 tail->u.c.component = component;
1835 tail->u.c.sym = sym;
1837 primary->ts = component->ts;
1839 if (component->attr.proc_pointer && ppc_arg
1840 && !gfc_matching_procptr_assignment)
1842 primary->expr_type = EXPR_PPC;
1843 m = gfc_match_actual_arglist (component->attr.subroutine,
1844 &primary->value.compcall.actual);
1845 if (m == MATCH_ERROR)
1846 return MATCH_ERROR;
1847 if (m == MATCH_NO)
1848 primary->value.compcall.actual = NULL;
1850 break;
1853 if (component->as != NULL && !component->attr.proc_pointer)
1855 tail = extend_ref (primary, tail);
1856 tail->type = REF_ARRAY;
1858 m = gfc_match_array_ref (&tail->u.ar, component->as, equiv_flag);
1859 if (m != MATCH_YES)
1860 return m;
1863 if (component->ts.type != BT_DERIVED
1864 || gfc_match_char ('%') != MATCH_YES)
1865 break;
1867 sym = component->ts.derived;
1870 check_substring:
1871 unknown = false;
1872 if (primary->ts.type == BT_UNKNOWN)
1874 if (gfc_get_default_type (sym->name, sym->ns)->type == BT_CHARACTER)
1876 gfc_set_default_type (sym, 0, sym->ns);
1877 primary->ts = sym->ts;
1878 unknown = true;
1882 if (primary->ts.type == BT_CHARACTER)
1884 switch (match_substring (primary->ts.cl, equiv_flag, &substring))
1886 case MATCH_YES:
1887 if (tail == NULL)
1888 primary->ref = substring;
1889 else
1890 tail->next = substring;
1892 if (primary->expr_type == EXPR_CONSTANT)
1893 primary->expr_type = EXPR_SUBSTRING;
1895 if (substring)
1896 primary->ts.cl = NULL;
1898 break;
1900 case MATCH_NO:
1901 if (unknown)
1903 gfc_clear_ts (&primary->ts);
1904 gfc_clear_ts (&sym->ts);
1906 break;
1908 case MATCH_ERROR:
1909 return MATCH_ERROR;
1913 return MATCH_YES;
1917 /* Given an expression that is a variable, figure out what the
1918 ultimate variable's type and attribute is, traversing the reference
1919 structures if necessary.
1921 This subroutine is trickier than it looks. We start at the base
1922 symbol and store the attribute. Component references load a
1923 completely new attribute.
1925 A couple of rules come into play. Subobjects of targets are always
1926 targets themselves. If we see a component that goes through a
1927 pointer, then the expression must also be a target, since the
1928 pointer is associated with something (if it isn't core will soon be
1929 dumped). If we see a full part or section of an array, the
1930 expression is also an array.
1932 We can have at most one full array reference. */
1934 symbol_attribute
1935 gfc_variable_attr (gfc_expr *expr, gfc_typespec *ts)
1937 int dimension, pointer, allocatable, target;
1938 symbol_attribute attr;
1939 gfc_ref *ref;
1941 if (expr->expr_type != EXPR_VARIABLE)
1942 gfc_internal_error ("gfc_variable_attr(): Expression isn't a variable");
1944 ref = expr->ref;
1945 attr = expr->symtree->n.sym->attr;
1947 dimension = attr.dimension;
1948 pointer = attr.pointer;
1949 allocatable = attr.allocatable;
1951 target = attr.target;
1952 if (pointer || attr.proc_pointer)
1953 target = 1;
1955 if (ts != NULL && expr->ts.type == BT_UNKNOWN)
1956 *ts = expr->symtree->n.sym->ts;
1958 for (; ref; ref = ref->next)
1959 switch (ref->type)
1961 case REF_ARRAY:
1963 switch (ref->u.ar.type)
1965 case AR_FULL:
1966 dimension = 1;
1967 break;
1969 case AR_SECTION:
1970 allocatable = pointer = 0;
1971 dimension = 1;
1972 break;
1974 case AR_ELEMENT:
1975 allocatable = pointer = 0;
1976 break;
1978 case AR_UNKNOWN:
1979 gfc_internal_error ("gfc_variable_attr(): Bad array reference");
1982 break;
1984 case REF_COMPONENT:
1985 attr = ref->u.c.component->attr;
1986 if (ts != NULL)
1988 *ts = ref->u.c.component->ts;
1989 /* Don't set the string length if a substring reference
1990 follows. */
1991 if (ts->type == BT_CHARACTER
1992 && ref->next && ref->next->type == REF_SUBSTRING)
1993 ts->cl = NULL;
1996 pointer = ref->u.c.component->attr.pointer;
1997 allocatable = ref->u.c.component->attr.allocatable;
1998 if (pointer || attr.proc_pointer)
1999 target = 1;
2001 break;
2003 case REF_SUBSTRING:
2004 allocatable = pointer = 0;
2005 break;
2008 attr.dimension = dimension;
2009 attr.pointer = pointer;
2010 attr.allocatable = allocatable;
2011 attr.target = target;
2013 return attr;
2017 /* Return the attribute from a general expression. */
2019 symbol_attribute
2020 gfc_expr_attr (gfc_expr *e)
2022 symbol_attribute attr;
2024 switch (e->expr_type)
2026 case EXPR_VARIABLE:
2027 attr = gfc_variable_attr (e, NULL);
2028 break;
2030 case EXPR_FUNCTION:
2031 gfc_clear_attr (&attr);
2033 if (e->value.function.esym != NULL)
2034 attr = e->value.function.esym->result->attr;
2036 /* TODO: NULL() returns pointers. May have to take care of this
2037 here. */
2039 break;
2041 default:
2042 gfc_clear_attr (&attr);
2043 break;
2046 return attr;
2050 /* Match a structure constructor. The initial symbol has already been
2051 seen. */
2053 typedef struct gfc_structure_ctor_component
2055 char* name;
2056 gfc_expr* val;
2057 locus where;
2058 struct gfc_structure_ctor_component* next;
2060 gfc_structure_ctor_component;
2062 #define gfc_get_structure_ctor_component() XCNEW (gfc_structure_ctor_component)
2064 static void
2065 gfc_free_structure_ctor_component (gfc_structure_ctor_component *comp)
2067 gfc_free (comp->name);
2068 gfc_free_expr (comp->val);
2072 /* Translate the component list into the actual constructor by sorting it in
2073 the order required; this also checks along the way that each and every
2074 component actually has an initializer and handles default initializers
2075 for components without explicit value given. */
2076 static gfc_try
2077 build_actual_constructor (gfc_structure_ctor_component **comp_head,
2078 gfc_constructor **ctor_head, gfc_symbol *sym)
2080 gfc_structure_ctor_component *comp_iter;
2081 gfc_constructor *ctor_tail = NULL;
2082 gfc_component *comp;
2084 for (comp = sym->components; comp; comp = comp->next)
2086 gfc_structure_ctor_component **next_ptr;
2087 gfc_expr *value = NULL;
2089 /* Try to find the initializer for the current component by name. */
2090 next_ptr = comp_head;
2091 for (comp_iter = *comp_head; comp_iter; comp_iter = comp_iter->next)
2093 if (!strcmp (comp_iter->name, comp->name))
2094 break;
2095 next_ptr = &comp_iter->next;
2098 /* If an extension, try building the parent derived type by building
2099 a value expression for the parent derived type and calling self. */
2100 if (!comp_iter && comp == sym->components && sym->attr.extension)
2102 value = gfc_get_expr ();
2103 value->expr_type = EXPR_STRUCTURE;
2104 value->value.constructor = NULL;
2105 value->ts = comp->ts;
2106 value->where = gfc_current_locus;
2108 if (build_actual_constructor (comp_head, &value->value.constructor,
2109 comp->ts.derived) == FAILURE)
2111 gfc_free_expr (value);
2112 return FAILURE;
2114 *ctor_head = ctor_tail = gfc_get_constructor ();
2115 ctor_tail->expr = value;
2116 continue;
2119 /* If it was not found, try the default initializer if there's any;
2120 otherwise, it's an error. */
2121 if (!comp_iter)
2123 if (comp->initializer)
2125 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Structure"
2126 " constructor with missing optional arguments"
2127 " at %C") == FAILURE)
2128 return FAILURE;
2129 value = gfc_copy_expr (comp->initializer);
2131 else
2133 gfc_error ("No initializer for component '%s' given in the"
2134 " structure constructor at %C!", comp->name);
2135 return FAILURE;
2138 else
2139 value = comp_iter->val;
2141 /* Add the value to the constructor chain built. */
2142 if (ctor_tail)
2144 ctor_tail->next = gfc_get_constructor ();
2145 ctor_tail = ctor_tail->next;
2147 else
2148 *ctor_head = ctor_tail = gfc_get_constructor ();
2149 gcc_assert (value);
2150 ctor_tail->expr = value;
2152 /* Remove the entry from the component list. We don't want the expression
2153 value to be free'd, so set it to NULL. */
2154 if (comp_iter)
2156 *next_ptr = comp_iter->next;
2157 comp_iter->val = NULL;
2158 gfc_free_structure_ctor_component (comp_iter);
2161 return SUCCESS;
2164 match
2165 gfc_match_structure_constructor (gfc_symbol *sym, gfc_expr **result,
2166 bool parent)
2168 gfc_structure_ctor_component *comp_tail, *comp_head, *comp_iter;
2169 gfc_constructor *ctor_head, *ctor_tail;
2170 gfc_component *comp; /* Is set NULL when named component is first seen */
2171 gfc_expr *e;
2172 locus where;
2173 match m;
2174 const char* last_name = NULL;
2176 comp_tail = comp_head = NULL;
2177 ctor_head = ctor_tail = NULL;
2179 if (!parent && gfc_match_char ('(') != MATCH_YES)
2180 goto syntax;
2182 where = gfc_current_locus;
2184 gfc_find_component (sym, NULL, false, true);
2186 /* Check that we're not about to construct an ABSTRACT type. */
2187 if (!parent && sym->attr.abstract)
2189 gfc_error ("Can't construct ABSTRACT type '%s' at %C", sym->name);
2190 return MATCH_ERROR;
2193 /* Match the component list and store it in a list together with the
2194 corresponding component names. Check for empty argument list first. */
2195 if (gfc_match_char (')') != MATCH_YES)
2197 comp = sym->components;
2200 gfc_component *this_comp = NULL;
2202 if (!comp_head)
2203 comp_tail = comp_head = gfc_get_structure_ctor_component ();
2204 else
2206 comp_tail->next = gfc_get_structure_ctor_component ();
2207 comp_tail = comp_tail->next;
2209 comp_tail->name = XCNEWVEC (char, GFC_MAX_SYMBOL_LEN + 1);
2210 comp_tail->val = NULL;
2211 comp_tail->where = gfc_current_locus;
2213 /* Try matching a component name. */
2214 if (gfc_match_name (comp_tail->name) == MATCH_YES
2215 && gfc_match_char ('=') == MATCH_YES)
2217 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Structure"
2218 " constructor with named arguments at %C")
2219 == FAILURE)
2220 goto cleanup;
2222 last_name = comp_tail->name;
2223 comp = NULL;
2225 else
2227 /* Components without name are not allowed after the first named
2228 component initializer! */
2229 if (!comp)
2231 if (last_name)
2232 gfc_error ("Component initializer without name after"
2233 " component named %s at %C!", last_name);
2234 else if (!parent)
2235 gfc_error ("Too many components in structure constructor at"
2236 " %C!");
2237 goto cleanup;
2240 gfc_current_locus = comp_tail->where;
2241 strncpy (comp_tail->name, comp->name, GFC_MAX_SYMBOL_LEN + 1);
2244 /* Find the current component in the structure definition and check
2245 its access is not private. */
2246 if (comp)
2247 this_comp = gfc_find_component (sym, comp->name, false, false);
2248 else
2250 this_comp = gfc_find_component (sym,
2251 (const char *)comp_tail->name,
2252 false, false);
2253 comp = NULL; /* Reset needed! */
2256 /* Here we can check if a component name is given which does not
2257 correspond to any component of the defined structure. */
2258 if (!this_comp)
2259 goto cleanup;
2261 /* Check if this component is already given a value. */
2262 for (comp_iter = comp_head; comp_iter != comp_tail;
2263 comp_iter = comp_iter->next)
2265 gcc_assert (comp_iter);
2266 if (!strcmp (comp_iter->name, comp_tail->name))
2268 gfc_error ("Component '%s' is initialized twice in the"
2269 " structure constructor at %C!", comp_tail->name);
2270 goto cleanup;
2274 /* Match the current initializer expression. */
2275 m = gfc_match_expr (&comp_tail->val);
2276 if (m == MATCH_NO)
2277 goto syntax;
2278 if (m == MATCH_ERROR)
2279 goto cleanup;
2281 /* If not explicitly a parent constructor, gather up the components
2282 and build one. */
2283 if (comp && comp == sym->components
2284 && sym->attr.extension
2285 && (comp_tail->val->ts.type != BT_DERIVED
2287 comp_tail->val->ts.derived != this_comp->ts.derived))
2289 gfc_current_locus = where;
2290 gfc_free_expr (comp_tail->val);
2291 comp_tail->val = NULL;
2293 m = gfc_match_structure_constructor (comp->ts.derived,
2294 &comp_tail->val, true);
2295 if (m == MATCH_NO)
2296 goto syntax;
2297 if (m == MATCH_ERROR)
2298 goto cleanup;
2301 if (comp)
2302 comp = comp->next;
2304 if (parent && !comp)
2305 break;
2308 while (gfc_match_char (',') == MATCH_YES);
2310 if (!parent && gfc_match_char (')') != MATCH_YES)
2311 goto syntax;
2314 if (build_actual_constructor (&comp_head, &ctor_head, sym) == FAILURE)
2315 goto cleanup;
2317 /* No component should be left, as this should have caused an error in the
2318 loop constructing the component-list (name that does not correspond to any
2319 component in the structure definition). */
2320 if (comp_head && sym->attr.extension)
2322 for (comp_iter = comp_head; comp_iter; comp_iter = comp_iter->next)
2324 gfc_error ("component '%s' at %L has already been set by a "
2325 "parent derived type constructor", comp_iter->name,
2326 &comp_iter->where);
2328 goto cleanup;
2330 else
2331 gcc_assert (!comp_head);
2333 e = gfc_get_expr ();
2335 e->expr_type = EXPR_STRUCTURE;
2337 e->ts.type = BT_DERIVED;
2338 e->ts.derived = sym;
2339 e->where = where;
2341 e->value.constructor = ctor_head;
2343 *result = e;
2344 return MATCH_YES;
2346 syntax:
2347 gfc_error ("Syntax error in structure constructor at %C");
2349 cleanup:
2350 for (comp_iter = comp_head; comp_iter; )
2352 gfc_structure_ctor_component *next = comp_iter->next;
2353 gfc_free_structure_ctor_component (comp_iter);
2354 comp_iter = next;
2356 gfc_free_constructor (ctor_head);
2357 return MATCH_ERROR;
2361 /* If the symbol is an implicit do loop index and implicitly typed,
2362 it should not be host associated. Provide a symtree from the
2363 current namespace. */
2364 static match
2365 check_for_implicit_index (gfc_symtree **st, gfc_symbol **sym)
2367 if ((*sym)->attr.flavor == FL_VARIABLE
2368 && (*sym)->ns != gfc_current_ns
2369 && (*sym)->attr.implied_index
2370 && (*sym)->attr.implicit_type
2371 && !(*sym)->attr.use_assoc)
2373 int i;
2374 i = gfc_get_sym_tree ((*sym)->name, NULL, st, false);
2375 if (i)
2376 return MATCH_ERROR;
2377 *sym = (*st)->n.sym;
2379 return MATCH_YES;
2383 /* Procedure pointer as function result: Replace the function symbol by the
2384 auto-generated hidden result variable named "ppr@". */
2386 static gfc_try
2387 replace_hidden_procptr_result (gfc_symbol **sym, gfc_symtree **st)
2389 /* Check for procedure pointer result variable. */
2390 if ((*sym)->attr.function && !(*sym)->attr.external
2391 && (*sym)->result && (*sym)->result != *sym
2392 && (*sym)->result->attr.proc_pointer
2393 && (*sym) == gfc_current_ns->proc_name
2394 && (*sym) == (*sym)->result->ns->proc_name
2395 && strcmp ("ppr@", (*sym)->result->name) == 0)
2397 /* Automatic replacement with "hidden" result variable. */
2398 (*sym)->result->attr.referenced = (*sym)->attr.referenced;
2399 *sym = (*sym)->result;
2400 *st = gfc_find_symtree ((*sym)->ns->sym_root, (*sym)->name);
2401 return SUCCESS;
2403 return FAILURE;
2407 /* Matches a variable name followed by anything that might follow it--
2408 array reference, argument list of a function, etc. */
2410 match
2411 gfc_match_rvalue (gfc_expr **result)
2413 gfc_actual_arglist *actual_arglist;
2414 char name[GFC_MAX_SYMBOL_LEN + 1], argname[GFC_MAX_SYMBOL_LEN + 1];
2415 gfc_state_data *st;
2416 gfc_symbol *sym;
2417 gfc_symtree *symtree;
2418 locus where, old_loc;
2419 gfc_expr *e;
2420 match m, m2;
2421 int i;
2422 gfc_typespec *ts;
2423 bool implicit_char;
2424 gfc_ref *ref;
2426 m = gfc_match_name (name);
2427 if (m != MATCH_YES)
2428 return m;
2430 if (gfc_find_state (COMP_INTERFACE) == SUCCESS
2431 && !gfc_current_ns->has_import_set)
2432 i = gfc_get_sym_tree (name, NULL, &symtree, false);
2433 else
2434 i = gfc_get_ha_sym_tree (name, &symtree);
2436 if (i)
2437 return MATCH_ERROR;
2439 sym = symtree->n.sym;
2440 e = NULL;
2441 where = gfc_current_locus;
2443 replace_hidden_procptr_result (&sym, &symtree);
2445 /* If this is an implicit do loop index and implicitly typed,
2446 it should not be host associated. */
2447 m = check_for_implicit_index (&symtree, &sym);
2448 if (m != MATCH_YES)
2449 return m;
2451 gfc_set_sym_referenced (sym);
2452 sym->attr.implied_index = 0;
2454 if (sym->attr.function && sym->result == sym)
2456 /* See if this is a directly recursive function call. */
2457 gfc_gobble_whitespace ();
2458 if (sym->attr.recursive
2459 && gfc_peek_ascii_char () == '('
2460 && gfc_current_ns->proc_name == sym
2461 && !sym->attr.dimension)
2463 gfc_error ("'%s' at %C is the name of a recursive function "
2464 "and so refers to the result variable. Use an "
2465 "explicit RESULT variable for direct recursion "
2466 "(12.5.2.1)", sym->name);
2467 return MATCH_ERROR;
2470 if (gfc_current_ns->proc_name == sym
2471 || (gfc_current_ns->parent != NULL
2472 && gfc_current_ns->parent->proc_name == sym))
2473 goto variable;
2475 if (sym->attr.entry
2476 && (sym->ns == gfc_current_ns
2477 || sym->ns == gfc_current_ns->parent))
2479 gfc_entry_list *el = NULL;
2481 for (el = sym->ns->entries; el; el = el->next)
2482 if (sym == el->sym)
2483 goto variable;
2487 if (gfc_matching_procptr_assignment)
2488 goto procptr0;
2490 if (sym->attr.function || sym->attr.external || sym->attr.intrinsic)
2491 goto function0;
2493 if (sym->attr.generic)
2494 goto generic_function;
2496 switch (sym->attr.flavor)
2498 case FL_VARIABLE:
2499 variable:
2500 e = gfc_get_expr ();
2502 e->expr_type = EXPR_VARIABLE;
2503 e->symtree = symtree;
2505 m = gfc_match_varspec (e, 0, false, true);
2506 break;
2508 case FL_PARAMETER:
2509 /* A statement of the form "REAL, parameter :: a(0:10) = 1" will
2510 end up here. Unfortunately, sym->value->expr_type is set to
2511 EXPR_CONSTANT, and so the if () branch would be followed without
2512 the !sym->as check. */
2513 if (sym->value && sym->value->expr_type != EXPR_ARRAY && !sym->as)
2514 e = gfc_copy_expr (sym->value);
2515 else
2517 e = gfc_get_expr ();
2518 e->expr_type = EXPR_VARIABLE;
2521 e->symtree = symtree;
2522 m = gfc_match_varspec (e, 0, false, true);
2524 if (sym->ts.is_c_interop || sym->ts.is_iso_c)
2525 break;
2527 /* Variable array references to derived type parameters cause
2528 all sorts of headaches in simplification. Treating such
2529 expressions as variable works just fine for all array
2530 references. */
2531 if (sym->value && sym->ts.type == BT_DERIVED && e->ref)
2533 for (ref = e->ref; ref; ref = ref->next)
2534 if (ref->type == REF_ARRAY)
2535 break;
2537 if (ref == NULL || ref->u.ar.type == AR_FULL)
2538 break;
2540 ref = e->ref;
2541 e->ref = NULL;
2542 gfc_free_expr (e);
2543 e = gfc_get_expr ();
2544 e->expr_type = EXPR_VARIABLE;
2545 e->symtree = symtree;
2546 e->ref = ref;
2549 break;
2551 case FL_DERIVED:
2552 sym = gfc_use_derived (sym);
2553 if (sym == NULL)
2554 m = MATCH_ERROR;
2555 else
2556 m = gfc_match_structure_constructor (sym, &e, false);
2557 break;
2559 /* If we're here, then the name is known to be the name of a
2560 procedure, yet it is not sure to be the name of a function. */
2561 case FL_PROCEDURE:
2563 /* Procedure Pointer Assignments. */
2564 procptr0:
2565 if (gfc_matching_procptr_assignment)
2567 gfc_gobble_whitespace ();
2568 if (!sym->attr.dimension && gfc_peek_ascii_char () == '(')
2569 /* Parse functions returning a procptr. */
2570 goto function0;
2572 if (gfc_is_intrinsic (sym, 0, gfc_current_locus)
2573 || gfc_is_intrinsic (sym, 1, gfc_current_locus))
2574 sym->attr.intrinsic = 1;
2575 e = gfc_get_expr ();
2576 e->expr_type = EXPR_VARIABLE;
2577 e->symtree = symtree;
2578 m = gfc_match_varspec (e, 0, false, true);
2579 break;
2582 if (sym->attr.subroutine)
2584 gfc_error ("Unexpected use of subroutine name '%s' at %C",
2585 sym->name);
2586 m = MATCH_ERROR;
2587 break;
2590 /* At this point, the name has to be a non-statement function.
2591 If the name is the same as the current function being
2592 compiled, then we have a variable reference (to the function
2593 result) if the name is non-recursive. */
2595 st = gfc_enclosing_unit (NULL);
2597 if (st != NULL && st->state == COMP_FUNCTION
2598 && st->sym == sym
2599 && !sym->attr.recursive)
2601 e = gfc_get_expr ();
2602 e->symtree = symtree;
2603 e->expr_type = EXPR_VARIABLE;
2605 m = gfc_match_varspec (e, 0, false, true);
2606 break;
2609 /* Match a function reference. */
2610 function0:
2611 m = gfc_match_actual_arglist (0, &actual_arglist);
2612 if (m == MATCH_NO)
2614 if (sym->attr.proc == PROC_ST_FUNCTION)
2615 gfc_error ("Statement function '%s' requires argument list at %C",
2616 sym->name);
2617 else
2618 gfc_error ("Function '%s' requires an argument list at %C",
2619 sym->name);
2621 m = MATCH_ERROR;
2622 break;
2625 if (m != MATCH_YES)
2627 m = MATCH_ERROR;
2628 break;
2631 gfc_get_ha_sym_tree (name, &symtree); /* Can't fail */
2632 sym = symtree->n.sym;
2634 replace_hidden_procptr_result (&sym, &symtree);
2636 e = gfc_get_expr ();
2637 e->symtree = symtree;
2638 e->expr_type = EXPR_FUNCTION;
2639 e->value.function.actual = actual_arglist;
2640 e->where = gfc_current_locus;
2642 if (sym->as != NULL)
2643 e->rank = sym->as->rank;
2645 if (!sym->attr.function
2646 && gfc_add_function (&sym->attr, sym->name, NULL) == FAILURE)
2648 m = MATCH_ERROR;
2649 break;
2652 /* Check here for the existence of at least one argument for the
2653 iso_c_binding functions C_LOC, C_FUNLOC, and C_ASSOCIATED. The
2654 argument(s) given will be checked in gfc_iso_c_func_interface,
2655 during resolution of the function call. */
2656 if (sym->attr.is_iso_c == 1
2657 && (sym->from_intmod == INTMOD_ISO_C_BINDING
2658 && (sym->intmod_sym_id == ISOCBINDING_LOC
2659 || sym->intmod_sym_id == ISOCBINDING_FUNLOC
2660 || sym->intmod_sym_id == ISOCBINDING_ASSOCIATED)))
2662 /* make sure we were given a param */
2663 if (actual_arglist == NULL)
2665 gfc_error ("Missing argument to '%s' at %C", sym->name);
2666 m = MATCH_ERROR;
2667 break;
2671 if (sym->result == NULL)
2672 sym->result = sym;
2674 m = MATCH_YES;
2675 break;
2677 case FL_UNKNOWN:
2679 /* Special case for derived type variables that get their types
2680 via an IMPLICIT statement. This can't wait for the
2681 resolution phase. */
2683 if (gfc_peek_ascii_char () == '%'
2684 && sym->ts.type == BT_UNKNOWN
2685 && gfc_get_default_type (sym->name, sym->ns)->type == BT_DERIVED)
2686 gfc_set_default_type (sym, 0, sym->ns);
2688 /* If the symbol has a dimension attribute, the expression is a
2689 variable. */
2691 if (sym->attr.dimension)
2693 if (gfc_add_flavor (&sym->attr, FL_VARIABLE,
2694 sym->name, NULL) == FAILURE)
2696 m = MATCH_ERROR;
2697 break;
2700 e = gfc_get_expr ();
2701 e->symtree = symtree;
2702 e->expr_type = EXPR_VARIABLE;
2703 m = gfc_match_varspec (e, 0, false, true);
2704 break;
2707 /* Name is not an array, so we peek to see if a '(' implies a
2708 function call or a substring reference. Otherwise the
2709 variable is just a scalar. */
2711 gfc_gobble_whitespace ();
2712 if (gfc_peek_ascii_char () != '(')
2714 /* Assume a scalar variable */
2715 e = gfc_get_expr ();
2716 e->symtree = symtree;
2717 e->expr_type = EXPR_VARIABLE;
2719 if (gfc_add_flavor (&sym->attr, FL_VARIABLE,
2720 sym->name, NULL) == FAILURE)
2722 m = MATCH_ERROR;
2723 break;
2726 /*FIXME:??? gfc_match_varspec does set this for us: */
2727 e->ts = sym->ts;
2728 m = gfc_match_varspec (e, 0, false, true);
2729 break;
2732 /* See if this is a function reference with a keyword argument
2733 as first argument. We do this because otherwise a spurious
2734 symbol would end up in the symbol table. */
2736 old_loc = gfc_current_locus;
2737 m2 = gfc_match (" ( %n =", argname);
2738 gfc_current_locus = old_loc;
2740 e = gfc_get_expr ();
2741 e->symtree = symtree;
2743 if (m2 != MATCH_YES)
2745 /* Try to figure out whether we're dealing with a character type.
2746 We're peeking ahead here, because we don't want to call
2747 match_substring if we're dealing with an implicitly typed
2748 non-character variable. */
2749 implicit_char = false;
2750 if (sym->ts.type == BT_UNKNOWN)
2752 ts = gfc_get_default_type (sym->name, NULL);
2753 if (ts->type == BT_CHARACTER)
2754 implicit_char = true;
2757 /* See if this could possibly be a substring reference of a name
2758 that we're not sure is a variable yet. */
2760 if ((implicit_char || sym->ts.type == BT_CHARACTER)
2761 && match_substring (sym->ts.cl, 0, &e->ref) == MATCH_YES)
2764 e->expr_type = EXPR_VARIABLE;
2766 if (sym->attr.flavor != FL_VARIABLE
2767 && gfc_add_flavor (&sym->attr, FL_VARIABLE,
2768 sym->name, NULL) == FAILURE)
2770 m = MATCH_ERROR;
2771 break;
2774 if (sym->ts.type == BT_UNKNOWN
2775 && gfc_set_default_type (sym, 1, NULL) == FAILURE)
2777 m = MATCH_ERROR;
2778 break;
2781 e->ts = sym->ts;
2782 if (e->ref)
2783 e->ts.cl = NULL;
2784 m = MATCH_YES;
2785 break;
2789 /* Give up, assume we have a function. */
2791 gfc_get_sym_tree (name, NULL, &symtree, false); /* Can't fail */
2792 sym = symtree->n.sym;
2793 e->expr_type = EXPR_FUNCTION;
2795 if (!sym->attr.function
2796 && gfc_add_function (&sym->attr, sym->name, NULL) == FAILURE)
2798 m = MATCH_ERROR;
2799 break;
2802 sym->result = sym;
2804 m = gfc_match_actual_arglist (0, &e->value.function.actual);
2805 if (m == MATCH_NO)
2806 gfc_error ("Missing argument list in function '%s' at %C", sym->name);
2808 if (m != MATCH_YES)
2810 m = MATCH_ERROR;
2811 break;
2814 /* If our new function returns a character, array or structure
2815 type, it might have subsequent references. */
2817 m = gfc_match_varspec (e, 0, false, true);
2818 if (m == MATCH_NO)
2819 m = MATCH_YES;
2821 break;
2823 generic_function:
2824 gfc_get_sym_tree (name, NULL, &symtree, false); /* Can't fail */
2826 e = gfc_get_expr ();
2827 e->symtree = symtree;
2828 e->expr_type = EXPR_FUNCTION;
2830 m = gfc_match_actual_arglist (0, &e->value.function.actual);
2831 break;
2833 default:
2834 gfc_error ("Symbol at %C is not appropriate for an expression");
2835 return MATCH_ERROR;
2838 if (m == MATCH_YES)
2840 e->where = where;
2841 *result = e;
2843 else
2844 gfc_free_expr (e);
2846 return m;
2850 /* Match a variable, i.e. something that can be assigned to. This
2851 starts as a symbol, can be a structure component or an array
2852 reference. It can be a function if the function doesn't have a
2853 separate RESULT variable. If the symbol has not been previously
2854 seen, we assume it is a variable.
2856 This function is called by two interface functions:
2857 gfc_match_variable, which has host_flag = 1, and
2858 gfc_match_equiv_variable, with host_flag = 0, to restrict the
2859 match of the symbol to the local scope. */
2861 static match
2862 match_variable (gfc_expr **result, int equiv_flag, int host_flag)
2864 gfc_symbol *sym;
2865 gfc_symtree *st;
2866 gfc_expr *expr;
2867 locus where;
2868 match m;
2870 /* Since nothing has any business being an lvalue in a module
2871 specification block, an interface block or a contains section,
2872 we force the changed_symbols mechanism to work by setting
2873 host_flag to 0. This prevents valid symbols that have the name
2874 of keywords, such as 'end', being turned into variables by
2875 failed matching to assignments for, e.g., END INTERFACE. */
2876 if (gfc_current_state () == COMP_MODULE
2877 || gfc_current_state () == COMP_INTERFACE
2878 || gfc_current_state () == COMP_CONTAINS)
2879 host_flag = 0;
2881 where = gfc_current_locus;
2882 m = gfc_match_sym_tree (&st, host_flag);
2883 if (m != MATCH_YES)
2884 return m;
2886 sym = st->n.sym;
2888 /* If this is an implicit do loop index and implicitly typed,
2889 it should not be host associated. */
2890 m = check_for_implicit_index (&st, &sym);
2891 if (m != MATCH_YES)
2892 return m;
2894 sym->attr.implied_index = 0;
2896 gfc_set_sym_referenced (sym);
2897 switch (sym->attr.flavor)
2899 case FL_VARIABLE:
2900 if (sym->attr.is_protected && sym->attr.use_assoc)
2902 gfc_error ("Assigning to PROTECTED variable at %C");
2903 return MATCH_ERROR;
2905 break;
2907 case FL_UNKNOWN:
2909 sym_flavor flavor = FL_UNKNOWN;
2911 gfc_gobble_whitespace ();
2913 if (sym->attr.external || sym->attr.procedure
2914 || sym->attr.function || sym->attr.subroutine)
2915 flavor = FL_PROCEDURE;
2917 /* If it is not a procedure, is not typed and is host associated,
2918 we cannot give it a flavor yet. */
2919 else if (sym->ns == gfc_current_ns->parent
2920 && sym->ts.type == BT_UNKNOWN)
2921 break;
2923 /* These are definitive indicators that this is a variable. */
2924 else if (gfc_peek_ascii_char () != '(' || sym->ts.type != BT_UNKNOWN
2925 || sym->attr.pointer || sym->as != NULL)
2926 flavor = FL_VARIABLE;
2928 if (flavor != FL_UNKNOWN
2929 && gfc_add_flavor (&sym->attr, flavor, sym->name, NULL) == FAILURE)
2930 return MATCH_ERROR;
2932 break;
2934 case FL_PARAMETER:
2935 if (equiv_flag)
2936 gfc_error ("Named constant at %C in an EQUIVALENCE");
2937 else
2938 gfc_error ("Cannot assign to a named constant at %C");
2939 return MATCH_ERROR;
2940 break;
2942 case FL_PROCEDURE:
2943 /* Check for a nonrecursive function result variable. */
2944 if (sym->attr.function
2945 && !sym->attr.external
2946 && sym->result == sym
2947 && ((sym == gfc_current_ns->proc_name
2948 && sym == gfc_current_ns->proc_name->result)
2949 || (gfc_current_ns->parent
2950 && sym == gfc_current_ns->parent->proc_name->result)
2951 || (sym->attr.entry
2952 && sym->ns == gfc_current_ns)
2953 || (sym->attr.entry
2954 && sym->ns == gfc_current_ns->parent)))
2956 /* If a function result is a derived type, then the derived
2957 type may still have to be resolved. */
2959 if (sym->ts.type == BT_DERIVED
2960 && gfc_use_derived (sym->ts.derived) == NULL)
2961 return MATCH_ERROR;
2962 break;
2965 if (sym->attr.proc_pointer
2966 || replace_hidden_procptr_result (&sym, &st) == SUCCESS)
2967 break;
2969 /* Fall through to error */
2971 default:
2972 gfc_error ("'%s' at %C is not a variable", sym->name);
2973 return MATCH_ERROR;
2976 /* Special case for derived type variables that get their types
2977 via an IMPLICIT statement. This can't wait for the
2978 resolution phase. */
2981 gfc_namespace * implicit_ns;
2983 if (gfc_current_ns->proc_name == sym)
2984 implicit_ns = gfc_current_ns;
2985 else
2986 implicit_ns = sym->ns;
2988 if (gfc_peek_ascii_char () == '%'
2989 && sym->ts.type == BT_UNKNOWN
2990 && gfc_get_default_type (sym->name, implicit_ns)->type == BT_DERIVED)
2991 gfc_set_default_type (sym, 0, implicit_ns);
2994 expr = gfc_get_expr ();
2996 expr->expr_type = EXPR_VARIABLE;
2997 expr->symtree = st;
2998 expr->ts = sym->ts;
2999 expr->where = where;
3001 /* Now see if we have to do more. */
3002 m = gfc_match_varspec (expr, equiv_flag, false, false);
3003 if (m != MATCH_YES)
3005 gfc_free_expr (expr);
3006 return m;
3009 *result = expr;
3010 return MATCH_YES;
3014 match
3015 gfc_match_variable (gfc_expr **result, int equiv_flag)
3017 return match_variable (result, equiv_flag, 1);
3021 match
3022 gfc_match_equiv_variable (gfc_expr **result)
3024 return match_variable (result, 1, 0);