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