Skip several gcc.dg/builtin-dynamic-object-size tests on hppa*-*-hpux*
[official-gcc.git] / gcc / fortran / primary.cc
bloba1cc6c694213aa34aef764556fcecf8b1416ca1b
1 /* Primary expression subroutines
2 Copyright (C) 2000-2024 Free Software Foundation, Inc.
3 Contributed by Andy Vaught
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "options.h"
25 #include "gfortran.h"
26 #include "arith.h"
27 #include "match.h"
28 #include "parse.h"
29 #include "constructor.h"
31 int matching_actual_arglist = 0;
33 /* Matches a kind-parameter expression, which is either a named
34 symbolic constant or a nonnegative integer constant. If
35 successful, sets the kind value to the correct integer.
36 The argument 'is_iso_c' signals whether the kind is an ISO_C_BINDING
37 symbol like e.g. 'c_int'. */
39 static match
40 match_kind_param (int *kind, int *is_iso_c)
42 char name[GFC_MAX_SYMBOL_LEN + 1];
43 gfc_symbol *sym;
44 match m;
46 *is_iso_c = 0;
48 m = gfc_match_small_literal_int (kind, NULL, false);
49 if (m != MATCH_NO)
50 return m;
52 m = gfc_match_name (name, false);
53 if (m != MATCH_YES)
54 return m;
56 if (gfc_find_symbol (name, NULL, 1, &sym))
57 return MATCH_ERROR;
59 if (sym == NULL)
60 return MATCH_NO;
62 *is_iso_c = sym->attr.is_iso_c;
64 if (sym->attr.flavor != FL_PARAMETER)
65 return MATCH_NO;
67 if (sym->value == NULL)
68 return MATCH_NO;
70 if (gfc_extract_int (sym->value, kind))
71 return MATCH_NO;
73 gfc_set_sym_referenced (sym);
75 if (*kind < 0)
76 return MATCH_NO;
78 return MATCH_YES;
82 /* Get a trailing kind-specification for non-character variables.
83 Returns:
84 * the integer kind value or
85 * -1 if an error was generated,
86 * -2 if no kind was found.
87 The argument 'is_iso_c' signals whether the kind is an ISO_C_BINDING
88 symbol like e.g. 'c_int'. */
90 static int
91 get_kind (int *is_iso_c)
93 int kind;
94 match m;
96 *is_iso_c = 0;
98 if (gfc_match_char ('_', false) != MATCH_YES)
99 return -2;
101 m = match_kind_param (&kind, is_iso_c);
102 if (m == MATCH_NO)
103 gfc_error ("Missing kind-parameter at %C");
105 return (m == MATCH_YES) ? kind : -1;
109 /* Given a character and a radix, see if the character is a valid
110 digit in that radix. */
112 bool
113 gfc_check_digit (char c, int radix)
115 bool r;
117 switch (radix)
119 case 2:
120 r = ('0' <= c && c <= '1');
121 break;
123 case 8:
124 r = ('0' <= c && c <= '7');
125 break;
127 case 10:
128 r = ('0' <= c && c <= '9');
129 break;
131 case 16:
132 r = ISXDIGIT (c);
133 break;
135 default:
136 gfc_internal_error ("gfc_check_digit(): bad radix");
139 return r;
143 /* Match the digit string part of an integer if signflag is not set,
144 the signed digit string part if signflag is set. If the buffer
145 is NULL, we just count characters for the resolution pass. Returns
146 the number of characters matched, -1 for no match. */
148 static int
149 match_digits (int signflag, int radix, char *buffer)
151 locus old_loc;
152 int length;
153 char c;
155 length = 0;
156 c = gfc_next_ascii_char ();
158 if (signflag && (c == '+' || c == '-'))
160 if (buffer != NULL)
161 *buffer++ = c;
162 gfc_gobble_whitespace ();
163 c = gfc_next_ascii_char ();
164 length++;
167 if (!gfc_check_digit (c, radix))
168 return -1;
170 length++;
171 if (buffer != NULL)
172 *buffer++ = c;
174 for (;;)
176 old_loc = gfc_current_locus;
177 c = gfc_next_ascii_char ();
179 if (!gfc_check_digit (c, radix))
180 break;
182 if (buffer != NULL)
183 *buffer++ = c;
184 length++;
187 gfc_current_locus = old_loc;
189 return length;
192 /* Convert an integer string to an expression node. */
194 static gfc_expr *
195 convert_integer (const char *buffer, int kind, int radix, locus *where)
197 gfc_expr *e;
198 const char *t;
200 e = gfc_get_constant_expr (BT_INTEGER, kind, where);
201 /* A leading plus is allowed, but not by mpz_set_str. */
202 if (buffer[0] == '+')
203 t = buffer + 1;
204 else
205 t = buffer;
206 mpz_set_str (e->value.integer, t, radix);
208 return e;
212 /* Convert a real string to an expression node. */
214 static gfc_expr *
215 convert_real (const char *buffer, int kind, locus *where)
217 gfc_expr *e;
219 e = gfc_get_constant_expr (BT_REAL, kind, where);
220 mpfr_set_str (e->value.real, buffer, 10, GFC_RND_MODE);
222 return e;
226 /* Convert a pair of real, constant expression nodes to a single
227 complex expression node. */
229 static gfc_expr *
230 convert_complex (gfc_expr *real, gfc_expr *imag, int kind)
232 gfc_expr *e;
234 e = gfc_get_constant_expr (BT_COMPLEX, kind, &real->where);
235 mpc_set_fr_fr (e->value.complex, real->value.real, imag->value.real,
236 GFC_MPC_RND_MODE);
238 return e;
242 /* Match an integer (digit string and optional kind).
243 A sign will be accepted if signflag is set. */
245 static match
246 match_integer_constant (gfc_expr **result, int signflag)
248 int length, kind, is_iso_c;
249 locus old_loc;
250 char *buffer;
251 gfc_expr *e;
253 old_loc = gfc_current_locus;
254 gfc_gobble_whitespace ();
256 length = match_digits (signflag, 10, NULL);
257 gfc_current_locus = old_loc;
258 if (length == -1)
259 return MATCH_NO;
261 buffer = (char *) alloca (length + 1);
262 memset (buffer, '\0', length + 1);
264 gfc_gobble_whitespace ();
266 match_digits (signflag, 10, buffer);
268 kind = get_kind (&is_iso_c);
269 if (kind == -2)
270 kind = gfc_default_integer_kind;
271 if (kind == -1)
272 return MATCH_ERROR;
274 if (kind == 4 && flag_integer4_kind == 8)
275 kind = 8;
277 if (gfc_validate_kind (BT_INTEGER, kind, true) < 0)
279 gfc_error ("Integer kind %d at %C not available", kind);
280 return MATCH_ERROR;
283 e = convert_integer (buffer, kind, 10, &gfc_current_locus);
284 e->ts.is_c_interop = is_iso_c;
286 if (gfc_range_check (e) != ARITH_OK)
288 gfc_error ("Integer too big for its kind at %C. This check can be "
289 "disabled with the option %<-fno-range-check%>");
291 gfc_free_expr (e);
292 return MATCH_ERROR;
295 *result = e;
296 return MATCH_YES;
300 /* Match a Hollerith constant. */
302 static match
303 match_hollerith_constant (gfc_expr **result)
305 locus old_loc;
306 gfc_expr *e = NULL;
307 int num, pad;
308 int i;
310 old_loc = gfc_current_locus;
311 gfc_gobble_whitespace ();
313 if (match_integer_constant (&e, 0) == MATCH_YES
314 && gfc_match_char ('h') == MATCH_YES)
316 if (!gfc_notify_std (GFC_STD_LEGACY, "Hollerith constant at %C"))
317 goto cleanup;
319 if (gfc_extract_int (e, &num, 1))
320 goto cleanup;
321 if (num == 0)
323 gfc_error ("Invalid Hollerith constant: %L must contain at least "
324 "one character", &old_loc);
325 goto cleanup;
327 if (e->ts.kind != gfc_default_integer_kind)
329 gfc_error ("Invalid Hollerith constant: Integer kind at %L "
330 "should be default", &old_loc);
331 goto cleanup;
333 else
335 gfc_free_expr (e);
336 e = gfc_get_constant_expr (BT_HOLLERITH, gfc_default_character_kind,
337 &gfc_current_locus);
339 /* Calculate padding needed to fit default integer memory. */
340 pad = gfc_default_integer_kind - (num % gfc_default_integer_kind);
342 e->representation.string = XCNEWVEC (char, num + pad + 1);
344 for (i = 0; i < num; i++)
346 gfc_char_t c = gfc_next_char_literal (INSTRING_WARN);
347 if (! gfc_wide_fits_in_byte (c))
349 gfc_error ("Invalid Hollerith constant at %L contains a "
350 "wide character", &old_loc);
351 goto cleanup;
354 e->representation.string[i] = (unsigned char) c;
357 /* Now pad with blanks and end with a null char. */
358 for (i = 0; i < pad; i++)
359 e->representation.string[num + i] = ' ';
361 e->representation.string[num + i] = '\0';
362 e->representation.length = num + pad;
363 e->ts.u.pad = pad;
365 *result = e;
366 return MATCH_YES;
370 gfc_free_expr (e);
371 gfc_current_locus = old_loc;
372 return MATCH_NO;
374 cleanup:
375 gfc_free_expr (e);
376 return MATCH_ERROR;
380 /* Match a binary, octal or hexadecimal constant that can be found in
381 a DATA statement. The standard permits b'010...', o'73...', and
382 z'a1...' where b, o, and z can be capital letters. This function
383 also accepts postfixed forms of the constants: '01...'b, '73...'o,
384 and 'a1...'z. An additional extension is the use of x for z. */
386 static match
387 match_boz_constant (gfc_expr **result)
389 int radix, length, x_hex;
390 locus old_loc, start_loc;
391 char *buffer, post, delim;
392 gfc_expr *e;
394 start_loc = old_loc = gfc_current_locus;
395 gfc_gobble_whitespace ();
397 x_hex = 0;
398 switch (post = gfc_next_ascii_char ())
400 case 'b':
401 radix = 2;
402 post = 0;
403 break;
404 case 'o':
405 radix = 8;
406 post = 0;
407 break;
408 case 'x':
409 x_hex = 1;
410 /* Fall through. */
411 case 'z':
412 radix = 16;
413 post = 0;
414 break;
415 case '\'':
416 /* Fall through. */
417 case '\"':
418 delim = post;
419 post = 1;
420 radix = 16; /* Set to accept any valid digit string. */
421 break;
422 default:
423 goto backup;
426 /* No whitespace allowed here. */
428 if (post == 0)
429 delim = gfc_next_ascii_char ();
431 if (delim != '\'' && delim != '\"')
432 goto backup;
434 if (x_hex
435 && gfc_invalid_boz (G_("Hexadecimal constant at %L uses "
436 "nonstandard X instead of Z"), &gfc_current_locus))
437 return MATCH_ERROR;
439 old_loc = gfc_current_locus;
441 length = match_digits (0, radix, NULL);
442 if (length == -1)
444 gfc_error ("Empty set of digits in BOZ constant at %C");
445 return MATCH_ERROR;
448 if (gfc_next_ascii_char () != delim)
450 gfc_error ("Illegal character in BOZ constant at %C");
451 return MATCH_ERROR;
454 if (post == 1)
456 switch (gfc_next_ascii_char ())
458 case 'b':
459 radix = 2;
460 break;
461 case 'o':
462 radix = 8;
463 break;
464 case 'x':
465 /* Fall through. */
466 case 'z':
467 radix = 16;
468 break;
469 default:
470 goto backup;
473 if (gfc_invalid_boz (G_("BOZ constant at %C uses nonstandard postfix "
474 "syntax"), &gfc_current_locus))
475 return MATCH_ERROR;
478 gfc_current_locus = old_loc;
480 buffer = (char *) alloca (length + 1);
481 memset (buffer, '\0', length + 1);
483 match_digits (0, radix, buffer);
484 gfc_next_ascii_char (); /* Eat delimiter. */
485 if (post == 1)
486 gfc_next_ascii_char (); /* Eat postfixed b, o, z, or x. */
488 e = gfc_get_expr ();
489 e->expr_type = EXPR_CONSTANT;
490 e->ts.type = BT_BOZ;
491 e->where = gfc_current_locus;
492 e->boz.rdx = radix;
493 e->boz.len = length;
494 e->boz.str = XCNEWVEC (char, length + 1);
495 strncpy (e->boz.str, buffer, length);
497 if (!gfc_in_match_data ()
498 && (!gfc_notify_std(GFC_STD_F2003, "BOZ used outside a DATA "
499 "statement at %L", &e->where)))
500 return MATCH_ERROR;
502 *result = e;
503 return MATCH_YES;
505 backup:
506 gfc_current_locus = start_loc;
507 return MATCH_NO;
511 /* Match a real constant of some sort. Allow a signed constant if signflag
512 is nonzero. */
514 static match
515 match_real_constant (gfc_expr **result, int signflag)
517 int kind, count, seen_dp, seen_digits, is_iso_c, default_exponent;
518 locus old_loc, temp_loc;
519 char *p, *buffer, c, exp_char;
520 gfc_expr *e;
521 bool negate;
523 old_loc = gfc_current_locus;
524 gfc_gobble_whitespace ();
526 e = NULL;
528 default_exponent = 0;
529 count = 0;
530 seen_dp = 0;
531 seen_digits = 0;
532 exp_char = ' ';
533 negate = false;
535 c = gfc_next_ascii_char ();
536 if (signflag && (c == '+' || c == '-'))
538 if (c == '-')
539 negate = true;
541 gfc_gobble_whitespace ();
542 c = gfc_next_ascii_char ();
545 /* Scan significand. */
546 for (;; c = gfc_next_ascii_char (), count++)
548 if (c == '.')
550 if (seen_dp)
551 goto done;
553 /* Check to see if "." goes with a following operator like
554 ".eq.". */
555 temp_loc = gfc_current_locus;
556 c = gfc_next_ascii_char ();
558 if (c == 'e' || c == 'd' || c == 'q')
560 c = gfc_next_ascii_char ();
561 if (c == '.')
562 goto done; /* Operator named .e. or .d. */
565 if (ISALPHA (c))
566 goto done; /* Distinguish 1.e9 from 1.eq.2 */
568 gfc_current_locus = temp_loc;
569 seen_dp = 1;
570 continue;
573 if (ISDIGIT (c))
575 seen_digits = 1;
576 continue;
579 break;
582 if (!seen_digits || (c != 'e' && c != 'd' && c != 'q'))
583 goto done;
584 exp_char = c;
587 if (c == 'q')
589 if (!gfc_notify_std (GFC_STD_GNU, "exponent-letter %<q%> in "
590 "real-literal-constant at %C"))
591 return MATCH_ERROR;
592 else if (warn_real_q_constant)
593 gfc_warning (OPT_Wreal_q_constant,
594 "Extension: exponent-letter %<q%> in real-literal-constant "
595 "at %C");
598 /* Scan exponent. */
599 c = gfc_next_ascii_char ();
600 count++;
602 if (c == '+' || c == '-')
603 { /* optional sign */
604 c = gfc_next_ascii_char ();
605 count++;
608 if (!ISDIGIT (c))
610 /* With -fdec, default exponent to 0 instead of complaining. */
611 if (flag_dec)
612 default_exponent = 1;
613 else
615 gfc_error ("Missing exponent in real number at %C");
616 return MATCH_ERROR;
620 while (ISDIGIT (c))
622 c = gfc_next_ascii_char ();
623 count++;
626 done:
627 /* Check that we have a numeric constant. */
628 if (!seen_digits || (!seen_dp && exp_char == ' '))
630 gfc_current_locus = old_loc;
631 return MATCH_NO;
634 /* Convert the number. */
635 gfc_current_locus = old_loc;
636 gfc_gobble_whitespace ();
638 buffer = (char *) alloca (count + default_exponent + 1);
639 memset (buffer, '\0', count + default_exponent + 1);
641 p = buffer;
642 c = gfc_next_ascii_char ();
643 if (c == '+' || c == '-')
645 gfc_gobble_whitespace ();
646 c = gfc_next_ascii_char ();
649 /* Hack for mpfr_set_str(). */
650 for (;;)
652 if (c == 'd' || c == 'q')
653 *p = 'e';
654 else
655 *p = c;
656 p++;
657 if (--count == 0)
658 break;
660 c = gfc_next_ascii_char ();
662 if (default_exponent)
663 *p++ = '0';
665 kind = get_kind (&is_iso_c);
666 if (kind == -1)
667 goto cleanup;
669 if (kind == 4)
671 if (flag_real4_kind == 8)
672 kind = 8;
673 if (flag_real4_kind == 10)
674 kind = 10;
675 if (flag_real4_kind == 16)
676 kind = 16;
678 else if (kind == 8)
680 if (flag_real8_kind == 4)
681 kind = 4;
682 if (flag_real8_kind == 10)
683 kind = 10;
684 if (flag_real8_kind == 16)
685 kind = 16;
688 switch (exp_char)
690 case 'd':
691 if (kind != -2)
693 gfc_error ("Real number at %C has a %<d%> exponent and an explicit "
694 "kind");
695 goto cleanup;
697 kind = gfc_default_double_kind;
698 break;
700 case 'q':
701 if (kind != -2)
703 gfc_error ("Real number at %C has a %<q%> exponent and an explicit "
704 "kind");
705 goto cleanup;
708 /* The maximum possible real kind type parameter is 16. First, try
709 that for the kind, then fallback to trying kind=10 (Intel 80 bit)
710 extended precision. If neither value works, just given up. */
711 kind = 16;
712 if (gfc_validate_kind (BT_REAL, kind, true) < 0)
714 kind = 10;
715 if (gfc_validate_kind (BT_REAL, kind, true) < 0)
717 gfc_error ("Invalid exponent-letter %<q%> in "
718 "real-literal-constant at %C");
719 goto cleanup;
722 break;
724 default:
725 if (kind == -2)
726 kind = gfc_default_real_kind;
728 if (gfc_validate_kind (BT_REAL, kind, true) < 0)
730 gfc_error ("Invalid real kind %d at %C", kind);
731 goto cleanup;
735 e = convert_real (buffer, kind, &gfc_current_locus);
736 if (negate)
737 mpfr_neg (e->value.real, e->value.real, GFC_RND_MODE);
738 e->ts.is_c_interop = is_iso_c;
740 switch (gfc_range_check (e))
742 case ARITH_OK:
743 break;
744 case ARITH_OVERFLOW:
745 gfc_error ("Real constant overflows its kind at %C");
746 goto cleanup;
748 case ARITH_UNDERFLOW:
749 if (warn_underflow)
750 gfc_warning (OPT_Wunderflow, "Real constant underflows its kind at %C");
751 mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
752 break;
754 default:
755 gfc_internal_error ("gfc_range_check() returned bad value");
758 /* Warn about trailing digits which suggest the user added too many
759 trailing digits, which may cause the appearance of higher precision
760 than the kind can support.
762 This is done by replacing the rightmost non-zero digit with zero
763 and comparing with the original value. If these are equal, we
764 assume the user supplied more digits than intended (or forgot to
765 convert to the correct kind).
768 if (warn_conversion_extra)
770 mpfr_t r;
771 char *c1;
772 bool did_break;
774 c1 = strchr (buffer, 'e');
775 if (c1 == NULL)
776 c1 = buffer + strlen(buffer);
778 did_break = false;
779 for (p = c1; p > buffer;)
781 p--;
782 if (*p == '.')
783 continue;
785 if (*p != '0')
787 *p = '0';
788 did_break = true;
789 break;
793 if (did_break)
795 mpfr_init (r);
796 mpfr_set_str (r, buffer, 10, GFC_RND_MODE);
797 if (negate)
798 mpfr_neg (r, r, GFC_RND_MODE);
800 mpfr_sub (r, r, e->value.real, GFC_RND_MODE);
802 if (mpfr_cmp_ui (r, 0) == 0)
803 gfc_warning (OPT_Wconversion_extra, "Non-significant digits "
804 "in %qs number at %C, maybe incorrect KIND",
805 gfc_typename (&e->ts));
807 mpfr_clear (r);
811 *result = e;
812 return MATCH_YES;
814 cleanup:
815 gfc_free_expr (e);
816 return MATCH_ERROR;
820 /* Match a substring reference. */
822 static match
823 match_substring (gfc_charlen *cl, int init, gfc_ref **result, bool deferred)
825 gfc_expr *start, *end;
826 locus old_loc;
827 gfc_ref *ref;
828 match m;
830 start = NULL;
831 end = NULL;
833 old_loc = gfc_current_locus;
835 m = gfc_match_char ('(');
836 if (m != MATCH_YES)
837 return MATCH_NO;
839 if (gfc_match_char (':') != MATCH_YES)
841 if (init)
842 m = gfc_match_init_expr (&start);
843 else
844 m = gfc_match_expr (&start);
846 if (m != MATCH_YES)
848 m = MATCH_NO;
849 goto cleanup;
852 m = gfc_match_char (':');
853 if (m != MATCH_YES)
854 goto cleanup;
857 if (gfc_match_char (')') != MATCH_YES)
859 if (init)
860 m = gfc_match_init_expr (&end);
861 else
862 m = gfc_match_expr (&end);
864 if (m == MATCH_NO)
865 goto syntax;
866 if (m == MATCH_ERROR)
867 goto cleanup;
869 m = gfc_match_char (')');
870 if (m == MATCH_NO)
871 goto syntax;
874 /* Optimize away the (:) reference. */
875 if (start == NULL && end == NULL && !deferred)
876 ref = NULL;
877 else
879 ref = gfc_get_ref ();
881 ref->type = REF_SUBSTRING;
882 if (start == NULL)
883 start = gfc_get_int_expr (gfc_charlen_int_kind, NULL, 1);
884 ref->u.ss.start = start;
885 if (end == NULL && cl)
886 end = gfc_copy_expr (cl->length);
887 ref->u.ss.end = end;
888 ref->u.ss.length = cl;
891 *result = ref;
892 return MATCH_YES;
894 syntax:
895 gfc_error ("Syntax error in SUBSTRING specification at %C");
896 m = MATCH_ERROR;
898 cleanup:
899 gfc_free_expr (start);
900 gfc_free_expr (end);
902 gfc_current_locus = old_loc;
903 return m;
907 /* Reads the next character of a string constant, taking care to
908 return doubled delimiters on the input as a single instance of
909 the delimiter.
911 Special return values for "ret" argument are:
912 -1 End of the string, as determined by the delimiter
913 -2 Unterminated string detected
915 Backslash codes are also expanded at this time. */
917 static gfc_char_t
918 next_string_char (gfc_char_t delimiter, int *ret)
920 locus old_locus;
921 gfc_char_t c;
923 c = gfc_next_char_literal (INSTRING_WARN);
924 *ret = 0;
926 if (c == '\n')
928 *ret = -2;
929 return 0;
932 if (flag_backslash && c == '\\')
934 old_locus = gfc_current_locus;
936 if (gfc_match_special_char (&c) == MATCH_NO)
937 gfc_current_locus = old_locus;
939 if (!(gfc_option.allow_std & GFC_STD_GNU) && !inhibit_warnings)
940 gfc_warning (0, "Extension: backslash character at %C");
943 if (c != delimiter)
944 return c;
946 old_locus = gfc_current_locus;
947 c = gfc_next_char_literal (NONSTRING);
949 if (c == delimiter)
950 return c;
951 gfc_current_locus = old_locus;
953 *ret = -1;
954 return 0;
958 /* Special case of gfc_match_name() that matches a parameter kind name
959 before a string constant. This takes case of the weird but legal
960 case of:
962 kind_____'string'
964 where kind____ is a parameter. gfc_match_name() will happily slurp
965 up all the underscores, which leads to problems. If we return
966 MATCH_YES, the parse pointer points to the final underscore, which
967 is not part of the name. We never return MATCH_ERROR-- errors in
968 the name will be detected later. */
970 static match
971 match_charkind_name (char *name)
973 locus old_loc;
974 char c, peek;
975 int len;
977 gfc_gobble_whitespace ();
978 c = gfc_next_ascii_char ();
979 if (!ISALPHA (c))
980 return MATCH_NO;
982 *name++ = c;
983 len = 1;
985 for (;;)
987 old_loc = gfc_current_locus;
988 c = gfc_next_ascii_char ();
990 if (c == '_')
992 peek = gfc_peek_ascii_char ();
994 if (peek == '\'' || peek == '\"')
996 gfc_current_locus = old_loc;
997 *name = '\0';
998 return MATCH_YES;
1002 if (!ISALNUM (c)
1003 && c != '_'
1004 && (c != '$' || !flag_dollar_ok))
1005 break;
1007 *name++ = c;
1008 if (++len > GFC_MAX_SYMBOL_LEN)
1009 break;
1012 return MATCH_NO;
1016 /* See if the current input matches a character constant. Lots of
1017 contortions have to be done to match the kind parameter which comes
1018 before the actual string. The main consideration is that we don't
1019 want to error out too quickly. For example, we don't actually do
1020 any validation of the kinds until we have actually seen a legal
1021 delimiter. Using match_kind_param() generates errors too quickly. */
1023 static match
1024 match_string_constant (gfc_expr **result)
1026 char name[GFC_MAX_SYMBOL_LEN + 1], peek;
1027 size_t length;
1028 int kind,save_warn_ampersand, ret;
1029 locus old_locus, start_locus;
1030 gfc_symbol *sym;
1031 gfc_expr *e;
1032 match m;
1033 gfc_char_t c, delimiter, *p;
1035 old_locus = gfc_current_locus;
1037 gfc_gobble_whitespace ();
1039 c = gfc_next_char ();
1040 if (c == '\'' || c == '"')
1042 kind = gfc_default_character_kind;
1043 start_locus = gfc_current_locus;
1044 goto got_delim;
1047 if (gfc_wide_is_digit (c))
1049 kind = 0;
1051 while (gfc_wide_is_digit (c))
1053 kind = kind * 10 + c - '0';
1054 if (kind > 9999999)
1055 goto no_match;
1056 c = gfc_next_char ();
1060 else
1062 gfc_current_locus = old_locus;
1064 m = match_charkind_name (name);
1065 if (m != MATCH_YES)
1066 goto no_match;
1068 if (gfc_find_symbol (name, NULL, 1, &sym)
1069 || sym == NULL
1070 || sym->attr.flavor != FL_PARAMETER)
1071 goto no_match;
1073 kind = -1;
1074 c = gfc_next_char ();
1077 if (c != '_')
1078 goto no_match;
1080 c = gfc_next_char ();
1081 if (c != '\'' && c != '"')
1082 goto no_match;
1084 start_locus = gfc_current_locus;
1086 if (kind == -1)
1088 if (gfc_extract_int (sym->value, &kind, 1))
1089 return MATCH_ERROR;
1090 gfc_set_sym_referenced (sym);
1093 if (gfc_validate_kind (BT_CHARACTER, kind, true) < 0)
1095 gfc_error ("Invalid kind %d for CHARACTER constant at %C", kind);
1096 return MATCH_ERROR;
1099 got_delim:
1100 /* Scan the string into a block of memory by first figuring out how
1101 long it is, allocating the structure, then re-reading it. This
1102 isn't particularly efficient, but string constants aren't that
1103 common in most code. TODO: Use obstacks? */
1105 delimiter = c;
1106 length = 0;
1108 for (;;)
1110 c = next_string_char (delimiter, &ret);
1111 if (ret == -1)
1112 break;
1113 if (ret == -2)
1115 gfc_current_locus = start_locus;
1116 gfc_error ("Unterminated character constant beginning at %C");
1117 return MATCH_ERROR;
1120 length++;
1123 /* Peek at the next character to see if it is a b, o, z, or x for the
1124 postfixed BOZ literal constants. */
1125 peek = gfc_peek_ascii_char ();
1126 if (peek == 'b' || peek == 'o' || peek =='z' || peek == 'x')
1127 goto no_match;
1129 e = gfc_get_character_expr (kind, &start_locus, NULL, length);
1131 gfc_current_locus = start_locus;
1133 /* We disable the warning for the following loop as the warning has already
1134 been printed in the loop above. */
1135 save_warn_ampersand = warn_ampersand;
1136 warn_ampersand = false;
1138 p = e->value.character.string;
1139 for (size_t i = 0; i < length; i++)
1141 c = next_string_char (delimiter, &ret);
1143 if (!gfc_check_character_range (c, kind))
1145 gfc_free_expr (e);
1146 gfc_error ("Character %qs in string at %C is not representable "
1147 "in character kind %d", gfc_print_wide_char (c), kind);
1148 return MATCH_ERROR;
1151 *p++ = c;
1154 *p = '\0'; /* TODO: C-style string is for development/debug purposes. */
1155 warn_ampersand = save_warn_ampersand;
1157 next_string_char (delimiter, &ret);
1158 if (ret != -1)
1159 gfc_internal_error ("match_string_constant(): Delimiter not found");
1161 if (match_substring (NULL, 0, &e->ref, false) != MATCH_NO)
1162 e->expr_type = EXPR_SUBSTRING;
1164 /* Substrings with constant starting and ending points are eligible as
1165 designators (F2018, section 9.1). Simplify substrings to make them usable
1166 e.g. in data statements. */
1167 if (e->expr_type == EXPR_SUBSTRING
1168 && e->ref && e->ref->type == REF_SUBSTRING
1169 && e->ref->u.ss.start->expr_type == EXPR_CONSTANT
1170 && (e->ref->u.ss.end == NULL
1171 || e->ref->u.ss.end->expr_type == EXPR_CONSTANT))
1173 gfc_expr *res;
1174 ptrdiff_t istart, iend;
1175 size_t length;
1176 bool equal_length = false;
1178 /* Basic checks on substring starting and ending indices. */
1179 if (!gfc_resolve_substring (e->ref, &equal_length))
1180 return MATCH_ERROR;
1182 length = e->value.character.length;
1183 istart = gfc_mpz_get_hwi (e->ref->u.ss.start->value.integer);
1184 if (e->ref->u.ss.end == NULL)
1185 iend = length;
1186 else
1187 iend = gfc_mpz_get_hwi (e->ref->u.ss.end->value.integer);
1189 if (istart <= iend)
1191 if (istart < 1)
1193 gfc_error ("Substring start index (%ld) at %L below 1",
1194 (long) istart, &e->ref->u.ss.start->where);
1195 return MATCH_ERROR;
1197 if (iend > (ssize_t) length)
1199 gfc_error ("Substring end index (%ld) at %L exceeds string "
1200 "length", (long) iend, &e->ref->u.ss.end->where);
1201 return MATCH_ERROR;
1203 length = iend - istart + 1;
1205 else
1206 length = 0;
1208 res = gfc_get_constant_expr (BT_CHARACTER, e->ts.kind, &e->where);
1209 res->value.character.string = gfc_get_wide_string (length + 1);
1210 res->value.character.length = length;
1211 if (length > 0)
1212 memcpy (res->value.character.string,
1213 &e->value.character.string[istart - 1],
1214 length * sizeof (gfc_char_t));
1215 res->value.character.string[length] = '\0';
1216 e = res;
1219 *result = e;
1221 return MATCH_YES;
1223 no_match:
1224 gfc_current_locus = old_locus;
1225 return MATCH_NO;
1229 /* Match a .true. or .false. Returns 1 if a .true. was found,
1230 0 if a .false. was found, and -1 otherwise. */
1231 static int
1232 match_logical_constant_string (void)
1234 locus orig_loc = gfc_current_locus;
1236 gfc_gobble_whitespace ();
1237 if (gfc_next_ascii_char () == '.')
1239 char ch = gfc_next_ascii_char ();
1240 if (ch == 'f')
1242 if (gfc_next_ascii_char () == 'a'
1243 && gfc_next_ascii_char () == 'l'
1244 && gfc_next_ascii_char () == 's'
1245 && gfc_next_ascii_char () == 'e'
1246 && gfc_next_ascii_char () == '.')
1247 /* Matched ".false.". */
1248 return 0;
1250 else if (ch == 't')
1252 if (gfc_next_ascii_char () == 'r'
1253 && gfc_next_ascii_char () == 'u'
1254 && gfc_next_ascii_char () == 'e'
1255 && gfc_next_ascii_char () == '.')
1256 /* Matched ".true.". */
1257 return 1;
1260 gfc_current_locus = orig_loc;
1261 return -1;
1264 /* Match a .true. or .false. */
1266 static match
1267 match_logical_constant (gfc_expr **result)
1269 gfc_expr *e;
1270 int i, kind, is_iso_c;
1272 i = match_logical_constant_string ();
1273 if (i == -1)
1274 return MATCH_NO;
1276 kind = get_kind (&is_iso_c);
1277 if (kind == -1)
1278 return MATCH_ERROR;
1279 if (kind == -2)
1280 kind = gfc_default_logical_kind;
1282 if (gfc_validate_kind (BT_LOGICAL, kind, true) < 0)
1284 gfc_error ("Bad kind for logical constant at %C");
1285 return MATCH_ERROR;
1288 e = gfc_get_logical_expr (kind, &gfc_current_locus, i);
1289 e->ts.is_c_interop = is_iso_c;
1291 *result = e;
1292 return MATCH_YES;
1296 /* Match a real or imaginary part of a complex constant that is a
1297 symbolic constant. */
1299 static match
1300 match_sym_complex_part (gfc_expr **result)
1302 char name[GFC_MAX_SYMBOL_LEN + 1];
1303 gfc_symbol *sym;
1304 gfc_expr *e;
1305 match m;
1307 m = gfc_match_name (name);
1308 if (m != MATCH_YES)
1309 return m;
1311 if (gfc_find_symbol (name, NULL, 1, &sym) || sym == NULL)
1312 return MATCH_NO;
1314 if (sym->attr.flavor != FL_PARAMETER)
1316 /* Give the matcher for implied do-loops a chance to run. This yields
1317 a much saner error message for "write(*,*) (i, i=1, 6" where the
1318 right parenthesis is missing. */
1319 char c;
1320 gfc_gobble_whitespace ();
1321 c = gfc_peek_ascii_char ();
1322 if (c == '=' || c == ',')
1324 m = MATCH_NO;
1326 else
1328 gfc_error ("Expected PARAMETER symbol in complex constant at %C");
1329 m = MATCH_ERROR;
1331 return m;
1334 if (!sym->value)
1335 goto error;
1337 if (!gfc_numeric_ts (&sym->value->ts))
1339 gfc_error ("Numeric PARAMETER required in complex constant at %C");
1340 return MATCH_ERROR;
1343 if (sym->value->rank != 0)
1345 gfc_error ("Scalar PARAMETER required in complex constant at %C");
1346 return MATCH_ERROR;
1349 if (!gfc_notify_std (GFC_STD_F2003, "PARAMETER symbol in "
1350 "complex constant at %C"))
1351 return MATCH_ERROR;
1353 switch (sym->value->ts.type)
1355 case BT_REAL:
1356 e = gfc_copy_expr (sym->value);
1357 break;
1359 case BT_COMPLEX:
1360 e = gfc_complex2real (sym->value, sym->value->ts.kind);
1361 if (e == NULL)
1362 goto error;
1363 break;
1365 case BT_INTEGER:
1366 e = gfc_int2real (sym->value, gfc_default_real_kind);
1367 if (e == NULL)
1368 goto error;
1369 break;
1371 default:
1372 gfc_internal_error ("gfc_match_sym_complex_part(): Bad type");
1375 *result = e; /* e is a scalar, real, constant expression. */
1376 return MATCH_YES;
1378 error:
1379 gfc_error ("Error converting PARAMETER constant in complex constant at %C");
1380 return MATCH_ERROR;
1384 /* Match a real or imaginary part of a complex number. */
1386 static match
1387 match_complex_part (gfc_expr **result)
1389 match m;
1391 m = match_sym_complex_part (result);
1392 if (m != MATCH_NO)
1393 return m;
1395 m = match_real_constant (result, 1);
1396 if (m != MATCH_NO)
1397 return m;
1399 return match_integer_constant (result, 1);
1403 /* Try to match a complex constant. */
1405 static match
1406 match_complex_constant (gfc_expr **result)
1408 gfc_expr *e, *real, *imag;
1409 gfc_error_buffer old_error;
1410 gfc_typespec target;
1411 locus old_loc;
1412 int kind;
1413 match m;
1415 old_loc = gfc_current_locus;
1416 real = imag = e = NULL;
1418 m = gfc_match_char ('(');
1419 if (m != MATCH_YES)
1420 return m;
1422 gfc_push_error (&old_error);
1424 m = match_complex_part (&real);
1425 if (m == MATCH_NO)
1427 gfc_free_error (&old_error);
1428 goto cleanup;
1431 if (gfc_match_char (',') == MATCH_NO)
1433 /* It is possible that gfc_int2real issued a warning when
1434 converting an integer to real. Throw this away here. */
1436 gfc_clear_warning ();
1437 gfc_pop_error (&old_error);
1438 m = MATCH_NO;
1439 goto cleanup;
1442 /* If m is error, then something was wrong with the real part and we
1443 assume we have a complex constant because we've seen the ','. An
1444 ambiguous case here is the start of an iterator list of some
1445 sort. These sort of lists are matched prior to coming here. */
1447 if (m == MATCH_ERROR)
1449 gfc_free_error (&old_error);
1450 goto cleanup;
1452 gfc_pop_error (&old_error);
1454 m = match_complex_part (&imag);
1455 if (m == MATCH_NO)
1456 goto syntax;
1457 if (m == MATCH_ERROR)
1458 goto cleanup;
1460 m = gfc_match_char (')');
1461 if (m == MATCH_NO)
1463 /* Give the matcher for implied do-loops a chance to run. This
1464 yields a much saner error message for (/ (i, 4=i, 6) /). */
1465 if (gfc_peek_ascii_char () == '=')
1467 m = MATCH_ERROR;
1468 goto cleanup;
1470 else
1471 goto syntax;
1474 if (m == MATCH_ERROR)
1475 goto cleanup;
1477 /* Decide on the kind of this complex number. */
1478 if (real->ts.type == BT_REAL)
1480 if (imag->ts.type == BT_REAL)
1481 kind = gfc_kind_max (real, imag);
1482 else
1483 kind = real->ts.kind;
1485 else
1487 if (imag->ts.type == BT_REAL)
1488 kind = imag->ts.kind;
1489 else
1490 kind = gfc_default_real_kind;
1492 gfc_clear_ts (&target);
1493 target.type = BT_REAL;
1494 target.kind = kind;
1496 if (real->ts.type != BT_REAL || kind != real->ts.kind)
1497 gfc_convert_type (real, &target, 2);
1498 if (imag->ts.type != BT_REAL || kind != imag->ts.kind)
1499 gfc_convert_type (imag, &target, 2);
1501 e = convert_complex (real, imag, kind);
1502 e->where = gfc_current_locus;
1504 gfc_free_expr (real);
1505 gfc_free_expr (imag);
1507 *result = e;
1508 return MATCH_YES;
1510 syntax:
1511 gfc_error ("Syntax error in COMPLEX constant at %C");
1512 m = MATCH_ERROR;
1514 cleanup:
1515 gfc_free_expr (e);
1516 gfc_free_expr (real);
1517 gfc_free_expr (imag);
1518 gfc_current_locus = old_loc;
1520 return m;
1524 /* Match constants in any of several forms. Returns nonzero for a
1525 match, zero for no match. */
1527 match
1528 gfc_match_literal_constant (gfc_expr **result, int signflag)
1530 match m;
1532 m = match_complex_constant (result);
1533 if (m != MATCH_NO)
1534 return m;
1536 m = match_string_constant (result);
1537 if (m != MATCH_NO)
1538 return m;
1540 m = match_boz_constant (result);
1541 if (m != MATCH_NO)
1542 return m;
1544 m = match_real_constant (result, signflag);
1545 if (m != MATCH_NO)
1546 return m;
1548 m = match_hollerith_constant (result);
1549 if (m != MATCH_NO)
1550 return m;
1552 m = match_integer_constant (result, signflag);
1553 if (m != MATCH_NO)
1554 return m;
1556 m = match_logical_constant (result);
1557 if (m != MATCH_NO)
1558 return m;
1560 return MATCH_NO;
1564 /* This checks if a symbol is the return value of an encompassing function.
1565 Function nesting can be maximally two levels deep, but we may have
1566 additional local namespaces like BLOCK etc. */
1568 bool
1569 gfc_is_function_return_value (gfc_symbol *sym, gfc_namespace *ns)
1571 if (!sym->attr.function || (sym->result != sym))
1572 return false;
1573 while (ns)
1575 if (ns->proc_name == sym)
1576 return true;
1577 ns = ns->parent;
1579 return false;
1583 /* Match a single actual argument value. An actual argument is
1584 usually an expression, but can also be a procedure name. If the
1585 argument is a single name, it is not always possible to tell
1586 whether the name is a dummy procedure or not. We treat these cases
1587 by creating an argument that looks like a dummy procedure and
1588 fixing things later during resolution. */
1590 static match
1591 match_actual_arg (gfc_expr **result)
1593 char name[GFC_MAX_SYMBOL_LEN + 1];
1594 gfc_symtree *symtree;
1595 locus where, w;
1596 gfc_expr *e;
1597 char c;
1599 gfc_gobble_whitespace ();
1600 where = gfc_current_locus;
1602 switch (gfc_match_name (name))
1604 case MATCH_ERROR:
1605 return MATCH_ERROR;
1607 case MATCH_NO:
1608 break;
1610 case MATCH_YES:
1611 w = gfc_current_locus;
1612 gfc_gobble_whitespace ();
1613 c = gfc_next_ascii_char ();
1614 gfc_current_locus = w;
1616 if (c != ',' && c != ')')
1617 break;
1619 if (gfc_find_sym_tree (name, NULL, 1, &symtree))
1620 break;
1621 /* Handle error elsewhere. */
1623 /* Eliminate a couple of common cases where we know we don't
1624 have a function argument. */
1625 if (symtree == NULL)
1627 gfc_get_sym_tree (name, NULL, &symtree, false);
1628 gfc_set_sym_referenced (symtree->n.sym);
1630 else
1632 gfc_symbol *sym;
1634 sym = symtree->n.sym;
1635 gfc_set_sym_referenced (sym);
1636 if (sym->attr.flavor == FL_NAMELIST)
1638 gfc_error ("Namelist %qs cannot be an argument at %L",
1639 sym->name, &where);
1640 break;
1642 if (sym->attr.flavor != FL_PROCEDURE
1643 && sym->attr.flavor != FL_UNKNOWN)
1644 break;
1646 if (sym->attr.in_common && !sym->attr.proc_pointer)
1648 if (!gfc_add_flavor (&sym->attr, FL_VARIABLE,
1649 sym->name, &sym->declared_at))
1650 return MATCH_ERROR;
1651 break;
1654 /* If the symbol is a function with itself as the result and
1655 is being defined, then we have a variable. */
1656 if (sym->attr.function && sym->result == sym)
1658 if (gfc_is_function_return_value (sym, gfc_current_ns))
1659 break;
1661 if (sym->attr.entry
1662 && (sym->ns == gfc_current_ns
1663 || sym->ns == gfc_current_ns->parent))
1665 gfc_entry_list *el = NULL;
1667 for (el = sym->ns->entries; el; el = el->next)
1668 if (sym == el->sym)
1669 break;
1671 if (el)
1672 break;
1677 e = gfc_get_expr (); /* Leave it unknown for now */
1678 e->symtree = symtree;
1679 e->expr_type = EXPR_VARIABLE;
1680 e->ts.type = BT_PROCEDURE;
1681 e->where = where;
1683 *result = e;
1684 return MATCH_YES;
1687 gfc_current_locus = where;
1688 return gfc_match_expr (result);
1692 /* Match a keyword argument or type parameter spec list.. */
1694 static match
1695 match_keyword_arg (gfc_actual_arglist *actual, gfc_actual_arglist *base, bool pdt)
1697 char name[GFC_MAX_SYMBOL_LEN + 1];
1698 gfc_actual_arglist *a;
1699 locus name_locus;
1700 match m;
1702 name_locus = gfc_current_locus;
1703 m = gfc_match_name (name);
1705 if (m != MATCH_YES)
1706 goto cleanup;
1707 if (gfc_match_char ('=') != MATCH_YES)
1709 m = MATCH_NO;
1710 goto cleanup;
1713 if (pdt)
1715 if (gfc_match_char ('*') == MATCH_YES)
1717 actual->spec_type = SPEC_ASSUMED;
1718 goto add_name;
1720 else if (gfc_match_char (':') == MATCH_YES)
1722 actual->spec_type = SPEC_DEFERRED;
1723 goto add_name;
1725 else
1726 actual->spec_type = SPEC_EXPLICIT;
1729 m = match_actual_arg (&actual->expr);
1730 if (m != MATCH_YES)
1731 goto cleanup;
1733 /* Make sure this name has not appeared yet. */
1734 add_name:
1735 if (name[0] != '\0')
1737 for (a = base; a; a = a->next)
1738 if (a->name != NULL && strcmp (a->name, name) == 0)
1740 gfc_error ("Keyword %qs at %C has already appeared in the "
1741 "current argument list", name);
1742 return MATCH_ERROR;
1746 actual->name = gfc_get_string ("%s", name);
1747 return MATCH_YES;
1749 cleanup:
1750 gfc_current_locus = name_locus;
1751 return m;
1755 /* Match an argument list function, such as %VAL. */
1757 static match
1758 match_arg_list_function (gfc_actual_arglist *result)
1760 char name[GFC_MAX_SYMBOL_LEN + 1];
1761 locus old_locus;
1762 match m;
1764 old_locus = gfc_current_locus;
1766 if (gfc_match_char ('%') != MATCH_YES)
1768 m = MATCH_NO;
1769 goto cleanup;
1772 m = gfc_match ("%n (", name);
1773 if (m != MATCH_YES)
1774 goto cleanup;
1776 if (name[0] != '\0')
1778 switch (name[0])
1780 case 'l':
1781 if (startswith (name, "loc"))
1783 result->name = "%LOC";
1784 break;
1786 /* FALLTHRU */
1787 case 'r':
1788 if (startswith (name, "ref"))
1790 result->name = "%REF";
1791 break;
1793 /* FALLTHRU */
1794 case 'v':
1795 if (startswith (name, "val"))
1797 result->name = "%VAL";
1798 break;
1800 /* FALLTHRU */
1801 default:
1802 m = MATCH_ERROR;
1803 goto cleanup;
1807 if (!gfc_notify_std (GFC_STD_GNU, "argument list function at %C"))
1809 m = MATCH_ERROR;
1810 goto cleanup;
1813 m = match_actual_arg (&result->expr);
1814 if (m != MATCH_YES)
1815 goto cleanup;
1817 if (gfc_match_char (')') != MATCH_YES)
1819 m = MATCH_NO;
1820 goto cleanup;
1823 return MATCH_YES;
1825 cleanup:
1826 gfc_current_locus = old_locus;
1827 return m;
1831 /* Matches an actual argument list of a function or subroutine, from
1832 the opening parenthesis to the closing parenthesis. The argument
1833 list is assumed to allow keyword arguments because we don't know if
1834 the symbol associated with the procedure has an implicit interface
1835 or not. We make sure keywords are unique. If sub_flag is set,
1836 we're matching the argument list of a subroutine.
1838 NOTE: An alternative use for this function is to match type parameter
1839 spec lists, which are so similar to actual argument lists that the
1840 machinery can be reused. This use is flagged by the optional argument
1841 'pdt'. */
1843 match
1844 gfc_match_actual_arglist (int sub_flag, gfc_actual_arglist **argp, bool pdt)
1846 gfc_actual_arglist *head, *tail;
1847 int seen_keyword;
1848 gfc_st_label *label;
1849 locus old_loc;
1850 match m;
1852 *argp = tail = NULL;
1853 old_loc = gfc_current_locus;
1855 seen_keyword = 0;
1857 if (gfc_match_char ('(') == MATCH_NO)
1858 return (sub_flag) ? MATCH_YES : MATCH_NO;
1860 if (gfc_match_char (')') == MATCH_YES)
1861 return MATCH_YES;
1863 head = NULL;
1865 matching_actual_arglist++;
1867 for (;;)
1869 if (head == NULL)
1870 head = tail = gfc_get_actual_arglist ();
1871 else
1873 tail->next = gfc_get_actual_arglist ();
1874 tail = tail->next;
1877 if (sub_flag && !pdt && gfc_match_char ('*') == MATCH_YES)
1879 m = gfc_match_st_label (&label);
1880 if (m == MATCH_NO)
1881 gfc_error ("Expected alternate return label at %C");
1882 if (m != MATCH_YES)
1883 goto cleanup;
1885 if (!gfc_notify_std (GFC_STD_F95_OBS, "Alternate-return argument "
1886 "at %C"))
1887 goto cleanup;
1889 tail->label = label;
1890 goto next;
1893 if (pdt && !seen_keyword)
1895 if (gfc_match_char (':') == MATCH_YES)
1897 tail->spec_type = SPEC_DEFERRED;
1898 goto next;
1900 else if (gfc_match_char ('*') == MATCH_YES)
1902 tail->spec_type = SPEC_ASSUMED;
1903 goto next;
1905 else
1906 tail->spec_type = SPEC_EXPLICIT;
1908 m = match_keyword_arg (tail, head, pdt);
1909 if (m == MATCH_YES)
1911 seen_keyword = 1;
1912 goto next;
1914 if (m == MATCH_ERROR)
1915 goto cleanup;
1918 /* After the first keyword argument is seen, the following
1919 arguments must also have keywords. */
1920 if (seen_keyword)
1922 m = match_keyword_arg (tail, head, pdt);
1924 if (m == MATCH_ERROR)
1925 goto cleanup;
1926 if (m == MATCH_NO)
1928 gfc_error ("Missing keyword name in actual argument list at %C");
1929 goto cleanup;
1933 else
1935 /* Try an argument list function, like %VAL. */
1936 m = match_arg_list_function (tail);
1937 if (m == MATCH_ERROR)
1938 goto cleanup;
1940 /* See if we have the first keyword argument. */
1941 if (m == MATCH_NO)
1943 m = match_keyword_arg (tail, head, false);
1944 if (m == MATCH_YES)
1945 seen_keyword = 1;
1946 if (m == MATCH_ERROR)
1947 goto cleanup;
1950 if (m == MATCH_NO)
1952 /* Try for a non-keyword argument. */
1953 m = match_actual_arg (&tail->expr);
1954 if (m == MATCH_ERROR)
1955 goto cleanup;
1956 if (m == MATCH_NO)
1957 goto syntax;
1962 next:
1963 if (gfc_match_char (')') == MATCH_YES)
1964 break;
1965 if (gfc_match_char (',') != MATCH_YES)
1966 goto syntax;
1969 *argp = head;
1970 matching_actual_arglist--;
1971 return MATCH_YES;
1973 syntax:
1974 gfc_error ("Syntax error in argument list at %C");
1976 cleanup:
1977 gfc_free_actual_arglist (head);
1978 gfc_current_locus = old_loc;
1979 matching_actual_arglist--;
1980 return MATCH_ERROR;
1984 /* Used by gfc_match_varspec() to extend the reference list by one
1985 element. */
1987 static gfc_ref *
1988 extend_ref (gfc_expr *primary, gfc_ref *tail)
1990 if (primary->ref == NULL)
1991 primary->ref = tail = gfc_get_ref ();
1992 else
1994 if (tail == NULL)
1995 gfc_internal_error ("extend_ref(): Bad tail");
1996 tail->next = gfc_get_ref ();
1997 tail = tail->next;
2000 return tail;
2004 /* Used by gfc_match_varspec() to match an inquiry reference. */
2006 static bool
2007 is_inquiry_ref (const char *name, gfc_ref **ref)
2009 inquiry_type type;
2011 if (name == NULL)
2012 return false;
2014 if (ref) *ref = NULL;
2016 if (strcmp (name, "re") == 0)
2017 type = INQUIRY_RE;
2018 else if (strcmp (name, "im") == 0)
2019 type = INQUIRY_IM;
2020 else if (strcmp (name, "kind") == 0)
2021 type = INQUIRY_KIND;
2022 else if (strcmp (name, "len") == 0)
2023 type = INQUIRY_LEN;
2024 else
2025 return false;
2027 if (ref)
2029 *ref = gfc_get_ref ();
2030 (*ref)->type = REF_INQUIRY;
2031 (*ref)->u.i = type;
2034 return true;
2038 /* Match any additional specifications associated with the current
2039 variable like member references or substrings. If equiv_flag is
2040 set we only match stuff that is allowed inside an EQUIVALENCE
2041 statement. sub_flag tells whether we expect a type-bound procedure found
2042 to be a subroutine as part of CALL or a FUNCTION. For procedure pointer
2043 components, 'ppc_arg' determines whether the PPC may be called (with an
2044 argument list), or whether it may just be referred to as a pointer. */
2046 match
2047 gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag,
2048 bool ppc_arg)
2050 char name[GFC_MAX_SYMBOL_LEN + 1];
2051 gfc_ref *substring, *tail, *tmp;
2052 gfc_component *component = NULL;
2053 gfc_component *previous = NULL;
2054 gfc_symbol *sym = primary->symtree->n.sym;
2055 gfc_expr *tgt_expr = NULL;
2056 match m;
2057 bool unknown;
2058 bool inquiry;
2059 bool intrinsic;
2060 locus old_loc;
2061 char sep;
2063 tail = NULL;
2065 gfc_gobble_whitespace ();
2067 if (gfc_peek_ascii_char () == '[')
2069 if ((sym->ts.type != BT_CLASS && sym->attr.dimension)
2070 || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
2071 && CLASS_DATA (sym)->attr.dimension))
2073 gfc_error ("Array section designator, e.g. %<(:)%>, is required "
2074 "besides the coarray designator %<[...]%> at %C");
2075 return MATCH_ERROR;
2077 if ((sym->ts.type != BT_CLASS && !sym->attr.codimension)
2078 || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
2079 && !CLASS_DATA (sym)->attr.codimension))
2081 gfc_error ("Coarray designator at %C but %qs is not a coarray",
2082 sym->name);
2083 return MATCH_ERROR;
2087 if (sym->assoc && sym->assoc->target)
2088 tgt_expr = sym->assoc->target;
2090 /* For associate names, we may not yet know whether they are arrays or not.
2091 If the selector expression is unambiguously an array; eg. a full array
2092 or an array section, then the associate name must be an array and we can
2093 fix it now. Otherwise, if parentheses follow and it is not a character
2094 type, we have to assume that it actually is one for now. The final
2095 decision will be made at resolution, of course. */
2096 if (sym->assoc
2097 && gfc_peek_ascii_char () == '('
2098 && sym->ts.type != BT_CLASS
2099 && !sym->attr.dimension)
2101 gfc_ref *ref = NULL;
2103 if (!sym->assoc->dangling && tgt_expr)
2105 if (tgt_expr->expr_type == EXPR_VARIABLE)
2106 gfc_resolve_expr (tgt_expr);
2108 ref = tgt_expr->ref;
2109 for (; ref; ref = ref->next)
2110 if (ref->type == REF_ARRAY
2111 && (ref->u.ar.type == AR_FULL
2112 || ref->u.ar.type == AR_SECTION))
2113 break;
2116 if (ref || (!(sym->assoc->dangling || sym->ts.type == BT_CHARACTER)
2117 && sym->assoc->st
2118 && sym->assoc->st->n.sym
2119 && sym->assoc->st->n.sym->attr.dimension == 0))
2121 sym->attr.dimension = 1;
2122 if (sym->as == NULL
2123 && sym->assoc->st
2124 && sym->assoc->st->n.sym
2125 && sym->assoc->st->n.sym->as)
2126 sym->as = gfc_copy_array_spec (sym->assoc->st->n.sym->as);
2129 else if (sym->ts.type == BT_CLASS
2130 && tgt_expr
2131 && tgt_expr->expr_type == EXPR_VARIABLE
2132 && sym->ts.u.derived != tgt_expr->ts.u.derived)
2134 gfc_resolve_expr (tgt_expr);
2135 if (tgt_expr->rank)
2136 sym->ts.u.derived = tgt_expr->ts.u.derived;
2139 if ((equiv_flag && gfc_peek_ascii_char () == '(')
2140 || gfc_peek_ascii_char () == '[' || sym->attr.codimension
2141 || (sym->attr.dimension && sym->ts.type != BT_CLASS
2142 && !sym->attr.proc_pointer && !gfc_is_proc_ptr_comp (primary)
2143 && !(gfc_matching_procptr_assignment
2144 && sym->attr.flavor == FL_PROCEDURE))
2145 || (sym->ts.type == BT_CLASS && sym->attr.class_ok
2146 && sym->ts.u.derived && CLASS_DATA (sym)
2147 && (CLASS_DATA (sym)->attr.dimension
2148 || CLASS_DATA (sym)->attr.codimension)))
2150 gfc_array_spec *as;
2152 tail = extend_ref (primary, tail);
2153 tail->type = REF_ARRAY;
2155 /* In EQUIVALENCE, we don't know yet whether we are seeing
2156 an array, character variable or array of character
2157 variables. We'll leave the decision till resolve time. */
2159 if (equiv_flag)
2160 as = NULL;
2161 else if (sym->ts.type == BT_CLASS && CLASS_DATA (sym))
2162 as = CLASS_DATA (sym)->as;
2163 else
2164 as = sym->as;
2166 m = gfc_match_array_ref (&tail->u.ar, as, equiv_flag,
2167 as ? as->corank : 0);
2168 if (m != MATCH_YES)
2169 return m;
2171 gfc_gobble_whitespace ();
2172 if (equiv_flag && gfc_peek_ascii_char () == '(')
2174 tail = extend_ref (primary, tail);
2175 tail->type = REF_ARRAY;
2177 m = gfc_match_array_ref (&tail->u.ar, NULL, equiv_flag, 0);
2178 if (m != MATCH_YES)
2179 return m;
2183 primary->ts = sym->ts;
2185 if (equiv_flag)
2186 return MATCH_YES;
2188 /* With DEC extensions, member separator may be '.' or '%'. */
2189 sep = gfc_peek_ascii_char ();
2190 m = gfc_match_member_sep (sym);
2191 if (m == MATCH_ERROR)
2192 return MATCH_ERROR;
2194 inquiry = false;
2195 if (m == MATCH_YES && sep == '%'
2196 && primary->ts.type != BT_CLASS
2197 && primary->ts.type != BT_DERIVED)
2199 match mm;
2200 old_loc = gfc_current_locus;
2201 mm = gfc_match_name (name);
2202 if (mm == MATCH_YES && is_inquiry_ref (name, &tmp))
2203 inquiry = true;
2204 gfc_current_locus = old_loc;
2207 if (sym->ts.type == BT_UNKNOWN && m == MATCH_YES
2208 && gfc_get_default_type (sym->name, sym->ns)->type == BT_DERIVED)
2209 gfc_set_default_type (sym, 0, sym->ns);
2211 /* See if there is a usable typespec in the "no IMPLICIT type" error. */
2212 if (sym->ts.type == BT_UNKNOWN && m == MATCH_YES)
2214 bool permissible;
2216 /* These target expressions can be resolved at any time. */
2217 permissible = tgt_expr && tgt_expr->symtree && tgt_expr->symtree->n.sym
2218 && (tgt_expr->symtree->n.sym->attr.use_assoc
2219 || tgt_expr->symtree->n.sym->attr.host_assoc
2220 || tgt_expr->symtree->n.sym->attr.if_source
2221 == IFSRC_DECL);
2222 permissible = permissible
2223 || (tgt_expr && tgt_expr->expr_type == EXPR_OP);
2225 if (permissible)
2227 gfc_resolve_expr (tgt_expr);
2228 sym->ts = tgt_expr->ts;
2231 if (sym->ts.type == BT_UNKNOWN)
2233 gfc_error ("Symbol %qs at %C has no IMPLICIT type", sym->name);
2234 return MATCH_ERROR;
2237 else if ((sym->ts.type != BT_DERIVED && sym->ts.type != BT_CLASS)
2238 && m == MATCH_YES && !inquiry)
2240 gfc_error ("Unexpected %<%c%> for nonderived-type variable %qs at %C",
2241 sep, sym->name);
2242 return MATCH_ERROR;
2245 if ((sym->ts.type != BT_DERIVED && sym->ts.type != BT_CLASS && !inquiry)
2246 || m != MATCH_YES)
2247 goto check_substring;
2249 if (!inquiry)
2250 sym = sym->ts.u.derived;
2251 else
2252 sym = NULL;
2254 for (;;)
2256 bool t;
2257 gfc_symtree *tbp;
2259 m = gfc_match_name (name);
2260 if (m == MATCH_NO)
2261 gfc_error ("Expected structure component name at %C");
2262 if (m != MATCH_YES)
2263 return MATCH_ERROR;
2265 intrinsic = false;
2266 if (primary->ts.type != BT_CLASS && primary->ts.type != BT_DERIVED)
2268 inquiry = is_inquiry_ref (name, &tmp);
2269 if (inquiry)
2270 sym = NULL;
2272 if (sep == '%')
2274 if (tmp)
2276 switch (tmp->u.i)
2278 case INQUIRY_RE:
2279 case INQUIRY_IM:
2280 if (!gfc_notify_std (GFC_STD_F2008,
2281 "RE or IM part_ref at %C"))
2282 return MATCH_ERROR;
2283 break;
2285 case INQUIRY_KIND:
2286 if (!gfc_notify_std (GFC_STD_F2003,
2287 "KIND part_ref at %C"))
2288 return MATCH_ERROR;
2289 break;
2291 case INQUIRY_LEN:
2292 if (!gfc_notify_std (GFC_STD_F2003, "LEN part_ref at %C"))
2293 return MATCH_ERROR;
2294 break;
2297 if ((tmp->u.i == INQUIRY_RE || tmp->u.i == INQUIRY_IM)
2298 && primary->ts.type != BT_COMPLEX)
2300 gfc_error ("The RE or IM part_ref at %C must be "
2301 "applied to a COMPLEX expression");
2302 return MATCH_ERROR;
2304 else if (tmp->u.i == INQUIRY_LEN
2305 && primary->ts.type != BT_CHARACTER)
2307 gfc_error ("The LEN part_ref at %C must be applied "
2308 "to a CHARACTER expression");
2309 return MATCH_ERROR;
2312 if (primary->ts.type != BT_UNKNOWN)
2313 intrinsic = true;
2316 else
2317 inquiry = false;
2319 if (sym && sym->f2k_derived)
2320 tbp = gfc_find_typebound_proc (sym, &t, name, false, &gfc_current_locus);
2321 else
2322 tbp = NULL;
2324 if (tbp)
2326 gfc_symbol* tbp_sym;
2328 if (!t)
2329 return MATCH_ERROR;
2331 gcc_assert (!tail || !tail->next);
2333 if (!(primary->expr_type == EXPR_VARIABLE
2334 || (primary->expr_type == EXPR_STRUCTURE
2335 && primary->symtree && primary->symtree->n.sym
2336 && primary->symtree->n.sym->attr.flavor)))
2337 return MATCH_ERROR;
2339 if (tbp->n.tb->is_generic)
2340 tbp_sym = NULL;
2341 else
2342 tbp_sym = tbp->n.tb->u.specific->n.sym;
2344 primary->expr_type = EXPR_COMPCALL;
2345 primary->value.compcall.tbp = tbp->n.tb;
2346 primary->value.compcall.name = tbp->name;
2347 primary->value.compcall.ignore_pass = 0;
2348 primary->value.compcall.assign = 0;
2349 primary->value.compcall.base_object = NULL;
2350 gcc_assert (primary->symtree->n.sym->attr.referenced);
2351 if (tbp_sym)
2352 primary->ts = tbp_sym->ts;
2353 else
2354 gfc_clear_ts (&primary->ts);
2356 m = gfc_match_actual_arglist (tbp->n.tb->subroutine,
2357 &primary->value.compcall.actual);
2358 if (m == MATCH_ERROR)
2359 return MATCH_ERROR;
2360 if (m == MATCH_NO)
2362 if (sub_flag)
2363 primary->value.compcall.actual = NULL;
2364 else
2366 gfc_error ("Expected argument list at %C");
2367 return MATCH_ERROR;
2371 break;
2374 previous = component;
2376 if (!inquiry && !intrinsic)
2377 component = gfc_find_component (sym, name, false, false, &tmp);
2378 else
2379 component = NULL;
2381 if (intrinsic && !inquiry)
2383 if (previous)
2384 gfc_error ("%qs at %C is not an inquiry reference to an intrinsic "
2385 "type component %qs", name, previous->name);
2386 else
2387 gfc_error ("%qs at %C is not an inquiry reference to an intrinsic "
2388 "type component", name);
2389 return MATCH_ERROR;
2391 else if (component == NULL && !inquiry)
2392 return MATCH_ERROR;
2394 /* Extend the reference chain determined by gfc_find_component or
2395 is_inquiry_ref. */
2396 if (primary->ref == NULL)
2397 primary->ref = tmp;
2398 else
2400 /* Set by the for loop below for the last component ref. */
2401 gcc_assert (tail != NULL);
2402 tail->next = tmp;
2405 /* The reference chain may be longer than one hop for union
2406 subcomponents; find the new tail. */
2407 for (tail = tmp; tail->next; tail = tail->next)
2410 if (tmp && tmp->type == REF_INQUIRY)
2412 if (!primary->where.lb || !primary->where.nextc)
2413 primary->where = gfc_current_locus;
2414 gfc_simplify_expr (primary, 0);
2416 if (primary->expr_type == EXPR_CONSTANT)
2417 goto check_done;
2419 switch (tmp->u.i)
2421 case INQUIRY_RE:
2422 case INQUIRY_IM:
2423 if (!gfc_notify_std (GFC_STD_F2008, "RE or IM part_ref at %C"))
2424 return MATCH_ERROR;
2426 if (primary->ts.type != BT_COMPLEX)
2428 gfc_error ("The RE or IM part_ref at %C must be "
2429 "applied to a COMPLEX expression");
2430 return MATCH_ERROR;
2432 primary->ts.type = BT_REAL;
2433 break;
2435 case INQUIRY_LEN:
2436 if (!gfc_notify_std (GFC_STD_F2003, "LEN part_ref at %C"))
2437 return MATCH_ERROR;
2439 if (primary->ts.type != BT_CHARACTER)
2441 gfc_error ("The LEN part_ref at %C must be applied "
2442 "to a CHARACTER expression");
2443 return MATCH_ERROR;
2445 primary->ts.u.cl = NULL;
2446 primary->ts.type = BT_INTEGER;
2447 primary->ts.kind = gfc_default_integer_kind;
2448 break;
2450 case INQUIRY_KIND:
2451 if (!gfc_notify_std (GFC_STD_F2003, "KIND part_ref at %C"))
2452 return MATCH_ERROR;
2454 if (primary->ts.type == BT_CLASS
2455 || primary->ts.type == BT_DERIVED)
2457 gfc_error ("The KIND part_ref at %C must be applied "
2458 "to an expression of intrinsic type");
2459 return MATCH_ERROR;
2461 primary->ts.type = BT_INTEGER;
2462 primary->ts.kind = gfc_default_integer_kind;
2463 break;
2465 default:
2466 gcc_unreachable ();
2469 goto check_done;
2472 primary->ts = component->ts;
2474 if (component->attr.proc_pointer && ppc_arg)
2476 /* Procedure pointer component call: Look for argument list. */
2477 m = gfc_match_actual_arglist (sub_flag,
2478 &primary->value.compcall.actual);
2479 if (m == MATCH_ERROR)
2480 return MATCH_ERROR;
2482 if (m == MATCH_NO && !gfc_matching_ptr_assignment
2483 && !gfc_matching_procptr_assignment && !matching_actual_arglist)
2485 gfc_error ("Procedure pointer component %qs requires an "
2486 "argument list at %C", component->name);
2487 return MATCH_ERROR;
2490 if (m == MATCH_YES)
2491 primary->expr_type = EXPR_PPC;
2493 break;
2496 if (component->as != NULL && !component->attr.proc_pointer)
2498 tail = extend_ref (primary, tail);
2499 tail->type = REF_ARRAY;
2501 m = gfc_match_array_ref (&tail->u.ar, component->as, equiv_flag,
2502 component->as->corank);
2503 if (m != MATCH_YES)
2504 return m;
2506 else if (component->ts.type == BT_CLASS && component->attr.class_ok
2507 && CLASS_DATA (component)->as && !component->attr.proc_pointer)
2509 tail = extend_ref (primary, tail);
2510 tail->type = REF_ARRAY;
2512 m = gfc_match_array_ref (&tail->u.ar, CLASS_DATA (component)->as,
2513 equiv_flag,
2514 CLASS_DATA (component)->as->corank);
2515 if (m != MATCH_YES)
2516 return m;
2519 check_done:
2520 /* In principle, we could have eg. expr%re%kind so we must allow for
2521 this possibility. */
2522 if (gfc_match_char ('%') == MATCH_YES)
2524 if (component && (component->ts.type == BT_DERIVED
2525 || component->ts.type == BT_CLASS))
2526 sym = component->ts.u.derived;
2527 continue;
2529 else if (inquiry)
2530 break;
2532 if ((component->ts.type != BT_DERIVED && component->ts.type != BT_CLASS)
2533 || gfc_match_member_sep (component->ts.u.derived) != MATCH_YES)
2534 break;
2536 if (component->ts.type == BT_DERIVED || component->ts.type == BT_CLASS)
2537 sym = component->ts.u.derived;
2540 check_substring:
2541 unknown = false;
2542 if (primary->ts.type == BT_UNKNOWN && !gfc_fl_struct (sym->attr.flavor))
2544 if (gfc_get_default_type (sym->name, sym->ns)->type == BT_CHARACTER)
2546 gfc_set_default_type (sym, 0, sym->ns);
2547 primary->ts = sym->ts;
2548 unknown = true;
2552 if (primary->ts.type == BT_CHARACTER)
2554 bool def = primary->ts.deferred == 1;
2555 switch (match_substring (primary->ts.u.cl, equiv_flag, &substring, def))
2557 case MATCH_YES:
2558 if (tail == NULL)
2559 primary->ref = substring;
2560 else
2561 tail->next = substring;
2563 if (primary->expr_type == EXPR_CONSTANT)
2564 primary->expr_type = EXPR_SUBSTRING;
2566 if (substring)
2567 primary->ts.u.cl = NULL;
2569 break;
2571 case MATCH_NO:
2572 if (unknown)
2574 gfc_clear_ts (&primary->ts);
2575 gfc_clear_ts (&sym->ts);
2577 break;
2579 case MATCH_ERROR:
2580 return MATCH_ERROR;
2584 /* F08:C611. */
2585 if (primary->ts.type == BT_DERIVED && primary->ref
2586 && primary->ts.u.derived && primary->ts.u.derived->attr.abstract)
2588 gfc_error ("Nonpolymorphic reference to abstract type at %C");
2589 return MATCH_ERROR;
2592 /* F08:C727. */
2593 if (primary->expr_type == EXPR_PPC && gfc_is_coindexed (primary))
2595 gfc_error ("Coindexed procedure-pointer component at %C");
2596 return MATCH_ERROR;
2599 return MATCH_YES;
2603 /* Given an expression that is a variable, figure out what the
2604 ultimate variable's type and attribute is, traversing the reference
2605 structures if necessary.
2607 This subroutine is trickier than it looks. We start at the base
2608 symbol and store the attribute. Component references load a
2609 completely new attribute.
2611 A couple of rules come into play. Subobjects of targets are always
2612 targets themselves. If we see a component that goes through a
2613 pointer, then the expression must also be a target, since the
2614 pointer is associated with something (if it isn't core will soon be
2615 dumped). If we see a full part or section of an array, the
2616 expression is also an array.
2618 We can have at most one full array reference. */
2620 symbol_attribute
2621 gfc_variable_attr (gfc_expr *expr, gfc_typespec *ts)
2623 int dimension, codimension, pointer, allocatable, target, optional;
2624 symbol_attribute attr;
2625 gfc_ref *ref;
2626 gfc_symbol *sym;
2627 gfc_component *comp;
2628 bool has_inquiry_part;
2630 if (expr->expr_type != EXPR_VARIABLE
2631 && expr->expr_type != EXPR_FUNCTION
2632 && !(expr->expr_type == EXPR_NULL && expr->ts.type != BT_UNKNOWN))
2633 gfc_internal_error ("gfc_variable_attr(): Expression isn't a variable");
2635 sym = expr->symtree->n.sym;
2636 attr = sym->attr;
2638 optional = attr.optional;
2639 if (sym->ts.type == BT_CLASS && sym->attr.class_ok && sym->ts.u.derived)
2641 dimension = CLASS_DATA (sym)->attr.dimension;
2642 codimension = CLASS_DATA (sym)->attr.codimension;
2643 pointer = CLASS_DATA (sym)->attr.class_pointer;
2644 allocatable = CLASS_DATA (sym)->attr.allocatable;
2646 else
2648 dimension = attr.dimension;
2649 codimension = attr.codimension;
2650 pointer = attr.pointer;
2651 allocatable = attr.allocatable;
2654 target = attr.target;
2655 if (pointer || attr.proc_pointer)
2656 target = 1;
2658 /* F2018:11.1.3.3: Other attributes of associate names
2659 "The associating entity does not have the ALLOCATABLE or POINTER
2660 attributes; it has the TARGET attribute if and only if the selector is
2661 a variable and has either the TARGET or POINTER attribute." */
2662 if (sym->attr.associate_var && sym->assoc && sym->assoc->target)
2664 if (sym->assoc->target->expr_type == EXPR_VARIABLE)
2666 symbol_attribute tgt_attr;
2667 tgt_attr = gfc_expr_attr (sym->assoc->target);
2668 target = (tgt_attr.pointer || tgt_attr.target);
2670 else
2671 target = 0;
2674 if (ts != NULL && expr->ts.type == BT_UNKNOWN)
2675 *ts = sym->ts;
2677 has_inquiry_part = false;
2678 for (ref = expr->ref; ref; ref = ref->next)
2679 if (ref->type == REF_INQUIRY)
2681 has_inquiry_part = true;
2682 optional = false;
2683 break;
2686 for (ref = expr->ref; ref; ref = ref->next)
2687 switch (ref->type)
2689 case REF_ARRAY:
2691 switch (ref->u.ar.type)
2693 case AR_FULL:
2694 dimension = 1;
2695 break;
2697 case AR_SECTION:
2698 allocatable = pointer = 0;
2699 dimension = 1;
2700 optional = false;
2701 break;
2703 case AR_ELEMENT:
2704 /* Handle coarrays. */
2705 if (ref->u.ar.dimen > 0)
2706 allocatable = pointer = optional = false;
2707 break;
2709 case AR_UNKNOWN:
2710 /* For standard conforming code, AR_UNKNOWN should not happen.
2711 For nonconforming code, gfortran can end up here. Treat it
2712 as a no-op. */
2713 break;
2716 break;
2718 case REF_COMPONENT:
2719 optional = false;
2720 comp = ref->u.c.component;
2721 attr = comp->attr;
2722 if (ts != NULL && !has_inquiry_part)
2724 *ts = comp->ts;
2725 /* Don't set the string length if a substring reference
2726 follows. */
2727 if (ts->type == BT_CHARACTER
2728 && ref->next && ref->next->type == REF_SUBSTRING)
2729 ts->u.cl = NULL;
2732 if (comp->ts.type == BT_CLASS)
2734 codimension = CLASS_DATA (comp)->attr.codimension;
2735 pointer = CLASS_DATA (comp)->attr.class_pointer;
2736 allocatable = CLASS_DATA (comp)->attr.allocatable;
2738 else
2740 codimension = comp->attr.codimension;
2741 if (expr->ts.type == BT_CLASS && strcmp (comp->name, "_data") == 0)
2742 pointer = comp->attr.class_pointer;
2743 else
2744 pointer = comp->attr.pointer;
2745 allocatable = comp->attr.allocatable;
2747 if (pointer || attr.proc_pointer)
2748 target = 1;
2750 break;
2752 case REF_INQUIRY:
2753 case REF_SUBSTRING:
2754 allocatable = pointer = optional = false;
2755 break;
2758 attr.dimension = dimension;
2759 attr.codimension = codimension;
2760 attr.pointer = pointer;
2761 attr.allocatable = allocatable;
2762 attr.target = target;
2763 attr.save = sym->attr.save;
2764 attr.optional = optional;
2766 return attr;
2770 /* Return the attribute from a general expression. */
2772 symbol_attribute
2773 gfc_expr_attr (gfc_expr *e)
2775 symbol_attribute attr;
2777 switch (e->expr_type)
2779 case EXPR_VARIABLE:
2780 attr = gfc_variable_attr (e, NULL);
2781 break;
2783 case EXPR_FUNCTION:
2784 gfc_clear_attr (&attr);
2786 if (e->value.function.esym && e->value.function.esym->result)
2788 gfc_symbol *sym = e->value.function.esym->result;
2789 attr = sym->attr;
2790 if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
2792 attr.dimension = CLASS_DATA (sym)->attr.dimension;
2793 attr.pointer = CLASS_DATA (sym)->attr.class_pointer;
2794 attr.allocatable = CLASS_DATA (sym)->attr.allocatable;
2797 else if (e->value.function.isym
2798 && e->value.function.isym->transformational
2799 && e->ts.type == BT_CLASS)
2800 attr = CLASS_DATA (e)->attr;
2801 else if (e->symtree)
2802 attr = gfc_variable_attr (e, NULL);
2804 /* TODO: NULL() returns pointers. May have to take care of this
2805 here. */
2807 break;
2809 default:
2810 gfc_clear_attr (&attr);
2811 break;
2814 return attr;
2818 /* Given an expression, figure out what the ultimate expression
2819 attribute is. This routine is similar to gfc_variable_attr with
2820 parts of gfc_expr_attr, but focuses more on the needs of
2821 coarrays. For coarrays a codimension attribute is kind of
2822 "infectious" being propagated once set and never cleared.
2823 The coarray_comp is only set, when the expression refs a coarray
2824 component. REFS_COMP is set when present to true only, when this EXPR
2825 refs a (non-_data) component. To check whether EXPR refs an allocatable
2826 component in a derived type coarray *refs_comp needs to be set and
2827 coarray_comp has to false. */
2829 static symbol_attribute
2830 caf_variable_attr (gfc_expr *expr, bool in_allocate, bool *refs_comp)
2832 int dimension, codimension, pointer, allocatable, target, coarray_comp;
2833 symbol_attribute attr;
2834 gfc_ref *ref;
2835 gfc_symbol *sym;
2836 gfc_component *comp;
2838 if (expr->expr_type != EXPR_VARIABLE && expr->expr_type != EXPR_FUNCTION)
2839 gfc_internal_error ("gfc_caf_attr(): Expression isn't a variable");
2841 sym = expr->symtree->n.sym;
2842 gfc_clear_attr (&attr);
2844 if (refs_comp)
2845 *refs_comp = false;
2847 if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
2849 dimension = CLASS_DATA (sym)->attr.dimension;
2850 codimension = CLASS_DATA (sym)->attr.codimension;
2851 pointer = CLASS_DATA (sym)->attr.class_pointer;
2852 allocatable = CLASS_DATA (sym)->attr.allocatable;
2853 attr.alloc_comp = CLASS_DATA (sym)->ts.u.derived->attr.alloc_comp;
2854 attr.pointer_comp = CLASS_DATA (sym)->ts.u.derived->attr.pointer_comp;
2856 else
2858 dimension = sym->attr.dimension;
2859 codimension = sym->attr.codimension;
2860 pointer = sym->attr.pointer;
2861 allocatable = sym->attr.allocatable;
2862 attr.alloc_comp = sym->ts.type == BT_DERIVED
2863 ? sym->ts.u.derived->attr.alloc_comp : 0;
2864 attr.pointer_comp = sym->ts.type == BT_DERIVED
2865 ? sym->ts.u.derived->attr.pointer_comp : 0;
2868 target = coarray_comp = 0;
2869 if (pointer || attr.proc_pointer)
2870 target = 1;
2872 for (ref = expr->ref; ref; ref = ref->next)
2873 switch (ref->type)
2875 case REF_ARRAY:
2877 switch (ref->u.ar.type)
2879 case AR_FULL:
2880 case AR_SECTION:
2881 dimension = 1;
2882 break;
2884 case AR_ELEMENT:
2885 /* Handle coarrays. */
2886 if (ref->u.ar.dimen > 0 && !in_allocate)
2887 allocatable = pointer = 0;
2888 break;
2890 case AR_UNKNOWN:
2891 /* If any of start, end or stride is not integer, there will
2892 already have been an error issued. */
2893 int errors;
2894 gfc_get_errors (NULL, &errors);
2895 if (errors == 0)
2896 gfc_internal_error ("gfc_caf_attr(): Bad array reference");
2899 break;
2901 case REF_COMPONENT:
2902 comp = ref->u.c.component;
2904 if (comp->ts.type == BT_CLASS)
2906 /* Set coarray_comp only, when this component introduces the
2907 coarray. */
2908 coarray_comp = !codimension && CLASS_DATA (comp)->attr.codimension;
2909 codimension |= CLASS_DATA (comp)->attr.codimension;
2910 pointer = CLASS_DATA (comp)->attr.class_pointer;
2911 allocatable = CLASS_DATA (comp)->attr.allocatable;
2913 else
2915 /* Set coarray_comp only, when this component introduces the
2916 coarray. */
2917 coarray_comp = !codimension && comp->attr.codimension;
2918 codimension |= comp->attr.codimension;
2919 pointer = comp->attr.pointer;
2920 allocatable = comp->attr.allocatable;
2923 if (refs_comp && strcmp (comp->name, "_data") != 0
2924 && (ref->next == NULL
2925 || (ref->next->type == REF_ARRAY && ref->next->next == NULL)))
2926 *refs_comp = true;
2928 if (pointer || attr.proc_pointer)
2929 target = 1;
2931 break;
2933 case REF_SUBSTRING:
2934 case REF_INQUIRY:
2935 allocatable = pointer = 0;
2936 break;
2939 attr.dimension = dimension;
2940 attr.codimension = codimension;
2941 attr.pointer = pointer;
2942 attr.allocatable = allocatable;
2943 attr.target = target;
2944 attr.save = sym->attr.save;
2945 attr.coarray_comp = coarray_comp;
2947 return attr;
2951 symbol_attribute
2952 gfc_caf_attr (gfc_expr *e, bool in_allocate, bool *refs_comp)
2954 symbol_attribute attr;
2956 switch (e->expr_type)
2958 case EXPR_VARIABLE:
2959 attr = caf_variable_attr (e, in_allocate, refs_comp);
2960 break;
2962 case EXPR_FUNCTION:
2963 gfc_clear_attr (&attr);
2965 if (e->value.function.esym && e->value.function.esym->result)
2967 gfc_symbol *sym = e->value.function.esym->result;
2968 attr = sym->attr;
2969 if (sym->ts.type == BT_CLASS)
2971 attr.dimension = CLASS_DATA (sym)->attr.dimension;
2972 attr.pointer = CLASS_DATA (sym)->attr.class_pointer;
2973 attr.allocatable = CLASS_DATA (sym)->attr.allocatable;
2974 attr.alloc_comp = CLASS_DATA (sym)->ts.u.derived->attr.alloc_comp;
2975 attr.pointer_comp = CLASS_DATA (sym)->ts.u.derived
2976 ->attr.pointer_comp;
2979 else if (e->symtree)
2980 attr = caf_variable_attr (e, in_allocate, refs_comp);
2981 else
2982 gfc_clear_attr (&attr);
2983 break;
2985 default:
2986 gfc_clear_attr (&attr);
2987 break;
2990 return attr;
2994 /* Match a structure constructor. The initial symbol has already been
2995 seen. */
2997 typedef struct gfc_structure_ctor_component
2999 char* name;
3000 gfc_expr* val;
3001 locus where;
3002 struct gfc_structure_ctor_component* next;
3004 gfc_structure_ctor_component;
3006 #define gfc_get_structure_ctor_component() XCNEW (gfc_structure_ctor_component)
3008 static void
3009 gfc_free_structure_ctor_component (gfc_structure_ctor_component *comp)
3011 free (comp->name);
3012 gfc_free_expr (comp->val);
3013 free (comp);
3017 /* Translate the component list into the actual constructor by sorting it in
3018 the order required; this also checks along the way that each and every
3019 component actually has an initializer and handles default initializers
3020 for components without explicit value given. */
3021 static bool
3022 build_actual_constructor (gfc_structure_ctor_component **comp_head,
3023 gfc_constructor_base *ctor_head, gfc_symbol *sym)
3025 gfc_structure_ctor_component *comp_iter;
3026 gfc_component *comp;
3028 for (comp = sym->components; comp; comp = comp->next)
3030 gfc_structure_ctor_component **next_ptr;
3031 gfc_expr *value = NULL;
3033 /* Try to find the initializer for the current component by name. */
3034 next_ptr = comp_head;
3035 for (comp_iter = *comp_head; comp_iter; comp_iter = comp_iter->next)
3037 if (!strcmp (comp_iter->name, comp->name))
3038 break;
3039 next_ptr = &comp_iter->next;
3042 /* If an extension, try building the parent derived type by building
3043 a value expression for the parent derived type and calling self. */
3044 if (!comp_iter && comp == sym->components && sym->attr.extension)
3046 value = gfc_get_structure_constructor_expr (comp->ts.type,
3047 comp->ts.kind,
3048 &gfc_current_locus);
3049 value->ts = comp->ts;
3051 if (!build_actual_constructor (comp_head,
3052 &value->value.constructor,
3053 comp->ts.u.derived))
3055 gfc_free_expr (value);
3056 return false;
3059 gfc_constructor_append_expr (ctor_head, value, NULL);
3060 continue;
3063 /* If it was not found, apply NULL expression to set the component as
3064 unallocated. Then try the default initializer if there's any;
3065 otherwise, it's an error unless this is a deferred parameter. */
3066 if (!comp_iter)
3068 /* F2018 7.5.10: If an allocatable component has no corresponding
3069 component-data-source, then that component has an allocation
3070 status of unallocated.... */
3071 if (comp->attr.allocatable
3072 || (comp->ts.type == BT_CLASS
3073 && CLASS_DATA (comp)->attr.allocatable))
3075 if (!gfc_notify_std (GFC_STD_F2008, "No initializer for "
3076 "allocatable component %qs given in the "
3077 "structure constructor at %C", comp->name))
3078 return false;
3079 value = gfc_get_null_expr (&gfc_current_locus);
3081 /* ....(Preceding sentence) If a component with default
3082 initialization has no corresponding component-data-source, then
3083 the default initialization is applied to that component. */
3084 else if (comp->initializer)
3086 if (!gfc_notify_std (GFC_STD_F2003, "Structure constructor "
3087 "with missing optional arguments at %C"))
3088 return false;
3089 value = gfc_copy_expr (comp->initializer);
3091 /* Do not trap components such as the string length for deferred
3092 length character components. */
3093 else if (!comp->attr.artificial)
3095 gfc_error ("No initializer for component %qs given in the"
3096 " structure constructor at %C", comp->name);
3097 return false;
3100 else
3101 value = comp_iter->val;
3103 /* Add the value to the constructor chain built. */
3104 gfc_constructor_append_expr (ctor_head, value, NULL);
3106 /* Remove the entry from the component list. We don't want the expression
3107 value to be free'd, so set it to NULL. */
3108 if (comp_iter)
3110 *next_ptr = comp_iter->next;
3111 comp_iter->val = NULL;
3112 gfc_free_structure_ctor_component (comp_iter);
3115 return true;
3119 bool
3120 gfc_convert_to_structure_constructor (gfc_expr *e, gfc_symbol *sym, gfc_expr **cexpr,
3121 gfc_actual_arglist **arglist,
3122 bool parent)
3124 gfc_actual_arglist *actual;
3125 gfc_structure_ctor_component *comp_tail, *comp_head, *comp_iter;
3126 gfc_constructor_base ctor_head = NULL;
3127 gfc_component *comp; /* Is set NULL when named component is first seen */
3128 const char* last_name = NULL;
3129 locus old_locus;
3130 gfc_expr *expr;
3132 expr = parent ? *cexpr : e;
3133 old_locus = gfc_current_locus;
3134 if (parent)
3135 ; /* gfc_current_locus = *arglist->expr ? ->where;*/
3136 else
3137 gfc_current_locus = expr->where;
3139 comp_tail = comp_head = NULL;
3141 if (!parent && sym->attr.abstract)
3143 gfc_error ("Cannot construct ABSTRACT type %qs at %L",
3144 sym->name, &expr->where);
3145 goto cleanup;
3148 comp = sym->components;
3149 actual = parent ? *arglist : expr->value.function.actual;
3150 for ( ; actual; )
3152 gfc_component *this_comp = NULL;
3154 if (!comp_head)
3155 comp_tail = comp_head = gfc_get_structure_ctor_component ();
3156 else
3158 comp_tail->next = gfc_get_structure_ctor_component ();
3159 comp_tail = comp_tail->next;
3161 if (actual->name)
3163 if (!gfc_notify_std (GFC_STD_F2003, "Structure"
3164 " constructor with named arguments at %C"))
3165 goto cleanup;
3167 comp_tail->name = xstrdup (actual->name);
3168 last_name = comp_tail->name;
3169 comp = NULL;
3171 else
3173 /* Components without name are not allowed after the first named
3174 component initializer! */
3175 if (!comp || comp->attr.artificial)
3177 if (last_name)
3178 gfc_error ("Component initializer without name after component"
3179 " named %s at %L", last_name,
3180 actual->expr ? &actual->expr->where
3181 : &gfc_current_locus);
3182 else
3183 gfc_error ("Too many components in structure constructor at "
3184 "%L", actual->expr ? &actual->expr->where
3185 : &gfc_current_locus);
3186 goto cleanup;
3189 comp_tail->name = xstrdup (comp->name);
3192 /* Find the current component in the structure definition and check
3193 its access is not private. */
3194 if (comp)
3195 this_comp = gfc_find_component (sym, comp->name, false, false, NULL);
3196 else
3198 this_comp = gfc_find_component (sym, (const char *)comp_tail->name,
3199 false, false, NULL);
3200 comp = NULL; /* Reset needed! */
3203 /* Here we can check if a component name is given which does not
3204 correspond to any component of the defined structure. */
3205 if (!this_comp)
3206 goto cleanup;
3208 /* For a constant string constructor, make sure the length is
3209 correct; truncate or fill with blanks if needed. */
3210 if (this_comp->ts.type == BT_CHARACTER && !this_comp->attr.allocatable
3211 && this_comp->ts.u.cl && this_comp->ts.u.cl->length
3212 && this_comp->ts.u.cl->length->expr_type == EXPR_CONSTANT
3213 && this_comp->ts.u.cl->length->ts.type == BT_INTEGER
3214 && actual->expr->ts.type == BT_CHARACTER
3215 && actual->expr->expr_type == EXPR_CONSTANT)
3217 ptrdiff_t c, e1;
3218 c = gfc_mpz_get_hwi (this_comp->ts.u.cl->length->value.integer);
3219 e1 = actual->expr->value.character.length;
3221 if (c != e1)
3223 ptrdiff_t i, to;
3224 gfc_char_t *dest;
3225 dest = gfc_get_wide_string (c + 1);
3227 to = e1 < c ? e1 : c;
3228 for (i = 0; i < to; i++)
3229 dest[i] = actual->expr->value.character.string[i];
3231 for (i = e1; i < c; i++)
3232 dest[i] = ' ';
3234 dest[c] = '\0';
3235 free (actual->expr->value.character.string);
3237 actual->expr->value.character.length = c;
3238 actual->expr->value.character.string = dest;
3240 if (warn_line_truncation && c < e1)
3241 gfc_warning_now (OPT_Wcharacter_truncation,
3242 "CHARACTER expression will be truncated "
3243 "in constructor (%ld/%ld) at %L", (long int) c,
3244 (long int) e1, &actual->expr->where);
3248 comp_tail->val = actual->expr;
3249 if (actual->expr != NULL)
3250 comp_tail->where = actual->expr->where;
3251 actual->expr = NULL;
3253 /* Check if this component is already given a value. */
3254 for (comp_iter = comp_head; comp_iter != comp_tail;
3255 comp_iter = comp_iter->next)
3257 gcc_assert (comp_iter);
3258 if (!strcmp (comp_iter->name, comp_tail->name))
3260 gfc_error ("Component %qs is initialized twice in the structure"
3261 " constructor at %L", comp_tail->name,
3262 comp_tail->val ? &comp_tail->where
3263 : &gfc_current_locus);
3264 goto cleanup;
3268 /* F2008, R457/C725, for PURE C1283. */
3269 if (this_comp->attr.pointer && comp_tail->val
3270 && gfc_is_coindexed (comp_tail->val))
3272 gfc_error ("Coindexed expression to pointer component %qs in "
3273 "structure constructor at %L", comp_tail->name,
3274 &comp_tail->where);
3275 goto cleanup;
3278 /* If not explicitly a parent constructor, gather up the components
3279 and build one. */
3280 if (comp && comp == sym->components
3281 && sym->attr.extension
3282 && comp_tail->val
3283 && (!gfc_bt_struct (comp_tail->val->ts.type)
3285 comp_tail->val->ts.u.derived != this_comp->ts.u.derived))
3287 bool m;
3288 gfc_actual_arglist *arg_null = NULL;
3290 actual->expr = comp_tail->val;
3291 comp_tail->val = NULL;
3293 m = gfc_convert_to_structure_constructor (NULL,
3294 comp->ts.u.derived, &comp_tail->val,
3295 comp->ts.u.derived->attr.zero_comp
3296 ? &arg_null : &actual, true);
3297 if (!m)
3298 goto cleanup;
3300 if (comp->ts.u.derived->attr.zero_comp)
3302 comp = comp->next;
3303 continue;
3307 if (comp)
3308 comp = comp->next;
3309 if (parent && !comp)
3310 break;
3312 if (actual)
3313 actual = actual->next;
3316 if (!build_actual_constructor (&comp_head, &ctor_head, sym))
3317 goto cleanup;
3319 /* No component should be left, as this should have caused an error in the
3320 loop constructing the component-list (name that does not correspond to any
3321 component in the structure definition). */
3322 if (comp_head && sym->attr.extension)
3324 for (comp_iter = comp_head; comp_iter; comp_iter = comp_iter->next)
3326 gfc_error ("component %qs at %L has already been set by a "
3327 "parent derived type constructor", comp_iter->name,
3328 &comp_iter->where);
3330 goto cleanup;
3332 else
3333 gcc_assert (!comp_head);
3335 if (parent)
3337 expr = gfc_get_structure_constructor_expr (BT_DERIVED, 0, &gfc_current_locus);
3338 expr->ts.u.derived = sym;
3339 expr->value.constructor = ctor_head;
3340 *cexpr = expr;
3342 else
3344 expr->ts.u.derived = sym;
3345 expr->ts.kind = 0;
3346 expr->ts.type = BT_DERIVED;
3347 expr->value.constructor = ctor_head;
3348 expr->expr_type = EXPR_STRUCTURE;
3351 gfc_current_locus = old_locus;
3352 if (parent)
3353 *arglist = actual;
3354 return true;
3356 cleanup:
3357 gfc_current_locus = old_locus;
3359 for (comp_iter = comp_head; comp_iter; )
3361 gfc_structure_ctor_component *next = comp_iter->next;
3362 gfc_free_structure_ctor_component (comp_iter);
3363 comp_iter = next;
3365 gfc_constructor_free (ctor_head);
3367 return false;
3371 match
3372 gfc_match_structure_constructor (gfc_symbol *sym, gfc_expr **result)
3374 match m;
3375 gfc_expr *e;
3376 gfc_symtree *symtree;
3377 bool t = true;
3379 gfc_get_ha_sym_tree (sym->name, &symtree);
3381 e = gfc_get_expr ();
3382 e->symtree = symtree;
3383 e->expr_type = EXPR_FUNCTION;
3384 e->where = gfc_current_locus;
3386 gcc_assert (gfc_fl_struct (sym->attr.flavor)
3387 && symtree->n.sym->attr.flavor == FL_PROCEDURE);
3388 e->value.function.esym = sym;
3389 e->symtree->n.sym->attr.generic = 1;
3391 m = gfc_match_actual_arglist (0, &e->value.function.actual);
3392 if (m != MATCH_YES)
3394 gfc_free_expr (e);
3395 return m;
3398 if (!gfc_convert_to_structure_constructor (e, sym, NULL, NULL, false))
3400 gfc_free_expr (e);
3401 return MATCH_ERROR;
3404 /* If a structure constructor is in a DATA statement, then each entity
3405 in the structure constructor must be a constant. Try to reduce the
3406 expression here. */
3407 if (gfc_in_match_data ())
3408 t = gfc_reduce_init_expr (e);
3410 if (t)
3412 *result = e;
3413 return MATCH_YES;
3415 else
3417 gfc_free_expr (e);
3418 return MATCH_ERROR;
3423 /* If the symbol is an implicit do loop index and implicitly typed,
3424 it should not be host associated. Provide a symtree from the
3425 current namespace. */
3426 static match
3427 check_for_implicit_index (gfc_symtree **st, gfc_symbol **sym)
3429 if ((*sym)->attr.flavor == FL_VARIABLE
3430 && (*sym)->ns != gfc_current_ns
3431 && (*sym)->attr.implied_index
3432 && (*sym)->attr.implicit_type
3433 && !(*sym)->attr.use_assoc)
3435 int i;
3436 i = gfc_get_sym_tree ((*sym)->name, NULL, st, false);
3437 if (i)
3438 return MATCH_ERROR;
3439 *sym = (*st)->n.sym;
3441 return MATCH_YES;
3445 /* Procedure pointer as function result: Replace the function symbol by the
3446 auto-generated hidden result variable named "ppr@". */
3448 static bool
3449 replace_hidden_procptr_result (gfc_symbol **sym, gfc_symtree **st)
3451 /* Check for procedure pointer result variable. */
3452 if ((*sym)->attr.function && !(*sym)->attr.external
3453 && (*sym)->result && (*sym)->result != *sym
3454 && (*sym)->result->attr.proc_pointer
3455 && (*sym) == gfc_current_ns->proc_name
3456 && (*sym) == (*sym)->result->ns->proc_name
3457 && strcmp ("ppr@", (*sym)->result->name) == 0)
3459 /* Automatic replacement with "hidden" result variable. */
3460 (*sym)->result->attr.referenced = (*sym)->attr.referenced;
3461 *sym = (*sym)->result;
3462 *st = gfc_find_symtree ((*sym)->ns->sym_root, (*sym)->name);
3463 return true;
3465 return false;
3469 /* Matches a variable name followed by anything that might follow it--
3470 array reference, argument list of a function, etc. */
3472 match
3473 gfc_match_rvalue (gfc_expr **result)
3475 gfc_actual_arglist *actual_arglist;
3476 char name[GFC_MAX_SYMBOL_LEN + 1], argname[GFC_MAX_SYMBOL_LEN + 1];
3477 gfc_state_data *st;
3478 gfc_symbol *sym;
3479 gfc_symtree *symtree;
3480 locus where, old_loc;
3481 gfc_expr *e;
3482 match m, m2;
3483 int i;
3484 gfc_typespec *ts;
3485 bool implicit_char;
3486 gfc_ref *ref;
3488 m = gfc_match ("%%loc");
3489 if (m == MATCH_YES)
3491 if (!gfc_notify_std (GFC_STD_LEGACY, "%%LOC() as an rvalue at %C"))
3492 return MATCH_ERROR;
3493 strncpy (name, "loc", 4);
3496 else
3498 m = gfc_match_name (name);
3499 if (m != MATCH_YES)
3500 return m;
3503 /* Check if the symbol exists. */
3504 if (gfc_find_sym_tree (name, NULL, 1, &symtree))
3505 return MATCH_ERROR;
3507 /* If the symbol doesn't exist, create it unless the name matches a FL_STRUCT
3508 type. For derived types we create a generic symbol which links to the
3509 derived type symbol; STRUCTUREs are simpler and must not conflict with
3510 variables. */
3511 if (!symtree)
3512 if (gfc_find_sym_tree (gfc_dt_upper_string (name), NULL, 1, &symtree))
3513 return MATCH_ERROR;
3514 if (!symtree || symtree->n.sym->attr.flavor != FL_STRUCT)
3516 if (gfc_find_state (COMP_INTERFACE)
3517 && !gfc_current_ns->has_import_set)
3518 i = gfc_get_sym_tree (name, NULL, &symtree, false);
3519 else
3520 i = gfc_get_ha_sym_tree (name, &symtree);
3521 if (i)
3522 return MATCH_ERROR;
3526 sym = symtree->n.sym;
3527 e = NULL;
3528 where = gfc_current_locus;
3530 replace_hidden_procptr_result (&sym, &symtree);
3532 /* If this is an implicit do loop index and implicitly typed,
3533 it should not be host associated. */
3534 m = check_for_implicit_index (&symtree, &sym);
3535 if (m != MATCH_YES)
3536 return m;
3538 gfc_set_sym_referenced (sym);
3539 sym->attr.implied_index = 0;
3541 if (sym->attr.function && sym->result == sym)
3543 /* See if this is a directly recursive function call. */
3544 gfc_gobble_whitespace ();
3545 if (sym->attr.recursive
3546 && gfc_peek_ascii_char () == '('
3547 && gfc_current_ns->proc_name == sym
3548 && !sym->attr.dimension)
3550 gfc_error ("%qs at %C is the name of a recursive function "
3551 "and so refers to the result variable. Use an "
3552 "explicit RESULT variable for direct recursion "
3553 "(12.5.2.1)", sym->name);
3554 return MATCH_ERROR;
3557 if (gfc_is_function_return_value (sym, gfc_current_ns))
3558 goto variable;
3560 if (sym->attr.entry
3561 && (sym->ns == gfc_current_ns
3562 || sym->ns == gfc_current_ns->parent))
3564 gfc_entry_list *el = NULL;
3566 for (el = sym->ns->entries; el; el = el->next)
3567 if (sym == el->sym)
3568 goto variable;
3572 if (gfc_matching_procptr_assignment)
3574 /* It can be a procedure or a derived-type procedure or a not-yet-known
3575 type. */
3576 if (sym->attr.flavor != FL_UNKNOWN
3577 && sym->attr.flavor != FL_PROCEDURE
3578 && sym->attr.flavor != FL_PARAMETER
3579 && sym->attr.flavor != FL_VARIABLE)
3581 gfc_error ("Symbol at %C is not appropriate for an expression");
3582 return MATCH_ERROR;
3584 goto procptr0;
3587 if (sym->attr.function || sym->attr.external || sym->attr.intrinsic)
3588 goto function0;
3590 if (sym->attr.generic)
3591 goto generic_function;
3593 switch (sym->attr.flavor)
3595 case FL_VARIABLE:
3596 variable:
3597 e = gfc_get_expr ();
3599 e->expr_type = EXPR_VARIABLE;
3600 e->symtree = symtree;
3602 m = gfc_match_varspec (e, 0, false, true);
3603 break;
3605 case FL_PARAMETER:
3606 /* A statement of the form "REAL, parameter :: a(0:10) = 1" will
3607 end up here. Unfortunately, sym->value->expr_type is set to
3608 EXPR_CONSTANT, and so the if () branch would be followed without
3609 the !sym->as check. */
3610 if (sym->value && sym->value->expr_type != EXPR_ARRAY && !sym->as)
3611 e = gfc_copy_expr (sym->value);
3612 else
3614 e = gfc_get_expr ();
3615 e->expr_type = EXPR_VARIABLE;
3618 e->symtree = symtree;
3619 m = gfc_match_varspec (e, 0, false, true);
3621 if (sym->ts.is_c_interop || sym->ts.is_iso_c)
3622 break;
3624 /* Variable array references to derived type parameters cause
3625 all sorts of headaches in simplification. Treating such
3626 expressions as variable works just fine for all array
3627 references. */
3628 if (sym->value && sym->ts.type == BT_DERIVED && e->ref)
3630 for (ref = e->ref; ref; ref = ref->next)
3631 if (ref->type == REF_ARRAY)
3632 break;
3634 if (ref == NULL || ref->u.ar.type == AR_FULL)
3635 break;
3637 ref = e->ref;
3638 e->ref = NULL;
3639 gfc_free_expr (e);
3640 e = gfc_get_expr ();
3641 e->expr_type = EXPR_VARIABLE;
3642 e->symtree = symtree;
3643 e->ref = ref;
3646 break;
3648 case FL_STRUCT:
3649 case FL_DERIVED:
3650 sym = gfc_use_derived (sym);
3651 if (sym == NULL)
3652 m = MATCH_ERROR;
3653 else
3654 goto generic_function;
3655 break;
3657 /* If we're here, then the name is known to be the name of a
3658 procedure, yet it is not sure to be the name of a function. */
3659 case FL_PROCEDURE:
3661 /* Procedure Pointer Assignments. */
3662 procptr0:
3663 if (gfc_matching_procptr_assignment)
3665 gfc_gobble_whitespace ();
3666 if (!sym->attr.dimension && gfc_peek_ascii_char () == '(')
3667 /* Parse functions returning a procptr. */
3668 goto function0;
3670 e = gfc_get_expr ();
3671 e->expr_type = EXPR_VARIABLE;
3672 e->symtree = symtree;
3673 m = gfc_match_varspec (e, 0, false, true);
3674 if (!e->ref && sym->attr.flavor == FL_UNKNOWN
3675 && sym->ts.type == BT_UNKNOWN
3676 && !gfc_add_flavor (&sym->attr, FL_PROCEDURE, sym->name, NULL))
3678 m = MATCH_ERROR;
3679 break;
3681 break;
3684 if (sym->attr.subroutine)
3686 gfc_error ("Unexpected use of subroutine name %qs at %C",
3687 sym->name);
3688 m = MATCH_ERROR;
3689 break;
3692 /* At this point, the name has to be a non-statement function.
3693 If the name is the same as the current function being
3694 compiled, then we have a variable reference (to the function
3695 result) if the name is non-recursive. */
3697 st = gfc_enclosing_unit (NULL);
3699 if (st != NULL
3700 && st->state == COMP_FUNCTION
3701 && st->sym == sym
3702 && !sym->attr.recursive)
3704 e = gfc_get_expr ();
3705 e->symtree = symtree;
3706 e->expr_type = EXPR_VARIABLE;
3708 m = gfc_match_varspec (e, 0, false, true);
3709 break;
3712 /* Match a function reference. */
3713 function0:
3714 m = gfc_match_actual_arglist (0, &actual_arglist);
3715 if (m == MATCH_NO)
3717 if (sym->attr.proc == PROC_ST_FUNCTION)
3718 gfc_error ("Statement function %qs requires argument list at %C",
3719 sym->name);
3720 else
3721 gfc_error ("Function %qs requires an argument list at %C",
3722 sym->name);
3724 m = MATCH_ERROR;
3725 break;
3728 if (m != MATCH_YES)
3730 m = MATCH_ERROR;
3731 break;
3734 gfc_get_ha_sym_tree (name, &symtree); /* Can't fail */
3735 sym = symtree->n.sym;
3737 replace_hidden_procptr_result (&sym, &symtree);
3739 e = gfc_get_expr ();
3740 e->symtree = symtree;
3741 e->expr_type = EXPR_FUNCTION;
3742 e->value.function.actual = actual_arglist;
3743 e->where = gfc_current_locus;
3745 if (sym->ts.type == BT_CLASS && sym->attr.class_ok
3746 && CLASS_DATA (sym)->as)
3747 e->rank = CLASS_DATA (sym)->as->rank;
3748 else if (sym->as != NULL)
3749 e->rank = sym->as->rank;
3751 if (!sym->attr.function
3752 && !gfc_add_function (&sym->attr, sym->name, NULL))
3754 m = MATCH_ERROR;
3755 break;
3758 /* Check here for the existence of at least one argument for the
3759 iso_c_binding functions C_LOC, C_FUNLOC, and C_ASSOCIATED. The
3760 argument(s) given will be checked in gfc_iso_c_func_interface,
3761 during resolution of the function call. */
3762 if (sym->attr.is_iso_c == 1
3763 && (sym->from_intmod == INTMOD_ISO_C_BINDING
3764 && (sym->intmod_sym_id == ISOCBINDING_LOC
3765 || sym->intmod_sym_id == ISOCBINDING_FUNLOC
3766 || sym->intmod_sym_id == ISOCBINDING_ASSOCIATED)))
3768 /* make sure we were given a param */
3769 if (actual_arglist == NULL)
3771 gfc_error ("Missing argument to %qs at %C", sym->name);
3772 m = MATCH_ERROR;
3773 break;
3777 if (sym->result == NULL)
3778 sym->result = sym;
3780 gfc_gobble_whitespace ();
3781 /* F08:C612. */
3782 if (gfc_peek_ascii_char() == '%')
3784 gfc_error ("The leftmost part-ref in a data-ref cannot be a "
3785 "function reference at %C");
3786 m = MATCH_ERROR;
3787 break;
3790 m = MATCH_YES;
3791 break;
3793 case FL_UNKNOWN:
3795 /* Special case for derived type variables that get their types
3796 via an IMPLICIT statement. This can't wait for the
3797 resolution phase. */
3799 old_loc = gfc_current_locus;
3800 if (gfc_match_member_sep (sym) == MATCH_YES
3801 && sym->ts.type == BT_UNKNOWN
3802 && gfc_get_default_type (sym->name, sym->ns)->type == BT_DERIVED)
3803 gfc_set_default_type (sym, 0, sym->ns);
3804 gfc_current_locus = old_loc;
3806 /* If the symbol has a (co)dimension attribute, the expression is a
3807 variable. */
3809 if (sym->attr.dimension || sym->attr.codimension)
3811 if (!gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, NULL))
3813 m = MATCH_ERROR;
3814 break;
3817 e = gfc_get_expr ();
3818 e->symtree = symtree;
3819 e->expr_type = EXPR_VARIABLE;
3820 m = gfc_match_varspec (e, 0, false, true);
3821 break;
3824 if (sym->ts.type == BT_CLASS && sym->attr.class_ok
3825 && (CLASS_DATA (sym)->attr.dimension
3826 || CLASS_DATA (sym)->attr.codimension))
3828 if (!gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, NULL))
3830 m = MATCH_ERROR;
3831 break;
3834 e = gfc_get_expr ();
3835 e->symtree = symtree;
3836 e->expr_type = EXPR_VARIABLE;
3837 m = gfc_match_varspec (e, 0, false, true);
3838 break;
3841 /* Name is not an array, so we peek to see if a '(' implies a
3842 function call or a substring reference. Otherwise the
3843 variable is just a scalar. */
3845 gfc_gobble_whitespace ();
3846 if (gfc_peek_ascii_char () != '(')
3848 /* Assume a scalar variable */
3849 e = gfc_get_expr ();
3850 e->symtree = symtree;
3851 e->expr_type = EXPR_VARIABLE;
3853 if (!gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, NULL))
3855 m = MATCH_ERROR;
3856 break;
3859 /*FIXME:??? gfc_match_varspec does set this for us: */
3860 e->ts = sym->ts;
3861 m = gfc_match_varspec (e, 0, false, true);
3862 break;
3865 /* See if this is a function reference with a keyword argument
3866 as first argument. We do this because otherwise a spurious
3867 symbol would end up in the symbol table. */
3869 old_loc = gfc_current_locus;
3870 m2 = gfc_match (" ( %n =", argname);
3871 gfc_current_locus = old_loc;
3873 e = gfc_get_expr ();
3874 e->symtree = symtree;
3876 if (m2 != MATCH_YES)
3878 /* Try to figure out whether we're dealing with a character type.
3879 We're peeking ahead here, because we don't want to call
3880 match_substring if we're dealing with an implicitly typed
3881 non-character variable. */
3882 implicit_char = false;
3883 if (sym->ts.type == BT_UNKNOWN)
3885 ts = gfc_get_default_type (sym->name, NULL);
3886 if (ts->type == BT_CHARACTER)
3887 implicit_char = true;
3890 /* See if this could possibly be a substring reference of a name
3891 that we're not sure is a variable yet. */
3893 if ((implicit_char || sym->ts.type == BT_CHARACTER)
3894 && match_substring (sym->ts.u.cl, 0, &e->ref, false) == MATCH_YES)
3897 e->expr_type = EXPR_VARIABLE;
3899 if (sym->attr.flavor != FL_VARIABLE
3900 && !gfc_add_flavor (&sym->attr, FL_VARIABLE,
3901 sym->name, NULL))
3903 m = MATCH_ERROR;
3904 break;
3907 if (sym->ts.type == BT_UNKNOWN
3908 && !gfc_set_default_type (sym, 1, NULL))
3910 m = MATCH_ERROR;
3911 break;
3914 e->ts = sym->ts;
3915 if (e->ref)
3916 e->ts.u.cl = NULL;
3917 m = MATCH_YES;
3918 break;
3922 /* Give up, assume we have a function. */
3924 gfc_get_sym_tree (name, NULL, &symtree, false); /* Can't fail */
3925 sym = symtree->n.sym;
3926 e->expr_type = EXPR_FUNCTION;
3928 if (!sym->attr.function
3929 && !gfc_add_function (&sym->attr, sym->name, NULL))
3931 m = MATCH_ERROR;
3932 break;
3935 sym->result = sym;
3937 m = gfc_match_actual_arglist (0, &e->value.function.actual);
3938 if (m == MATCH_NO)
3939 gfc_error ("Missing argument list in function %qs at %C", sym->name);
3941 if (m != MATCH_YES)
3943 m = MATCH_ERROR;
3944 break;
3947 /* If our new function returns a character, array or structure
3948 type, it might have subsequent references. */
3950 m = gfc_match_varspec (e, 0, false, true);
3951 if (m == MATCH_NO)
3952 m = MATCH_YES;
3954 break;
3956 generic_function:
3957 /* Look for symbol first; if not found, look for STRUCTURE type symbol
3958 specially. Creates a generic symbol for derived types. */
3959 gfc_find_sym_tree (name, NULL, 1, &symtree);
3960 if (!symtree)
3961 gfc_find_sym_tree (gfc_dt_upper_string (name), NULL, 1, &symtree);
3962 if (!symtree || symtree->n.sym->attr.flavor != FL_STRUCT)
3963 gfc_get_sym_tree (name, NULL, &symtree, false); /* Can't fail */
3965 e = gfc_get_expr ();
3966 e->symtree = symtree;
3967 e->expr_type = EXPR_FUNCTION;
3969 if (gfc_fl_struct (sym->attr.flavor))
3971 e->value.function.esym = sym;
3972 e->symtree->n.sym->attr.generic = 1;
3975 m = gfc_match_actual_arglist (0, &e->value.function.actual);
3976 break;
3978 case FL_NAMELIST:
3979 m = MATCH_ERROR;
3980 break;
3982 default:
3983 gfc_error ("Symbol at %C is not appropriate for an expression");
3984 return MATCH_ERROR;
3987 if (m == MATCH_YES)
3989 e->where = where;
3990 *result = e;
3992 else
3993 gfc_free_expr (e);
3995 return m;
3999 /* Match a variable, i.e. something that can be assigned to. This
4000 starts as a symbol, can be a structure component or an array
4001 reference. It can be a function if the function doesn't have a
4002 separate RESULT variable. If the symbol has not been previously
4003 seen, we assume it is a variable.
4005 This function is called by two interface functions:
4006 gfc_match_variable, which has host_flag = 1, and
4007 gfc_match_equiv_variable, with host_flag = 0, to restrict the
4008 match of the symbol to the local scope. */
4010 static match
4011 match_variable (gfc_expr **result, int equiv_flag, int host_flag)
4013 gfc_symbol *sym, *dt_sym;
4014 gfc_symtree *st;
4015 gfc_expr *expr;
4016 locus where, old_loc;
4017 match m;
4019 /* Since nothing has any business being an lvalue in a module
4020 specification block, an interface block or a contains section,
4021 we force the changed_symbols mechanism to work by setting
4022 host_flag to 0. This prevents valid symbols that have the name
4023 of keywords, such as 'end', being turned into variables by
4024 failed matching to assignments for, e.g., END INTERFACE. */
4025 if (gfc_current_state () == COMP_MODULE
4026 || gfc_current_state () == COMP_SUBMODULE
4027 || gfc_current_state () == COMP_INTERFACE
4028 || gfc_current_state () == COMP_CONTAINS)
4029 host_flag = 0;
4031 where = gfc_current_locus;
4032 m = gfc_match_sym_tree (&st, host_flag);
4033 if (m != MATCH_YES)
4034 return m;
4036 sym = st->n.sym;
4038 /* If this is an implicit do loop index and implicitly typed,
4039 it should not be host associated. */
4040 m = check_for_implicit_index (&st, &sym);
4041 if (m != MATCH_YES)
4042 return m;
4044 sym->attr.implied_index = 0;
4046 gfc_set_sym_referenced (sym);
4048 /* STRUCTUREs may share names with variables, but derived types may not. */
4049 if (sym->attr.flavor == FL_PROCEDURE && sym->generic
4050 && (dt_sym = gfc_find_dt_in_generic (sym)))
4052 if (dt_sym->attr.flavor == FL_DERIVED)
4053 gfc_error ("Derived type %qs cannot be used as a variable at %C",
4054 sym->name);
4055 return MATCH_ERROR;
4058 switch (sym->attr.flavor)
4060 case FL_VARIABLE:
4061 /* Everything is alright. */
4062 break;
4064 case FL_UNKNOWN:
4066 sym_flavor flavor = FL_UNKNOWN;
4068 gfc_gobble_whitespace ();
4070 if (sym->attr.external || sym->attr.procedure
4071 || sym->attr.function || sym->attr.subroutine)
4072 flavor = FL_PROCEDURE;
4074 /* If it is not a procedure, is not typed and is host associated,
4075 we cannot give it a flavor yet. */
4076 else if (sym->ns == gfc_current_ns->parent
4077 && sym->ts.type == BT_UNKNOWN)
4078 break;
4080 /* These are definitive indicators that this is a variable. */
4081 else if (gfc_peek_ascii_char () != '(' || sym->ts.type != BT_UNKNOWN
4082 || sym->attr.pointer || sym->as != NULL)
4083 flavor = FL_VARIABLE;
4085 if (flavor != FL_UNKNOWN
4086 && !gfc_add_flavor (&sym->attr, flavor, sym->name, NULL))
4087 return MATCH_ERROR;
4089 break;
4091 case FL_PARAMETER:
4092 if (equiv_flag)
4094 gfc_error ("Named constant at %C in an EQUIVALENCE");
4095 return MATCH_ERROR;
4097 if (gfc_in_match_data())
4099 gfc_error ("PARAMETER %qs shall not appear in a DATA statement at %C",
4100 sym->name);
4101 return MATCH_ERROR;
4103 /* Otherwise this is checked for an error given in the
4104 variable definition context checks. */
4105 break;
4107 case FL_PROCEDURE:
4108 /* Check for a nonrecursive function result variable. */
4109 if (sym->attr.function
4110 && !sym->attr.external
4111 && sym->result == sym
4112 && (gfc_is_function_return_value (sym, gfc_current_ns)
4113 || (sym->attr.entry
4114 && sym->ns == gfc_current_ns)
4115 || (sym->attr.entry
4116 && sym->ns == gfc_current_ns->parent)))
4118 /* If a function result is a derived type, then the derived
4119 type may still have to be resolved. */
4121 if (sym->ts.type == BT_DERIVED
4122 && gfc_use_derived (sym->ts.u.derived) == NULL)
4123 return MATCH_ERROR;
4124 break;
4127 if (sym->attr.proc_pointer
4128 || replace_hidden_procptr_result (&sym, &st))
4129 break;
4131 /* Fall through to error */
4132 gcc_fallthrough ();
4134 default:
4135 gfc_error ("%qs at %C is not a variable", sym->name);
4136 return MATCH_ERROR;
4139 /* Special case for derived type variables that get their types
4140 via an IMPLICIT statement. This can't wait for the
4141 resolution phase. */
4144 gfc_namespace * implicit_ns;
4146 if (gfc_current_ns->proc_name == sym)
4147 implicit_ns = gfc_current_ns;
4148 else
4149 implicit_ns = sym->ns;
4151 old_loc = gfc_current_locus;
4152 if (gfc_match_member_sep (sym) == MATCH_YES
4153 && sym->ts.type == BT_UNKNOWN
4154 && gfc_get_default_type (sym->name, implicit_ns)->type == BT_DERIVED)
4155 gfc_set_default_type (sym, 0, implicit_ns);
4156 gfc_current_locus = old_loc;
4159 expr = gfc_get_expr ();
4161 expr->expr_type = EXPR_VARIABLE;
4162 expr->symtree = st;
4163 expr->ts = sym->ts;
4164 expr->where = where;
4166 /* Now see if we have to do more. */
4167 m = gfc_match_varspec (expr, equiv_flag, false, false);
4168 if (m != MATCH_YES)
4170 gfc_free_expr (expr);
4171 return m;
4174 *result = expr;
4175 return MATCH_YES;
4179 match
4180 gfc_match_variable (gfc_expr **result, int equiv_flag)
4182 return match_variable (result, equiv_flag, 1);
4186 match
4187 gfc_match_equiv_variable (gfc_expr **result)
4189 return match_variable (result, 1, 0);