PR fortran/15750
[official-gcc.git] / gcc / fortran / primary.c
blobe1f40493256511f041f7f6af81309a856fb9b1bf
1 /* Primary expression subroutines
2 Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
3 Contributed by Andy Vaught
5 This file is part of GNU G95.
7 GNU G95 is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
12 GNU G95 is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU G95; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
23 #include "config.h"
24 #include "system.h"
25 #include "flags.h"
27 #include <string.h>
28 #include <stdlib.h>
29 #include "gfortran.h"
30 #include "arith.h"
31 #include "match.h"
32 #include "parse.h"
34 /* Matches a kind-parameter expression, which is either a named
35 symbolic constant or a nonnegative integer constant. If
36 successful, sets the kind value to the correct integer. */
38 static match
39 match_kind_param (int *kind)
41 char name[GFC_MAX_SYMBOL_LEN + 1];
42 gfc_symbol *sym;
43 const char *p;
44 match m;
46 m = gfc_match_small_literal_int (kind);
47 if (m != MATCH_NO)
48 return m;
50 m = gfc_match_name (name);
51 if (m != MATCH_YES)
52 return m;
54 if (gfc_find_symbol (name, NULL, 1, &sym))
55 return MATCH_ERROR;
57 if (sym == NULL)
58 return MATCH_NO;
60 if (sym->attr.flavor != FL_PARAMETER)
61 return MATCH_NO;
63 p = gfc_extract_int (sym->value, kind);
64 if (p != NULL)
65 return MATCH_NO;
67 if (*kind < 0)
68 return MATCH_NO;
70 return MATCH_YES;
74 /* Get a trailing kind-specification for non-character variables.
75 Returns:
76 the integer kind value or:
77 -1 if an error was generated
78 -2 if no kind was found */
80 static int
81 get_kind (void)
83 int kind;
84 match m;
86 if (gfc_match_char ('_') != MATCH_YES)
87 return -2;
89 m = match_kind_param (&kind);
90 if (m == MATCH_NO)
91 gfc_error ("Missing kind-parameter at %C");
93 return (m == MATCH_YES) ? kind : -1;
97 /* Given a character and a radix, see if the character is a valid
98 digit in that radix. */
100 static int
101 check_digit (int c, int radix)
103 int r;
105 switch (radix)
107 case 2:
108 r = ('0' <= c && c <= '1');
109 break;
111 case 8:
112 r = ('0' <= c && c <= '7');
113 break;
115 case 10:
116 r = ('0' <= c && c <= '9');
117 break;
119 case 16:
120 r = ('0' <= c && c <= '9') || ('a' <= c && c <= 'f');
121 break;
123 default:
124 gfc_internal_error ("check_digit(): bad radix");
127 return r;
131 /* Match the digit string part of an integer if signflag is not set,
132 the signed digit string part if signflag is set. If the buffer
133 is NULL, we just count characters for the resolution pass. Returns
134 the number of characters matched, -1 for no match. */
136 static int
137 match_digits (int signflag, int radix, char *buffer)
139 locus old_loc;
140 int length, c;
142 length = 0;
143 c = gfc_next_char ();
145 if (signflag && (c == '+' || c == '-'))
147 if (buffer != NULL)
148 *buffer++ = c;
149 c = gfc_next_char ();
150 length++;
153 if (!check_digit (c, radix))
154 return -1;
156 length++;
157 if (buffer != NULL)
158 *buffer++ = c;
160 for (;;)
162 old_loc = gfc_current_locus;
163 c = gfc_next_char ();
165 if (!check_digit (c, radix))
166 break;
168 if (buffer != NULL)
169 *buffer++ = c;
170 length++;
173 gfc_current_locus = old_loc;
175 return length;
179 /* Match an integer (digit string and optional kind).
180 A sign will be accepted if signflag is set. */
182 static match
183 match_integer_constant (gfc_expr ** result, int signflag)
185 int length, kind;
186 locus old_loc;
187 char *buffer;
188 gfc_expr *e;
190 old_loc = gfc_current_locus;
191 gfc_gobble_whitespace ();
193 length = match_digits (signflag, 10, NULL);
194 gfc_current_locus = old_loc;
195 if (length == -1)
196 return MATCH_NO;
198 buffer = alloca (length + 1);
199 memset (buffer, '\0', length + 1);
201 gfc_gobble_whitespace ();
203 match_digits (signflag, 10, buffer);
205 kind = get_kind ();
206 if (kind == -2)
207 kind = gfc_default_integer_kind ();
208 if (kind == -1)
209 return MATCH_ERROR;
211 if (gfc_validate_kind (BT_INTEGER, kind) == -1)
213 gfc_error ("Integer kind %d at %C not available", kind);
214 return MATCH_ERROR;
217 e = gfc_convert_integer (buffer, kind, 10, &gfc_current_locus);
219 if (gfc_range_check (e) != ARITH_OK)
221 gfc_error ("Integer too big for its kind at %C");
223 gfc_free_expr (e);
224 return MATCH_ERROR;
227 *result = e;
228 return MATCH_YES;
232 /* Match a binary, octal or hexadecimal constant that can be found in
233 a DATA statement. */
235 static match
236 match_boz_constant (gfc_expr ** result)
238 int radix, delim, length;
239 locus old_loc;
240 char *buffer;
241 gfc_expr *e;
242 const char *rname;
244 old_loc = gfc_current_locus;
245 gfc_gobble_whitespace ();
247 switch (gfc_next_char ())
249 case 'b':
250 radix = 2;
251 rname = "binary";
252 break;
253 case 'o':
254 radix = 8;
255 rname = "octal";
256 break;
257 case 'x':
258 if (pedantic
259 && (gfc_notify_std (GFC_STD_GNU, "Extension: Hexadecimal "
260 "constant at %C uses non-standard syntax.")
261 == FAILURE))
262 goto backup;
264 /* Fall through. */
265 case 'z':
266 radix = 16;
267 rname = "hexadecimal";
268 break;
269 default:
270 goto backup;
273 /* No whitespace allowed here. */
275 delim = gfc_next_char ();
276 if (delim != '\'' && delim != '\"')
277 goto backup;
279 old_loc = gfc_current_locus;
281 length = match_digits (0, radix, NULL);
282 if (length == -1)
284 gfc_error ("Empty set of digits in %s constants at %C", rname);
285 return MATCH_ERROR;
288 if (gfc_next_char () != delim)
290 gfc_error ("Illegal character in %s constant at %C.", rname);
291 return MATCH_ERROR;
294 gfc_current_locus = old_loc;
296 buffer = alloca (length + 1);
297 memset (buffer, '\0', length + 1);
299 match_digits (0, radix, buffer);
300 gfc_next_char ();
302 e = gfc_convert_integer (buffer, gfc_default_integer_kind (), radix,
303 &gfc_current_locus);
305 if (gfc_range_check (e) != ARITH_OK)
307 gfc_error ("Integer too big for default integer kind at %C");
309 gfc_free_expr (e);
310 return MATCH_ERROR;
313 *result = e;
314 return MATCH_YES;
316 backup:
317 gfc_current_locus = old_loc;
318 return MATCH_NO;
322 /* Match a real constant of some sort. */
324 static match
325 match_real_constant (gfc_expr ** result, int signflag)
327 int kind, c, count, seen_dp, seen_digits, exp_char;
328 locus old_loc, temp_loc;
329 char *p, *buffer;
330 gfc_expr *e;
332 old_loc = gfc_current_locus;
333 gfc_gobble_whitespace ();
335 e = NULL;
337 count = 0;
338 seen_dp = 0;
339 seen_digits = 0;
340 exp_char = ' ';
342 c = gfc_next_char ();
343 if (signflag && (c == '+' || c == '-'))
345 c = gfc_next_char ();
346 count++;
349 /* Scan significand. */
350 for (;; c = gfc_next_char (), count++)
352 if (c == '.')
354 if (seen_dp)
355 goto done;
357 /* Check to see if "." goes with a following operator like ".eq.". */
358 temp_loc = gfc_current_locus;
359 c = gfc_next_char ();
361 if (c == 'e' || c == 'd' || c == 'q')
363 c = gfc_next_char ();
364 if (c == '.')
365 goto done; /* Operator named .e. or .d. */
368 if (ISALPHA (c))
369 goto done; /* Distinguish 1.e9 from 1.eq.2 */
371 gfc_current_locus = temp_loc;
372 seen_dp = 1;
373 continue;
376 if (ISDIGIT (c))
378 seen_digits = 1;
379 continue;
382 break;
385 if (!seen_digits || (c != 'e' && c != 'd' && c != 'q'))
386 goto done;
387 exp_char = c;
389 /* Scan exponent. */
390 c = gfc_next_char ();
391 count++;
393 if (c == '+' || c == '-')
394 { /* optional sign */
395 c = gfc_next_char ();
396 count++;
399 if (!ISDIGIT (c))
401 /* TODO: seen_digits is always true at this point */
402 if (!seen_digits)
404 gfc_current_locus = old_loc;
405 return MATCH_NO; /* ".e" can be something else */
408 gfc_error ("Missing exponent in real number at %C");
409 return MATCH_ERROR;
412 while (ISDIGIT (c))
414 c = gfc_next_char ();
415 count++;
418 done:
419 /* See what we've got! */
420 if (!seen_digits || (!seen_dp && exp_char == ' '))
422 gfc_current_locus = old_loc;
423 return MATCH_NO;
426 /* Convert the number. */
427 gfc_current_locus = old_loc;
428 gfc_gobble_whitespace ();
430 buffer = alloca (count + 1);
431 memset (buffer, '\0', count + 1);
433 /* Hack for mpf_init_set_str(). */
434 p = buffer;
435 while (count > 0)
437 *p = gfc_next_char ();
438 if (*p == 'd' || *p == 'q')
439 *p = 'e';
440 p++;
441 count--;
444 kind = get_kind ();
445 if (kind == -1)
446 goto cleanup;
448 switch (exp_char)
450 case 'd':
451 if (kind != -2)
453 gfc_error
454 ("Real number at %C has a 'd' exponent and an explicit kind");
455 goto cleanup;
457 kind = gfc_default_double_kind ();
458 break;
460 case 'q':
461 if (kind != -2)
463 gfc_error
464 ("Real number at %C has a 'q' exponent and an explicit kind");
465 goto cleanup;
467 kind = gfc_option.q_kind;
468 break;
470 default:
471 if (kind == -2)
472 kind = gfc_default_real_kind ();
474 if (gfc_validate_kind (BT_REAL, kind) == -1)
476 gfc_error ("Invalid real kind %d at %C", kind);
477 goto cleanup;
481 e = gfc_convert_real (buffer, kind, &gfc_current_locus);
483 switch (gfc_range_check (e))
485 case ARITH_OK:
486 break;
487 case ARITH_OVERFLOW:
488 gfc_error ("Real constant overflows its kind at %C");
489 goto cleanup;
491 case ARITH_UNDERFLOW:
492 if (gfc_option.warn_underflow)
493 gfc_warning ("Real constant underflows its kind at %C");
494 mpf_set_ui(e->value.real, 0);
495 break;
497 default:
498 gfc_internal_error ("gfc_range_check() returned bad value");
501 *result = e;
502 return MATCH_YES;
504 cleanup:
505 gfc_free_expr (e);
506 return MATCH_ERROR;
510 /* Match a substring reference. */
512 static match
513 match_substring (gfc_charlen * cl, int init, gfc_ref ** result)
515 gfc_expr *start, *end;
516 locus old_loc;
517 gfc_ref *ref;
518 match m;
520 start = NULL;
521 end = NULL;
523 old_loc = gfc_current_locus;
525 m = gfc_match_char ('(');
526 if (m != MATCH_YES)
527 return MATCH_NO;
529 if (gfc_match_char (':') != MATCH_YES)
531 if (init)
532 m = gfc_match_init_expr (&start);
533 else
534 m = gfc_match_expr (&start);
536 if (m != MATCH_YES)
538 m = MATCH_NO;
539 goto cleanup;
542 m = gfc_match_char (':');
543 if (m != MATCH_YES)
544 goto cleanup;
547 if (gfc_match_char (')') != MATCH_YES)
549 if (init)
550 m = gfc_match_init_expr (&end);
551 else
552 m = gfc_match_expr (&end);
554 if (m == MATCH_NO)
555 goto syntax;
556 if (m == MATCH_ERROR)
557 goto cleanup;
559 m = gfc_match_char (')');
560 if (m == MATCH_NO)
561 goto syntax;
564 /* Optimize away the (:) reference. */
565 if (start == NULL && end == NULL)
566 ref = NULL;
567 else
569 ref = gfc_get_ref ();
571 ref->type = REF_SUBSTRING;
572 if (start == NULL)
573 start = gfc_int_expr (1);
574 ref->u.ss.start = start;
575 if (end == NULL && cl)
576 end = gfc_copy_expr (cl->length);
577 ref->u.ss.end = end;
578 ref->u.ss.length = cl;
581 *result = ref;
582 return MATCH_YES;
584 syntax:
585 gfc_error ("Syntax error in SUBSTRING specification at %C");
586 m = MATCH_ERROR;
588 cleanup:
589 gfc_free_expr (start);
590 gfc_free_expr (end);
592 gfc_current_locus = old_loc;
593 return m;
597 /* Reads the next character of a string constant, taking care to
598 return doubled delimiters on the input as a single instance of
599 the delimiter.
601 Special return values are:
602 -1 End of the string, as determined by the delimiter
603 -2 Unterminated string detected
605 Backslash codes are also expanded at this time. */
607 static int
608 next_string_char (char delimiter)
610 locus old_locus;
611 int c;
613 c = gfc_next_char_literal (1);
615 if (c == '\n')
616 return -2;
618 if (c == '\\')
620 old_locus = gfc_current_locus;
622 switch (gfc_next_char_literal (1))
624 case 'a':
625 c = '\a';
626 break;
627 case 'b':
628 c = '\b';
629 break;
630 case 't':
631 c = '\t';
632 break;
633 case 'f':
634 c = '\f';
635 break;
636 case 'n':
637 c = '\n';
638 break;
639 case 'r':
640 c = '\r';
641 break;
642 case 'v':
643 c = '\v';
644 break;
645 case '\\':
646 c = '\\';
647 break;
649 default:
650 /* Unknown backslash codes are simply not expanded */
651 gfc_current_locus = old_locus;
652 break;
656 if (c != delimiter)
657 return c;
659 old_locus = gfc_current_locus;
660 c = gfc_next_char_literal (1);
662 if (c == delimiter)
663 return c;
664 gfc_current_locus = old_locus;
666 return -1;
670 /* Special case of gfc_match_name() that matches a parameter kind name
671 before a string constant. This takes case of the weird but legal
672 case of: weird case of:
674 kind_____'string'
676 where kind____ is a parameter. gfc_match_name() will happily slurp
677 up all the underscores, which leads to problems. If we return
678 MATCH_YES, the parse pointer points to the final underscore, which
679 is not part of the name. We never return MATCH_ERROR-- errors in
680 the name will be detected later. */
682 static match
683 match_charkind_name (char *name)
685 locus old_loc;
686 char c, peek;
687 int len;
689 gfc_gobble_whitespace ();
690 c = gfc_next_char ();
691 if (!ISALPHA (c))
692 return MATCH_NO;
694 *name++ = c;
695 len = 1;
697 for (;;)
699 old_loc = gfc_current_locus;
700 c = gfc_next_char ();
702 if (c == '_')
704 peek = gfc_peek_char ();
706 if (peek == '\'' || peek == '\"')
708 gfc_current_locus = old_loc;
709 *name = '\0';
710 return MATCH_YES;
714 if (!ISALNUM (c)
715 && c != '_'
716 && (gfc_option.flag_dollar_ok && c != '$'))
717 break;
719 *name++ = c;
720 if (++len > GFC_MAX_SYMBOL_LEN)
721 break;
724 return MATCH_NO;
728 /* See if the current input matches a character constant. Lots of
729 contortions have to be done to match the kind parameter which comes
730 before the actual string. The main consideration is that we don't
731 want to error out too quickly. For example, we don't actually do
732 any validation of the kinds until we have actually seen a legal
733 delimiter. Using match_kind_param() generates errors too quickly. */
735 static match
736 match_string_constant (gfc_expr ** result)
738 char *p, name[GFC_MAX_SYMBOL_LEN + 1];
739 int i, c, kind, length, delimiter;
740 locus old_locus, start_locus;
741 gfc_symbol *sym;
742 gfc_expr *e;
743 const char *q;
744 match m;
746 old_locus = gfc_current_locus;
748 gfc_gobble_whitespace ();
750 start_locus = gfc_current_locus;
752 c = gfc_next_char ();
753 if (c == '\'' || c == '"')
755 kind = gfc_default_character_kind ();
756 goto got_delim;
759 if (ISDIGIT (c))
761 kind = 0;
763 while (ISDIGIT (c))
765 kind = kind * 10 + c - '0';
766 if (kind > 9999999)
767 goto no_match;
768 c = gfc_next_char ();
772 else
774 gfc_current_locus = old_locus;
776 m = match_charkind_name (name);
777 if (m != MATCH_YES)
778 goto no_match;
780 if (gfc_find_symbol (name, NULL, 1, &sym)
781 || sym == NULL
782 || sym->attr.flavor != FL_PARAMETER)
783 goto no_match;
785 kind = -1;
786 c = gfc_next_char ();
789 if (c == ' ')
791 gfc_gobble_whitespace ();
792 c = gfc_next_char ();
795 if (c != '_')
796 goto no_match;
798 gfc_gobble_whitespace ();
799 start_locus = gfc_current_locus;
801 c = gfc_next_char ();
802 if (c != '\'' && c != '"')
803 goto no_match;
805 if (kind == -1)
807 q = gfc_extract_int (sym->value, &kind);
808 if (q != NULL)
810 gfc_error (q);
811 return MATCH_ERROR;
815 if (gfc_validate_kind (BT_CHARACTER, kind) == -1)
817 gfc_error ("Invalid kind %d for CHARACTER constant at %C", kind);
818 return MATCH_ERROR;
821 got_delim:
822 /* Scan the string into a block of memory by first figuring out how
823 long it is, allocating the structure, then re-reading it. This
824 isn't particularly efficient, but string constants aren't that
825 common in most code. TODO: Use obstacks? */
827 delimiter = c;
828 length = 0;
830 for (;;)
832 c = next_string_char (delimiter);
833 if (c == -1)
834 break;
835 if (c == -2)
837 gfc_current_locus = start_locus;
838 gfc_error ("Unterminated character constant beginning at %C");
839 return MATCH_ERROR;
842 length++;
845 e = gfc_get_expr ();
847 e->expr_type = EXPR_CONSTANT;
848 e->ref = NULL;
849 e->ts.type = BT_CHARACTER;
850 e->ts.kind = kind;
851 e->where = start_locus;
853 e->value.character.string = p = gfc_getmem (length + 1);
854 e->value.character.length = length;
856 gfc_current_locus = start_locus;
857 gfc_next_char (); /* Skip delimiter */
859 for (i = 0; i < length; i++)
860 *p++ = next_string_char (delimiter);
862 *p = '\0'; /* TODO: C-style string is for development/debug purposes. */
864 if (next_string_char (delimiter) != -1)
865 gfc_internal_error ("match_string_constant(): Delimiter not found");
867 if (match_substring (NULL, 0, &e->ref) != MATCH_NO)
868 e->expr_type = EXPR_SUBSTRING;
870 *result = e;
872 return MATCH_YES;
874 no_match:
875 gfc_current_locus = old_locus;
876 return MATCH_NO;
880 /* Match a .true. or .false. */
882 static match
883 match_logical_constant (gfc_expr ** result)
885 static mstring logical_ops[] = {
886 minit (".false.", 0),
887 minit (".true.", 1),
888 minit (NULL, -1)
891 gfc_expr *e;
892 int i, kind;
894 i = gfc_match_strings (logical_ops);
895 if (i == -1)
896 return MATCH_NO;
898 kind = get_kind ();
899 if (kind == -1)
900 return MATCH_ERROR;
901 if (kind == -2)
902 kind = gfc_default_logical_kind ();
904 if (gfc_validate_kind (BT_LOGICAL, kind) == -1)
905 gfc_error ("Bad kind for logical constant at %C");
907 e = gfc_get_expr ();
909 e->expr_type = EXPR_CONSTANT;
910 e->value.logical = i;
911 e->ts.type = BT_LOGICAL;
912 e->ts.kind = kind;
913 e->where = gfc_current_locus;
915 *result = e;
916 return MATCH_YES;
920 /* Match a real or imaginary part of a complex constant that is a
921 symbolic constant. */
923 static match
924 match_sym_complex_part (gfc_expr ** result)
926 char name[GFC_MAX_SYMBOL_LEN + 1];
927 gfc_symbol *sym;
928 gfc_expr *e;
929 match m;
931 m = gfc_match_name (name);
932 if (m != MATCH_YES)
933 return m;
935 if (gfc_find_symbol (name, NULL, 1, &sym) || sym == NULL)
936 return MATCH_NO;
938 if (sym->attr.flavor != FL_PARAMETER)
940 gfc_error ("Expected PARAMETER symbol in complex constant at %C");
941 return MATCH_ERROR;
944 if (!gfc_numeric_ts (&sym->value->ts))
946 gfc_error ("Numeric PARAMETER required in complex constant at %C");
947 return MATCH_ERROR;
950 if (sym->value->rank != 0)
952 gfc_error ("Scalar PARAMETER required in complex constant at %C");
953 return MATCH_ERROR;
956 switch (sym->value->ts.type)
958 case BT_REAL:
959 e = gfc_copy_expr (sym->value);
960 break;
962 case BT_COMPLEX:
963 e = gfc_complex2real (sym->value, sym->value->ts.kind);
964 if (e == NULL)
965 goto error;
966 break;
968 case BT_INTEGER:
969 e = gfc_int2real (sym->value, gfc_default_real_kind ());
970 if (e == NULL)
971 goto error;
972 break;
974 default:
975 gfc_internal_error ("gfc_match_sym_complex_part(): Bad type");
978 *result = e; /* e is a scalar, real, constant expression */
979 return MATCH_YES;
981 error:
982 gfc_error ("Error converting PARAMETER constant in complex constant at %C");
983 return MATCH_ERROR;
987 /* Match the real and imaginary parts of a complex number. This
988 subroutine is essentially match_real_constant() modified in a
989 couple of ways: A sign is always allowed and numbers that would
990 look like an integer to match_real_constant() are automatically
991 created as floating point numbers. The messiness involved with
992 making sure a decimal point belongs to the number and not a
993 trailing operator is not necessary here either (Hooray!). */
995 static match
996 match_const_complex_part (gfc_expr ** result)
998 int kind, seen_digits, seen_dp, count;
999 char *p, c, exp_char, *buffer;
1000 locus old_loc;
1002 old_loc = gfc_current_locus;
1003 gfc_gobble_whitespace ();
1005 seen_dp = 0;
1006 seen_digits = 0;
1007 count = 0;
1008 exp_char = ' ';
1010 c = gfc_next_char ();
1011 if (c == '-' || c == '+')
1013 c = gfc_next_char ();
1014 count++;
1017 for (;; c = gfc_next_char (), count++)
1019 if (c == '.')
1021 if (seen_dp)
1022 goto no_match;
1023 seen_dp = 1;
1024 continue;
1027 if (ISDIGIT (c))
1029 seen_digits = 1;
1030 continue;
1033 break;
1036 if (!seen_digits || (c != 'd' && c != 'e'))
1037 goto done;
1038 exp_char = c;
1040 /* Scan exponent. */
1041 c = gfc_next_char ();
1042 count++;
1044 if (c == '+' || c == '-')
1045 { /* optional sign */
1046 c = gfc_next_char ();
1047 count++;
1050 if (!ISDIGIT (c))
1052 gfc_error ("Missing exponent in real number at %C");
1053 return MATCH_ERROR;
1056 while (ISDIGIT (c))
1058 c = gfc_next_char ();
1059 count++;
1062 done:
1063 if (!seen_digits)
1064 goto no_match;
1066 /* Convert the number. */
1067 gfc_current_locus = old_loc;
1068 gfc_gobble_whitespace ();
1070 buffer = alloca (count + 1);
1071 memset (buffer, '\0', count + 1);
1073 /* Hack for mpf_init_set_str(). */
1074 p = buffer;
1075 while (count > 0)
1077 c = gfc_next_char ();
1078 if (c == 'd')
1079 c = 'e';
1080 *p++ = c;
1081 count--;
1084 *p = '\0';
1086 kind = get_kind ();
1087 if (kind == -1)
1088 return MATCH_ERROR;
1090 /* If the number looked like an integer, forget about a kind we may
1091 have seen, otherwise validate the kind against real kinds. */
1092 if (seen_dp == 0 && exp_char == ' ')
1094 if (kind == -2)
1095 kind = gfc_default_integer_kind ();
1098 else
1100 if (exp_char == 'd')
1102 if (kind != -2)
1104 gfc_error
1105 ("Real number at %C has a 'd' exponent and an explicit kind");
1106 return MATCH_ERROR;
1108 kind = gfc_default_double_kind ();
1111 else
1113 if (kind == -2)
1114 kind = gfc_default_real_kind ();
1117 if (gfc_validate_kind (BT_REAL, kind) == -1)
1119 gfc_error ("Invalid real kind %d at %C", kind);
1120 return MATCH_ERROR;
1124 *result = gfc_convert_real (buffer, kind, &gfc_current_locus);
1125 return MATCH_YES;
1127 no_match:
1128 gfc_current_locus = old_loc;
1129 return MATCH_NO;
1133 /* Match a real or imaginary part of a complex number. */
1135 static match
1136 match_complex_part (gfc_expr ** result)
1138 match m;
1140 m = match_sym_complex_part (result);
1141 if (m != MATCH_NO)
1142 return m;
1144 return match_const_complex_part (result);
1148 /* Try to match a complex constant. */
1150 static match
1151 match_complex_constant (gfc_expr ** result)
1153 gfc_expr *e, *real, *imag;
1154 gfc_error_buf old_error;
1155 gfc_typespec target;
1156 locus old_loc;
1157 int kind;
1158 match m;
1160 old_loc = gfc_current_locus;
1161 real = imag = e = NULL;
1163 m = gfc_match_char ('(');
1164 if (m != MATCH_YES)
1165 return m;
1167 gfc_push_error (&old_error);
1169 m = match_complex_part (&real);
1170 if (m == MATCH_NO)
1171 goto cleanup;
1173 if (gfc_match_char (',') == MATCH_NO)
1175 gfc_pop_error (&old_error);
1176 m = MATCH_NO;
1177 goto cleanup;
1180 /* If m is error, then something was wrong with the real part and we
1181 assume we have a complex constant because we've seen the ','. An
1182 ambiguous case here is the start of an iterator list of some
1183 sort. These sort of lists are matched prior to coming here. */
1185 if (m == MATCH_ERROR)
1186 goto cleanup;
1187 gfc_pop_error (&old_error);
1189 m = match_complex_part (&imag);
1190 if (m == MATCH_NO)
1191 goto syntax;
1192 if (m == MATCH_ERROR)
1193 goto cleanup;
1195 m = gfc_match_char (')');
1196 if (m == MATCH_NO)
1197 goto syntax;
1199 if (m == MATCH_ERROR)
1200 goto cleanup;
1202 /* Decide on the kind of this complex number. */
1203 kind = gfc_kind_max (real, imag);
1204 target.type = BT_REAL;
1205 target.kind = kind;
1207 if (kind != real->ts.kind)
1208 gfc_convert_type (real, &target, 2);
1209 if (kind != imag->ts.kind)
1210 gfc_convert_type (imag, &target, 2);
1212 e = gfc_convert_complex (real, imag, kind);
1213 e->where = gfc_current_locus;
1215 gfc_free_expr (real);
1216 gfc_free_expr (imag);
1218 *result = e;
1219 return MATCH_YES;
1221 syntax:
1222 gfc_error ("Syntax error in COMPLEX constant at %C");
1223 m = MATCH_ERROR;
1225 cleanup:
1226 gfc_free_expr (e);
1227 gfc_free_expr (real);
1228 gfc_free_expr (imag);
1229 gfc_current_locus = old_loc;
1231 return m;
1235 /* Match constants in any of several forms. Returns nonzero for a
1236 match, zero for no match. */
1238 match
1239 gfc_match_literal_constant (gfc_expr ** result, int signflag)
1241 match m;
1243 m = match_complex_constant (result);
1244 if (m != MATCH_NO)
1245 return m;
1247 m = match_string_constant (result);
1248 if (m != MATCH_NO)
1249 return m;
1251 m = match_boz_constant (result);
1252 if (m != MATCH_NO)
1253 return m;
1255 m = match_real_constant (result, signflag);
1256 if (m != MATCH_NO)
1257 return m;
1259 m = match_integer_constant (result, signflag);
1260 if (m != MATCH_NO)
1261 return m;
1263 m = match_logical_constant (result);
1264 if (m != MATCH_NO)
1265 return m;
1267 return MATCH_NO;
1271 /* Match a single actual argument value. An actual argument is
1272 usually an expression, but can also be a procedure name. If the
1273 argument is a single name, it is not always possible to tell
1274 whether the name is a dummy procedure or not. We treat these cases
1275 by creating an argument that looks like a dummy procedure and
1276 fixing things later during resolution. */
1278 static match
1279 match_actual_arg (gfc_expr ** result)
1281 char name[GFC_MAX_SYMBOL_LEN + 1];
1282 gfc_symtree *symtree;
1283 locus where, w;
1284 gfc_expr *e;
1285 int c;
1287 where = gfc_current_locus;
1289 switch (gfc_match_name (name))
1291 case MATCH_ERROR:
1292 return MATCH_ERROR;
1294 case MATCH_NO:
1295 break;
1297 case MATCH_YES:
1298 w = gfc_current_locus;
1299 gfc_gobble_whitespace ();
1300 c = gfc_next_char ();
1301 gfc_current_locus = w;
1303 if (c != ',' && c != ')')
1304 break;
1306 if (gfc_find_sym_tree (name, NULL, 1, &symtree))
1307 break;
1308 /* Handle error elsewhere. */
1310 /* Eliminate a couple of common cases where we know we don't
1311 have a function argument. */
1312 if (symtree == NULL)
1314 gfc_get_sym_tree (name, NULL, &symtree);
1315 gfc_set_sym_referenced (symtree->n.sym);
1317 else
1319 gfc_symbol *sym;
1321 sym = symtree->n.sym;
1322 gfc_set_sym_referenced (sym);
1323 if (sym->attr.flavor != FL_PROCEDURE
1324 && sym->attr.flavor != FL_UNKNOWN)
1325 break;
1327 /* If the symbol is a function with itself as the result and
1328 is being defined, then we have a variable. */
1329 if (sym->result == sym
1330 && (gfc_current_ns->proc_name == sym
1331 || (gfc_current_ns->parent != NULL
1332 && gfc_current_ns->parent->proc_name == sym)))
1333 break;
1336 e = gfc_get_expr (); /* Leave it unknown for now */
1337 e->symtree = symtree;
1338 e->expr_type = EXPR_VARIABLE;
1339 e->ts.type = BT_PROCEDURE;
1340 e->where = where;
1342 *result = e;
1343 return MATCH_YES;
1346 gfc_current_locus = where;
1347 return gfc_match_expr (result);
1351 /* Match a keyword argument. */
1353 static match
1354 match_keyword_arg (gfc_actual_arglist * actual, gfc_actual_arglist * base)
1356 char name[GFC_MAX_SYMBOL_LEN + 1];
1357 gfc_actual_arglist *a;
1358 locus name_locus;
1359 match m;
1361 name_locus = gfc_current_locus;
1362 m = gfc_match_name (name);
1364 if (m != MATCH_YES)
1365 goto cleanup;
1366 if (gfc_match_char ('=') != MATCH_YES)
1368 m = MATCH_NO;
1369 goto cleanup;
1372 m = match_actual_arg (&actual->expr);
1373 if (m != MATCH_YES)
1374 goto cleanup;
1376 /* Make sure this name has not appeared yet. */
1378 if (name[0] != '\0')
1380 for (a = base; a; a = a->next)
1381 if (strcmp (a->name, name) == 0)
1383 gfc_error
1384 ("Keyword '%s' at %C has already appeared in the current "
1385 "argument list", name);
1386 return MATCH_ERROR;
1390 strcpy (actual->name, name);
1391 return MATCH_YES;
1393 cleanup:
1394 gfc_current_locus = name_locus;
1395 return m;
1399 /* Matches an actual argument list of a function or subroutine, from
1400 the opening parenthesis to the closing parenthesis. The argument
1401 list is assumed to allow keyword arguments because we don't know if
1402 the symbol associated with the procedure has an implicit interface
1403 or not. We make sure keywords are unique. */
1405 match
1406 gfc_match_actual_arglist (int sub_flag, gfc_actual_arglist ** argp)
1408 gfc_actual_arglist *head, *tail;
1409 int seen_keyword;
1410 gfc_st_label *label;
1411 locus old_loc;
1412 match m;
1414 *argp = tail = NULL;
1415 old_loc = gfc_current_locus;
1417 seen_keyword = 0;
1419 if (gfc_match_char ('(') == MATCH_NO)
1420 return (sub_flag) ? MATCH_YES : MATCH_NO;
1422 if (gfc_match_char (')') == MATCH_YES)
1423 return MATCH_YES;
1424 head = NULL;
1426 for (;;)
1428 if (head == NULL)
1429 head = tail = gfc_get_actual_arglist ();
1430 else
1432 tail->next = gfc_get_actual_arglist ();
1433 tail = tail->next;
1436 if (sub_flag && gfc_match_char ('*') == MATCH_YES)
1438 m = gfc_match_st_label (&label, 0);
1439 if (m == MATCH_NO)
1440 gfc_error ("Expected alternate return label at %C");
1441 if (m != MATCH_YES)
1442 goto cleanup;
1444 tail->label = label;
1445 goto next;
1448 /* After the first keyword argument is seen, the following
1449 arguments must also have keywords. */
1450 if (seen_keyword)
1452 m = match_keyword_arg (tail, head);
1454 if (m == MATCH_ERROR)
1455 goto cleanup;
1456 if (m == MATCH_NO)
1458 gfc_error
1459 ("Missing keyword name in actual argument list at %C");
1460 goto cleanup;
1464 else
1466 /* See if we have the first keyword argument. */
1467 m = match_keyword_arg (tail, head);
1468 if (m == MATCH_YES)
1469 seen_keyword = 1;
1470 if (m == MATCH_ERROR)
1471 goto cleanup;
1473 if (m == MATCH_NO)
1475 /* Try for a non-keyword argument. */
1476 m = match_actual_arg (&tail->expr);
1477 if (m == MATCH_ERROR)
1478 goto cleanup;
1479 if (m == MATCH_NO)
1480 goto syntax;
1484 next:
1485 if (gfc_match_char (')') == MATCH_YES)
1486 break;
1487 if (gfc_match_char (',') != MATCH_YES)
1488 goto syntax;
1491 *argp = head;
1492 return MATCH_YES;
1494 syntax:
1495 gfc_error ("Syntax error in argument list at %C");
1497 cleanup:
1498 gfc_free_actual_arglist (head);
1499 gfc_current_locus = old_loc;
1501 return MATCH_ERROR;
1505 /* Used by match_varspec() to extend the reference list by one
1506 element. */
1508 static gfc_ref *
1509 extend_ref (gfc_expr * primary, gfc_ref * tail)
1512 if (primary->ref == NULL)
1513 primary->ref = tail = gfc_get_ref ();
1514 else
1516 if (tail == NULL)
1517 gfc_internal_error ("extend_ref(): Bad tail");
1518 tail->next = gfc_get_ref ();
1519 tail = tail->next;
1522 return tail;
1526 /* Match any additional specifications associated with the current
1527 variable like member references or substrings. If equiv_flag is
1528 set we only match stuff that is allowed inside an EQUIVALENCE
1529 statement. */
1531 static match
1532 match_varspec (gfc_expr * primary, int equiv_flag)
1534 char name[GFC_MAX_SYMBOL_LEN + 1];
1535 gfc_ref *substring, *tail;
1536 gfc_component *component;
1537 gfc_symbol *sym;
1538 match m;
1540 tail = NULL;
1542 if (primary->symtree->n.sym->attr.dimension
1543 || (equiv_flag
1544 && gfc_peek_char () == '('))
1547 tail = extend_ref (primary, tail);
1548 tail->type = REF_ARRAY;
1550 m = gfc_match_array_ref (&tail->u.ar, primary->symtree->n.sym->as,
1551 equiv_flag);
1552 if (m != MATCH_YES)
1553 return m;
1556 sym = primary->symtree->n.sym;
1557 primary->ts = sym->ts;
1559 if (sym->ts.type != BT_DERIVED || gfc_match_char ('%') != MATCH_YES)
1560 goto check_substring;
1562 sym = sym->ts.derived;
1564 for (;;)
1566 m = gfc_match_name (name);
1567 if (m == MATCH_NO)
1568 gfc_error ("Expected structure component name at %C");
1569 if (m != MATCH_YES)
1570 return MATCH_ERROR;
1572 component = gfc_find_component (sym, name);
1573 if (component == NULL)
1574 return MATCH_ERROR;
1576 tail = extend_ref (primary, tail);
1577 tail->type = REF_COMPONENT;
1579 tail->u.c.component = component;
1580 tail->u.c.sym = sym;
1582 primary->ts = component->ts;
1584 if (component->as != NULL)
1586 tail = extend_ref (primary, tail);
1587 tail->type = REF_ARRAY;
1589 m = gfc_match_array_ref (&tail->u.ar, component->as, equiv_flag);
1590 if (m != MATCH_YES)
1591 return m;
1594 if (component->ts.type != BT_DERIVED
1595 || gfc_match_char ('%') != MATCH_YES)
1596 break;
1598 sym = component->ts.derived;
1601 check_substring:
1602 if (primary->ts.type == BT_CHARACTER)
1604 switch (match_substring (primary->ts.cl, equiv_flag, &substring))
1606 case MATCH_YES:
1607 if (tail == NULL)
1608 primary->ref = substring;
1609 else
1610 tail->next = substring;
1612 if (primary->expr_type == EXPR_CONSTANT)
1613 primary->expr_type = EXPR_SUBSTRING;
1615 break;
1617 case MATCH_NO:
1618 break;
1620 case MATCH_ERROR:
1621 return MATCH_ERROR;
1625 return MATCH_YES;
1629 /* Given an expression that is a variable, figure out what the
1630 ultimate variable's type and attribute is, traversing the reference
1631 structures if necessary.
1633 This subroutine is trickier than it looks. We start at the base
1634 symbol and store the attribute. Component references load a
1635 completely new attribute.
1637 A couple of rules come into play. Subobjects of targets are always
1638 targets themselves. If we see a component that goes through a
1639 pointer, then the expression must also be a target, since the
1640 pointer is associated with something (if it isn't core will soon be
1641 dumped). If we see a full part or section of an array, the
1642 expression is also an array.
1644 We can have at most one full array reference. */
1646 symbol_attribute
1647 gfc_variable_attr (gfc_expr * expr, gfc_typespec * ts)
1649 int dimension, pointer, target;
1650 symbol_attribute attr;
1651 gfc_ref *ref;
1653 if (expr->expr_type != EXPR_VARIABLE)
1654 gfc_internal_error ("gfc_variable_attr(): Expression isn't a variable");
1656 ref = expr->ref;
1657 attr = expr->symtree->n.sym->attr;
1659 dimension = attr.dimension;
1660 pointer = attr.pointer;
1662 target = attr.target;
1663 if (pointer)
1664 target = 1;
1666 if (ts != NULL && expr->ts.type == BT_UNKNOWN)
1667 *ts = expr->symtree->n.sym->ts;
1669 for (; ref; ref = ref->next)
1670 switch (ref->type)
1672 case REF_ARRAY:
1674 switch (ref->u.ar.type)
1676 case AR_FULL:
1677 dimension = 1;
1678 break;
1680 case AR_SECTION:
1681 pointer = 0;
1682 dimension = 1;
1683 break;
1685 case AR_ELEMENT:
1686 pointer = 0;
1687 break;
1689 case AR_UNKNOWN:
1690 gfc_internal_error ("gfc_variable_attr(): Bad array reference");
1693 break;
1695 case REF_COMPONENT:
1696 gfc_get_component_attr (&attr, ref->u.c.component);
1697 if (ts != NULL)
1698 *ts = ref->u.c.component->ts;
1700 pointer = ref->u.c.component->pointer;
1701 if (pointer)
1702 target = 1;
1704 break;
1706 case REF_SUBSTRING:
1707 pointer = 0;
1708 break;
1711 attr.dimension = dimension;
1712 attr.pointer = pointer;
1713 attr.target = target;
1715 return attr;
1719 /* Return the attribute from a general expression. */
1721 symbol_attribute
1722 gfc_expr_attr (gfc_expr * e)
1724 symbol_attribute attr;
1726 switch (e->expr_type)
1728 case EXPR_VARIABLE:
1729 attr = gfc_variable_attr (e, NULL);
1730 break;
1732 case EXPR_FUNCTION:
1733 gfc_clear_attr (&attr);
1735 if (e->value.function.esym != NULL)
1736 attr = e->value.function.esym->result->attr;
1738 /* TODO: NULL() returns pointers. May have to take care of this
1739 here. */
1741 break;
1743 default:
1744 gfc_clear_attr (&attr);
1745 break;
1748 return attr;
1752 /* Match a structure constructor. The initial symbol has already been
1753 seen. */
1755 match
1756 gfc_match_structure_constructor (gfc_symbol * sym, gfc_expr ** result)
1758 gfc_constructor *head, *tail;
1759 gfc_component *comp;
1760 gfc_expr *e;
1761 locus where;
1762 match m;
1764 head = tail = NULL;
1766 if (gfc_match_char ('(') != MATCH_YES)
1767 goto syntax;
1769 where = gfc_current_locus;
1771 gfc_find_component (sym, NULL);
1773 for (comp = sym->components; comp; comp = comp->next)
1775 if (head == NULL)
1776 tail = head = gfc_get_constructor ();
1777 else
1779 tail->next = gfc_get_constructor ();
1780 tail = tail->next;
1783 m = gfc_match_expr (&tail->expr);
1784 if (m == MATCH_NO)
1785 goto syntax;
1786 if (m == MATCH_ERROR)
1787 goto cleanup;
1789 if (gfc_match_char (',') == MATCH_YES)
1791 if (comp->next == NULL)
1793 gfc_error
1794 ("Too many components in structure constructor at %C");
1795 goto cleanup;
1798 continue;
1801 break;
1804 if (gfc_match_char (')') != MATCH_YES)
1805 goto syntax;
1807 if (comp->next != NULL)
1809 gfc_error ("Too few components in structure constructor at %C");
1810 goto cleanup;
1813 e = gfc_get_expr ();
1815 e->expr_type = EXPR_STRUCTURE;
1817 e->ts.type = BT_DERIVED;
1818 e->ts.derived = sym;
1819 e->where = where;
1821 e->value.constructor = head;
1823 *result = e;
1824 return MATCH_YES;
1826 syntax:
1827 gfc_error ("Syntax error in structure constructor at %C");
1829 cleanup:
1830 gfc_free_constructor (head);
1831 return MATCH_ERROR;
1835 /* Matches a variable name followed by anything that might follow it--
1836 array reference, argument list of a function, etc. */
1838 match
1839 gfc_match_rvalue (gfc_expr ** result)
1841 gfc_actual_arglist *actual_arglist;
1842 char name[GFC_MAX_SYMBOL_LEN + 1];
1843 gfc_state_data *st;
1844 gfc_symbol *sym;
1845 gfc_symtree *symtree;
1846 locus where;
1847 gfc_expr *e;
1848 match m;
1849 int i;
1851 m = gfc_match_name (name);
1852 if (m != MATCH_YES)
1853 return m;
1855 if (gfc_find_state (COMP_INTERFACE) == SUCCESS)
1856 i = gfc_get_sym_tree (name, NULL, &symtree);
1857 else
1858 i = gfc_get_ha_sym_tree (name, &symtree);
1860 if (i)
1861 return MATCH_ERROR;
1863 sym = symtree->n.sym;
1864 e = NULL;
1865 where = gfc_current_locus;
1867 gfc_set_sym_referenced (sym);
1869 if (sym->attr.function && sym->result == sym
1870 && (gfc_current_ns->proc_name == sym
1871 || (gfc_current_ns->parent != NULL
1872 && gfc_current_ns->parent->proc_name == sym)))
1873 goto variable;
1875 if (sym->attr.function || sym->attr.external || sym->attr.intrinsic)
1876 goto function0;
1878 if (sym->attr.generic)
1879 goto generic_function;
1881 switch (sym->attr.flavor)
1883 case FL_VARIABLE:
1884 variable:
1885 if (sym->ts.type == BT_UNKNOWN && gfc_peek_char () == '%'
1886 && gfc_get_default_type (sym, sym->ns)->type == BT_DERIVED)
1887 gfc_set_default_type (sym, 0, sym->ns);
1889 e = gfc_get_expr ();
1891 e->expr_type = EXPR_VARIABLE;
1892 e->symtree = symtree;
1894 m = match_varspec (e, 0);
1895 break;
1897 case FL_PARAMETER:
1898 if (sym->value
1899 && sym->value->expr_type != EXPR_ARRAY)
1900 e = gfc_copy_expr (sym->value);
1901 else
1903 e = gfc_get_expr ();
1904 e->expr_type = EXPR_VARIABLE;
1907 e->symtree = symtree;
1908 m = match_varspec (e, 0);
1909 break;
1911 case FL_DERIVED:
1912 sym = gfc_use_derived (sym);
1913 if (sym == NULL)
1914 m = MATCH_ERROR;
1915 else
1916 m = gfc_match_structure_constructor (sym, &e);
1917 break;
1919 /* If we're here, then the name is known to be the name of a
1920 procedure, yet it is not sure to be the name of a function. */
1921 case FL_PROCEDURE:
1922 if (sym->attr.subroutine)
1924 gfc_error ("Unexpected use of subroutine name '%s' at %C",
1925 sym->name);
1926 m = MATCH_ERROR;
1927 break;
1930 /* At this point, the name has to be a non-statement function.
1931 If the name is the same as the current function being
1932 compiled, then we have a variable reference (to the function
1933 result) if the name is non-recursive. */
1935 st = gfc_enclosing_unit (NULL);
1937 if (st != NULL && st->state == COMP_FUNCTION
1938 && st->sym == sym
1939 && !sym->attr.recursive)
1941 e = gfc_get_expr ();
1942 e->symtree = symtree;
1943 e->expr_type = EXPR_VARIABLE;
1945 m = match_varspec (e, 0);
1946 break;
1949 /* Match a function reference. */
1950 function0:
1951 m = gfc_match_actual_arglist (0, &actual_arglist);
1952 if (m == MATCH_NO)
1954 if (sym->attr.proc == PROC_ST_FUNCTION)
1955 gfc_error ("Statement function '%s' requires argument list at %C",
1956 sym->name);
1957 else
1958 gfc_error ("Function '%s' requires an argument list at %C",
1959 sym->name);
1961 m = MATCH_ERROR;
1962 break;
1965 if (m != MATCH_YES)
1967 m = MATCH_ERROR;
1968 break;
1971 gfc_get_ha_sym_tree (name, &symtree); /* Can't fail */
1972 sym = symtree->n.sym;
1974 e = gfc_get_expr ();
1975 e->symtree = symtree;
1976 e->expr_type = EXPR_FUNCTION;
1977 e->value.function.actual = actual_arglist;
1978 e->where = gfc_current_locus;
1980 if (sym->as != NULL)
1981 e->rank = sym->as->rank;
1983 if (!sym->attr.function
1984 && gfc_add_function (&sym->attr, NULL) == FAILURE)
1986 m = MATCH_ERROR;
1987 break;
1990 if (sym->result == NULL)
1991 sym->result = sym;
1993 m = MATCH_YES;
1994 break;
1996 case FL_UNKNOWN:
1998 /* Special case for derived type variables that get their types
1999 via an IMPLICIT statement. This can't wait for the
2000 resolution phase. */
2002 if (gfc_peek_char () == '%'
2003 && gfc_get_default_type (sym, sym->ns)->type == BT_DERIVED)
2004 gfc_set_default_type (sym, 0, sym->ns);
2006 /* If the symbol has a dimension attribute, the expression is a
2007 variable. */
2009 if (sym->attr.dimension)
2011 if (gfc_add_flavor (&sym->attr, FL_VARIABLE, NULL) == FAILURE)
2013 m = MATCH_ERROR;
2014 break;
2017 e = gfc_get_expr ();
2018 e->symtree = symtree;
2019 e->expr_type = EXPR_VARIABLE;
2020 m = match_varspec (e, 0);
2021 break;
2024 /* Name is not an array, so we peek to see if a '(' implies a
2025 function call or a substring reference. Otherwise the
2026 variable is just a scalar. */
2028 gfc_gobble_whitespace ();
2029 if (gfc_peek_char () != '(')
2031 /* Assume a scalar variable */
2032 e = gfc_get_expr ();
2033 e->symtree = symtree;
2034 e->expr_type = EXPR_VARIABLE;
2036 if (gfc_add_flavor (&sym->attr, FL_VARIABLE, NULL) == FAILURE)
2038 m = MATCH_ERROR;
2039 break;
2042 e->ts = sym->ts;
2043 m = match_varspec (e, 0);
2044 break;
2047 /* See if this could possibly be a substring reference of a name
2048 that we're not sure is a variable yet. */
2050 e = gfc_get_expr ();
2051 e->symtree = symtree;
2053 if ((sym->ts.type == BT_UNKNOWN || sym->ts.type == BT_CHARACTER)
2054 && match_substring (sym->ts.cl, 0, &e->ref) == MATCH_YES)
2057 e->expr_type = EXPR_VARIABLE;
2059 if (sym->attr.flavor != FL_VARIABLE
2060 && gfc_add_flavor (&sym->attr, FL_VARIABLE, NULL) == FAILURE)
2062 m = MATCH_ERROR;
2063 break;
2066 if (sym->ts.type == BT_UNKNOWN
2067 && gfc_set_default_type (sym, 1, NULL) == FAILURE)
2069 m = MATCH_ERROR;
2070 break;
2073 e->ts = sym->ts;
2074 m = MATCH_YES;
2075 break;
2078 /* Give up, assume we have a function. */
2080 gfc_get_sym_tree (name, NULL, &symtree); /* Can't fail */
2081 sym = symtree->n.sym;
2082 e->expr_type = EXPR_FUNCTION;
2084 if (!sym->attr.function
2085 && gfc_add_function (&sym->attr, NULL) == FAILURE)
2087 m = MATCH_ERROR;
2088 break;
2091 sym->result = sym;
2093 m = gfc_match_actual_arglist (0, &e->value.function.actual);
2094 if (m == MATCH_NO)
2095 gfc_error ("Missing argument list in function '%s' at %C", sym->name);
2097 if (m != MATCH_YES)
2099 m = MATCH_ERROR;
2100 break;
2103 /* If our new function returns a character, array or structure
2104 type, it might have subsequent references. */
2106 m = match_varspec (e, 0);
2107 if (m == MATCH_NO)
2108 m = MATCH_YES;
2110 break;
2112 generic_function:
2113 gfc_get_sym_tree (name, NULL, &symtree); /* Can't fail */
2115 e = gfc_get_expr ();
2116 e->symtree = symtree;
2117 e->expr_type = EXPR_FUNCTION;
2119 m = gfc_match_actual_arglist (0, &e->value.function.actual);
2120 break;
2122 default:
2123 gfc_error ("Symbol at %C is not appropriate for an expression");
2124 return MATCH_ERROR;
2127 if (m == MATCH_YES)
2129 e->where = where;
2130 *result = e;
2132 else
2133 gfc_free_expr (e);
2135 return m;
2139 /* Match a variable, ie something that can be assigned to. This
2140 starts as a symbol, can be a structure component or an array
2141 reference. It can be a function if the function doesn't have a
2142 separate RESULT variable. If the symbol has not been previously
2143 seen, we assume it is a variable. */
2145 match
2146 gfc_match_variable (gfc_expr ** result, int equiv_flag)
2148 gfc_symbol *sym;
2149 gfc_symtree *st;
2150 gfc_expr *expr;
2151 locus where;
2152 match m;
2154 m = gfc_match_sym_tree (&st, 1);
2155 if (m != MATCH_YES)
2156 return m;
2157 where = gfc_current_locus;
2159 sym = st->n.sym;
2160 gfc_set_sym_referenced (sym);
2161 switch (sym->attr.flavor)
2163 case FL_VARIABLE:
2164 break;
2166 case FL_UNKNOWN:
2167 if (gfc_add_flavor (&sym->attr, FL_VARIABLE, NULL) == FAILURE)
2168 return MATCH_ERROR;
2170 /* Special case for derived type variables that get their types
2171 via an IMPLICIT statement. This can't wait for the
2172 resolution phase. */
2174 if (gfc_peek_char () == '%'
2175 && gfc_get_default_type (sym, sym->ns)->type == BT_DERIVED)
2176 gfc_set_default_type (sym, 0, sym->ns);
2178 break;
2180 case FL_PROCEDURE:
2181 /* Check for a nonrecursive function result */
2182 if (sym->attr.function && (sym->result == sym || sym->attr.entry))
2185 /* If a function result is a derived type, then the derived
2186 type may still have to be resolved. */
2188 if (sym->ts.type == BT_DERIVED
2189 && gfc_use_derived (sym->ts.derived) == NULL)
2190 return MATCH_ERROR;
2192 break;
2195 /* Fall through to error */
2197 default:
2198 gfc_error ("Expected VARIABLE at %C");
2199 return MATCH_ERROR;
2202 expr = gfc_get_expr ();
2204 expr->expr_type = EXPR_VARIABLE;
2205 expr->symtree = st;
2206 expr->ts = sym->ts;
2207 expr->where = where;
2209 /* Now see if we have to do more. */
2210 m = match_varspec (expr, equiv_flag);
2211 if (m != MATCH_YES)
2213 gfc_free_expr (expr);
2214 return m;
2217 *result = expr;
2218 return MATCH_YES;