2018-05-27 Steven G. Kargl <kargl@gcc.gnu.org>
[official-gcc.git] / gcc / fortran / decl.c
blob2fca8ad1f5dd0ccbb01f1d6375ad82909b88f6e3
1 /* Declaration statement matcher
2 Copyright (C) 2002-2018 Free Software Foundation, Inc.
3 Contributed by Andy Vaught
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "options.h"
25 #include "tree.h"
26 #include "gfortran.h"
27 #include "stringpool.h"
28 #include "match.h"
29 #include "parse.h"
30 #include "constructor.h"
32 /* Macros to access allocate memory for gfc_data_variable,
33 gfc_data_value and gfc_data. */
34 #define gfc_get_data_variable() XCNEW (gfc_data_variable)
35 #define gfc_get_data_value() XCNEW (gfc_data_value)
36 #define gfc_get_data() XCNEW (gfc_data)
39 static bool set_binding_label (const char **, const char *, int);
42 /* This flag is set if an old-style length selector is matched
43 during a type-declaration statement. */
45 static int old_char_selector;
47 /* When variables acquire types and attributes from a declaration
48 statement, they get them from the following static variables. The
49 first part of a declaration sets these variables and the second
50 part copies these into symbol structures. */
52 static gfc_typespec current_ts;
54 static symbol_attribute current_attr;
55 static gfc_array_spec *current_as;
56 static int colon_seen;
57 static int attr_seen;
59 /* The current binding label (if any). */
60 static const char* curr_binding_label;
61 /* Need to know how many identifiers are on the current data declaration
62 line in case we're given the BIND(C) attribute with a NAME= specifier. */
63 static int num_idents_on_line;
64 /* Need to know if a NAME= specifier was found during gfc_match_bind_c so we
65 can supply a name if the curr_binding_label is nil and NAME= was not. */
66 static int has_name_equals = 0;
68 /* Initializer of the previous enumerator. */
70 static gfc_expr *last_initializer;
72 /* History of all the enumerators is maintained, so that
73 kind values of all the enumerators could be updated depending
74 upon the maximum initialized value. */
76 typedef struct enumerator_history
78 gfc_symbol *sym;
79 gfc_expr *initializer;
80 struct enumerator_history *next;
82 enumerator_history;
84 /* Header of enum history chain. */
86 static enumerator_history *enum_history = NULL;
88 /* Pointer of enum history node containing largest initializer. */
90 static enumerator_history *max_enum = NULL;
92 /* gfc_new_block points to the symbol of a newly matched block. */
94 gfc_symbol *gfc_new_block;
96 bool gfc_matching_function;
98 /* Set upon parsing a !GCC$ unroll n directive for use in the next loop. */
99 int directive_unroll = -1;
101 /* If a kind expression of a component of a parameterized derived type is
102 parameterized, temporarily store the expression here. */
103 static gfc_expr *saved_kind_expr = NULL;
105 /* Used to store the parameter list arising in a PDT declaration and
106 in the typespec of a PDT variable or component. */
107 static gfc_actual_arglist *decl_type_param_list;
108 static gfc_actual_arglist *type_param_spec_list;
110 /********************* DATA statement subroutines *********************/
112 static bool in_match_data = false;
114 bool
115 gfc_in_match_data (void)
117 return in_match_data;
120 static void
121 set_in_match_data (bool set_value)
123 in_match_data = set_value;
126 /* Free a gfc_data_variable structure and everything beneath it. */
128 static void
129 free_variable (gfc_data_variable *p)
131 gfc_data_variable *q;
133 for (; p; p = q)
135 q = p->next;
136 gfc_free_expr (p->expr);
137 gfc_free_iterator (&p->iter, 0);
138 free_variable (p->list);
139 free (p);
144 /* Free a gfc_data_value structure and everything beneath it. */
146 static void
147 free_value (gfc_data_value *p)
149 gfc_data_value *q;
151 for (; p; p = q)
153 q = p->next;
154 mpz_clear (p->repeat);
155 gfc_free_expr (p->expr);
156 free (p);
161 /* Free a list of gfc_data structures. */
163 void
164 gfc_free_data (gfc_data *p)
166 gfc_data *q;
168 for (; p; p = q)
170 q = p->next;
171 free_variable (p->var);
172 free_value (p->value);
173 free (p);
178 /* Free all data in a namespace. */
180 static void
181 gfc_free_data_all (gfc_namespace *ns)
183 gfc_data *d;
185 for (;ns->data;)
187 d = ns->data->next;
188 free (ns->data);
189 ns->data = d;
193 /* Reject data parsed since the last restore point was marked. */
195 void
196 gfc_reject_data (gfc_namespace *ns)
198 gfc_data *d;
200 while (ns->data && ns->data != ns->old_data)
202 d = ns->data->next;
203 free (ns->data);
204 ns->data = d;
208 static match var_element (gfc_data_variable *);
210 /* Match a list of variables terminated by an iterator and a right
211 parenthesis. */
213 static match
214 var_list (gfc_data_variable *parent)
216 gfc_data_variable *tail, var;
217 match m;
219 m = var_element (&var);
220 if (m == MATCH_ERROR)
221 return MATCH_ERROR;
222 if (m == MATCH_NO)
223 goto syntax;
225 tail = gfc_get_data_variable ();
226 *tail = var;
228 parent->list = tail;
230 for (;;)
232 if (gfc_match_char (',') != MATCH_YES)
233 goto syntax;
235 m = gfc_match_iterator (&parent->iter, 1);
236 if (m == MATCH_YES)
237 break;
238 if (m == MATCH_ERROR)
239 return MATCH_ERROR;
241 m = var_element (&var);
242 if (m == MATCH_ERROR)
243 return MATCH_ERROR;
244 if (m == MATCH_NO)
245 goto syntax;
247 tail->next = gfc_get_data_variable ();
248 tail = tail->next;
250 *tail = var;
253 if (gfc_match_char (')') != MATCH_YES)
254 goto syntax;
255 return MATCH_YES;
257 syntax:
258 gfc_syntax_error (ST_DATA);
259 return MATCH_ERROR;
263 /* Match a single element in a data variable list, which can be a
264 variable-iterator list. */
266 static match
267 var_element (gfc_data_variable *new_var)
269 match m;
270 gfc_symbol *sym;
272 memset (new_var, 0, sizeof (gfc_data_variable));
274 if (gfc_match_char ('(') == MATCH_YES)
275 return var_list (new_var);
277 m = gfc_match_variable (&new_var->expr, 0);
278 if (m != MATCH_YES)
279 return m;
281 sym = new_var->expr->symtree->n.sym;
283 /* Symbol should already have an associated type. */
284 if (!gfc_check_symbol_typed (sym, gfc_current_ns, false, gfc_current_locus))
285 return MATCH_ERROR;
287 if (!sym->attr.function && gfc_current_ns->parent
288 && gfc_current_ns->parent == sym->ns)
290 gfc_error ("Host associated variable %qs may not be in the DATA "
291 "statement at %C", sym->name);
292 return MATCH_ERROR;
295 if (gfc_current_state () != COMP_BLOCK_DATA
296 && sym->attr.in_common
297 && !gfc_notify_std (GFC_STD_GNU, "initialization of "
298 "common block variable %qs in DATA statement at %C",
299 sym->name))
300 return MATCH_ERROR;
302 if (!gfc_add_data (&sym->attr, sym->name, &new_var->expr->where))
303 return MATCH_ERROR;
305 return MATCH_YES;
309 /* Match the top-level list of data variables. */
311 static match
312 top_var_list (gfc_data *d)
314 gfc_data_variable var, *tail, *new_var;
315 match m;
317 tail = NULL;
319 for (;;)
321 m = var_element (&var);
322 if (m == MATCH_NO)
323 goto syntax;
324 if (m == MATCH_ERROR)
325 return MATCH_ERROR;
327 new_var = gfc_get_data_variable ();
328 *new_var = var;
330 if (tail == NULL)
331 d->var = new_var;
332 else
333 tail->next = new_var;
335 tail = new_var;
337 if (gfc_match_char ('/') == MATCH_YES)
338 break;
339 if (gfc_match_char (',') != MATCH_YES)
340 goto syntax;
343 return MATCH_YES;
345 syntax:
346 gfc_syntax_error (ST_DATA);
347 gfc_free_data_all (gfc_current_ns);
348 return MATCH_ERROR;
352 static match
353 match_data_constant (gfc_expr **result)
355 char name[GFC_MAX_SYMBOL_LEN + 1];
356 gfc_symbol *sym, *dt_sym = NULL;
357 gfc_expr *expr;
358 match m;
359 locus old_loc;
361 m = gfc_match_literal_constant (&expr, 1);
362 if (m == MATCH_YES)
364 *result = expr;
365 return MATCH_YES;
368 if (m == MATCH_ERROR)
369 return MATCH_ERROR;
371 m = gfc_match_null (result);
372 if (m != MATCH_NO)
373 return m;
375 old_loc = gfc_current_locus;
377 /* Should this be a structure component, try to match it
378 before matching a name. */
379 m = gfc_match_rvalue (result);
380 if (m == MATCH_ERROR)
381 return m;
383 if (m == MATCH_YES && (*result)->expr_type == EXPR_STRUCTURE)
385 if (!gfc_simplify_expr (*result, 0))
386 m = MATCH_ERROR;
387 return m;
389 else if (m == MATCH_YES)
391 /* F2018:R845 data-stmt-constant is initial-data-target.
392 A data-stmt-constant shall be ... initial-data-target if and
393 only if the corresponding data-stmt-object has the POINTER
394 attribute. ... If data-stmt-constant is initial-data-target
395 the corresponding data statement object shall be
396 data-pointer-initialization compatible (7.5.4.6) with the initial
397 data target; the data statement object is initially associated
398 with the target. */
399 if ((*result)->symtree->n.sym->attr.save
400 && (*result)->symtree->n.sym->attr.target)
401 return m;
402 gfc_free_expr (*result);
405 gfc_current_locus = old_loc;
407 m = gfc_match_name (name);
408 if (m != MATCH_YES)
409 return m;
411 if (gfc_find_symbol (name, NULL, 1, &sym))
412 return MATCH_ERROR;
414 if (sym && sym->attr.generic)
415 dt_sym = gfc_find_dt_in_generic (sym);
417 if (sym == NULL
418 || (sym->attr.flavor != FL_PARAMETER
419 && (!dt_sym || !gfc_fl_struct (dt_sym->attr.flavor))))
421 gfc_error ("Symbol %qs must be a PARAMETER in DATA statement at %C",
422 name);
423 *result = NULL;
424 return MATCH_ERROR;
426 else if (dt_sym && gfc_fl_struct (dt_sym->attr.flavor))
427 return gfc_match_structure_constructor (dt_sym, result);
429 /* Check to see if the value is an initialization array expression. */
430 if (sym->value->expr_type == EXPR_ARRAY)
432 gfc_current_locus = old_loc;
434 m = gfc_match_init_expr (result);
435 if (m == MATCH_ERROR)
436 return m;
438 if (m == MATCH_YES)
440 if (!gfc_simplify_expr (*result, 0))
441 m = MATCH_ERROR;
443 if ((*result)->expr_type == EXPR_CONSTANT)
444 return m;
445 else
447 gfc_error ("Invalid initializer %s in Data statement at %C", name);
448 return MATCH_ERROR;
453 *result = gfc_copy_expr (sym->value);
454 return MATCH_YES;
458 /* Match a list of values in a DATA statement. The leading '/' has
459 already been seen at this point. */
461 static match
462 top_val_list (gfc_data *data)
464 gfc_data_value *new_val, *tail;
465 gfc_expr *expr;
466 match m;
468 tail = NULL;
470 for (;;)
472 m = match_data_constant (&expr);
473 if (m == MATCH_NO)
474 goto syntax;
475 if (m == MATCH_ERROR)
476 return MATCH_ERROR;
478 new_val = gfc_get_data_value ();
479 mpz_init (new_val->repeat);
481 if (tail == NULL)
482 data->value = new_val;
483 else
484 tail->next = new_val;
486 tail = new_val;
488 if (expr->ts.type != BT_INTEGER || gfc_match_char ('*') != MATCH_YES)
490 tail->expr = expr;
491 mpz_set_ui (tail->repeat, 1);
493 else
495 mpz_set (tail->repeat, expr->value.integer);
496 gfc_free_expr (expr);
498 m = match_data_constant (&tail->expr);
499 if (m == MATCH_NO)
500 goto syntax;
501 if (m == MATCH_ERROR)
502 return MATCH_ERROR;
505 if (gfc_match_char ('/') == MATCH_YES)
506 break;
507 if (gfc_match_char (',') == MATCH_NO)
508 goto syntax;
511 return MATCH_YES;
513 syntax:
514 gfc_syntax_error (ST_DATA);
515 gfc_free_data_all (gfc_current_ns);
516 return MATCH_ERROR;
520 /* Matches an old style initialization. */
522 static match
523 match_old_style_init (const char *name)
525 match m;
526 gfc_symtree *st;
527 gfc_symbol *sym;
528 gfc_data *newdata;
530 /* Set up data structure to hold initializers. */
531 gfc_find_sym_tree (name, NULL, 0, &st);
532 sym = st->n.sym;
534 newdata = gfc_get_data ();
535 newdata->var = gfc_get_data_variable ();
536 newdata->var->expr = gfc_get_variable_expr (st);
537 newdata->where = gfc_current_locus;
539 /* Match initial value list. This also eats the terminal '/'. */
540 m = top_val_list (newdata);
541 if (m != MATCH_YES)
543 free (newdata);
544 return m;
547 if (gfc_pure (NULL))
549 gfc_error ("Initialization at %C is not allowed in a PURE procedure");
550 free (newdata);
551 return MATCH_ERROR;
553 gfc_unset_implicit_pure (gfc_current_ns->proc_name);
555 /* Mark the variable as having appeared in a data statement. */
556 if (!gfc_add_data (&sym->attr, sym->name, &sym->declared_at))
558 free (newdata);
559 return MATCH_ERROR;
562 /* Chain in namespace list of DATA initializers. */
563 newdata->next = gfc_current_ns->data;
564 gfc_current_ns->data = newdata;
566 return m;
570 /* Match the stuff following a DATA statement. If ERROR_FLAG is set,
571 we are matching a DATA statement and are therefore issuing an error
572 if we encounter something unexpected, if not, we're trying to match
573 an old-style initialization expression of the form INTEGER I /2/. */
575 match
576 gfc_match_data (void)
578 gfc_data *new_data;
579 match m;
581 /* Before parsing the rest of a DATA statement, check F2008:c1206. */
582 if ((gfc_current_state () == COMP_FUNCTION
583 || gfc_current_state () == COMP_SUBROUTINE)
584 && gfc_state_stack->previous->state == COMP_INTERFACE)
586 gfc_error ("DATA statement at %C cannot appear within an INTERFACE");
587 return MATCH_ERROR;
590 set_in_match_data (true);
592 for (;;)
594 new_data = gfc_get_data ();
595 new_data->where = gfc_current_locus;
597 m = top_var_list (new_data);
598 if (m != MATCH_YES)
599 goto cleanup;
601 if (new_data->var->iter.var
602 && new_data->var->iter.var->ts.type == BT_INTEGER
603 && new_data->var->iter.var->symtree->n.sym->attr.implied_index == 1
604 && new_data->var->list
605 && new_data->var->list->expr
606 && new_data->var->list->expr->ts.type == BT_CHARACTER
607 && new_data->var->list->expr->ref
608 && new_data->var->list->expr->ref->type == REF_SUBSTRING)
610 gfc_error ("Invalid substring in data-implied-do at %L in DATA "
611 "statement", &new_data->var->list->expr->where);
612 goto cleanup;
615 m = top_val_list (new_data);
616 if (m != MATCH_YES)
617 goto cleanup;
619 new_data->next = gfc_current_ns->data;
620 gfc_current_ns->data = new_data;
622 if (gfc_match_eos () == MATCH_YES)
623 break;
625 gfc_match_char (','); /* Optional comma */
628 set_in_match_data (false);
630 if (gfc_pure (NULL))
632 gfc_error ("DATA statement at %C is not allowed in a PURE procedure");
633 return MATCH_ERROR;
635 gfc_unset_implicit_pure (gfc_current_ns->proc_name);
637 return MATCH_YES;
639 cleanup:
640 set_in_match_data (false);
641 gfc_free_data (new_data);
642 return MATCH_ERROR;
646 /************************ Declaration statements *********************/
649 /* Like gfc_match_init_expr, but matches a 'clist' (old-style initialization
650 list). The difference here is the expression is a list of constants
651 and is surrounded by '/'.
652 The typespec ts must match the typespec of the variable which the
653 clist is initializing.
654 The arrayspec tells whether this should match a list of constants
655 corresponding to array elements or a scalar (as == NULL). */
657 static match
658 match_clist_expr (gfc_expr **result, gfc_typespec *ts, gfc_array_spec *as)
660 gfc_constructor_base array_head = NULL;
661 gfc_expr *expr = NULL;
662 match m;
663 locus where;
664 mpz_t repeat, cons_size, as_size;
665 bool scalar;
666 int cmp;
668 gcc_assert (ts);
670 mpz_init_set_ui (repeat, 0);
671 scalar = !as || !as->rank;
673 /* We have already matched '/' - now look for a constant list, as with
674 top_val_list from decl.c, but append the result to an array. */
675 if (gfc_match ("/") == MATCH_YES)
677 gfc_error ("Empty old style initializer list at %C");
678 goto cleanup;
681 where = gfc_current_locus;
682 for (;;)
684 m = match_data_constant (&expr);
685 if (m != MATCH_YES)
686 expr = NULL; /* match_data_constant may set expr to garbage */
687 if (m == MATCH_NO)
688 goto syntax;
689 if (m == MATCH_ERROR)
690 goto cleanup;
692 /* Found r in repeat spec r*c; look for the constant to repeat. */
693 if ( gfc_match_char ('*') == MATCH_YES)
695 if (scalar)
697 gfc_error ("Repeat spec invalid in scalar initializer at %C");
698 goto cleanup;
700 if (expr->ts.type != BT_INTEGER)
702 gfc_error ("Repeat spec must be an integer at %C");
703 goto cleanup;
705 mpz_set (repeat, expr->value.integer);
706 gfc_free_expr (expr);
707 expr = NULL;
709 m = match_data_constant (&expr);
710 if (m == MATCH_NO)
711 gfc_error ("Expected data constant after repeat spec at %C");
712 if (m != MATCH_YES)
713 goto cleanup;
715 /* No repeat spec, we matched the data constant itself. */
716 else
717 mpz_set_ui (repeat, 1);
719 if (!scalar)
721 /* Add the constant initializer as many times as repeated. */
722 for (; mpz_cmp_ui (repeat, 0) > 0; mpz_sub_ui (repeat, repeat, 1))
724 /* Make sure types of elements match */
725 if(ts && !gfc_compare_types (&expr->ts, ts)
726 && !gfc_convert_type (expr, ts, 1))
727 goto cleanup;
729 gfc_constructor_append_expr (&array_head,
730 gfc_copy_expr (expr), &gfc_current_locus);
733 gfc_free_expr (expr);
734 expr = NULL;
737 /* For scalar initializers quit after one element. */
738 else
740 if(gfc_match_char ('/') != MATCH_YES)
742 gfc_error ("End of scalar initializer expected at %C");
743 goto cleanup;
745 break;
748 if (gfc_match_char ('/') == MATCH_YES)
749 break;
750 if (gfc_match_char (',') == MATCH_NO)
751 goto syntax;
754 /* Set up expr as an array constructor. */
755 if (!scalar)
757 expr = gfc_get_array_expr (ts->type, ts->kind, &where);
758 expr->ts = *ts;
759 expr->value.constructor = array_head;
761 expr->rank = as->rank;
762 expr->shape = gfc_get_shape (expr->rank);
764 /* Validate sizes. We built expr ourselves, so cons_size will be
765 constant (we fail above for non-constant expressions).
766 We still need to verify that the array-spec has constant size. */
767 cmp = 0;
768 gcc_assert (gfc_array_size (expr, &cons_size));
769 if (!spec_size (as, &as_size))
771 gfc_error ("Expected constant array-spec in initializer list at %L",
772 as->type == AS_EXPLICIT ? &as->upper[0]->where : &where);
773 cmp = -1;
775 else
777 /* Make sure the specs are of the same size. */
778 cmp = mpz_cmp (cons_size, as_size);
779 if (cmp < 0)
780 gfc_error ("Not enough elements in array initializer at %C");
781 else if (cmp > 0)
782 gfc_error ("Too many elements in array initializer at %C");
783 mpz_clear (as_size);
785 mpz_clear (cons_size);
786 if (cmp)
787 goto cleanup;
790 /* Make sure scalar types match. */
791 else if (!gfc_compare_types (&expr->ts, ts)
792 && !gfc_convert_type (expr, ts, 1))
793 goto cleanup;
795 if (expr->ts.u.cl)
796 expr->ts.u.cl->length_from_typespec = 1;
798 *result = expr;
799 mpz_clear (repeat);
800 return MATCH_YES;
802 syntax:
803 gfc_error ("Syntax error in old style initializer list at %C");
805 cleanup:
806 if (expr)
807 expr->value.constructor = NULL;
808 gfc_free_expr (expr);
809 gfc_constructor_free (array_head);
810 mpz_clear (repeat);
811 return MATCH_ERROR;
815 /* Auxiliary function to merge DIMENSION and CODIMENSION array specs. */
817 static bool
818 merge_array_spec (gfc_array_spec *from, gfc_array_spec *to, bool copy)
820 int i, j;
822 if ((from->type == AS_ASSUMED_RANK && to->corank)
823 || (to->type == AS_ASSUMED_RANK && from->corank))
825 gfc_error ("The assumed-rank array at %C shall not have a codimension");
826 return false;
829 if (to->rank == 0 && from->rank > 0)
831 to->rank = from->rank;
832 to->type = from->type;
833 to->cray_pointee = from->cray_pointee;
834 to->cp_was_assumed = from->cp_was_assumed;
836 for (i = 0; i < to->corank; i++)
838 /* Do not exceed the limits on lower[] and upper[]. gfortran
839 cleans up elsewhere. */
840 j = from->rank + i;
841 if (j >= GFC_MAX_DIMENSIONS)
842 break;
844 to->lower[j] = to->lower[i];
845 to->upper[j] = to->upper[i];
847 for (i = 0; i < from->rank; i++)
849 if (copy)
851 to->lower[i] = gfc_copy_expr (from->lower[i]);
852 to->upper[i] = gfc_copy_expr (from->upper[i]);
854 else
856 to->lower[i] = from->lower[i];
857 to->upper[i] = from->upper[i];
861 else if (to->corank == 0 && from->corank > 0)
863 to->corank = from->corank;
864 to->cotype = from->cotype;
866 for (i = 0; i < from->corank; i++)
868 /* Do not exceed the limits on lower[] and upper[]. gfortran
869 cleans up elsewhere. */
870 j = to->rank + i;
871 if (j >= GFC_MAX_DIMENSIONS)
872 break;
874 if (copy)
876 to->lower[j] = gfc_copy_expr (from->lower[i]);
877 to->upper[j] = gfc_copy_expr (from->upper[i]);
879 else
881 to->lower[j] = from->lower[i];
882 to->upper[j] = from->upper[i];
887 if (to->rank + to->corank > GFC_MAX_DIMENSIONS)
889 gfc_error ("Sum of array rank %d and corank %d at %C exceeds maximum "
890 "allowed dimensions of %d",
891 to->rank, to->corank, GFC_MAX_DIMENSIONS);
892 to->corank = GFC_MAX_DIMENSIONS - to->rank;
893 return false;
895 return true;
899 /* Match an intent specification. Since this can only happen after an
900 INTENT word, a legal intent-spec must follow. */
902 static sym_intent
903 match_intent_spec (void)
906 if (gfc_match (" ( in out )") == MATCH_YES)
907 return INTENT_INOUT;
908 if (gfc_match (" ( in )") == MATCH_YES)
909 return INTENT_IN;
910 if (gfc_match (" ( out )") == MATCH_YES)
911 return INTENT_OUT;
913 gfc_error ("Bad INTENT specification at %C");
914 return INTENT_UNKNOWN;
918 /* Matches a character length specification, which is either a
919 specification expression, '*', or ':'. */
921 static match
922 char_len_param_value (gfc_expr **expr, bool *deferred)
924 match m;
926 *expr = NULL;
927 *deferred = false;
929 if (gfc_match_char ('*') == MATCH_YES)
930 return MATCH_YES;
932 if (gfc_match_char (':') == MATCH_YES)
934 if (!gfc_notify_std (GFC_STD_F2003, "deferred type parameter at %C"))
935 return MATCH_ERROR;
937 *deferred = true;
939 return MATCH_YES;
942 m = gfc_match_expr (expr);
944 if (m == MATCH_NO || m == MATCH_ERROR)
945 return m;
947 if (!gfc_expr_check_typed (*expr, gfc_current_ns, false))
948 return MATCH_ERROR;
950 if ((*expr)->expr_type == EXPR_FUNCTION)
952 if ((*expr)->ts.type == BT_INTEGER
953 || ((*expr)->ts.type == BT_UNKNOWN
954 && strcmp((*expr)->symtree->name, "null") != 0))
955 return MATCH_YES;
957 goto syntax;
959 else if ((*expr)->expr_type == EXPR_CONSTANT)
961 /* F2008, 4.4.3.1: The length is a type parameter; its kind is
962 processor dependent and its value is greater than or equal to zero.
963 F2008, 4.4.3.2: If the character length parameter value evaluates
964 to a negative value, the length of character entities declared
965 is zero. */
967 if ((*expr)->ts.type == BT_INTEGER)
969 if (mpz_cmp_si ((*expr)->value.integer, 0) < 0)
970 mpz_set_si ((*expr)->value.integer, 0);
972 else
973 goto syntax;
975 else if ((*expr)->expr_type == EXPR_ARRAY)
976 goto syntax;
977 else if ((*expr)->expr_type == EXPR_VARIABLE)
979 bool t;
980 gfc_expr *e;
982 e = gfc_copy_expr (*expr);
984 /* This catches the invalid code "[character(m(2:3)) :: 'x', 'y']",
985 which causes an ICE if gfc_reduce_init_expr() is called. */
986 if (e->ref && e->ref->type == REF_ARRAY
987 && e->ref->u.ar.type == AR_UNKNOWN
988 && e->ref->u.ar.dimen_type[0] == DIMEN_RANGE)
989 goto syntax;
991 t = gfc_reduce_init_expr (e);
993 if (!t && e->ts.type == BT_UNKNOWN
994 && e->symtree->n.sym->attr.untyped == 1
995 && (flag_implicit_none
996 || e->symtree->n.sym->ns->seen_implicit_none == 1
997 || e->symtree->n.sym->ns->parent->seen_implicit_none == 1))
999 gfc_free_expr (e);
1000 goto syntax;
1003 if ((e->ref && e->ref->type == REF_ARRAY
1004 && e->ref->u.ar.type != AR_ELEMENT)
1005 || (!e->ref && e->expr_type == EXPR_ARRAY))
1007 gfc_free_expr (e);
1008 goto syntax;
1011 gfc_free_expr (e);
1014 return m;
1016 syntax:
1017 gfc_error ("Scalar INTEGER expression expected at %L", &(*expr)->where);
1018 return MATCH_ERROR;
1022 /* A character length is a '*' followed by a literal integer or a
1023 char_len_param_value in parenthesis. */
1025 static match
1026 match_char_length (gfc_expr **expr, bool *deferred, bool obsolescent_check)
1028 int length;
1029 match m;
1031 *deferred = false;
1032 m = gfc_match_char ('*');
1033 if (m != MATCH_YES)
1034 return m;
1036 m = gfc_match_small_literal_int (&length, NULL);
1037 if (m == MATCH_ERROR)
1038 return m;
1040 if (m == MATCH_YES)
1042 if (obsolescent_check
1043 && !gfc_notify_std (GFC_STD_F95_OBS, "Old-style character length at %C"))
1044 return MATCH_ERROR;
1045 *expr = gfc_get_int_expr (gfc_charlen_int_kind, NULL, length);
1046 return m;
1049 if (gfc_match_char ('(') == MATCH_NO)
1050 goto syntax;
1052 m = char_len_param_value (expr, deferred);
1053 if (m != MATCH_YES && gfc_matching_function)
1055 gfc_undo_symbols ();
1056 m = MATCH_YES;
1059 if (m == MATCH_ERROR)
1060 return m;
1061 if (m == MATCH_NO)
1062 goto syntax;
1064 if (gfc_match_char (')') == MATCH_NO)
1066 gfc_free_expr (*expr);
1067 *expr = NULL;
1068 goto syntax;
1071 return MATCH_YES;
1073 syntax:
1074 gfc_error ("Syntax error in character length specification at %C");
1075 return MATCH_ERROR;
1079 /* Special subroutine for finding a symbol. Check if the name is found
1080 in the current name space. If not, and we're compiling a function or
1081 subroutine and the parent compilation unit is an interface, then check
1082 to see if the name we've been given is the name of the interface
1083 (located in another namespace). */
1085 static int
1086 find_special (const char *name, gfc_symbol **result, bool allow_subroutine)
1088 gfc_state_data *s;
1089 gfc_symtree *st;
1090 int i;
1092 i = gfc_get_sym_tree (name, NULL, &st, allow_subroutine);
1093 if (i == 0)
1095 *result = st ? st->n.sym : NULL;
1096 goto end;
1099 if (gfc_current_state () != COMP_SUBROUTINE
1100 && gfc_current_state () != COMP_FUNCTION)
1101 goto end;
1103 s = gfc_state_stack->previous;
1104 if (s == NULL)
1105 goto end;
1107 if (s->state != COMP_INTERFACE)
1108 goto end;
1109 if (s->sym == NULL)
1110 goto end; /* Nameless interface. */
1112 if (strcmp (name, s->sym->name) == 0)
1114 *result = s->sym;
1115 return 0;
1118 end:
1119 return i;
1123 /* Special subroutine for getting a symbol node associated with a
1124 procedure name, used in SUBROUTINE and FUNCTION statements. The
1125 symbol is created in the parent using with symtree node in the
1126 child unit pointing to the symbol. If the current namespace has no
1127 parent, then the symbol is just created in the current unit. */
1129 static int
1130 get_proc_name (const char *name, gfc_symbol **result, bool module_fcn_entry)
1132 gfc_symtree *st;
1133 gfc_symbol *sym;
1134 int rc = 0;
1136 /* Module functions have to be left in their own namespace because
1137 they have potentially (almost certainly!) already been referenced.
1138 In this sense, they are rather like external functions. This is
1139 fixed up in resolve.c(resolve_entries), where the symbol name-
1140 space is set to point to the master function, so that the fake
1141 result mechanism can work. */
1142 if (module_fcn_entry)
1144 /* Present if entry is declared to be a module procedure. */
1145 rc = gfc_find_symbol (name, gfc_current_ns->parent, 0, result);
1147 if (*result == NULL)
1148 rc = gfc_get_symbol (name, NULL, result);
1149 else if (!gfc_get_symbol (name, NULL, &sym) && sym
1150 && (*result)->ts.type == BT_UNKNOWN
1151 && sym->attr.flavor == FL_UNKNOWN)
1152 /* Pick up the typespec for the entry, if declared in the function
1153 body. Note that this symbol is FL_UNKNOWN because it will
1154 only have appeared in a type declaration. The local symtree
1155 is set to point to the module symbol and a unique symtree
1156 to the local version. This latter ensures a correct clearing
1157 of the symbols. */
1159 /* If the ENTRY proceeds its specification, we need to ensure
1160 that this does not raise a "has no IMPLICIT type" error. */
1161 if (sym->ts.type == BT_UNKNOWN)
1162 sym->attr.untyped = 1;
1164 (*result)->ts = sym->ts;
1166 /* Put the symbol in the procedure namespace so that, should
1167 the ENTRY precede its specification, the specification
1168 can be applied. */
1169 (*result)->ns = gfc_current_ns;
1171 gfc_find_sym_tree (name, gfc_current_ns, 0, &st);
1172 st->n.sym = *result;
1173 st = gfc_get_unique_symtree (gfc_current_ns);
1174 sym->refs++;
1175 st->n.sym = sym;
1178 else
1179 rc = gfc_get_symbol (name, gfc_current_ns->parent, result);
1181 if (rc)
1182 return rc;
1184 sym = *result;
1185 if (sym->attr.proc == PROC_ST_FUNCTION)
1186 return rc;
1188 if (sym->attr.module_procedure && sym->attr.if_source == IFSRC_IFBODY)
1190 /* Create a partially populated interface symbol to carry the
1191 characteristics of the procedure and the result. */
1192 sym->tlink = gfc_new_symbol (name, sym->ns);
1193 gfc_add_type (sym->tlink, &(sym->ts), &gfc_current_locus);
1194 gfc_copy_attr (&sym->tlink->attr, &sym->attr, NULL);
1195 if (sym->attr.dimension)
1196 sym->tlink->as = gfc_copy_array_spec (sym->as);
1198 /* Ideally, at this point, a copy would be made of the formal
1199 arguments and their namespace. However, this does not appear
1200 to be necessary, albeit at the expense of not being able to
1201 use gfc_compare_interfaces directly. */
1203 if (sym->result && sym->result != sym)
1205 sym->tlink->result = sym->result;
1206 sym->result = NULL;
1208 else if (sym->result)
1210 sym->tlink->result = sym->tlink;
1213 else if (sym && !sym->gfc_new
1214 && gfc_current_state () != COMP_INTERFACE)
1216 /* Trap another encompassed procedure with the same name. All
1217 these conditions are necessary to avoid picking up an entry
1218 whose name clashes with that of the encompassing procedure;
1219 this is handled using gsymbols to register unique, globally
1220 accessible names. */
1221 if (sym->attr.flavor != 0
1222 && sym->attr.proc != 0
1223 && (sym->attr.subroutine || sym->attr.function || sym->attr.entry)
1224 && sym->attr.if_source != IFSRC_UNKNOWN)
1225 gfc_error_now ("Procedure %qs at %C is already defined at %L",
1226 name, &sym->declared_at);
1228 if (sym->attr.flavor != 0
1229 && sym->attr.entry && sym->attr.if_source != IFSRC_UNKNOWN)
1230 gfc_error_now ("Procedure %qs at %C is already defined at %L",
1231 name, &sym->declared_at);
1233 if (sym->attr.external && sym->attr.procedure
1234 && gfc_current_state () == COMP_CONTAINS)
1235 gfc_error_now ("Contained procedure %qs at %C clashes with "
1236 "procedure defined at %L",
1237 name, &sym->declared_at);
1239 /* Trap a procedure with a name the same as interface in the
1240 encompassing scope. */
1241 if (sym->attr.generic != 0
1242 && (sym->attr.subroutine || sym->attr.function)
1243 && !sym->attr.mod_proc)
1244 gfc_error_now ("Name %qs at %C is already defined"
1245 " as a generic interface at %L",
1246 name, &sym->declared_at);
1248 /* Trap declarations of attributes in encompassing scope. The
1249 signature for this is that ts.kind is set. Legitimate
1250 references only set ts.type. */
1251 if (sym->ts.kind != 0
1252 && !sym->attr.implicit_type
1253 && sym->attr.proc == 0
1254 && gfc_current_ns->parent != NULL
1255 && sym->attr.access == 0
1256 && !module_fcn_entry)
1257 gfc_error_now ("Procedure %qs at %C has an explicit interface "
1258 "from a previous declaration", name);
1261 /* C1246 (R1225) MODULE shall appear only in the function-stmt or
1262 subroutine-stmt of a module subprogram or of a nonabstract interface
1263 body that is declared in the scoping unit of a module or submodule. */
1264 if (sym->attr.external
1265 && (sym->attr.subroutine || sym->attr.function)
1266 && sym->attr.if_source == IFSRC_IFBODY
1267 && !current_attr.module_procedure
1268 && sym->attr.proc == PROC_MODULE
1269 && gfc_state_stack->state == COMP_CONTAINS)
1270 gfc_error_now ("Procedure %qs defined in interface body at %L "
1271 "clashes with internal procedure defined at %C",
1272 name, &sym->declared_at);
1274 if (sym && !sym->gfc_new
1275 && sym->attr.flavor != FL_UNKNOWN
1276 && sym->attr.referenced == 0 && sym->attr.subroutine == 1
1277 && gfc_state_stack->state == COMP_CONTAINS
1278 && gfc_state_stack->previous->state == COMP_SUBROUTINE)
1279 gfc_error_now ("Procedure %qs at %C is already defined at %L",
1280 name, &sym->declared_at);
1282 if (gfc_current_ns->parent == NULL || *result == NULL)
1283 return rc;
1285 /* Module function entries will already have a symtree in
1286 the current namespace but will need one at module level. */
1287 if (module_fcn_entry)
1289 /* Present if entry is declared to be a module procedure. */
1290 rc = gfc_find_sym_tree (name, gfc_current_ns->parent, 0, &st);
1291 if (st == NULL)
1292 st = gfc_new_symtree (&gfc_current_ns->parent->sym_root, name);
1294 else
1295 st = gfc_new_symtree (&gfc_current_ns->sym_root, name);
1297 st->n.sym = sym;
1298 sym->refs++;
1300 /* See if the procedure should be a module procedure. */
1302 if (((sym->ns->proc_name != NULL
1303 && sym->ns->proc_name->attr.flavor == FL_MODULE
1304 && sym->attr.proc != PROC_MODULE)
1305 || (module_fcn_entry && sym->attr.proc != PROC_MODULE))
1306 && !gfc_add_procedure (&sym->attr, PROC_MODULE, sym->name, NULL))
1307 rc = 2;
1309 return rc;
1313 /* Verify that the given symbol representing a parameter is C
1314 interoperable, by checking to see if it was marked as such after
1315 its declaration. If the given symbol is not interoperable, a
1316 warning is reported, thus removing the need to return the status to
1317 the calling function. The standard does not require the user use
1318 one of the iso_c_binding named constants to declare an
1319 interoperable parameter, but we can't be sure if the param is C
1320 interop or not if the user doesn't. For example, integer(4) may be
1321 legal Fortran, but doesn't have meaning in C. It may interop with
1322 a number of the C types, which causes a problem because the
1323 compiler can't know which one. This code is almost certainly not
1324 portable, and the user will get what they deserve if the C type
1325 across platforms isn't always interoperable with integer(4). If
1326 the user had used something like integer(c_int) or integer(c_long),
1327 the compiler could have automatically handled the varying sizes
1328 across platforms. */
1330 bool
1331 gfc_verify_c_interop_param (gfc_symbol *sym)
1333 int is_c_interop = 0;
1334 bool retval = true;
1336 /* We check implicitly typed variables in symbol.c:gfc_set_default_type().
1337 Don't repeat the checks here. */
1338 if (sym->attr.implicit_type)
1339 return true;
1341 /* For subroutines or functions that are passed to a BIND(C) procedure,
1342 they're interoperable if they're BIND(C) and their params are all
1343 interoperable. */
1344 if (sym->attr.flavor == FL_PROCEDURE)
1346 if (sym->attr.is_bind_c == 0)
1348 gfc_error_now ("Procedure %qs at %L must have the BIND(C) "
1349 "attribute to be C interoperable", sym->name,
1350 &(sym->declared_at));
1351 return false;
1353 else
1355 if (sym->attr.is_c_interop == 1)
1356 /* We've already checked this procedure; don't check it again. */
1357 return true;
1358 else
1359 return verify_bind_c_sym (sym, &(sym->ts), sym->attr.in_common,
1360 sym->common_block);
1364 /* See if we've stored a reference to a procedure that owns sym. */
1365 if (sym->ns != NULL && sym->ns->proc_name != NULL)
1367 if (sym->ns->proc_name->attr.is_bind_c == 1)
1369 is_c_interop = (gfc_verify_c_interop(&(sym->ts)) ? 1 : 0);
1371 if (is_c_interop != 1)
1373 /* Make personalized messages to give better feedback. */
1374 if (sym->ts.type == BT_DERIVED)
1375 gfc_error ("Variable %qs at %L is a dummy argument to the "
1376 "BIND(C) procedure %qs but is not C interoperable "
1377 "because derived type %qs is not C interoperable",
1378 sym->name, &(sym->declared_at),
1379 sym->ns->proc_name->name,
1380 sym->ts.u.derived->name);
1381 else if (sym->ts.type == BT_CLASS)
1382 gfc_error ("Variable %qs at %L is a dummy argument to the "
1383 "BIND(C) procedure %qs but is not C interoperable "
1384 "because it is polymorphic",
1385 sym->name, &(sym->declared_at),
1386 sym->ns->proc_name->name);
1387 else if (warn_c_binding_type)
1388 gfc_warning (OPT_Wc_binding_type,
1389 "Variable %qs at %L is a dummy argument of the "
1390 "BIND(C) procedure %qs but may not be C "
1391 "interoperable",
1392 sym->name, &(sym->declared_at),
1393 sym->ns->proc_name->name);
1396 /* Character strings are only C interoperable if they have a
1397 length of 1. */
1398 if (sym->ts.type == BT_CHARACTER)
1400 gfc_charlen *cl = sym->ts.u.cl;
1401 if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT
1402 || mpz_cmp_si (cl->length->value.integer, 1) != 0)
1404 gfc_error ("Character argument %qs at %L "
1405 "must be length 1 because "
1406 "procedure %qs is BIND(C)",
1407 sym->name, &sym->declared_at,
1408 sym->ns->proc_name->name);
1409 retval = false;
1413 /* We have to make sure that any param to a bind(c) routine does
1414 not have the allocatable, pointer, or optional attributes,
1415 according to J3/04-007, section 5.1. */
1416 if (sym->attr.allocatable == 1
1417 && !gfc_notify_std (GFC_STD_F2018, "Variable %qs at %L with "
1418 "ALLOCATABLE attribute in procedure %qs "
1419 "with BIND(C)", sym->name,
1420 &(sym->declared_at),
1421 sym->ns->proc_name->name))
1422 retval = false;
1424 if (sym->attr.pointer == 1
1425 && !gfc_notify_std (GFC_STD_F2018, "Variable %qs at %L with "
1426 "POINTER attribute in procedure %qs "
1427 "with BIND(C)", sym->name,
1428 &(sym->declared_at),
1429 sym->ns->proc_name->name))
1430 retval = false;
1432 if ((sym->attr.allocatable || sym->attr.pointer) && !sym->as)
1434 gfc_error ("Scalar variable %qs at %L with POINTER or "
1435 "ALLOCATABLE in procedure %qs with BIND(C) is not yet"
1436 " supported", sym->name, &(sym->declared_at),
1437 sym->ns->proc_name->name);
1438 retval = false;
1441 if (sym->attr.optional == 1 && sym->attr.value)
1443 gfc_error ("Variable %qs at %L cannot have both the OPTIONAL "
1444 "and the VALUE attribute because procedure %qs "
1445 "is BIND(C)", sym->name, &(sym->declared_at),
1446 sym->ns->proc_name->name);
1447 retval = false;
1449 else if (sym->attr.optional == 1
1450 && !gfc_notify_std (GFC_STD_F2018, "Variable %qs "
1451 "at %L with OPTIONAL attribute in "
1452 "procedure %qs which is BIND(C)",
1453 sym->name, &(sym->declared_at),
1454 sym->ns->proc_name->name))
1455 retval = false;
1457 /* Make sure that if it has the dimension attribute, that it is
1458 either assumed size or explicit shape. Deferred shape is already
1459 covered by the pointer/allocatable attribute. */
1460 if (sym->as != NULL && sym->as->type == AS_ASSUMED_SHAPE
1461 && !gfc_notify_std (GFC_STD_F2018, "Assumed-shape array %qs "
1462 "at %L as dummy argument to the BIND(C) "
1463 "procedure %qs at %L", sym->name,
1464 &(sym->declared_at),
1465 sym->ns->proc_name->name,
1466 &(sym->ns->proc_name->declared_at)))
1467 retval = false;
1471 return retval;
1476 /* Function called by variable_decl() that adds a name to the symbol table. */
1478 static bool
1479 build_sym (const char *name, gfc_charlen *cl, bool cl_deferred,
1480 gfc_array_spec **as, locus *var_locus)
1482 symbol_attribute attr;
1483 gfc_symbol *sym;
1484 int upper;
1485 gfc_symtree *st;
1487 /* Symbols in a submodule are host associated from the parent module or
1488 submodules. Therefore, they can be overridden by declarations in the
1489 submodule scope. Deal with this by attaching the existing symbol to
1490 a new symtree and recycling the old symtree with a new symbol... */
1491 st = gfc_find_symtree (gfc_current_ns->sym_root, name);
1492 if (st != NULL && gfc_state_stack->state == COMP_SUBMODULE
1493 && st->n.sym != NULL
1494 && st->n.sym->attr.host_assoc && st->n.sym->attr.used_in_submodule)
1496 gfc_symtree *s = gfc_get_unique_symtree (gfc_current_ns);
1497 s->n.sym = st->n.sym;
1498 sym = gfc_new_symbol (name, gfc_current_ns);
1501 st->n.sym = sym;
1502 sym->refs++;
1503 gfc_set_sym_referenced (sym);
1505 /* ...Otherwise generate a new symtree and new symbol. */
1506 else if (gfc_get_symbol (name, NULL, &sym))
1507 return false;
1509 /* Check if the name has already been defined as a type. The
1510 first letter of the symtree will be in upper case then. Of
1511 course, this is only necessary if the upper case letter is
1512 actually different. */
1514 upper = TOUPPER(name[0]);
1515 if (upper != name[0])
1517 char u_name[GFC_MAX_SYMBOL_LEN + 1];
1518 gfc_symtree *st;
1520 gcc_assert (strlen(name) <= GFC_MAX_SYMBOL_LEN);
1521 strcpy (u_name, name);
1522 u_name[0] = upper;
1524 st = gfc_find_symtree (gfc_current_ns->sym_root, u_name);
1526 /* STRUCTURE types can alias symbol names */
1527 if (st != 0 && st->n.sym->attr.flavor != FL_STRUCT)
1529 gfc_error ("Symbol %qs at %C also declared as a type at %L", name,
1530 &st->n.sym->declared_at);
1531 return false;
1535 /* Start updating the symbol table. Add basic type attribute if present. */
1536 if (current_ts.type != BT_UNKNOWN
1537 && (sym->attr.implicit_type == 0
1538 || !gfc_compare_types (&sym->ts, &current_ts))
1539 && !gfc_add_type (sym, &current_ts, var_locus))
1540 return false;
1542 if (sym->ts.type == BT_CHARACTER)
1544 sym->ts.u.cl = cl;
1545 sym->ts.deferred = cl_deferred;
1548 /* Add dimension attribute if present. */
1549 if (!gfc_set_array_spec (sym, *as, var_locus))
1550 return false;
1551 *as = NULL;
1553 /* Add attribute to symbol. The copy is so that we can reset the
1554 dimension attribute. */
1555 attr = current_attr;
1556 attr.dimension = 0;
1557 attr.codimension = 0;
1559 if (!gfc_copy_attr (&sym->attr, &attr, var_locus))
1560 return false;
1562 /* Finish any work that may need to be done for the binding label,
1563 if it's a bind(c). The bind(c) attr is found before the symbol
1564 is made, and before the symbol name (for data decls), so the
1565 current_ts is holding the binding label, or nothing if the
1566 name= attr wasn't given. Therefore, test here if we're dealing
1567 with a bind(c) and make sure the binding label is set correctly. */
1568 if (sym->attr.is_bind_c == 1)
1570 if (!sym->binding_label)
1572 /* Set the binding label and verify that if a NAME= was specified
1573 then only one identifier was in the entity-decl-list. */
1574 if (!set_binding_label (&sym->binding_label, sym->name,
1575 num_idents_on_line))
1576 return false;
1580 /* See if we know we're in a common block, and if it's a bind(c)
1581 common then we need to make sure we're an interoperable type. */
1582 if (sym->attr.in_common == 1)
1584 /* Test the common block object. */
1585 if (sym->common_block != NULL && sym->common_block->is_bind_c == 1
1586 && sym->ts.is_c_interop != 1)
1588 gfc_error_now ("Variable %qs in common block %qs at %C "
1589 "must be declared with a C interoperable "
1590 "kind since common block %qs is BIND(C)",
1591 sym->name, sym->common_block->name,
1592 sym->common_block->name);
1593 gfc_clear_error ();
1597 sym->attr.implied_index = 0;
1599 /* Use the parameter expressions for a parameterized derived type. */
1600 if ((sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS)
1601 && sym->ts.u.derived->attr.pdt_type && type_param_spec_list)
1602 sym->param_list = gfc_copy_actual_arglist (type_param_spec_list);
1604 if (sym->ts.type == BT_CLASS)
1605 return gfc_build_class_symbol (&sym->ts, &sym->attr, &sym->as);
1607 return true;
1611 /* Set character constant to the given length. The constant will be padded or
1612 truncated. If we're inside an array constructor without a typespec, we
1613 additionally check that all elements have the same length; check_len -1
1614 means no checking. */
1616 void
1617 gfc_set_constant_character_len (gfc_charlen_t len, gfc_expr *expr,
1618 gfc_charlen_t check_len)
1620 gfc_char_t *s;
1621 gfc_charlen_t slen;
1623 if (expr->ts.type != BT_CHARACTER)
1624 return;
1626 if (expr->expr_type != EXPR_CONSTANT)
1628 gfc_error_now ("CHARACTER length must be a constant at %L", &expr->where);
1629 return;
1632 slen = expr->value.character.length;
1633 if (len != slen)
1635 s = gfc_get_wide_string (len + 1);
1636 memcpy (s, expr->value.character.string,
1637 MIN (len, slen) * sizeof (gfc_char_t));
1638 if (len > slen)
1639 gfc_wide_memset (&s[slen], ' ', len - slen);
1641 if (warn_character_truncation && slen > len)
1642 gfc_warning_now (OPT_Wcharacter_truncation,
1643 "CHARACTER expression at %L is being truncated "
1644 "(%ld/%ld)", &expr->where,
1645 (long) slen, (long) len);
1647 /* Apply the standard by 'hand' otherwise it gets cleared for
1648 initializers. */
1649 if (check_len != -1 && slen != check_len
1650 && !(gfc_option.allow_std & GFC_STD_GNU))
1651 gfc_error_now ("The CHARACTER elements of the array constructor "
1652 "at %L must have the same length (%ld/%ld)",
1653 &expr->where, (long) slen,
1654 (long) check_len);
1656 s[len] = '\0';
1657 free (expr->value.character.string);
1658 expr->value.character.string = s;
1659 expr->value.character.length = len;
1664 /* Function to create and update the enumerator history
1665 using the information passed as arguments.
1666 Pointer "max_enum" is also updated, to point to
1667 enum history node containing largest initializer.
1669 SYM points to the symbol node of enumerator.
1670 INIT points to its enumerator value. */
1672 static void
1673 create_enum_history (gfc_symbol *sym, gfc_expr *init)
1675 enumerator_history *new_enum_history;
1676 gcc_assert (sym != NULL && init != NULL);
1678 new_enum_history = XCNEW (enumerator_history);
1680 new_enum_history->sym = sym;
1681 new_enum_history->initializer = init;
1682 new_enum_history->next = NULL;
1684 if (enum_history == NULL)
1686 enum_history = new_enum_history;
1687 max_enum = enum_history;
1689 else
1691 new_enum_history->next = enum_history;
1692 enum_history = new_enum_history;
1694 if (mpz_cmp (max_enum->initializer->value.integer,
1695 new_enum_history->initializer->value.integer) < 0)
1696 max_enum = new_enum_history;
1701 /* Function to free enum kind history. */
1703 void
1704 gfc_free_enum_history (void)
1706 enumerator_history *current = enum_history;
1707 enumerator_history *next;
1709 while (current != NULL)
1711 next = current->next;
1712 free (current);
1713 current = next;
1715 max_enum = NULL;
1716 enum_history = NULL;
1720 /* Function called by variable_decl() that adds an initialization
1721 expression to a symbol. */
1723 static bool
1724 add_init_expr_to_sym (const char *name, gfc_expr **initp, locus *var_locus)
1726 symbol_attribute attr;
1727 gfc_symbol *sym;
1728 gfc_expr *init;
1730 init = *initp;
1731 if (find_special (name, &sym, false))
1732 return false;
1734 attr = sym->attr;
1736 /* If this symbol is confirming an implicit parameter type,
1737 then an initialization expression is not allowed. */
1738 if (attr.flavor == FL_PARAMETER
1739 && sym->value != NULL
1740 && *initp != NULL)
1742 gfc_error ("Initializer not allowed for PARAMETER %qs at %C",
1743 sym->name);
1744 return false;
1747 if (init == NULL)
1749 /* An initializer is required for PARAMETER declarations. */
1750 if (attr.flavor == FL_PARAMETER)
1752 gfc_error ("PARAMETER at %L is missing an initializer", var_locus);
1753 return false;
1756 else
1758 /* If a variable appears in a DATA block, it cannot have an
1759 initializer. */
1760 if (sym->attr.data)
1762 gfc_error ("Variable %qs at %C with an initializer already "
1763 "appears in a DATA statement", sym->name);
1764 return false;
1767 /* Check if the assignment can happen. This has to be put off
1768 until later for derived type variables and procedure pointers. */
1769 if (!gfc_bt_struct (sym->ts.type) && !gfc_bt_struct (init->ts.type)
1770 && sym->ts.type != BT_CLASS && init->ts.type != BT_CLASS
1771 && !sym->attr.proc_pointer
1772 && !gfc_check_assign_symbol (sym, NULL, init))
1773 return false;
1775 if (sym->ts.type == BT_CHARACTER && sym->ts.u.cl
1776 && init->ts.type == BT_CHARACTER)
1778 /* Update symbol character length according initializer. */
1779 if (!gfc_check_assign_symbol (sym, NULL, init))
1780 return false;
1782 if (sym->ts.u.cl->length == NULL)
1784 gfc_charlen_t clen;
1785 /* If there are multiple CHARACTER variables declared on the
1786 same line, we don't want them to share the same length. */
1787 sym->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
1789 if (sym->attr.flavor == FL_PARAMETER)
1791 if (init->expr_type == EXPR_CONSTANT)
1793 clen = init->value.character.length;
1794 sym->ts.u.cl->length
1795 = gfc_get_int_expr (gfc_charlen_int_kind,
1796 NULL, clen);
1798 else if (init->expr_type == EXPR_ARRAY)
1800 if (init->ts.u.cl && init->ts.u.cl->length)
1802 const gfc_expr *length = init->ts.u.cl->length;
1803 if (length->expr_type != EXPR_CONSTANT)
1805 gfc_error ("Cannot initialize parameter array "
1806 "at %L "
1807 "with variable length elements",
1808 &sym->declared_at);
1809 return false;
1811 clen = mpz_get_si (length->value.integer);
1813 else if (init->value.constructor)
1815 gfc_constructor *c;
1816 c = gfc_constructor_first (init->value.constructor);
1817 clen = c->expr->value.character.length;
1819 else
1820 gcc_unreachable ();
1821 sym->ts.u.cl->length
1822 = gfc_get_int_expr (gfc_charlen_int_kind,
1823 NULL, clen);
1825 else if (init->ts.u.cl && init->ts.u.cl->length)
1826 sym->ts.u.cl->length =
1827 gfc_copy_expr (sym->value->ts.u.cl->length);
1830 /* Update initializer character length according symbol. */
1831 else if (sym->ts.u.cl->length->expr_type == EXPR_CONSTANT)
1833 if (!gfc_specification_expr (sym->ts.u.cl->length))
1834 return false;
1836 int k = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind,
1837 false);
1838 /* resolve_charlen will complain later on if the length
1839 is too large. Just skeep the initialization in that case. */
1840 if (mpz_cmp (sym->ts.u.cl->length->value.integer,
1841 gfc_integer_kinds[k].huge) <= 0)
1843 HOST_WIDE_INT len
1844 = gfc_mpz_get_hwi (sym->ts.u.cl->length->value.integer);
1846 if (init->expr_type == EXPR_CONSTANT)
1847 gfc_set_constant_character_len (len, init, -1);
1848 else if (init->expr_type == EXPR_ARRAY)
1850 gfc_constructor *c;
1852 /* Build a new charlen to prevent simplification from
1853 deleting the length before it is resolved. */
1854 init->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
1855 init->ts.u.cl->length
1856 = gfc_copy_expr (sym->ts.u.cl->length);
1858 for (c = gfc_constructor_first (init->value.constructor);
1859 c; c = gfc_constructor_next (c))
1860 gfc_set_constant_character_len (len, c->expr, -1);
1866 /* If sym is implied-shape, set its upper bounds from init. */
1867 if (sym->attr.flavor == FL_PARAMETER && sym->attr.dimension
1868 && sym->as->type == AS_IMPLIED_SHAPE)
1870 int dim;
1872 if (init->rank == 0)
1874 gfc_error ("Can't initialize implied-shape array at %L"
1875 " with scalar", &sym->declared_at);
1876 return false;
1879 /* Shape should be present, we get an initialization expression. */
1880 gcc_assert (init->shape);
1882 for (dim = 0; dim < sym->as->rank; ++dim)
1884 int k;
1885 gfc_expr *e, *lower;
1887 lower = sym->as->lower[dim];
1889 /* If the lower bound is an array element from another
1890 parameterized array, then it is marked with EXPR_VARIABLE and
1891 is an initialization expression. Try to reduce it. */
1892 if (lower->expr_type == EXPR_VARIABLE)
1893 gfc_reduce_init_expr (lower);
1895 if (lower->expr_type == EXPR_CONSTANT)
1897 /* All dimensions must be without upper bound. */
1898 gcc_assert (!sym->as->upper[dim]);
1900 k = lower->ts.kind;
1901 e = gfc_get_constant_expr (BT_INTEGER, k, &sym->declared_at);
1902 mpz_add (e->value.integer, lower->value.integer,
1903 init->shape[dim]);
1904 mpz_sub_ui (e->value.integer, e->value.integer, 1);
1905 sym->as->upper[dim] = e;
1907 else
1909 gfc_error ("Non-constant lower bound in implied-shape"
1910 " declaration at %L", &lower->where);
1911 return false;
1915 sym->as->type = AS_EXPLICIT;
1918 /* Need to check if the expression we initialized this
1919 to was one of the iso_c_binding named constants. If so,
1920 and we're a parameter (constant), let it be iso_c.
1921 For example:
1922 integer(c_int), parameter :: my_int = c_int
1923 integer(my_int) :: my_int_2
1924 If we mark my_int as iso_c (since we can see it's value
1925 is equal to one of the named constants), then my_int_2
1926 will be considered C interoperable. */
1927 if (sym->ts.type != BT_CHARACTER && !gfc_bt_struct (sym->ts.type))
1929 sym->ts.is_iso_c |= init->ts.is_iso_c;
1930 sym->ts.is_c_interop |= init->ts.is_c_interop;
1931 /* attr bits needed for module files. */
1932 sym->attr.is_iso_c |= init->ts.is_iso_c;
1933 sym->attr.is_c_interop |= init->ts.is_c_interop;
1934 if (init->ts.is_iso_c)
1935 sym->ts.f90_type = init->ts.f90_type;
1938 /* Add initializer. Make sure we keep the ranks sane. */
1939 if (sym->attr.dimension && init->rank == 0)
1941 mpz_t size;
1942 gfc_expr *array;
1943 int n;
1944 if (sym->attr.flavor == FL_PARAMETER
1945 && init->expr_type == EXPR_CONSTANT
1946 && spec_size (sym->as, &size)
1947 && mpz_cmp_si (size, 0) > 0)
1949 array = gfc_get_array_expr (init->ts.type, init->ts.kind,
1950 &init->where);
1951 for (n = 0; n < (int)mpz_get_si (size); n++)
1952 gfc_constructor_append_expr (&array->value.constructor,
1953 n == 0
1954 ? init
1955 : gfc_copy_expr (init),
1956 &init->where);
1958 array->shape = gfc_get_shape (sym->as->rank);
1959 for (n = 0; n < sym->as->rank; n++)
1960 spec_dimen_size (sym->as, n, &array->shape[n]);
1962 init = array;
1963 mpz_clear (size);
1965 init->rank = sym->as->rank;
1968 sym->value = init;
1969 if (sym->attr.save == SAVE_NONE)
1970 sym->attr.save = SAVE_IMPLICIT;
1971 *initp = NULL;
1974 return true;
1978 /* Function called by variable_decl() that adds a name to a structure
1979 being built. */
1981 static bool
1982 build_struct (const char *name, gfc_charlen *cl, gfc_expr **init,
1983 gfc_array_spec **as)
1985 gfc_state_data *s;
1986 gfc_component *c;
1988 /* F03:C438/C439. If the current symbol is of the same derived type that we're
1989 constructing, it must have the pointer attribute. */
1990 if ((current_ts.type == BT_DERIVED || current_ts.type == BT_CLASS)
1991 && current_ts.u.derived == gfc_current_block ()
1992 && current_attr.pointer == 0)
1994 if (current_attr.allocatable
1995 && !gfc_notify_std(GFC_STD_F2008, "Component at %C "
1996 "must have the POINTER attribute"))
1998 return false;
2000 else if (current_attr.allocatable == 0)
2002 gfc_error ("Component at %C must have the POINTER attribute");
2003 return false;
2007 /* F03:C437. */
2008 if (current_ts.type == BT_CLASS
2009 && !(current_attr.pointer || current_attr.allocatable))
2011 gfc_error ("Component %qs with CLASS at %C must be allocatable "
2012 "or pointer", name);
2013 return false;
2016 if (gfc_current_block ()->attr.pointer && (*as)->rank != 0)
2018 if ((*as)->type != AS_DEFERRED && (*as)->type != AS_EXPLICIT)
2020 gfc_error ("Array component of structure at %C must have explicit "
2021 "or deferred shape");
2022 return false;
2026 /* If we are in a nested union/map definition, gfc_add_component will not
2027 properly find repeated components because:
2028 (i) gfc_add_component does a flat search, where components of unions
2029 and maps are implicity chained so nested components may conflict.
2030 (ii) Unions and maps are not linked as components of their parent
2031 structures until after they are parsed.
2032 For (i) we use gfc_find_component which searches recursively, and for (ii)
2033 we search each block directly from the parse stack until we find the top
2034 level structure. */
2036 s = gfc_state_stack;
2037 if (s->state == COMP_UNION || s->state == COMP_MAP)
2039 while (s->state == COMP_UNION || gfc_comp_struct (s->state))
2041 c = gfc_find_component (s->sym, name, true, true, NULL);
2042 if (c != NULL)
2044 gfc_error_now ("Component %qs at %C already declared at %L",
2045 name, &c->loc);
2046 return false;
2048 /* Break after we've searched the entire chain. */
2049 if (s->state == COMP_DERIVED || s->state == COMP_STRUCTURE)
2050 break;
2051 s = s->previous;
2055 if (!gfc_add_component (gfc_current_block(), name, &c))
2056 return false;
2058 c->ts = current_ts;
2059 if (c->ts.type == BT_CHARACTER)
2060 c->ts.u.cl = cl;
2062 if (c->ts.type != BT_CLASS && c->ts.type != BT_DERIVED
2063 && (c->ts.kind == 0 || c->ts.type == BT_CHARACTER)
2064 && saved_kind_expr != NULL)
2065 c->kind_expr = gfc_copy_expr (saved_kind_expr);
2067 c->attr = current_attr;
2069 c->initializer = *init;
2070 *init = NULL;
2072 c->as = *as;
2073 if (c->as != NULL)
2075 if (c->as->corank)
2076 c->attr.codimension = 1;
2077 if (c->as->rank)
2078 c->attr.dimension = 1;
2080 *as = NULL;
2082 gfc_apply_init (&c->ts, &c->attr, c->initializer);
2084 /* Check array components. */
2085 if (!c->attr.dimension)
2086 goto scalar;
2088 if (c->attr.pointer)
2090 if (c->as->type != AS_DEFERRED)
2092 gfc_error ("Pointer array component of structure at %C must have a "
2093 "deferred shape");
2094 return false;
2097 else if (c->attr.allocatable)
2099 if (c->as->type != AS_DEFERRED)
2101 gfc_error ("Allocatable component of structure at %C must have a "
2102 "deferred shape");
2103 return false;
2106 else
2108 if (c->as->type != AS_EXPLICIT)
2110 gfc_error ("Array component of structure at %C must have an "
2111 "explicit shape");
2112 return false;
2116 scalar:
2117 if (c->ts.type == BT_CLASS)
2118 return gfc_build_class_symbol (&c->ts, &c->attr, &c->as);
2120 if (c->attr.pdt_kind || c->attr.pdt_len)
2122 gfc_symbol *sym;
2123 gfc_find_symbol (c->name, gfc_current_block ()->f2k_derived,
2124 0, &sym);
2125 if (sym == NULL)
2127 gfc_error ("Type parameter %qs at %C has no corresponding entry "
2128 "in the type parameter name list at %L",
2129 c->name, &gfc_current_block ()->declared_at);
2130 return false;
2132 sym->ts = c->ts;
2133 sym->attr.pdt_kind = c->attr.pdt_kind;
2134 sym->attr.pdt_len = c->attr.pdt_len;
2135 if (c->initializer)
2136 sym->value = gfc_copy_expr (c->initializer);
2137 sym->attr.flavor = FL_VARIABLE;
2140 if ((c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
2141 && c->ts.u.derived && c->ts.u.derived->attr.pdt_template
2142 && decl_type_param_list)
2143 c->param_list = gfc_copy_actual_arglist (decl_type_param_list);
2145 return true;
2149 /* Match a 'NULL()', and possibly take care of some side effects. */
2151 match
2152 gfc_match_null (gfc_expr **result)
2154 gfc_symbol *sym;
2155 match m, m2 = MATCH_NO;
2157 if ((m = gfc_match (" null ( )")) == MATCH_ERROR)
2158 return MATCH_ERROR;
2160 if (m == MATCH_NO)
2162 locus old_loc;
2163 char name[GFC_MAX_SYMBOL_LEN + 1];
2165 if ((m2 = gfc_match (" null (")) != MATCH_YES)
2166 return m2;
2168 old_loc = gfc_current_locus;
2169 if ((m2 = gfc_match (" %n ) ", name)) == MATCH_ERROR)
2170 return MATCH_ERROR;
2171 if (m2 != MATCH_YES
2172 && ((m2 = gfc_match (" mold = %n )", name)) == MATCH_ERROR))
2173 return MATCH_ERROR;
2174 if (m2 == MATCH_NO)
2176 gfc_current_locus = old_loc;
2177 return MATCH_NO;
2181 /* The NULL symbol now has to be/become an intrinsic function. */
2182 if (gfc_get_symbol ("null", NULL, &sym))
2184 gfc_error ("NULL() initialization at %C is ambiguous");
2185 return MATCH_ERROR;
2188 gfc_intrinsic_symbol (sym);
2190 if (sym->attr.proc != PROC_INTRINSIC
2191 && !(sym->attr.use_assoc && sym->attr.intrinsic)
2192 && (!gfc_add_procedure(&sym->attr, PROC_INTRINSIC, sym->name, NULL)
2193 || !gfc_add_function (&sym->attr, sym->name, NULL)))
2194 return MATCH_ERROR;
2196 *result = gfc_get_null_expr (&gfc_current_locus);
2198 /* Invalid per F2008, C512. */
2199 if (m2 == MATCH_YES)
2201 gfc_error ("NULL() initialization at %C may not have MOLD");
2202 return MATCH_ERROR;
2205 return MATCH_YES;
2209 /* Match the initialization expr for a data pointer or procedure pointer. */
2211 static match
2212 match_pointer_init (gfc_expr **init, int procptr)
2214 match m;
2216 if (gfc_pure (NULL) && !gfc_comp_struct (gfc_state_stack->state))
2218 gfc_error ("Initialization of pointer at %C is not allowed in "
2219 "a PURE procedure");
2220 return MATCH_ERROR;
2222 gfc_unset_implicit_pure (gfc_current_ns->proc_name);
2224 /* Match NULL() initialization. */
2225 m = gfc_match_null (init);
2226 if (m != MATCH_NO)
2227 return m;
2229 /* Match non-NULL initialization. */
2230 gfc_matching_ptr_assignment = !procptr;
2231 gfc_matching_procptr_assignment = procptr;
2232 m = gfc_match_rvalue (init);
2233 gfc_matching_ptr_assignment = 0;
2234 gfc_matching_procptr_assignment = 0;
2235 if (m == MATCH_ERROR)
2236 return MATCH_ERROR;
2237 else if (m == MATCH_NO)
2239 gfc_error ("Error in pointer initialization at %C");
2240 return MATCH_ERROR;
2243 if (!procptr && !gfc_resolve_expr (*init))
2244 return MATCH_ERROR;
2246 if (!gfc_notify_std (GFC_STD_F2008, "non-NULL pointer "
2247 "initialization at %C"))
2248 return MATCH_ERROR;
2250 return MATCH_YES;
2254 static bool
2255 check_function_name (char *name)
2257 /* In functions that have a RESULT variable defined, the function name always
2258 refers to function calls. Therefore, the name is not allowed to appear in
2259 specification statements. When checking this, be careful about
2260 'hidden' procedure pointer results ('ppr@'). */
2262 if (gfc_current_state () == COMP_FUNCTION)
2264 gfc_symbol *block = gfc_current_block ();
2265 if (block && block->result && block->result != block
2266 && strcmp (block->result->name, "ppr@") != 0
2267 && strcmp (block->name, name) == 0)
2269 gfc_error ("RESULT variable %qs at %L prohibits FUNCTION name %qs at %C "
2270 "from appearing in a specification statement",
2271 block->result->name, &block->result->declared_at, name);
2272 return false;
2276 return true;
2280 /* Match a variable name with an optional initializer. When this
2281 subroutine is called, a variable is expected to be parsed next.
2282 Depending on what is happening at the moment, updates either the
2283 symbol table or the current interface. */
2285 static match
2286 variable_decl (int elem)
2288 char name[GFC_MAX_SYMBOL_LEN + 1];
2289 static unsigned int fill_id = 0;
2290 gfc_expr *initializer, *char_len;
2291 gfc_array_spec *as;
2292 gfc_array_spec *cp_as; /* Extra copy for Cray Pointees. */
2293 gfc_charlen *cl;
2294 bool cl_deferred;
2295 locus var_locus;
2296 match m;
2297 bool t;
2298 gfc_symbol *sym;
2300 initializer = NULL;
2301 as = NULL;
2302 cp_as = NULL;
2304 /* When we get here, we've just matched a list of attributes and
2305 maybe a type and a double colon. The next thing we expect to see
2306 is the name of the symbol. */
2308 /* If we are parsing a structure with legacy support, we allow the symbol
2309 name to be '%FILL' which gives it an anonymous (inaccessible) name. */
2310 m = MATCH_NO;
2311 gfc_gobble_whitespace ();
2312 if (gfc_peek_ascii_char () == '%')
2314 gfc_next_ascii_char ();
2315 m = gfc_match ("fill");
2318 if (m != MATCH_YES)
2320 m = gfc_match_name (name);
2321 if (m != MATCH_YES)
2322 goto cleanup;
2325 else
2327 m = MATCH_ERROR;
2328 if (gfc_current_state () != COMP_STRUCTURE)
2330 if (flag_dec_structure)
2331 gfc_error ("%qs not allowed outside STRUCTURE at %C", "%FILL");
2332 else
2333 gfc_error ("%qs at %C is a DEC extension, enable with "
2334 "%<-fdec-structure%>", "%FILL");
2335 goto cleanup;
2338 if (attr_seen)
2340 gfc_error ("%qs entity cannot have attributes at %C", "%FILL");
2341 goto cleanup;
2344 /* %FILL components are given invalid fortran names. */
2345 snprintf (name, GFC_MAX_SYMBOL_LEN + 1, "%%FILL%u", fill_id++);
2346 m = MATCH_YES;
2349 var_locus = gfc_current_locus;
2351 /* Now we could see the optional array spec. or character length. */
2352 m = gfc_match_array_spec (&as, true, true);
2353 if (m == MATCH_ERROR)
2354 goto cleanup;
2356 if (m == MATCH_NO)
2357 as = gfc_copy_array_spec (current_as);
2358 else if (current_as
2359 && !merge_array_spec (current_as, as, true))
2361 m = MATCH_ERROR;
2362 goto cleanup;
2365 if (flag_cray_pointer)
2366 cp_as = gfc_copy_array_spec (as);
2368 /* At this point, we know for sure if the symbol is PARAMETER and can thus
2369 determine (and check) whether it can be implied-shape. If it
2370 was parsed as assumed-size, change it because PARAMETERs can not
2371 be assumed-size.
2373 An explicit-shape-array cannot appear under several conditions.
2374 That check is done here as well. */
2375 if (as)
2377 if (as->type == AS_IMPLIED_SHAPE && current_attr.flavor != FL_PARAMETER)
2379 m = MATCH_ERROR;
2380 gfc_error ("Non-PARAMETER symbol %qs at %L can't be implied-shape",
2381 name, &var_locus);
2382 goto cleanup;
2385 if (as->type == AS_ASSUMED_SIZE && as->rank == 1
2386 && current_attr.flavor == FL_PARAMETER)
2387 as->type = AS_IMPLIED_SHAPE;
2389 if (as->type == AS_IMPLIED_SHAPE
2390 && !gfc_notify_std (GFC_STD_F2008, "Implied-shape array at %L",
2391 &var_locus))
2393 m = MATCH_ERROR;
2394 goto cleanup;
2397 /* F2018:C830 (R816) An explicit-shape-spec whose bounds are not
2398 constant expressions shall appear only in a subprogram, derived
2399 type definition, BLOCK construct, or interface body. */
2400 if (as->type == AS_EXPLICIT
2401 && gfc_current_state () != COMP_BLOCK
2402 && gfc_current_state () != COMP_DERIVED
2403 && gfc_current_state () != COMP_FUNCTION
2404 && gfc_current_state () != COMP_INTERFACE
2405 && gfc_current_state () != COMP_SUBROUTINE)
2407 gfc_expr *e;
2408 bool not_constant = false;
2410 for (int i = 0; i < as->rank; i++)
2412 e = gfc_copy_expr (as->lower[i]);
2413 gfc_resolve_expr (e);
2414 gfc_simplify_expr (e, 0);
2415 if (e && (e->expr_type != EXPR_CONSTANT))
2417 not_constant = true;
2418 break;
2420 gfc_free_expr (e);
2422 e = gfc_copy_expr (as->upper[i]);
2423 gfc_resolve_expr (e);
2424 gfc_simplify_expr (e, 0);
2425 if (e && (e->expr_type != EXPR_CONSTANT))
2427 not_constant = true;
2428 break;
2430 gfc_free_expr (e);
2433 if (not_constant)
2435 gfc_error ("Explicit shaped array with nonconstant bounds at %C");
2436 m = MATCH_ERROR;
2437 goto cleanup;
2440 if (as->type == AS_EXPLICIT)
2442 for (int i = 0; i < as->rank; i++)
2444 gfc_expr *e, *n;
2445 e = as->lower[i];
2446 if (e->expr_type != EXPR_CONSTANT)
2448 n = gfc_copy_expr (e);
2449 gfc_simplify_expr (n, 1);
2450 if (n->expr_type == EXPR_CONSTANT)
2451 gfc_replace_expr (e, n);
2452 else
2453 gfc_free_expr (n);
2455 e = as->upper[i];
2456 if (e->expr_type != EXPR_CONSTANT)
2458 n = gfc_copy_expr (e);
2459 gfc_simplify_expr (n, 1);
2460 if (n->expr_type == EXPR_CONSTANT)
2461 gfc_replace_expr (e, n);
2462 else
2463 gfc_free_expr (n);
2469 char_len = NULL;
2470 cl = NULL;
2471 cl_deferred = false;
2473 if (current_ts.type == BT_CHARACTER)
2475 switch (match_char_length (&char_len, &cl_deferred, false))
2477 case MATCH_YES:
2478 cl = gfc_new_charlen (gfc_current_ns, NULL);
2480 cl->length = char_len;
2481 break;
2483 /* Non-constant lengths need to be copied after the first
2484 element. Also copy assumed lengths. */
2485 case MATCH_NO:
2486 if (elem > 1
2487 && (current_ts.u.cl->length == NULL
2488 || current_ts.u.cl->length->expr_type != EXPR_CONSTANT))
2490 cl = gfc_new_charlen (gfc_current_ns, NULL);
2491 cl->length = gfc_copy_expr (current_ts.u.cl->length);
2493 else
2494 cl = current_ts.u.cl;
2496 cl_deferred = current_ts.deferred;
2498 break;
2500 case MATCH_ERROR:
2501 goto cleanup;
2505 /* The dummy arguments and result of the abreviated form of MODULE
2506 PROCEDUREs, used in SUBMODULES should not be redefined. */
2507 if (gfc_current_ns->proc_name
2508 && gfc_current_ns->proc_name->abr_modproc_decl)
2510 gfc_find_symbol (name, gfc_current_ns, 1, &sym);
2511 if (sym != NULL && (sym->attr.dummy || sym->attr.result))
2513 m = MATCH_ERROR;
2514 gfc_error ("%qs at %C is a redefinition of the declaration "
2515 "in the corresponding interface for MODULE "
2516 "PROCEDURE %qs", sym->name,
2517 gfc_current_ns->proc_name->name);
2518 goto cleanup;
2522 /* %FILL components may not have initializers. */
2523 if (strncmp (name, "%FILL", 5) == 0 && gfc_match_eos () != MATCH_YES)
2525 gfc_error ("%qs entity cannot have an initializer at %C", "%FILL");
2526 m = MATCH_ERROR;
2527 goto cleanup;
2530 /* If this symbol has already shown up in a Cray Pointer declaration,
2531 and this is not a component declaration,
2532 then we want to set the type & bail out. */
2533 if (flag_cray_pointer && !gfc_comp_struct (gfc_current_state ()))
2535 gfc_find_symbol (name, gfc_current_ns, 1, &sym);
2536 if (sym != NULL && sym->attr.cray_pointee)
2538 sym->ts.type = current_ts.type;
2539 sym->ts.kind = current_ts.kind;
2540 sym->ts.u.cl = cl;
2541 sym->ts.u.derived = current_ts.u.derived;
2542 sym->ts.is_c_interop = current_ts.is_c_interop;
2543 sym->ts.is_iso_c = current_ts.is_iso_c;
2544 m = MATCH_YES;
2546 /* Check to see if we have an array specification. */
2547 if (cp_as != NULL)
2549 if (sym->as != NULL)
2551 gfc_error ("Duplicate array spec for Cray pointee at %C");
2552 gfc_free_array_spec (cp_as);
2553 m = MATCH_ERROR;
2554 goto cleanup;
2556 else
2558 if (!gfc_set_array_spec (sym, cp_as, &var_locus))
2559 gfc_internal_error ("Couldn't set pointee array spec.");
2561 /* Fix the array spec. */
2562 m = gfc_mod_pointee_as (sym->as);
2563 if (m == MATCH_ERROR)
2564 goto cleanup;
2567 goto cleanup;
2569 else
2571 gfc_free_array_spec (cp_as);
2575 /* Procedure pointer as function result. */
2576 if (gfc_current_state () == COMP_FUNCTION
2577 && strcmp ("ppr@", gfc_current_block ()->name) == 0
2578 && strcmp (name, gfc_current_block ()->ns->proc_name->name) == 0)
2579 strcpy (name, "ppr@");
2581 if (gfc_current_state () == COMP_FUNCTION
2582 && strcmp (name, gfc_current_block ()->name) == 0
2583 && gfc_current_block ()->result
2584 && strcmp ("ppr@", gfc_current_block ()->result->name) == 0)
2585 strcpy (name, "ppr@");
2587 /* OK, we've successfully matched the declaration. Now put the
2588 symbol in the current namespace, because it might be used in the
2589 optional initialization expression for this symbol, e.g. this is
2590 perfectly legal:
2592 integer, parameter :: i = huge(i)
2594 This is only true for parameters or variables of a basic type.
2595 For components of derived types, it is not true, so we don't
2596 create a symbol for those yet. If we fail to create the symbol,
2597 bail out. */
2598 if (!gfc_comp_struct (gfc_current_state ())
2599 && !build_sym (name, cl, cl_deferred, &as, &var_locus))
2601 m = MATCH_ERROR;
2602 goto cleanup;
2605 if (!check_function_name (name))
2607 m = MATCH_ERROR;
2608 goto cleanup;
2611 /* We allow old-style initializations of the form
2612 integer i /2/, j(4) /3*3, 1/
2613 (if no colon has been seen). These are different from data
2614 statements in that initializers are only allowed to apply to the
2615 variable immediately preceding, i.e.
2616 integer i, j /1, 2/
2617 is not allowed. Therefore we have to do some work manually, that
2618 could otherwise be left to the matchers for DATA statements. */
2620 if (!colon_seen && gfc_match (" /") == MATCH_YES)
2622 if (!gfc_notify_std (GFC_STD_GNU, "Old-style "
2623 "initialization at %C"))
2624 return MATCH_ERROR;
2626 /* Allow old style initializations for components of STRUCTUREs and MAPs
2627 but not components of derived types. */
2628 else if (gfc_current_state () == COMP_DERIVED)
2630 gfc_error ("Invalid old style initialization for derived type "
2631 "component at %C");
2632 m = MATCH_ERROR;
2633 goto cleanup;
2636 /* For structure components, read the initializer as a special
2637 expression and let the rest of this function apply the initializer
2638 as usual. */
2639 else if (gfc_comp_struct (gfc_current_state ()))
2641 m = match_clist_expr (&initializer, &current_ts, as);
2642 if (m == MATCH_NO)
2643 gfc_error ("Syntax error in old style initialization of %s at %C",
2644 name);
2645 if (m != MATCH_YES)
2646 goto cleanup;
2649 /* Otherwise we treat the old style initialization just like a
2650 DATA declaration for the current variable. */
2651 else
2652 return match_old_style_init (name);
2655 /* The double colon must be present in order to have initializers.
2656 Otherwise the statement is ambiguous with an assignment statement. */
2657 if (colon_seen)
2659 if (gfc_match (" =>") == MATCH_YES)
2661 if (!current_attr.pointer)
2663 gfc_error ("Initialization at %C isn't for a pointer variable");
2664 m = MATCH_ERROR;
2665 goto cleanup;
2668 m = match_pointer_init (&initializer, 0);
2669 if (m != MATCH_YES)
2670 goto cleanup;
2672 else if (gfc_match_char ('=') == MATCH_YES)
2674 if (current_attr.pointer)
2676 gfc_error ("Pointer initialization at %C requires %<=>%>, "
2677 "not %<=%>");
2678 m = MATCH_ERROR;
2679 goto cleanup;
2682 m = gfc_match_init_expr (&initializer);
2683 if (m == MATCH_NO)
2685 gfc_error ("Expected an initialization expression at %C");
2686 m = MATCH_ERROR;
2689 if (current_attr.flavor != FL_PARAMETER && gfc_pure (NULL)
2690 && !gfc_comp_struct (gfc_state_stack->state))
2692 gfc_error ("Initialization of variable at %C is not allowed in "
2693 "a PURE procedure");
2694 m = MATCH_ERROR;
2697 if (current_attr.flavor != FL_PARAMETER
2698 && !gfc_comp_struct (gfc_state_stack->state))
2699 gfc_unset_implicit_pure (gfc_current_ns->proc_name);
2701 if (m != MATCH_YES)
2702 goto cleanup;
2706 if (initializer != NULL && current_attr.allocatable
2707 && gfc_comp_struct (gfc_current_state ()))
2709 gfc_error ("Initialization of allocatable component at %C is not "
2710 "allowed");
2711 m = MATCH_ERROR;
2712 goto cleanup;
2715 if (gfc_current_state () == COMP_DERIVED
2716 && gfc_current_block ()->attr.pdt_template)
2718 gfc_symbol *param;
2719 gfc_find_symbol (name, gfc_current_block ()->f2k_derived,
2720 0, &param);
2721 if (!param && (current_attr.pdt_kind || current_attr.pdt_len))
2723 gfc_error ("The component with KIND or LEN attribute at %C does not "
2724 "not appear in the type parameter list at %L",
2725 &gfc_current_block ()->declared_at);
2726 m = MATCH_ERROR;
2727 goto cleanup;
2729 else if (param && !(current_attr.pdt_kind || current_attr.pdt_len))
2731 gfc_error ("The component at %C that appears in the type parameter "
2732 "list at %L has neither the KIND nor LEN attribute",
2733 &gfc_current_block ()->declared_at);
2734 m = MATCH_ERROR;
2735 goto cleanup;
2737 else if (as && (current_attr.pdt_kind || current_attr.pdt_len))
2739 gfc_error ("The component at %C which is a type parameter must be "
2740 "a scalar");
2741 m = MATCH_ERROR;
2742 goto cleanup;
2744 else if (param && initializer)
2745 param->value = gfc_copy_expr (initializer);
2748 /* Add the initializer. Note that it is fine if initializer is
2749 NULL here, because we sometimes also need to check if a
2750 declaration *must* have an initialization expression. */
2751 if (!gfc_comp_struct (gfc_current_state ()))
2752 t = add_init_expr_to_sym (name, &initializer, &var_locus);
2753 else
2755 if (current_ts.type == BT_DERIVED
2756 && !current_attr.pointer && !initializer)
2757 initializer = gfc_default_initializer (&current_ts);
2758 t = build_struct (name, cl, &initializer, &as);
2760 /* If we match a nested structure definition we expect to see the
2761 * body even if the variable declarations blow up, so we need to keep
2762 * the structure declaration around. */
2763 if (gfc_new_block && gfc_new_block->attr.flavor == FL_STRUCT)
2764 gfc_commit_symbol (gfc_new_block);
2767 m = (t) ? MATCH_YES : MATCH_ERROR;
2769 cleanup:
2770 /* Free stuff up and return. */
2771 gfc_free_expr (initializer);
2772 gfc_free_array_spec (as);
2774 return m;
2778 /* Match an extended-f77 "TYPESPEC*bytesize"-style kind specification.
2779 This assumes that the byte size is equal to the kind number for
2780 non-COMPLEX types, and equal to twice the kind number for COMPLEX. */
2782 match
2783 gfc_match_old_kind_spec (gfc_typespec *ts)
2785 match m;
2786 int original_kind;
2788 if (gfc_match_char ('*') != MATCH_YES)
2789 return MATCH_NO;
2791 m = gfc_match_small_literal_int (&ts->kind, NULL);
2792 if (m != MATCH_YES)
2793 return MATCH_ERROR;
2795 original_kind = ts->kind;
2797 /* Massage the kind numbers for complex types. */
2798 if (ts->type == BT_COMPLEX)
2800 if (ts->kind % 2)
2802 gfc_error ("Old-style type declaration %s*%d not supported at %C",
2803 gfc_basic_typename (ts->type), original_kind);
2804 return MATCH_ERROR;
2806 ts->kind /= 2;
2810 if (ts->type == BT_INTEGER && ts->kind == 4 && flag_integer4_kind == 8)
2811 ts->kind = 8;
2813 if (ts->type == BT_REAL || ts->type == BT_COMPLEX)
2815 if (ts->kind == 4)
2817 if (flag_real4_kind == 8)
2818 ts->kind = 8;
2819 if (flag_real4_kind == 10)
2820 ts->kind = 10;
2821 if (flag_real4_kind == 16)
2822 ts->kind = 16;
2825 if (ts->kind == 8)
2827 if (flag_real8_kind == 4)
2828 ts->kind = 4;
2829 if (flag_real8_kind == 10)
2830 ts->kind = 10;
2831 if (flag_real8_kind == 16)
2832 ts->kind = 16;
2836 if (gfc_validate_kind (ts->type, ts->kind, true) < 0)
2838 gfc_error ("Old-style type declaration %s*%d not supported at %C",
2839 gfc_basic_typename (ts->type), original_kind);
2840 return MATCH_ERROR;
2843 if (!gfc_notify_std (GFC_STD_GNU,
2844 "Nonstandard type declaration %s*%d at %C",
2845 gfc_basic_typename(ts->type), original_kind))
2846 return MATCH_ERROR;
2848 return MATCH_YES;
2852 /* Match a kind specification. Since kinds are generally optional, we
2853 usually return MATCH_NO if something goes wrong. If a "kind="
2854 string is found, then we know we have an error. */
2856 match
2857 gfc_match_kind_spec (gfc_typespec *ts, bool kind_expr_only)
2859 locus where, loc;
2860 gfc_expr *e;
2861 match m, n;
2862 char c;
2864 m = MATCH_NO;
2865 n = MATCH_YES;
2866 e = NULL;
2867 saved_kind_expr = NULL;
2869 where = loc = gfc_current_locus;
2871 if (kind_expr_only)
2872 goto kind_expr;
2874 if (gfc_match_char ('(') == MATCH_NO)
2875 return MATCH_NO;
2877 /* Also gobbles optional text. */
2878 if (gfc_match (" kind = ") == MATCH_YES)
2879 m = MATCH_ERROR;
2881 loc = gfc_current_locus;
2883 kind_expr:
2885 n = gfc_match_init_expr (&e);
2887 if (gfc_derived_parameter_expr (e))
2889 ts->kind = 0;
2890 saved_kind_expr = gfc_copy_expr (e);
2891 goto close_brackets;
2894 if (n != MATCH_YES)
2896 if (gfc_matching_function)
2898 /* The function kind expression might include use associated or
2899 imported parameters and try again after the specification
2900 expressions..... */
2901 if (gfc_match_char (')') != MATCH_YES)
2903 gfc_error ("Missing right parenthesis at %C");
2904 m = MATCH_ERROR;
2905 goto no_match;
2908 gfc_free_expr (e);
2909 gfc_undo_symbols ();
2910 return MATCH_YES;
2912 else
2914 /* ....or else, the match is real. */
2915 if (n == MATCH_NO)
2916 gfc_error ("Expected initialization expression at %C");
2917 if (n != MATCH_YES)
2918 return MATCH_ERROR;
2922 if (e->rank != 0)
2924 gfc_error ("Expected scalar initialization expression at %C");
2925 m = MATCH_ERROR;
2926 goto no_match;
2929 if (gfc_extract_int (e, &ts->kind, 1))
2931 m = MATCH_ERROR;
2932 goto no_match;
2935 /* Before throwing away the expression, let's see if we had a
2936 C interoperable kind (and store the fact). */
2937 if (e->ts.is_c_interop == 1)
2939 /* Mark this as C interoperable if being declared with one
2940 of the named constants from iso_c_binding. */
2941 ts->is_c_interop = e->ts.is_iso_c;
2942 ts->f90_type = e->ts.f90_type;
2943 if (e->symtree)
2944 ts->interop_kind = e->symtree->n.sym;
2947 gfc_free_expr (e);
2948 e = NULL;
2950 /* Ignore errors to this point, if we've gotten here. This means
2951 we ignore the m=MATCH_ERROR from above. */
2952 if (gfc_validate_kind (ts->type, ts->kind, true) < 0)
2954 gfc_error ("Kind %d not supported for type %s at %C", ts->kind,
2955 gfc_basic_typename (ts->type));
2956 gfc_current_locus = where;
2957 return MATCH_ERROR;
2960 /* Warn if, e.g., c_int is used for a REAL variable, but not
2961 if, e.g., c_double is used for COMPLEX as the standard
2962 explicitly says that the kind type parameter for complex and real
2963 variable is the same, i.e. c_float == c_float_complex. */
2964 if (ts->f90_type != BT_UNKNOWN && ts->f90_type != ts->type
2965 && !((ts->f90_type == BT_REAL && ts->type == BT_COMPLEX)
2966 || (ts->f90_type == BT_COMPLEX && ts->type == BT_REAL)))
2967 gfc_warning_now (0, "C kind type parameter is for type %s but type at %L "
2968 "is %s", gfc_basic_typename (ts->f90_type), &where,
2969 gfc_basic_typename (ts->type));
2971 close_brackets:
2973 gfc_gobble_whitespace ();
2974 if ((c = gfc_next_ascii_char ()) != ')'
2975 && (ts->type != BT_CHARACTER || c != ','))
2977 if (ts->type == BT_CHARACTER)
2978 gfc_error ("Missing right parenthesis or comma at %C");
2979 else
2980 gfc_error ("Missing right parenthesis at %C");
2981 m = MATCH_ERROR;
2983 else
2984 /* All tests passed. */
2985 m = MATCH_YES;
2987 if(m == MATCH_ERROR)
2988 gfc_current_locus = where;
2990 if (ts->type == BT_INTEGER && ts->kind == 4 && flag_integer4_kind == 8)
2991 ts->kind = 8;
2993 if (ts->type == BT_REAL || ts->type == BT_COMPLEX)
2995 if (ts->kind == 4)
2997 if (flag_real4_kind == 8)
2998 ts->kind = 8;
2999 if (flag_real4_kind == 10)
3000 ts->kind = 10;
3001 if (flag_real4_kind == 16)
3002 ts->kind = 16;
3005 if (ts->kind == 8)
3007 if (flag_real8_kind == 4)
3008 ts->kind = 4;
3009 if (flag_real8_kind == 10)
3010 ts->kind = 10;
3011 if (flag_real8_kind == 16)
3012 ts->kind = 16;
3016 /* Return what we know from the test(s). */
3017 return m;
3019 no_match:
3020 gfc_free_expr (e);
3021 gfc_current_locus = where;
3022 return m;
3026 static match
3027 match_char_kind (int * kind, int * is_iso_c)
3029 locus where;
3030 gfc_expr *e;
3031 match m, n;
3032 bool fail;
3034 m = MATCH_NO;
3035 e = NULL;
3036 where = gfc_current_locus;
3038 n = gfc_match_init_expr (&e);
3040 if (n != MATCH_YES && gfc_matching_function)
3042 /* The expression might include use-associated or imported
3043 parameters and try again after the specification
3044 expressions. */
3045 gfc_free_expr (e);
3046 gfc_undo_symbols ();
3047 return MATCH_YES;
3050 if (n == MATCH_NO)
3051 gfc_error ("Expected initialization expression at %C");
3052 if (n != MATCH_YES)
3053 return MATCH_ERROR;
3055 if (e->rank != 0)
3057 gfc_error ("Expected scalar initialization expression at %C");
3058 m = MATCH_ERROR;
3059 goto no_match;
3062 if (gfc_derived_parameter_expr (e))
3064 saved_kind_expr = e;
3065 *kind = 0;
3066 return MATCH_YES;
3069 fail = gfc_extract_int (e, kind, 1);
3070 *is_iso_c = e->ts.is_iso_c;
3071 if (fail)
3073 m = MATCH_ERROR;
3074 goto no_match;
3077 gfc_free_expr (e);
3079 /* Ignore errors to this point, if we've gotten here. This means
3080 we ignore the m=MATCH_ERROR from above. */
3081 if (gfc_validate_kind (BT_CHARACTER, *kind, true) < 0)
3083 gfc_error ("Kind %d is not supported for CHARACTER at %C", *kind);
3084 m = MATCH_ERROR;
3086 else
3087 /* All tests passed. */
3088 m = MATCH_YES;
3090 if (m == MATCH_ERROR)
3091 gfc_current_locus = where;
3093 /* Return what we know from the test(s). */
3094 return m;
3096 no_match:
3097 gfc_free_expr (e);
3098 gfc_current_locus = where;
3099 return m;
3103 /* Match the various kind/length specifications in a CHARACTER
3104 declaration. We don't return MATCH_NO. */
3106 match
3107 gfc_match_char_spec (gfc_typespec *ts)
3109 int kind, seen_length, is_iso_c;
3110 gfc_charlen *cl;
3111 gfc_expr *len;
3112 match m;
3113 bool deferred;
3115 len = NULL;
3116 seen_length = 0;
3117 kind = 0;
3118 is_iso_c = 0;
3119 deferred = false;
3121 /* Try the old-style specification first. */
3122 old_char_selector = 0;
3124 m = match_char_length (&len, &deferred, true);
3125 if (m != MATCH_NO)
3127 if (m == MATCH_YES)
3128 old_char_selector = 1;
3129 seen_length = 1;
3130 goto done;
3133 m = gfc_match_char ('(');
3134 if (m != MATCH_YES)
3136 m = MATCH_YES; /* Character without length is a single char. */
3137 goto done;
3140 /* Try the weird case: ( KIND = <int> [ , LEN = <len-param> ] ). */
3141 if (gfc_match (" kind =") == MATCH_YES)
3143 m = match_char_kind (&kind, &is_iso_c);
3145 if (m == MATCH_ERROR)
3146 goto done;
3147 if (m == MATCH_NO)
3148 goto syntax;
3150 if (gfc_match (" , len =") == MATCH_NO)
3151 goto rparen;
3153 m = char_len_param_value (&len, &deferred);
3154 if (m == MATCH_NO)
3155 goto syntax;
3156 if (m == MATCH_ERROR)
3157 goto done;
3158 seen_length = 1;
3160 goto rparen;
3163 /* Try to match "LEN = <len-param>" or "LEN = <len-param>, KIND = <int>". */
3164 if (gfc_match (" len =") == MATCH_YES)
3166 m = char_len_param_value (&len, &deferred);
3167 if (m == MATCH_NO)
3168 goto syntax;
3169 if (m == MATCH_ERROR)
3170 goto done;
3171 seen_length = 1;
3173 if (gfc_match_char (')') == MATCH_YES)
3174 goto done;
3176 if (gfc_match (" , kind =") != MATCH_YES)
3177 goto syntax;
3179 if (match_char_kind (&kind, &is_iso_c) == MATCH_ERROR)
3180 goto done;
3182 goto rparen;
3185 /* Try to match ( <len-param> ) or ( <len-param> , [ KIND = ] <int> ). */
3186 m = char_len_param_value (&len, &deferred);
3187 if (m == MATCH_NO)
3188 goto syntax;
3189 if (m == MATCH_ERROR)
3190 goto done;
3191 seen_length = 1;
3193 m = gfc_match_char (')');
3194 if (m == MATCH_YES)
3195 goto done;
3197 if (gfc_match_char (',') != MATCH_YES)
3198 goto syntax;
3200 gfc_match (" kind ="); /* Gobble optional text. */
3202 m = match_char_kind (&kind, &is_iso_c);
3203 if (m == MATCH_ERROR)
3204 goto done;
3205 if (m == MATCH_NO)
3206 goto syntax;
3208 rparen:
3209 /* Require a right-paren at this point. */
3210 m = gfc_match_char (')');
3211 if (m == MATCH_YES)
3212 goto done;
3214 syntax:
3215 gfc_error ("Syntax error in CHARACTER declaration at %C");
3216 m = MATCH_ERROR;
3217 gfc_free_expr (len);
3218 return m;
3220 done:
3221 /* Deal with character functions after USE and IMPORT statements. */
3222 if (gfc_matching_function)
3224 gfc_free_expr (len);
3225 gfc_undo_symbols ();
3226 return MATCH_YES;
3229 if (m != MATCH_YES)
3231 gfc_free_expr (len);
3232 return m;
3235 /* Do some final massaging of the length values. */
3236 cl = gfc_new_charlen (gfc_current_ns, NULL);
3238 if (seen_length == 0)
3239 cl->length = gfc_get_int_expr (gfc_charlen_int_kind, NULL, 1);
3240 else
3242 /* If gfortran ends up here, then the len may be reducible to a
3243 constant. Try to do that here. If it does not reduce, simply
3244 assign len to the charlen. */
3245 if (len && len->expr_type != EXPR_CONSTANT)
3247 gfc_expr *e;
3248 e = gfc_copy_expr (len);
3249 gfc_reduce_init_expr (e);
3250 if (e->expr_type == EXPR_CONSTANT)
3252 gfc_replace_expr (len, e);
3253 if (mpz_cmp_si (len->value.integer, 0) < 0)
3254 mpz_set_ui (len->value.integer, 0);
3256 else
3257 gfc_free_expr (e);
3258 cl->length = len;
3260 else
3261 cl->length = len;
3264 ts->u.cl = cl;
3265 ts->kind = kind == 0 ? gfc_default_character_kind : kind;
3266 ts->deferred = deferred;
3268 /* We have to know if it was a C interoperable kind so we can
3269 do accurate type checking of bind(c) procs, etc. */
3270 if (kind != 0)
3271 /* Mark this as C interoperable if being declared with one
3272 of the named constants from iso_c_binding. */
3273 ts->is_c_interop = is_iso_c;
3274 else if (len != NULL)
3275 /* Here, we might have parsed something such as: character(c_char)
3276 In this case, the parsing code above grabs the c_char when
3277 looking for the length (line 1690, roughly). it's the last
3278 testcase for parsing the kind params of a character variable.
3279 However, it's not actually the length. this seems like it
3280 could be an error.
3281 To see if the user used a C interop kind, test the expr
3282 of the so called length, and see if it's C interoperable. */
3283 ts->is_c_interop = len->ts.is_iso_c;
3285 return MATCH_YES;
3289 /* Matches a RECORD declaration. */
3291 static match
3292 match_record_decl (char *name)
3294 locus old_loc;
3295 old_loc = gfc_current_locus;
3296 match m;
3298 m = gfc_match (" record /");
3299 if (m == MATCH_YES)
3301 if (!flag_dec_structure)
3303 gfc_current_locus = old_loc;
3304 gfc_error ("RECORD at %C is an extension, enable it with "
3305 "-fdec-structure");
3306 return MATCH_ERROR;
3308 m = gfc_match (" %n/", name);
3309 if (m == MATCH_YES)
3310 return MATCH_YES;
3313 gfc_current_locus = old_loc;
3314 if (flag_dec_structure
3315 && (gfc_match (" record% ") == MATCH_YES
3316 || gfc_match (" record%t") == MATCH_YES))
3317 gfc_error ("Structure name expected after RECORD at %C");
3318 if (m == MATCH_NO)
3319 return MATCH_NO;
3321 return MATCH_ERROR;
3325 /* This function uses the gfc_actual_arglist 'type_param_spec_list' as a source
3326 of expressions to substitute into the possibly parameterized expression
3327 'e'. Using a list is inefficient but should not be too bad since the
3328 number of type parameters is not likely to be large. */
3329 static bool
3330 insert_parameter_exprs (gfc_expr* e, gfc_symbol* sym ATTRIBUTE_UNUSED,
3331 int* f)
3333 gfc_actual_arglist *param;
3334 gfc_expr *copy;
3336 if (e->expr_type != EXPR_VARIABLE)
3337 return false;
3339 gcc_assert (e->symtree);
3340 if (e->symtree->n.sym->attr.pdt_kind
3341 || (*f != 0 && e->symtree->n.sym->attr.pdt_len))
3343 for (param = type_param_spec_list; param; param = param->next)
3344 if (strcmp (e->symtree->n.sym->name, param->name) == 0)
3345 break;
3347 if (param)
3349 copy = gfc_copy_expr (param->expr);
3350 *e = *copy;
3351 free (copy);
3355 return false;
3359 bool
3360 gfc_insert_kind_parameter_exprs (gfc_expr *e)
3362 return gfc_traverse_expr (e, NULL, &insert_parameter_exprs, 0);
3366 bool
3367 gfc_insert_parameter_exprs (gfc_expr *e, gfc_actual_arglist *param_list)
3369 gfc_actual_arglist *old_param_spec_list = type_param_spec_list;
3370 type_param_spec_list = param_list;
3371 return gfc_traverse_expr (e, NULL, &insert_parameter_exprs, 1);
3372 type_param_spec_list = NULL;
3373 type_param_spec_list = old_param_spec_list;
3376 /* Determines the instance of a parameterized derived type to be used by
3377 matching determining the values of the kind parameters and using them
3378 in the name of the instance. If the instance exists, it is used, otherwise
3379 a new derived type is created. */
3380 match
3381 gfc_get_pdt_instance (gfc_actual_arglist *param_list, gfc_symbol **sym,
3382 gfc_actual_arglist **ext_param_list)
3384 /* The PDT template symbol. */
3385 gfc_symbol *pdt = *sym;
3386 /* The symbol for the parameter in the template f2k_namespace. */
3387 gfc_symbol *param;
3388 /* The hoped for instance of the PDT. */
3389 gfc_symbol *instance;
3390 /* The list of parameters appearing in the PDT declaration. */
3391 gfc_formal_arglist *type_param_name_list;
3392 /* Used to store the parameter specification list during recursive calls. */
3393 gfc_actual_arglist *old_param_spec_list;
3394 /* Pointers to the parameter specification being used. */
3395 gfc_actual_arglist *actual_param;
3396 gfc_actual_arglist *tail = NULL;
3397 /* Used to build up the name of the PDT instance. The prefix uses 4
3398 characters and each KIND parameter 2 more. Allow 8 of the latter. */
3399 char name[GFC_MAX_SYMBOL_LEN + 21];
3401 bool name_seen = (param_list == NULL);
3402 bool assumed_seen = false;
3403 bool deferred_seen = false;
3404 bool spec_error = false;
3405 int kind_value, i;
3406 gfc_expr *kind_expr;
3407 gfc_component *c1, *c2;
3408 match m;
3410 type_param_spec_list = NULL;
3412 type_param_name_list = pdt->formal;
3413 actual_param = param_list;
3414 sprintf (name, "Pdt%s", pdt->name);
3416 /* Run through the parameter name list and pick up the actual
3417 parameter values or use the default values in the PDT declaration. */
3418 for (; type_param_name_list;
3419 type_param_name_list = type_param_name_list->next)
3421 if (actual_param && actual_param->spec_type != SPEC_EXPLICIT)
3423 if (actual_param->spec_type == SPEC_ASSUMED)
3424 spec_error = deferred_seen;
3425 else
3426 spec_error = assumed_seen;
3428 if (spec_error)
3430 gfc_error ("The type parameter spec list at %C cannot contain "
3431 "both ASSUMED and DEFERRED parameters");
3432 goto error_return;
3436 if (actual_param && actual_param->name)
3437 name_seen = true;
3438 param = type_param_name_list->sym;
3440 if (!param || !param->name)
3441 continue;
3443 c1 = gfc_find_component (pdt, param->name, false, true, NULL);
3444 /* An error should already have been thrown in resolve.c
3445 (resolve_fl_derived0). */
3446 if (!pdt->attr.use_assoc && !c1)
3447 goto error_return;
3449 kind_expr = NULL;
3450 if (!name_seen)
3452 if (!actual_param && !(c1 && c1->initializer))
3454 gfc_error ("The type parameter spec list at %C does not contain "
3455 "enough parameter expressions");
3456 goto error_return;
3458 else if (!actual_param && c1 && c1->initializer)
3459 kind_expr = gfc_copy_expr (c1->initializer);
3460 else if (actual_param && actual_param->spec_type == SPEC_EXPLICIT)
3461 kind_expr = gfc_copy_expr (actual_param->expr);
3463 else
3465 actual_param = param_list;
3466 for (;actual_param; actual_param = actual_param->next)
3467 if (actual_param->name
3468 && strcmp (actual_param->name, param->name) == 0)
3469 break;
3470 if (actual_param && actual_param->spec_type == SPEC_EXPLICIT)
3471 kind_expr = gfc_copy_expr (actual_param->expr);
3472 else
3474 if (c1->initializer)
3475 kind_expr = gfc_copy_expr (c1->initializer);
3476 else if (!(actual_param && param->attr.pdt_len))
3478 gfc_error ("The derived parameter %qs at %C does not "
3479 "have a default value", param->name);
3480 goto error_return;
3485 /* Store the current parameter expressions in a temporary actual
3486 arglist 'list' so that they can be substituted in the corresponding
3487 expressions in the PDT instance. */
3488 if (type_param_spec_list == NULL)
3490 type_param_spec_list = gfc_get_actual_arglist ();
3491 tail = type_param_spec_list;
3493 else
3495 tail->next = gfc_get_actual_arglist ();
3496 tail = tail->next;
3498 tail->name = param->name;
3500 if (kind_expr)
3502 /* Try simplification even for LEN expressions. */
3503 gfc_resolve_expr (kind_expr);
3504 gfc_simplify_expr (kind_expr, 1);
3505 /* Variable expressions seem to default to BT_PROCEDURE.
3506 TODO find out why this is and fix it. */
3507 if (kind_expr->ts.type != BT_INTEGER
3508 && kind_expr->ts.type != BT_PROCEDURE)
3510 gfc_error ("The parameter expression at %C must be of "
3511 "INTEGER type and not %s type",
3512 gfc_basic_typename (kind_expr->ts.type));
3513 goto error_return;
3516 tail->expr = gfc_copy_expr (kind_expr);
3519 if (actual_param)
3520 tail->spec_type = actual_param->spec_type;
3522 if (!param->attr.pdt_kind)
3524 if (!name_seen && actual_param)
3525 actual_param = actual_param->next;
3526 if (kind_expr)
3528 gfc_free_expr (kind_expr);
3529 kind_expr = NULL;
3531 continue;
3534 if (actual_param
3535 && (actual_param->spec_type == SPEC_ASSUMED
3536 || actual_param->spec_type == SPEC_DEFERRED))
3538 gfc_error ("The KIND parameter %qs at %C cannot either be "
3539 "ASSUMED or DEFERRED", param->name);
3540 goto error_return;
3543 if (!kind_expr || !gfc_is_constant_expr (kind_expr))
3545 gfc_error ("The value for the KIND parameter %qs at %C does not "
3546 "reduce to a constant expression", param->name);
3547 goto error_return;
3550 gfc_extract_int (kind_expr, &kind_value);
3551 sprintf (name + strlen (name), "_%d", kind_value);
3553 if (!name_seen && actual_param)
3554 actual_param = actual_param->next;
3555 gfc_free_expr (kind_expr);
3558 if (!name_seen && actual_param)
3560 gfc_error ("The type parameter spec list at %C contains too many "
3561 "parameter expressions");
3562 goto error_return;
3565 /* Now we search for the PDT instance 'name'. If it doesn't exist, we
3566 build it, using 'pdt' as a template. */
3567 if (gfc_get_symbol (name, pdt->ns, &instance))
3569 gfc_error ("Parameterized derived type at %C is ambiguous");
3570 goto error_return;
3573 m = MATCH_YES;
3575 if (instance->attr.flavor == FL_DERIVED
3576 && instance->attr.pdt_type)
3578 instance->refs++;
3579 if (ext_param_list)
3580 *ext_param_list = type_param_spec_list;
3581 *sym = instance;
3582 gfc_commit_symbols ();
3583 return m;
3586 /* Start building the new instance of the parameterized type. */
3587 gfc_copy_attr (&instance->attr, &pdt->attr, &pdt->declared_at);
3588 instance->attr.pdt_template = 0;
3589 instance->attr.pdt_type = 1;
3590 instance->declared_at = gfc_current_locus;
3592 /* Add the components, replacing the parameters in all expressions
3593 with the expressions for their values in 'type_param_spec_list'. */
3594 c1 = pdt->components;
3595 tail = type_param_spec_list;
3596 for (; c1; c1 = c1->next)
3598 gfc_add_component (instance, c1->name, &c2);
3600 c2->ts = c1->ts;
3601 c2->attr = c1->attr;
3603 /* The order of declaration of the type_specs might not be the
3604 same as that of the components. */
3605 if (c1->attr.pdt_kind || c1->attr.pdt_len)
3607 for (tail = type_param_spec_list; tail; tail = tail->next)
3608 if (strcmp (c1->name, tail->name) == 0)
3609 break;
3612 /* Deal with type extension by recursively calling this function
3613 to obtain the instance of the extended type. */
3614 if (gfc_current_state () != COMP_DERIVED
3615 && c1 == pdt->components
3616 && (c1->ts.type == BT_DERIVED || c1->ts.type == BT_CLASS)
3617 && c1->ts.u.derived && c1->ts.u.derived->attr.pdt_template
3618 && gfc_get_derived_super_type (*sym) == c2->ts.u.derived)
3620 gfc_formal_arglist *f;
3622 old_param_spec_list = type_param_spec_list;
3624 /* Obtain a spec list appropriate to the extended type..*/
3625 actual_param = gfc_copy_actual_arglist (type_param_spec_list);
3626 type_param_spec_list = actual_param;
3627 for (f = c1->ts.u.derived->formal; f && f->next; f = f->next)
3628 actual_param = actual_param->next;
3629 if (actual_param)
3631 gfc_free_actual_arglist (actual_param->next);
3632 actual_param->next = NULL;
3635 /* Now obtain the PDT instance for the extended type. */
3636 c2->param_list = type_param_spec_list;
3637 m = gfc_get_pdt_instance (type_param_spec_list, &c2->ts.u.derived,
3638 NULL);
3639 type_param_spec_list = old_param_spec_list;
3641 c2->ts.u.derived->refs++;
3642 gfc_set_sym_referenced (c2->ts.u.derived);
3644 /* Set extension level. */
3645 if (c2->ts.u.derived->attr.extension == 255)
3647 /* Since the extension field is 8 bit wide, we can only have
3648 up to 255 extension levels. */
3649 gfc_error ("Maximum extension level reached with type %qs at %L",
3650 c2->ts.u.derived->name,
3651 &c2->ts.u.derived->declared_at);
3652 goto error_return;
3654 instance->attr.extension = c2->ts.u.derived->attr.extension + 1;
3656 continue;
3659 /* Set the component kind using the parameterized expression. */
3660 if ((c1->ts.kind == 0 || c1->ts.type == BT_CHARACTER)
3661 && c1->kind_expr != NULL)
3663 gfc_expr *e = gfc_copy_expr (c1->kind_expr);
3664 gfc_insert_kind_parameter_exprs (e);
3665 gfc_simplify_expr (e, 1);
3666 gfc_extract_int (e, &c2->ts.kind);
3667 gfc_free_expr (e);
3668 if (gfc_validate_kind (c2->ts.type, c2->ts.kind, true) < 0)
3670 gfc_error ("Kind %d not supported for type %s at %C",
3671 c2->ts.kind, gfc_basic_typename (c2->ts.type));
3672 goto error_return;
3676 /* Similarly, set the string length if parameterized. */
3677 if (c1->ts.type == BT_CHARACTER
3678 && c1->ts.u.cl->length
3679 && gfc_derived_parameter_expr (c1->ts.u.cl->length))
3681 gfc_expr *e;
3682 e = gfc_copy_expr (c1->ts.u.cl->length);
3683 gfc_insert_kind_parameter_exprs (e);
3684 gfc_simplify_expr (e, 1);
3685 c2->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
3686 c2->ts.u.cl->length = e;
3687 c2->attr.pdt_string = 1;
3690 /* Set up either the KIND/LEN initializer, if constant,
3691 or the parameterized expression. Use the template
3692 initializer if one is not already set in this instance. */
3693 if (c2->attr.pdt_kind || c2->attr.pdt_len)
3695 if (tail && tail->expr && gfc_is_constant_expr (tail->expr))
3696 c2->initializer = gfc_copy_expr (tail->expr);
3697 else if (tail && tail->expr)
3699 c2->param_list = gfc_get_actual_arglist ();
3700 c2->param_list->name = tail->name;
3701 c2->param_list->expr = gfc_copy_expr (tail->expr);
3702 c2->param_list->next = NULL;
3705 if (!c2->initializer && c1->initializer)
3706 c2->initializer = gfc_copy_expr (c1->initializer);
3709 /* Copy the array spec. */
3710 c2->as = gfc_copy_array_spec (c1->as);
3711 if (c1->ts.type == BT_CLASS)
3712 CLASS_DATA (c2)->as = gfc_copy_array_spec (CLASS_DATA (c1)->as);
3714 /* Determine if an array spec is parameterized. If so, substitute
3715 in the parameter expressions for the bounds and set the pdt_array
3716 attribute. Notice that this attribute must be unconditionally set
3717 if this is an array of parameterized character length. */
3718 if (c1->as && c1->as->type == AS_EXPLICIT)
3720 bool pdt_array = false;
3722 /* Are the bounds of the array parameterized? */
3723 for (i = 0; i < c1->as->rank; i++)
3725 if (gfc_derived_parameter_expr (c1->as->lower[i]))
3726 pdt_array = true;
3727 if (gfc_derived_parameter_expr (c1->as->upper[i]))
3728 pdt_array = true;
3731 /* If they are, free the expressions for the bounds and
3732 replace them with the template expressions with substitute
3733 values. */
3734 for (i = 0; pdt_array && i < c1->as->rank; i++)
3736 gfc_expr *e;
3737 e = gfc_copy_expr (c1->as->lower[i]);
3738 gfc_insert_kind_parameter_exprs (e);
3739 gfc_simplify_expr (e, 1);
3740 gfc_free_expr (c2->as->lower[i]);
3741 c2->as->lower[i] = e;
3742 e = gfc_copy_expr (c1->as->upper[i]);
3743 gfc_insert_kind_parameter_exprs (e);
3744 gfc_simplify_expr (e, 1);
3745 gfc_free_expr (c2->as->upper[i]);
3746 c2->as->upper[i] = e;
3748 c2->attr.pdt_array = pdt_array ? 1 : c2->attr.pdt_string;
3749 if (c1->initializer)
3751 c2->initializer = gfc_copy_expr (c1->initializer);
3752 gfc_insert_kind_parameter_exprs (c2->initializer);
3753 gfc_simplify_expr (c2->initializer, 1);
3757 /* Recurse into this function for PDT components. */
3758 if ((c1->ts.type == BT_DERIVED || c1->ts.type == BT_CLASS)
3759 && c1->ts.u.derived && c1->ts.u.derived->attr.pdt_template)
3761 gfc_actual_arglist *params;
3762 /* The component in the template has a list of specification
3763 expressions derived from its declaration. */
3764 params = gfc_copy_actual_arglist (c1->param_list);
3765 actual_param = params;
3766 /* Substitute the template parameters with the expressions
3767 from the specification list. */
3768 for (;actual_param; actual_param = actual_param->next)
3769 gfc_insert_parameter_exprs (actual_param->expr,
3770 type_param_spec_list);
3772 /* Now obtain the PDT instance for the component. */
3773 old_param_spec_list = type_param_spec_list;
3774 m = gfc_get_pdt_instance (params, &c2->ts.u.derived, NULL);
3775 type_param_spec_list = old_param_spec_list;
3777 c2->param_list = params;
3778 if (!(c2->attr.pointer || c2->attr.allocatable))
3779 c2->initializer = gfc_default_initializer (&c2->ts);
3781 if (c2->attr.allocatable)
3782 instance->attr.alloc_comp = 1;
3786 gfc_commit_symbol (instance);
3787 if (ext_param_list)
3788 *ext_param_list = type_param_spec_list;
3789 *sym = instance;
3790 return m;
3792 error_return:
3793 gfc_free_actual_arglist (type_param_spec_list);
3794 return MATCH_ERROR;
3798 /* Matches a declaration-type-spec (F03:R502). If successful, sets the ts
3799 structure to the matched specification. This is necessary for FUNCTION and
3800 IMPLICIT statements.
3802 If implicit_flag is nonzero, then we don't check for the optional
3803 kind specification. Not doing so is needed for matching an IMPLICIT
3804 statement correctly. */
3806 match
3807 gfc_match_decl_type_spec (gfc_typespec *ts, int implicit_flag)
3809 char name[GFC_MAX_SYMBOL_LEN + 1];
3810 gfc_symbol *sym, *dt_sym;
3811 match m;
3812 char c;
3813 bool seen_deferred_kind, matched_type;
3814 const char *dt_name;
3816 decl_type_param_list = NULL;
3818 /* A belt and braces check that the typespec is correctly being treated
3819 as a deferred characteristic association. */
3820 seen_deferred_kind = (gfc_current_state () == COMP_FUNCTION)
3821 && (gfc_current_block ()->result->ts.kind == -1)
3822 && (ts->kind == -1);
3823 gfc_clear_ts (ts);
3824 if (seen_deferred_kind)
3825 ts->kind = -1;
3827 /* Clear the current binding label, in case one is given. */
3828 curr_binding_label = NULL;
3830 if (gfc_match (" byte") == MATCH_YES)
3832 if (!gfc_notify_std (GFC_STD_GNU, "BYTE type at %C"))
3833 return MATCH_ERROR;
3835 if (gfc_validate_kind (BT_INTEGER, 1, true) < 0)
3837 gfc_error ("BYTE type used at %C "
3838 "is not available on the target machine");
3839 return MATCH_ERROR;
3842 ts->type = BT_INTEGER;
3843 ts->kind = 1;
3844 return MATCH_YES;
3848 m = gfc_match (" type (");
3849 matched_type = (m == MATCH_YES);
3850 if (matched_type)
3852 gfc_gobble_whitespace ();
3853 if (gfc_peek_ascii_char () == '*')
3855 if ((m = gfc_match ("*)")) != MATCH_YES)
3856 return m;
3857 if (gfc_comp_struct (gfc_current_state ()))
3859 gfc_error ("Assumed type at %C is not allowed for components");
3860 return MATCH_ERROR;
3862 if (!gfc_notify_std (GFC_STD_F2018, "Assumed type at %C"))
3863 return MATCH_ERROR;
3864 ts->type = BT_ASSUMED;
3865 return MATCH_YES;
3868 m = gfc_match ("%n", name);
3869 matched_type = (m == MATCH_YES);
3872 if ((matched_type && strcmp ("integer", name) == 0)
3873 || (!matched_type && gfc_match (" integer") == MATCH_YES))
3875 ts->type = BT_INTEGER;
3876 ts->kind = gfc_default_integer_kind;
3877 goto get_kind;
3880 if ((matched_type && strcmp ("character", name) == 0)
3881 || (!matched_type && gfc_match (" character") == MATCH_YES))
3883 if (matched_type
3884 && !gfc_notify_std (GFC_STD_F2008, "TYPE with "
3885 "intrinsic-type-spec at %C"))
3886 return MATCH_ERROR;
3888 ts->type = BT_CHARACTER;
3889 if (implicit_flag == 0)
3890 m = gfc_match_char_spec (ts);
3891 else
3892 m = MATCH_YES;
3894 if (matched_type && m == MATCH_YES && gfc_match_char (')') != MATCH_YES)
3895 m = MATCH_ERROR;
3897 return m;
3900 if ((matched_type && strcmp ("real", name) == 0)
3901 || (!matched_type && gfc_match (" real") == MATCH_YES))
3903 ts->type = BT_REAL;
3904 ts->kind = gfc_default_real_kind;
3905 goto get_kind;
3908 if ((matched_type
3909 && (strcmp ("doubleprecision", name) == 0
3910 || (strcmp ("double", name) == 0
3911 && gfc_match (" precision") == MATCH_YES)))
3912 || (!matched_type && gfc_match (" double precision") == MATCH_YES))
3914 if (matched_type
3915 && !gfc_notify_std (GFC_STD_F2008, "TYPE with "
3916 "intrinsic-type-spec at %C"))
3917 return MATCH_ERROR;
3918 if (matched_type && gfc_match_char (')') != MATCH_YES)
3919 return MATCH_ERROR;
3921 ts->type = BT_REAL;
3922 ts->kind = gfc_default_double_kind;
3923 return MATCH_YES;
3926 if ((matched_type && strcmp ("complex", name) == 0)
3927 || (!matched_type && gfc_match (" complex") == MATCH_YES))
3929 ts->type = BT_COMPLEX;
3930 ts->kind = gfc_default_complex_kind;
3931 goto get_kind;
3934 if ((matched_type
3935 && (strcmp ("doublecomplex", name) == 0
3936 || (strcmp ("double", name) == 0
3937 && gfc_match (" complex") == MATCH_YES)))
3938 || (!matched_type && gfc_match (" double complex") == MATCH_YES))
3940 if (!gfc_notify_std (GFC_STD_GNU, "DOUBLE COMPLEX at %C"))
3941 return MATCH_ERROR;
3943 if (matched_type
3944 && !gfc_notify_std (GFC_STD_F2008, "TYPE with "
3945 "intrinsic-type-spec at %C"))
3946 return MATCH_ERROR;
3948 if (matched_type && gfc_match_char (')') != MATCH_YES)
3949 return MATCH_ERROR;
3951 ts->type = BT_COMPLEX;
3952 ts->kind = gfc_default_double_kind;
3953 return MATCH_YES;
3956 if ((matched_type && strcmp ("logical", name) == 0)
3957 || (!matched_type && gfc_match (" logical") == MATCH_YES))
3959 ts->type = BT_LOGICAL;
3960 ts->kind = gfc_default_logical_kind;
3961 goto get_kind;
3964 if (matched_type)
3966 m = gfc_match_actual_arglist (1, &decl_type_param_list, true);
3967 if (m == MATCH_ERROR)
3968 return m;
3970 m = gfc_match_char (')');
3973 if (m != MATCH_YES)
3974 m = match_record_decl (name);
3976 if (matched_type || m == MATCH_YES)
3978 ts->type = BT_DERIVED;
3979 /* We accept record/s/ or type(s) where s is a structure, but we
3980 * don't need all the extra derived-type stuff for structures. */
3981 if (gfc_find_symbol (gfc_dt_upper_string (name), NULL, 1, &sym))
3983 gfc_error ("Type name %qs at %C is ambiguous", name);
3984 return MATCH_ERROR;
3987 if (sym && sym->attr.flavor == FL_DERIVED
3988 && sym->attr.pdt_template
3989 && gfc_current_state () != COMP_DERIVED)
3991 m = gfc_get_pdt_instance (decl_type_param_list, &sym, NULL);
3992 if (m != MATCH_YES)
3993 return m;
3994 gcc_assert (!sym->attr.pdt_template && sym->attr.pdt_type);
3995 ts->u.derived = sym;
3996 strcpy (name, gfc_dt_lower_string (sym->name));
3999 if (sym && sym->attr.flavor == FL_STRUCT)
4001 ts->u.derived = sym;
4002 return MATCH_YES;
4004 /* Actually a derived type. */
4007 else
4009 /* Match nested STRUCTURE declarations; only valid within another
4010 structure declaration. */
4011 if (flag_dec_structure
4012 && (gfc_current_state () == COMP_STRUCTURE
4013 || gfc_current_state () == COMP_MAP))
4015 m = gfc_match (" structure");
4016 if (m == MATCH_YES)
4018 m = gfc_match_structure_decl ();
4019 if (m == MATCH_YES)
4021 /* gfc_new_block is updated by match_structure_decl. */
4022 ts->type = BT_DERIVED;
4023 ts->u.derived = gfc_new_block;
4024 return MATCH_YES;
4027 if (m == MATCH_ERROR)
4028 return MATCH_ERROR;
4031 /* Match CLASS declarations. */
4032 m = gfc_match (" class ( * )");
4033 if (m == MATCH_ERROR)
4034 return MATCH_ERROR;
4035 else if (m == MATCH_YES)
4037 gfc_symbol *upe;
4038 gfc_symtree *st;
4039 ts->type = BT_CLASS;
4040 gfc_find_symbol ("STAR", gfc_current_ns, 1, &upe);
4041 if (upe == NULL)
4043 upe = gfc_new_symbol ("STAR", gfc_current_ns);
4044 st = gfc_new_symtree (&gfc_current_ns->sym_root, "STAR");
4045 st->n.sym = upe;
4046 gfc_set_sym_referenced (upe);
4047 upe->refs++;
4048 upe->ts.type = BT_VOID;
4049 upe->attr.unlimited_polymorphic = 1;
4050 /* This is essential to force the construction of
4051 unlimited polymorphic component class containers. */
4052 upe->attr.zero_comp = 1;
4053 if (!gfc_add_flavor (&upe->attr, FL_DERIVED, NULL,
4054 &gfc_current_locus))
4055 return MATCH_ERROR;
4057 else
4059 st = gfc_get_tbp_symtree (&gfc_current_ns->sym_root, "STAR");
4060 st->n.sym = upe;
4061 upe->refs++;
4063 ts->u.derived = upe;
4064 return m;
4067 m = gfc_match (" class (");
4069 if (m == MATCH_YES)
4070 m = gfc_match ("%n", name);
4071 else
4072 return m;
4074 if (m != MATCH_YES)
4075 return m;
4076 ts->type = BT_CLASS;
4078 if (!gfc_notify_std (GFC_STD_F2003, "CLASS statement at %C"))
4079 return MATCH_ERROR;
4081 m = gfc_match_actual_arglist (1, &decl_type_param_list, true);
4082 if (m == MATCH_ERROR)
4083 return m;
4085 m = gfc_match_char (')');
4086 if (m != MATCH_YES)
4087 return m;
4090 /* Defer association of the derived type until the end of the
4091 specification block. However, if the derived type can be
4092 found, add it to the typespec. */
4093 if (gfc_matching_function)
4095 ts->u.derived = NULL;
4096 if (gfc_current_state () != COMP_INTERFACE
4097 && !gfc_find_symbol (name, NULL, 1, &sym) && sym)
4099 sym = gfc_find_dt_in_generic (sym);
4100 ts->u.derived = sym;
4102 return MATCH_YES;
4105 /* Search for the name but allow the components to be defined later. If
4106 type = -1, this typespec has been seen in a function declaration but
4107 the type could not be accessed at that point. The actual derived type is
4108 stored in a symtree with the first letter of the name capitalized; the
4109 symtree with the all lower-case name contains the associated
4110 generic function. */
4111 dt_name = gfc_dt_upper_string (name);
4112 sym = NULL;
4113 dt_sym = NULL;
4114 if (ts->kind != -1)
4116 gfc_get_ha_symbol (name, &sym);
4117 if (sym->generic && gfc_find_symbol (dt_name, NULL, 0, &dt_sym))
4119 gfc_error ("Type name %qs at %C is ambiguous", name);
4120 return MATCH_ERROR;
4122 if (sym->generic && !dt_sym)
4123 dt_sym = gfc_find_dt_in_generic (sym);
4125 /* Host associated PDTs can get confused with their constructors
4126 because they ar instantiated in the template's namespace. */
4127 if (!dt_sym)
4129 if (gfc_find_symbol (dt_name, NULL, 1, &dt_sym))
4131 gfc_error ("Type name %qs at %C is ambiguous", name);
4132 return MATCH_ERROR;
4134 if (dt_sym && !dt_sym->attr.pdt_type)
4135 dt_sym = NULL;
4138 else if (ts->kind == -1)
4140 int iface = gfc_state_stack->previous->state != COMP_INTERFACE
4141 || gfc_current_ns->has_import_set;
4142 gfc_find_symbol (name, NULL, iface, &sym);
4143 if (sym && sym->generic && gfc_find_symbol (dt_name, NULL, 1, &dt_sym))
4145 gfc_error ("Type name %qs at %C is ambiguous", name);
4146 return MATCH_ERROR;
4148 if (sym && sym->generic && !dt_sym)
4149 dt_sym = gfc_find_dt_in_generic (sym);
4151 ts->kind = 0;
4152 if (sym == NULL)
4153 return MATCH_NO;
4156 if ((sym->attr.flavor != FL_UNKNOWN && sym->attr.flavor != FL_STRUCT
4157 && !(sym->attr.flavor == FL_PROCEDURE && sym->attr.generic))
4158 || sym->attr.subroutine)
4160 gfc_error ("Type name %qs at %C conflicts with previously declared "
4161 "entity at %L, which has the same name", name,
4162 &sym->declared_at);
4163 return MATCH_ERROR;
4166 if (sym && sym->attr.flavor == FL_DERIVED
4167 && sym->attr.pdt_template
4168 && gfc_current_state () != COMP_DERIVED)
4170 m = gfc_get_pdt_instance (decl_type_param_list, &sym, NULL);
4171 if (m != MATCH_YES)
4172 return m;
4173 gcc_assert (!sym->attr.pdt_template && sym->attr.pdt_type);
4174 ts->u.derived = sym;
4175 strcpy (name, gfc_dt_lower_string (sym->name));
4178 gfc_save_symbol_data (sym);
4179 gfc_set_sym_referenced (sym);
4180 if (!sym->attr.generic
4181 && !gfc_add_generic (&sym->attr, sym->name, NULL))
4182 return MATCH_ERROR;
4184 if (!sym->attr.function
4185 && !gfc_add_function (&sym->attr, sym->name, NULL))
4186 return MATCH_ERROR;
4188 if (dt_sym && dt_sym->attr.flavor == FL_DERIVED
4189 && dt_sym->attr.pdt_template
4190 && gfc_current_state () != COMP_DERIVED)
4192 m = gfc_get_pdt_instance (decl_type_param_list, &dt_sym, NULL);
4193 if (m != MATCH_YES)
4194 return m;
4195 gcc_assert (!dt_sym->attr.pdt_template && dt_sym->attr.pdt_type);
4198 if (!dt_sym)
4200 gfc_interface *intr, *head;
4202 /* Use upper case to save the actual derived-type symbol. */
4203 gfc_get_symbol (dt_name, NULL, &dt_sym);
4204 dt_sym->name = gfc_get_string ("%s", sym->name);
4205 head = sym->generic;
4206 intr = gfc_get_interface ();
4207 intr->sym = dt_sym;
4208 intr->where = gfc_current_locus;
4209 intr->next = head;
4210 sym->generic = intr;
4211 sym->attr.if_source = IFSRC_DECL;
4213 else
4214 gfc_save_symbol_data (dt_sym);
4216 gfc_set_sym_referenced (dt_sym);
4218 if (dt_sym->attr.flavor != FL_DERIVED && dt_sym->attr.flavor != FL_STRUCT
4219 && !gfc_add_flavor (&dt_sym->attr, FL_DERIVED, sym->name, NULL))
4220 return MATCH_ERROR;
4222 ts->u.derived = dt_sym;
4224 return MATCH_YES;
4226 get_kind:
4227 if (matched_type
4228 && !gfc_notify_std (GFC_STD_F2008, "TYPE with "
4229 "intrinsic-type-spec at %C"))
4230 return MATCH_ERROR;
4232 /* For all types except double, derived and character, look for an
4233 optional kind specifier. MATCH_NO is actually OK at this point. */
4234 if (implicit_flag == 1)
4236 if (matched_type && gfc_match_char (')') != MATCH_YES)
4237 return MATCH_ERROR;
4239 return MATCH_YES;
4242 if (gfc_current_form == FORM_FREE)
4244 c = gfc_peek_ascii_char ();
4245 if (!gfc_is_whitespace (c) && c != '*' && c != '('
4246 && c != ':' && c != ',')
4248 if (matched_type && c == ')')
4250 gfc_next_ascii_char ();
4251 return MATCH_YES;
4253 return MATCH_NO;
4257 m = gfc_match_kind_spec (ts, false);
4258 if (m == MATCH_NO && ts->type != BT_CHARACTER)
4260 m = gfc_match_old_kind_spec (ts);
4261 if (gfc_validate_kind (ts->type, ts->kind, true) == -1)
4262 return MATCH_ERROR;
4265 if (matched_type && gfc_match_char (')') != MATCH_YES)
4266 return MATCH_ERROR;
4268 /* Defer association of the KIND expression of function results
4269 until after USE and IMPORT statements. */
4270 if ((gfc_current_state () == COMP_NONE && gfc_error_flag_test ())
4271 || gfc_matching_function)
4272 return MATCH_YES;
4274 if (m == MATCH_NO)
4275 m = MATCH_YES; /* No kind specifier found. */
4277 return m;
4281 /* Match an IMPLICIT NONE statement. Actually, this statement is
4282 already matched in parse.c, or we would not end up here in the
4283 first place. So the only thing we need to check, is if there is
4284 trailing garbage. If not, the match is successful. */
4286 match
4287 gfc_match_implicit_none (void)
4289 char c;
4290 match m;
4291 char name[GFC_MAX_SYMBOL_LEN + 1];
4292 bool type = false;
4293 bool external = false;
4294 locus cur_loc = gfc_current_locus;
4296 if (gfc_current_ns->seen_implicit_none
4297 || gfc_current_ns->has_implicit_none_export)
4299 gfc_error ("Duplicate IMPLICIT NONE statement at %C");
4300 return MATCH_ERROR;
4303 gfc_gobble_whitespace ();
4304 c = gfc_peek_ascii_char ();
4305 if (c == '(')
4307 (void) gfc_next_ascii_char ();
4308 if (!gfc_notify_std (GFC_STD_F2018, "IMPORT NONE with spec list at %C"))
4309 return MATCH_ERROR;
4311 gfc_gobble_whitespace ();
4312 if (gfc_peek_ascii_char () == ')')
4314 (void) gfc_next_ascii_char ();
4315 type = true;
4317 else
4318 for(;;)
4320 m = gfc_match (" %n", name);
4321 if (m != MATCH_YES)
4322 return MATCH_ERROR;
4324 if (strcmp (name, "type") == 0)
4325 type = true;
4326 else if (strcmp (name, "external") == 0)
4327 external = true;
4328 else
4329 return MATCH_ERROR;
4331 gfc_gobble_whitespace ();
4332 c = gfc_next_ascii_char ();
4333 if (c == ',')
4334 continue;
4335 if (c == ')')
4336 break;
4337 return MATCH_ERROR;
4340 else
4341 type = true;
4343 if (gfc_match_eos () != MATCH_YES)
4344 return MATCH_ERROR;
4346 gfc_set_implicit_none (type, external, &cur_loc);
4348 return MATCH_YES;
4352 /* Match the letter range(s) of an IMPLICIT statement. */
4354 static match
4355 match_implicit_range (void)
4357 char c, c1, c2;
4358 int inner;
4359 locus cur_loc;
4361 cur_loc = gfc_current_locus;
4363 gfc_gobble_whitespace ();
4364 c = gfc_next_ascii_char ();
4365 if (c != '(')
4367 gfc_error ("Missing character range in IMPLICIT at %C");
4368 goto bad;
4371 inner = 1;
4372 while (inner)
4374 gfc_gobble_whitespace ();
4375 c1 = gfc_next_ascii_char ();
4376 if (!ISALPHA (c1))
4377 goto bad;
4379 gfc_gobble_whitespace ();
4380 c = gfc_next_ascii_char ();
4382 switch (c)
4384 case ')':
4385 inner = 0; /* Fall through. */
4387 case ',':
4388 c2 = c1;
4389 break;
4391 case '-':
4392 gfc_gobble_whitespace ();
4393 c2 = gfc_next_ascii_char ();
4394 if (!ISALPHA (c2))
4395 goto bad;
4397 gfc_gobble_whitespace ();
4398 c = gfc_next_ascii_char ();
4400 if ((c != ',') && (c != ')'))
4401 goto bad;
4402 if (c == ')')
4403 inner = 0;
4405 break;
4407 default:
4408 goto bad;
4411 if (c1 > c2)
4413 gfc_error ("Letters must be in alphabetic order in "
4414 "IMPLICIT statement at %C");
4415 goto bad;
4418 /* See if we can add the newly matched range to the pending
4419 implicits from this IMPLICIT statement. We do not check for
4420 conflicts with whatever earlier IMPLICIT statements may have
4421 set. This is done when we've successfully finished matching
4422 the current one. */
4423 if (!gfc_add_new_implicit_range (c1, c2))
4424 goto bad;
4427 return MATCH_YES;
4429 bad:
4430 gfc_syntax_error (ST_IMPLICIT);
4432 gfc_current_locus = cur_loc;
4433 return MATCH_ERROR;
4437 /* Match an IMPLICIT statement, storing the types for
4438 gfc_set_implicit() if the statement is accepted by the parser.
4439 There is a strange looking, but legal syntactic construction
4440 possible. It looks like:
4442 IMPLICIT INTEGER (a-b) (c-d)
4444 This is legal if "a-b" is a constant expression that happens to
4445 equal one of the legal kinds for integers. The real problem
4446 happens with an implicit specification that looks like:
4448 IMPLICIT INTEGER (a-b)
4450 In this case, a typespec matcher that is "greedy" (as most of the
4451 matchers are) gobbles the character range as a kindspec, leaving
4452 nothing left. We therefore have to go a bit more slowly in the
4453 matching process by inhibiting the kindspec checking during
4454 typespec matching and checking for a kind later. */
4456 match
4457 gfc_match_implicit (void)
4459 gfc_typespec ts;
4460 locus cur_loc;
4461 char c;
4462 match m;
4464 if (gfc_current_ns->seen_implicit_none)
4466 gfc_error ("IMPLICIT statement at %C following an IMPLICIT NONE (type) "
4467 "statement");
4468 return MATCH_ERROR;
4471 gfc_clear_ts (&ts);
4473 /* We don't allow empty implicit statements. */
4474 if (gfc_match_eos () == MATCH_YES)
4476 gfc_error ("Empty IMPLICIT statement at %C");
4477 return MATCH_ERROR;
4482 /* First cleanup. */
4483 gfc_clear_new_implicit ();
4485 /* A basic type is mandatory here. */
4486 m = gfc_match_decl_type_spec (&ts, 1);
4487 if (m == MATCH_ERROR)
4488 goto error;
4489 if (m == MATCH_NO)
4490 goto syntax;
4492 cur_loc = gfc_current_locus;
4493 m = match_implicit_range ();
4495 if (m == MATCH_YES)
4497 /* We may have <TYPE> (<RANGE>). */
4498 gfc_gobble_whitespace ();
4499 c = gfc_peek_ascii_char ();
4500 if (c == ',' || c == '\n' || c == ';' || c == '!')
4502 /* Check for CHARACTER with no length parameter. */
4503 if (ts.type == BT_CHARACTER && !ts.u.cl)
4505 ts.kind = gfc_default_character_kind;
4506 ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
4507 ts.u.cl->length = gfc_get_int_expr (gfc_charlen_int_kind,
4508 NULL, 1);
4511 /* Record the Successful match. */
4512 if (!gfc_merge_new_implicit (&ts))
4513 return MATCH_ERROR;
4514 if (c == ',')
4515 c = gfc_next_ascii_char ();
4516 else if (gfc_match_eos () == MATCH_ERROR)
4517 goto error;
4518 continue;
4521 gfc_current_locus = cur_loc;
4524 /* Discard the (incorrectly) matched range. */
4525 gfc_clear_new_implicit ();
4527 /* Last chance -- check <TYPE> <SELECTOR> (<RANGE>). */
4528 if (ts.type == BT_CHARACTER)
4529 m = gfc_match_char_spec (&ts);
4530 else
4532 m = gfc_match_kind_spec (&ts, false);
4533 if (m == MATCH_NO)
4535 m = gfc_match_old_kind_spec (&ts);
4536 if (m == MATCH_ERROR)
4537 goto error;
4538 if (m == MATCH_NO)
4539 goto syntax;
4542 if (m == MATCH_ERROR)
4543 goto error;
4545 m = match_implicit_range ();
4546 if (m == MATCH_ERROR)
4547 goto error;
4548 if (m == MATCH_NO)
4549 goto syntax;
4551 gfc_gobble_whitespace ();
4552 c = gfc_next_ascii_char ();
4553 if (c != ',' && gfc_match_eos () != MATCH_YES)
4554 goto syntax;
4556 if (!gfc_merge_new_implicit (&ts))
4557 return MATCH_ERROR;
4559 while (c == ',');
4561 return MATCH_YES;
4563 syntax:
4564 gfc_syntax_error (ST_IMPLICIT);
4566 error:
4567 return MATCH_ERROR;
4571 match
4572 gfc_match_import (void)
4574 char name[GFC_MAX_SYMBOL_LEN + 1];
4575 match m;
4576 gfc_symbol *sym;
4577 gfc_symtree *st;
4579 if (gfc_current_ns->proc_name == NULL
4580 || gfc_current_ns->proc_name->attr.if_source != IFSRC_IFBODY)
4582 gfc_error ("IMPORT statement at %C only permitted in "
4583 "an INTERFACE body");
4584 return MATCH_ERROR;
4587 if (gfc_current_ns->proc_name->attr.module_procedure)
4589 gfc_error ("F2008: C1210 IMPORT statement at %C is not permitted "
4590 "in a module procedure interface body");
4591 return MATCH_ERROR;
4594 if (!gfc_notify_std (GFC_STD_F2003, "IMPORT statement at %C"))
4595 return MATCH_ERROR;
4597 if (gfc_match_eos () == MATCH_YES)
4599 /* All host variables should be imported. */
4600 gfc_current_ns->has_import_set = 1;
4601 return MATCH_YES;
4604 if (gfc_match (" ::") == MATCH_YES)
4606 if (gfc_match_eos () == MATCH_YES)
4608 gfc_error ("Expecting list of named entities at %C");
4609 return MATCH_ERROR;
4613 for(;;)
4615 sym = NULL;
4616 m = gfc_match (" %n", name);
4617 switch (m)
4619 case MATCH_YES:
4620 if (gfc_current_ns->parent != NULL
4621 && gfc_find_symbol (name, gfc_current_ns->parent, 1, &sym))
4623 gfc_error ("Type name %qs at %C is ambiguous", name);
4624 return MATCH_ERROR;
4626 else if (!sym && gfc_current_ns->proc_name->ns->parent != NULL
4627 && gfc_find_symbol (name,
4628 gfc_current_ns->proc_name->ns->parent,
4629 1, &sym))
4631 gfc_error ("Type name %qs at %C is ambiguous", name);
4632 return MATCH_ERROR;
4635 if (sym == NULL)
4637 gfc_error ("Cannot IMPORT %qs from host scoping unit "
4638 "at %C - does not exist.", name);
4639 return MATCH_ERROR;
4642 if (gfc_find_symtree (gfc_current_ns->sym_root, name))
4644 gfc_warning (0, "%qs is already IMPORTed from host scoping unit "
4645 "at %C", name);
4646 goto next_item;
4649 st = gfc_new_symtree (&gfc_current_ns->sym_root, name);
4650 st->n.sym = sym;
4651 sym->refs++;
4652 sym->attr.imported = 1;
4654 if (sym->attr.generic && (sym = gfc_find_dt_in_generic (sym)))
4656 /* The actual derived type is stored in a symtree with the first
4657 letter of the name capitalized; the symtree with the all
4658 lower-case name contains the associated generic function. */
4659 st = gfc_new_symtree (&gfc_current_ns->sym_root,
4660 gfc_dt_upper_string (name));
4661 st->n.sym = sym;
4662 sym->refs++;
4663 sym->attr.imported = 1;
4666 goto next_item;
4668 case MATCH_NO:
4669 break;
4671 case MATCH_ERROR:
4672 return MATCH_ERROR;
4675 next_item:
4676 if (gfc_match_eos () == MATCH_YES)
4677 break;
4678 if (gfc_match_char (',') != MATCH_YES)
4679 goto syntax;
4682 return MATCH_YES;
4684 syntax:
4685 gfc_error ("Syntax error in IMPORT statement at %C");
4686 return MATCH_ERROR;
4690 /* A minimal implementation of gfc_match without whitespace, escape
4691 characters or variable arguments. Returns true if the next
4692 characters match the TARGET template exactly. */
4694 static bool
4695 match_string_p (const char *target)
4697 const char *p;
4699 for (p = target; *p; p++)
4700 if ((char) gfc_next_ascii_char () != *p)
4701 return false;
4702 return true;
4705 /* Matches an attribute specification including array specs. If
4706 successful, leaves the variables current_attr and current_as
4707 holding the specification. Also sets the colon_seen variable for
4708 later use by matchers associated with initializations.
4710 This subroutine is a little tricky in the sense that we don't know
4711 if we really have an attr-spec until we hit the double colon.
4712 Until that time, we can only return MATCH_NO. This forces us to
4713 check for duplicate specification at this level. */
4715 static match
4716 match_attr_spec (void)
4718 /* Modifiers that can exist in a type statement. */
4719 enum
4720 { GFC_DECL_BEGIN = 0,
4721 DECL_ALLOCATABLE = GFC_DECL_BEGIN, DECL_DIMENSION, DECL_EXTERNAL,
4722 DECL_IN, DECL_OUT, DECL_INOUT, DECL_INTRINSIC, DECL_OPTIONAL,
4723 DECL_PARAMETER, DECL_POINTER, DECL_PROTECTED, DECL_PRIVATE,
4724 DECL_STATIC, DECL_AUTOMATIC,
4725 DECL_PUBLIC, DECL_SAVE, DECL_TARGET, DECL_VALUE, DECL_VOLATILE,
4726 DECL_IS_BIND_C, DECL_CODIMENSION, DECL_ASYNCHRONOUS, DECL_CONTIGUOUS,
4727 DECL_LEN, DECL_KIND, DECL_NONE, GFC_DECL_END /* Sentinel */
4730 /* GFC_DECL_END is the sentinel, index starts at 0. */
4731 #define NUM_DECL GFC_DECL_END
4733 locus start, seen_at[NUM_DECL];
4734 int seen[NUM_DECL];
4735 unsigned int d;
4736 const char *attr;
4737 match m;
4738 bool t;
4740 gfc_clear_attr (&current_attr);
4741 start = gfc_current_locus;
4743 current_as = NULL;
4744 colon_seen = 0;
4745 attr_seen = 0;
4747 /* See if we get all of the keywords up to the final double colon. */
4748 for (d = GFC_DECL_BEGIN; d != GFC_DECL_END; d++)
4749 seen[d] = 0;
4751 for (;;)
4753 char ch;
4755 d = DECL_NONE;
4756 gfc_gobble_whitespace ();
4758 ch = gfc_next_ascii_char ();
4759 if (ch == ':')
4761 /* This is the successful exit condition for the loop. */
4762 if (gfc_next_ascii_char () == ':')
4763 break;
4765 else if (ch == ',')
4767 gfc_gobble_whitespace ();
4768 switch (gfc_peek_ascii_char ())
4770 case 'a':
4771 gfc_next_ascii_char ();
4772 switch (gfc_next_ascii_char ())
4774 case 'l':
4775 if (match_string_p ("locatable"))
4777 /* Matched "allocatable". */
4778 d = DECL_ALLOCATABLE;
4780 break;
4782 case 's':
4783 if (match_string_p ("ynchronous"))
4785 /* Matched "asynchronous". */
4786 d = DECL_ASYNCHRONOUS;
4788 break;
4790 case 'u':
4791 if (match_string_p ("tomatic"))
4793 /* Matched "automatic". */
4794 d = DECL_AUTOMATIC;
4796 break;
4798 break;
4800 case 'b':
4801 /* Try and match the bind(c). */
4802 m = gfc_match_bind_c (NULL, true);
4803 if (m == MATCH_YES)
4804 d = DECL_IS_BIND_C;
4805 else if (m == MATCH_ERROR)
4806 goto cleanup;
4807 break;
4809 case 'c':
4810 gfc_next_ascii_char ();
4811 if ('o' != gfc_next_ascii_char ())
4812 break;
4813 switch (gfc_next_ascii_char ())
4815 case 'd':
4816 if (match_string_p ("imension"))
4818 d = DECL_CODIMENSION;
4819 break;
4821 /* FALLTHRU */
4822 case 'n':
4823 if (match_string_p ("tiguous"))
4825 d = DECL_CONTIGUOUS;
4826 break;
4829 break;
4831 case 'd':
4832 if (match_string_p ("dimension"))
4833 d = DECL_DIMENSION;
4834 break;
4836 case 'e':
4837 if (match_string_p ("external"))
4838 d = DECL_EXTERNAL;
4839 break;
4841 case 'i':
4842 if (match_string_p ("int"))
4844 ch = gfc_next_ascii_char ();
4845 if (ch == 'e')
4847 if (match_string_p ("nt"))
4849 /* Matched "intent". */
4850 /* TODO: Call match_intent_spec from here. */
4851 if (gfc_match (" ( in out )") == MATCH_YES)
4852 d = DECL_INOUT;
4853 else if (gfc_match (" ( in )") == MATCH_YES)
4854 d = DECL_IN;
4855 else if (gfc_match (" ( out )") == MATCH_YES)
4856 d = DECL_OUT;
4859 else if (ch == 'r')
4861 if (match_string_p ("insic"))
4863 /* Matched "intrinsic". */
4864 d = DECL_INTRINSIC;
4868 break;
4870 case 'k':
4871 if (match_string_p ("kind"))
4872 d = DECL_KIND;
4873 break;
4875 case 'l':
4876 if (match_string_p ("len"))
4877 d = DECL_LEN;
4878 break;
4880 case 'o':
4881 if (match_string_p ("optional"))
4882 d = DECL_OPTIONAL;
4883 break;
4885 case 'p':
4886 gfc_next_ascii_char ();
4887 switch (gfc_next_ascii_char ())
4889 case 'a':
4890 if (match_string_p ("rameter"))
4892 /* Matched "parameter". */
4893 d = DECL_PARAMETER;
4895 break;
4897 case 'o':
4898 if (match_string_p ("inter"))
4900 /* Matched "pointer". */
4901 d = DECL_POINTER;
4903 break;
4905 case 'r':
4906 ch = gfc_next_ascii_char ();
4907 if (ch == 'i')
4909 if (match_string_p ("vate"))
4911 /* Matched "private". */
4912 d = DECL_PRIVATE;
4915 else if (ch == 'o')
4917 if (match_string_p ("tected"))
4919 /* Matched "protected". */
4920 d = DECL_PROTECTED;
4923 break;
4925 case 'u':
4926 if (match_string_p ("blic"))
4928 /* Matched "public". */
4929 d = DECL_PUBLIC;
4931 break;
4933 break;
4935 case 's':
4936 gfc_next_ascii_char ();
4937 switch (gfc_next_ascii_char ())
4939 case 'a':
4940 if (match_string_p ("ve"))
4942 /* Matched "save". */
4943 d = DECL_SAVE;
4945 break;
4947 case 't':
4948 if (match_string_p ("atic"))
4950 /* Matched "static". */
4951 d = DECL_STATIC;
4953 break;
4955 break;
4957 case 't':
4958 if (match_string_p ("target"))
4959 d = DECL_TARGET;
4960 break;
4962 case 'v':
4963 gfc_next_ascii_char ();
4964 ch = gfc_next_ascii_char ();
4965 if (ch == 'a')
4967 if (match_string_p ("lue"))
4969 /* Matched "value". */
4970 d = DECL_VALUE;
4973 else if (ch == 'o')
4975 if (match_string_p ("latile"))
4977 /* Matched "volatile". */
4978 d = DECL_VOLATILE;
4981 break;
4985 /* No double colon and no recognizable decl_type, so assume that
4986 we've been looking at something else the whole time. */
4987 if (d == DECL_NONE)
4989 m = MATCH_NO;
4990 goto cleanup;
4993 /* Check to make sure any parens are paired up correctly. */
4994 if (gfc_match_parens () == MATCH_ERROR)
4996 m = MATCH_ERROR;
4997 goto cleanup;
5000 seen[d]++;
5001 seen_at[d] = gfc_current_locus;
5003 if (d == DECL_DIMENSION || d == DECL_CODIMENSION)
5005 gfc_array_spec *as = NULL;
5007 m = gfc_match_array_spec (&as, d == DECL_DIMENSION,
5008 d == DECL_CODIMENSION);
5010 if (current_as == NULL)
5011 current_as = as;
5012 else if (m == MATCH_YES)
5014 if (!merge_array_spec (as, current_as, false))
5015 m = MATCH_ERROR;
5016 free (as);
5019 if (m == MATCH_NO)
5021 if (d == DECL_CODIMENSION)
5022 gfc_error ("Missing codimension specification at %C");
5023 else
5024 gfc_error ("Missing dimension specification at %C");
5025 m = MATCH_ERROR;
5028 if (m == MATCH_ERROR)
5029 goto cleanup;
5033 /* Since we've seen a double colon, we have to be looking at an
5034 attr-spec. This means that we can now issue errors. */
5035 for (d = GFC_DECL_BEGIN; d != GFC_DECL_END; d++)
5036 if (seen[d] > 1)
5038 switch (d)
5040 case DECL_ALLOCATABLE:
5041 attr = "ALLOCATABLE";
5042 break;
5043 case DECL_ASYNCHRONOUS:
5044 attr = "ASYNCHRONOUS";
5045 break;
5046 case DECL_CODIMENSION:
5047 attr = "CODIMENSION";
5048 break;
5049 case DECL_CONTIGUOUS:
5050 attr = "CONTIGUOUS";
5051 break;
5052 case DECL_DIMENSION:
5053 attr = "DIMENSION";
5054 break;
5055 case DECL_EXTERNAL:
5056 attr = "EXTERNAL";
5057 break;
5058 case DECL_IN:
5059 attr = "INTENT (IN)";
5060 break;
5061 case DECL_OUT:
5062 attr = "INTENT (OUT)";
5063 break;
5064 case DECL_INOUT:
5065 attr = "INTENT (IN OUT)";
5066 break;
5067 case DECL_INTRINSIC:
5068 attr = "INTRINSIC";
5069 break;
5070 case DECL_OPTIONAL:
5071 attr = "OPTIONAL";
5072 break;
5073 case DECL_KIND:
5074 attr = "KIND";
5075 break;
5076 case DECL_LEN:
5077 attr = "LEN";
5078 break;
5079 case DECL_PARAMETER:
5080 attr = "PARAMETER";
5081 break;
5082 case DECL_POINTER:
5083 attr = "POINTER";
5084 break;
5085 case DECL_PROTECTED:
5086 attr = "PROTECTED";
5087 break;
5088 case DECL_PRIVATE:
5089 attr = "PRIVATE";
5090 break;
5091 case DECL_PUBLIC:
5092 attr = "PUBLIC";
5093 break;
5094 case DECL_SAVE:
5095 attr = "SAVE";
5096 break;
5097 case DECL_STATIC:
5098 attr = "STATIC";
5099 break;
5100 case DECL_AUTOMATIC:
5101 attr = "AUTOMATIC";
5102 break;
5103 case DECL_TARGET:
5104 attr = "TARGET";
5105 break;
5106 case DECL_IS_BIND_C:
5107 attr = "IS_BIND_C";
5108 break;
5109 case DECL_VALUE:
5110 attr = "VALUE";
5111 break;
5112 case DECL_VOLATILE:
5113 attr = "VOLATILE";
5114 break;
5115 default:
5116 attr = NULL; /* This shouldn't happen. */
5119 gfc_error ("Duplicate %s attribute at %L", attr, &seen_at[d]);
5120 m = MATCH_ERROR;
5121 goto cleanup;
5124 /* Now that we've dealt with duplicate attributes, add the attributes
5125 to the current attribute. */
5126 for (d = GFC_DECL_BEGIN; d != GFC_DECL_END; d++)
5128 if (seen[d] == 0)
5129 continue;
5130 else
5131 attr_seen = 1;
5133 if ((d == DECL_STATIC || d == DECL_AUTOMATIC)
5134 && !flag_dec_static)
5136 gfc_error ("%s at %L is a DEC extension, enable with "
5137 "%<-fdec-static%>",
5138 d == DECL_STATIC ? "STATIC" : "AUTOMATIC", &seen_at[d]);
5139 m = MATCH_ERROR;
5140 goto cleanup;
5142 /* Allow SAVE with STATIC, but don't complain. */
5143 if (d == DECL_STATIC && seen[DECL_SAVE])
5144 continue;
5146 if (gfc_current_state () == COMP_DERIVED
5147 && d != DECL_DIMENSION && d != DECL_CODIMENSION
5148 && d != DECL_POINTER && d != DECL_PRIVATE
5149 && d != DECL_PUBLIC && d != DECL_CONTIGUOUS && d != DECL_NONE)
5151 if (d == DECL_ALLOCATABLE)
5153 if (!gfc_notify_std (GFC_STD_F2003, "ALLOCATABLE "
5154 "attribute at %C in a TYPE definition"))
5156 m = MATCH_ERROR;
5157 goto cleanup;
5160 else if (d == DECL_KIND)
5162 if (!gfc_notify_std (GFC_STD_F2003, "KIND "
5163 "attribute at %C in a TYPE definition"))
5165 m = MATCH_ERROR;
5166 goto cleanup;
5168 if (current_ts.type != BT_INTEGER)
5170 gfc_error ("Component with KIND attribute at %C must be "
5171 "INTEGER");
5172 m = MATCH_ERROR;
5173 goto cleanup;
5175 if (current_ts.kind != gfc_default_integer_kind)
5177 gfc_error ("Component with KIND attribute at %C must be "
5178 "default integer kind (%d)",
5179 gfc_default_integer_kind);
5180 m = MATCH_ERROR;
5181 goto cleanup;
5184 else if (d == DECL_LEN)
5186 if (!gfc_notify_std (GFC_STD_F2003, "LEN "
5187 "attribute at %C in a TYPE definition"))
5189 m = MATCH_ERROR;
5190 goto cleanup;
5192 if (current_ts.type != BT_INTEGER)
5194 gfc_error ("Component with LEN attribute at %C must be "
5195 "INTEGER");
5196 m = MATCH_ERROR;
5197 goto cleanup;
5199 if (current_ts.kind != gfc_default_integer_kind)
5201 gfc_error ("Component with LEN attribute at %C must be "
5202 "default integer kind (%d)",
5203 gfc_default_integer_kind);
5204 m = MATCH_ERROR;
5205 goto cleanup;
5208 else
5210 gfc_error ("Attribute at %L is not allowed in a TYPE definition",
5211 &seen_at[d]);
5212 m = MATCH_ERROR;
5213 goto cleanup;
5217 if ((d == DECL_PRIVATE || d == DECL_PUBLIC)
5218 && gfc_current_state () != COMP_MODULE)
5220 if (d == DECL_PRIVATE)
5221 attr = "PRIVATE";
5222 else
5223 attr = "PUBLIC";
5224 if (gfc_current_state () == COMP_DERIVED
5225 && gfc_state_stack->previous
5226 && gfc_state_stack->previous->state == COMP_MODULE)
5228 if (!gfc_notify_std (GFC_STD_F2003, "Attribute %s "
5229 "at %L in a TYPE definition", attr,
5230 &seen_at[d]))
5232 m = MATCH_ERROR;
5233 goto cleanup;
5236 else
5238 gfc_error ("%s attribute at %L is not allowed outside of the "
5239 "specification part of a module", attr, &seen_at[d]);
5240 m = MATCH_ERROR;
5241 goto cleanup;
5245 if (gfc_current_state () != COMP_DERIVED
5246 && (d == DECL_KIND || d == DECL_LEN))
5248 gfc_error ("Attribute at %L is not allowed outside a TYPE "
5249 "definition", &seen_at[d]);
5250 m = MATCH_ERROR;
5251 goto cleanup;
5254 switch (d)
5256 case DECL_ALLOCATABLE:
5257 t = gfc_add_allocatable (&current_attr, &seen_at[d]);
5258 break;
5260 case DECL_ASYNCHRONOUS:
5261 if (!gfc_notify_std (GFC_STD_F2003, "ASYNCHRONOUS attribute at %C"))
5262 t = false;
5263 else
5264 t = gfc_add_asynchronous (&current_attr, NULL, &seen_at[d]);
5265 break;
5267 case DECL_CODIMENSION:
5268 t = gfc_add_codimension (&current_attr, NULL, &seen_at[d]);
5269 break;
5271 case DECL_CONTIGUOUS:
5272 if (!gfc_notify_std (GFC_STD_F2008, "CONTIGUOUS attribute at %C"))
5273 t = false;
5274 else
5275 t = gfc_add_contiguous (&current_attr, NULL, &seen_at[d]);
5276 break;
5278 case DECL_DIMENSION:
5279 t = gfc_add_dimension (&current_attr, NULL, &seen_at[d]);
5280 break;
5282 case DECL_EXTERNAL:
5283 t = gfc_add_external (&current_attr, &seen_at[d]);
5284 break;
5286 case DECL_IN:
5287 t = gfc_add_intent (&current_attr, INTENT_IN, &seen_at[d]);
5288 break;
5290 case DECL_OUT:
5291 t = gfc_add_intent (&current_attr, INTENT_OUT, &seen_at[d]);
5292 break;
5294 case DECL_INOUT:
5295 t = gfc_add_intent (&current_attr, INTENT_INOUT, &seen_at[d]);
5296 break;
5298 case DECL_INTRINSIC:
5299 t = gfc_add_intrinsic (&current_attr, &seen_at[d]);
5300 break;
5302 case DECL_OPTIONAL:
5303 t = gfc_add_optional (&current_attr, &seen_at[d]);
5304 break;
5306 case DECL_KIND:
5307 t = gfc_add_kind (&current_attr, &seen_at[d]);
5308 break;
5310 case DECL_LEN:
5311 t = gfc_add_len (&current_attr, &seen_at[d]);
5312 break;
5314 case DECL_PARAMETER:
5315 t = gfc_add_flavor (&current_attr, FL_PARAMETER, NULL, &seen_at[d]);
5316 break;
5318 case DECL_POINTER:
5319 t = gfc_add_pointer (&current_attr, &seen_at[d]);
5320 break;
5322 case DECL_PROTECTED:
5323 if (gfc_current_state () != COMP_MODULE
5324 || (gfc_current_ns->proc_name
5325 && gfc_current_ns->proc_name->attr.flavor != FL_MODULE))
5327 gfc_error ("PROTECTED at %C only allowed in specification "
5328 "part of a module");
5329 t = false;
5330 break;
5333 if (!gfc_notify_std (GFC_STD_F2003, "PROTECTED attribute at %C"))
5334 t = false;
5335 else
5336 t = gfc_add_protected (&current_attr, NULL, &seen_at[d]);
5337 break;
5339 case DECL_PRIVATE:
5340 t = gfc_add_access (&current_attr, ACCESS_PRIVATE, NULL,
5341 &seen_at[d]);
5342 break;
5344 case DECL_PUBLIC:
5345 t = gfc_add_access (&current_attr, ACCESS_PUBLIC, NULL,
5346 &seen_at[d]);
5347 break;
5349 case DECL_STATIC:
5350 case DECL_SAVE:
5351 t = gfc_add_save (&current_attr, SAVE_EXPLICIT, NULL, &seen_at[d]);
5352 break;
5354 case DECL_AUTOMATIC:
5355 t = gfc_add_automatic (&current_attr, NULL, &seen_at[d]);
5356 break;
5358 case DECL_TARGET:
5359 t = gfc_add_target (&current_attr, &seen_at[d]);
5360 break;
5362 case DECL_IS_BIND_C:
5363 t = gfc_add_is_bind_c(&current_attr, NULL, &seen_at[d], 0);
5364 break;
5366 case DECL_VALUE:
5367 if (!gfc_notify_std (GFC_STD_F2003, "VALUE attribute at %C"))
5368 t = false;
5369 else
5370 t = gfc_add_value (&current_attr, NULL, &seen_at[d]);
5371 break;
5373 case DECL_VOLATILE:
5374 if (!gfc_notify_std (GFC_STD_F2003, "VOLATILE attribute at %C"))
5375 t = false;
5376 else
5377 t = gfc_add_volatile (&current_attr, NULL, &seen_at[d]);
5378 break;
5380 default:
5381 gfc_internal_error ("match_attr_spec(): Bad attribute");
5384 if (!t)
5386 m = MATCH_ERROR;
5387 goto cleanup;
5391 /* Since Fortran 2008 module variables implicitly have the SAVE attribute. */
5392 if ((gfc_current_state () == COMP_MODULE
5393 || gfc_current_state () == COMP_SUBMODULE)
5394 && !current_attr.save
5395 && (gfc_option.allow_std & GFC_STD_F2008) != 0)
5396 current_attr.save = SAVE_IMPLICIT;
5398 colon_seen = 1;
5399 return MATCH_YES;
5401 cleanup:
5402 gfc_current_locus = start;
5403 gfc_free_array_spec (current_as);
5404 current_as = NULL;
5405 attr_seen = 0;
5406 return m;
5410 /* Set the binding label, dest_label, either with the binding label
5411 stored in the given gfc_typespec, ts, or if none was provided, it
5412 will be the symbol name in all lower case, as required by the draft
5413 (J3/04-007, section 15.4.1). If a binding label was given and
5414 there is more than one argument (num_idents), it is an error. */
5416 static bool
5417 set_binding_label (const char **dest_label, const char *sym_name,
5418 int num_idents)
5420 if (num_idents > 1 && has_name_equals)
5422 gfc_error ("Multiple identifiers provided with "
5423 "single NAME= specifier at %C");
5424 return false;
5427 if (curr_binding_label)
5428 /* Binding label given; store in temp holder till have sym. */
5429 *dest_label = curr_binding_label;
5430 else
5432 /* No binding label given, and the NAME= specifier did not exist,
5433 which means there was no NAME="". */
5434 if (sym_name != NULL && has_name_equals == 0)
5435 *dest_label = IDENTIFIER_POINTER (get_identifier (sym_name));
5438 return true;
5442 /* Set the status of the given common block as being BIND(C) or not,
5443 depending on the given parameter, is_bind_c. */
5445 void
5446 set_com_block_bind_c (gfc_common_head *com_block, int is_bind_c)
5448 com_block->is_bind_c = is_bind_c;
5449 return;
5453 /* Verify that the given gfc_typespec is for a C interoperable type. */
5455 bool
5456 gfc_verify_c_interop (gfc_typespec *ts)
5458 if (ts->type == BT_DERIVED && ts->u.derived != NULL)
5459 return (ts->u.derived->ts.is_c_interop || ts->u.derived->attr.is_bind_c)
5460 ? true : false;
5461 else if (ts->type == BT_CLASS)
5462 return false;
5463 else if (ts->is_c_interop != 1 && ts->type != BT_ASSUMED)
5464 return false;
5466 return true;
5470 /* Verify that the variables of a given common block, which has been
5471 defined with the attribute specifier bind(c), to be of a C
5472 interoperable type. Errors will be reported here, if
5473 encountered. */
5475 bool
5476 verify_com_block_vars_c_interop (gfc_common_head *com_block)
5478 gfc_symbol *curr_sym = NULL;
5479 bool retval = true;
5481 curr_sym = com_block->head;
5483 /* Make sure we have at least one symbol. */
5484 if (curr_sym == NULL)
5485 return retval;
5487 /* Here we know we have a symbol, so we'll execute this loop
5488 at least once. */
5491 /* The second to last param, 1, says this is in a common block. */
5492 retval = verify_bind_c_sym (curr_sym, &(curr_sym->ts), 1, com_block);
5493 curr_sym = curr_sym->common_next;
5494 } while (curr_sym != NULL);
5496 return retval;
5500 /* Verify that a given BIND(C) symbol is C interoperable. If it is not,
5501 an appropriate error message is reported. */
5503 bool
5504 verify_bind_c_sym (gfc_symbol *tmp_sym, gfc_typespec *ts,
5505 int is_in_common, gfc_common_head *com_block)
5507 bool bind_c_function = false;
5508 bool retval = true;
5510 if (tmp_sym->attr.function && tmp_sym->attr.is_bind_c)
5511 bind_c_function = true;
5513 if (tmp_sym->attr.function && tmp_sym->result != NULL)
5515 tmp_sym = tmp_sym->result;
5516 /* Make sure it wasn't an implicitly typed result. */
5517 if (tmp_sym->attr.implicit_type && warn_c_binding_type)
5519 gfc_warning (OPT_Wc_binding_type,
5520 "Implicitly declared BIND(C) function %qs at "
5521 "%L may not be C interoperable", tmp_sym->name,
5522 &tmp_sym->declared_at);
5523 tmp_sym->ts.f90_type = tmp_sym->ts.type;
5524 /* Mark it as C interoperable to prevent duplicate warnings. */
5525 tmp_sym->ts.is_c_interop = 1;
5526 tmp_sym->attr.is_c_interop = 1;
5530 /* Here, we know we have the bind(c) attribute, so if we have
5531 enough type info, then verify that it's a C interop kind.
5532 The info could be in the symbol already, or possibly still in
5533 the given ts (current_ts), so look in both. */
5534 if (tmp_sym->ts.type != BT_UNKNOWN || ts->type != BT_UNKNOWN)
5536 if (!gfc_verify_c_interop (&(tmp_sym->ts)))
5538 /* See if we're dealing with a sym in a common block or not. */
5539 if (is_in_common == 1 && warn_c_binding_type)
5541 gfc_warning (OPT_Wc_binding_type,
5542 "Variable %qs in common block %qs at %L "
5543 "may not be a C interoperable "
5544 "kind though common block %qs is BIND(C)",
5545 tmp_sym->name, com_block->name,
5546 &(tmp_sym->declared_at), com_block->name);
5548 else
5550 if (tmp_sym->ts.type == BT_DERIVED || ts->type == BT_DERIVED)
5551 gfc_error ("Type declaration %qs at %L is not C "
5552 "interoperable but it is BIND(C)",
5553 tmp_sym->name, &(tmp_sym->declared_at));
5554 else if (warn_c_binding_type)
5555 gfc_warning (OPT_Wc_binding_type, "Variable %qs at %L "
5556 "may not be a C interoperable "
5557 "kind but it is BIND(C)",
5558 tmp_sym->name, &(tmp_sym->declared_at));
5562 /* Variables declared w/in a common block can't be bind(c)
5563 since there's no way for C to see these variables, so there's
5564 semantically no reason for the attribute. */
5565 if (is_in_common == 1 && tmp_sym->attr.is_bind_c == 1)
5567 gfc_error ("Variable %qs in common block %qs at "
5568 "%L cannot be declared with BIND(C) "
5569 "since it is not a global",
5570 tmp_sym->name, com_block->name,
5571 &(tmp_sym->declared_at));
5572 retval = false;
5575 /* Scalar variables that are bind(c) can not have the pointer
5576 or allocatable attributes. */
5577 if (tmp_sym->attr.is_bind_c == 1)
5579 if (tmp_sym->attr.pointer == 1)
5581 gfc_error ("Variable %qs at %L cannot have both the "
5582 "POINTER and BIND(C) attributes",
5583 tmp_sym->name, &(tmp_sym->declared_at));
5584 retval = false;
5587 if (tmp_sym->attr.allocatable == 1)
5589 gfc_error ("Variable %qs at %L cannot have both the "
5590 "ALLOCATABLE and BIND(C) attributes",
5591 tmp_sym->name, &(tmp_sym->declared_at));
5592 retval = false;
5597 /* If it is a BIND(C) function, make sure the return value is a
5598 scalar value. The previous tests in this function made sure
5599 the type is interoperable. */
5600 if (bind_c_function && tmp_sym->as != NULL)
5601 gfc_error ("Return type of BIND(C) function %qs at %L cannot "
5602 "be an array", tmp_sym->name, &(tmp_sym->declared_at));
5604 /* BIND(C) functions can not return a character string. */
5605 if (bind_c_function && tmp_sym->ts.type == BT_CHARACTER)
5606 if (tmp_sym->ts.u.cl == NULL || tmp_sym->ts.u.cl->length == NULL
5607 || tmp_sym->ts.u.cl->length->expr_type != EXPR_CONSTANT
5608 || mpz_cmp_si (tmp_sym->ts.u.cl->length->value.integer, 1) != 0)
5609 gfc_error ("Return type of BIND(C) function %qs at %L cannot "
5610 "be a character string", tmp_sym->name,
5611 &(tmp_sym->declared_at));
5614 /* See if the symbol has been marked as private. If it has, make sure
5615 there is no binding label and warn the user if there is one. */
5616 if (tmp_sym->attr.access == ACCESS_PRIVATE
5617 && tmp_sym->binding_label)
5618 /* Use gfc_warning_now because we won't say that the symbol fails
5619 just because of this. */
5620 gfc_warning_now (0, "Symbol %qs at %L is marked PRIVATE but has been "
5621 "given the binding label %qs", tmp_sym->name,
5622 &(tmp_sym->declared_at), tmp_sym->binding_label);
5624 return retval;
5628 /* Set the appropriate fields for a symbol that's been declared as
5629 BIND(C) (the is_bind_c flag and the binding label), and verify that
5630 the type is C interoperable. Errors are reported by the functions
5631 used to set/test these fields. */
5633 bool
5634 set_verify_bind_c_sym (gfc_symbol *tmp_sym, int num_idents)
5636 bool retval = true;
5638 /* TODO: Do we need to make sure the vars aren't marked private? */
5640 /* Set the is_bind_c bit in symbol_attribute. */
5641 gfc_add_is_bind_c (&(tmp_sym->attr), tmp_sym->name, &gfc_current_locus, 0);
5643 if (!set_binding_label (&tmp_sym->binding_label, tmp_sym->name, num_idents))
5644 return false;
5646 return retval;
5650 /* Set the fields marking the given common block as BIND(C), including
5651 a binding label, and report any errors encountered. */
5653 bool
5654 set_verify_bind_c_com_block (gfc_common_head *com_block, int num_idents)
5656 bool retval = true;
5658 /* destLabel, common name, typespec (which may have binding label). */
5659 if (!set_binding_label (&com_block->binding_label, com_block->name,
5660 num_idents))
5661 return false;
5663 /* Set the given common block (com_block) to being bind(c) (1). */
5664 set_com_block_bind_c (com_block, 1);
5666 return retval;
5670 /* Retrieve the list of one or more identifiers that the given bind(c)
5671 attribute applies to. */
5673 bool
5674 get_bind_c_idents (void)
5676 char name[GFC_MAX_SYMBOL_LEN + 1];
5677 int num_idents = 0;
5678 gfc_symbol *tmp_sym = NULL;
5679 match found_id;
5680 gfc_common_head *com_block = NULL;
5682 if (gfc_match_name (name) == MATCH_YES)
5684 found_id = MATCH_YES;
5685 gfc_get_ha_symbol (name, &tmp_sym);
5687 else if (match_common_name (name) == MATCH_YES)
5689 found_id = MATCH_YES;
5690 com_block = gfc_get_common (name, 0);
5692 else
5694 gfc_error ("Need either entity or common block name for "
5695 "attribute specification statement at %C");
5696 return false;
5699 /* Save the current identifier and look for more. */
5702 /* Increment the number of identifiers found for this spec stmt. */
5703 num_idents++;
5705 /* Make sure we have a sym or com block, and verify that it can
5706 be bind(c). Set the appropriate field(s) and look for more
5707 identifiers. */
5708 if (tmp_sym != NULL || com_block != NULL)
5710 if (tmp_sym != NULL)
5712 if (!set_verify_bind_c_sym (tmp_sym, num_idents))
5713 return false;
5715 else
5717 if (!set_verify_bind_c_com_block (com_block, num_idents))
5718 return false;
5721 /* Look to see if we have another identifier. */
5722 tmp_sym = NULL;
5723 if (gfc_match_eos () == MATCH_YES)
5724 found_id = MATCH_NO;
5725 else if (gfc_match_char (',') != MATCH_YES)
5726 found_id = MATCH_NO;
5727 else if (gfc_match_name (name) == MATCH_YES)
5729 found_id = MATCH_YES;
5730 gfc_get_ha_symbol (name, &tmp_sym);
5732 else if (match_common_name (name) == MATCH_YES)
5734 found_id = MATCH_YES;
5735 com_block = gfc_get_common (name, 0);
5737 else
5739 gfc_error ("Missing entity or common block name for "
5740 "attribute specification statement at %C");
5741 return false;
5744 else
5746 gfc_internal_error ("Missing symbol");
5748 } while (found_id == MATCH_YES);
5750 /* if we get here we were successful */
5751 return true;
5755 /* Try and match a BIND(C) attribute specification statement. */
5757 match
5758 gfc_match_bind_c_stmt (void)
5760 match found_match = MATCH_NO;
5761 gfc_typespec *ts;
5763 ts = &current_ts;
5765 /* This may not be necessary. */
5766 gfc_clear_ts (ts);
5767 /* Clear the temporary binding label holder. */
5768 curr_binding_label = NULL;
5770 /* Look for the bind(c). */
5771 found_match = gfc_match_bind_c (NULL, true);
5773 if (found_match == MATCH_YES)
5775 if (!gfc_notify_std (GFC_STD_F2003, "BIND(C) statement at %C"))
5776 return MATCH_ERROR;
5778 /* Look for the :: now, but it is not required. */
5779 gfc_match (" :: ");
5781 /* Get the identifier(s) that needs to be updated. This may need to
5782 change to hand the flag(s) for the attr specified so all identifiers
5783 found can have all appropriate parts updated (assuming that the same
5784 spec stmt can have multiple attrs, such as both bind(c) and
5785 allocatable...). */
5786 if (!get_bind_c_idents ())
5787 /* Error message should have printed already. */
5788 return MATCH_ERROR;
5791 return found_match;
5795 /* Match a data declaration statement. */
5797 match
5798 gfc_match_data_decl (void)
5800 gfc_symbol *sym;
5801 match m;
5802 int elem;
5804 type_param_spec_list = NULL;
5805 decl_type_param_list = NULL;
5807 num_idents_on_line = 0;
5809 m = gfc_match_decl_type_spec (&current_ts, 0);
5810 if (m != MATCH_YES)
5811 return m;
5813 if ((current_ts.type == BT_DERIVED || current_ts.type == BT_CLASS)
5814 && !gfc_comp_struct (gfc_current_state ()))
5816 sym = gfc_use_derived (current_ts.u.derived);
5818 if (sym == NULL)
5820 m = MATCH_ERROR;
5821 goto cleanup;
5824 current_ts.u.derived = sym;
5827 m = match_attr_spec ();
5828 if (m == MATCH_ERROR)
5830 m = MATCH_NO;
5831 goto cleanup;
5834 if (current_ts.type == BT_CLASS
5835 && current_ts.u.derived->attr.unlimited_polymorphic)
5836 goto ok;
5838 if ((current_ts.type == BT_DERIVED || current_ts.type == BT_CLASS)
5839 && current_ts.u.derived->components == NULL
5840 && !current_ts.u.derived->attr.zero_comp)
5843 if (current_attr.pointer && gfc_comp_struct (gfc_current_state ()))
5844 goto ok;
5846 if (current_attr.allocatable && gfc_current_state () == COMP_DERIVED
5847 && current_ts.u.derived == gfc_current_block ())
5848 goto ok;
5850 gfc_find_symbol (current_ts.u.derived->name,
5851 current_ts.u.derived->ns, 1, &sym);
5853 /* Any symbol that we find had better be a type definition
5854 which has its components defined, or be a structure definition
5855 actively being parsed. */
5856 if (sym != NULL && gfc_fl_struct (sym->attr.flavor)
5857 && (current_ts.u.derived->components != NULL
5858 || current_ts.u.derived->attr.zero_comp
5859 || current_ts.u.derived == gfc_new_block))
5860 goto ok;
5862 gfc_error ("Derived type at %C has not been previously defined "
5863 "and so cannot appear in a derived type definition");
5864 m = MATCH_ERROR;
5865 goto cleanup;
5869 /* If we have an old-style character declaration, and no new-style
5870 attribute specifications, then there a comma is optional between
5871 the type specification and the variable list. */
5872 if (m == MATCH_NO && current_ts.type == BT_CHARACTER && old_char_selector)
5873 gfc_match_char (',');
5875 /* Give the types/attributes to symbols that follow. Give the element
5876 a number so that repeat character length expressions can be copied. */
5877 elem = 1;
5878 for (;;)
5880 num_idents_on_line++;
5881 m = variable_decl (elem++);
5882 if (m == MATCH_ERROR)
5883 goto cleanup;
5884 if (m == MATCH_NO)
5885 break;
5887 if (gfc_match_eos () == MATCH_YES)
5888 goto cleanup;
5889 if (gfc_match_char (',') != MATCH_YES)
5890 break;
5893 if (!gfc_error_flag_test ())
5895 /* An anonymous structure declaration is unambiguous; if we matched one
5896 according to gfc_match_structure_decl, we need to return MATCH_YES
5897 here to avoid confusing the remaining matchers, even if there was an
5898 error during variable_decl. We must flush any such errors. Note this
5899 causes the parser to gracefully continue parsing the remaining input
5900 as a structure body, which likely follows. */
5901 if (current_ts.type == BT_DERIVED && current_ts.u.derived
5902 && gfc_fl_struct (current_ts.u.derived->attr.flavor))
5904 gfc_error_now ("Syntax error in anonymous structure declaration"
5905 " at %C");
5906 /* Skip the bad variable_decl and line up for the start of the
5907 structure body. */
5908 gfc_error_recovery ();
5909 m = MATCH_YES;
5910 goto cleanup;
5913 gfc_error ("Syntax error in data declaration at %C");
5916 m = MATCH_ERROR;
5918 gfc_free_data_all (gfc_current_ns);
5920 cleanup:
5921 if (saved_kind_expr)
5922 gfc_free_expr (saved_kind_expr);
5923 if (type_param_spec_list)
5924 gfc_free_actual_arglist (type_param_spec_list);
5925 if (decl_type_param_list)
5926 gfc_free_actual_arglist (decl_type_param_list);
5927 saved_kind_expr = NULL;
5928 gfc_free_array_spec (current_as);
5929 current_as = NULL;
5930 return m;
5934 /* Match a prefix associated with a function or subroutine
5935 declaration. If the typespec pointer is nonnull, then a typespec
5936 can be matched. Note that if nothing matches, MATCH_YES is
5937 returned (the null string was matched). */
5939 match
5940 gfc_match_prefix (gfc_typespec *ts)
5942 bool seen_type;
5943 bool seen_impure;
5944 bool found_prefix;
5946 gfc_clear_attr (&current_attr);
5947 seen_type = false;
5948 seen_impure = false;
5950 gcc_assert (!gfc_matching_prefix);
5951 gfc_matching_prefix = true;
5955 found_prefix = false;
5957 /* MODULE is a prefix like PURE, ELEMENTAL, etc., having a
5958 corresponding attribute seems natural and distinguishes these
5959 procedures from procedure types of PROC_MODULE, which these are
5960 as well. */
5961 if (gfc_match ("module% ") == MATCH_YES)
5963 if (!gfc_notify_std (GFC_STD_F2008, "MODULE prefix at %C"))
5964 goto error;
5966 current_attr.module_procedure = 1;
5967 found_prefix = true;
5970 if (!seen_type && ts != NULL
5971 && gfc_match_decl_type_spec (ts, 0) == MATCH_YES
5972 && gfc_match_space () == MATCH_YES)
5975 seen_type = true;
5976 found_prefix = true;
5979 if (gfc_match ("elemental% ") == MATCH_YES)
5981 if (!gfc_add_elemental (&current_attr, NULL))
5982 goto error;
5984 found_prefix = true;
5987 if (gfc_match ("pure% ") == MATCH_YES)
5989 if (!gfc_add_pure (&current_attr, NULL))
5990 goto error;
5992 found_prefix = true;
5995 if (gfc_match ("recursive% ") == MATCH_YES)
5997 if (!gfc_add_recursive (&current_attr, NULL))
5998 goto error;
6000 found_prefix = true;
6003 /* IMPURE is a somewhat special case, as it needs not set an actual
6004 attribute but rather only prevents ELEMENTAL routines from being
6005 automatically PURE. */
6006 if (gfc_match ("impure% ") == MATCH_YES)
6008 if (!gfc_notify_std (GFC_STD_F2008, "IMPURE procedure at %C"))
6009 goto error;
6011 seen_impure = true;
6012 found_prefix = true;
6015 while (found_prefix);
6017 /* IMPURE and PURE must not both appear, of course. */
6018 if (seen_impure && current_attr.pure)
6020 gfc_error ("PURE and IMPURE must not appear both at %C");
6021 goto error;
6024 /* If IMPURE it not seen but the procedure is ELEMENTAL, mark it as PURE. */
6025 if (!seen_impure && current_attr.elemental && !current_attr.pure)
6027 if (!gfc_add_pure (&current_attr, NULL))
6028 goto error;
6031 /* At this point, the next item is not a prefix. */
6032 gcc_assert (gfc_matching_prefix);
6034 gfc_matching_prefix = false;
6035 return MATCH_YES;
6037 error:
6038 gcc_assert (gfc_matching_prefix);
6039 gfc_matching_prefix = false;
6040 return MATCH_ERROR;
6044 /* Copy attributes matched by gfc_match_prefix() to attributes on a symbol. */
6046 static bool
6047 copy_prefix (symbol_attribute *dest, locus *where)
6049 if (dest->module_procedure)
6051 if (current_attr.elemental)
6052 dest->elemental = 1;
6054 if (current_attr.pure)
6055 dest->pure = 1;
6057 if (current_attr.recursive)
6058 dest->recursive = 1;
6060 /* Module procedures are unusual in that the 'dest' is copied from
6061 the interface declaration. However, this is an oportunity to
6062 check that the submodule declaration is compliant with the
6063 interface. */
6064 if (dest->elemental && !current_attr.elemental)
6066 gfc_error ("ELEMENTAL prefix in MODULE PROCEDURE interface is "
6067 "missing at %L", where);
6068 return false;
6071 if (dest->pure && !current_attr.pure)
6073 gfc_error ("PURE prefix in MODULE PROCEDURE interface is "
6074 "missing at %L", where);
6075 return false;
6078 if (dest->recursive && !current_attr.recursive)
6080 gfc_error ("RECURSIVE prefix in MODULE PROCEDURE interface is "
6081 "missing at %L", where);
6082 return false;
6085 return true;
6088 if (current_attr.elemental && !gfc_add_elemental (dest, where))
6089 return false;
6091 if (current_attr.pure && !gfc_add_pure (dest, where))
6092 return false;
6094 if (current_attr.recursive && !gfc_add_recursive (dest, where))
6095 return false;
6097 return true;
6101 /* Match a formal argument list or, if typeparam is true, a
6102 type_param_name_list. */
6104 match
6105 gfc_match_formal_arglist (gfc_symbol *progname, int st_flag,
6106 int null_flag, bool typeparam)
6108 gfc_formal_arglist *head, *tail, *p, *q;
6109 char name[GFC_MAX_SYMBOL_LEN + 1];
6110 gfc_symbol *sym;
6111 match m;
6112 gfc_formal_arglist *formal = NULL;
6114 head = tail = NULL;
6116 /* Keep the interface formal argument list and null it so that the
6117 matching for the new declaration can be done. The numbers and
6118 names of the arguments are checked here. The interface formal
6119 arguments are retained in formal_arglist and the characteristics
6120 are compared in resolve.c(resolve_fl_procedure). See the remark
6121 in get_proc_name about the eventual need to copy the formal_arglist
6122 and populate the formal namespace of the interface symbol. */
6123 if (progname->attr.module_procedure
6124 && progname->attr.host_assoc)
6126 formal = progname->formal;
6127 progname->formal = NULL;
6130 if (gfc_match_char ('(') != MATCH_YES)
6132 if (null_flag)
6133 goto ok;
6134 return MATCH_NO;
6137 if (gfc_match_char (')') == MATCH_YES)
6138 goto ok;
6140 for (;;)
6142 if (gfc_match_char ('*') == MATCH_YES)
6144 sym = NULL;
6145 if (!typeparam && !gfc_notify_std (GFC_STD_F95_OBS,
6146 "Alternate-return argument at %C"))
6148 m = MATCH_ERROR;
6149 goto cleanup;
6151 else if (typeparam)
6152 gfc_error_now ("A parameter name is required at %C");
6154 else
6156 m = gfc_match_name (name);
6157 if (m != MATCH_YES)
6159 if(typeparam)
6160 gfc_error_now ("A parameter name is required at %C");
6161 goto cleanup;
6164 if (!typeparam && gfc_get_symbol (name, NULL, &sym))
6165 goto cleanup;
6166 else if (typeparam
6167 && gfc_get_symbol (name, progname->f2k_derived, &sym))
6168 goto cleanup;
6171 p = gfc_get_formal_arglist ();
6173 if (head == NULL)
6174 head = tail = p;
6175 else
6177 tail->next = p;
6178 tail = p;
6181 tail->sym = sym;
6183 /* We don't add the VARIABLE flavor because the name could be a
6184 dummy procedure. We don't apply these attributes to formal
6185 arguments of statement functions. */
6186 if (sym != NULL && !st_flag
6187 && (!gfc_add_dummy(&sym->attr, sym->name, NULL)
6188 || !gfc_missing_attr (&sym->attr, NULL)))
6190 m = MATCH_ERROR;
6191 goto cleanup;
6194 /* The name of a program unit can be in a different namespace,
6195 so check for it explicitly. After the statement is accepted,
6196 the name is checked for especially in gfc_get_symbol(). */
6197 if (gfc_new_block != NULL && sym != NULL && !typeparam
6198 && strcmp (sym->name, gfc_new_block->name) == 0)
6200 gfc_error ("Name %qs at %C is the name of the procedure",
6201 sym->name);
6202 m = MATCH_ERROR;
6203 goto cleanup;
6206 if (gfc_match_char (')') == MATCH_YES)
6207 goto ok;
6209 m = gfc_match_char (',');
6210 if (m != MATCH_YES)
6212 if (typeparam)
6213 gfc_error_now ("Expected parameter list in type declaration "
6214 "at %C");
6215 else
6216 gfc_error ("Unexpected junk in formal argument list at %C");
6217 goto cleanup;
6222 /* Check for duplicate symbols in the formal argument list. */
6223 if (head != NULL)
6225 for (p = head; p->next; p = p->next)
6227 if (p->sym == NULL)
6228 continue;
6230 for (q = p->next; q; q = q->next)
6231 if (p->sym == q->sym)
6233 if (typeparam)
6234 gfc_error_now ("Duplicate name %qs in parameter "
6235 "list at %C", p->sym->name);
6236 else
6237 gfc_error ("Duplicate symbol %qs in formal argument "
6238 "list at %C", p->sym->name);
6240 m = MATCH_ERROR;
6241 goto cleanup;
6246 if (!gfc_add_explicit_interface (progname, IFSRC_DECL, head, NULL))
6248 m = MATCH_ERROR;
6249 goto cleanup;
6252 /* gfc_error_now used in following and return with MATCH_YES because
6253 doing otherwise results in a cascade of extraneous errors and in
6254 some cases an ICE in symbol.c(gfc_release_symbol). */
6255 if (progname->attr.module_procedure && progname->attr.host_assoc)
6257 bool arg_count_mismatch = false;
6259 if (!formal && head)
6260 arg_count_mismatch = true;
6262 /* Abbreviated module procedure declaration is not meant to have any
6263 formal arguments! */
6264 if (!progname->abr_modproc_decl && formal && !head)
6265 arg_count_mismatch = true;
6267 for (p = formal, q = head; p && q; p = p->next, q = q->next)
6269 if ((p->next != NULL && q->next == NULL)
6270 || (p->next == NULL && q->next != NULL))
6271 arg_count_mismatch = true;
6272 else if ((p->sym == NULL && q->sym == NULL)
6273 || strcmp (p->sym->name, q->sym->name) == 0)
6274 continue;
6275 else
6276 gfc_error_now ("Mismatch in MODULE PROCEDURE formal "
6277 "argument names (%s/%s) at %C",
6278 p->sym->name, q->sym->name);
6281 if (arg_count_mismatch)
6282 gfc_error_now ("Mismatch in number of MODULE PROCEDURE "
6283 "formal arguments at %C");
6286 return MATCH_YES;
6288 cleanup:
6289 gfc_free_formal_arglist (head);
6290 return m;
6294 /* Match a RESULT specification following a function declaration or
6295 ENTRY statement. Also matches the end-of-statement. */
6297 static match
6298 match_result (gfc_symbol *function, gfc_symbol **result)
6300 char name[GFC_MAX_SYMBOL_LEN + 1];
6301 gfc_symbol *r;
6302 match m;
6304 if (gfc_match (" result (") != MATCH_YES)
6305 return MATCH_NO;
6307 m = gfc_match_name (name);
6308 if (m != MATCH_YES)
6309 return m;
6311 /* Get the right paren, and that's it because there could be the
6312 bind(c) attribute after the result clause. */
6313 if (gfc_match_char (')') != MATCH_YES)
6315 /* TODO: should report the missing right paren here. */
6316 return MATCH_ERROR;
6319 if (strcmp (function->name, name) == 0)
6321 gfc_error ("RESULT variable at %C must be different than function name");
6322 return MATCH_ERROR;
6325 if (gfc_get_symbol (name, NULL, &r))
6326 return MATCH_ERROR;
6328 if (!gfc_add_result (&r->attr, r->name, NULL))
6329 return MATCH_ERROR;
6331 *result = r;
6333 return MATCH_YES;
6337 /* Match a function suffix, which could be a combination of a result
6338 clause and BIND(C), either one, or neither. The draft does not
6339 require them to come in a specific order. */
6341 match
6342 gfc_match_suffix (gfc_symbol *sym, gfc_symbol **result)
6344 match is_bind_c; /* Found bind(c). */
6345 match is_result; /* Found result clause. */
6346 match found_match; /* Status of whether we've found a good match. */
6347 char peek_char; /* Character we're going to peek at. */
6348 bool allow_binding_name;
6350 /* Initialize to having found nothing. */
6351 found_match = MATCH_NO;
6352 is_bind_c = MATCH_NO;
6353 is_result = MATCH_NO;
6355 /* Get the next char to narrow between result and bind(c). */
6356 gfc_gobble_whitespace ();
6357 peek_char = gfc_peek_ascii_char ();
6359 /* C binding names are not allowed for internal procedures. */
6360 if (gfc_current_state () == COMP_CONTAINS
6361 && sym->ns->proc_name->attr.flavor != FL_MODULE)
6362 allow_binding_name = false;
6363 else
6364 allow_binding_name = true;
6366 switch (peek_char)
6368 case 'r':
6369 /* Look for result clause. */
6370 is_result = match_result (sym, result);
6371 if (is_result == MATCH_YES)
6373 /* Now see if there is a bind(c) after it. */
6374 is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
6375 /* We've found the result clause and possibly bind(c). */
6376 found_match = MATCH_YES;
6378 else
6379 /* This should only be MATCH_ERROR. */
6380 found_match = is_result;
6381 break;
6382 case 'b':
6383 /* Look for bind(c) first. */
6384 is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
6385 if (is_bind_c == MATCH_YES)
6387 /* Now see if a result clause followed it. */
6388 is_result = match_result (sym, result);
6389 found_match = MATCH_YES;
6391 else
6393 /* Should only be a MATCH_ERROR if we get here after seeing 'b'. */
6394 found_match = MATCH_ERROR;
6396 break;
6397 default:
6398 gfc_error ("Unexpected junk after function declaration at %C");
6399 found_match = MATCH_ERROR;
6400 break;
6403 if (is_bind_c == MATCH_YES)
6405 /* Fortran 2008 draft allows BIND(C) for internal procedures. */
6406 if (gfc_current_state () == COMP_CONTAINS
6407 && sym->ns->proc_name->attr.flavor != FL_MODULE
6408 && !gfc_notify_std (GFC_STD_F2008, "BIND(C) attribute "
6409 "at %L may not be specified for an internal "
6410 "procedure", &gfc_current_locus))
6411 return MATCH_ERROR;
6413 if (!gfc_add_is_bind_c (&(sym->attr), sym->name, &gfc_current_locus, 1))
6414 return MATCH_ERROR;
6417 return found_match;
6421 /* Procedure pointer return value without RESULT statement:
6422 Add "hidden" result variable named "ppr@". */
6424 static bool
6425 add_hidden_procptr_result (gfc_symbol *sym)
6427 bool case1,case2;
6429 if (gfc_notification_std (GFC_STD_F2003) == ERROR)
6430 return false;
6432 /* First usage case: PROCEDURE and EXTERNAL statements. */
6433 case1 = gfc_current_state () == COMP_FUNCTION && gfc_current_block ()
6434 && strcmp (gfc_current_block ()->name, sym->name) == 0
6435 && sym->attr.external;
6436 /* Second usage case: INTERFACE statements. */
6437 case2 = gfc_current_state () == COMP_INTERFACE && gfc_state_stack->previous
6438 && gfc_state_stack->previous->state == COMP_FUNCTION
6439 && strcmp (gfc_state_stack->previous->sym->name, sym->name) == 0;
6441 if (case1 || case2)
6443 gfc_symtree *stree;
6444 if (case1)
6445 gfc_get_sym_tree ("ppr@", gfc_current_ns, &stree, false);
6446 else if (case2)
6448 gfc_symtree *st2;
6449 gfc_get_sym_tree ("ppr@", gfc_current_ns->parent, &stree, false);
6450 st2 = gfc_new_symtree (&gfc_current_ns->sym_root, "ppr@");
6451 st2->n.sym = stree->n.sym;
6452 stree->n.sym->refs++;
6454 sym->result = stree->n.sym;
6456 sym->result->attr.proc_pointer = sym->attr.proc_pointer;
6457 sym->result->attr.pointer = sym->attr.pointer;
6458 sym->result->attr.external = sym->attr.external;
6459 sym->result->attr.referenced = sym->attr.referenced;
6460 sym->result->ts = sym->ts;
6461 sym->attr.proc_pointer = 0;
6462 sym->attr.pointer = 0;
6463 sym->attr.external = 0;
6464 if (sym->result->attr.external && sym->result->attr.pointer)
6466 sym->result->attr.pointer = 0;
6467 sym->result->attr.proc_pointer = 1;
6470 return gfc_add_result (&sym->result->attr, sym->result->name, NULL);
6472 /* POINTER after PROCEDURE/EXTERNAL/INTERFACE statement. */
6473 else if (sym->attr.function && !sym->attr.external && sym->attr.pointer
6474 && sym->result && sym->result != sym && sym->result->attr.external
6475 && sym == gfc_current_ns->proc_name
6476 && sym == sym->result->ns->proc_name
6477 && strcmp ("ppr@", sym->result->name) == 0)
6479 sym->result->attr.proc_pointer = 1;
6480 sym->attr.pointer = 0;
6481 return true;
6483 else
6484 return false;
6488 /* Match the interface for a PROCEDURE declaration,
6489 including brackets (R1212). */
6491 static match
6492 match_procedure_interface (gfc_symbol **proc_if)
6494 match m;
6495 gfc_symtree *st;
6496 locus old_loc, entry_loc;
6497 gfc_namespace *old_ns = gfc_current_ns;
6498 char name[GFC_MAX_SYMBOL_LEN + 1];
6500 old_loc = entry_loc = gfc_current_locus;
6501 gfc_clear_ts (&current_ts);
6503 if (gfc_match (" (") != MATCH_YES)
6505 gfc_current_locus = entry_loc;
6506 return MATCH_NO;
6509 /* Get the type spec. for the procedure interface. */
6510 old_loc = gfc_current_locus;
6511 m = gfc_match_decl_type_spec (&current_ts, 0);
6512 gfc_gobble_whitespace ();
6513 if (m == MATCH_YES || (m == MATCH_NO && gfc_peek_ascii_char () == ')'))
6514 goto got_ts;
6516 if (m == MATCH_ERROR)
6517 return m;
6519 /* Procedure interface is itself a procedure. */
6520 gfc_current_locus = old_loc;
6521 m = gfc_match_name (name);
6523 /* First look to see if it is already accessible in the current
6524 namespace because it is use associated or contained. */
6525 st = NULL;
6526 if (gfc_find_sym_tree (name, NULL, 0, &st))
6527 return MATCH_ERROR;
6529 /* If it is still not found, then try the parent namespace, if it
6530 exists and create the symbol there if it is still not found. */
6531 if (gfc_current_ns->parent)
6532 gfc_current_ns = gfc_current_ns->parent;
6533 if (st == NULL && gfc_get_ha_sym_tree (name, &st))
6534 return MATCH_ERROR;
6536 gfc_current_ns = old_ns;
6537 *proc_if = st->n.sym;
6539 if (*proc_if)
6541 (*proc_if)->refs++;
6542 /* Resolve interface if possible. That way, attr.procedure is only set
6543 if it is declared by a later procedure-declaration-stmt, which is
6544 invalid per F08:C1216 (cf. resolve_procedure_interface). */
6545 while ((*proc_if)->ts.interface
6546 && *proc_if != (*proc_if)->ts.interface)
6547 *proc_if = (*proc_if)->ts.interface;
6549 if ((*proc_if)->attr.flavor == FL_UNKNOWN
6550 && (*proc_if)->ts.type == BT_UNKNOWN
6551 && !gfc_add_flavor (&(*proc_if)->attr, FL_PROCEDURE,
6552 (*proc_if)->name, NULL))
6553 return MATCH_ERROR;
6556 got_ts:
6557 if (gfc_match (" )") != MATCH_YES)
6559 gfc_current_locus = entry_loc;
6560 return MATCH_NO;
6563 return MATCH_YES;
6567 /* Match a PROCEDURE declaration (R1211). */
6569 static match
6570 match_procedure_decl (void)
6572 match m;
6573 gfc_symbol *sym, *proc_if = NULL;
6574 int num;
6575 gfc_expr *initializer = NULL;
6577 /* Parse interface (with brackets). */
6578 m = match_procedure_interface (&proc_if);
6579 if (m != MATCH_YES)
6580 return m;
6582 /* Parse attributes (with colons). */
6583 m = match_attr_spec();
6584 if (m == MATCH_ERROR)
6585 return MATCH_ERROR;
6587 if (proc_if && proc_if->attr.is_bind_c && !current_attr.is_bind_c)
6589 current_attr.is_bind_c = 1;
6590 has_name_equals = 0;
6591 curr_binding_label = NULL;
6594 /* Get procedure symbols. */
6595 for(num=1;;num++)
6597 m = gfc_match_symbol (&sym, 0);
6598 if (m == MATCH_NO)
6599 goto syntax;
6600 else if (m == MATCH_ERROR)
6601 return m;
6603 /* Add current_attr to the symbol attributes. */
6604 if (!gfc_copy_attr (&sym->attr, &current_attr, NULL))
6605 return MATCH_ERROR;
6607 if (sym->attr.is_bind_c)
6609 /* Check for C1218. */
6610 if (!proc_if || !proc_if->attr.is_bind_c)
6612 gfc_error ("BIND(C) attribute at %C requires "
6613 "an interface with BIND(C)");
6614 return MATCH_ERROR;
6616 /* Check for C1217. */
6617 if (has_name_equals && sym->attr.pointer)
6619 gfc_error ("BIND(C) procedure with NAME may not have "
6620 "POINTER attribute at %C");
6621 return MATCH_ERROR;
6623 if (has_name_equals && sym->attr.dummy)
6625 gfc_error ("Dummy procedure at %C may not have "
6626 "BIND(C) attribute with NAME");
6627 return MATCH_ERROR;
6629 /* Set binding label for BIND(C). */
6630 if (!set_binding_label (&sym->binding_label, sym->name, num))
6631 return MATCH_ERROR;
6634 if (!gfc_add_external (&sym->attr, NULL))
6635 return MATCH_ERROR;
6637 if (add_hidden_procptr_result (sym))
6638 sym = sym->result;
6640 if (!gfc_add_proc (&sym->attr, sym->name, NULL))
6641 return MATCH_ERROR;
6643 /* Set interface. */
6644 if (proc_if != NULL)
6646 if (sym->ts.type != BT_UNKNOWN)
6648 gfc_error ("Procedure %qs at %L already has basic type of %s",
6649 sym->name, &gfc_current_locus,
6650 gfc_basic_typename (sym->ts.type));
6651 return MATCH_ERROR;
6653 sym->ts.interface = proc_if;
6654 sym->attr.untyped = 1;
6655 sym->attr.if_source = IFSRC_IFBODY;
6657 else if (current_ts.type != BT_UNKNOWN)
6659 if (!gfc_add_type (sym, &current_ts, &gfc_current_locus))
6660 return MATCH_ERROR;
6661 sym->ts.interface = gfc_new_symbol ("", gfc_current_ns);
6662 sym->ts.interface->ts = current_ts;
6663 sym->ts.interface->attr.flavor = FL_PROCEDURE;
6664 sym->ts.interface->attr.function = 1;
6665 sym->attr.function = 1;
6666 sym->attr.if_source = IFSRC_UNKNOWN;
6669 if (gfc_match (" =>") == MATCH_YES)
6671 if (!current_attr.pointer)
6673 gfc_error ("Initialization at %C isn't for a pointer variable");
6674 m = MATCH_ERROR;
6675 goto cleanup;
6678 m = match_pointer_init (&initializer, 1);
6679 if (m != MATCH_YES)
6680 goto cleanup;
6682 if (!add_init_expr_to_sym (sym->name, &initializer, &gfc_current_locus))
6683 goto cleanup;
6687 if (gfc_match_eos () == MATCH_YES)
6688 return MATCH_YES;
6689 if (gfc_match_char (',') != MATCH_YES)
6690 goto syntax;
6693 syntax:
6694 gfc_error ("Syntax error in PROCEDURE statement at %C");
6695 return MATCH_ERROR;
6697 cleanup:
6698 /* Free stuff up and return. */
6699 gfc_free_expr (initializer);
6700 return m;
6704 static match
6705 match_binding_attributes (gfc_typebound_proc* ba, bool generic, bool ppc);
6708 /* Match a procedure pointer component declaration (R445). */
6710 static match
6711 match_ppc_decl (void)
6713 match m;
6714 gfc_symbol *proc_if = NULL;
6715 gfc_typespec ts;
6716 int num;
6717 gfc_component *c;
6718 gfc_expr *initializer = NULL;
6719 gfc_typebound_proc* tb;
6720 char name[GFC_MAX_SYMBOL_LEN + 1];
6722 /* Parse interface (with brackets). */
6723 m = match_procedure_interface (&proc_if);
6724 if (m != MATCH_YES)
6725 goto syntax;
6727 /* Parse attributes. */
6728 tb = XCNEW (gfc_typebound_proc);
6729 tb->where = gfc_current_locus;
6730 m = match_binding_attributes (tb, false, true);
6731 if (m == MATCH_ERROR)
6732 return m;
6734 gfc_clear_attr (&current_attr);
6735 current_attr.procedure = 1;
6736 current_attr.proc_pointer = 1;
6737 current_attr.access = tb->access;
6738 current_attr.flavor = FL_PROCEDURE;
6740 /* Match the colons (required). */
6741 if (gfc_match (" ::") != MATCH_YES)
6743 gfc_error ("Expected %<::%> after binding-attributes at %C");
6744 return MATCH_ERROR;
6747 /* Check for C450. */
6748 if (!tb->nopass && proc_if == NULL)
6750 gfc_error("NOPASS or explicit interface required at %C");
6751 return MATCH_ERROR;
6754 if (!gfc_notify_std (GFC_STD_F2003, "Procedure pointer component at %C"))
6755 return MATCH_ERROR;
6757 /* Match PPC names. */
6758 ts = current_ts;
6759 for(num=1;;num++)
6761 m = gfc_match_name (name);
6762 if (m == MATCH_NO)
6763 goto syntax;
6764 else if (m == MATCH_ERROR)
6765 return m;
6767 if (!gfc_add_component (gfc_current_block(), name, &c))
6768 return MATCH_ERROR;
6770 /* Add current_attr to the symbol attributes. */
6771 if (!gfc_copy_attr (&c->attr, &current_attr, NULL))
6772 return MATCH_ERROR;
6774 if (!gfc_add_external (&c->attr, NULL))
6775 return MATCH_ERROR;
6777 if (!gfc_add_proc (&c->attr, name, NULL))
6778 return MATCH_ERROR;
6780 if (num == 1)
6781 c->tb = tb;
6782 else
6784 c->tb = XCNEW (gfc_typebound_proc);
6785 c->tb->where = gfc_current_locus;
6786 *c->tb = *tb;
6789 /* Set interface. */
6790 if (proc_if != NULL)
6792 c->ts.interface = proc_if;
6793 c->attr.untyped = 1;
6794 c->attr.if_source = IFSRC_IFBODY;
6796 else if (ts.type != BT_UNKNOWN)
6798 c->ts = ts;
6799 c->ts.interface = gfc_new_symbol ("", gfc_current_ns);
6800 c->ts.interface->result = c->ts.interface;
6801 c->ts.interface->ts = ts;
6802 c->ts.interface->attr.flavor = FL_PROCEDURE;
6803 c->ts.interface->attr.function = 1;
6804 c->attr.function = 1;
6805 c->attr.if_source = IFSRC_UNKNOWN;
6808 if (gfc_match (" =>") == MATCH_YES)
6810 m = match_pointer_init (&initializer, 1);
6811 if (m != MATCH_YES)
6813 gfc_free_expr (initializer);
6814 return m;
6816 c->initializer = initializer;
6819 if (gfc_match_eos () == MATCH_YES)
6820 return MATCH_YES;
6821 if (gfc_match_char (',') != MATCH_YES)
6822 goto syntax;
6825 syntax:
6826 gfc_error ("Syntax error in procedure pointer component at %C");
6827 return MATCH_ERROR;
6831 /* Match a PROCEDURE declaration inside an interface (R1206). */
6833 static match
6834 match_procedure_in_interface (void)
6836 match m;
6837 gfc_symbol *sym;
6838 char name[GFC_MAX_SYMBOL_LEN + 1];
6839 locus old_locus;
6841 if (current_interface.type == INTERFACE_NAMELESS
6842 || current_interface.type == INTERFACE_ABSTRACT)
6844 gfc_error ("PROCEDURE at %C must be in a generic interface");
6845 return MATCH_ERROR;
6848 /* Check if the F2008 optional double colon appears. */
6849 gfc_gobble_whitespace ();
6850 old_locus = gfc_current_locus;
6851 if (gfc_match ("::") == MATCH_YES)
6853 if (!gfc_notify_std (GFC_STD_F2008, "double colon in "
6854 "MODULE PROCEDURE statement at %L", &old_locus))
6855 return MATCH_ERROR;
6857 else
6858 gfc_current_locus = old_locus;
6860 for(;;)
6862 m = gfc_match_name (name);
6863 if (m == MATCH_NO)
6864 goto syntax;
6865 else if (m == MATCH_ERROR)
6866 return m;
6867 if (gfc_get_symbol (name, gfc_current_ns->parent, &sym))
6868 return MATCH_ERROR;
6870 if (!gfc_add_interface (sym))
6871 return MATCH_ERROR;
6873 if (gfc_match_eos () == MATCH_YES)
6874 break;
6875 if (gfc_match_char (',') != MATCH_YES)
6876 goto syntax;
6879 return MATCH_YES;
6881 syntax:
6882 gfc_error ("Syntax error in PROCEDURE statement at %C");
6883 return MATCH_ERROR;
6887 /* General matcher for PROCEDURE declarations. */
6889 static match match_procedure_in_type (void);
6891 match
6892 gfc_match_procedure (void)
6894 match m;
6896 switch (gfc_current_state ())
6898 case COMP_NONE:
6899 case COMP_PROGRAM:
6900 case COMP_MODULE:
6901 case COMP_SUBMODULE:
6902 case COMP_SUBROUTINE:
6903 case COMP_FUNCTION:
6904 case COMP_BLOCK:
6905 m = match_procedure_decl ();
6906 break;
6907 case COMP_INTERFACE:
6908 m = match_procedure_in_interface ();
6909 break;
6910 case COMP_DERIVED:
6911 m = match_ppc_decl ();
6912 break;
6913 case COMP_DERIVED_CONTAINS:
6914 m = match_procedure_in_type ();
6915 break;
6916 default:
6917 return MATCH_NO;
6920 if (m != MATCH_YES)
6921 return m;
6923 if (!gfc_notify_std (GFC_STD_F2003, "PROCEDURE statement at %C"))
6924 return MATCH_ERROR;
6926 return m;
6930 /* Warn if a matched procedure has the same name as an intrinsic; this is
6931 simply a wrapper around gfc_warn_intrinsic_shadow that interprets the current
6932 parser-state-stack to find out whether we're in a module. */
6934 static void
6935 do_warn_intrinsic_shadow (const gfc_symbol* sym, bool func)
6937 bool in_module;
6939 in_module = (gfc_state_stack->previous
6940 && (gfc_state_stack->previous->state == COMP_MODULE
6941 || gfc_state_stack->previous->state == COMP_SUBMODULE));
6943 gfc_warn_intrinsic_shadow (sym, in_module, func);
6947 /* Match a function declaration. */
6949 match
6950 gfc_match_function_decl (void)
6952 char name[GFC_MAX_SYMBOL_LEN + 1];
6953 gfc_symbol *sym, *result;
6954 locus old_loc;
6955 match m;
6956 match suffix_match;
6957 match found_match; /* Status returned by match func. */
6959 if (gfc_current_state () != COMP_NONE
6960 && gfc_current_state () != COMP_INTERFACE
6961 && gfc_current_state () != COMP_CONTAINS)
6962 return MATCH_NO;
6964 gfc_clear_ts (&current_ts);
6966 old_loc = gfc_current_locus;
6968 m = gfc_match_prefix (&current_ts);
6969 if (m != MATCH_YES)
6971 gfc_current_locus = old_loc;
6972 return m;
6975 if (gfc_match ("function% %n", name) != MATCH_YES)
6977 gfc_current_locus = old_loc;
6978 return MATCH_NO;
6981 if (get_proc_name (name, &sym, false))
6982 return MATCH_ERROR;
6984 if (add_hidden_procptr_result (sym))
6985 sym = sym->result;
6987 if (current_attr.module_procedure)
6988 sym->attr.module_procedure = 1;
6990 gfc_new_block = sym;
6992 m = gfc_match_formal_arglist (sym, 0, 0);
6993 if (m == MATCH_NO)
6995 gfc_error ("Expected formal argument list in function "
6996 "definition at %C");
6997 m = MATCH_ERROR;
6998 goto cleanup;
7000 else if (m == MATCH_ERROR)
7001 goto cleanup;
7003 result = NULL;
7005 /* According to the draft, the bind(c) and result clause can
7006 come in either order after the formal_arg_list (i.e., either
7007 can be first, both can exist together or by themselves or neither
7008 one). Therefore, the match_result can't match the end of the
7009 string, and check for the bind(c) or result clause in either order. */
7010 found_match = gfc_match_eos ();
7012 /* Make sure that it isn't already declared as BIND(C). If it is, it
7013 must have been marked BIND(C) with a BIND(C) attribute and that is
7014 not allowed for procedures. */
7015 if (sym->attr.is_bind_c == 1)
7017 sym->attr.is_bind_c = 0;
7018 if (sym->old_symbol != NULL)
7019 gfc_error_now ("BIND(C) attribute at %L can only be used for "
7020 "variables or common blocks",
7021 &(sym->old_symbol->declared_at));
7022 else
7023 gfc_error_now ("BIND(C) attribute at %L can only be used for "
7024 "variables or common blocks", &gfc_current_locus);
7027 if (found_match != MATCH_YES)
7029 /* If we haven't found the end-of-statement, look for a suffix. */
7030 suffix_match = gfc_match_suffix (sym, &result);
7031 if (suffix_match == MATCH_YES)
7032 /* Need to get the eos now. */
7033 found_match = gfc_match_eos ();
7034 else
7035 found_match = suffix_match;
7038 if(found_match != MATCH_YES)
7039 m = MATCH_ERROR;
7040 else
7042 /* Make changes to the symbol. */
7043 m = MATCH_ERROR;
7045 if (!gfc_add_function (&sym->attr, sym->name, NULL))
7046 goto cleanup;
7048 if (!gfc_missing_attr (&sym->attr, NULL))
7049 goto cleanup;
7051 if (!copy_prefix (&sym->attr, &sym->declared_at))
7053 if(!sym->attr.module_procedure)
7054 goto cleanup;
7055 else
7056 gfc_error_check ();
7059 /* Delay matching the function characteristics until after the
7060 specification block by signalling kind=-1. */
7061 sym->declared_at = old_loc;
7062 if (current_ts.type != BT_UNKNOWN)
7063 current_ts.kind = -1;
7064 else
7065 current_ts.kind = 0;
7067 if (result == NULL)
7069 if (current_ts.type != BT_UNKNOWN
7070 && !gfc_add_type (sym, &current_ts, &gfc_current_locus))
7071 goto cleanup;
7072 sym->result = sym;
7074 else
7076 if (current_ts.type != BT_UNKNOWN
7077 && !gfc_add_type (result, &current_ts, &gfc_current_locus))
7078 goto cleanup;
7079 sym->result = result;
7082 /* Warn if this procedure has the same name as an intrinsic. */
7083 do_warn_intrinsic_shadow (sym, true);
7085 return MATCH_YES;
7088 cleanup:
7089 gfc_current_locus = old_loc;
7090 return m;
7094 /* This is mostly a copy of parse.c(add_global_procedure) but modified to
7095 pass the name of the entry, rather than the gfc_current_block name, and
7096 to return false upon finding an existing global entry. */
7098 static bool
7099 add_global_entry (const char *name, const char *binding_label, bool sub,
7100 locus *where)
7102 gfc_gsymbol *s;
7103 enum gfc_symbol_type type;
7105 type = sub ? GSYM_SUBROUTINE : GSYM_FUNCTION;
7107 /* Only in Fortran 2003: For procedures with a binding label also the Fortran
7108 name is a global identifier. */
7109 if (!binding_label || gfc_notification_std (GFC_STD_F2008))
7111 s = gfc_get_gsymbol (name);
7113 if (s->defined || (s->type != GSYM_UNKNOWN && s->type != type))
7115 gfc_global_used (s, where);
7116 return false;
7118 else
7120 s->type = type;
7121 s->sym_name = name;
7122 s->where = *where;
7123 s->defined = 1;
7124 s->ns = gfc_current_ns;
7128 /* Don't add the symbol multiple times. */
7129 if (binding_label
7130 && (!gfc_notification_std (GFC_STD_F2008)
7131 || strcmp (name, binding_label) != 0))
7133 s = gfc_get_gsymbol (binding_label);
7135 if (s->defined || (s->type != GSYM_UNKNOWN && s->type != type))
7137 gfc_global_used (s, where);
7138 return false;
7140 else
7142 s->type = type;
7143 s->sym_name = name;
7144 s->binding_label = binding_label;
7145 s->where = *where;
7146 s->defined = 1;
7147 s->ns = gfc_current_ns;
7151 return true;
7155 /* Match an ENTRY statement. */
7157 match
7158 gfc_match_entry (void)
7160 gfc_symbol *proc;
7161 gfc_symbol *result;
7162 gfc_symbol *entry;
7163 char name[GFC_MAX_SYMBOL_LEN + 1];
7164 gfc_compile_state state;
7165 match m;
7166 gfc_entry_list *el;
7167 locus old_loc;
7168 bool module_procedure;
7169 char peek_char;
7170 match is_bind_c;
7172 m = gfc_match_name (name);
7173 if (m != MATCH_YES)
7174 return m;
7176 if (!gfc_notify_std (GFC_STD_F2008_OBS, "ENTRY statement at %C"))
7177 return MATCH_ERROR;
7179 state = gfc_current_state ();
7180 if (state != COMP_SUBROUTINE && state != COMP_FUNCTION)
7182 switch (state)
7184 case COMP_PROGRAM:
7185 gfc_error ("ENTRY statement at %C cannot appear within a PROGRAM");
7186 break;
7187 case COMP_MODULE:
7188 gfc_error ("ENTRY statement at %C cannot appear within a MODULE");
7189 break;
7190 case COMP_SUBMODULE:
7191 gfc_error ("ENTRY statement at %C cannot appear within a SUBMODULE");
7192 break;
7193 case COMP_BLOCK_DATA:
7194 gfc_error ("ENTRY statement at %C cannot appear within "
7195 "a BLOCK DATA");
7196 break;
7197 case COMP_INTERFACE:
7198 gfc_error ("ENTRY statement at %C cannot appear within "
7199 "an INTERFACE");
7200 break;
7201 case COMP_STRUCTURE:
7202 gfc_error ("ENTRY statement at %C cannot appear within "
7203 "a STRUCTURE block");
7204 break;
7205 case COMP_DERIVED:
7206 gfc_error ("ENTRY statement at %C cannot appear within "
7207 "a DERIVED TYPE block");
7208 break;
7209 case COMP_IF:
7210 gfc_error ("ENTRY statement at %C cannot appear within "
7211 "an IF-THEN block");
7212 break;
7213 case COMP_DO:
7214 case COMP_DO_CONCURRENT:
7215 gfc_error ("ENTRY statement at %C cannot appear within "
7216 "a DO block");
7217 break;
7218 case COMP_SELECT:
7219 gfc_error ("ENTRY statement at %C cannot appear within "
7220 "a SELECT block");
7221 break;
7222 case COMP_FORALL:
7223 gfc_error ("ENTRY statement at %C cannot appear within "
7224 "a FORALL block");
7225 break;
7226 case COMP_WHERE:
7227 gfc_error ("ENTRY statement at %C cannot appear within "
7228 "a WHERE block");
7229 break;
7230 case COMP_CONTAINS:
7231 gfc_error ("ENTRY statement at %C cannot appear within "
7232 "a contained subprogram");
7233 break;
7234 default:
7235 gfc_error ("Unexpected ENTRY statement at %C");
7237 return MATCH_ERROR;
7240 if ((state == COMP_SUBROUTINE || state == COMP_FUNCTION)
7241 && gfc_state_stack->previous->state == COMP_INTERFACE)
7243 gfc_error ("ENTRY statement at %C cannot appear within an INTERFACE");
7244 return MATCH_ERROR;
7247 module_procedure = gfc_current_ns->parent != NULL
7248 && gfc_current_ns->parent->proc_name
7249 && gfc_current_ns->parent->proc_name->attr.flavor
7250 == FL_MODULE;
7252 if (gfc_current_ns->parent != NULL
7253 && gfc_current_ns->parent->proc_name
7254 && !module_procedure)
7256 gfc_error("ENTRY statement at %C cannot appear in a "
7257 "contained procedure");
7258 return MATCH_ERROR;
7261 /* Module function entries need special care in get_proc_name
7262 because previous references within the function will have
7263 created symbols attached to the current namespace. */
7264 if (get_proc_name (name, &entry,
7265 gfc_current_ns->parent != NULL
7266 && module_procedure))
7267 return MATCH_ERROR;
7269 proc = gfc_current_block ();
7271 /* Make sure that it isn't already declared as BIND(C). If it is, it
7272 must have been marked BIND(C) with a BIND(C) attribute and that is
7273 not allowed for procedures. */
7274 if (entry->attr.is_bind_c == 1)
7276 entry->attr.is_bind_c = 0;
7277 if (entry->old_symbol != NULL)
7278 gfc_error_now ("BIND(C) attribute at %L can only be used for "
7279 "variables or common blocks",
7280 &(entry->old_symbol->declared_at));
7281 else
7282 gfc_error_now ("BIND(C) attribute at %L can only be used for "
7283 "variables or common blocks", &gfc_current_locus);
7286 /* Check what next non-whitespace character is so we can tell if there
7287 is the required parens if we have a BIND(C). */
7288 old_loc = gfc_current_locus;
7289 gfc_gobble_whitespace ();
7290 peek_char = gfc_peek_ascii_char ();
7292 if (state == COMP_SUBROUTINE)
7294 m = gfc_match_formal_arglist (entry, 0, 1);
7295 if (m != MATCH_YES)
7296 return MATCH_ERROR;
7298 /* Call gfc_match_bind_c with allow_binding_name = true as ENTRY can
7299 never be an internal procedure. */
7300 is_bind_c = gfc_match_bind_c (entry, true);
7301 if (is_bind_c == MATCH_ERROR)
7302 return MATCH_ERROR;
7303 if (is_bind_c == MATCH_YES)
7305 if (peek_char != '(')
7307 gfc_error ("Missing required parentheses before BIND(C) at %C");
7308 return MATCH_ERROR;
7310 if (!gfc_add_is_bind_c (&(entry->attr), entry->name,
7311 &(entry->declared_at), 1))
7312 return MATCH_ERROR;
7315 if (!gfc_current_ns->parent
7316 && !add_global_entry (name, entry->binding_label, true,
7317 &old_loc))
7318 return MATCH_ERROR;
7320 /* An entry in a subroutine. */
7321 if (!gfc_add_entry (&entry->attr, entry->name, NULL)
7322 || !gfc_add_subroutine (&entry->attr, entry->name, NULL))
7323 return MATCH_ERROR;
7325 else
7327 /* An entry in a function.
7328 We need to take special care because writing
7329 ENTRY f()
7331 ENTRY f
7332 is allowed, whereas
7333 ENTRY f() RESULT (r)
7334 can't be written as
7335 ENTRY f RESULT (r). */
7336 if (gfc_match_eos () == MATCH_YES)
7338 gfc_current_locus = old_loc;
7339 /* Match the empty argument list, and add the interface to
7340 the symbol. */
7341 m = gfc_match_formal_arglist (entry, 0, 1);
7343 else
7344 m = gfc_match_formal_arglist (entry, 0, 0);
7346 if (m != MATCH_YES)
7347 return MATCH_ERROR;
7349 result = NULL;
7351 if (gfc_match_eos () == MATCH_YES)
7353 if (!gfc_add_entry (&entry->attr, entry->name, NULL)
7354 || !gfc_add_function (&entry->attr, entry->name, NULL))
7355 return MATCH_ERROR;
7357 entry->result = entry;
7359 else
7361 m = gfc_match_suffix (entry, &result);
7362 if (m == MATCH_NO)
7363 gfc_syntax_error (ST_ENTRY);
7364 if (m != MATCH_YES)
7365 return MATCH_ERROR;
7367 if (result)
7369 if (!gfc_add_result (&result->attr, result->name, NULL)
7370 || !gfc_add_entry (&entry->attr, result->name, NULL)
7371 || !gfc_add_function (&entry->attr, result->name, NULL))
7372 return MATCH_ERROR;
7373 entry->result = result;
7375 else
7377 if (!gfc_add_entry (&entry->attr, entry->name, NULL)
7378 || !gfc_add_function (&entry->attr, entry->name, NULL))
7379 return MATCH_ERROR;
7380 entry->result = entry;
7384 if (!gfc_current_ns->parent
7385 && !add_global_entry (name, entry->binding_label, false,
7386 &old_loc))
7387 return MATCH_ERROR;
7390 if (gfc_match_eos () != MATCH_YES)
7392 gfc_syntax_error (ST_ENTRY);
7393 return MATCH_ERROR;
7396 entry->attr.recursive = proc->attr.recursive;
7397 entry->attr.elemental = proc->attr.elemental;
7398 entry->attr.pure = proc->attr.pure;
7400 el = gfc_get_entry_list ();
7401 el->sym = entry;
7402 el->next = gfc_current_ns->entries;
7403 gfc_current_ns->entries = el;
7404 if (el->next)
7405 el->id = el->next->id + 1;
7406 else
7407 el->id = 1;
7409 new_st.op = EXEC_ENTRY;
7410 new_st.ext.entry = el;
7412 return MATCH_YES;
7416 /* Match a subroutine statement, including optional prefixes. */
7418 match
7419 gfc_match_subroutine (void)
7421 char name[GFC_MAX_SYMBOL_LEN + 1];
7422 gfc_symbol *sym;
7423 match m;
7424 match is_bind_c;
7425 char peek_char;
7426 bool allow_binding_name;
7428 if (gfc_current_state () != COMP_NONE
7429 && gfc_current_state () != COMP_INTERFACE
7430 && gfc_current_state () != COMP_CONTAINS)
7431 return MATCH_NO;
7433 m = gfc_match_prefix (NULL);
7434 if (m != MATCH_YES)
7435 return m;
7437 m = gfc_match ("subroutine% %n", name);
7438 if (m != MATCH_YES)
7439 return m;
7441 if (get_proc_name (name, &sym, false))
7442 return MATCH_ERROR;
7444 /* Set declared_at as it might point to, e.g., a PUBLIC statement, if
7445 the symbol existed before. */
7446 sym->declared_at = gfc_current_locus;
7448 if (current_attr.module_procedure)
7449 sym->attr.module_procedure = 1;
7451 if (add_hidden_procptr_result (sym))
7452 sym = sym->result;
7454 gfc_new_block = sym;
7456 /* Check what next non-whitespace character is so we can tell if there
7457 is the required parens if we have a BIND(C). */
7458 gfc_gobble_whitespace ();
7459 peek_char = gfc_peek_ascii_char ();
7461 if (!gfc_add_subroutine (&sym->attr, sym->name, NULL))
7462 return MATCH_ERROR;
7464 if (gfc_match_formal_arglist (sym, 0, 1) != MATCH_YES)
7465 return MATCH_ERROR;
7467 /* Make sure that it isn't already declared as BIND(C). If it is, it
7468 must have been marked BIND(C) with a BIND(C) attribute and that is
7469 not allowed for procedures. */
7470 if (sym->attr.is_bind_c == 1)
7472 sym->attr.is_bind_c = 0;
7473 if (sym->old_symbol != NULL)
7474 gfc_error_now ("BIND(C) attribute at %L can only be used for "
7475 "variables or common blocks",
7476 &(sym->old_symbol->declared_at));
7477 else
7478 gfc_error_now ("BIND(C) attribute at %L can only be used for "
7479 "variables or common blocks", &gfc_current_locus);
7482 /* C binding names are not allowed for internal procedures. */
7483 if (gfc_current_state () == COMP_CONTAINS
7484 && sym->ns->proc_name->attr.flavor != FL_MODULE)
7485 allow_binding_name = false;
7486 else
7487 allow_binding_name = true;
7489 /* Here, we are just checking if it has the bind(c) attribute, and if
7490 so, then we need to make sure it's all correct. If it doesn't,
7491 we still need to continue matching the rest of the subroutine line. */
7492 is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
7493 if (is_bind_c == MATCH_ERROR)
7495 /* There was an attempt at the bind(c), but it was wrong. An
7496 error message should have been printed w/in the gfc_match_bind_c
7497 so here we'll just return the MATCH_ERROR. */
7498 return MATCH_ERROR;
7501 if (is_bind_c == MATCH_YES)
7503 /* The following is allowed in the Fortran 2008 draft. */
7504 if (gfc_current_state () == COMP_CONTAINS
7505 && sym->ns->proc_name->attr.flavor != FL_MODULE
7506 && !gfc_notify_std (GFC_STD_F2008, "BIND(C) attribute "
7507 "at %L may not be specified for an internal "
7508 "procedure", &gfc_current_locus))
7509 return MATCH_ERROR;
7511 if (peek_char != '(')
7513 gfc_error ("Missing required parentheses before BIND(C) at %C");
7514 return MATCH_ERROR;
7516 if (!gfc_add_is_bind_c (&(sym->attr), sym->name,
7517 &(sym->declared_at), 1))
7518 return MATCH_ERROR;
7521 if (gfc_match_eos () != MATCH_YES)
7523 gfc_syntax_error (ST_SUBROUTINE);
7524 return MATCH_ERROR;
7527 if (!copy_prefix (&sym->attr, &sym->declared_at))
7529 if(!sym->attr.module_procedure)
7530 return MATCH_ERROR;
7531 else
7532 gfc_error_check ();
7535 /* Warn if it has the same name as an intrinsic. */
7536 do_warn_intrinsic_shadow (sym, false);
7538 return MATCH_YES;
7542 /* Check that the NAME identifier in a BIND attribute or statement
7543 is conform to C identifier rules. */
7545 match
7546 check_bind_name_identifier (char **name)
7548 char *n = *name, *p;
7550 /* Remove leading spaces. */
7551 while (*n == ' ')
7552 n++;
7554 /* On an empty string, free memory and set name to NULL. */
7555 if (*n == '\0')
7557 free (*name);
7558 *name = NULL;
7559 return MATCH_YES;
7562 /* Remove trailing spaces. */
7563 p = n + strlen(n) - 1;
7564 while (*p == ' ')
7565 *(p--) = '\0';
7567 /* Insert the identifier into the symbol table. */
7568 p = xstrdup (n);
7569 free (*name);
7570 *name = p;
7572 /* Now check that identifier is valid under C rules. */
7573 if (ISDIGIT (*p))
7575 gfc_error ("Invalid C identifier in NAME= specifier at %C");
7576 return MATCH_ERROR;
7579 for (; *p; p++)
7580 if (!(ISALNUM (*p) || *p == '_' || *p == '$'))
7582 gfc_error ("Invalid C identifier in NAME= specifier at %C");
7583 return MATCH_ERROR;
7586 return MATCH_YES;
7590 /* Match a BIND(C) specifier, with the optional 'name=' specifier if
7591 given, and set the binding label in either the given symbol (if not
7592 NULL), or in the current_ts. The symbol may be NULL because we may
7593 encounter the BIND(C) before the declaration itself. Return
7594 MATCH_NO if what we're looking at isn't a BIND(C) specifier,
7595 MATCH_ERROR if it is a BIND(C) clause but an error was encountered,
7596 or MATCH_YES if the specifier was correct and the binding label and
7597 bind(c) fields were set correctly for the given symbol or the
7598 current_ts. If allow_binding_name is false, no binding name may be
7599 given. */
7601 match
7602 gfc_match_bind_c (gfc_symbol *sym, bool allow_binding_name)
7604 char *binding_label = NULL;
7605 gfc_expr *e = NULL;
7607 /* Initialize the flag that specifies whether we encountered a NAME=
7608 specifier or not. */
7609 has_name_equals = 0;
7611 /* This much we have to be able to match, in this order, if
7612 there is a bind(c) label. */
7613 if (gfc_match (" bind ( c ") != MATCH_YES)
7614 return MATCH_NO;
7616 /* Now see if there is a binding label, or if we've reached the
7617 end of the bind(c) attribute without one. */
7618 if (gfc_match_char (',') == MATCH_YES)
7620 if (gfc_match (" name = ") != MATCH_YES)
7622 gfc_error ("Syntax error in NAME= specifier for binding label "
7623 "at %C");
7624 /* should give an error message here */
7625 return MATCH_ERROR;
7628 has_name_equals = 1;
7630 if (gfc_match_init_expr (&e) != MATCH_YES)
7632 gfc_free_expr (e);
7633 return MATCH_ERROR;
7636 if (!gfc_simplify_expr(e, 0))
7638 gfc_error ("NAME= specifier at %C should be a constant expression");
7639 gfc_free_expr (e);
7640 return MATCH_ERROR;
7643 if (e->expr_type != EXPR_CONSTANT || e->ts.type != BT_CHARACTER
7644 || e->ts.kind != gfc_default_character_kind || e->rank != 0)
7646 gfc_error ("NAME= specifier at %C should be a scalar of "
7647 "default character kind");
7648 gfc_free_expr(e);
7649 return MATCH_ERROR;
7652 // Get a C string from the Fortran string constant
7653 binding_label = gfc_widechar_to_char (e->value.character.string,
7654 e->value.character.length);
7655 gfc_free_expr(e);
7657 // Check that it is valid (old gfc_match_name_C)
7658 if (check_bind_name_identifier (&binding_label) != MATCH_YES)
7659 return MATCH_ERROR;
7662 /* Get the required right paren. */
7663 if (gfc_match_char (')') != MATCH_YES)
7665 gfc_error ("Missing closing paren for binding label at %C");
7666 return MATCH_ERROR;
7669 if (has_name_equals && !allow_binding_name)
7671 gfc_error ("No binding name is allowed in BIND(C) at %C");
7672 return MATCH_ERROR;
7675 if (has_name_equals && sym != NULL && sym->attr.dummy)
7677 gfc_error ("For dummy procedure %s, no binding name is "
7678 "allowed in BIND(C) at %C", sym->name);
7679 return MATCH_ERROR;
7683 /* Save the binding label to the symbol. If sym is null, we're
7684 probably matching the typespec attributes of a declaration and
7685 haven't gotten the name yet, and therefore, no symbol yet. */
7686 if (binding_label)
7688 if (sym != NULL)
7689 sym->binding_label = binding_label;
7690 else
7691 curr_binding_label = binding_label;
7693 else if (allow_binding_name)
7695 /* No binding label, but if symbol isn't null, we
7696 can set the label for it here.
7697 If name="" or allow_binding_name is false, no C binding name is
7698 created. */
7699 if (sym != NULL && sym->name != NULL && has_name_equals == 0)
7700 sym->binding_label = IDENTIFIER_POINTER (get_identifier (sym->name));
7703 if (has_name_equals && gfc_current_state () == COMP_INTERFACE
7704 && current_interface.type == INTERFACE_ABSTRACT)
7706 gfc_error ("NAME not allowed on BIND(C) for ABSTRACT INTERFACE at %C");
7707 return MATCH_ERROR;
7710 return MATCH_YES;
7714 /* Return nonzero if we're currently compiling a contained procedure. */
7716 static int
7717 contained_procedure (void)
7719 gfc_state_data *s = gfc_state_stack;
7721 if ((s->state == COMP_SUBROUTINE || s->state == COMP_FUNCTION)
7722 && s->previous != NULL && s->previous->state == COMP_CONTAINS)
7723 return 1;
7725 return 0;
7728 /* Set the kind of each enumerator. The kind is selected such that it is
7729 interoperable with the corresponding C enumeration type, making
7730 sure that -fshort-enums is honored. */
7732 static void
7733 set_enum_kind(void)
7735 enumerator_history *current_history = NULL;
7736 int kind;
7737 int i;
7739 if (max_enum == NULL || enum_history == NULL)
7740 return;
7742 if (!flag_short_enums)
7743 return;
7745 i = 0;
7748 kind = gfc_integer_kinds[i++].kind;
7750 while (kind < gfc_c_int_kind
7751 && gfc_check_integer_range (max_enum->initializer->value.integer,
7752 kind) != ARITH_OK);
7754 current_history = enum_history;
7755 while (current_history != NULL)
7757 current_history->sym->ts.kind = kind;
7758 current_history = current_history->next;
7763 /* Match any of the various end-block statements. Returns the type of
7764 END to the caller. The END INTERFACE, END IF, END DO, END SELECT
7765 and END BLOCK statements cannot be replaced by a single END statement. */
7767 match
7768 gfc_match_end (gfc_statement *st)
7770 char name[GFC_MAX_SYMBOL_LEN + 1];
7771 gfc_compile_state state;
7772 locus old_loc;
7773 const char *block_name;
7774 const char *target;
7775 int eos_ok;
7776 match m;
7777 gfc_namespace *parent_ns, *ns, *prev_ns;
7778 gfc_namespace **nsp;
7779 bool abreviated_modproc_decl = false;
7780 bool got_matching_end = false;
7782 old_loc = gfc_current_locus;
7783 if (gfc_match ("end") != MATCH_YES)
7784 return MATCH_NO;
7786 state = gfc_current_state ();
7787 block_name = gfc_current_block () == NULL
7788 ? NULL : gfc_current_block ()->name;
7790 switch (state)
7792 case COMP_ASSOCIATE:
7793 case COMP_BLOCK:
7794 if (!strncmp (block_name, "block@", strlen("block@")))
7795 block_name = NULL;
7796 break;
7798 case COMP_CONTAINS:
7799 case COMP_DERIVED_CONTAINS:
7800 state = gfc_state_stack->previous->state;
7801 block_name = gfc_state_stack->previous->sym == NULL
7802 ? NULL : gfc_state_stack->previous->sym->name;
7803 abreviated_modproc_decl = gfc_state_stack->previous->sym
7804 && gfc_state_stack->previous->sym->abr_modproc_decl;
7805 break;
7807 default:
7808 break;
7811 if (!abreviated_modproc_decl)
7812 abreviated_modproc_decl = gfc_current_block ()
7813 && gfc_current_block ()->abr_modproc_decl;
7815 switch (state)
7817 case COMP_NONE:
7818 case COMP_PROGRAM:
7819 *st = ST_END_PROGRAM;
7820 target = " program";
7821 eos_ok = 1;
7822 break;
7824 case COMP_SUBROUTINE:
7825 *st = ST_END_SUBROUTINE;
7826 if (!abreviated_modproc_decl)
7827 target = " subroutine";
7828 else
7829 target = " procedure";
7830 eos_ok = !contained_procedure ();
7831 break;
7833 case COMP_FUNCTION:
7834 *st = ST_END_FUNCTION;
7835 if (!abreviated_modproc_decl)
7836 target = " function";
7837 else
7838 target = " procedure";
7839 eos_ok = !contained_procedure ();
7840 break;
7842 case COMP_BLOCK_DATA:
7843 *st = ST_END_BLOCK_DATA;
7844 target = " block data";
7845 eos_ok = 1;
7846 break;
7848 case COMP_MODULE:
7849 *st = ST_END_MODULE;
7850 target = " module";
7851 eos_ok = 1;
7852 break;
7854 case COMP_SUBMODULE:
7855 *st = ST_END_SUBMODULE;
7856 target = " submodule";
7857 eos_ok = 1;
7858 break;
7860 case COMP_INTERFACE:
7861 *st = ST_END_INTERFACE;
7862 target = " interface";
7863 eos_ok = 0;
7864 break;
7866 case COMP_MAP:
7867 *st = ST_END_MAP;
7868 target = " map";
7869 eos_ok = 0;
7870 break;
7872 case COMP_UNION:
7873 *st = ST_END_UNION;
7874 target = " union";
7875 eos_ok = 0;
7876 break;
7878 case COMP_STRUCTURE:
7879 *st = ST_END_STRUCTURE;
7880 target = " structure";
7881 eos_ok = 0;
7882 break;
7884 case COMP_DERIVED:
7885 case COMP_DERIVED_CONTAINS:
7886 *st = ST_END_TYPE;
7887 target = " type";
7888 eos_ok = 0;
7889 break;
7891 case COMP_ASSOCIATE:
7892 *st = ST_END_ASSOCIATE;
7893 target = " associate";
7894 eos_ok = 0;
7895 break;
7897 case COMP_BLOCK:
7898 *st = ST_END_BLOCK;
7899 target = " block";
7900 eos_ok = 0;
7901 break;
7903 case COMP_IF:
7904 *st = ST_ENDIF;
7905 target = " if";
7906 eos_ok = 0;
7907 break;
7909 case COMP_DO:
7910 case COMP_DO_CONCURRENT:
7911 *st = ST_ENDDO;
7912 target = " do";
7913 eos_ok = 0;
7914 break;
7916 case COMP_CRITICAL:
7917 *st = ST_END_CRITICAL;
7918 target = " critical";
7919 eos_ok = 0;
7920 break;
7922 case COMP_SELECT:
7923 case COMP_SELECT_TYPE:
7924 *st = ST_END_SELECT;
7925 target = " select";
7926 eos_ok = 0;
7927 break;
7929 case COMP_FORALL:
7930 *st = ST_END_FORALL;
7931 target = " forall";
7932 eos_ok = 0;
7933 break;
7935 case COMP_WHERE:
7936 *st = ST_END_WHERE;
7937 target = " where";
7938 eos_ok = 0;
7939 break;
7941 case COMP_ENUM:
7942 *st = ST_END_ENUM;
7943 target = " enum";
7944 eos_ok = 0;
7945 last_initializer = NULL;
7946 set_enum_kind ();
7947 gfc_free_enum_history ();
7948 break;
7950 default:
7951 gfc_error ("Unexpected END statement at %C");
7952 goto cleanup;
7955 old_loc = gfc_current_locus;
7956 if (gfc_match_eos () == MATCH_YES)
7958 if (!eos_ok && (*st == ST_END_SUBROUTINE || *st == ST_END_FUNCTION))
7960 if (!gfc_notify_std (GFC_STD_F2008, "END statement "
7961 "instead of %s statement at %L",
7962 abreviated_modproc_decl ? "END PROCEDURE"
7963 : gfc_ascii_statement(*st), &old_loc))
7964 goto cleanup;
7966 else if (!eos_ok)
7968 /* We would have required END [something]. */
7969 gfc_error ("%s statement expected at %L",
7970 gfc_ascii_statement (*st), &old_loc);
7971 goto cleanup;
7974 return MATCH_YES;
7977 /* Verify that we've got the sort of end-block that we're expecting. */
7978 if (gfc_match (target) != MATCH_YES)
7980 gfc_error ("Expecting %s statement at %L", abreviated_modproc_decl
7981 ? "END PROCEDURE" : gfc_ascii_statement(*st), &old_loc);
7982 goto cleanup;
7984 else
7985 got_matching_end = true;
7987 old_loc = gfc_current_locus;
7988 /* If we're at the end, make sure a block name wasn't required. */
7989 if (gfc_match_eos () == MATCH_YES)
7992 if (*st != ST_ENDDO && *st != ST_ENDIF && *st != ST_END_SELECT
7993 && *st != ST_END_FORALL && *st != ST_END_WHERE && *st != ST_END_BLOCK
7994 && *st != ST_END_ASSOCIATE && *st != ST_END_CRITICAL)
7995 return MATCH_YES;
7997 if (!block_name)
7998 return MATCH_YES;
8000 gfc_error ("Expected block name of %qs in %s statement at %L",
8001 block_name, gfc_ascii_statement (*st), &old_loc);
8003 return MATCH_ERROR;
8006 /* END INTERFACE has a special handler for its several possible endings. */
8007 if (*st == ST_END_INTERFACE)
8008 return gfc_match_end_interface ();
8010 /* We haven't hit the end of statement, so what is left must be an
8011 end-name. */
8012 m = gfc_match_space ();
8013 if (m == MATCH_YES)
8014 m = gfc_match_name (name);
8016 if (m == MATCH_NO)
8017 gfc_error ("Expected terminating name at %C");
8018 if (m != MATCH_YES)
8019 goto cleanup;
8021 if (block_name == NULL)
8022 goto syntax;
8024 /* We have to pick out the declared submodule name from the composite
8025 required by F2008:11.2.3 para 2, which ends in the declared name. */
8026 if (state == COMP_SUBMODULE)
8027 block_name = strchr (block_name, '.') + 1;
8029 if (strcmp (name, block_name) != 0 && strcmp (block_name, "ppr@") != 0)
8031 gfc_error ("Expected label %qs for %s statement at %C", block_name,
8032 gfc_ascii_statement (*st));
8033 goto cleanup;
8035 /* Procedure pointer as function result. */
8036 else if (strcmp (block_name, "ppr@") == 0
8037 && strcmp (name, gfc_current_block ()->ns->proc_name->name) != 0)
8039 gfc_error ("Expected label %qs for %s statement at %C",
8040 gfc_current_block ()->ns->proc_name->name,
8041 gfc_ascii_statement (*st));
8042 goto cleanup;
8045 if (gfc_match_eos () == MATCH_YES)
8046 return MATCH_YES;
8048 syntax:
8049 gfc_syntax_error (*st);
8051 cleanup:
8052 gfc_current_locus = old_loc;
8054 /* If we are missing an END BLOCK, we created a half-ready namespace.
8055 Remove it from the parent namespace's sibling list. */
8057 while (state == COMP_BLOCK && !got_matching_end)
8059 parent_ns = gfc_current_ns->parent;
8061 nsp = &(gfc_state_stack->previous->tail->ext.block.ns);
8063 prev_ns = NULL;
8064 ns = *nsp;
8065 while (ns)
8067 if (ns == gfc_current_ns)
8069 if (prev_ns == NULL)
8070 *nsp = NULL;
8071 else
8072 prev_ns->sibling = ns->sibling;
8074 prev_ns = ns;
8075 ns = ns->sibling;
8078 gfc_free_namespace (gfc_current_ns);
8079 gfc_current_ns = parent_ns;
8080 gfc_state_stack = gfc_state_stack->previous;
8081 state = gfc_current_state ();
8084 return MATCH_ERROR;
8089 /***************** Attribute declaration statements ****************/
8091 /* Set the attribute of a single variable. */
8093 static match
8094 attr_decl1 (void)
8096 char name[GFC_MAX_SYMBOL_LEN + 1];
8097 gfc_array_spec *as;
8099 /* Workaround -Wmaybe-uninitialized false positive during
8100 profiledbootstrap by initializing them. */
8101 gfc_symbol *sym = NULL;
8102 locus var_locus;
8103 match m;
8105 as = NULL;
8107 m = gfc_match_name (name);
8108 if (m != MATCH_YES)
8109 goto cleanup;
8111 if (find_special (name, &sym, false))
8112 return MATCH_ERROR;
8114 if (!check_function_name (name))
8116 m = MATCH_ERROR;
8117 goto cleanup;
8120 var_locus = gfc_current_locus;
8122 /* Deal with possible array specification for certain attributes. */
8123 if (current_attr.dimension
8124 || current_attr.codimension
8125 || current_attr.allocatable
8126 || current_attr.pointer
8127 || current_attr.target)
8129 m = gfc_match_array_spec (&as, !current_attr.codimension,
8130 !current_attr.dimension
8131 && !current_attr.pointer
8132 && !current_attr.target);
8133 if (m == MATCH_ERROR)
8134 goto cleanup;
8136 if (current_attr.dimension && m == MATCH_NO)
8138 gfc_error ("Missing array specification at %L in DIMENSION "
8139 "statement", &var_locus);
8140 m = MATCH_ERROR;
8141 goto cleanup;
8144 if (current_attr.dimension && sym->value)
8146 gfc_error ("Dimensions specified for %s at %L after its "
8147 "initialization", sym->name, &var_locus);
8148 m = MATCH_ERROR;
8149 goto cleanup;
8152 if (current_attr.codimension && m == MATCH_NO)
8154 gfc_error ("Missing array specification at %L in CODIMENSION "
8155 "statement", &var_locus);
8156 m = MATCH_ERROR;
8157 goto cleanup;
8160 if ((current_attr.allocatable || current_attr.pointer)
8161 && (m == MATCH_YES) && (as->type != AS_DEFERRED))
8163 gfc_error ("Array specification must be deferred at %L", &var_locus);
8164 m = MATCH_ERROR;
8165 goto cleanup;
8169 /* Update symbol table. DIMENSION attribute is set in
8170 gfc_set_array_spec(). For CLASS variables, this must be applied
8171 to the first component, or '_data' field. */
8172 if (sym->ts.type == BT_CLASS && sym->ts.u.derived->attr.is_class)
8174 if (!gfc_copy_attr (&CLASS_DATA(sym)->attr, &current_attr, &var_locus))
8176 m = MATCH_ERROR;
8177 goto cleanup;
8180 else
8182 if (current_attr.dimension == 0 && current_attr.codimension == 0
8183 && !gfc_copy_attr (&sym->attr, &current_attr, &var_locus))
8185 m = MATCH_ERROR;
8186 goto cleanup;
8190 if (sym->ts.type == BT_CLASS
8191 && !gfc_build_class_symbol (&sym->ts, &sym->attr, &sym->as))
8193 m = MATCH_ERROR;
8194 goto cleanup;
8197 if (!gfc_set_array_spec (sym, as, &var_locus))
8199 m = MATCH_ERROR;
8200 goto cleanup;
8203 if (sym->attr.cray_pointee && sym->as != NULL)
8205 /* Fix the array spec. */
8206 m = gfc_mod_pointee_as (sym->as);
8207 if (m == MATCH_ERROR)
8208 goto cleanup;
8211 if (!gfc_add_attribute (&sym->attr, &var_locus))
8213 m = MATCH_ERROR;
8214 goto cleanup;
8217 if ((current_attr.external || current_attr.intrinsic)
8218 && sym->attr.flavor != FL_PROCEDURE
8219 && !gfc_add_flavor (&sym->attr, FL_PROCEDURE, sym->name, NULL))
8221 m = MATCH_ERROR;
8222 goto cleanup;
8225 add_hidden_procptr_result (sym);
8227 return MATCH_YES;
8229 cleanup:
8230 gfc_free_array_spec (as);
8231 return m;
8235 /* Generic attribute declaration subroutine. Used for attributes that
8236 just have a list of names. */
8238 static match
8239 attr_decl (void)
8241 match m;
8243 /* Gobble the optional double colon, by simply ignoring the result
8244 of gfc_match(). */
8245 gfc_match (" ::");
8247 for (;;)
8249 m = attr_decl1 ();
8250 if (m != MATCH_YES)
8251 break;
8253 if (gfc_match_eos () == MATCH_YES)
8255 m = MATCH_YES;
8256 break;
8259 if (gfc_match_char (',') != MATCH_YES)
8261 gfc_error ("Unexpected character in variable list at %C");
8262 m = MATCH_ERROR;
8263 break;
8267 return m;
8271 /* This routine matches Cray Pointer declarations of the form:
8272 pointer ( <pointer>, <pointee> )
8274 pointer ( <pointer1>, <pointee1> ), ( <pointer2>, <pointee2> ), ...
8275 The pointer, if already declared, should be an integer. Otherwise, we
8276 set it as BT_INTEGER with kind gfc_index_integer_kind. The pointee may
8277 be either a scalar, or an array declaration. No space is allocated for
8278 the pointee. For the statement
8279 pointer (ipt, ar(10))
8280 any subsequent uses of ar will be translated (in C-notation) as
8281 ar(i) => ((<type> *) ipt)(i)
8282 After gimplification, pointee variable will disappear in the code. */
8284 static match
8285 cray_pointer_decl (void)
8287 match m;
8288 gfc_array_spec *as = NULL;
8289 gfc_symbol *cptr; /* Pointer symbol. */
8290 gfc_symbol *cpte; /* Pointee symbol. */
8291 locus var_locus;
8292 bool done = false;
8294 while (!done)
8296 if (gfc_match_char ('(') != MATCH_YES)
8298 gfc_error ("Expected %<(%> at %C");
8299 return MATCH_ERROR;
8302 /* Match pointer. */
8303 var_locus = gfc_current_locus;
8304 gfc_clear_attr (&current_attr);
8305 gfc_add_cray_pointer (&current_attr, &var_locus);
8306 current_ts.type = BT_INTEGER;
8307 current_ts.kind = gfc_index_integer_kind;
8309 m = gfc_match_symbol (&cptr, 0);
8310 if (m != MATCH_YES)
8312 gfc_error ("Expected variable name at %C");
8313 return m;
8316 if (!gfc_add_cray_pointer (&cptr->attr, &var_locus))
8317 return MATCH_ERROR;
8319 gfc_set_sym_referenced (cptr);
8321 if (cptr->ts.type == BT_UNKNOWN) /* Override the type, if necessary. */
8323 cptr->ts.type = BT_INTEGER;
8324 cptr->ts.kind = gfc_index_integer_kind;
8326 else if (cptr->ts.type != BT_INTEGER)
8328 gfc_error ("Cray pointer at %C must be an integer");
8329 return MATCH_ERROR;
8331 else if (cptr->ts.kind < gfc_index_integer_kind)
8332 gfc_warning (0, "Cray pointer at %C has %d bytes of precision;"
8333 " memory addresses require %d bytes",
8334 cptr->ts.kind, gfc_index_integer_kind);
8336 if (gfc_match_char (',') != MATCH_YES)
8338 gfc_error ("Expected \",\" at %C");
8339 return MATCH_ERROR;
8342 /* Match Pointee. */
8343 var_locus = gfc_current_locus;
8344 gfc_clear_attr (&current_attr);
8345 gfc_add_cray_pointee (&current_attr, &var_locus);
8346 current_ts.type = BT_UNKNOWN;
8347 current_ts.kind = 0;
8349 m = gfc_match_symbol (&cpte, 0);
8350 if (m != MATCH_YES)
8352 gfc_error ("Expected variable name at %C");
8353 return m;
8356 /* Check for an optional array spec. */
8357 m = gfc_match_array_spec (&as, true, false);
8358 if (m == MATCH_ERROR)
8360 gfc_free_array_spec (as);
8361 return m;
8363 else if (m == MATCH_NO)
8365 gfc_free_array_spec (as);
8366 as = NULL;
8369 if (!gfc_add_cray_pointee (&cpte->attr, &var_locus))
8370 return MATCH_ERROR;
8372 gfc_set_sym_referenced (cpte);
8374 if (cpte->as == NULL)
8376 if (!gfc_set_array_spec (cpte, as, &var_locus))
8377 gfc_internal_error ("Couldn't set Cray pointee array spec.");
8379 else if (as != NULL)
8381 gfc_error ("Duplicate array spec for Cray pointee at %C");
8382 gfc_free_array_spec (as);
8383 return MATCH_ERROR;
8386 as = NULL;
8388 if (cpte->as != NULL)
8390 /* Fix array spec. */
8391 m = gfc_mod_pointee_as (cpte->as);
8392 if (m == MATCH_ERROR)
8393 return m;
8396 /* Point the Pointee at the Pointer. */
8397 cpte->cp_pointer = cptr;
8399 if (gfc_match_char (')') != MATCH_YES)
8401 gfc_error ("Expected \")\" at %C");
8402 return MATCH_ERROR;
8404 m = gfc_match_char (',');
8405 if (m != MATCH_YES)
8406 done = true; /* Stop searching for more declarations. */
8410 if (m == MATCH_ERROR /* Failed when trying to find ',' above. */
8411 || gfc_match_eos () != MATCH_YES)
8413 gfc_error ("Expected %<,%> or end of statement at %C");
8414 return MATCH_ERROR;
8416 return MATCH_YES;
8420 match
8421 gfc_match_external (void)
8424 gfc_clear_attr (&current_attr);
8425 current_attr.external = 1;
8427 return attr_decl ();
8431 match
8432 gfc_match_intent (void)
8434 sym_intent intent;
8436 /* This is not allowed within a BLOCK construct! */
8437 if (gfc_current_state () == COMP_BLOCK)
8439 gfc_error ("INTENT is not allowed inside of BLOCK at %C");
8440 return MATCH_ERROR;
8443 intent = match_intent_spec ();
8444 if (intent == INTENT_UNKNOWN)
8445 return MATCH_ERROR;
8447 gfc_clear_attr (&current_attr);
8448 current_attr.intent = intent;
8450 return attr_decl ();
8454 match
8455 gfc_match_intrinsic (void)
8458 gfc_clear_attr (&current_attr);
8459 current_attr.intrinsic = 1;
8461 return attr_decl ();
8465 match
8466 gfc_match_optional (void)
8468 /* This is not allowed within a BLOCK construct! */
8469 if (gfc_current_state () == COMP_BLOCK)
8471 gfc_error ("OPTIONAL is not allowed inside of BLOCK at %C");
8472 return MATCH_ERROR;
8475 gfc_clear_attr (&current_attr);
8476 current_attr.optional = 1;
8478 return attr_decl ();
8482 match
8483 gfc_match_pointer (void)
8485 gfc_gobble_whitespace ();
8486 if (gfc_peek_ascii_char () == '(')
8488 if (!flag_cray_pointer)
8490 gfc_error ("Cray pointer declaration at %C requires -fcray-pointer "
8491 "flag");
8492 return MATCH_ERROR;
8494 return cray_pointer_decl ();
8496 else
8498 gfc_clear_attr (&current_attr);
8499 current_attr.pointer = 1;
8501 return attr_decl ();
8506 match
8507 gfc_match_allocatable (void)
8509 gfc_clear_attr (&current_attr);
8510 current_attr.allocatable = 1;
8512 return attr_decl ();
8516 match
8517 gfc_match_codimension (void)
8519 gfc_clear_attr (&current_attr);
8520 current_attr.codimension = 1;
8522 return attr_decl ();
8526 match
8527 gfc_match_contiguous (void)
8529 if (!gfc_notify_std (GFC_STD_F2008, "CONTIGUOUS statement at %C"))
8530 return MATCH_ERROR;
8532 gfc_clear_attr (&current_attr);
8533 current_attr.contiguous = 1;
8535 return attr_decl ();
8539 match
8540 gfc_match_dimension (void)
8542 gfc_clear_attr (&current_attr);
8543 current_attr.dimension = 1;
8545 return attr_decl ();
8549 match
8550 gfc_match_target (void)
8552 gfc_clear_attr (&current_attr);
8553 current_attr.target = 1;
8555 return attr_decl ();
8559 /* Match the list of entities being specified in a PUBLIC or PRIVATE
8560 statement. */
8562 static match
8563 access_attr_decl (gfc_statement st)
8565 char name[GFC_MAX_SYMBOL_LEN + 1];
8566 interface_type type;
8567 gfc_user_op *uop;
8568 gfc_symbol *sym, *dt_sym;
8569 gfc_intrinsic_op op;
8570 match m;
8572 if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
8573 goto done;
8575 for (;;)
8577 m = gfc_match_generic_spec (&type, name, &op);
8578 if (m == MATCH_NO)
8579 goto syntax;
8580 if (m == MATCH_ERROR)
8581 return MATCH_ERROR;
8583 switch (type)
8585 case INTERFACE_NAMELESS:
8586 case INTERFACE_ABSTRACT:
8587 goto syntax;
8589 case INTERFACE_GENERIC:
8590 case INTERFACE_DTIO:
8592 if (gfc_get_symbol (name, NULL, &sym))
8593 goto done;
8595 if (type == INTERFACE_DTIO
8596 && gfc_current_ns->proc_name
8597 && gfc_current_ns->proc_name->attr.flavor == FL_MODULE
8598 && sym->attr.flavor == FL_UNKNOWN)
8599 sym->attr.flavor = FL_PROCEDURE;
8601 if (!gfc_add_access (&sym->attr,
8602 (st == ST_PUBLIC)
8603 ? ACCESS_PUBLIC : ACCESS_PRIVATE,
8604 sym->name, NULL))
8605 return MATCH_ERROR;
8607 if (sym->attr.generic && (dt_sym = gfc_find_dt_in_generic (sym))
8608 && !gfc_add_access (&dt_sym->attr,
8609 (st == ST_PUBLIC)
8610 ? ACCESS_PUBLIC : ACCESS_PRIVATE,
8611 sym->name, NULL))
8612 return MATCH_ERROR;
8614 break;
8616 case INTERFACE_INTRINSIC_OP:
8617 if (gfc_current_ns->operator_access[op] == ACCESS_UNKNOWN)
8619 gfc_intrinsic_op other_op;
8621 gfc_current_ns->operator_access[op] =
8622 (st == ST_PUBLIC) ? ACCESS_PUBLIC : ACCESS_PRIVATE;
8624 /* Handle the case if there is another op with the same
8625 function, for INTRINSIC_EQ vs. INTRINSIC_EQ_OS and so on. */
8626 other_op = gfc_equivalent_op (op);
8628 if (other_op != INTRINSIC_NONE)
8629 gfc_current_ns->operator_access[other_op] =
8630 (st == ST_PUBLIC) ? ACCESS_PUBLIC : ACCESS_PRIVATE;
8633 else
8635 gfc_error ("Access specification of the %s operator at %C has "
8636 "already been specified", gfc_op2string (op));
8637 goto done;
8640 break;
8642 case INTERFACE_USER_OP:
8643 uop = gfc_get_uop (name);
8645 if (uop->access == ACCESS_UNKNOWN)
8647 uop->access = (st == ST_PUBLIC)
8648 ? ACCESS_PUBLIC : ACCESS_PRIVATE;
8650 else
8652 gfc_error ("Access specification of the .%s. operator at %C "
8653 "has already been specified", sym->name);
8654 goto done;
8657 break;
8660 if (gfc_match_char (',') == MATCH_NO)
8661 break;
8664 if (gfc_match_eos () != MATCH_YES)
8665 goto syntax;
8666 return MATCH_YES;
8668 syntax:
8669 gfc_syntax_error (st);
8671 done:
8672 return MATCH_ERROR;
8676 match
8677 gfc_match_protected (void)
8679 gfc_symbol *sym;
8680 match m;
8682 if (!gfc_current_ns->proc_name
8683 || gfc_current_ns->proc_name->attr.flavor != FL_MODULE)
8685 gfc_error ("PROTECTED at %C only allowed in specification "
8686 "part of a module");
8687 return MATCH_ERROR;
8691 if (!gfc_notify_std (GFC_STD_F2003, "PROTECTED statement at %C"))
8692 return MATCH_ERROR;
8694 if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
8696 return MATCH_ERROR;
8699 if (gfc_match_eos () == MATCH_YES)
8700 goto syntax;
8702 for(;;)
8704 m = gfc_match_symbol (&sym, 0);
8705 switch (m)
8707 case MATCH_YES:
8708 if (!gfc_add_protected (&sym->attr, sym->name, &gfc_current_locus))
8709 return MATCH_ERROR;
8710 goto next_item;
8712 case MATCH_NO:
8713 break;
8715 case MATCH_ERROR:
8716 return MATCH_ERROR;
8719 next_item:
8720 if (gfc_match_eos () == MATCH_YES)
8721 break;
8722 if (gfc_match_char (',') != MATCH_YES)
8723 goto syntax;
8726 return MATCH_YES;
8728 syntax:
8729 gfc_error ("Syntax error in PROTECTED statement at %C");
8730 return MATCH_ERROR;
8734 /* The PRIVATE statement is a bit weird in that it can be an attribute
8735 declaration, but also works as a standalone statement inside of a
8736 type declaration or a module. */
8738 match
8739 gfc_match_private (gfc_statement *st)
8742 if (gfc_match ("private") != MATCH_YES)
8743 return MATCH_NO;
8745 if (gfc_current_state () != COMP_MODULE
8746 && !(gfc_current_state () == COMP_DERIVED
8747 && gfc_state_stack->previous
8748 && gfc_state_stack->previous->state == COMP_MODULE)
8749 && !(gfc_current_state () == COMP_DERIVED_CONTAINS
8750 && gfc_state_stack->previous && gfc_state_stack->previous->previous
8751 && gfc_state_stack->previous->previous->state == COMP_MODULE))
8753 gfc_error ("PRIVATE statement at %C is only allowed in the "
8754 "specification part of a module");
8755 return MATCH_ERROR;
8758 if (gfc_current_state () == COMP_DERIVED)
8760 if (gfc_match_eos () == MATCH_YES)
8762 *st = ST_PRIVATE;
8763 return MATCH_YES;
8766 gfc_syntax_error (ST_PRIVATE);
8767 return MATCH_ERROR;
8770 if (gfc_match_eos () == MATCH_YES)
8772 *st = ST_PRIVATE;
8773 return MATCH_YES;
8776 *st = ST_ATTR_DECL;
8777 return access_attr_decl (ST_PRIVATE);
8781 match
8782 gfc_match_public (gfc_statement *st)
8785 if (gfc_match ("public") != MATCH_YES)
8786 return MATCH_NO;
8788 if (gfc_current_state () != COMP_MODULE)
8790 gfc_error ("PUBLIC statement at %C is only allowed in the "
8791 "specification part of a module");
8792 return MATCH_ERROR;
8795 if (gfc_match_eos () == MATCH_YES)
8797 *st = ST_PUBLIC;
8798 return MATCH_YES;
8801 *st = ST_ATTR_DECL;
8802 return access_attr_decl (ST_PUBLIC);
8806 /* Workhorse for gfc_match_parameter. */
8808 static match
8809 do_parm (void)
8811 gfc_symbol *sym;
8812 gfc_expr *init;
8813 match m;
8814 bool t;
8816 m = gfc_match_symbol (&sym, 0);
8817 if (m == MATCH_NO)
8818 gfc_error ("Expected variable name at %C in PARAMETER statement");
8820 if (m != MATCH_YES)
8821 return m;
8823 if (gfc_match_char ('=') == MATCH_NO)
8825 gfc_error ("Expected = sign in PARAMETER statement at %C");
8826 return MATCH_ERROR;
8829 m = gfc_match_init_expr (&init);
8830 if (m == MATCH_NO)
8831 gfc_error ("Expected expression at %C in PARAMETER statement");
8832 if (m != MATCH_YES)
8833 return m;
8835 if (sym->ts.type == BT_UNKNOWN
8836 && !gfc_set_default_type (sym, 1, NULL))
8838 m = MATCH_ERROR;
8839 goto cleanup;
8842 if (!gfc_check_assign_symbol (sym, NULL, init)
8843 || !gfc_add_flavor (&sym->attr, FL_PARAMETER, sym->name, NULL))
8845 m = MATCH_ERROR;
8846 goto cleanup;
8849 if (sym->value)
8851 gfc_error ("Initializing already initialized variable at %C");
8852 m = MATCH_ERROR;
8853 goto cleanup;
8856 t = add_init_expr_to_sym (sym->name, &init, &gfc_current_locus);
8857 return (t) ? MATCH_YES : MATCH_ERROR;
8859 cleanup:
8860 gfc_free_expr (init);
8861 return m;
8865 /* Match a parameter statement, with the weird syntax that these have. */
8867 match
8868 gfc_match_parameter (void)
8870 const char *term = " )%t";
8871 match m;
8873 if (gfc_match_char ('(') == MATCH_NO)
8875 /* With legacy PARAMETER statements, don't expect a terminating ')'. */
8876 if (!gfc_notify_std (GFC_STD_LEGACY, "PARAMETER without '()' at %C"))
8877 return MATCH_NO;
8878 term = " %t";
8881 for (;;)
8883 m = do_parm ();
8884 if (m != MATCH_YES)
8885 break;
8887 if (gfc_match (term) == MATCH_YES)
8888 break;
8890 if (gfc_match_char (',') != MATCH_YES)
8892 gfc_error ("Unexpected characters in PARAMETER statement at %C");
8893 m = MATCH_ERROR;
8894 break;
8898 return m;
8902 match
8903 gfc_match_automatic (void)
8905 gfc_symbol *sym;
8906 match m;
8907 bool seen_symbol = false;
8909 if (!flag_dec_static)
8911 gfc_error ("%s at %C is a DEC extension, enable with "
8912 "%<-fdec-static%>",
8913 "AUTOMATIC"
8915 return MATCH_ERROR;
8918 gfc_match (" ::");
8920 for (;;)
8922 m = gfc_match_symbol (&sym, 0);
8923 switch (m)
8925 case MATCH_NO:
8926 break;
8928 case MATCH_ERROR:
8929 return MATCH_ERROR;
8931 case MATCH_YES:
8932 if (!gfc_add_automatic (&sym->attr, sym->name, &gfc_current_locus))
8933 return MATCH_ERROR;
8934 seen_symbol = true;
8935 break;
8938 if (gfc_match_eos () == MATCH_YES)
8939 break;
8940 if (gfc_match_char (',') != MATCH_YES)
8941 goto syntax;
8944 if (!seen_symbol)
8946 gfc_error ("Expected entity-list in AUTOMATIC statement at %C");
8947 return MATCH_ERROR;
8950 return MATCH_YES;
8952 syntax:
8953 gfc_error ("Syntax error in AUTOMATIC statement at %C");
8954 return MATCH_ERROR;
8958 match
8959 gfc_match_static (void)
8961 gfc_symbol *sym;
8962 match m;
8963 bool seen_symbol = false;
8965 if (!flag_dec_static)
8967 gfc_error ("%s at %C is a DEC extension, enable with "
8968 "%<-fdec-static%>",
8969 "STATIC");
8970 return MATCH_ERROR;
8973 gfc_match (" ::");
8975 for (;;)
8977 m = gfc_match_symbol (&sym, 0);
8978 switch (m)
8980 case MATCH_NO:
8981 break;
8983 case MATCH_ERROR:
8984 return MATCH_ERROR;
8986 case MATCH_YES:
8987 if (!gfc_add_save (&sym->attr, SAVE_EXPLICIT, sym->name,
8988 &gfc_current_locus))
8989 return MATCH_ERROR;
8990 seen_symbol = true;
8991 break;
8994 if (gfc_match_eos () == MATCH_YES)
8995 break;
8996 if (gfc_match_char (',') != MATCH_YES)
8997 goto syntax;
9000 if (!seen_symbol)
9002 gfc_error ("Expected entity-list in STATIC statement at %C");
9003 return MATCH_ERROR;
9006 return MATCH_YES;
9008 syntax:
9009 gfc_error ("Syntax error in STATIC statement at %C");
9010 return MATCH_ERROR;
9014 /* Save statements have a special syntax. */
9016 match
9017 gfc_match_save (void)
9019 char n[GFC_MAX_SYMBOL_LEN+1];
9020 gfc_common_head *c;
9021 gfc_symbol *sym;
9022 match m;
9024 if (gfc_match_eos () == MATCH_YES)
9026 if (gfc_current_ns->seen_save)
9028 if (!gfc_notify_std (GFC_STD_LEGACY, "Blanket SAVE statement at %C "
9029 "follows previous SAVE statement"))
9030 return MATCH_ERROR;
9033 gfc_current_ns->save_all = gfc_current_ns->seen_save = 1;
9034 return MATCH_YES;
9037 if (gfc_current_ns->save_all)
9039 if (!gfc_notify_std (GFC_STD_LEGACY, "SAVE statement at %C follows "
9040 "blanket SAVE statement"))
9041 return MATCH_ERROR;
9044 gfc_match (" ::");
9046 for (;;)
9048 m = gfc_match_symbol (&sym, 0);
9049 switch (m)
9051 case MATCH_YES:
9052 if (!gfc_add_save (&sym->attr, SAVE_EXPLICIT, sym->name,
9053 &gfc_current_locus))
9054 return MATCH_ERROR;
9055 goto next_item;
9057 case MATCH_NO:
9058 break;
9060 case MATCH_ERROR:
9061 return MATCH_ERROR;
9064 m = gfc_match (" / %n /", &n);
9065 if (m == MATCH_ERROR)
9066 return MATCH_ERROR;
9067 if (m == MATCH_NO)
9068 goto syntax;
9070 c = gfc_get_common (n, 0);
9071 c->saved = 1;
9073 gfc_current_ns->seen_save = 1;
9075 next_item:
9076 if (gfc_match_eos () == MATCH_YES)
9077 break;
9078 if (gfc_match_char (',') != MATCH_YES)
9079 goto syntax;
9082 return MATCH_YES;
9084 syntax:
9085 gfc_error ("Syntax error in SAVE statement at %C");
9086 return MATCH_ERROR;
9090 match
9091 gfc_match_value (void)
9093 gfc_symbol *sym;
9094 match m;
9096 /* This is not allowed within a BLOCK construct! */
9097 if (gfc_current_state () == COMP_BLOCK)
9099 gfc_error ("VALUE is not allowed inside of BLOCK at %C");
9100 return MATCH_ERROR;
9103 if (!gfc_notify_std (GFC_STD_F2003, "VALUE statement at %C"))
9104 return MATCH_ERROR;
9106 if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
9108 return MATCH_ERROR;
9111 if (gfc_match_eos () == MATCH_YES)
9112 goto syntax;
9114 for(;;)
9116 m = gfc_match_symbol (&sym, 0);
9117 switch (m)
9119 case MATCH_YES:
9120 if (!gfc_add_value (&sym->attr, sym->name, &gfc_current_locus))
9121 return MATCH_ERROR;
9122 goto next_item;
9124 case MATCH_NO:
9125 break;
9127 case MATCH_ERROR:
9128 return MATCH_ERROR;
9131 next_item:
9132 if (gfc_match_eos () == MATCH_YES)
9133 break;
9134 if (gfc_match_char (',') != MATCH_YES)
9135 goto syntax;
9138 return MATCH_YES;
9140 syntax:
9141 gfc_error ("Syntax error in VALUE statement at %C");
9142 return MATCH_ERROR;
9146 match
9147 gfc_match_volatile (void)
9149 gfc_symbol *sym;
9150 char *name;
9151 match m;
9153 if (!gfc_notify_std (GFC_STD_F2003, "VOLATILE statement at %C"))
9154 return MATCH_ERROR;
9156 if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
9158 return MATCH_ERROR;
9161 if (gfc_match_eos () == MATCH_YES)
9162 goto syntax;
9164 for(;;)
9166 /* VOLATILE is special because it can be added to host-associated
9167 symbols locally. Except for coarrays. */
9168 m = gfc_match_symbol (&sym, 1);
9169 switch (m)
9171 case MATCH_YES:
9172 name = XCNEWVAR (char, strlen (sym->name) + 1);
9173 strcpy (name, sym->name);
9174 if (!check_function_name (name))
9175 return MATCH_ERROR;
9176 /* F2008, C560+C561. VOLATILE for host-/use-associated variable or
9177 for variable in a BLOCK which is defined outside of the BLOCK. */
9178 if (sym->ns != gfc_current_ns && sym->attr.codimension)
9180 gfc_error ("Specifying VOLATILE for coarray variable %qs at "
9181 "%C, which is use-/host-associated", sym->name);
9182 return MATCH_ERROR;
9184 if (!gfc_add_volatile (&sym->attr, sym->name, &gfc_current_locus))
9185 return MATCH_ERROR;
9186 goto next_item;
9188 case MATCH_NO:
9189 break;
9191 case MATCH_ERROR:
9192 return MATCH_ERROR;
9195 next_item:
9196 if (gfc_match_eos () == MATCH_YES)
9197 break;
9198 if (gfc_match_char (',') != MATCH_YES)
9199 goto syntax;
9202 return MATCH_YES;
9204 syntax:
9205 gfc_error ("Syntax error in VOLATILE statement at %C");
9206 return MATCH_ERROR;
9210 match
9211 gfc_match_asynchronous (void)
9213 gfc_symbol *sym;
9214 char *name;
9215 match m;
9217 if (!gfc_notify_std (GFC_STD_F2003, "ASYNCHRONOUS statement at %C"))
9218 return MATCH_ERROR;
9220 if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
9222 return MATCH_ERROR;
9225 if (gfc_match_eos () == MATCH_YES)
9226 goto syntax;
9228 for(;;)
9230 /* ASYNCHRONOUS is special because it can be added to host-associated
9231 symbols locally. */
9232 m = gfc_match_symbol (&sym, 1);
9233 switch (m)
9235 case MATCH_YES:
9236 name = XCNEWVAR (char, strlen (sym->name) + 1);
9237 strcpy (name, sym->name);
9238 if (!check_function_name (name))
9239 return MATCH_ERROR;
9240 if (!gfc_add_asynchronous (&sym->attr, sym->name, &gfc_current_locus))
9241 return MATCH_ERROR;
9242 goto next_item;
9244 case MATCH_NO:
9245 break;
9247 case MATCH_ERROR:
9248 return MATCH_ERROR;
9251 next_item:
9252 if (gfc_match_eos () == MATCH_YES)
9253 break;
9254 if (gfc_match_char (',') != MATCH_YES)
9255 goto syntax;
9258 return MATCH_YES;
9260 syntax:
9261 gfc_error ("Syntax error in ASYNCHRONOUS statement at %C");
9262 return MATCH_ERROR;
9266 /* Match a module procedure statement in a submodule. */
9268 match
9269 gfc_match_submod_proc (void)
9271 char name[GFC_MAX_SYMBOL_LEN + 1];
9272 gfc_symbol *sym, *fsym;
9273 match m;
9274 gfc_formal_arglist *formal, *head, *tail;
9276 if (gfc_current_state () != COMP_CONTAINS
9277 || !(gfc_state_stack->previous
9278 && (gfc_state_stack->previous->state == COMP_SUBMODULE
9279 || gfc_state_stack->previous->state == COMP_MODULE)))
9280 return MATCH_NO;
9282 m = gfc_match (" module% procedure% %n", name);
9283 if (m != MATCH_YES)
9284 return m;
9286 if (!gfc_notify_std (GFC_STD_F2008, "MODULE PROCEDURE declaration "
9287 "at %C"))
9288 return MATCH_ERROR;
9290 if (get_proc_name (name, &sym, false))
9291 return MATCH_ERROR;
9293 /* Make sure that the result field is appropriately filled, even though
9294 the result symbol will be replaced later on. */
9295 if (sym->tlink && sym->tlink->attr.function)
9297 if (sym->tlink->result
9298 && sym->tlink->result != sym->tlink)
9299 sym->result= sym->tlink->result;
9300 else
9301 sym->result = sym;
9304 /* Set declared_at as it might point to, e.g., a PUBLIC statement, if
9305 the symbol existed before. */
9306 sym->declared_at = gfc_current_locus;
9308 if (!sym->attr.module_procedure)
9309 return MATCH_ERROR;
9311 /* Signal match_end to expect "end procedure". */
9312 sym->abr_modproc_decl = 1;
9314 /* Change from IFSRC_IFBODY coming from the interface declaration. */
9315 sym->attr.if_source = IFSRC_DECL;
9317 gfc_new_block = sym;
9319 /* Make a new formal arglist with the symbols in the procedure
9320 namespace. */
9321 head = tail = NULL;
9322 for (formal = sym->formal; formal && formal->sym; formal = formal->next)
9324 if (formal == sym->formal)
9325 head = tail = gfc_get_formal_arglist ();
9326 else
9328 tail->next = gfc_get_formal_arglist ();
9329 tail = tail->next;
9332 if (gfc_copy_dummy_sym (&fsym, formal->sym, 0))
9333 goto cleanup;
9335 tail->sym = fsym;
9336 gfc_set_sym_referenced (fsym);
9339 /* The dummy symbols get cleaned up, when the formal_namespace of the
9340 interface declaration is cleared. This allows us to add the
9341 explicit interface as is done for other type of procedure. */
9342 if (!gfc_add_explicit_interface (sym, IFSRC_DECL, head,
9343 &gfc_current_locus))
9344 return MATCH_ERROR;
9346 if (gfc_match_eos () != MATCH_YES)
9348 gfc_syntax_error (ST_MODULE_PROC);
9349 return MATCH_ERROR;
9352 return MATCH_YES;
9354 cleanup:
9355 gfc_free_formal_arglist (head);
9356 return MATCH_ERROR;
9360 /* Match a module procedure statement. Note that we have to modify
9361 symbols in the parent's namespace because the current one was there
9362 to receive symbols that are in an interface's formal argument list. */
9364 match
9365 gfc_match_modproc (void)
9367 char name[GFC_MAX_SYMBOL_LEN + 1];
9368 gfc_symbol *sym;
9369 match m;
9370 locus old_locus;
9371 gfc_namespace *module_ns;
9372 gfc_interface *old_interface_head, *interface;
9374 if (gfc_state_stack->state != COMP_INTERFACE
9375 || gfc_state_stack->previous == NULL
9376 || current_interface.type == INTERFACE_NAMELESS
9377 || current_interface.type == INTERFACE_ABSTRACT)
9379 gfc_error ("MODULE PROCEDURE at %C must be in a generic module "
9380 "interface");
9381 return MATCH_ERROR;
9384 module_ns = gfc_current_ns->parent;
9385 for (; module_ns; module_ns = module_ns->parent)
9386 if (module_ns->proc_name->attr.flavor == FL_MODULE
9387 || module_ns->proc_name->attr.flavor == FL_PROGRAM
9388 || (module_ns->proc_name->attr.flavor == FL_PROCEDURE
9389 && !module_ns->proc_name->attr.contained))
9390 break;
9392 if (module_ns == NULL)
9393 return MATCH_ERROR;
9395 /* Store the current state of the interface. We will need it if we
9396 end up with a syntax error and need to recover. */
9397 old_interface_head = gfc_current_interface_head ();
9399 /* Check if the F2008 optional double colon appears. */
9400 gfc_gobble_whitespace ();
9401 old_locus = gfc_current_locus;
9402 if (gfc_match ("::") == MATCH_YES)
9404 if (!gfc_notify_std (GFC_STD_F2008, "double colon in "
9405 "MODULE PROCEDURE statement at %L", &old_locus))
9406 return MATCH_ERROR;
9408 else
9409 gfc_current_locus = old_locus;
9411 for (;;)
9413 bool last = false;
9414 old_locus = gfc_current_locus;
9416 m = gfc_match_name (name);
9417 if (m == MATCH_NO)
9418 goto syntax;
9419 if (m != MATCH_YES)
9420 return MATCH_ERROR;
9422 /* Check for syntax error before starting to add symbols to the
9423 current namespace. */
9424 if (gfc_match_eos () == MATCH_YES)
9425 last = true;
9427 if (!last && gfc_match_char (',') != MATCH_YES)
9428 goto syntax;
9430 /* Now we're sure the syntax is valid, we process this item
9431 further. */
9432 if (gfc_get_symbol (name, module_ns, &sym))
9433 return MATCH_ERROR;
9435 if (sym->attr.intrinsic)
9437 gfc_error ("Intrinsic procedure at %L cannot be a MODULE "
9438 "PROCEDURE", &old_locus);
9439 return MATCH_ERROR;
9442 if (sym->attr.proc != PROC_MODULE
9443 && !gfc_add_procedure (&sym->attr, PROC_MODULE, sym->name, NULL))
9444 return MATCH_ERROR;
9446 if (!gfc_add_interface (sym))
9447 return MATCH_ERROR;
9449 sym->attr.mod_proc = 1;
9450 sym->declared_at = old_locus;
9452 if (last)
9453 break;
9456 return MATCH_YES;
9458 syntax:
9459 /* Restore the previous state of the interface. */
9460 interface = gfc_current_interface_head ();
9461 gfc_set_current_interface_head (old_interface_head);
9463 /* Free the new interfaces. */
9464 while (interface != old_interface_head)
9466 gfc_interface *i = interface->next;
9467 free (interface);
9468 interface = i;
9471 /* And issue a syntax error. */
9472 gfc_syntax_error (ST_MODULE_PROC);
9473 return MATCH_ERROR;
9477 /* Check a derived type that is being extended. */
9479 static gfc_symbol*
9480 check_extended_derived_type (char *name)
9482 gfc_symbol *extended;
9484 if (gfc_find_symbol (name, gfc_current_ns, 1, &extended))
9486 gfc_error ("Ambiguous symbol in TYPE definition at %C");
9487 return NULL;
9490 extended = gfc_find_dt_in_generic (extended);
9492 /* F08:C428. */
9493 if (!extended)
9495 gfc_error ("Symbol %qs at %C has not been previously defined", name);
9496 return NULL;
9499 if (extended->attr.flavor != FL_DERIVED)
9501 gfc_error ("%qs in EXTENDS expression at %C is not a "
9502 "derived type", name);
9503 return NULL;
9506 if (extended->attr.is_bind_c)
9508 gfc_error ("%qs cannot be extended at %C because it "
9509 "is BIND(C)", extended->name);
9510 return NULL;
9513 if (extended->attr.sequence)
9515 gfc_error ("%qs cannot be extended at %C because it "
9516 "is a SEQUENCE type", extended->name);
9517 return NULL;
9520 return extended;
9524 /* Match the optional attribute specifiers for a type declaration.
9525 Return MATCH_ERROR if an error is encountered in one of the handled
9526 attributes (public, private, bind(c)), MATCH_NO if what's found is
9527 not a handled attribute, and MATCH_YES otherwise. TODO: More error
9528 checking on attribute conflicts needs to be done. */
9530 match
9531 gfc_get_type_attr_spec (symbol_attribute *attr, char *name)
9533 /* See if the derived type is marked as private. */
9534 if (gfc_match (" , private") == MATCH_YES)
9536 if (gfc_current_state () != COMP_MODULE)
9538 gfc_error ("Derived type at %C can only be PRIVATE in the "
9539 "specification part of a module");
9540 return MATCH_ERROR;
9543 if (!gfc_add_access (attr, ACCESS_PRIVATE, NULL, NULL))
9544 return MATCH_ERROR;
9546 else if (gfc_match (" , public") == MATCH_YES)
9548 if (gfc_current_state () != COMP_MODULE)
9550 gfc_error ("Derived type at %C can only be PUBLIC in the "
9551 "specification part of a module");
9552 return MATCH_ERROR;
9555 if (!gfc_add_access (attr, ACCESS_PUBLIC, NULL, NULL))
9556 return MATCH_ERROR;
9558 else if (gfc_match (" , bind ( c )") == MATCH_YES)
9560 /* If the type is defined to be bind(c) it then needs to make
9561 sure that all fields are interoperable. This will
9562 need to be a semantic check on the finished derived type.
9563 See 15.2.3 (lines 9-12) of F2003 draft. */
9564 if (!gfc_add_is_bind_c (attr, NULL, &gfc_current_locus, 0))
9565 return MATCH_ERROR;
9567 /* TODO: attr conflicts need to be checked, probably in symbol.c. */
9569 else if (gfc_match (" , abstract") == MATCH_YES)
9571 if (!gfc_notify_std (GFC_STD_F2003, "ABSTRACT type at %C"))
9572 return MATCH_ERROR;
9574 if (!gfc_add_abstract (attr, &gfc_current_locus))
9575 return MATCH_ERROR;
9577 else if (name && gfc_match (" , extends ( %n )", name) == MATCH_YES)
9579 if (!gfc_add_extension (attr, &gfc_current_locus))
9580 return MATCH_ERROR;
9582 else
9583 return MATCH_NO;
9585 /* If we get here, something matched. */
9586 return MATCH_YES;
9590 /* Common function for type declaration blocks similar to derived types, such
9591 as STRUCTURES and MAPs. Unlike derived types, a structure type
9592 does NOT have a generic symbol matching the name given by the user.
9593 STRUCTUREs can share names with variables and PARAMETERs so we must allow
9594 for the creation of an independent symbol.
9595 Other parameters are a message to prefix errors with, the name of the new
9596 type to be created, and the flavor to add to the resulting symbol. */
9598 static bool
9599 get_struct_decl (const char *name, sym_flavor fl, locus *decl,
9600 gfc_symbol **result)
9602 gfc_symbol *sym;
9603 locus where;
9605 gcc_assert (name[0] == (char) TOUPPER (name[0]));
9607 if (decl)
9608 where = *decl;
9609 else
9610 where = gfc_current_locus;
9612 if (gfc_get_symbol (name, NULL, &sym))
9613 return false;
9615 if (!sym)
9617 gfc_internal_error ("Failed to create structure type '%s' at %C", name);
9618 return false;
9621 if (sym->components != NULL || sym->attr.zero_comp)
9623 gfc_error ("Type definition of %qs at %C was already defined at %L",
9624 sym->name, &sym->declared_at);
9625 return false;
9628 sym->declared_at = where;
9630 if (sym->attr.flavor != fl
9631 && !gfc_add_flavor (&sym->attr, fl, sym->name, NULL))
9632 return false;
9634 if (!sym->hash_value)
9635 /* Set the hash for the compound name for this type. */
9636 sym->hash_value = gfc_hash_value (sym);
9638 /* Normally the type is expected to have been completely parsed by the time
9639 a field declaration with this type is seen. For unions, maps, and nested
9640 structure declarations, we need to indicate that it is okay that we
9641 haven't seen any components yet. This will be updated after the structure
9642 is fully parsed. */
9643 sym->attr.zero_comp = 0;
9645 /* Structures always act like derived-types with the SEQUENCE attribute */
9646 gfc_add_sequence (&sym->attr, sym->name, NULL);
9648 if (result) *result = sym;
9650 return true;
9654 /* Match the opening of a MAP block. Like a struct within a union in C;
9655 behaves identical to STRUCTURE blocks. */
9657 match
9658 gfc_match_map (void)
9660 /* Counter used to give unique internal names to map structures. */
9661 static unsigned int gfc_map_id = 0;
9662 char name[GFC_MAX_SYMBOL_LEN + 1];
9663 gfc_symbol *sym;
9664 locus old_loc;
9666 old_loc = gfc_current_locus;
9668 if (gfc_match_eos () != MATCH_YES)
9670 gfc_error ("Junk after MAP statement at %C");
9671 gfc_current_locus = old_loc;
9672 return MATCH_ERROR;
9675 /* Map blocks are anonymous so we make up unique names for the symbol table
9676 which are invalid Fortran identifiers. */
9677 snprintf (name, GFC_MAX_SYMBOL_LEN + 1, "MM$%u", gfc_map_id++);
9679 if (!get_struct_decl (name, FL_STRUCT, &old_loc, &sym))
9680 return MATCH_ERROR;
9682 gfc_new_block = sym;
9684 return MATCH_YES;
9688 /* Match the opening of a UNION block. */
9690 match
9691 gfc_match_union (void)
9693 /* Counter used to give unique internal names to union types. */
9694 static unsigned int gfc_union_id = 0;
9695 char name[GFC_MAX_SYMBOL_LEN + 1];
9696 gfc_symbol *sym;
9697 locus old_loc;
9699 old_loc = gfc_current_locus;
9701 if (gfc_match_eos () != MATCH_YES)
9703 gfc_error ("Junk after UNION statement at %C");
9704 gfc_current_locus = old_loc;
9705 return MATCH_ERROR;
9708 /* Unions are anonymous so we make up unique names for the symbol table
9709 which are invalid Fortran identifiers. */
9710 snprintf (name, GFC_MAX_SYMBOL_LEN + 1, "UU$%u", gfc_union_id++);
9712 if (!get_struct_decl (name, FL_UNION, &old_loc, &sym))
9713 return MATCH_ERROR;
9715 gfc_new_block = sym;
9717 return MATCH_YES;
9721 /* Match the beginning of a STRUCTURE declaration. This is similar to
9722 matching the beginning of a derived type declaration with a few
9723 twists. The resulting type symbol has no access control or other
9724 interesting attributes. */
9726 match
9727 gfc_match_structure_decl (void)
9729 /* Counter used to give unique internal names to anonymous structures. */
9730 static unsigned int gfc_structure_id = 0;
9731 char name[GFC_MAX_SYMBOL_LEN + 1];
9732 gfc_symbol *sym;
9733 match m;
9734 locus where;
9736 if (!flag_dec_structure)
9738 gfc_error ("%s at %C is a DEC extension, enable with "
9739 "%<-fdec-structure%>",
9740 "STRUCTURE");
9741 return MATCH_ERROR;
9744 name[0] = '\0';
9746 m = gfc_match (" /%n/", name);
9747 if (m != MATCH_YES)
9749 /* Non-nested structure declarations require a structure name. */
9750 if (!gfc_comp_struct (gfc_current_state ()))
9752 gfc_error ("Structure name expected in non-nested structure "
9753 "declaration at %C");
9754 return MATCH_ERROR;
9756 /* This is an anonymous structure; make up a unique name for it
9757 (upper-case letters never make it to symbol names from the source).
9758 The important thing is initializing the type variable
9759 and setting gfc_new_symbol, which is immediately used by
9760 parse_structure () and variable_decl () to add components of
9761 this type. */
9762 snprintf (name, GFC_MAX_SYMBOL_LEN + 1, "SS$%u", gfc_structure_id++);
9765 where = gfc_current_locus;
9766 /* No field list allowed after non-nested structure declaration. */
9767 if (!gfc_comp_struct (gfc_current_state ())
9768 && gfc_match_eos () != MATCH_YES)
9770 gfc_error ("Junk after non-nested STRUCTURE statement at %C");
9771 return MATCH_ERROR;
9774 /* Make sure the name is not the name of an intrinsic type. */
9775 if (gfc_is_intrinsic_typename (name))
9777 gfc_error ("Structure name %qs at %C cannot be the same as an"
9778 " intrinsic type", name);
9779 return MATCH_ERROR;
9782 /* Store the actual type symbol for the structure with an upper-case first
9783 letter (an invalid Fortran identifier). */
9785 if (!get_struct_decl (gfc_dt_upper_string (name), FL_STRUCT, &where, &sym))
9786 return MATCH_ERROR;
9788 gfc_new_block = sym;
9789 return MATCH_YES;
9793 /* This function does some work to determine which matcher should be used to
9794 * match a statement beginning with "TYPE". This is used to disambiguate TYPE
9795 * as an alias for PRINT from derived type declarations, TYPE IS statements,
9796 * and derived type data declarations. */
9798 match
9799 gfc_match_type (gfc_statement *st)
9801 char name[GFC_MAX_SYMBOL_LEN + 1];
9802 match m;
9803 locus old_loc;
9805 /* Requires -fdec. */
9806 if (!flag_dec)
9807 return MATCH_NO;
9809 m = gfc_match ("type");
9810 if (m != MATCH_YES)
9811 return m;
9812 /* If we already have an error in the buffer, it is probably from failing to
9813 * match a derived type data declaration. Let it happen. */
9814 else if (gfc_error_flag_test ())
9815 return MATCH_NO;
9817 old_loc = gfc_current_locus;
9818 *st = ST_NONE;
9820 /* If we see an attribute list before anything else it's definitely a derived
9821 * type declaration. */
9822 if (gfc_match (" ,") == MATCH_YES || gfc_match (" ::") == MATCH_YES)
9824 gfc_current_locus = old_loc;
9825 *st = ST_DERIVED_DECL;
9826 return gfc_match_derived_decl ();
9829 /* By now "TYPE" has already been matched. If we do not see a name, this may
9830 * be something like "TYPE *" or "TYPE <fmt>". */
9831 m = gfc_match_name (name);
9832 if (m != MATCH_YES)
9834 /* Let print match if it can, otherwise throw an error from
9835 * gfc_match_derived_decl. */
9836 gfc_current_locus = old_loc;
9837 if (gfc_match_print () == MATCH_YES)
9839 *st = ST_WRITE;
9840 return MATCH_YES;
9842 gfc_current_locus = old_loc;
9843 *st = ST_DERIVED_DECL;
9844 return gfc_match_derived_decl ();
9847 /* A derived type declaration requires an EOS. Without it, assume print. */
9848 m = gfc_match_eos ();
9849 if (m == MATCH_NO)
9851 /* Check manually for TYPE IS (... - this is invalid print syntax. */
9852 if (strncmp ("is", name, 3) == 0
9853 && gfc_match (" (", name) == MATCH_YES)
9855 gfc_current_locus = old_loc;
9856 gcc_assert (gfc_match (" is") == MATCH_YES);
9857 *st = ST_TYPE_IS;
9858 return gfc_match_type_is ();
9860 gfc_current_locus = old_loc;
9861 *st = ST_WRITE;
9862 return gfc_match_print ();
9864 else
9866 /* By now we have "TYPE <name> <EOS>". Check first if the name is an
9867 * intrinsic typename - if so let gfc_match_derived_decl dump an error.
9868 * Otherwise if gfc_match_derived_decl fails it's probably an existing
9869 * symbol which can be printed. */
9870 gfc_current_locus = old_loc;
9871 m = gfc_match_derived_decl ();
9872 if (gfc_is_intrinsic_typename (name) || m == MATCH_YES)
9874 *st = ST_DERIVED_DECL;
9875 return m;
9877 gfc_current_locus = old_loc;
9878 *st = ST_WRITE;
9879 return gfc_match_print ();
9882 return MATCH_NO;
9886 /* Match the beginning of a derived type declaration. If a type name
9887 was the result of a function, then it is possible to have a symbol
9888 already to be known as a derived type yet have no components. */
9890 match
9891 gfc_match_derived_decl (void)
9893 char name[GFC_MAX_SYMBOL_LEN + 1];
9894 char parent[GFC_MAX_SYMBOL_LEN + 1];
9895 symbol_attribute attr;
9896 gfc_symbol *sym, *gensym;
9897 gfc_symbol *extended;
9898 match m;
9899 match is_type_attr_spec = MATCH_NO;
9900 bool seen_attr = false;
9901 gfc_interface *intr = NULL, *head;
9902 bool parameterized_type = false;
9903 bool seen_colons = false;
9905 if (gfc_comp_struct (gfc_current_state ()))
9906 return MATCH_NO;
9908 name[0] = '\0';
9909 parent[0] = '\0';
9910 gfc_clear_attr (&attr);
9911 extended = NULL;
9915 is_type_attr_spec = gfc_get_type_attr_spec (&attr, parent);
9916 if (is_type_attr_spec == MATCH_ERROR)
9917 return MATCH_ERROR;
9918 if (is_type_attr_spec == MATCH_YES)
9919 seen_attr = true;
9920 } while (is_type_attr_spec == MATCH_YES);
9922 /* Deal with derived type extensions. The extension attribute has
9923 been added to 'attr' but now the parent type must be found and
9924 checked. */
9925 if (parent[0])
9926 extended = check_extended_derived_type (parent);
9928 if (parent[0] && !extended)
9929 return MATCH_ERROR;
9931 m = gfc_match (" ::");
9932 if (m == MATCH_YES)
9934 seen_colons = true;
9936 else if (seen_attr)
9938 gfc_error ("Expected :: in TYPE definition at %C");
9939 return MATCH_ERROR;
9942 m = gfc_match (" %n ", name);
9943 if (m != MATCH_YES)
9944 return m;
9946 /* Make sure that we don't identify TYPE IS (...) as a parameterized
9947 derived type named 'is'.
9948 TODO Expand the check, when 'name' = "is" by matching " (tname) "
9949 and checking if this is a(n intrinsic) typename. his picks up
9950 misplaced TYPE IS statements such as in select_type_1.f03. */
9951 if (gfc_peek_ascii_char () == '(')
9953 if (gfc_current_state () == COMP_SELECT_TYPE
9954 || (!seen_colons && !strcmp (name, "is")))
9955 return MATCH_NO;
9956 parameterized_type = true;
9959 m = gfc_match_eos ();
9960 if (m != MATCH_YES && !parameterized_type)
9961 return m;
9963 /* Make sure the name is not the name of an intrinsic type. */
9964 if (gfc_is_intrinsic_typename (name))
9966 gfc_error ("Type name %qs at %C cannot be the same as an intrinsic "
9967 "type", name);
9968 return MATCH_ERROR;
9971 if (gfc_get_symbol (name, NULL, &gensym))
9972 return MATCH_ERROR;
9974 if (!gensym->attr.generic && gensym->ts.type != BT_UNKNOWN)
9976 if (gensym->ts.u.derived)
9977 gfc_error ("Derived type name %qs at %C already has a basic type "
9978 "of %s", gensym->name, gfc_typename (&gensym->ts));
9979 else
9980 gfc_error ("Derived type name %qs at %C already has a basic type",
9981 gensym->name);
9982 return MATCH_ERROR;
9985 if (!gensym->attr.generic
9986 && !gfc_add_generic (&gensym->attr, gensym->name, NULL))
9987 return MATCH_ERROR;
9989 if (!gensym->attr.function
9990 && !gfc_add_function (&gensym->attr, gensym->name, NULL))
9991 return MATCH_ERROR;
9993 sym = gfc_find_dt_in_generic (gensym);
9995 if (sym && (sym->components != NULL || sym->attr.zero_comp))
9997 gfc_error ("Derived type definition of %qs at %C has already been "
9998 "defined", sym->name);
9999 return MATCH_ERROR;
10002 if (!sym)
10004 /* Use upper case to save the actual derived-type symbol. */
10005 gfc_get_symbol (gfc_dt_upper_string (gensym->name), NULL, &sym);
10006 sym->name = gfc_get_string ("%s", gensym->name);
10007 head = gensym->generic;
10008 intr = gfc_get_interface ();
10009 intr->sym = sym;
10010 intr->where = gfc_current_locus;
10011 intr->sym->declared_at = gfc_current_locus;
10012 intr->next = head;
10013 gensym->generic = intr;
10014 gensym->attr.if_source = IFSRC_DECL;
10017 /* The symbol may already have the derived attribute without the
10018 components. The ways this can happen is via a function
10019 definition, an INTRINSIC statement or a subtype in another
10020 derived type that is a pointer. The first part of the AND clause
10021 is true if the symbol is not the return value of a function. */
10022 if (sym->attr.flavor != FL_DERIVED
10023 && !gfc_add_flavor (&sym->attr, FL_DERIVED, sym->name, NULL))
10024 return MATCH_ERROR;
10026 if (attr.access != ACCESS_UNKNOWN
10027 && !gfc_add_access (&sym->attr, attr.access, sym->name, NULL))
10028 return MATCH_ERROR;
10029 else if (sym->attr.access == ACCESS_UNKNOWN
10030 && gensym->attr.access != ACCESS_UNKNOWN
10031 && !gfc_add_access (&sym->attr, gensym->attr.access,
10032 sym->name, NULL))
10033 return MATCH_ERROR;
10035 if (sym->attr.access != ACCESS_UNKNOWN
10036 && gensym->attr.access == ACCESS_UNKNOWN)
10037 gensym->attr.access = sym->attr.access;
10039 /* See if the derived type was labeled as bind(c). */
10040 if (attr.is_bind_c != 0)
10041 sym->attr.is_bind_c = attr.is_bind_c;
10043 /* Construct the f2k_derived namespace if it is not yet there. */
10044 if (!sym->f2k_derived)
10045 sym->f2k_derived = gfc_get_namespace (NULL, 0);
10047 if (parameterized_type)
10049 /* Ignore error or mismatches by going to the end of the statement
10050 in order to avoid the component declarations causing problems. */
10051 m = gfc_match_formal_arglist (sym, 0, 0, true);
10052 if (m != MATCH_YES)
10053 gfc_error_recovery ();
10054 m = gfc_match_eos ();
10055 if (m != MATCH_YES)
10057 gfc_error_recovery ();
10058 gfc_error_now ("Garbage after PARAMETERIZED TYPE declaration at %C");
10060 sym->attr.pdt_template = 1;
10063 if (extended && !sym->components)
10065 gfc_component *p;
10066 gfc_formal_arglist *f, *g, *h;
10068 /* Add the extended derived type as the first component. */
10069 gfc_add_component (sym, parent, &p);
10070 extended->refs++;
10071 gfc_set_sym_referenced (extended);
10073 p->ts.type = BT_DERIVED;
10074 p->ts.u.derived = extended;
10075 p->initializer = gfc_default_initializer (&p->ts);
10077 /* Set extension level. */
10078 if (extended->attr.extension == 255)
10080 /* Since the extension field is 8 bit wide, we can only have
10081 up to 255 extension levels. */
10082 gfc_error ("Maximum extension level reached with type %qs at %L",
10083 extended->name, &extended->declared_at);
10084 return MATCH_ERROR;
10086 sym->attr.extension = extended->attr.extension + 1;
10088 /* Provide the links between the extended type and its extension. */
10089 if (!extended->f2k_derived)
10090 extended->f2k_derived = gfc_get_namespace (NULL, 0);
10092 /* Copy the extended type-param-name-list from the extended type,
10093 append those of the extension and add the whole lot to the
10094 extension. */
10095 if (extended->attr.pdt_template)
10097 g = h = NULL;
10098 sym->attr.pdt_template = 1;
10099 for (f = extended->formal; f; f = f->next)
10101 if (f == extended->formal)
10103 g = gfc_get_formal_arglist ();
10104 h = g;
10106 else
10108 g->next = gfc_get_formal_arglist ();
10109 g = g->next;
10111 g->sym = f->sym;
10113 g->next = sym->formal;
10114 sym->formal = h;
10118 if (!sym->hash_value)
10119 /* Set the hash for the compound name for this type. */
10120 sym->hash_value = gfc_hash_value (sym);
10122 /* Take over the ABSTRACT attribute. */
10123 sym->attr.abstract = attr.abstract;
10125 gfc_new_block = sym;
10127 return MATCH_YES;
10131 /* Cray Pointees can be declared as:
10132 pointer (ipt, a (n,m,...,*)) */
10134 match
10135 gfc_mod_pointee_as (gfc_array_spec *as)
10137 as->cray_pointee = true; /* This will be useful to know later. */
10138 if (as->type == AS_ASSUMED_SIZE)
10139 as->cp_was_assumed = true;
10140 else if (as->type == AS_ASSUMED_SHAPE)
10142 gfc_error ("Cray Pointee at %C cannot be assumed shape array");
10143 return MATCH_ERROR;
10145 return MATCH_YES;
10149 /* Match the enum definition statement, here we are trying to match
10150 the first line of enum definition statement.
10151 Returns MATCH_YES if match is found. */
10153 match
10154 gfc_match_enum (void)
10156 match m;
10158 m = gfc_match_eos ();
10159 if (m != MATCH_YES)
10160 return m;
10162 if (!gfc_notify_std (GFC_STD_F2003, "ENUM and ENUMERATOR at %C"))
10163 return MATCH_ERROR;
10165 return MATCH_YES;
10169 /* Returns an initializer whose value is one higher than the value of the
10170 LAST_INITIALIZER argument. If the argument is NULL, the
10171 initializers value will be set to zero. The initializer's kind
10172 will be set to gfc_c_int_kind.
10174 If -fshort-enums is given, the appropriate kind will be selected
10175 later after all enumerators have been parsed. A warning is issued
10176 here if an initializer exceeds gfc_c_int_kind. */
10178 static gfc_expr *
10179 enum_initializer (gfc_expr *last_initializer, locus where)
10181 gfc_expr *result;
10182 result = gfc_get_constant_expr (BT_INTEGER, gfc_c_int_kind, &where);
10184 mpz_init (result->value.integer);
10186 if (last_initializer != NULL)
10188 mpz_add_ui (result->value.integer, last_initializer->value.integer, 1);
10189 result->where = last_initializer->where;
10191 if (gfc_check_integer_range (result->value.integer,
10192 gfc_c_int_kind) != ARITH_OK)
10194 gfc_error ("Enumerator exceeds the C integer type at %C");
10195 return NULL;
10198 else
10200 /* Control comes here, if it's the very first enumerator and no
10201 initializer has been given. It will be initialized to zero. */
10202 mpz_set_si (result->value.integer, 0);
10205 return result;
10209 /* Match a variable name with an optional initializer. When this
10210 subroutine is called, a variable is expected to be parsed next.
10211 Depending on what is happening at the moment, updates either the
10212 symbol table or the current interface. */
10214 static match
10215 enumerator_decl (void)
10217 char name[GFC_MAX_SYMBOL_LEN + 1];
10218 gfc_expr *initializer;
10219 gfc_array_spec *as = NULL;
10220 gfc_symbol *sym;
10221 locus var_locus;
10222 match m;
10223 bool t;
10224 locus old_locus;
10226 initializer = NULL;
10227 old_locus = gfc_current_locus;
10229 /* When we get here, we've just matched a list of attributes and
10230 maybe a type and a double colon. The next thing we expect to see
10231 is the name of the symbol. */
10232 m = gfc_match_name (name);
10233 if (m != MATCH_YES)
10234 goto cleanup;
10236 var_locus = gfc_current_locus;
10238 /* OK, we've successfully matched the declaration. Now put the
10239 symbol in the current namespace. If we fail to create the symbol,
10240 bail out. */
10241 if (!build_sym (name, NULL, false, &as, &var_locus))
10243 m = MATCH_ERROR;
10244 goto cleanup;
10247 /* The double colon must be present in order to have initializers.
10248 Otherwise the statement is ambiguous with an assignment statement. */
10249 if (colon_seen)
10251 if (gfc_match_char ('=') == MATCH_YES)
10253 m = gfc_match_init_expr (&initializer);
10254 if (m == MATCH_NO)
10256 gfc_error ("Expected an initialization expression at %C");
10257 m = MATCH_ERROR;
10260 if (m != MATCH_YES)
10261 goto cleanup;
10265 /* If we do not have an initializer, the initialization value of the
10266 previous enumerator (stored in last_initializer) is incremented
10267 by 1 and is used to initialize the current enumerator. */
10268 if (initializer == NULL)
10269 initializer = enum_initializer (last_initializer, old_locus);
10271 if (initializer == NULL || initializer->ts.type != BT_INTEGER)
10273 gfc_error ("ENUMERATOR %L not initialized with integer expression",
10274 &var_locus);
10275 m = MATCH_ERROR;
10276 goto cleanup;
10279 /* Store this current initializer, for the next enumerator variable
10280 to be parsed. add_init_expr_to_sym() zeros initializer, so we
10281 use last_initializer below. */
10282 last_initializer = initializer;
10283 t = add_init_expr_to_sym (name, &initializer, &var_locus);
10285 /* Maintain enumerator history. */
10286 gfc_find_symbol (name, NULL, 0, &sym);
10287 create_enum_history (sym, last_initializer);
10289 return (t) ? MATCH_YES : MATCH_ERROR;
10291 cleanup:
10292 /* Free stuff up and return. */
10293 gfc_free_expr (initializer);
10295 return m;
10299 /* Match the enumerator definition statement. */
10301 match
10302 gfc_match_enumerator_def (void)
10304 match m;
10305 bool t;
10307 gfc_clear_ts (&current_ts);
10309 m = gfc_match (" enumerator");
10310 if (m != MATCH_YES)
10311 return m;
10313 m = gfc_match (" :: ");
10314 if (m == MATCH_ERROR)
10315 return m;
10317 colon_seen = (m == MATCH_YES);
10319 if (gfc_current_state () != COMP_ENUM)
10321 gfc_error ("ENUM definition statement expected before %C");
10322 gfc_free_enum_history ();
10323 return MATCH_ERROR;
10326 (&current_ts)->type = BT_INTEGER;
10327 (&current_ts)->kind = gfc_c_int_kind;
10329 gfc_clear_attr (&current_attr);
10330 t = gfc_add_flavor (&current_attr, FL_PARAMETER, NULL, NULL);
10331 if (!t)
10333 m = MATCH_ERROR;
10334 goto cleanup;
10337 for (;;)
10339 m = enumerator_decl ();
10340 if (m == MATCH_ERROR)
10342 gfc_free_enum_history ();
10343 goto cleanup;
10345 if (m == MATCH_NO)
10346 break;
10348 if (gfc_match_eos () == MATCH_YES)
10349 goto cleanup;
10350 if (gfc_match_char (',') != MATCH_YES)
10351 break;
10354 if (gfc_current_state () == COMP_ENUM)
10356 gfc_free_enum_history ();
10357 gfc_error ("Syntax error in ENUMERATOR definition at %C");
10358 m = MATCH_ERROR;
10361 cleanup:
10362 gfc_free_array_spec (current_as);
10363 current_as = NULL;
10364 return m;
10369 /* Match binding attributes. */
10371 static match
10372 match_binding_attributes (gfc_typebound_proc* ba, bool generic, bool ppc)
10374 bool found_passing = false;
10375 bool seen_ptr = false;
10376 match m = MATCH_YES;
10378 /* Initialize to defaults. Do so even before the MATCH_NO check so that in
10379 this case the defaults are in there. */
10380 ba->access = ACCESS_UNKNOWN;
10381 ba->pass_arg = NULL;
10382 ba->pass_arg_num = 0;
10383 ba->nopass = 0;
10384 ba->non_overridable = 0;
10385 ba->deferred = 0;
10386 ba->ppc = ppc;
10388 /* If we find a comma, we believe there are binding attributes. */
10389 m = gfc_match_char (',');
10390 if (m == MATCH_NO)
10391 goto done;
10395 /* Access specifier. */
10397 m = gfc_match (" public");
10398 if (m == MATCH_ERROR)
10399 goto error;
10400 if (m == MATCH_YES)
10402 if (ba->access != ACCESS_UNKNOWN)
10404 gfc_error ("Duplicate access-specifier at %C");
10405 goto error;
10408 ba->access = ACCESS_PUBLIC;
10409 continue;
10412 m = gfc_match (" private");
10413 if (m == MATCH_ERROR)
10414 goto error;
10415 if (m == MATCH_YES)
10417 if (ba->access != ACCESS_UNKNOWN)
10419 gfc_error ("Duplicate access-specifier at %C");
10420 goto error;
10423 ba->access = ACCESS_PRIVATE;
10424 continue;
10427 /* If inside GENERIC, the following is not allowed. */
10428 if (!generic)
10431 /* NOPASS flag. */
10432 m = gfc_match (" nopass");
10433 if (m == MATCH_ERROR)
10434 goto error;
10435 if (m == MATCH_YES)
10437 if (found_passing)
10439 gfc_error ("Binding attributes already specify passing,"
10440 " illegal NOPASS at %C");
10441 goto error;
10444 found_passing = true;
10445 ba->nopass = 1;
10446 continue;
10449 /* PASS possibly including argument. */
10450 m = gfc_match (" pass");
10451 if (m == MATCH_ERROR)
10452 goto error;
10453 if (m == MATCH_YES)
10455 char arg[GFC_MAX_SYMBOL_LEN + 1];
10457 if (found_passing)
10459 gfc_error ("Binding attributes already specify passing,"
10460 " illegal PASS at %C");
10461 goto error;
10464 m = gfc_match (" ( %n )", arg);
10465 if (m == MATCH_ERROR)
10466 goto error;
10467 if (m == MATCH_YES)
10468 ba->pass_arg = gfc_get_string ("%s", arg);
10469 gcc_assert ((m == MATCH_YES) == (ba->pass_arg != NULL));
10471 found_passing = true;
10472 ba->nopass = 0;
10473 continue;
10476 if (ppc)
10478 /* POINTER flag. */
10479 m = gfc_match (" pointer");
10480 if (m == MATCH_ERROR)
10481 goto error;
10482 if (m == MATCH_YES)
10484 if (seen_ptr)
10486 gfc_error ("Duplicate POINTER attribute at %C");
10487 goto error;
10490 seen_ptr = true;
10491 continue;
10494 else
10496 /* NON_OVERRIDABLE flag. */
10497 m = gfc_match (" non_overridable");
10498 if (m == MATCH_ERROR)
10499 goto error;
10500 if (m == MATCH_YES)
10502 if (ba->non_overridable)
10504 gfc_error ("Duplicate NON_OVERRIDABLE at %C");
10505 goto error;
10508 ba->non_overridable = 1;
10509 continue;
10512 /* DEFERRED flag. */
10513 m = gfc_match (" deferred");
10514 if (m == MATCH_ERROR)
10515 goto error;
10516 if (m == MATCH_YES)
10518 if (ba->deferred)
10520 gfc_error ("Duplicate DEFERRED at %C");
10521 goto error;
10524 ba->deferred = 1;
10525 continue;
10531 /* Nothing matching found. */
10532 if (generic)
10533 gfc_error ("Expected access-specifier at %C");
10534 else
10535 gfc_error ("Expected binding attribute at %C");
10536 goto error;
10538 while (gfc_match_char (',') == MATCH_YES);
10540 /* NON_OVERRIDABLE and DEFERRED exclude themselves. */
10541 if (ba->non_overridable && ba->deferred)
10543 gfc_error ("NON_OVERRIDABLE and DEFERRED can't both appear at %C");
10544 goto error;
10547 m = MATCH_YES;
10549 done:
10550 if (ba->access == ACCESS_UNKNOWN)
10551 ba->access = gfc_typebound_default_access;
10553 if (ppc && !seen_ptr)
10555 gfc_error ("POINTER attribute is required for procedure pointer component"
10556 " at %C");
10557 goto error;
10560 return m;
10562 error:
10563 return MATCH_ERROR;
10567 /* Match a PROCEDURE specific binding inside a derived type. */
10569 static match
10570 match_procedure_in_type (void)
10572 char name[GFC_MAX_SYMBOL_LEN + 1];
10573 char target_buf[GFC_MAX_SYMBOL_LEN + 1];
10574 char* target = NULL, *ifc = NULL;
10575 gfc_typebound_proc tb;
10576 bool seen_colons;
10577 bool seen_attrs;
10578 match m;
10579 gfc_symtree* stree;
10580 gfc_namespace* ns;
10581 gfc_symbol* block;
10582 int num;
10584 /* Check current state. */
10585 gcc_assert (gfc_state_stack->state == COMP_DERIVED_CONTAINS);
10586 block = gfc_state_stack->previous->sym;
10587 gcc_assert (block);
10589 /* Try to match PROCEDURE(interface). */
10590 if (gfc_match (" (") == MATCH_YES)
10592 m = gfc_match_name (target_buf);
10593 if (m == MATCH_ERROR)
10594 return m;
10595 if (m != MATCH_YES)
10597 gfc_error ("Interface-name expected after %<(%> at %C");
10598 return MATCH_ERROR;
10601 if (gfc_match (" )") != MATCH_YES)
10603 gfc_error ("%<)%> expected at %C");
10604 return MATCH_ERROR;
10607 ifc = target_buf;
10610 /* Construct the data structure. */
10611 memset (&tb, 0, sizeof (tb));
10612 tb.where = gfc_current_locus;
10614 /* Match binding attributes. */
10615 m = match_binding_attributes (&tb, false, false);
10616 if (m == MATCH_ERROR)
10617 return m;
10618 seen_attrs = (m == MATCH_YES);
10620 /* Check that attribute DEFERRED is given if an interface is specified. */
10621 if (tb.deferred && !ifc)
10623 gfc_error ("Interface must be specified for DEFERRED binding at %C");
10624 return MATCH_ERROR;
10626 if (ifc && !tb.deferred)
10628 gfc_error ("PROCEDURE(interface) at %C should be declared DEFERRED");
10629 return MATCH_ERROR;
10632 /* Match the colons. */
10633 m = gfc_match (" ::");
10634 if (m == MATCH_ERROR)
10635 return m;
10636 seen_colons = (m == MATCH_YES);
10637 if (seen_attrs && !seen_colons)
10639 gfc_error ("Expected %<::%> after binding-attributes at %C");
10640 return MATCH_ERROR;
10643 /* Match the binding names. */
10644 for(num=1;;num++)
10646 m = gfc_match_name (name);
10647 if (m == MATCH_ERROR)
10648 return m;
10649 if (m == MATCH_NO)
10651 gfc_error ("Expected binding name at %C");
10652 return MATCH_ERROR;
10655 if (num>1 && !gfc_notify_std (GFC_STD_F2008, "PROCEDURE list at %C"))
10656 return MATCH_ERROR;
10658 /* Try to match the '=> target', if it's there. */
10659 target = ifc;
10660 m = gfc_match (" =>");
10661 if (m == MATCH_ERROR)
10662 return m;
10663 if (m == MATCH_YES)
10665 if (tb.deferred)
10667 gfc_error ("%<=> target%> is invalid for DEFERRED binding at %C");
10668 return MATCH_ERROR;
10671 if (!seen_colons)
10673 gfc_error ("%<::%> needed in PROCEDURE binding with explicit target"
10674 " at %C");
10675 return MATCH_ERROR;
10678 m = gfc_match_name (target_buf);
10679 if (m == MATCH_ERROR)
10680 return m;
10681 if (m == MATCH_NO)
10683 gfc_error ("Expected binding target after %<=>%> at %C");
10684 return MATCH_ERROR;
10686 target = target_buf;
10689 /* If no target was found, it has the same name as the binding. */
10690 if (!target)
10691 target = name;
10693 /* Get the namespace to insert the symbols into. */
10694 ns = block->f2k_derived;
10695 gcc_assert (ns);
10697 /* If the binding is DEFERRED, check that the containing type is ABSTRACT. */
10698 if (tb.deferred && !block->attr.abstract)
10700 gfc_error ("Type %qs containing DEFERRED binding at %C "
10701 "is not ABSTRACT", block->name);
10702 return MATCH_ERROR;
10705 /* See if we already have a binding with this name in the symtree which
10706 would be an error. If a GENERIC already targeted this binding, it may
10707 be already there but then typebound is still NULL. */
10708 stree = gfc_find_symtree (ns->tb_sym_root, name);
10709 if (stree && stree->n.tb)
10711 gfc_error ("There is already a procedure with binding name %qs for "
10712 "the derived type %qs at %C", name, block->name);
10713 return MATCH_ERROR;
10716 /* Insert it and set attributes. */
10718 if (!stree)
10720 stree = gfc_new_symtree (&ns->tb_sym_root, name);
10721 gcc_assert (stree);
10723 stree->n.tb = gfc_get_typebound_proc (&tb);
10725 if (gfc_get_sym_tree (target, gfc_current_ns, &stree->n.tb->u.specific,
10726 false))
10727 return MATCH_ERROR;
10728 gfc_set_sym_referenced (stree->n.tb->u.specific->n.sym);
10729 gfc_add_flavor(&stree->n.tb->u.specific->n.sym->attr, FL_PROCEDURE,
10730 target, &stree->n.tb->u.specific->n.sym->declared_at);
10732 if (gfc_match_eos () == MATCH_YES)
10733 return MATCH_YES;
10734 if (gfc_match_char (',') != MATCH_YES)
10735 goto syntax;
10738 syntax:
10739 gfc_error ("Syntax error in PROCEDURE statement at %C");
10740 return MATCH_ERROR;
10744 /* Match a GENERIC procedure binding inside a derived type. */
10746 match
10747 gfc_match_generic (void)
10749 char name[GFC_MAX_SYMBOL_LEN + 1];
10750 char bind_name[GFC_MAX_SYMBOL_LEN + 16]; /* Allow space for OPERATOR(...). */
10751 gfc_symbol* block;
10752 gfc_typebound_proc tbattr; /* Used for match_binding_attributes. */
10753 gfc_typebound_proc* tb;
10754 gfc_namespace* ns;
10755 interface_type op_type;
10756 gfc_intrinsic_op op;
10757 match m;
10759 /* Check current state. */
10760 if (gfc_current_state () == COMP_DERIVED)
10762 gfc_error ("GENERIC at %C must be inside a derived-type CONTAINS");
10763 return MATCH_ERROR;
10765 if (gfc_current_state () != COMP_DERIVED_CONTAINS)
10766 return MATCH_NO;
10767 block = gfc_state_stack->previous->sym;
10768 ns = block->f2k_derived;
10769 gcc_assert (block && ns);
10771 memset (&tbattr, 0, sizeof (tbattr));
10772 tbattr.where = gfc_current_locus;
10774 /* See if we get an access-specifier. */
10775 m = match_binding_attributes (&tbattr, true, false);
10776 if (m == MATCH_ERROR)
10777 goto error;
10779 /* Now the colons, those are required. */
10780 if (gfc_match (" ::") != MATCH_YES)
10782 gfc_error ("Expected %<::%> at %C");
10783 goto error;
10786 /* Match the binding name; depending on type (operator / generic) format
10787 it for future error messages into bind_name. */
10789 m = gfc_match_generic_spec (&op_type, name, &op);
10790 if (m == MATCH_ERROR)
10791 return MATCH_ERROR;
10792 if (m == MATCH_NO)
10794 gfc_error ("Expected generic name or operator descriptor at %C");
10795 goto error;
10798 switch (op_type)
10800 case INTERFACE_GENERIC:
10801 case INTERFACE_DTIO:
10802 snprintf (bind_name, sizeof (bind_name), "%s", name);
10803 break;
10805 case INTERFACE_USER_OP:
10806 snprintf (bind_name, sizeof (bind_name), "OPERATOR(.%s.)", name);
10807 break;
10809 case INTERFACE_INTRINSIC_OP:
10810 snprintf (bind_name, sizeof (bind_name), "OPERATOR(%s)",
10811 gfc_op2string (op));
10812 break;
10814 case INTERFACE_NAMELESS:
10815 gfc_error ("Malformed GENERIC statement at %C");
10816 goto error;
10817 break;
10819 default:
10820 gcc_unreachable ();
10823 /* Match the required =>. */
10824 if (gfc_match (" =>") != MATCH_YES)
10826 gfc_error ("Expected %<=>%> at %C");
10827 goto error;
10830 /* Try to find existing GENERIC binding with this name / for this operator;
10831 if there is something, check that it is another GENERIC and then extend
10832 it rather than building a new node. Otherwise, create it and put it
10833 at the right position. */
10835 switch (op_type)
10837 case INTERFACE_DTIO:
10838 case INTERFACE_USER_OP:
10839 case INTERFACE_GENERIC:
10841 const bool is_op = (op_type == INTERFACE_USER_OP);
10842 gfc_symtree* st;
10844 st = gfc_find_symtree (is_op ? ns->tb_uop_root : ns->tb_sym_root, name);
10845 tb = st ? st->n.tb : NULL;
10846 break;
10849 case INTERFACE_INTRINSIC_OP:
10850 tb = ns->tb_op[op];
10851 break;
10853 default:
10854 gcc_unreachable ();
10857 if (tb)
10859 if (!tb->is_generic)
10861 gcc_assert (op_type == INTERFACE_GENERIC);
10862 gfc_error ("There's already a non-generic procedure with binding name"
10863 " %qs for the derived type %qs at %C",
10864 bind_name, block->name);
10865 goto error;
10868 if (tb->access != tbattr.access)
10870 gfc_error ("Binding at %C must have the same access as already"
10871 " defined binding %qs", bind_name);
10872 goto error;
10875 else
10877 tb = gfc_get_typebound_proc (NULL);
10878 tb->where = gfc_current_locus;
10879 tb->access = tbattr.access;
10880 tb->is_generic = 1;
10881 tb->u.generic = NULL;
10883 switch (op_type)
10885 case INTERFACE_DTIO:
10886 case INTERFACE_GENERIC:
10887 case INTERFACE_USER_OP:
10889 const bool is_op = (op_type == INTERFACE_USER_OP);
10890 gfc_symtree* st = gfc_get_tbp_symtree (is_op ? &ns->tb_uop_root :
10891 &ns->tb_sym_root, name);
10892 gcc_assert (st);
10893 st->n.tb = tb;
10895 break;
10898 case INTERFACE_INTRINSIC_OP:
10899 ns->tb_op[op] = tb;
10900 break;
10902 default:
10903 gcc_unreachable ();
10907 /* Now, match all following names as specific targets. */
10910 gfc_symtree* target_st;
10911 gfc_tbp_generic* target;
10913 m = gfc_match_name (name);
10914 if (m == MATCH_ERROR)
10915 goto error;
10916 if (m == MATCH_NO)
10918 gfc_error ("Expected specific binding name at %C");
10919 goto error;
10922 target_st = gfc_get_tbp_symtree (&ns->tb_sym_root, name);
10924 /* See if this is a duplicate specification. */
10925 for (target = tb->u.generic; target; target = target->next)
10926 if (target_st == target->specific_st)
10928 gfc_error ("%qs already defined as specific binding for the"
10929 " generic %qs at %C", name, bind_name);
10930 goto error;
10933 target = gfc_get_tbp_generic ();
10934 target->specific_st = target_st;
10935 target->specific = NULL;
10936 target->next = tb->u.generic;
10937 target->is_operator = ((op_type == INTERFACE_USER_OP)
10938 || (op_type == INTERFACE_INTRINSIC_OP));
10939 tb->u.generic = target;
10941 while (gfc_match (" ,") == MATCH_YES);
10943 /* Here should be the end. */
10944 if (gfc_match_eos () != MATCH_YES)
10946 gfc_error ("Junk after GENERIC binding at %C");
10947 goto error;
10950 return MATCH_YES;
10952 error:
10953 return MATCH_ERROR;
10957 /* Match a FINAL declaration inside a derived type. */
10959 match
10960 gfc_match_final_decl (void)
10962 char name[GFC_MAX_SYMBOL_LEN + 1];
10963 gfc_symbol* sym;
10964 match m;
10965 gfc_namespace* module_ns;
10966 bool first, last;
10967 gfc_symbol* block;
10969 if (gfc_current_form == FORM_FREE)
10971 char c = gfc_peek_ascii_char ();
10972 if (!gfc_is_whitespace (c) && c != ':')
10973 return MATCH_NO;
10976 if (gfc_state_stack->state != COMP_DERIVED_CONTAINS)
10978 if (gfc_current_form == FORM_FIXED)
10979 return MATCH_NO;
10981 gfc_error ("FINAL declaration at %C must be inside a derived type "
10982 "CONTAINS section");
10983 return MATCH_ERROR;
10986 block = gfc_state_stack->previous->sym;
10987 gcc_assert (block);
10989 if (!gfc_state_stack->previous || !gfc_state_stack->previous->previous
10990 || gfc_state_stack->previous->previous->state != COMP_MODULE)
10992 gfc_error ("Derived type declaration with FINAL at %C must be in the"
10993 " specification part of a MODULE");
10994 return MATCH_ERROR;
10997 module_ns = gfc_current_ns;
10998 gcc_assert (module_ns);
10999 gcc_assert (module_ns->proc_name->attr.flavor == FL_MODULE);
11001 /* Match optional ::, don't care about MATCH_YES or MATCH_NO. */
11002 if (gfc_match (" ::") == MATCH_ERROR)
11003 return MATCH_ERROR;
11005 /* Match the sequence of procedure names. */
11006 first = true;
11007 last = false;
11010 gfc_finalizer* f;
11012 if (first && gfc_match_eos () == MATCH_YES)
11014 gfc_error ("Empty FINAL at %C");
11015 return MATCH_ERROR;
11018 m = gfc_match_name (name);
11019 if (m == MATCH_NO)
11021 gfc_error ("Expected module procedure name at %C");
11022 return MATCH_ERROR;
11024 else if (m != MATCH_YES)
11025 return MATCH_ERROR;
11027 if (gfc_match_eos () == MATCH_YES)
11028 last = true;
11029 if (!last && gfc_match_char (',') != MATCH_YES)
11031 gfc_error ("Expected %<,%> at %C");
11032 return MATCH_ERROR;
11035 if (gfc_get_symbol (name, module_ns, &sym))
11037 gfc_error ("Unknown procedure name %qs at %C", name);
11038 return MATCH_ERROR;
11041 /* Mark the symbol as module procedure. */
11042 if (sym->attr.proc != PROC_MODULE
11043 && !gfc_add_procedure (&sym->attr, PROC_MODULE, sym->name, NULL))
11044 return MATCH_ERROR;
11046 /* Check if we already have this symbol in the list, this is an error. */
11047 for (f = block->f2k_derived->finalizers; f; f = f->next)
11048 if (f->proc_sym == sym)
11050 gfc_error ("%qs at %C is already defined as FINAL procedure",
11051 name);
11052 return MATCH_ERROR;
11055 /* Add this symbol to the list of finalizers. */
11056 gcc_assert (block->f2k_derived);
11057 sym->refs++;
11058 f = XCNEW (gfc_finalizer);
11059 f->proc_sym = sym;
11060 f->proc_tree = NULL;
11061 f->where = gfc_current_locus;
11062 f->next = block->f2k_derived->finalizers;
11063 block->f2k_derived->finalizers = f;
11065 first = false;
11067 while (!last);
11069 return MATCH_YES;
11073 const ext_attr_t ext_attr_list[] = {
11074 { "dllimport", EXT_ATTR_DLLIMPORT, "dllimport" },
11075 { "dllexport", EXT_ATTR_DLLEXPORT, "dllexport" },
11076 { "cdecl", EXT_ATTR_CDECL, "cdecl" },
11077 { "stdcall", EXT_ATTR_STDCALL, "stdcall" },
11078 { "fastcall", EXT_ATTR_FASTCALL, "fastcall" },
11079 { "no_arg_check", EXT_ATTR_NO_ARG_CHECK, NULL },
11080 { NULL, EXT_ATTR_LAST, NULL }
11083 /* Match a !GCC$ ATTRIBUTES statement of the form:
11084 !GCC$ ATTRIBUTES attribute-list :: var-name [, var-name] ...
11085 When we come here, we have already matched the !GCC$ ATTRIBUTES string.
11087 TODO: We should support all GCC attributes using the same syntax for
11088 the attribute list, i.e. the list in C
11089 __attributes(( attribute-list ))
11090 matches then
11091 !GCC$ ATTRIBUTES attribute-list ::
11092 Cf. c-parser.c's c_parser_attributes; the data can then directly be
11093 saved into a TREE.
11095 As there is absolutely no risk of confusion, we should never return
11096 MATCH_NO. */
11097 match
11098 gfc_match_gcc_attributes (void)
11100 symbol_attribute attr;
11101 char name[GFC_MAX_SYMBOL_LEN + 1];
11102 unsigned id;
11103 gfc_symbol *sym;
11104 match m;
11106 gfc_clear_attr (&attr);
11107 for(;;)
11109 char ch;
11111 if (gfc_match_name (name) != MATCH_YES)
11112 return MATCH_ERROR;
11114 for (id = 0; id < EXT_ATTR_LAST; id++)
11115 if (strcmp (name, ext_attr_list[id].name) == 0)
11116 break;
11118 if (id == EXT_ATTR_LAST)
11120 gfc_error ("Unknown attribute in !GCC$ ATTRIBUTES statement at %C");
11121 return MATCH_ERROR;
11124 if (!gfc_add_ext_attribute (&attr, (ext_attr_id_t)id, &gfc_current_locus))
11125 return MATCH_ERROR;
11127 gfc_gobble_whitespace ();
11128 ch = gfc_next_ascii_char ();
11129 if (ch == ':')
11131 /* This is the successful exit condition for the loop. */
11132 if (gfc_next_ascii_char () == ':')
11133 break;
11136 if (ch == ',')
11137 continue;
11139 goto syntax;
11142 if (gfc_match_eos () == MATCH_YES)
11143 goto syntax;
11145 for(;;)
11147 m = gfc_match_name (name);
11148 if (m != MATCH_YES)
11149 return m;
11151 if (find_special (name, &sym, true))
11152 return MATCH_ERROR;
11154 sym->attr.ext_attr |= attr.ext_attr;
11156 if (gfc_match_eos () == MATCH_YES)
11157 break;
11159 if (gfc_match_char (',') != MATCH_YES)
11160 goto syntax;
11163 return MATCH_YES;
11165 syntax:
11166 gfc_error ("Syntax error in !GCC$ ATTRIBUTES statement at %C");
11167 return MATCH_ERROR;
11171 /* Match a !GCC$ UNROLL statement of the form:
11172 !GCC$ UNROLL n
11174 The parameter n is the number of times we are supposed to unroll.
11176 When we come here, we have already matched the !GCC$ UNROLL string. */
11177 match
11178 gfc_match_gcc_unroll (void)
11180 int value;
11182 if (gfc_match_small_int (&value) == MATCH_YES)
11184 if (value < 0 || value > USHRT_MAX)
11186 gfc_error ("%<GCC unroll%> directive requires a"
11187 " non-negative integral constant"
11188 " less than or equal to %u at %C",
11189 USHRT_MAX
11191 return MATCH_ERROR;
11193 if (gfc_match_eos () == MATCH_YES)
11195 directive_unroll = value == 0 ? 1 : value;
11196 return MATCH_YES;
11200 gfc_error ("Syntax error in !GCC$ UNROLL directive at %C");
11201 return MATCH_ERROR;