2017-09-26 Thomas Koenig <tkoenig@gcc.gnu.org>
[official-gcc.git] / gcc / fortran / decl.c
blob18220a127c3c69351f4e797f5c84ad0ef5f97704
1 /* Declaration statement matcher
2 Copyright (C) 2002-2017 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 /* If a kind expression of a component of a parameterized derived type is
99 parameterized, temporarily store the expression here. */
100 static gfc_expr *saved_kind_expr = NULL;
102 /* Used to store the parameter list arising in a PDT declaration and
103 in the typespec of a PDT variable or component. */
104 static gfc_actual_arglist *decl_type_param_list;
105 static gfc_actual_arglist *type_param_spec_list;
108 /********************* DATA statement subroutines *********************/
110 static bool in_match_data = false;
112 bool
113 gfc_in_match_data (void)
115 return in_match_data;
118 static void
119 set_in_match_data (bool set_value)
121 in_match_data = set_value;
124 /* Free a gfc_data_variable structure and everything beneath it. */
126 static void
127 free_variable (gfc_data_variable *p)
129 gfc_data_variable *q;
131 for (; p; p = q)
133 q = p->next;
134 gfc_free_expr (p->expr);
135 gfc_free_iterator (&p->iter, 0);
136 free_variable (p->list);
137 free (p);
142 /* Free a gfc_data_value structure and everything beneath it. */
144 static void
145 free_value (gfc_data_value *p)
147 gfc_data_value *q;
149 for (; p; p = q)
151 q = p->next;
152 mpz_clear (p->repeat);
153 gfc_free_expr (p->expr);
154 free (p);
159 /* Free a list of gfc_data structures. */
161 void
162 gfc_free_data (gfc_data *p)
164 gfc_data *q;
166 for (; p; p = q)
168 q = p->next;
169 free_variable (p->var);
170 free_value (p->value);
171 free (p);
176 /* Free all data in a namespace. */
178 static void
179 gfc_free_data_all (gfc_namespace *ns)
181 gfc_data *d;
183 for (;ns->data;)
185 d = ns->data->next;
186 free (ns->data);
187 ns->data = d;
191 /* Reject data parsed since the last restore point was marked. */
193 void
194 gfc_reject_data (gfc_namespace *ns)
196 gfc_data *d;
198 while (ns->data && ns->data != ns->old_data)
200 d = ns->data->next;
201 free (ns->data);
202 ns->data = d;
206 static match var_element (gfc_data_variable *);
208 /* Match a list of variables terminated by an iterator and a right
209 parenthesis. */
211 static match
212 var_list (gfc_data_variable *parent)
214 gfc_data_variable *tail, var;
215 match m;
217 m = var_element (&var);
218 if (m == MATCH_ERROR)
219 return MATCH_ERROR;
220 if (m == MATCH_NO)
221 goto syntax;
223 tail = gfc_get_data_variable ();
224 *tail = var;
226 parent->list = tail;
228 for (;;)
230 if (gfc_match_char (',') != MATCH_YES)
231 goto syntax;
233 m = gfc_match_iterator (&parent->iter, 1);
234 if (m == MATCH_YES)
235 break;
236 if (m == MATCH_ERROR)
237 return MATCH_ERROR;
239 m = var_element (&var);
240 if (m == MATCH_ERROR)
241 return MATCH_ERROR;
242 if (m == MATCH_NO)
243 goto syntax;
245 tail->next = gfc_get_data_variable ();
246 tail = tail->next;
248 *tail = var;
251 if (gfc_match_char (')') != MATCH_YES)
252 goto syntax;
253 return MATCH_YES;
255 syntax:
256 gfc_syntax_error (ST_DATA);
257 return MATCH_ERROR;
261 /* Match a single element in a data variable list, which can be a
262 variable-iterator list. */
264 static match
265 var_element (gfc_data_variable *new_var)
267 match m;
268 gfc_symbol *sym;
270 memset (new_var, 0, sizeof (gfc_data_variable));
272 if (gfc_match_char ('(') == MATCH_YES)
273 return var_list (new_var);
275 m = gfc_match_variable (&new_var->expr, 0);
276 if (m != MATCH_YES)
277 return m;
279 sym = new_var->expr->symtree->n.sym;
281 /* Symbol should already have an associated type. */
282 if (!gfc_check_symbol_typed (sym, gfc_current_ns, false, gfc_current_locus))
283 return MATCH_ERROR;
285 if (!sym->attr.function && gfc_current_ns->parent
286 && gfc_current_ns->parent == sym->ns)
288 gfc_error ("Host associated variable %qs may not be in the DATA "
289 "statement at %C", sym->name);
290 return MATCH_ERROR;
293 if (gfc_current_state () != COMP_BLOCK_DATA
294 && sym->attr.in_common
295 && !gfc_notify_std (GFC_STD_GNU, "initialization of "
296 "common block variable %qs in DATA statement at %C",
297 sym->name))
298 return MATCH_ERROR;
300 if (!gfc_add_data (&sym->attr, sym->name, &new_var->expr->where))
301 return MATCH_ERROR;
303 return MATCH_YES;
307 /* Match the top-level list of data variables. */
309 static match
310 top_var_list (gfc_data *d)
312 gfc_data_variable var, *tail, *new_var;
313 match m;
315 tail = NULL;
317 for (;;)
319 m = var_element (&var);
320 if (m == MATCH_NO)
321 goto syntax;
322 if (m == MATCH_ERROR)
323 return MATCH_ERROR;
325 new_var = gfc_get_data_variable ();
326 *new_var = var;
328 if (tail == NULL)
329 d->var = new_var;
330 else
331 tail->next = new_var;
333 tail = new_var;
335 if (gfc_match_char ('/') == MATCH_YES)
336 break;
337 if (gfc_match_char (',') != MATCH_YES)
338 goto syntax;
341 return MATCH_YES;
343 syntax:
344 gfc_syntax_error (ST_DATA);
345 gfc_free_data_all (gfc_current_ns);
346 return MATCH_ERROR;
350 static match
351 match_data_constant (gfc_expr **result)
353 char name[GFC_MAX_SYMBOL_LEN + 1];
354 gfc_symbol *sym, *dt_sym = NULL;
355 gfc_expr *expr;
356 match m;
357 locus old_loc;
359 m = gfc_match_literal_constant (&expr, 1);
360 if (m == MATCH_YES)
362 *result = expr;
363 return MATCH_YES;
366 if (m == MATCH_ERROR)
367 return MATCH_ERROR;
369 m = gfc_match_null (result);
370 if (m != MATCH_NO)
371 return m;
373 old_loc = gfc_current_locus;
375 /* Should this be a structure component, try to match it
376 before matching a name. */
377 m = gfc_match_rvalue (result);
378 if (m == MATCH_ERROR)
379 return m;
381 if (m == MATCH_YES && (*result)->expr_type == EXPR_STRUCTURE)
383 if (!gfc_simplify_expr (*result, 0))
384 m = MATCH_ERROR;
385 return m;
387 else if (m == MATCH_YES)
388 gfc_free_expr (*result);
390 gfc_current_locus = old_loc;
392 m = gfc_match_name (name);
393 if (m != MATCH_YES)
394 return m;
396 if (gfc_find_symbol (name, NULL, 1, &sym))
397 return MATCH_ERROR;
399 if (sym && sym->attr.generic)
400 dt_sym = gfc_find_dt_in_generic (sym);
402 if (sym == NULL
403 || (sym->attr.flavor != FL_PARAMETER
404 && (!dt_sym || !gfc_fl_struct (dt_sym->attr.flavor))))
406 gfc_error ("Symbol %qs must be a PARAMETER in DATA statement at %C",
407 name);
408 *result = NULL;
409 return MATCH_ERROR;
411 else if (dt_sym && gfc_fl_struct (dt_sym->attr.flavor))
412 return gfc_match_structure_constructor (dt_sym, result);
414 /* Check to see if the value is an initialization array expression. */
415 if (sym->value->expr_type == EXPR_ARRAY)
417 gfc_current_locus = old_loc;
419 m = gfc_match_init_expr (result);
420 if (m == MATCH_ERROR)
421 return m;
423 if (m == MATCH_YES)
425 if (!gfc_simplify_expr (*result, 0))
426 m = MATCH_ERROR;
428 if ((*result)->expr_type == EXPR_CONSTANT)
429 return m;
430 else
432 gfc_error ("Invalid initializer %s in Data statement at %C", name);
433 return MATCH_ERROR;
438 *result = gfc_copy_expr (sym->value);
439 return MATCH_YES;
443 /* Match a list of values in a DATA statement. The leading '/' has
444 already been seen at this point. */
446 static match
447 top_val_list (gfc_data *data)
449 gfc_data_value *new_val, *tail;
450 gfc_expr *expr;
451 match m;
453 tail = NULL;
455 for (;;)
457 m = match_data_constant (&expr);
458 if (m == MATCH_NO)
459 goto syntax;
460 if (m == MATCH_ERROR)
461 return MATCH_ERROR;
463 new_val = gfc_get_data_value ();
464 mpz_init (new_val->repeat);
466 if (tail == NULL)
467 data->value = new_val;
468 else
469 tail->next = new_val;
471 tail = new_val;
473 if (expr->ts.type != BT_INTEGER || gfc_match_char ('*') != MATCH_YES)
475 tail->expr = expr;
476 mpz_set_ui (tail->repeat, 1);
478 else
480 mpz_set (tail->repeat, expr->value.integer);
481 gfc_free_expr (expr);
483 m = match_data_constant (&tail->expr);
484 if (m == MATCH_NO)
485 goto syntax;
486 if (m == MATCH_ERROR)
487 return MATCH_ERROR;
490 if (gfc_match_char ('/') == MATCH_YES)
491 break;
492 if (gfc_match_char (',') == MATCH_NO)
493 goto syntax;
496 return MATCH_YES;
498 syntax:
499 gfc_syntax_error (ST_DATA);
500 gfc_free_data_all (gfc_current_ns);
501 return MATCH_ERROR;
505 /* Matches an old style initialization. */
507 static match
508 match_old_style_init (const char *name)
510 match m;
511 gfc_symtree *st;
512 gfc_symbol *sym;
513 gfc_data *newdata;
515 /* Set up data structure to hold initializers. */
516 gfc_find_sym_tree (name, NULL, 0, &st);
517 sym = st->n.sym;
519 newdata = gfc_get_data ();
520 newdata->var = gfc_get_data_variable ();
521 newdata->var->expr = gfc_get_variable_expr (st);
522 newdata->where = gfc_current_locus;
524 /* Match initial value list. This also eats the terminal '/'. */
525 m = top_val_list (newdata);
526 if (m != MATCH_YES)
528 free (newdata);
529 return m;
532 if (gfc_pure (NULL))
534 gfc_error ("Initialization at %C is not allowed in a PURE procedure");
535 free (newdata);
536 return MATCH_ERROR;
538 gfc_unset_implicit_pure (gfc_current_ns->proc_name);
540 /* Mark the variable as having appeared in a data statement. */
541 if (!gfc_add_data (&sym->attr, sym->name, &sym->declared_at))
543 free (newdata);
544 return MATCH_ERROR;
547 /* Chain in namespace list of DATA initializers. */
548 newdata->next = gfc_current_ns->data;
549 gfc_current_ns->data = newdata;
551 return m;
555 /* Match the stuff following a DATA statement. If ERROR_FLAG is set,
556 we are matching a DATA statement and are therefore issuing an error
557 if we encounter something unexpected, if not, we're trying to match
558 an old-style initialization expression of the form INTEGER I /2/. */
560 match
561 gfc_match_data (void)
563 gfc_data *new_data;
564 match m;
566 /* Before parsing the rest of a DATA statement, check F2008:c1206. */
567 if ((gfc_current_state () == COMP_FUNCTION
568 || gfc_current_state () == COMP_SUBROUTINE)
569 && gfc_state_stack->previous->state == COMP_INTERFACE)
571 gfc_error ("DATA statement at %C cannot appear within an INTERFACE");
572 return MATCH_ERROR;
575 set_in_match_data (true);
577 for (;;)
579 new_data = gfc_get_data ();
580 new_data->where = gfc_current_locus;
582 m = top_var_list (new_data);
583 if (m != MATCH_YES)
584 goto cleanup;
586 m = top_val_list (new_data);
587 if (m != MATCH_YES)
588 goto cleanup;
590 new_data->next = gfc_current_ns->data;
591 gfc_current_ns->data = new_data;
593 if (gfc_match_eos () == MATCH_YES)
594 break;
596 gfc_match_char (','); /* Optional comma */
599 set_in_match_data (false);
601 if (gfc_pure (NULL))
603 gfc_error ("DATA statement at %C is not allowed in a PURE procedure");
604 return MATCH_ERROR;
606 gfc_unset_implicit_pure (gfc_current_ns->proc_name);
608 return MATCH_YES;
610 cleanup:
611 set_in_match_data (false);
612 gfc_free_data (new_data);
613 return MATCH_ERROR;
617 /************************ Declaration statements *********************/
620 /* Like gfc_match_init_expr, but matches a 'clist' (old-style initialization
621 list). The difference here is the expression is a list of constants
622 and is surrounded by '/'.
623 The typespec ts must match the typespec of the variable which the
624 clist is initializing.
625 The arrayspec tells whether this should match a list of constants
626 corresponding to array elements or a scalar (as == NULL). */
628 static match
629 match_clist_expr (gfc_expr **result, gfc_typespec *ts, gfc_array_spec *as)
631 gfc_constructor_base array_head = NULL;
632 gfc_expr *expr = NULL;
633 match m;
634 locus where;
635 mpz_t repeat, size;
636 bool scalar;
637 int cmp;
639 gcc_assert (ts);
641 mpz_init_set_ui (repeat, 0);
642 mpz_init (size);
643 scalar = !as || !as->rank;
645 /* We have already matched '/' - now look for a constant list, as with
646 top_val_list from decl.c, but append the result to an array. */
647 if (gfc_match ("/") == MATCH_YES)
649 gfc_error ("Empty old style initializer list at %C");
650 goto cleanup;
653 where = gfc_current_locus;
654 for (;;)
656 m = match_data_constant (&expr);
657 if (m != MATCH_YES)
658 expr = NULL; /* match_data_constant may set expr to garbage */
659 if (m == MATCH_NO)
660 goto syntax;
661 if (m == MATCH_ERROR)
662 goto cleanup;
664 /* Found r in repeat spec r*c; look for the constant to repeat. */
665 if ( gfc_match_char ('*') == MATCH_YES)
667 if (scalar)
669 gfc_error ("Repeat spec invalid in scalar initializer at %C");
670 goto cleanup;
672 if (expr->ts.type != BT_INTEGER)
674 gfc_error ("Repeat spec must be an integer at %C");
675 goto cleanup;
677 mpz_set (repeat, expr->value.integer);
678 gfc_free_expr (expr);
679 expr = NULL;
681 m = match_data_constant (&expr);
682 if (m == MATCH_NO)
683 gfc_error ("Expected data constant after repeat spec at %C");
684 if (m != MATCH_YES)
685 goto cleanup;
687 /* No repeat spec, we matched the data constant itself. */
688 else
689 mpz_set_ui (repeat, 1);
691 if (!scalar)
693 /* Add the constant initializer as many times as repeated. */
694 for (; mpz_cmp_ui (repeat, 0) > 0; mpz_sub_ui (repeat, repeat, 1))
696 /* Make sure types of elements match */
697 if(ts && !gfc_compare_types (&expr->ts, ts)
698 && !gfc_convert_type (expr, ts, 1))
699 goto cleanup;
701 gfc_constructor_append_expr (&array_head,
702 gfc_copy_expr (expr), &gfc_current_locus);
705 gfc_free_expr (expr);
706 expr = NULL;
709 /* For scalar initializers quit after one element. */
710 else
712 if(gfc_match_char ('/') != MATCH_YES)
714 gfc_error ("End of scalar initializer expected at %C");
715 goto cleanup;
717 break;
720 if (gfc_match_char ('/') == MATCH_YES)
721 break;
722 if (gfc_match_char (',') == MATCH_NO)
723 goto syntax;
726 /* Set up expr as an array constructor. */
727 if (!scalar)
729 expr = gfc_get_array_expr (ts->type, ts->kind, &where);
730 expr->ts = *ts;
731 expr->value.constructor = array_head;
733 expr->rank = as->rank;
734 expr->shape = gfc_get_shape (expr->rank);
736 /* Validate sizes. */
737 gcc_assert (gfc_array_size (expr, &size));
738 gcc_assert (spec_size (as, &repeat));
739 cmp = mpz_cmp (size, repeat);
740 if (cmp < 0)
741 gfc_error ("Not enough elements in array initializer at %C");
742 else if (cmp > 0)
743 gfc_error ("Too many elements in array initializer at %C");
744 if (cmp)
745 goto cleanup;
748 /* Make sure scalar types match. */
749 else if (!gfc_compare_types (&expr->ts, ts)
750 && !gfc_convert_type (expr, ts, 1))
751 goto cleanup;
753 if (expr->ts.u.cl)
754 expr->ts.u.cl->length_from_typespec = 1;
756 *result = expr;
757 mpz_clear (size);
758 mpz_clear (repeat);
759 return MATCH_YES;
761 syntax:
762 gfc_error ("Syntax error in old style initializer list at %C");
764 cleanup:
765 if (expr)
766 expr->value.constructor = NULL;
767 gfc_free_expr (expr);
768 gfc_constructor_free (array_head);
769 mpz_clear (size);
770 mpz_clear (repeat);
771 return MATCH_ERROR;
775 /* Auxiliary function to merge DIMENSION and CODIMENSION array specs. */
777 static bool
778 merge_array_spec (gfc_array_spec *from, gfc_array_spec *to, bool copy)
780 int i;
782 if ((from->type == AS_ASSUMED_RANK && to->corank)
783 || (to->type == AS_ASSUMED_RANK && from->corank))
785 gfc_error ("The assumed-rank array at %C shall not have a codimension");
786 return false;
789 if (to->rank == 0 && from->rank > 0)
791 to->rank = from->rank;
792 to->type = from->type;
793 to->cray_pointee = from->cray_pointee;
794 to->cp_was_assumed = from->cp_was_assumed;
796 for (i = 0; i < to->corank; i++)
798 to->lower[from->rank + i] = to->lower[i];
799 to->upper[from->rank + i] = to->upper[i];
801 for (i = 0; i < from->rank; i++)
803 if (copy)
805 to->lower[i] = gfc_copy_expr (from->lower[i]);
806 to->upper[i] = gfc_copy_expr (from->upper[i]);
808 else
810 to->lower[i] = from->lower[i];
811 to->upper[i] = from->upper[i];
815 else if (to->corank == 0 && from->corank > 0)
817 to->corank = from->corank;
818 to->cotype = from->cotype;
820 for (i = 0; i < from->corank; i++)
822 if (copy)
824 to->lower[to->rank + i] = gfc_copy_expr (from->lower[i]);
825 to->upper[to->rank + i] = gfc_copy_expr (from->upper[i]);
827 else
829 to->lower[to->rank + i] = from->lower[i];
830 to->upper[to->rank + i] = from->upper[i];
835 return true;
839 /* Match an intent specification. Since this can only happen after an
840 INTENT word, a legal intent-spec must follow. */
842 static sym_intent
843 match_intent_spec (void)
846 if (gfc_match (" ( in out )") == MATCH_YES)
847 return INTENT_INOUT;
848 if (gfc_match (" ( in )") == MATCH_YES)
849 return INTENT_IN;
850 if (gfc_match (" ( out )") == MATCH_YES)
851 return INTENT_OUT;
853 gfc_error ("Bad INTENT specification at %C");
854 return INTENT_UNKNOWN;
858 /* Matches a character length specification, which is either a
859 specification expression, '*', or ':'. */
861 static match
862 char_len_param_value (gfc_expr **expr, bool *deferred)
864 match m;
866 *expr = NULL;
867 *deferred = false;
869 if (gfc_match_char ('*') == MATCH_YES)
870 return MATCH_YES;
872 if (gfc_match_char (':') == MATCH_YES)
874 if (!gfc_notify_std (GFC_STD_F2003, "deferred type parameter at %C"))
875 return MATCH_ERROR;
877 *deferred = true;
879 return MATCH_YES;
882 m = gfc_match_expr (expr);
884 if (m == MATCH_NO || m == MATCH_ERROR)
885 return m;
887 if (!gfc_expr_check_typed (*expr, gfc_current_ns, false))
888 return MATCH_ERROR;
890 if ((*expr)->expr_type == EXPR_FUNCTION)
892 if ((*expr)->ts.type == BT_INTEGER
893 || ((*expr)->ts.type == BT_UNKNOWN
894 && strcmp((*expr)->symtree->name, "null") != 0))
895 return MATCH_YES;
897 goto syntax;
899 else if ((*expr)->expr_type == EXPR_CONSTANT)
901 /* F2008, 4.4.3.1: The length is a type parameter; its kind is
902 processor dependent and its value is greater than or equal to zero.
903 F2008, 4.4.3.2: If the character length parameter value evaluates
904 to a negative value, the length of character entities declared
905 is zero. */
907 if ((*expr)->ts.type == BT_INTEGER)
909 if (mpz_cmp_si ((*expr)->value.integer, 0) < 0)
910 mpz_set_si ((*expr)->value.integer, 0);
912 else
913 goto syntax;
915 else if ((*expr)->expr_type == EXPR_ARRAY)
916 goto syntax;
917 else if ((*expr)->expr_type == EXPR_VARIABLE)
919 bool t;
920 gfc_expr *e;
922 e = gfc_copy_expr (*expr);
924 /* This catches the invalid code "[character(m(2:3)) :: 'x', 'y']",
925 which causes an ICE if gfc_reduce_init_expr() is called. */
926 if (e->ref && e->ref->type == REF_ARRAY
927 && e->ref->u.ar.type == AR_UNKNOWN
928 && e->ref->u.ar.dimen_type[0] == DIMEN_RANGE)
929 goto syntax;
931 t = gfc_reduce_init_expr (e);
933 if (!t && e->ts.type == BT_UNKNOWN
934 && e->symtree->n.sym->attr.untyped == 1
935 && (flag_implicit_none
936 || e->symtree->n.sym->ns->seen_implicit_none == 1
937 || e->symtree->n.sym->ns->parent->seen_implicit_none == 1))
939 gfc_free_expr (e);
940 goto syntax;
943 if ((e->ref && e->ref->type == REF_ARRAY
944 && e->ref->u.ar.type != AR_ELEMENT)
945 || (!e->ref && e->expr_type == EXPR_ARRAY))
947 gfc_free_expr (e);
948 goto syntax;
951 gfc_free_expr (e);
954 return m;
956 syntax:
957 gfc_error ("Scalar INTEGER expression expected at %L", &(*expr)->where);
958 return MATCH_ERROR;
962 /* A character length is a '*' followed by a literal integer or a
963 char_len_param_value in parenthesis. */
965 static match
966 match_char_length (gfc_expr **expr, bool *deferred, bool obsolescent_check)
968 int length;
969 match m;
971 *deferred = false;
972 m = gfc_match_char ('*');
973 if (m != MATCH_YES)
974 return m;
976 m = gfc_match_small_literal_int (&length, NULL);
977 if (m == MATCH_ERROR)
978 return m;
980 if (m == MATCH_YES)
982 if (obsolescent_check
983 && !gfc_notify_std (GFC_STD_F95_OBS, "Old-style character length at %C"))
984 return MATCH_ERROR;
985 *expr = gfc_get_int_expr (gfc_default_integer_kind, NULL, length);
986 return m;
989 if (gfc_match_char ('(') == MATCH_NO)
990 goto syntax;
992 m = char_len_param_value (expr, deferred);
993 if (m != MATCH_YES && gfc_matching_function)
995 gfc_undo_symbols ();
996 m = MATCH_YES;
999 if (m == MATCH_ERROR)
1000 return m;
1001 if (m == MATCH_NO)
1002 goto syntax;
1004 if (gfc_match_char (')') == MATCH_NO)
1006 gfc_free_expr (*expr);
1007 *expr = NULL;
1008 goto syntax;
1011 return MATCH_YES;
1013 syntax:
1014 gfc_error ("Syntax error in character length specification at %C");
1015 return MATCH_ERROR;
1019 /* Special subroutine for finding a symbol. Check if the name is found
1020 in the current name space. If not, and we're compiling a function or
1021 subroutine and the parent compilation unit is an interface, then check
1022 to see if the name we've been given is the name of the interface
1023 (located in another namespace). */
1025 static int
1026 find_special (const char *name, gfc_symbol **result, bool allow_subroutine)
1028 gfc_state_data *s;
1029 gfc_symtree *st;
1030 int i;
1032 i = gfc_get_sym_tree (name, NULL, &st, allow_subroutine);
1033 if (i == 0)
1035 *result = st ? st->n.sym : NULL;
1036 goto end;
1039 if (gfc_current_state () != COMP_SUBROUTINE
1040 && gfc_current_state () != COMP_FUNCTION)
1041 goto end;
1043 s = gfc_state_stack->previous;
1044 if (s == NULL)
1045 goto end;
1047 if (s->state != COMP_INTERFACE)
1048 goto end;
1049 if (s->sym == NULL)
1050 goto end; /* Nameless interface. */
1052 if (strcmp (name, s->sym->name) == 0)
1054 *result = s->sym;
1055 return 0;
1058 end:
1059 return i;
1063 /* Special subroutine for getting a symbol node associated with a
1064 procedure name, used in SUBROUTINE and FUNCTION statements. The
1065 symbol is created in the parent using with symtree node in the
1066 child unit pointing to the symbol. If the current namespace has no
1067 parent, then the symbol is just created in the current unit. */
1069 static int
1070 get_proc_name (const char *name, gfc_symbol **result, bool module_fcn_entry)
1072 gfc_symtree *st;
1073 gfc_symbol *sym;
1074 int rc = 0;
1076 /* Module functions have to be left in their own namespace because
1077 they have potentially (almost certainly!) already been referenced.
1078 In this sense, they are rather like external functions. This is
1079 fixed up in resolve.c(resolve_entries), where the symbol name-
1080 space is set to point to the master function, so that the fake
1081 result mechanism can work. */
1082 if (module_fcn_entry)
1084 /* Present if entry is declared to be a module procedure. */
1085 rc = gfc_find_symbol (name, gfc_current_ns->parent, 0, result);
1087 if (*result == NULL)
1088 rc = gfc_get_symbol (name, NULL, result);
1089 else if (!gfc_get_symbol (name, NULL, &sym) && sym
1090 && (*result)->ts.type == BT_UNKNOWN
1091 && sym->attr.flavor == FL_UNKNOWN)
1092 /* Pick up the typespec for the entry, if declared in the function
1093 body. Note that this symbol is FL_UNKNOWN because it will
1094 only have appeared in a type declaration. The local symtree
1095 is set to point to the module symbol and a unique symtree
1096 to the local version. This latter ensures a correct clearing
1097 of the symbols. */
1099 /* If the ENTRY proceeds its specification, we need to ensure
1100 that this does not raise a "has no IMPLICIT type" error. */
1101 if (sym->ts.type == BT_UNKNOWN)
1102 sym->attr.untyped = 1;
1104 (*result)->ts = sym->ts;
1106 /* Put the symbol in the procedure namespace so that, should
1107 the ENTRY precede its specification, the specification
1108 can be applied. */
1109 (*result)->ns = gfc_current_ns;
1111 gfc_find_sym_tree (name, gfc_current_ns, 0, &st);
1112 st->n.sym = *result;
1113 st = gfc_get_unique_symtree (gfc_current_ns);
1114 sym->refs++;
1115 st->n.sym = sym;
1118 else
1119 rc = gfc_get_symbol (name, gfc_current_ns->parent, result);
1121 if (rc)
1122 return rc;
1124 sym = *result;
1125 if (sym->attr.proc == PROC_ST_FUNCTION)
1126 return rc;
1128 if (sym->attr.module_procedure
1129 && sym->attr.if_source == IFSRC_IFBODY)
1131 /* Create a partially populated interface symbol to carry the
1132 characteristics of the procedure and the result. */
1133 sym->tlink = gfc_new_symbol (name, sym->ns);
1134 gfc_add_type (sym->tlink, &(sym->ts),
1135 &gfc_current_locus);
1136 gfc_copy_attr (&sym->tlink->attr, &sym->attr, NULL);
1137 if (sym->attr.dimension)
1138 sym->tlink->as = gfc_copy_array_spec (sym->as);
1140 /* Ideally, at this point, a copy would be made of the formal
1141 arguments and their namespace. However, this does not appear
1142 to be necessary, albeit at the expense of not being able to
1143 use gfc_compare_interfaces directly. */
1145 if (sym->result && sym->result != sym)
1147 sym->tlink->result = sym->result;
1148 sym->result = NULL;
1150 else if (sym->result)
1152 sym->tlink->result = sym->tlink;
1155 else if (sym && !sym->gfc_new
1156 && gfc_current_state () != COMP_INTERFACE)
1158 /* Trap another encompassed procedure with the same name. All
1159 these conditions are necessary to avoid picking up an entry
1160 whose name clashes with that of the encompassing procedure;
1161 this is handled using gsymbols to register unique, globally
1162 accessible names. */
1163 if (sym->attr.flavor != 0
1164 && sym->attr.proc != 0
1165 && (sym->attr.subroutine || sym->attr.function)
1166 && sym->attr.if_source != IFSRC_UNKNOWN)
1167 gfc_error_now ("Procedure %qs at %C is already defined at %L",
1168 name, &sym->declared_at);
1170 /* Trap a procedure with a name the same as interface in the
1171 encompassing scope. */
1172 if (sym->attr.generic != 0
1173 && (sym->attr.subroutine || sym->attr.function)
1174 && !sym->attr.mod_proc)
1175 gfc_error_now ("Name %qs at %C is already defined"
1176 " as a generic interface at %L",
1177 name, &sym->declared_at);
1179 /* Trap declarations of attributes in encompassing scope. The
1180 signature for this is that ts.kind is set. Legitimate
1181 references only set ts.type. */
1182 if (sym->ts.kind != 0
1183 && !sym->attr.implicit_type
1184 && sym->attr.proc == 0
1185 && gfc_current_ns->parent != NULL
1186 && sym->attr.access == 0
1187 && !module_fcn_entry)
1188 gfc_error_now ("Procedure %qs at %C has an explicit interface "
1189 "and must not have attributes declared at %L",
1190 name, &sym->declared_at);
1193 if (gfc_current_ns->parent == NULL || *result == NULL)
1194 return rc;
1196 /* Module function entries will already have a symtree in
1197 the current namespace but will need one at module level. */
1198 if (module_fcn_entry)
1200 /* Present if entry is declared to be a module procedure. */
1201 rc = gfc_find_sym_tree (name, gfc_current_ns->parent, 0, &st);
1202 if (st == NULL)
1203 st = gfc_new_symtree (&gfc_current_ns->parent->sym_root, name);
1205 else
1206 st = gfc_new_symtree (&gfc_current_ns->sym_root, name);
1208 st->n.sym = sym;
1209 sym->refs++;
1211 /* See if the procedure should be a module procedure. */
1213 if (((sym->ns->proc_name != NULL
1214 && sym->ns->proc_name->attr.flavor == FL_MODULE
1215 && sym->attr.proc != PROC_MODULE)
1216 || (module_fcn_entry && sym->attr.proc != PROC_MODULE))
1217 && !gfc_add_procedure (&sym->attr, PROC_MODULE, sym->name, NULL))
1218 rc = 2;
1220 return rc;
1224 /* Verify that the given symbol representing a parameter is C
1225 interoperable, by checking to see if it was marked as such after
1226 its declaration. If the given symbol is not interoperable, a
1227 warning is reported, thus removing the need to return the status to
1228 the calling function. The standard does not require the user use
1229 one of the iso_c_binding named constants to declare an
1230 interoperable parameter, but we can't be sure if the param is C
1231 interop or not if the user doesn't. For example, integer(4) may be
1232 legal Fortran, but doesn't have meaning in C. It may interop with
1233 a number of the C types, which causes a problem because the
1234 compiler can't know which one. This code is almost certainly not
1235 portable, and the user will get what they deserve if the C type
1236 across platforms isn't always interoperable with integer(4). If
1237 the user had used something like integer(c_int) or integer(c_long),
1238 the compiler could have automatically handled the varying sizes
1239 across platforms. */
1241 bool
1242 gfc_verify_c_interop_param (gfc_symbol *sym)
1244 int is_c_interop = 0;
1245 bool retval = true;
1247 /* We check implicitly typed variables in symbol.c:gfc_set_default_type().
1248 Don't repeat the checks here. */
1249 if (sym->attr.implicit_type)
1250 return true;
1252 /* For subroutines or functions that are passed to a BIND(C) procedure,
1253 they're interoperable if they're BIND(C) and their params are all
1254 interoperable. */
1255 if (sym->attr.flavor == FL_PROCEDURE)
1257 if (sym->attr.is_bind_c == 0)
1259 gfc_error_now ("Procedure %qs at %L must have the BIND(C) "
1260 "attribute to be C interoperable", sym->name,
1261 &(sym->declared_at));
1262 return false;
1264 else
1266 if (sym->attr.is_c_interop == 1)
1267 /* We've already checked this procedure; don't check it again. */
1268 return true;
1269 else
1270 return verify_bind_c_sym (sym, &(sym->ts), sym->attr.in_common,
1271 sym->common_block);
1275 /* See if we've stored a reference to a procedure that owns sym. */
1276 if (sym->ns != NULL && sym->ns->proc_name != NULL)
1278 if (sym->ns->proc_name->attr.is_bind_c == 1)
1280 is_c_interop = (gfc_verify_c_interop(&(sym->ts)) ? 1 : 0);
1282 if (is_c_interop != 1)
1284 /* Make personalized messages to give better feedback. */
1285 if (sym->ts.type == BT_DERIVED)
1286 gfc_error ("Variable %qs at %L is a dummy argument to the "
1287 "BIND(C) procedure %qs but is not C interoperable "
1288 "because derived type %qs is not C interoperable",
1289 sym->name, &(sym->declared_at),
1290 sym->ns->proc_name->name,
1291 sym->ts.u.derived->name);
1292 else if (sym->ts.type == BT_CLASS)
1293 gfc_error ("Variable %qs at %L is a dummy argument to the "
1294 "BIND(C) procedure %qs but is not C interoperable "
1295 "because it is polymorphic",
1296 sym->name, &(sym->declared_at),
1297 sym->ns->proc_name->name);
1298 else if (warn_c_binding_type)
1299 gfc_warning (OPT_Wc_binding_type,
1300 "Variable %qs at %L is a dummy argument of the "
1301 "BIND(C) procedure %qs but may not be C "
1302 "interoperable",
1303 sym->name, &(sym->declared_at),
1304 sym->ns->proc_name->name);
1307 /* Character strings are only C interoperable if they have a
1308 length of 1. */
1309 if (sym->ts.type == BT_CHARACTER)
1311 gfc_charlen *cl = sym->ts.u.cl;
1312 if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT
1313 || mpz_cmp_si (cl->length->value.integer, 1) != 0)
1315 gfc_error ("Character argument %qs at %L "
1316 "must be length 1 because "
1317 "procedure %qs is BIND(C)",
1318 sym->name, &sym->declared_at,
1319 sym->ns->proc_name->name);
1320 retval = false;
1324 /* We have to make sure that any param to a bind(c) routine does
1325 not have the allocatable, pointer, or optional attributes,
1326 according to J3/04-007, section 5.1. */
1327 if (sym->attr.allocatable == 1
1328 && !gfc_notify_std (GFC_STD_F2008_TS, "Variable %qs at %L with "
1329 "ALLOCATABLE attribute in procedure %qs "
1330 "with BIND(C)", sym->name,
1331 &(sym->declared_at),
1332 sym->ns->proc_name->name))
1333 retval = false;
1335 if (sym->attr.pointer == 1
1336 && !gfc_notify_std (GFC_STD_F2008_TS, "Variable %qs at %L with "
1337 "POINTER attribute in procedure %qs "
1338 "with BIND(C)", sym->name,
1339 &(sym->declared_at),
1340 sym->ns->proc_name->name))
1341 retval = false;
1343 if ((sym->attr.allocatable || sym->attr.pointer) && !sym->as)
1345 gfc_error ("Scalar variable %qs at %L with POINTER or "
1346 "ALLOCATABLE in procedure %qs with BIND(C) is not yet"
1347 " supported", sym->name, &(sym->declared_at),
1348 sym->ns->proc_name->name);
1349 retval = false;
1352 if (sym->attr.optional == 1 && sym->attr.value)
1354 gfc_error ("Variable %qs at %L cannot have both the OPTIONAL "
1355 "and the VALUE attribute because procedure %qs "
1356 "is BIND(C)", sym->name, &(sym->declared_at),
1357 sym->ns->proc_name->name);
1358 retval = false;
1360 else if (sym->attr.optional == 1
1361 && !gfc_notify_std (GFC_STD_F2008_TS, "Variable %qs "
1362 "at %L with OPTIONAL attribute in "
1363 "procedure %qs which is BIND(C)",
1364 sym->name, &(sym->declared_at),
1365 sym->ns->proc_name->name))
1366 retval = false;
1368 /* Make sure that if it has the dimension attribute, that it is
1369 either assumed size or explicit shape. Deferred shape is already
1370 covered by the pointer/allocatable attribute. */
1371 if (sym->as != NULL && sym->as->type == AS_ASSUMED_SHAPE
1372 && !gfc_notify_std (GFC_STD_F2008_TS, "Assumed-shape array %qs "
1373 "at %L as dummy argument to the BIND(C) "
1374 "procedure %qs at %L", sym->name,
1375 &(sym->declared_at),
1376 sym->ns->proc_name->name,
1377 &(sym->ns->proc_name->declared_at)))
1378 retval = false;
1382 return retval;
1387 /* Function called by variable_decl() that adds a name to the symbol table. */
1389 static bool
1390 build_sym (const char *name, gfc_charlen *cl, bool cl_deferred,
1391 gfc_array_spec **as, locus *var_locus)
1393 symbol_attribute attr;
1394 gfc_symbol *sym;
1395 int upper;
1396 gfc_symtree *st;
1398 /* Symbols in a submodule are host associated from the parent module or
1399 submodules. Therefore, they can be overridden by declarations in the
1400 submodule scope. Deal with this by attaching the existing symbol to
1401 a new symtree and recycling the old symtree with a new symbol... */
1402 st = gfc_find_symtree (gfc_current_ns->sym_root, name);
1403 if (st != NULL && gfc_state_stack->state == COMP_SUBMODULE
1404 && st->n.sym != NULL
1405 && st->n.sym->attr.host_assoc && st->n.sym->attr.used_in_submodule)
1407 gfc_symtree *s = gfc_get_unique_symtree (gfc_current_ns);
1408 s->n.sym = st->n.sym;
1409 sym = gfc_new_symbol (name, gfc_current_ns);
1412 st->n.sym = sym;
1413 sym->refs++;
1414 gfc_set_sym_referenced (sym);
1416 /* ...Otherwise generate a new symtree and new symbol. */
1417 else if (gfc_get_symbol (name, NULL, &sym))
1418 return false;
1420 /* Check if the name has already been defined as a type. The
1421 first letter of the symtree will be in upper case then. Of
1422 course, this is only necessary if the upper case letter is
1423 actually different. */
1425 upper = TOUPPER(name[0]);
1426 if (upper != name[0])
1428 char u_name[GFC_MAX_SYMBOL_LEN + 1];
1429 gfc_symtree *st;
1430 int nlen;
1432 nlen = strlen(name);
1433 gcc_assert (nlen <= GFC_MAX_SYMBOL_LEN);
1434 strncpy (u_name, name, nlen + 1);
1435 u_name[0] = upper;
1437 st = gfc_find_symtree (gfc_current_ns->sym_root, u_name);
1439 /* STRUCTURE types can alias symbol names */
1440 if (st != 0 && st->n.sym->attr.flavor != FL_STRUCT)
1442 gfc_error ("Symbol %qs at %C also declared as a type at %L", name,
1443 &st->n.sym->declared_at);
1444 return false;
1448 /* Start updating the symbol table. Add basic type attribute if present. */
1449 if (current_ts.type != BT_UNKNOWN
1450 && (sym->attr.implicit_type == 0
1451 || !gfc_compare_types (&sym->ts, &current_ts))
1452 && !gfc_add_type (sym, &current_ts, var_locus))
1453 return false;
1455 if (sym->ts.type == BT_CHARACTER)
1457 sym->ts.u.cl = cl;
1458 sym->ts.deferred = cl_deferred;
1461 /* Add dimension attribute if present. */
1462 if (!gfc_set_array_spec (sym, *as, var_locus))
1463 return false;
1464 *as = NULL;
1466 /* Add attribute to symbol. The copy is so that we can reset the
1467 dimension attribute. */
1468 attr = current_attr;
1469 attr.dimension = 0;
1470 attr.codimension = 0;
1472 if (!gfc_copy_attr (&sym->attr, &attr, var_locus))
1473 return false;
1475 /* Finish any work that may need to be done for the binding label,
1476 if it's a bind(c). The bind(c) attr is found before the symbol
1477 is made, and before the symbol name (for data decls), so the
1478 current_ts is holding the binding label, or nothing if the
1479 name= attr wasn't given. Therefore, test here if we're dealing
1480 with a bind(c) and make sure the binding label is set correctly. */
1481 if (sym->attr.is_bind_c == 1)
1483 if (!sym->binding_label)
1485 /* Set the binding label and verify that if a NAME= was specified
1486 then only one identifier was in the entity-decl-list. */
1487 if (!set_binding_label (&sym->binding_label, sym->name,
1488 num_idents_on_line))
1489 return false;
1493 /* See if we know we're in a common block, and if it's a bind(c)
1494 common then we need to make sure we're an interoperable type. */
1495 if (sym->attr.in_common == 1)
1497 /* Test the common block object. */
1498 if (sym->common_block != NULL && sym->common_block->is_bind_c == 1
1499 && sym->ts.is_c_interop != 1)
1501 gfc_error_now ("Variable %qs in common block %qs at %C "
1502 "must be declared with a C interoperable "
1503 "kind since common block %qs is BIND(C)",
1504 sym->name, sym->common_block->name,
1505 sym->common_block->name);
1506 gfc_clear_error ();
1510 sym->attr.implied_index = 0;
1512 /* Use the parameter expressions for a parameterized derived type. */
1513 if ((sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS)
1514 && sym->ts.u.derived->attr.pdt_type && type_param_spec_list)
1515 sym->param_list = gfc_copy_actual_arglist (type_param_spec_list);
1517 if (sym->ts.type == BT_CLASS)
1518 return gfc_build_class_symbol (&sym->ts, &sym->attr, &sym->as);
1520 return true;
1524 /* Set character constant to the given length. The constant will be padded or
1525 truncated. If we're inside an array constructor without a typespec, we
1526 additionally check that all elements have the same length; check_len -1
1527 means no checking. */
1529 void
1530 gfc_set_constant_character_len (int len, gfc_expr *expr, int check_len)
1532 gfc_char_t *s;
1533 int slen;
1535 if (expr->ts.type != BT_CHARACTER)
1536 return;
1538 if (expr->expr_type != EXPR_CONSTANT)
1540 gfc_error_now ("CHARACTER length must be a constant at %L", &expr->where);
1541 return;
1544 slen = expr->value.character.length;
1545 if (len != slen)
1547 s = gfc_get_wide_string (len + 1);
1548 memcpy (s, expr->value.character.string,
1549 MIN (len, slen) * sizeof (gfc_char_t));
1550 if (len > slen)
1551 gfc_wide_memset (&s[slen], ' ', len - slen);
1553 if (warn_character_truncation && slen > len)
1554 gfc_warning_now (OPT_Wcharacter_truncation,
1555 "CHARACTER expression at %L is being truncated "
1556 "(%d/%d)", &expr->where, slen, len);
1558 /* Apply the standard by 'hand' otherwise it gets cleared for
1559 initializers. */
1560 if (check_len != -1 && slen != check_len
1561 && !(gfc_option.allow_std & GFC_STD_GNU))
1562 gfc_error_now ("The CHARACTER elements of the array constructor "
1563 "at %L must have the same length (%d/%d)",
1564 &expr->where, slen, check_len);
1566 s[len] = '\0';
1567 free (expr->value.character.string);
1568 expr->value.character.string = s;
1569 expr->value.character.length = len;
1574 /* Function to create and update the enumerator history
1575 using the information passed as arguments.
1576 Pointer "max_enum" is also updated, to point to
1577 enum history node containing largest initializer.
1579 SYM points to the symbol node of enumerator.
1580 INIT points to its enumerator value. */
1582 static void
1583 create_enum_history (gfc_symbol *sym, gfc_expr *init)
1585 enumerator_history *new_enum_history;
1586 gcc_assert (sym != NULL && init != NULL);
1588 new_enum_history = XCNEW (enumerator_history);
1590 new_enum_history->sym = sym;
1591 new_enum_history->initializer = init;
1592 new_enum_history->next = NULL;
1594 if (enum_history == NULL)
1596 enum_history = new_enum_history;
1597 max_enum = enum_history;
1599 else
1601 new_enum_history->next = enum_history;
1602 enum_history = new_enum_history;
1604 if (mpz_cmp (max_enum->initializer->value.integer,
1605 new_enum_history->initializer->value.integer) < 0)
1606 max_enum = new_enum_history;
1611 /* Function to free enum kind history. */
1613 void
1614 gfc_free_enum_history (void)
1616 enumerator_history *current = enum_history;
1617 enumerator_history *next;
1619 while (current != NULL)
1621 next = current->next;
1622 free (current);
1623 current = next;
1625 max_enum = NULL;
1626 enum_history = NULL;
1630 /* Function called by variable_decl() that adds an initialization
1631 expression to a symbol. */
1633 static bool
1634 add_init_expr_to_sym (const char *name, gfc_expr **initp, locus *var_locus)
1636 symbol_attribute attr;
1637 gfc_symbol *sym;
1638 gfc_expr *init;
1640 init = *initp;
1641 if (find_special (name, &sym, false))
1642 return false;
1644 attr = sym->attr;
1646 /* If this symbol is confirming an implicit parameter type,
1647 then an initialization expression is not allowed. */
1648 if (attr.flavor == FL_PARAMETER
1649 && sym->value != NULL
1650 && *initp != NULL)
1652 gfc_error ("Initializer not allowed for PARAMETER %qs at %C",
1653 sym->name);
1654 return false;
1657 if (init == NULL)
1659 /* An initializer is required for PARAMETER declarations. */
1660 if (attr.flavor == FL_PARAMETER)
1662 gfc_error ("PARAMETER at %L is missing an initializer", var_locus);
1663 return false;
1666 else
1668 /* If a variable appears in a DATA block, it cannot have an
1669 initializer. */
1670 if (sym->attr.data)
1672 gfc_error ("Variable %qs at %C with an initializer already "
1673 "appears in a DATA statement", sym->name);
1674 return false;
1677 /* Check if the assignment can happen. This has to be put off
1678 until later for derived type variables and procedure pointers. */
1679 if (!gfc_bt_struct (sym->ts.type) && !gfc_bt_struct (init->ts.type)
1680 && sym->ts.type != BT_CLASS && init->ts.type != BT_CLASS
1681 && !sym->attr.proc_pointer
1682 && !gfc_check_assign_symbol (sym, NULL, init))
1683 return false;
1685 if (sym->ts.type == BT_CHARACTER && sym->ts.u.cl
1686 && init->ts.type == BT_CHARACTER)
1688 /* Update symbol character length according initializer. */
1689 if (!gfc_check_assign_symbol (sym, NULL, init))
1690 return false;
1692 if (sym->ts.u.cl->length == NULL)
1694 int clen;
1695 /* If there are multiple CHARACTER variables declared on the
1696 same line, we don't want them to share the same length. */
1697 sym->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
1699 if (sym->attr.flavor == FL_PARAMETER)
1701 if (init->expr_type == EXPR_CONSTANT)
1703 clen = init->value.character.length;
1704 sym->ts.u.cl->length
1705 = gfc_get_int_expr (gfc_default_integer_kind,
1706 NULL, clen);
1708 else if (init->expr_type == EXPR_ARRAY)
1710 if (init->ts.u.cl)
1712 const gfc_expr *length = init->ts.u.cl->length;
1713 if (length->expr_type != EXPR_CONSTANT)
1715 gfc_error ("Cannot initialize parameter array "
1716 "at %L "
1717 "with variable length elements",
1718 &sym->declared_at);
1719 return false;
1721 clen = mpz_get_si (length->value.integer);
1723 else if (init->value.constructor)
1725 gfc_constructor *c;
1726 c = gfc_constructor_first (init->value.constructor);
1727 clen = c->expr->value.character.length;
1729 else
1730 gcc_unreachable ();
1731 sym->ts.u.cl->length
1732 = gfc_get_int_expr (gfc_default_integer_kind,
1733 NULL, clen);
1735 else if (init->ts.u.cl && init->ts.u.cl->length)
1736 sym->ts.u.cl->length =
1737 gfc_copy_expr (sym->value->ts.u.cl->length);
1740 /* Update initializer character length according symbol. */
1741 else if (sym->ts.u.cl->length->expr_type == EXPR_CONSTANT)
1743 int len;
1745 if (!gfc_specification_expr (sym->ts.u.cl->length))
1746 return false;
1748 len = mpz_get_si (sym->ts.u.cl->length->value.integer);
1750 if (init->expr_type == EXPR_CONSTANT)
1751 gfc_set_constant_character_len (len, init, -1);
1752 else if (init->expr_type == EXPR_ARRAY)
1754 gfc_constructor *c;
1756 /* Build a new charlen to prevent simplification from
1757 deleting the length before it is resolved. */
1758 init->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
1759 init->ts.u.cl->length = gfc_copy_expr (sym->ts.u.cl->length);
1761 for (c = gfc_constructor_first (init->value.constructor);
1762 c; c = gfc_constructor_next (c))
1763 gfc_set_constant_character_len (len, c->expr, -1);
1768 /* If sym is implied-shape, set its upper bounds from init. */
1769 if (sym->attr.flavor == FL_PARAMETER && sym->attr.dimension
1770 && sym->as->type == AS_IMPLIED_SHAPE)
1772 int dim;
1774 if (init->rank == 0)
1776 gfc_error ("Can't initialize implied-shape array at %L"
1777 " with scalar", &sym->declared_at);
1778 return false;
1781 /* Shape should be present, we get an initialization expression. */
1782 gcc_assert (init->shape);
1784 for (dim = 0; dim < sym->as->rank; ++dim)
1786 int k;
1787 gfc_expr *e, *lower;
1789 lower = sym->as->lower[dim];
1791 /* If the lower bound is an array element from another
1792 parameterized array, then it is marked with EXPR_VARIABLE and
1793 is an initialization expression. Try to reduce it. */
1794 if (lower->expr_type == EXPR_VARIABLE)
1795 gfc_reduce_init_expr (lower);
1797 if (lower->expr_type == EXPR_CONSTANT)
1799 /* All dimensions must be without upper bound. */
1800 gcc_assert (!sym->as->upper[dim]);
1802 k = lower->ts.kind;
1803 e = gfc_get_constant_expr (BT_INTEGER, k, &sym->declared_at);
1804 mpz_add (e->value.integer, lower->value.integer,
1805 init->shape[dim]);
1806 mpz_sub_ui (e->value.integer, e->value.integer, 1);
1807 sym->as->upper[dim] = e;
1809 else
1811 gfc_error ("Non-constant lower bound in implied-shape"
1812 " declaration at %L", &lower->where);
1813 return false;
1817 sym->as->type = AS_EXPLICIT;
1820 /* Need to check if the expression we initialized this
1821 to was one of the iso_c_binding named constants. If so,
1822 and we're a parameter (constant), let it be iso_c.
1823 For example:
1824 integer(c_int), parameter :: my_int = c_int
1825 integer(my_int) :: my_int_2
1826 If we mark my_int as iso_c (since we can see it's value
1827 is equal to one of the named constants), then my_int_2
1828 will be considered C interoperable. */
1829 if (sym->ts.type != BT_CHARACTER && !gfc_bt_struct (sym->ts.type))
1831 sym->ts.is_iso_c |= init->ts.is_iso_c;
1832 sym->ts.is_c_interop |= init->ts.is_c_interop;
1833 /* attr bits needed for module files. */
1834 sym->attr.is_iso_c |= init->ts.is_iso_c;
1835 sym->attr.is_c_interop |= init->ts.is_c_interop;
1836 if (init->ts.is_iso_c)
1837 sym->ts.f90_type = init->ts.f90_type;
1840 /* Add initializer. Make sure we keep the ranks sane. */
1841 if (sym->attr.dimension && init->rank == 0)
1843 mpz_t size;
1844 gfc_expr *array;
1845 int n;
1846 if (sym->attr.flavor == FL_PARAMETER
1847 && init->expr_type == EXPR_CONSTANT
1848 && spec_size (sym->as, &size)
1849 && mpz_cmp_si (size, 0) > 0)
1851 array = gfc_get_array_expr (init->ts.type, init->ts.kind,
1852 &init->where);
1853 for (n = 0; n < (int)mpz_get_si (size); n++)
1854 gfc_constructor_append_expr (&array->value.constructor,
1855 n == 0
1856 ? init
1857 : gfc_copy_expr (init),
1858 &init->where);
1860 array->shape = gfc_get_shape (sym->as->rank);
1861 for (n = 0; n < sym->as->rank; n++)
1862 spec_dimen_size (sym->as, n, &array->shape[n]);
1864 init = array;
1865 mpz_clear (size);
1867 init->rank = sym->as->rank;
1870 sym->value = init;
1871 if (sym->attr.save == SAVE_NONE)
1872 sym->attr.save = SAVE_IMPLICIT;
1873 *initp = NULL;
1876 return true;
1880 /* Function called by variable_decl() that adds a name to a structure
1881 being built. */
1883 static bool
1884 build_struct (const char *name, gfc_charlen *cl, gfc_expr **init,
1885 gfc_array_spec **as)
1887 gfc_state_data *s;
1888 gfc_component *c;
1890 /* F03:C438/C439. If the current symbol is of the same derived type that we're
1891 constructing, it must have the pointer attribute. */
1892 if ((current_ts.type == BT_DERIVED || current_ts.type == BT_CLASS)
1893 && current_ts.u.derived == gfc_current_block ()
1894 && current_attr.pointer == 0)
1896 if (current_attr.allocatable
1897 && !gfc_notify_std(GFC_STD_F2008, "Component at %C "
1898 "must have the POINTER attribute"))
1900 return false;
1902 else if (current_attr.allocatable == 0)
1904 gfc_error ("Component at %C must have the POINTER attribute");
1905 return false;
1909 /* F03:C437. */
1910 if (current_ts.type == BT_CLASS
1911 && !(current_attr.pointer || current_attr.allocatable))
1913 gfc_error ("Component %qs with CLASS at %C must be allocatable "
1914 "or pointer", name);
1915 return false;
1918 if (gfc_current_block ()->attr.pointer && (*as)->rank != 0)
1920 if ((*as)->type != AS_DEFERRED && (*as)->type != AS_EXPLICIT)
1922 gfc_error ("Array component of structure at %C must have explicit "
1923 "or deferred shape");
1924 return false;
1928 /* If we are in a nested union/map definition, gfc_add_component will not
1929 properly find repeated components because:
1930 (i) gfc_add_component does a flat search, where components of unions
1931 and maps are implicity chained so nested components may conflict.
1932 (ii) Unions and maps are not linked as components of their parent
1933 structures until after they are parsed.
1934 For (i) we use gfc_find_component which searches recursively, and for (ii)
1935 we search each block directly from the parse stack until we find the top
1936 level structure. */
1938 s = gfc_state_stack;
1939 if (s->state == COMP_UNION || s->state == COMP_MAP)
1941 while (s->state == COMP_UNION || gfc_comp_struct (s->state))
1943 c = gfc_find_component (s->sym, name, true, true, NULL);
1944 if (c != NULL)
1946 gfc_error_now ("Component %qs at %C already declared at %L",
1947 name, &c->loc);
1948 return false;
1950 /* Break after we've searched the entire chain. */
1951 if (s->state == COMP_DERIVED || s->state == COMP_STRUCTURE)
1952 break;
1953 s = s->previous;
1957 if (!gfc_add_component (gfc_current_block(), name, &c))
1958 return false;
1960 c->ts = current_ts;
1961 if (c->ts.type == BT_CHARACTER)
1962 c->ts.u.cl = cl;
1964 if (c->ts.type != BT_CLASS && c->ts.type != BT_DERIVED
1965 && c->ts.kind == 0 && saved_kind_expr != NULL)
1966 c->kind_expr = gfc_copy_expr (saved_kind_expr);
1968 c->attr = current_attr;
1970 c->initializer = *init;
1971 *init = NULL;
1973 c->as = *as;
1974 if (c->as != NULL)
1976 if (c->as->corank)
1977 c->attr.codimension = 1;
1978 if (c->as->rank)
1979 c->attr.dimension = 1;
1981 *as = NULL;
1983 gfc_apply_init (&c->ts, &c->attr, c->initializer);
1985 /* Check array components. */
1986 if (!c->attr.dimension)
1987 goto scalar;
1989 if (c->attr.pointer)
1991 if (c->as->type != AS_DEFERRED)
1993 gfc_error ("Pointer array component of structure at %C must have a "
1994 "deferred shape");
1995 return false;
1998 else if (c->attr.allocatable)
2000 if (c->as->type != AS_DEFERRED)
2002 gfc_error ("Allocatable component of structure at %C must have a "
2003 "deferred shape");
2004 return false;
2007 else
2009 if (c->as->type != AS_EXPLICIT)
2011 gfc_error ("Array component of structure at %C must have an "
2012 "explicit shape");
2013 return false;
2017 scalar:
2018 if (c->ts.type == BT_CLASS)
2019 return gfc_build_class_symbol (&c->ts, &c->attr, &c->as);
2021 if (c->attr.pdt_kind || c->attr.pdt_len)
2023 gfc_symbol *sym;
2024 gfc_find_symbol (c->name, gfc_current_block ()->f2k_derived,
2025 0, &sym);
2026 if (sym == NULL)
2028 gfc_error ("Type parameter %qs at %C has no corresponding entry "
2029 "in the type parameter name list at %L",
2030 c->name, &gfc_current_block ()->declared_at);
2031 return false;
2033 sym->ts = c->ts;
2034 sym->attr.pdt_kind = c->attr.pdt_kind;
2035 sym->attr.pdt_len = c->attr.pdt_len;
2036 if (c->initializer)
2037 sym->value = gfc_copy_expr (c->initializer);
2038 sym->attr.flavor = FL_VARIABLE;
2041 if ((c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
2042 && c->ts.u.derived && c->ts.u.derived->attr.pdt_template
2043 && decl_type_param_list)
2044 c->param_list = gfc_copy_actual_arglist (decl_type_param_list);
2046 return true;
2050 /* Match a 'NULL()', and possibly take care of some side effects. */
2052 match
2053 gfc_match_null (gfc_expr **result)
2055 gfc_symbol *sym;
2056 match m, m2 = MATCH_NO;
2058 if ((m = gfc_match (" null ( )")) == MATCH_ERROR)
2059 return MATCH_ERROR;
2061 if (m == MATCH_NO)
2063 locus old_loc;
2064 char name[GFC_MAX_SYMBOL_LEN + 1];
2066 if ((m2 = gfc_match (" null (")) != MATCH_YES)
2067 return m2;
2069 old_loc = gfc_current_locus;
2070 if ((m2 = gfc_match (" %n ) ", name)) == MATCH_ERROR)
2071 return MATCH_ERROR;
2072 if (m2 != MATCH_YES
2073 && ((m2 = gfc_match (" mold = %n )", name)) == MATCH_ERROR))
2074 return MATCH_ERROR;
2075 if (m2 == MATCH_NO)
2077 gfc_current_locus = old_loc;
2078 return MATCH_NO;
2082 /* The NULL symbol now has to be/become an intrinsic function. */
2083 if (gfc_get_symbol ("null", NULL, &sym))
2085 gfc_error ("NULL() initialization at %C is ambiguous");
2086 return MATCH_ERROR;
2089 gfc_intrinsic_symbol (sym);
2091 if (sym->attr.proc != PROC_INTRINSIC
2092 && !(sym->attr.use_assoc && sym->attr.intrinsic)
2093 && (!gfc_add_procedure(&sym->attr, PROC_INTRINSIC, sym->name, NULL)
2094 || !gfc_add_function (&sym->attr, sym->name, NULL)))
2095 return MATCH_ERROR;
2097 *result = gfc_get_null_expr (&gfc_current_locus);
2099 /* Invalid per F2008, C512. */
2100 if (m2 == MATCH_YES)
2102 gfc_error ("NULL() initialization at %C may not have MOLD");
2103 return MATCH_ERROR;
2106 return MATCH_YES;
2110 /* Match the initialization expr for a data pointer or procedure pointer. */
2112 static match
2113 match_pointer_init (gfc_expr **init, int procptr)
2115 match m;
2117 if (gfc_pure (NULL) && !gfc_comp_struct (gfc_state_stack->state))
2119 gfc_error ("Initialization of pointer at %C is not allowed in "
2120 "a PURE procedure");
2121 return MATCH_ERROR;
2123 gfc_unset_implicit_pure (gfc_current_ns->proc_name);
2125 /* Match NULL() initialization. */
2126 m = gfc_match_null (init);
2127 if (m != MATCH_NO)
2128 return m;
2130 /* Match non-NULL initialization. */
2131 gfc_matching_ptr_assignment = !procptr;
2132 gfc_matching_procptr_assignment = procptr;
2133 m = gfc_match_rvalue (init);
2134 gfc_matching_ptr_assignment = 0;
2135 gfc_matching_procptr_assignment = 0;
2136 if (m == MATCH_ERROR)
2137 return MATCH_ERROR;
2138 else if (m == MATCH_NO)
2140 gfc_error ("Error in pointer initialization at %C");
2141 return MATCH_ERROR;
2144 if (!procptr && !gfc_resolve_expr (*init))
2145 return MATCH_ERROR;
2147 if (!gfc_notify_std (GFC_STD_F2008, "non-NULL pointer "
2148 "initialization at %C"))
2149 return MATCH_ERROR;
2151 return MATCH_YES;
2155 static bool
2156 check_function_name (char *name)
2158 /* In functions that have a RESULT variable defined, the function name always
2159 refers to function calls. Therefore, the name is not allowed to appear in
2160 specification statements. When checking this, be careful about
2161 'hidden' procedure pointer results ('ppr@'). */
2163 if (gfc_current_state () == COMP_FUNCTION)
2165 gfc_symbol *block = gfc_current_block ();
2166 if (block && block->result && block->result != block
2167 && strcmp (block->result->name, "ppr@") != 0
2168 && strcmp (block->name, name) == 0)
2170 gfc_error ("Function name %qs not allowed at %C", name);
2171 return false;
2175 return true;
2179 /* Match a variable name with an optional initializer. When this
2180 subroutine is called, a variable is expected to be parsed next.
2181 Depending on what is happening at the moment, updates either the
2182 symbol table or the current interface. */
2184 static match
2185 variable_decl (int elem)
2187 char name[GFC_MAX_SYMBOL_LEN + 1];
2188 static unsigned int fill_id = 0;
2189 gfc_expr *initializer, *char_len;
2190 gfc_array_spec *as;
2191 gfc_array_spec *cp_as; /* Extra copy for Cray Pointees. */
2192 gfc_charlen *cl;
2193 bool cl_deferred;
2194 locus var_locus;
2195 match m;
2196 bool t;
2197 gfc_symbol *sym;
2199 initializer = NULL;
2200 as = NULL;
2201 cp_as = NULL;
2203 /* When we get here, we've just matched a list of attributes and
2204 maybe a type and a double colon. The next thing we expect to see
2205 is the name of the symbol. */
2207 /* If we are parsing a structure with legacy support, we allow the symbol
2208 name to be '%FILL' which gives it an anonymous (inaccessible) name. */
2209 m = MATCH_NO;
2210 gfc_gobble_whitespace ();
2211 if (gfc_peek_ascii_char () == '%')
2213 gfc_next_ascii_char ();
2214 m = gfc_match ("fill");
2217 if (m != MATCH_YES)
2219 m = gfc_match_name (name);
2220 if (m != MATCH_YES)
2221 goto cleanup;
2224 else
2226 m = MATCH_ERROR;
2227 if (gfc_current_state () != COMP_STRUCTURE)
2229 if (flag_dec_structure)
2230 gfc_error ("%qs not allowed outside STRUCTURE at %C", "%FILL");
2231 else
2232 gfc_error ("%qs at %C is a DEC extension, enable with "
2233 "%<-fdec-structure%>", "%FILL");
2234 goto cleanup;
2237 if (attr_seen)
2239 gfc_error ("%qs entity cannot have attributes at %C", "%FILL");
2240 goto cleanup;
2243 /* %FILL components are given invalid fortran names. */
2244 snprintf (name, GFC_MAX_SYMBOL_LEN + 1, "%%FILL%u", fill_id++);
2245 m = MATCH_YES;
2248 var_locus = gfc_current_locus;
2250 /* Now we could see the optional array spec. or character length. */
2251 m = gfc_match_array_spec (&as, true, true);
2252 if (m == MATCH_ERROR)
2253 goto cleanup;
2255 if (m == MATCH_NO)
2256 as = gfc_copy_array_spec (current_as);
2257 else if (current_as
2258 && !merge_array_spec (current_as, as, true))
2260 m = MATCH_ERROR;
2261 goto cleanup;
2264 if (flag_cray_pointer)
2265 cp_as = gfc_copy_array_spec (as);
2267 /* At this point, we know for sure if the symbol is PARAMETER and can thus
2268 determine (and check) whether it can be implied-shape. If it
2269 was parsed as assumed-size, change it because PARAMETERs can not
2270 be assumed-size. */
2271 if (as)
2273 if (as->type == AS_IMPLIED_SHAPE && current_attr.flavor != FL_PARAMETER)
2275 m = MATCH_ERROR;
2276 gfc_error ("Non-PARAMETER symbol %qs at %L can't be implied-shape",
2277 name, &var_locus);
2278 goto cleanup;
2281 if (as->type == AS_ASSUMED_SIZE && as->rank == 1
2282 && current_attr.flavor == FL_PARAMETER)
2283 as->type = AS_IMPLIED_SHAPE;
2285 if (as->type == AS_IMPLIED_SHAPE
2286 && !gfc_notify_std (GFC_STD_F2008, "Implied-shape array at %L",
2287 &var_locus))
2289 m = MATCH_ERROR;
2290 goto cleanup;
2294 char_len = NULL;
2295 cl = NULL;
2296 cl_deferred = false;
2298 if (current_ts.type == BT_CHARACTER)
2300 switch (match_char_length (&char_len, &cl_deferred, false))
2302 case MATCH_YES:
2303 cl = gfc_new_charlen (gfc_current_ns, NULL);
2305 cl->length = char_len;
2306 break;
2308 /* Non-constant lengths need to be copied after the first
2309 element. Also copy assumed lengths. */
2310 case MATCH_NO:
2311 if (elem > 1
2312 && (current_ts.u.cl->length == NULL
2313 || current_ts.u.cl->length->expr_type != EXPR_CONSTANT))
2315 cl = gfc_new_charlen (gfc_current_ns, NULL);
2316 cl->length = gfc_copy_expr (current_ts.u.cl->length);
2318 else
2319 cl = current_ts.u.cl;
2321 cl_deferred = current_ts.deferred;
2323 break;
2325 case MATCH_ERROR:
2326 goto cleanup;
2330 /* The dummy arguments and result of the abreviated form of MODULE
2331 PROCEDUREs, used in SUBMODULES should not be redefined. */
2332 if (gfc_current_ns->proc_name
2333 && gfc_current_ns->proc_name->abr_modproc_decl)
2335 gfc_find_symbol (name, gfc_current_ns, 1, &sym);
2336 if (sym != NULL && (sym->attr.dummy || sym->attr.result))
2338 m = MATCH_ERROR;
2339 gfc_error ("%qs at %C is a redefinition of the declaration "
2340 "in the corresponding interface for MODULE "
2341 "PROCEDURE %qs", sym->name,
2342 gfc_current_ns->proc_name->name);
2343 goto cleanup;
2347 /* %FILL components may not have initializers. */
2348 if (strncmp (name, "%FILL", 5) == 0 && gfc_match_eos () != MATCH_YES)
2350 gfc_error ("%qs entity cannot have an initializer at %C", "%FILL");
2351 m = MATCH_ERROR;
2352 goto cleanup;
2355 /* If this symbol has already shown up in a Cray Pointer declaration,
2356 and this is not a component declaration,
2357 then we want to set the type & bail out. */
2358 if (flag_cray_pointer && !gfc_comp_struct (gfc_current_state ()))
2360 gfc_find_symbol (name, gfc_current_ns, 1, &sym);
2361 if (sym != NULL && sym->attr.cray_pointee)
2363 sym->ts.type = current_ts.type;
2364 sym->ts.kind = current_ts.kind;
2365 sym->ts.u.cl = cl;
2366 sym->ts.u.derived = current_ts.u.derived;
2367 sym->ts.is_c_interop = current_ts.is_c_interop;
2368 sym->ts.is_iso_c = current_ts.is_iso_c;
2369 m = MATCH_YES;
2371 /* Check to see if we have an array specification. */
2372 if (cp_as != NULL)
2374 if (sym->as != NULL)
2376 gfc_error ("Duplicate array spec for Cray pointee at %C");
2377 gfc_free_array_spec (cp_as);
2378 m = MATCH_ERROR;
2379 goto cleanup;
2381 else
2383 if (!gfc_set_array_spec (sym, cp_as, &var_locus))
2384 gfc_internal_error ("Couldn't set pointee array spec.");
2386 /* Fix the array spec. */
2387 m = gfc_mod_pointee_as (sym->as);
2388 if (m == MATCH_ERROR)
2389 goto cleanup;
2392 goto cleanup;
2394 else
2396 gfc_free_array_spec (cp_as);
2400 /* Procedure pointer as function result. */
2401 if (gfc_current_state () == COMP_FUNCTION
2402 && strcmp ("ppr@", gfc_current_block ()->name) == 0
2403 && strcmp (name, gfc_current_block ()->ns->proc_name->name) == 0)
2404 strcpy (name, "ppr@");
2406 if (gfc_current_state () == COMP_FUNCTION
2407 && strcmp (name, gfc_current_block ()->name) == 0
2408 && gfc_current_block ()->result
2409 && strcmp ("ppr@", gfc_current_block ()->result->name) == 0)
2410 strcpy (name, "ppr@");
2412 /* OK, we've successfully matched the declaration. Now put the
2413 symbol in the current namespace, because it might be used in the
2414 optional initialization expression for this symbol, e.g. this is
2415 perfectly legal:
2417 integer, parameter :: i = huge(i)
2419 This is only true for parameters or variables of a basic type.
2420 For components of derived types, it is not true, so we don't
2421 create a symbol for those yet. If we fail to create the symbol,
2422 bail out. */
2423 if (!gfc_comp_struct (gfc_current_state ())
2424 && !build_sym (name, cl, cl_deferred, &as, &var_locus))
2426 m = MATCH_ERROR;
2427 goto cleanup;
2430 if (!check_function_name (name))
2432 m = MATCH_ERROR;
2433 goto cleanup;
2436 /* We allow old-style initializations of the form
2437 integer i /2/, j(4) /3*3, 1/
2438 (if no colon has been seen). These are different from data
2439 statements in that initializers are only allowed to apply to the
2440 variable immediately preceding, i.e.
2441 integer i, j /1, 2/
2442 is not allowed. Therefore we have to do some work manually, that
2443 could otherwise be left to the matchers for DATA statements. */
2445 if (!colon_seen && gfc_match (" /") == MATCH_YES)
2447 if (!gfc_notify_std (GFC_STD_GNU, "Old-style "
2448 "initialization at %C"))
2449 return MATCH_ERROR;
2451 /* Allow old style initializations for components of STRUCTUREs and MAPs
2452 but not components of derived types. */
2453 else if (gfc_current_state () == COMP_DERIVED)
2455 gfc_error ("Invalid old style initialization for derived type "
2456 "component at %C");
2457 m = MATCH_ERROR;
2458 goto cleanup;
2461 /* For structure components, read the initializer as a special
2462 expression and let the rest of this function apply the initializer
2463 as usual. */
2464 else if (gfc_comp_struct (gfc_current_state ()))
2466 m = match_clist_expr (&initializer, &current_ts, as);
2467 if (m == MATCH_NO)
2468 gfc_error ("Syntax error in old style initialization of %s at %C",
2469 name);
2470 if (m != MATCH_YES)
2471 goto cleanup;
2474 /* Otherwise we treat the old style initialization just like a
2475 DATA declaration for the current variable. */
2476 else
2477 return match_old_style_init (name);
2480 /* The double colon must be present in order to have initializers.
2481 Otherwise the statement is ambiguous with an assignment statement. */
2482 if (colon_seen)
2484 if (gfc_match (" =>") == MATCH_YES)
2486 if (!current_attr.pointer)
2488 gfc_error ("Initialization at %C isn't for a pointer variable");
2489 m = MATCH_ERROR;
2490 goto cleanup;
2493 m = match_pointer_init (&initializer, 0);
2494 if (m != MATCH_YES)
2495 goto cleanup;
2497 else if (gfc_match_char ('=') == MATCH_YES)
2499 if (current_attr.pointer)
2501 gfc_error ("Pointer initialization at %C requires %<=>%>, "
2502 "not %<=%>");
2503 m = MATCH_ERROR;
2504 goto cleanup;
2507 m = gfc_match_init_expr (&initializer);
2508 if (m == MATCH_NO)
2510 gfc_error ("Expected an initialization expression at %C");
2511 m = MATCH_ERROR;
2514 if (current_attr.flavor != FL_PARAMETER && gfc_pure (NULL)
2515 && !gfc_comp_struct (gfc_state_stack->state))
2517 gfc_error ("Initialization of variable at %C is not allowed in "
2518 "a PURE procedure");
2519 m = MATCH_ERROR;
2522 if (current_attr.flavor != FL_PARAMETER
2523 && !gfc_comp_struct (gfc_state_stack->state))
2524 gfc_unset_implicit_pure (gfc_current_ns->proc_name);
2526 if (m != MATCH_YES)
2527 goto cleanup;
2531 if (initializer != NULL && current_attr.allocatable
2532 && gfc_comp_struct (gfc_current_state ()))
2534 gfc_error ("Initialization of allocatable component at %C is not "
2535 "allowed");
2536 m = MATCH_ERROR;
2537 goto cleanup;
2540 if (gfc_current_state () == COMP_DERIVED
2541 && gfc_current_block ()->attr.pdt_template)
2543 gfc_symbol *param;
2544 gfc_find_symbol (name, gfc_current_block ()->f2k_derived,
2545 0, &param);
2546 if (!param && (current_attr.pdt_kind || current_attr.pdt_len))
2548 gfc_error ("The component with KIND or LEN attribute at %C does not "
2549 "not appear in the type parameter list at %L",
2550 &gfc_current_block ()->declared_at);
2551 m = MATCH_ERROR;
2552 goto cleanup;
2554 else if (param && !(current_attr.pdt_kind || current_attr.pdt_len))
2556 gfc_error ("The component at %C that appears in the type parameter "
2557 "list at %L has neither the KIND nor LEN attribute",
2558 &gfc_current_block ()->declared_at);
2559 m = MATCH_ERROR;
2560 goto cleanup;
2562 else if (as && (current_attr.pdt_kind || current_attr.pdt_len))
2564 gfc_error ("The component at %C which is a type parameter must be "
2565 "a scalar");
2566 m = MATCH_ERROR;
2567 goto cleanup;
2569 else if (param && initializer)
2570 param->value = gfc_copy_expr (initializer);
2573 /* Add the initializer. Note that it is fine if initializer is
2574 NULL here, because we sometimes also need to check if a
2575 declaration *must* have an initialization expression. */
2576 if (!gfc_comp_struct (gfc_current_state ()))
2577 t = add_init_expr_to_sym (name, &initializer, &var_locus);
2578 else
2580 if (current_ts.type == BT_DERIVED
2581 && !current_attr.pointer && !initializer)
2582 initializer = gfc_default_initializer (&current_ts);
2583 t = build_struct (name, cl, &initializer, &as);
2585 /* If we match a nested structure definition we expect to see the
2586 * body even if the variable declarations blow up, so we need to keep
2587 * the structure declaration around. */
2588 if (gfc_new_block && gfc_new_block->attr.flavor == FL_STRUCT)
2589 gfc_commit_symbol (gfc_new_block);
2592 m = (t) ? MATCH_YES : MATCH_ERROR;
2594 cleanup:
2595 /* Free stuff up and return. */
2596 gfc_free_expr (initializer);
2597 gfc_free_array_spec (as);
2599 return m;
2603 /* Match an extended-f77 "TYPESPEC*bytesize"-style kind specification.
2604 This assumes that the byte size is equal to the kind number for
2605 non-COMPLEX types, and equal to twice the kind number for COMPLEX. */
2607 match
2608 gfc_match_old_kind_spec (gfc_typespec *ts)
2610 match m;
2611 int original_kind;
2613 if (gfc_match_char ('*') != MATCH_YES)
2614 return MATCH_NO;
2616 m = gfc_match_small_literal_int (&ts->kind, NULL);
2617 if (m != MATCH_YES)
2618 return MATCH_ERROR;
2620 original_kind = ts->kind;
2622 /* Massage the kind numbers for complex types. */
2623 if (ts->type == BT_COMPLEX)
2625 if (ts->kind % 2)
2627 gfc_error ("Old-style type declaration %s*%d not supported at %C",
2628 gfc_basic_typename (ts->type), original_kind);
2629 return MATCH_ERROR;
2631 ts->kind /= 2;
2635 if (ts->type == BT_INTEGER && ts->kind == 4 && flag_integer4_kind == 8)
2636 ts->kind = 8;
2638 if (ts->type == BT_REAL || ts->type == BT_COMPLEX)
2640 if (ts->kind == 4)
2642 if (flag_real4_kind == 8)
2643 ts->kind = 8;
2644 if (flag_real4_kind == 10)
2645 ts->kind = 10;
2646 if (flag_real4_kind == 16)
2647 ts->kind = 16;
2650 if (ts->kind == 8)
2652 if (flag_real8_kind == 4)
2653 ts->kind = 4;
2654 if (flag_real8_kind == 10)
2655 ts->kind = 10;
2656 if (flag_real8_kind == 16)
2657 ts->kind = 16;
2661 if (gfc_validate_kind (ts->type, ts->kind, true) < 0)
2663 gfc_error ("Old-style type declaration %s*%d not supported at %C",
2664 gfc_basic_typename (ts->type), original_kind);
2665 return MATCH_ERROR;
2668 if (!gfc_notify_std (GFC_STD_GNU,
2669 "Nonstandard type declaration %s*%d at %C",
2670 gfc_basic_typename(ts->type), original_kind))
2671 return MATCH_ERROR;
2673 return MATCH_YES;
2677 /* Match a kind specification. Since kinds are generally optional, we
2678 usually return MATCH_NO if something goes wrong. If a "kind="
2679 string is found, then we know we have an error. */
2681 match
2682 gfc_match_kind_spec (gfc_typespec *ts, bool kind_expr_only)
2684 locus where, loc;
2685 gfc_expr *e;
2686 match m, n;
2687 char c;
2689 m = MATCH_NO;
2690 n = MATCH_YES;
2691 e = NULL;
2692 saved_kind_expr = NULL;
2694 where = loc = gfc_current_locus;
2696 if (kind_expr_only)
2697 goto kind_expr;
2699 if (gfc_match_char ('(') == MATCH_NO)
2700 return MATCH_NO;
2702 /* Also gobbles optional text. */
2703 if (gfc_match (" kind = ") == MATCH_YES)
2704 m = MATCH_ERROR;
2706 loc = gfc_current_locus;
2708 kind_expr:
2710 n = gfc_match_init_expr (&e);
2712 if (gfc_derived_parameter_expr (e))
2714 ts->kind = 0;
2715 saved_kind_expr = gfc_copy_expr (e);
2716 goto close_brackets;
2719 if (n != MATCH_YES)
2721 if (gfc_matching_function)
2723 /* The function kind expression might include use associated or
2724 imported parameters and try again after the specification
2725 expressions..... */
2726 if (gfc_match_char (')') != MATCH_YES)
2728 gfc_error ("Missing right parenthesis at %C");
2729 m = MATCH_ERROR;
2730 goto no_match;
2733 gfc_free_expr (e);
2734 gfc_undo_symbols ();
2735 return MATCH_YES;
2737 else
2739 /* ....or else, the match is real. */
2740 if (n == MATCH_NO)
2741 gfc_error ("Expected initialization expression at %C");
2742 if (n != MATCH_YES)
2743 return MATCH_ERROR;
2747 if (e->rank != 0)
2749 gfc_error ("Expected scalar initialization expression at %C");
2750 m = MATCH_ERROR;
2751 goto no_match;
2754 if (gfc_extract_int (e, &ts->kind, 1))
2756 m = MATCH_ERROR;
2757 goto no_match;
2760 /* Before throwing away the expression, let's see if we had a
2761 C interoperable kind (and store the fact). */
2762 if (e->ts.is_c_interop == 1)
2764 /* Mark this as C interoperable if being declared with one
2765 of the named constants from iso_c_binding. */
2766 ts->is_c_interop = e->ts.is_iso_c;
2767 ts->f90_type = e->ts.f90_type;
2768 if (e->symtree)
2769 ts->interop_kind = e->symtree->n.sym;
2772 gfc_free_expr (e);
2773 e = NULL;
2775 /* Ignore errors to this point, if we've gotten here. This means
2776 we ignore the m=MATCH_ERROR from above. */
2777 if (gfc_validate_kind (ts->type, ts->kind, true) < 0)
2779 gfc_error ("Kind %d not supported for type %s at %C", ts->kind,
2780 gfc_basic_typename (ts->type));
2781 gfc_current_locus = where;
2782 return MATCH_ERROR;
2785 /* Warn if, e.g., c_int is used for a REAL variable, but not
2786 if, e.g., c_double is used for COMPLEX as the standard
2787 explicitly says that the kind type parameter for complex and real
2788 variable is the same, i.e. c_float == c_float_complex. */
2789 if (ts->f90_type != BT_UNKNOWN && ts->f90_type != ts->type
2790 && !((ts->f90_type == BT_REAL && ts->type == BT_COMPLEX)
2791 || (ts->f90_type == BT_COMPLEX && ts->type == BT_REAL)))
2792 gfc_warning_now (0, "C kind type parameter is for type %s but type at %L "
2793 "is %s", gfc_basic_typename (ts->f90_type), &where,
2794 gfc_basic_typename (ts->type));
2796 close_brackets:
2798 gfc_gobble_whitespace ();
2799 if ((c = gfc_next_ascii_char ()) != ')'
2800 && (ts->type != BT_CHARACTER || c != ','))
2802 if (ts->type == BT_CHARACTER)
2803 gfc_error ("Missing right parenthesis or comma at %C");
2804 else
2805 gfc_error ("Missing right parenthesis at %C");
2806 m = MATCH_ERROR;
2808 else
2809 /* All tests passed. */
2810 m = MATCH_YES;
2812 if(m == MATCH_ERROR)
2813 gfc_current_locus = where;
2815 if (ts->type == BT_INTEGER && ts->kind == 4 && flag_integer4_kind == 8)
2816 ts->kind = 8;
2818 if (ts->type == BT_REAL || ts->type == BT_COMPLEX)
2820 if (ts->kind == 4)
2822 if (flag_real4_kind == 8)
2823 ts->kind = 8;
2824 if (flag_real4_kind == 10)
2825 ts->kind = 10;
2826 if (flag_real4_kind == 16)
2827 ts->kind = 16;
2830 if (ts->kind == 8)
2832 if (flag_real8_kind == 4)
2833 ts->kind = 4;
2834 if (flag_real8_kind == 10)
2835 ts->kind = 10;
2836 if (flag_real8_kind == 16)
2837 ts->kind = 16;
2841 /* Return what we know from the test(s). */
2842 return m;
2844 no_match:
2845 gfc_free_expr (e);
2846 gfc_current_locus = where;
2847 return m;
2851 static match
2852 match_char_kind (int * kind, int * is_iso_c)
2854 locus where;
2855 gfc_expr *e;
2856 match m, n;
2857 bool fail;
2859 m = MATCH_NO;
2860 e = NULL;
2861 where = gfc_current_locus;
2863 n = gfc_match_init_expr (&e);
2865 if (n != MATCH_YES && gfc_matching_function)
2867 /* The expression might include use-associated or imported
2868 parameters and try again after the specification
2869 expressions. */
2870 gfc_free_expr (e);
2871 gfc_undo_symbols ();
2872 return MATCH_YES;
2875 if (n == MATCH_NO)
2876 gfc_error ("Expected initialization expression at %C");
2877 if (n != MATCH_YES)
2878 return MATCH_ERROR;
2880 if (e->rank != 0)
2882 gfc_error ("Expected scalar initialization expression at %C");
2883 m = MATCH_ERROR;
2884 goto no_match;
2887 if (gfc_derived_parameter_expr (e))
2889 saved_kind_expr = e;
2890 *kind = 0;
2891 return MATCH_YES;
2894 fail = gfc_extract_int (e, kind, 1);
2895 *is_iso_c = e->ts.is_iso_c;
2896 if (fail)
2898 m = MATCH_ERROR;
2899 goto no_match;
2902 gfc_free_expr (e);
2904 /* Ignore errors to this point, if we've gotten here. This means
2905 we ignore the m=MATCH_ERROR from above. */
2906 if (gfc_validate_kind (BT_CHARACTER, *kind, true) < 0)
2908 gfc_error ("Kind %d is not supported for CHARACTER at %C", *kind);
2909 m = MATCH_ERROR;
2911 else
2912 /* All tests passed. */
2913 m = MATCH_YES;
2915 if (m == MATCH_ERROR)
2916 gfc_current_locus = where;
2918 /* Return what we know from the test(s). */
2919 return m;
2921 no_match:
2922 gfc_free_expr (e);
2923 gfc_current_locus = where;
2924 return m;
2928 /* Match the various kind/length specifications in a CHARACTER
2929 declaration. We don't return MATCH_NO. */
2931 match
2932 gfc_match_char_spec (gfc_typespec *ts)
2934 int kind, seen_length, is_iso_c;
2935 gfc_charlen *cl;
2936 gfc_expr *len;
2937 match m;
2938 bool deferred;
2940 len = NULL;
2941 seen_length = 0;
2942 kind = 0;
2943 is_iso_c = 0;
2944 deferred = false;
2946 /* Try the old-style specification first. */
2947 old_char_selector = 0;
2949 m = match_char_length (&len, &deferred, true);
2950 if (m != MATCH_NO)
2952 if (m == MATCH_YES)
2953 old_char_selector = 1;
2954 seen_length = 1;
2955 goto done;
2958 m = gfc_match_char ('(');
2959 if (m != MATCH_YES)
2961 m = MATCH_YES; /* Character without length is a single char. */
2962 goto done;
2965 /* Try the weird case: ( KIND = <int> [ , LEN = <len-param> ] ). */
2966 if (gfc_match (" kind =") == MATCH_YES)
2968 m = match_char_kind (&kind, &is_iso_c);
2970 if (m == MATCH_ERROR)
2971 goto done;
2972 if (m == MATCH_NO)
2973 goto syntax;
2975 if (gfc_match (" , len =") == MATCH_NO)
2976 goto rparen;
2978 m = char_len_param_value (&len, &deferred);
2979 if (m == MATCH_NO)
2980 goto syntax;
2981 if (m == MATCH_ERROR)
2982 goto done;
2983 seen_length = 1;
2985 goto rparen;
2988 /* Try to match "LEN = <len-param>" or "LEN = <len-param>, KIND = <int>". */
2989 if (gfc_match (" len =") == MATCH_YES)
2991 m = char_len_param_value (&len, &deferred);
2992 if (m == MATCH_NO)
2993 goto syntax;
2994 if (m == MATCH_ERROR)
2995 goto done;
2996 seen_length = 1;
2998 if (gfc_match_char (')') == MATCH_YES)
2999 goto done;
3001 if (gfc_match (" , kind =") != MATCH_YES)
3002 goto syntax;
3004 if (match_char_kind (&kind, &is_iso_c) == MATCH_ERROR)
3005 goto done;
3007 goto rparen;
3010 /* Try to match ( <len-param> ) or ( <len-param> , [ KIND = ] <int> ). */
3011 m = char_len_param_value (&len, &deferred);
3012 if (m == MATCH_NO)
3013 goto syntax;
3014 if (m == MATCH_ERROR)
3015 goto done;
3016 seen_length = 1;
3018 m = gfc_match_char (')');
3019 if (m == MATCH_YES)
3020 goto done;
3022 if (gfc_match_char (',') != MATCH_YES)
3023 goto syntax;
3025 gfc_match (" kind ="); /* Gobble optional text. */
3027 m = match_char_kind (&kind, &is_iso_c);
3028 if (m == MATCH_ERROR)
3029 goto done;
3030 if (m == MATCH_NO)
3031 goto syntax;
3033 rparen:
3034 /* Require a right-paren at this point. */
3035 m = gfc_match_char (')');
3036 if (m == MATCH_YES)
3037 goto done;
3039 syntax:
3040 gfc_error ("Syntax error in CHARACTER declaration at %C");
3041 m = MATCH_ERROR;
3042 gfc_free_expr (len);
3043 return m;
3045 done:
3046 /* Deal with character functions after USE and IMPORT statements. */
3047 if (gfc_matching_function)
3049 gfc_free_expr (len);
3050 gfc_undo_symbols ();
3051 return MATCH_YES;
3054 if (m != MATCH_YES)
3056 gfc_free_expr (len);
3057 return m;
3060 /* Do some final massaging of the length values. */
3061 cl = gfc_new_charlen (gfc_current_ns, NULL);
3063 if (seen_length == 0)
3064 cl->length = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
3065 else
3066 cl->length = len;
3068 ts->u.cl = cl;
3069 ts->kind = kind == 0 ? gfc_default_character_kind : kind;
3070 ts->deferred = deferred;
3072 /* We have to know if it was a C interoperable kind so we can
3073 do accurate type checking of bind(c) procs, etc. */
3074 if (kind != 0)
3075 /* Mark this as C interoperable if being declared with one
3076 of the named constants from iso_c_binding. */
3077 ts->is_c_interop = is_iso_c;
3078 else if (len != NULL)
3079 /* Here, we might have parsed something such as: character(c_char)
3080 In this case, the parsing code above grabs the c_char when
3081 looking for the length (line 1690, roughly). it's the last
3082 testcase for parsing the kind params of a character variable.
3083 However, it's not actually the length. this seems like it
3084 could be an error.
3085 To see if the user used a C interop kind, test the expr
3086 of the so called length, and see if it's C interoperable. */
3087 ts->is_c_interop = len->ts.is_iso_c;
3089 return MATCH_YES;
3093 /* Matches a RECORD declaration. */
3095 static match
3096 match_record_decl (char *name)
3098 locus old_loc;
3099 old_loc = gfc_current_locus;
3100 match m;
3102 m = gfc_match (" record /");
3103 if (m == MATCH_YES)
3105 if (!flag_dec_structure)
3107 gfc_current_locus = old_loc;
3108 gfc_error ("RECORD at %C is an extension, enable it with "
3109 "-fdec-structure");
3110 return MATCH_ERROR;
3112 m = gfc_match (" %n/", name);
3113 if (m == MATCH_YES)
3114 return MATCH_YES;
3117 gfc_current_locus = old_loc;
3118 if (flag_dec_structure
3119 && (gfc_match (" record% ") == MATCH_YES
3120 || gfc_match (" record%t") == MATCH_YES))
3121 gfc_error ("Structure name expected after RECORD at %C");
3122 if (m == MATCH_NO)
3123 return MATCH_NO;
3125 return MATCH_ERROR;
3129 /* This function uses the gfc_actual_arglist 'type_param_spec_list' as a source
3130 of expressions to substitute into the possibly parameterized expression
3131 'e'. Using a list is inefficient but should not be too bad since the
3132 number of type parameters is not likely to be large. */
3133 static bool
3134 insert_parameter_exprs (gfc_expr* e, gfc_symbol* sym ATTRIBUTE_UNUSED,
3135 int* f)
3137 gfc_actual_arglist *param;
3138 gfc_expr *copy;
3140 if (e->expr_type != EXPR_VARIABLE)
3141 return false;
3143 gcc_assert (e->symtree);
3144 if (e->symtree->n.sym->attr.pdt_kind
3145 || (*f != 0 && e->symtree->n.sym->attr.pdt_len))
3147 for (param = type_param_spec_list; param; param = param->next)
3148 if (strcmp (e->symtree->n.sym->name, param->name) == 0)
3149 break;
3151 if (param)
3153 copy = gfc_copy_expr (param->expr);
3154 *e = *copy;
3155 free (copy);
3159 return false;
3163 bool
3164 gfc_insert_kind_parameter_exprs (gfc_expr *e)
3166 return gfc_traverse_expr (e, NULL, &insert_parameter_exprs, 0);
3170 bool
3171 gfc_insert_parameter_exprs (gfc_expr *e, gfc_actual_arglist *param_list)
3173 gfc_actual_arglist *old_param_spec_list = type_param_spec_list;
3174 type_param_spec_list = param_list;
3175 return gfc_traverse_expr (e, NULL, &insert_parameter_exprs, 1);
3176 type_param_spec_list = NULL;
3177 type_param_spec_list = old_param_spec_list;
3180 /* Determines the instance of a parameterized derived type to be used by
3181 matching determining the values of the kind parameters and using them
3182 in the name of the instance. If the instance exists, it is used, otherwise
3183 a new derived type is created. */
3184 match
3185 gfc_get_pdt_instance (gfc_actual_arglist *param_list, gfc_symbol **sym,
3186 gfc_actual_arglist **ext_param_list)
3188 /* The PDT template symbol. */
3189 gfc_symbol *pdt = *sym;
3190 /* The symbol for the parameter in the template f2k_namespace. */
3191 gfc_symbol *param;
3192 /* The hoped for instance of the PDT. */
3193 gfc_symbol *instance;
3194 /* The list of parameters appearing in the PDT declaration. */
3195 gfc_formal_arglist *type_param_name_list;
3196 /* Used to store the parameter specification list during recursive calls. */
3197 gfc_actual_arglist *old_param_spec_list;
3198 /* Pointers to the parameter specification being used. */
3199 gfc_actual_arglist *actual_param;
3200 gfc_actual_arglist *tail = NULL;
3201 /* Used to build up the name of the PDT instance. The prefix uses 4
3202 characters and each KIND parameter 2 more. Allow 8 of the latter. */
3203 char name[GFC_MAX_SYMBOL_LEN + 21];
3205 bool name_seen = (param_list == NULL);
3206 bool assumed_seen = false;
3207 bool deferred_seen = false;
3208 bool spec_error = false;
3209 int kind_value, i;
3210 gfc_expr *kind_expr;
3211 gfc_component *c1, *c2;
3212 match m;
3214 type_param_spec_list = NULL;
3216 type_param_name_list = pdt->formal;
3217 actual_param = param_list;
3218 sprintf (name, "Pdt%s", pdt->name);
3220 /* Run through the parameter name list and pick up the actual
3221 parameter values or use the default values in the PDT declaration. */
3222 for (; type_param_name_list;
3223 type_param_name_list = type_param_name_list->next)
3225 if (actual_param && actual_param->spec_type != SPEC_EXPLICIT)
3227 if (actual_param->spec_type == SPEC_ASSUMED)
3228 spec_error = deferred_seen;
3229 else
3230 spec_error = assumed_seen;
3232 if (spec_error)
3234 gfc_error ("The type parameter spec list at %C cannot contain "
3235 "both ASSUMED and DEFERRED parameters");
3236 goto error_return;
3240 if (actual_param && actual_param->name)
3241 name_seen = true;
3242 param = type_param_name_list->sym;
3244 c1 = gfc_find_component (pdt, param->name, false, true, NULL);
3245 if (!pdt->attr.use_assoc && !c1)
3247 gfc_error ("The type parameter name list at %L contains a parameter "
3248 "'%qs' , which is not declared as a component of the type",
3249 &pdt->declared_at, param->name);
3250 goto error_return;
3253 kind_expr = NULL;
3254 if (!name_seen)
3256 if (!actual_param && !(c1 && c1->initializer))
3258 gfc_error ("The type parameter spec list at %C does not contain "
3259 "enough parameter expressions");
3260 goto error_return;
3262 else if (!actual_param && c1 && c1->initializer)
3263 kind_expr = gfc_copy_expr (c1->initializer);
3264 else if (actual_param && actual_param->spec_type == SPEC_EXPLICIT)
3265 kind_expr = gfc_copy_expr (actual_param->expr);
3267 else
3269 actual_param = param_list;
3270 for (;actual_param; actual_param = actual_param->next)
3271 if (actual_param->name
3272 && strcmp (actual_param->name, param->name) == 0)
3273 break;
3274 if (actual_param && actual_param->spec_type == SPEC_EXPLICIT)
3275 kind_expr = gfc_copy_expr (actual_param->expr);
3276 else
3278 if (c1->initializer)
3279 kind_expr = gfc_copy_expr (c1->initializer);
3280 else if (!(actual_param && param->attr.pdt_len))
3282 gfc_error ("The derived parameter '%qs' at %C does not "
3283 "have a default value", param->name);
3284 goto error_return;
3289 /* Store the current parameter expressions in a temporary actual
3290 arglist 'list' so that they can be substituted in the corresponding
3291 expressions in the PDT instance. */
3292 if (type_param_spec_list == NULL)
3294 type_param_spec_list = gfc_get_actual_arglist ();
3295 tail = type_param_spec_list;
3297 else
3299 tail->next = gfc_get_actual_arglist ();
3300 tail = tail->next;
3302 tail->name = param->name;
3304 if (kind_expr)
3306 /* Try simplification even for LEN expressions. */
3307 gfc_resolve_expr (kind_expr);
3308 gfc_simplify_expr (kind_expr, 1);
3309 /* Variable expressions seem to default to BT_PROCEDURE.
3310 TODO find out why this is and fix it. */
3311 if (kind_expr->ts.type != BT_INTEGER
3312 && kind_expr->ts.type != BT_PROCEDURE)
3314 gfc_error ("The parameter expression at %C must be of "
3315 "INTEGER type and not %s type",
3316 gfc_basic_typename (kind_expr->ts.type));
3317 goto error_return;
3320 tail->expr = gfc_copy_expr (kind_expr);
3323 if (actual_param)
3324 tail->spec_type = actual_param->spec_type;
3326 if (!param->attr.pdt_kind)
3328 if (!name_seen && actual_param)
3329 actual_param = actual_param->next;
3330 if (kind_expr)
3332 gfc_free_expr (kind_expr);
3333 kind_expr = NULL;
3335 continue;
3338 if (actual_param
3339 && (actual_param->spec_type == SPEC_ASSUMED
3340 || actual_param->spec_type == SPEC_DEFERRED))
3342 gfc_error ("The KIND parameter '%qs' at %C cannot either be "
3343 "ASSUMED or DEFERRED", param->name);
3344 goto error_return;
3347 if (!kind_expr || !gfc_is_constant_expr (kind_expr))
3349 gfc_error ("The value for the KIND parameter '%qs' at %C does not "
3350 "reduce to a constant expression", param->name);
3351 goto error_return;
3354 gfc_extract_int (kind_expr, &kind_value);
3355 sprintf (name, "%s_%d", name, kind_value);
3357 if (!name_seen && actual_param)
3358 actual_param = actual_param->next;
3359 gfc_free_expr (kind_expr);
3362 if (!name_seen && actual_param)
3364 gfc_error ("The type parameter spec list at %C contains too many "
3365 "parameter expressions");
3366 goto error_return;
3369 /* Now we search for the PDT instance 'name'. If it doesn't exist, we
3370 build it, using 'pdt' as a template. */
3371 if (gfc_get_symbol (name, pdt->ns, &instance))
3373 gfc_error ("Parameterized derived type at %C is ambiguous");
3374 goto error_return;
3377 m = MATCH_YES;
3379 if (instance->attr.flavor == FL_DERIVED
3380 && instance->attr.pdt_type)
3382 instance->refs++;
3383 if (ext_param_list)
3384 *ext_param_list = type_param_spec_list;
3385 *sym = instance;
3386 gfc_commit_symbols ();
3387 return m;
3390 /* Start building the new instance of the parameterized type. */
3391 gfc_copy_attr (&instance->attr, &pdt->attr, &pdt->declared_at);
3392 instance->attr.pdt_template = 0;
3393 instance->attr.pdt_type = 1;
3394 instance->declared_at = gfc_current_locus;
3396 /* Add the components, replacing the parameters in all expressions
3397 with the expressions for their values in 'type_param_spec_list'. */
3398 c1 = pdt->components;
3399 tail = type_param_spec_list;
3400 for (; c1; c1 = c1->next)
3402 gfc_add_component (instance, c1->name, &c2);
3403 c2->ts = c1->ts;
3404 c2->attr = c1->attr;
3406 /* Deal with type extension by recursively calling this function
3407 to obtain the instance of the extended type. */
3408 if (gfc_current_state () != COMP_DERIVED
3409 && c1 == pdt->components
3410 && (c1->ts.type == BT_DERIVED || c1->ts.type == BT_CLASS)
3411 && c1->ts.u.derived && c1->ts.u.derived->attr.pdt_template
3412 && gfc_get_derived_super_type (*sym) == c2->ts.u.derived)
3414 gfc_formal_arglist *f;
3416 old_param_spec_list = type_param_spec_list;
3418 /* Obtain a spec list appropriate to the extended type..*/
3419 actual_param = gfc_copy_actual_arglist (type_param_spec_list);
3420 type_param_spec_list = actual_param;
3421 for (f = c1->ts.u.derived->formal; f && f->next; f = f->next)
3422 actual_param = actual_param->next;
3423 if (actual_param)
3425 gfc_free_actual_arglist (actual_param->next);
3426 actual_param->next = NULL;
3429 /* Now obtain the PDT instance for the extended type. */
3430 c2->param_list = type_param_spec_list;
3431 m = gfc_get_pdt_instance (type_param_spec_list, &c2->ts.u.derived,
3432 NULL);
3433 type_param_spec_list = old_param_spec_list;
3435 c2->ts.u.derived->refs++;
3436 gfc_set_sym_referenced (c2->ts.u.derived);
3438 /* Set extension level. */
3439 if (c2->ts.u.derived->attr.extension == 255)
3441 /* Since the extension field is 8 bit wide, we can only have
3442 up to 255 extension levels. */
3443 gfc_error ("Maximum extension level reached with type %qs at %L",
3444 c2->ts.u.derived->name,
3445 &c2->ts.u.derived->declared_at);
3446 goto error_return;
3448 instance->attr.extension = c2->ts.u.derived->attr.extension + 1;
3450 /* Advance the position in the spec list by the number of
3451 parameters in the extended type. */
3452 tail = type_param_spec_list;
3453 for (f = c1->ts.u.derived->formal; f && f->next; f = f->next)
3454 tail = tail->next;
3456 continue;
3459 /* Set the component kind using the parameterized expression. */
3460 if (c1->ts.kind == 0 && c1->kind_expr != NULL)
3462 gfc_expr *e = gfc_copy_expr (c1->kind_expr);
3463 gfc_insert_kind_parameter_exprs (e);
3464 gfc_simplify_expr (e, 1);
3465 gfc_extract_int (e, &c2->ts.kind);
3466 gfc_free_expr (e);
3467 if (gfc_validate_kind (c2->ts.type, c2->ts.kind, true) < 0)
3469 gfc_error ("Kind %d not supported for type %s at %C",
3470 c2->ts.kind, gfc_basic_typename (c2->ts.type));
3471 goto error_return;
3475 /* Similarly, set the string length if parameterized. */
3476 if (c1->ts.type == BT_CHARACTER
3477 && c1->ts.u.cl->length
3478 && gfc_derived_parameter_expr (c1->ts.u.cl->length))
3480 gfc_expr *e;
3481 e = gfc_copy_expr (c1->ts.u.cl->length);
3482 gfc_insert_kind_parameter_exprs (e);
3483 gfc_simplify_expr (e, 1);
3484 c2->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
3485 c2->ts.u.cl->length = e;
3486 c2->attr.pdt_string = 1;
3489 /* Set up either the KIND/LEN initializer, if constant,
3490 or the parameterized expression. Use the template
3491 initializer if one is not already set in this instance. */
3492 if (c2->attr.pdt_kind || c2->attr.pdt_len)
3494 if (tail && tail->expr && gfc_is_constant_expr (tail->expr))
3495 c2->initializer = gfc_copy_expr (tail->expr);
3496 else if (tail && tail->expr)
3498 c2->param_list = gfc_get_actual_arglist ();
3499 c2->param_list->name = tail->name;
3500 c2->param_list->expr = gfc_copy_expr (tail->expr);
3501 c2->param_list->next = NULL;
3504 if (!c2->initializer && c1->initializer)
3505 c2->initializer = gfc_copy_expr (c1->initializer);
3507 tail = tail->next;
3510 /* Copy the array spec. */
3511 c2->as = gfc_copy_array_spec (c1->as);
3512 if (c1->ts.type == BT_CLASS)
3513 CLASS_DATA (c2)->as = gfc_copy_array_spec (CLASS_DATA (c1)->as);
3515 /* Determine if an array spec is parameterized. If so, substitute
3516 in the parameter expressions for the bounds and set the pdt_array
3517 attribute. Notice that this attribute must be unconditionally set
3518 if this is an array of parameterized character length. */
3519 if (c1->as && c1->as->type == AS_EXPLICIT)
3521 bool pdt_array = false;
3523 /* Are the bounds of the array parameterized? */
3524 for (i = 0; i < c1->as->rank; i++)
3526 if (gfc_derived_parameter_expr (c1->as->lower[i]))
3527 pdt_array = true;
3528 if (gfc_derived_parameter_expr (c1->as->upper[i]))
3529 pdt_array = true;
3532 /* If they are, free the expressions for the bounds and
3533 replace them with the template expressions with substitute
3534 values. */
3535 for (i = 0; pdt_array && i < c1->as->rank; i++)
3537 gfc_expr *e;
3538 e = gfc_copy_expr (c1->as->lower[i]);
3539 gfc_insert_kind_parameter_exprs (e);
3540 gfc_simplify_expr (e, 1);
3541 gfc_free_expr (c2->as->lower[i]);
3542 c2->as->lower[i] = e;
3543 e = gfc_copy_expr (c1->as->upper[i]);
3544 gfc_insert_kind_parameter_exprs (e);
3545 gfc_simplify_expr (e, 1);
3546 gfc_free_expr (c2->as->upper[i]);
3547 c2->as->upper[i] = e;
3549 c2->attr.pdt_array = pdt_array ? 1 : c2->attr.pdt_string;
3552 /* Recurse into this function for PDT components. */
3553 if ((c1->ts.type == BT_DERIVED || c1->ts.type == BT_CLASS)
3554 && c1->ts.u.derived && c1->ts.u.derived->attr.pdt_template)
3556 gfc_actual_arglist *params;
3557 /* The component in the template has a list of specification
3558 expressions derived from its declaration. */
3559 params = gfc_copy_actual_arglist (c1->param_list);
3560 actual_param = params;
3561 /* Substitute the template parameters with the expressions
3562 from the specification list. */
3563 for (;actual_param; actual_param = actual_param->next)
3564 gfc_insert_parameter_exprs (actual_param->expr,
3565 type_param_spec_list);
3567 /* Now obtain the PDT instance for the component. */
3568 old_param_spec_list = type_param_spec_list;
3569 m = gfc_get_pdt_instance (params, &c2->ts.u.derived, NULL);
3570 type_param_spec_list = old_param_spec_list;
3572 c2->param_list = params;
3573 c2->initializer = gfc_default_initializer (&c2->ts);
3577 gfc_commit_symbol (instance);
3578 if (ext_param_list)
3579 *ext_param_list = type_param_spec_list;
3580 *sym = instance;
3581 return m;
3583 error_return:
3584 gfc_free_actual_arglist (type_param_spec_list);
3585 return MATCH_ERROR;
3589 /* Matches a declaration-type-spec (F03:R502). If successful, sets the ts
3590 structure to the matched specification. This is necessary for FUNCTION and
3591 IMPLICIT statements.
3593 If implicit_flag is nonzero, then we don't check for the optional
3594 kind specification. Not doing so is needed for matching an IMPLICIT
3595 statement correctly. */
3597 match
3598 gfc_match_decl_type_spec (gfc_typespec *ts, int implicit_flag)
3600 char name[GFC_MAX_SYMBOL_LEN + 1];
3601 gfc_symbol *sym, *dt_sym;
3602 match m;
3603 char c;
3604 bool seen_deferred_kind, matched_type;
3605 const char *dt_name;
3607 decl_type_param_list = NULL;
3609 /* A belt and braces check that the typespec is correctly being treated
3610 as a deferred characteristic association. */
3611 seen_deferred_kind = (gfc_current_state () == COMP_FUNCTION)
3612 && (gfc_current_block ()->result->ts.kind == -1)
3613 && (ts->kind == -1);
3614 gfc_clear_ts (ts);
3615 if (seen_deferred_kind)
3616 ts->kind = -1;
3618 /* Clear the current binding label, in case one is given. */
3619 curr_binding_label = NULL;
3621 if (gfc_match (" byte") == MATCH_YES)
3623 if (!gfc_notify_std (GFC_STD_GNU, "BYTE type at %C"))
3624 return MATCH_ERROR;
3626 if (gfc_validate_kind (BT_INTEGER, 1, true) < 0)
3628 gfc_error ("BYTE type used at %C "
3629 "is not available on the target machine");
3630 return MATCH_ERROR;
3633 ts->type = BT_INTEGER;
3634 ts->kind = 1;
3635 return MATCH_YES;
3639 m = gfc_match (" type (");
3640 matched_type = (m == MATCH_YES);
3641 if (matched_type)
3643 gfc_gobble_whitespace ();
3644 if (gfc_peek_ascii_char () == '*')
3646 if ((m = gfc_match ("*)")) != MATCH_YES)
3647 return m;
3648 if (gfc_comp_struct (gfc_current_state ()))
3650 gfc_error ("Assumed type at %C is not allowed for components");
3651 return MATCH_ERROR;
3653 if (!gfc_notify_std (GFC_STD_F2008_TS, "Assumed type "
3654 "at %C"))
3655 return MATCH_ERROR;
3656 ts->type = BT_ASSUMED;
3657 return MATCH_YES;
3660 m = gfc_match ("%n", name);
3661 matched_type = (m == MATCH_YES);
3664 if ((matched_type && strcmp ("integer", name) == 0)
3665 || (!matched_type && gfc_match (" integer") == MATCH_YES))
3667 ts->type = BT_INTEGER;
3668 ts->kind = gfc_default_integer_kind;
3669 goto get_kind;
3672 if ((matched_type && strcmp ("character", name) == 0)
3673 || (!matched_type && gfc_match (" character") == MATCH_YES))
3675 if (matched_type
3676 && !gfc_notify_std (GFC_STD_F2008, "TYPE with "
3677 "intrinsic-type-spec at %C"))
3678 return MATCH_ERROR;
3680 ts->type = BT_CHARACTER;
3681 if (implicit_flag == 0)
3682 m = gfc_match_char_spec (ts);
3683 else
3684 m = MATCH_YES;
3686 if (matched_type && m == MATCH_YES && gfc_match_char (')') != MATCH_YES)
3687 m = MATCH_ERROR;
3689 return m;
3692 if ((matched_type && strcmp ("real", name) == 0)
3693 || (!matched_type && gfc_match (" real") == MATCH_YES))
3695 ts->type = BT_REAL;
3696 ts->kind = gfc_default_real_kind;
3697 goto get_kind;
3700 if ((matched_type
3701 && (strcmp ("doubleprecision", name) == 0
3702 || (strcmp ("double", name) == 0
3703 && gfc_match (" precision") == MATCH_YES)))
3704 || (!matched_type && gfc_match (" double precision") == MATCH_YES))
3706 if (matched_type
3707 && !gfc_notify_std (GFC_STD_F2008, "TYPE with "
3708 "intrinsic-type-spec at %C"))
3709 return MATCH_ERROR;
3710 if (matched_type && gfc_match_char (')') != MATCH_YES)
3711 return MATCH_ERROR;
3713 ts->type = BT_REAL;
3714 ts->kind = gfc_default_double_kind;
3715 return MATCH_YES;
3718 if ((matched_type && strcmp ("complex", name) == 0)
3719 || (!matched_type && gfc_match (" complex") == MATCH_YES))
3721 ts->type = BT_COMPLEX;
3722 ts->kind = gfc_default_complex_kind;
3723 goto get_kind;
3726 if ((matched_type
3727 && (strcmp ("doublecomplex", name) == 0
3728 || (strcmp ("double", name) == 0
3729 && gfc_match (" complex") == MATCH_YES)))
3730 || (!matched_type && gfc_match (" double complex") == MATCH_YES))
3732 if (!gfc_notify_std (GFC_STD_GNU, "DOUBLE COMPLEX at %C"))
3733 return MATCH_ERROR;
3735 if (matched_type
3736 && !gfc_notify_std (GFC_STD_F2008, "TYPE with "
3737 "intrinsic-type-spec at %C"))
3738 return MATCH_ERROR;
3740 if (matched_type && gfc_match_char (')') != MATCH_YES)
3741 return MATCH_ERROR;
3743 ts->type = BT_COMPLEX;
3744 ts->kind = gfc_default_double_kind;
3745 return MATCH_YES;
3748 if ((matched_type && strcmp ("logical", name) == 0)
3749 || (!matched_type && gfc_match (" logical") == MATCH_YES))
3751 ts->type = BT_LOGICAL;
3752 ts->kind = gfc_default_logical_kind;
3753 goto get_kind;
3756 if (matched_type)
3758 m = gfc_match_actual_arglist (1, &decl_type_param_list, true);
3759 if (m == MATCH_ERROR)
3760 return m;
3762 m = gfc_match_char (')');
3765 if (m != MATCH_YES)
3766 m = match_record_decl (name);
3768 if (matched_type || m == MATCH_YES)
3770 ts->type = BT_DERIVED;
3771 /* We accept record/s/ or type(s) where s is a structure, but we
3772 * don't need all the extra derived-type stuff for structures. */
3773 if (gfc_find_symbol (gfc_dt_upper_string (name), NULL, 1, &sym))
3775 gfc_error ("Type name %qs at %C is ambiguous", name);
3776 return MATCH_ERROR;
3779 if (sym && sym->attr.flavor == FL_DERIVED
3780 && sym->attr.pdt_template
3781 && gfc_current_state () != COMP_DERIVED)
3783 m = gfc_get_pdt_instance (decl_type_param_list, &sym, NULL);
3784 if (m != MATCH_YES)
3785 return m;
3786 gcc_assert (!sym->attr.pdt_template && sym->attr.pdt_type);
3787 ts->u.derived = sym;
3788 strcpy (name, gfc_dt_lower_string (sym->name));
3791 if (sym && sym->attr.flavor == FL_STRUCT)
3793 ts->u.derived = sym;
3794 return MATCH_YES;
3796 /* Actually a derived type. */
3799 else
3801 /* Match nested STRUCTURE declarations; only valid within another
3802 structure declaration. */
3803 if (flag_dec_structure
3804 && (gfc_current_state () == COMP_STRUCTURE
3805 || gfc_current_state () == COMP_MAP))
3807 m = gfc_match (" structure");
3808 if (m == MATCH_YES)
3810 m = gfc_match_structure_decl ();
3811 if (m == MATCH_YES)
3813 /* gfc_new_block is updated by match_structure_decl. */
3814 ts->type = BT_DERIVED;
3815 ts->u.derived = gfc_new_block;
3816 return MATCH_YES;
3819 if (m == MATCH_ERROR)
3820 return MATCH_ERROR;
3823 /* Match CLASS declarations. */
3824 m = gfc_match (" class ( * )");
3825 if (m == MATCH_ERROR)
3826 return MATCH_ERROR;
3827 else if (m == MATCH_YES)
3829 gfc_symbol *upe;
3830 gfc_symtree *st;
3831 ts->type = BT_CLASS;
3832 gfc_find_symbol ("STAR", gfc_current_ns, 1, &upe);
3833 if (upe == NULL)
3835 upe = gfc_new_symbol ("STAR", gfc_current_ns);
3836 st = gfc_new_symtree (&gfc_current_ns->sym_root, "STAR");
3837 st->n.sym = upe;
3838 gfc_set_sym_referenced (upe);
3839 upe->refs++;
3840 upe->ts.type = BT_VOID;
3841 upe->attr.unlimited_polymorphic = 1;
3842 /* This is essential to force the construction of
3843 unlimited polymorphic component class containers. */
3844 upe->attr.zero_comp = 1;
3845 if (!gfc_add_flavor (&upe->attr, FL_DERIVED, NULL,
3846 &gfc_current_locus))
3847 return MATCH_ERROR;
3849 else
3851 st = gfc_get_tbp_symtree (&gfc_current_ns->sym_root, "STAR");
3852 st->n.sym = upe;
3853 upe->refs++;
3855 ts->u.derived = upe;
3856 return m;
3859 m = gfc_match (" class (");
3861 if (m == MATCH_YES)
3862 m = gfc_match ("%n", name);
3863 else
3864 return m;
3866 if (m != MATCH_YES)
3867 return m;
3868 ts->type = BT_CLASS;
3870 if (!gfc_notify_std (GFC_STD_F2003, "CLASS statement at %C"))
3871 return MATCH_ERROR;
3873 m = gfc_match_actual_arglist (1, &decl_type_param_list, true);
3874 if (m == MATCH_ERROR)
3875 return m;
3877 m = gfc_match_char (')');
3878 if (m != MATCH_YES)
3879 return m;
3882 /* Defer association of the derived type until the end of the
3883 specification block. However, if the derived type can be
3884 found, add it to the typespec. */
3885 if (gfc_matching_function)
3887 ts->u.derived = NULL;
3888 if (gfc_current_state () != COMP_INTERFACE
3889 && !gfc_find_symbol (name, NULL, 1, &sym) && sym)
3891 sym = gfc_find_dt_in_generic (sym);
3892 ts->u.derived = sym;
3894 return MATCH_YES;
3897 /* Search for the name but allow the components to be defined later. If
3898 type = -1, this typespec has been seen in a function declaration but
3899 the type could not be accessed at that point. The actual derived type is
3900 stored in a symtree with the first letter of the name capitalized; the
3901 symtree with the all lower-case name contains the associated
3902 generic function. */
3903 dt_name = gfc_dt_upper_string (name);
3904 sym = NULL;
3905 dt_sym = NULL;
3906 if (ts->kind != -1)
3908 gfc_get_ha_symbol (name, &sym);
3909 if (sym->generic && gfc_find_symbol (dt_name, NULL, 0, &dt_sym))
3911 gfc_error ("Type name %qs at %C is ambiguous", name);
3912 return MATCH_ERROR;
3914 if (sym->generic && !dt_sym)
3915 dt_sym = gfc_find_dt_in_generic (sym);
3917 /* Host associated PDTs can get confused with their constructors
3918 because they ar instantiated in the template's namespace. */
3919 if (!dt_sym)
3921 if (gfc_find_symbol (dt_name, NULL, 1, &dt_sym))
3923 gfc_error ("Type name %qs at %C is ambiguous", name);
3924 return MATCH_ERROR;
3926 if (dt_sym && !dt_sym->attr.pdt_type)
3927 dt_sym = NULL;
3930 else if (ts->kind == -1)
3932 int iface = gfc_state_stack->previous->state != COMP_INTERFACE
3933 || gfc_current_ns->has_import_set;
3934 gfc_find_symbol (name, NULL, iface, &sym);
3935 if (sym && sym->generic && gfc_find_symbol (dt_name, NULL, 1, &dt_sym))
3937 gfc_error ("Type name %qs at %C is ambiguous", name);
3938 return MATCH_ERROR;
3940 if (sym && sym->generic && !dt_sym)
3941 dt_sym = gfc_find_dt_in_generic (sym);
3943 ts->kind = 0;
3944 if (sym == NULL)
3945 return MATCH_NO;
3948 if ((sym->attr.flavor != FL_UNKNOWN && sym->attr.flavor != FL_STRUCT
3949 && !(sym->attr.flavor == FL_PROCEDURE && sym->attr.generic))
3950 || sym->attr.subroutine)
3952 gfc_error ("Type name %qs at %C conflicts with previously declared "
3953 "entity at %L, which has the same name", name,
3954 &sym->declared_at);
3955 return MATCH_ERROR;
3958 if (sym && sym->attr.flavor == FL_DERIVED
3959 && sym->attr.pdt_template
3960 && gfc_current_state () != COMP_DERIVED)
3962 m = gfc_get_pdt_instance (decl_type_param_list, &sym, NULL);
3963 if (m != MATCH_YES)
3964 return m;
3965 gcc_assert (!sym->attr.pdt_template && sym->attr.pdt_type);
3966 ts->u.derived = sym;
3967 strcpy (name, gfc_dt_lower_string (sym->name));
3970 gfc_save_symbol_data (sym);
3971 gfc_set_sym_referenced (sym);
3972 if (!sym->attr.generic
3973 && !gfc_add_generic (&sym->attr, sym->name, NULL))
3974 return MATCH_ERROR;
3976 if (!sym->attr.function
3977 && !gfc_add_function (&sym->attr, sym->name, NULL))
3978 return MATCH_ERROR;
3980 if (dt_sym && dt_sym->attr.flavor == FL_DERIVED
3981 && dt_sym->attr.pdt_template
3982 && gfc_current_state () != COMP_DERIVED)
3984 m = gfc_get_pdt_instance (decl_type_param_list, &dt_sym, NULL);
3985 if (m != MATCH_YES)
3986 return m;
3987 gcc_assert (!dt_sym->attr.pdt_template && dt_sym->attr.pdt_type);
3990 if (!dt_sym)
3992 gfc_interface *intr, *head;
3994 /* Use upper case to save the actual derived-type symbol. */
3995 gfc_get_symbol (dt_name, NULL, &dt_sym);
3996 dt_sym->name = gfc_get_string ("%s", sym->name);
3997 head = sym->generic;
3998 intr = gfc_get_interface ();
3999 intr->sym = dt_sym;
4000 intr->where = gfc_current_locus;
4001 intr->next = head;
4002 sym->generic = intr;
4003 sym->attr.if_source = IFSRC_DECL;
4005 else
4006 gfc_save_symbol_data (dt_sym);
4008 gfc_set_sym_referenced (dt_sym);
4010 if (dt_sym->attr.flavor != FL_DERIVED && dt_sym->attr.flavor != FL_STRUCT
4011 && !gfc_add_flavor (&dt_sym->attr, FL_DERIVED, sym->name, NULL))
4012 return MATCH_ERROR;
4014 ts->u.derived = dt_sym;
4016 return MATCH_YES;
4018 get_kind:
4019 if (matched_type
4020 && !gfc_notify_std (GFC_STD_F2008, "TYPE with "
4021 "intrinsic-type-spec at %C"))
4022 return MATCH_ERROR;
4024 /* For all types except double, derived and character, look for an
4025 optional kind specifier. MATCH_NO is actually OK at this point. */
4026 if (implicit_flag == 1)
4028 if (matched_type && gfc_match_char (')') != MATCH_YES)
4029 return MATCH_ERROR;
4031 return MATCH_YES;
4034 if (gfc_current_form == FORM_FREE)
4036 c = gfc_peek_ascii_char ();
4037 if (!gfc_is_whitespace (c) && c != '*' && c != '('
4038 && c != ':' && c != ',')
4040 if (matched_type && c == ')')
4042 gfc_next_ascii_char ();
4043 return MATCH_YES;
4045 return MATCH_NO;
4049 m = gfc_match_kind_spec (ts, false);
4050 if (m == MATCH_NO && ts->type != BT_CHARACTER)
4052 m = gfc_match_old_kind_spec (ts);
4053 if (gfc_validate_kind (ts->type, ts->kind, true) == -1)
4054 return MATCH_ERROR;
4057 if (matched_type && gfc_match_char (')') != MATCH_YES)
4058 return MATCH_ERROR;
4060 /* Defer association of the KIND expression of function results
4061 until after USE and IMPORT statements. */
4062 if ((gfc_current_state () == COMP_NONE && gfc_error_flag_test ())
4063 || gfc_matching_function)
4064 return MATCH_YES;
4066 if (m == MATCH_NO)
4067 m = MATCH_YES; /* No kind specifier found. */
4069 return m;
4073 /* Match an IMPLICIT NONE statement. Actually, this statement is
4074 already matched in parse.c, or we would not end up here in the
4075 first place. So the only thing we need to check, is if there is
4076 trailing garbage. If not, the match is successful. */
4078 match
4079 gfc_match_implicit_none (void)
4081 char c;
4082 match m;
4083 char name[GFC_MAX_SYMBOL_LEN + 1];
4084 bool type = false;
4085 bool external = false;
4086 locus cur_loc = gfc_current_locus;
4088 if (gfc_current_ns->seen_implicit_none
4089 || gfc_current_ns->has_implicit_none_export)
4091 gfc_error ("Duplicate IMPLICIT NONE statement at %C");
4092 return MATCH_ERROR;
4095 gfc_gobble_whitespace ();
4096 c = gfc_peek_ascii_char ();
4097 if (c == '(')
4099 (void) gfc_next_ascii_char ();
4100 if (!gfc_notify_std (GFC_STD_F2015, "IMPORT NONE with spec list at %C"))
4101 return MATCH_ERROR;
4103 gfc_gobble_whitespace ();
4104 if (gfc_peek_ascii_char () == ')')
4106 (void) gfc_next_ascii_char ();
4107 type = true;
4109 else
4110 for(;;)
4112 m = gfc_match (" %n", name);
4113 if (m != MATCH_YES)
4114 return MATCH_ERROR;
4116 if (strcmp (name, "type") == 0)
4117 type = true;
4118 else if (strcmp (name, "external") == 0)
4119 external = true;
4120 else
4121 return MATCH_ERROR;
4123 gfc_gobble_whitespace ();
4124 c = gfc_next_ascii_char ();
4125 if (c == ',')
4126 continue;
4127 if (c == ')')
4128 break;
4129 return MATCH_ERROR;
4132 else
4133 type = true;
4135 if (gfc_match_eos () != MATCH_YES)
4136 return MATCH_ERROR;
4138 gfc_set_implicit_none (type, external, &cur_loc);
4140 return MATCH_YES;
4144 /* Match the letter range(s) of an IMPLICIT statement. */
4146 static match
4147 match_implicit_range (void)
4149 char c, c1, c2;
4150 int inner;
4151 locus cur_loc;
4153 cur_loc = gfc_current_locus;
4155 gfc_gobble_whitespace ();
4156 c = gfc_next_ascii_char ();
4157 if (c != '(')
4159 gfc_error ("Missing character range in IMPLICIT at %C");
4160 goto bad;
4163 inner = 1;
4164 while (inner)
4166 gfc_gobble_whitespace ();
4167 c1 = gfc_next_ascii_char ();
4168 if (!ISALPHA (c1))
4169 goto bad;
4171 gfc_gobble_whitespace ();
4172 c = gfc_next_ascii_char ();
4174 switch (c)
4176 case ')':
4177 inner = 0; /* Fall through. */
4179 case ',':
4180 c2 = c1;
4181 break;
4183 case '-':
4184 gfc_gobble_whitespace ();
4185 c2 = gfc_next_ascii_char ();
4186 if (!ISALPHA (c2))
4187 goto bad;
4189 gfc_gobble_whitespace ();
4190 c = gfc_next_ascii_char ();
4192 if ((c != ',') && (c != ')'))
4193 goto bad;
4194 if (c == ')')
4195 inner = 0;
4197 break;
4199 default:
4200 goto bad;
4203 if (c1 > c2)
4205 gfc_error ("Letters must be in alphabetic order in "
4206 "IMPLICIT statement at %C");
4207 goto bad;
4210 /* See if we can add the newly matched range to the pending
4211 implicits from this IMPLICIT statement. We do not check for
4212 conflicts with whatever earlier IMPLICIT statements may have
4213 set. This is done when we've successfully finished matching
4214 the current one. */
4215 if (!gfc_add_new_implicit_range (c1, c2))
4216 goto bad;
4219 return MATCH_YES;
4221 bad:
4222 gfc_syntax_error (ST_IMPLICIT);
4224 gfc_current_locus = cur_loc;
4225 return MATCH_ERROR;
4229 /* Match an IMPLICIT statement, storing the types for
4230 gfc_set_implicit() if the statement is accepted by the parser.
4231 There is a strange looking, but legal syntactic construction
4232 possible. It looks like:
4234 IMPLICIT INTEGER (a-b) (c-d)
4236 This is legal if "a-b" is a constant expression that happens to
4237 equal one of the legal kinds for integers. The real problem
4238 happens with an implicit specification that looks like:
4240 IMPLICIT INTEGER (a-b)
4242 In this case, a typespec matcher that is "greedy" (as most of the
4243 matchers are) gobbles the character range as a kindspec, leaving
4244 nothing left. We therefore have to go a bit more slowly in the
4245 matching process by inhibiting the kindspec checking during
4246 typespec matching and checking for a kind later. */
4248 match
4249 gfc_match_implicit (void)
4251 gfc_typespec ts;
4252 locus cur_loc;
4253 char c;
4254 match m;
4256 if (gfc_current_ns->seen_implicit_none)
4258 gfc_error ("IMPLICIT statement at %C following an IMPLICIT NONE (type) "
4259 "statement");
4260 return MATCH_ERROR;
4263 gfc_clear_ts (&ts);
4265 /* We don't allow empty implicit statements. */
4266 if (gfc_match_eos () == MATCH_YES)
4268 gfc_error ("Empty IMPLICIT statement at %C");
4269 return MATCH_ERROR;
4274 /* First cleanup. */
4275 gfc_clear_new_implicit ();
4277 /* A basic type is mandatory here. */
4278 m = gfc_match_decl_type_spec (&ts, 1);
4279 if (m == MATCH_ERROR)
4280 goto error;
4281 if (m == MATCH_NO)
4282 goto syntax;
4284 cur_loc = gfc_current_locus;
4285 m = match_implicit_range ();
4287 if (m == MATCH_YES)
4289 /* We may have <TYPE> (<RANGE>). */
4290 gfc_gobble_whitespace ();
4291 c = gfc_peek_ascii_char ();
4292 if (c == ',' || c == '\n' || c == ';' || c == '!')
4294 /* Check for CHARACTER with no length parameter. */
4295 if (ts.type == BT_CHARACTER && !ts.u.cl)
4297 ts.kind = gfc_default_character_kind;
4298 ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
4299 ts.u.cl->length = gfc_get_int_expr (gfc_default_integer_kind,
4300 NULL, 1);
4303 /* Record the Successful match. */
4304 if (!gfc_merge_new_implicit (&ts))
4305 return MATCH_ERROR;
4306 if (c == ',')
4307 c = gfc_next_ascii_char ();
4308 else if (gfc_match_eos () == MATCH_ERROR)
4309 goto error;
4310 continue;
4313 gfc_current_locus = cur_loc;
4316 /* Discard the (incorrectly) matched range. */
4317 gfc_clear_new_implicit ();
4319 /* Last chance -- check <TYPE> <SELECTOR> (<RANGE>). */
4320 if (ts.type == BT_CHARACTER)
4321 m = gfc_match_char_spec (&ts);
4322 else
4324 m = gfc_match_kind_spec (&ts, false);
4325 if (m == MATCH_NO)
4327 m = gfc_match_old_kind_spec (&ts);
4328 if (m == MATCH_ERROR)
4329 goto error;
4330 if (m == MATCH_NO)
4331 goto syntax;
4334 if (m == MATCH_ERROR)
4335 goto error;
4337 m = match_implicit_range ();
4338 if (m == MATCH_ERROR)
4339 goto error;
4340 if (m == MATCH_NO)
4341 goto syntax;
4343 gfc_gobble_whitespace ();
4344 c = gfc_next_ascii_char ();
4345 if (c != ',' && gfc_match_eos () != MATCH_YES)
4346 goto syntax;
4348 if (!gfc_merge_new_implicit (&ts))
4349 return MATCH_ERROR;
4351 while (c == ',');
4353 return MATCH_YES;
4355 syntax:
4356 gfc_syntax_error (ST_IMPLICIT);
4358 error:
4359 return MATCH_ERROR;
4363 match
4364 gfc_match_import (void)
4366 char name[GFC_MAX_SYMBOL_LEN + 1];
4367 match m;
4368 gfc_symbol *sym;
4369 gfc_symtree *st;
4371 if (gfc_current_ns->proc_name == NULL
4372 || gfc_current_ns->proc_name->attr.if_source != IFSRC_IFBODY)
4374 gfc_error ("IMPORT statement at %C only permitted in "
4375 "an INTERFACE body");
4376 return MATCH_ERROR;
4379 if (gfc_current_ns->proc_name->attr.module_procedure)
4381 gfc_error ("F2008: C1210 IMPORT statement at %C is not permitted "
4382 "in a module procedure interface body");
4383 return MATCH_ERROR;
4386 if (!gfc_notify_std (GFC_STD_F2003, "IMPORT statement at %C"))
4387 return MATCH_ERROR;
4389 if (gfc_match_eos () == MATCH_YES)
4391 /* All host variables should be imported. */
4392 gfc_current_ns->has_import_set = 1;
4393 return MATCH_YES;
4396 if (gfc_match (" ::") == MATCH_YES)
4398 if (gfc_match_eos () == MATCH_YES)
4400 gfc_error ("Expecting list of named entities at %C");
4401 return MATCH_ERROR;
4405 for(;;)
4407 sym = NULL;
4408 m = gfc_match (" %n", name);
4409 switch (m)
4411 case MATCH_YES:
4412 if (gfc_current_ns->parent != NULL
4413 && gfc_find_symbol (name, gfc_current_ns->parent, 1, &sym))
4415 gfc_error ("Type name %qs at %C is ambiguous", name);
4416 return MATCH_ERROR;
4418 else if (!sym && gfc_current_ns->proc_name->ns->parent != NULL
4419 && gfc_find_symbol (name,
4420 gfc_current_ns->proc_name->ns->parent,
4421 1, &sym))
4423 gfc_error ("Type name %qs at %C is ambiguous", name);
4424 return MATCH_ERROR;
4427 if (sym == NULL)
4429 gfc_error ("Cannot IMPORT %qs from host scoping unit "
4430 "at %C - does not exist.", name);
4431 return MATCH_ERROR;
4434 if (gfc_find_symtree (gfc_current_ns->sym_root, name))
4436 gfc_warning (0, "%qs is already IMPORTed from host scoping unit "
4437 "at %C", name);
4438 goto next_item;
4441 st = gfc_new_symtree (&gfc_current_ns->sym_root, name);
4442 st->n.sym = sym;
4443 sym->refs++;
4444 sym->attr.imported = 1;
4446 if (sym->attr.generic && (sym = gfc_find_dt_in_generic (sym)))
4448 /* The actual derived type is stored in a symtree with the first
4449 letter of the name capitalized; the symtree with the all
4450 lower-case name contains the associated generic function. */
4451 st = gfc_new_symtree (&gfc_current_ns->sym_root,
4452 gfc_dt_upper_string (name));
4453 st->n.sym = sym;
4454 sym->refs++;
4455 sym->attr.imported = 1;
4458 goto next_item;
4460 case MATCH_NO:
4461 break;
4463 case MATCH_ERROR:
4464 return MATCH_ERROR;
4467 next_item:
4468 if (gfc_match_eos () == MATCH_YES)
4469 break;
4470 if (gfc_match_char (',') != MATCH_YES)
4471 goto syntax;
4474 return MATCH_YES;
4476 syntax:
4477 gfc_error ("Syntax error in IMPORT statement at %C");
4478 return MATCH_ERROR;
4482 /* A minimal implementation of gfc_match without whitespace, escape
4483 characters or variable arguments. Returns true if the next
4484 characters match the TARGET template exactly. */
4486 static bool
4487 match_string_p (const char *target)
4489 const char *p;
4491 for (p = target; *p; p++)
4492 if ((char) gfc_next_ascii_char () != *p)
4493 return false;
4494 return true;
4497 /* Matches an attribute specification including array specs. If
4498 successful, leaves the variables current_attr and current_as
4499 holding the specification. Also sets the colon_seen variable for
4500 later use by matchers associated with initializations.
4502 This subroutine is a little tricky in the sense that we don't know
4503 if we really have an attr-spec until we hit the double colon.
4504 Until that time, we can only return MATCH_NO. This forces us to
4505 check for duplicate specification at this level. */
4507 static match
4508 match_attr_spec (void)
4510 /* Modifiers that can exist in a type statement. */
4511 enum
4512 { GFC_DECL_BEGIN = 0,
4513 DECL_ALLOCATABLE = GFC_DECL_BEGIN, DECL_DIMENSION, DECL_EXTERNAL,
4514 DECL_IN, DECL_OUT, DECL_INOUT, DECL_INTRINSIC, DECL_OPTIONAL,
4515 DECL_PARAMETER, DECL_POINTER, DECL_PROTECTED, DECL_PRIVATE,
4516 DECL_STATIC, DECL_AUTOMATIC,
4517 DECL_PUBLIC, DECL_SAVE, DECL_TARGET, DECL_VALUE, DECL_VOLATILE,
4518 DECL_IS_BIND_C, DECL_CODIMENSION, DECL_ASYNCHRONOUS, DECL_CONTIGUOUS,
4519 DECL_LEN, DECL_KIND, DECL_NONE, GFC_DECL_END /* Sentinel */
4522 /* GFC_DECL_END is the sentinel, index starts at 0. */
4523 #define NUM_DECL GFC_DECL_END
4525 locus start, seen_at[NUM_DECL];
4526 int seen[NUM_DECL];
4527 unsigned int d;
4528 const char *attr;
4529 match m;
4530 bool t;
4532 gfc_clear_attr (&current_attr);
4533 start = gfc_current_locus;
4535 current_as = NULL;
4536 colon_seen = 0;
4537 attr_seen = 0;
4539 /* See if we get all of the keywords up to the final double colon. */
4540 for (d = GFC_DECL_BEGIN; d != GFC_DECL_END; d++)
4541 seen[d] = 0;
4543 for (;;)
4545 char ch;
4547 d = DECL_NONE;
4548 gfc_gobble_whitespace ();
4550 ch = gfc_next_ascii_char ();
4551 if (ch == ':')
4553 /* This is the successful exit condition for the loop. */
4554 if (gfc_next_ascii_char () == ':')
4555 break;
4557 else if (ch == ',')
4559 gfc_gobble_whitespace ();
4560 switch (gfc_peek_ascii_char ())
4562 case 'a':
4563 gfc_next_ascii_char ();
4564 switch (gfc_next_ascii_char ())
4566 case 'l':
4567 if (match_string_p ("locatable"))
4569 /* Matched "allocatable". */
4570 d = DECL_ALLOCATABLE;
4572 break;
4574 case 's':
4575 if (match_string_p ("ynchronous"))
4577 /* Matched "asynchronous". */
4578 d = DECL_ASYNCHRONOUS;
4580 break;
4582 case 'u':
4583 if (match_string_p ("tomatic"))
4585 /* Matched "automatic". */
4586 d = DECL_AUTOMATIC;
4588 break;
4590 break;
4592 case 'b':
4593 /* Try and match the bind(c). */
4594 m = gfc_match_bind_c (NULL, true);
4595 if (m == MATCH_YES)
4596 d = DECL_IS_BIND_C;
4597 else if (m == MATCH_ERROR)
4598 goto cleanup;
4599 break;
4601 case 'c':
4602 gfc_next_ascii_char ();
4603 if ('o' != gfc_next_ascii_char ())
4604 break;
4605 switch (gfc_next_ascii_char ())
4607 case 'd':
4608 if (match_string_p ("imension"))
4610 d = DECL_CODIMENSION;
4611 break;
4613 /* FALLTHRU */
4614 case 'n':
4615 if (match_string_p ("tiguous"))
4617 d = DECL_CONTIGUOUS;
4618 break;
4621 break;
4623 case 'd':
4624 if (match_string_p ("dimension"))
4625 d = DECL_DIMENSION;
4626 break;
4628 case 'e':
4629 if (match_string_p ("external"))
4630 d = DECL_EXTERNAL;
4631 break;
4633 case 'i':
4634 if (match_string_p ("int"))
4636 ch = gfc_next_ascii_char ();
4637 if (ch == 'e')
4639 if (match_string_p ("nt"))
4641 /* Matched "intent". */
4642 /* TODO: Call match_intent_spec from here. */
4643 if (gfc_match (" ( in out )") == MATCH_YES)
4644 d = DECL_INOUT;
4645 else if (gfc_match (" ( in )") == MATCH_YES)
4646 d = DECL_IN;
4647 else if (gfc_match (" ( out )") == MATCH_YES)
4648 d = DECL_OUT;
4651 else if (ch == 'r')
4653 if (match_string_p ("insic"))
4655 /* Matched "intrinsic". */
4656 d = DECL_INTRINSIC;
4660 break;
4662 case 'k':
4663 if (match_string_p ("kind"))
4664 d = DECL_KIND;
4665 break;
4667 case 'l':
4668 if (match_string_p ("len"))
4669 d = DECL_LEN;
4670 break;
4672 case 'o':
4673 if (match_string_p ("optional"))
4674 d = DECL_OPTIONAL;
4675 break;
4677 case 'p':
4678 gfc_next_ascii_char ();
4679 switch (gfc_next_ascii_char ())
4681 case 'a':
4682 if (match_string_p ("rameter"))
4684 /* Matched "parameter". */
4685 d = DECL_PARAMETER;
4687 break;
4689 case 'o':
4690 if (match_string_p ("inter"))
4692 /* Matched "pointer". */
4693 d = DECL_POINTER;
4695 break;
4697 case 'r':
4698 ch = gfc_next_ascii_char ();
4699 if (ch == 'i')
4701 if (match_string_p ("vate"))
4703 /* Matched "private". */
4704 d = DECL_PRIVATE;
4707 else if (ch == 'o')
4709 if (match_string_p ("tected"))
4711 /* Matched "protected". */
4712 d = DECL_PROTECTED;
4715 break;
4717 case 'u':
4718 if (match_string_p ("blic"))
4720 /* Matched "public". */
4721 d = DECL_PUBLIC;
4723 break;
4725 break;
4727 case 's':
4728 gfc_next_ascii_char ();
4729 switch (gfc_next_ascii_char ())
4731 case 'a':
4732 if (match_string_p ("ve"))
4734 /* Matched "save". */
4735 d = DECL_SAVE;
4737 break;
4739 case 't':
4740 if (match_string_p ("atic"))
4742 /* Matched "static". */
4743 d = DECL_STATIC;
4745 break;
4747 break;
4749 case 't':
4750 if (match_string_p ("target"))
4751 d = DECL_TARGET;
4752 break;
4754 case 'v':
4755 gfc_next_ascii_char ();
4756 ch = gfc_next_ascii_char ();
4757 if (ch == 'a')
4759 if (match_string_p ("lue"))
4761 /* Matched "value". */
4762 d = DECL_VALUE;
4765 else if (ch == 'o')
4767 if (match_string_p ("latile"))
4769 /* Matched "volatile". */
4770 d = DECL_VOLATILE;
4773 break;
4777 /* No double colon and no recognizable decl_type, so assume that
4778 we've been looking at something else the whole time. */
4779 if (d == DECL_NONE)
4781 m = MATCH_NO;
4782 goto cleanup;
4785 /* Check to make sure any parens are paired up correctly. */
4786 if (gfc_match_parens () == MATCH_ERROR)
4788 m = MATCH_ERROR;
4789 goto cleanup;
4792 seen[d]++;
4793 seen_at[d] = gfc_current_locus;
4795 if (d == DECL_DIMENSION || d == DECL_CODIMENSION)
4797 gfc_array_spec *as = NULL;
4799 m = gfc_match_array_spec (&as, d == DECL_DIMENSION,
4800 d == DECL_CODIMENSION);
4802 if (current_as == NULL)
4803 current_as = as;
4804 else if (m == MATCH_YES)
4806 if (!merge_array_spec (as, current_as, false))
4807 m = MATCH_ERROR;
4808 free (as);
4811 if (m == MATCH_NO)
4813 if (d == DECL_CODIMENSION)
4814 gfc_error ("Missing codimension specification at %C");
4815 else
4816 gfc_error ("Missing dimension specification at %C");
4817 m = MATCH_ERROR;
4820 if (m == MATCH_ERROR)
4821 goto cleanup;
4825 /* Since we've seen a double colon, we have to be looking at an
4826 attr-spec. This means that we can now issue errors. */
4827 for (d = GFC_DECL_BEGIN; d != GFC_DECL_END; d++)
4828 if (seen[d] > 1)
4830 switch (d)
4832 case DECL_ALLOCATABLE:
4833 attr = "ALLOCATABLE";
4834 break;
4835 case DECL_ASYNCHRONOUS:
4836 attr = "ASYNCHRONOUS";
4837 break;
4838 case DECL_CODIMENSION:
4839 attr = "CODIMENSION";
4840 break;
4841 case DECL_CONTIGUOUS:
4842 attr = "CONTIGUOUS";
4843 break;
4844 case DECL_DIMENSION:
4845 attr = "DIMENSION";
4846 break;
4847 case DECL_EXTERNAL:
4848 attr = "EXTERNAL";
4849 break;
4850 case DECL_IN:
4851 attr = "INTENT (IN)";
4852 break;
4853 case DECL_OUT:
4854 attr = "INTENT (OUT)";
4855 break;
4856 case DECL_INOUT:
4857 attr = "INTENT (IN OUT)";
4858 break;
4859 case DECL_INTRINSIC:
4860 attr = "INTRINSIC";
4861 break;
4862 case DECL_OPTIONAL:
4863 attr = "OPTIONAL";
4864 break;
4865 case DECL_KIND:
4866 attr = "KIND";
4867 break;
4868 case DECL_LEN:
4869 attr = "LEN";
4870 break;
4871 case DECL_PARAMETER:
4872 attr = "PARAMETER";
4873 break;
4874 case DECL_POINTER:
4875 attr = "POINTER";
4876 break;
4877 case DECL_PROTECTED:
4878 attr = "PROTECTED";
4879 break;
4880 case DECL_PRIVATE:
4881 attr = "PRIVATE";
4882 break;
4883 case DECL_PUBLIC:
4884 attr = "PUBLIC";
4885 break;
4886 case DECL_SAVE:
4887 attr = "SAVE";
4888 break;
4889 case DECL_STATIC:
4890 attr = "STATIC";
4891 break;
4892 case DECL_AUTOMATIC:
4893 attr = "AUTOMATIC";
4894 break;
4895 case DECL_TARGET:
4896 attr = "TARGET";
4897 break;
4898 case DECL_IS_BIND_C:
4899 attr = "IS_BIND_C";
4900 break;
4901 case DECL_VALUE:
4902 attr = "VALUE";
4903 break;
4904 case DECL_VOLATILE:
4905 attr = "VOLATILE";
4906 break;
4907 default:
4908 attr = NULL; /* This shouldn't happen. */
4911 gfc_error ("Duplicate %s attribute at %L", attr, &seen_at[d]);
4912 m = MATCH_ERROR;
4913 goto cleanup;
4916 /* Now that we've dealt with duplicate attributes, add the attributes
4917 to the current attribute. */
4918 for (d = GFC_DECL_BEGIN; d != GFC_DECL_END; d++)
4920 if (seen[d] == 0)
4921 continue;
4922 else
4923 attr_seen = 1;
4925 if ((d == DECL_STATIC || d == DECL_AUTOMATIC)
4926 && !flag_dec_static)
4928 gfc_error ("%s at %L is a DEC extension, enable with "
4929 "%<-fdec-static%>",
4930 d == DECL_STATIC ? "STATIC" : "AUTOMATIC", &seen_at[d]);
4931 m = MATCH_ERROR;
4932 goto cleanup;
4934 /* Allow SAVE with STATIC, but don't complain. */
4935 if (d == DECL_STATIC && seen[DECL_SAVE])
4936 continue;
4938 if (gfc_current_state () == COMP_DERIVED
4939 && d != DECL_DIMENSION && d != DECL_CODIMENSION
4940 && d != DECL_POINTER && d != DECL_PRIVATE
4941 && d != DECL_PUBLIC && d != DECL_CONTIGUOUS && d != DECL_NONE)
4943 if (d == DECL_ALLOCATABLE)
4945 if (!gfc_notify_std (GFC_STD_F2003, "ALLOCATABLE "
4946 "attribute at %C in a TYPE definition"))
4948 m = MATCH_ERROR;
4949 goto cleanup;
4952 else if (d == DECL_KIND)
4954 if (!gfc_notify_std (GFC_STD_F2003, "KIND "
4955 "attribute at %C in a TYPE definition"))
4957 m = MATCH_ERROR;
4958 goto cleanup;
4960 if (current_ts.type != BT_INTEGER)
4962 gfc_error ("Component with KIND attribute at %C must be "
4963 "INTEGER");
4964 m = MATCH_ERROR;
4965 goto cleanup;
4967 if (current_ts.kind != gfc_default_integer_kind)
4969 gfc_error ("Component with KIND attribute at %C must be "
4970 "default integer kind (%d)",
4971 gfc_default_integer_kind);
4972 m = MATCH_ERROR;
4973 goto cleanup;
4976 else if (d == DECL_LEN)
4978 if (!gfc_notify_std (GFC_STD_F2003, "LEN "
4979 "attribute at %C in a TYPE definition"))
4981 m = MATCH_ERROR;
4982 goto cleanup;
4984 if (current_ts.type != BT_INTEGER)
4986 gfc_error ("Component with LEN attribute at %C must be "
4987 "INTEGER");
4988 m = MATCH_ERROR;
4989 goto cleanup;
4991 if (current_ts.kind != gfc_default_integer_kind)
4993 gfc_error ("Component with LEN attribute at %C must be "
4994 "default integer kind (%d)",
4995 gfc_default_integer_kind);
4996 m = MATCH_ERROR;
4997 goto cleanup;
5000 else
5002 gfc_error ("Attribute at %L is not allowed in a TYPE definition",
5003 &seen_at[d]);
5004 m = MATCH_ERROR;
5005 goto cleanup;
5009 if ((d == DECL_PRIVATE || d == DECL_PUBLIC)
5010 && gfc_current_state () != COMP_MODULE)
5012 if (d == DECL_PRIVATE)
5013 attr = "PRIVATE";
5014 else
5015 attr = "PUBLIC";
5016 if (gfc_current_state () == COMP_DERIVED
5017 && gfc_state_stack->previous
5018 && gfc_state_stack->previous->state == COMP_MODULE)
5020 if (!gfc_notify_std (GFC_STD_F2003, "Attribute %s "
5021 "at %L in a TYPE definition", attr,
5022 &seen_at[d]))
5024 m = MATCH_ERROR;
5025 goto cleanup;
5028 else
5030 gfc_error ("%s attribute at %L is not allowed outside of the "
5031 "specification part of a module", attr, &seen_at[d]);
5032 m = MATCH_ERROR;
5033 goto cleanup;
5037 if (gfc_current_state () != COMP_DERIVED
5038 && (d == DECL_KIND || d == DECL_LEN))
5040 gfc_error ("Attribute at %L is not allowed outside a TYPE "
5041 "definition", &seen_at[d]);
5042 m = MATCH_ERROR;
5043 goto cleanup;
5046 switch (d)
5048 case DECL_ALLOCATABLE:
5049 t = gfc_add_allocatable (&current_attr, &seen_at[d]);
5050 break;
5052 case DECL_ASYNCHRONOUS:
5053 if (!gfc_notify_std (GFC_STD_F2003, "ASYNCHRONOUS attribute at %C"))
5054 t = false;
5055 else
5056 t = gfc_add_asynchronous (&current_attr, NULL, &seen_at[d]);
5057 break;
5059 case DECL_CODIMENSION:
5060 t = gfc_add_codimension (&current_attr, NULL, &seen_at[d]);
5061 break;
5063 case DECL_CONTIGUOUS:
5064 if (!gfc_notify_std (GFC_STD_F2008, "CONTIGUOUS attribute at %C"))
5065 t = false;
5066 else
5067 t = gfc_add_contiguous (&current_attr, NULL, &seen_at[d]);
5068 break;
5070 case DECL_DIMENSION:
5071 t = gfc_add_dimension (&current_attr, NULL, &seen_at[d]);
5072 break;
5074 case DECL_EXTERNAL:
5075 t = gfc_add_external (&current_attr, &seen_at[d]);
5076 break;
5078 case DECL_IN:
5079 t = gfc_add_intent (&current_attr, INTENT_IN, &seen_at[d]);
5080 break;
5082 case DECL_OUT:
5083 t = gfc_add_intent (&current_attr, INTENT_OUT, &seen_at[d]);
5084 break;
5086 case DECL_INOUT:
5087 t = gfc_add_intent (&current_attr, INTENT_INOUT, &seen_at[d]);
5088 break;
5090 case DECL_INTRINSIC:
5091 t = gfc_add_intrinsic (&current_attr, &seen_at[d]);
5092 break;
5094 case DECL_OPTIONAL:
5095 t = gfc_add_optional (&current_attr, &seen_at[d]);
5096 break;
5098 case DECL_KIND:
5099 t = gfc_add_kind (&current_attr, &seen_at[d]);
5100 break;
5102 case DECL_LEN:
5103 t = gfc_add_len (&current_attr, &seen_at[d]);
5104 break;
5106 case DECL_PARAMETER:
5107 t = gfc_add_flavor (&current_attr, FL_PARAMETER, NULL, &seen_at[d]);
5108 break;
5110 case DECL_POINTER:
5111 t = gfc_add_pointer (&current_attr, &seen_at[d]);
5112 break;
5114 case DECL_PROTECTED:
5115 if (gfc_current_state () != COMP_MODULE
5116 || (gfc_current_ns->proc_name
5117 && gfc_current_ns->proc_name->attr.flavor != FL_MODULE))
5119 gfc_error ("PROTECTED at %C only allowed in specification "
5120 "part of a module");
5121 t = false;
5122 break;
5125 if (!gfc_notify_std (GFC_STD_F2003, "PROTECTED attribute at %C"))
5126 t = false;
5127 else
5128 t = gfc_add_protected (&current_attr, NULL, &seen_at[d]);
5129 break;
5131 case DECL_PRIVATE:
5132 t = gfc_add_access (&current_attr, ACCESS_PRIVATE, NULL,
5133 &seen_at[d]);
5134 break;
5136 case DECL_PUBLIC:
5137 t = gfc_add_access (&current_attr, ACCESS_PUBLIC, NULL,
5138 &seen_at[d]);
5139 break;
5141 case DECL_STATIC:
5142 case DECL_SAVE:
5143 t = gfc_add_save (&current_attr, SAVE_EXPLICIT, NULL, &seen_at[d]);
5144 break;
5146 case DECL_AUTOMATIC:
5147 t = gfc_add_automatic (&current_attr, NULL, &seen_at[d]);
5148 break;
5150 case DECL_TARGET:
5151 t = gfc_add_target (&current_attr, &seen_at[d]);
5152 break;
5154 case DECL_IS_BIND_C:
5155 t = gfc_add_is_bind_c(&current_attr, NULL, &seen_at[d], 0);
5156 break;
5158 case DECL_VALUE:
5159 if (!gfc_notify_std (GFC_STD_F2003, "VALUE attribute at %C"))
5160 t = false;
5161 else
5162 t = gfc_add_value (&current_attr, NULL, &seen_at[d]);
5163 break;
5165 case DECL_VOLATILE:
5166 if (!gfc_notify_std (GFC_STD_F2003, "VOLATILE attribute at %C"))
5167 t = false;
5168 else
5169 t = gfc_add_volatile (&current_attr, NULL, &seen_at[d]);
5170 break;
5172 default:
5173 gfc_internal_error ("match_attr_spec(): Bad attribute");
5176 if (!t)
5178 m = MATCH_ERROR;
5179 goto cleanup;
5183 /* Since Fortran 2008 module variables implicitly have the SAVE attribute. */
5184 if ((gfc_current_state () == COMP_MODULE
5185 || gfc_current_state () == COMP_SUBMODULE)
5186 && !current_attr.save
5187 && (gfc_option.allow_std & GFC_STD_F2008) != 0)
5188 current_attr.save = SAVE_IMPLICIT;
5190 colon_seen = 1;
5191 return MATCH_YES;
5193 cleanup:
5194 gfc_current_locus = start;
5195 gfc_free_array_spec (current_as);
5196 current_as = NULL;
5197 attr_seen = 0;
5198 return m;
5202 /* Set the binding label, dest_label, either with the binding label
5203 stored in the given gfc_typespec, ts, or if none was provided, it
5204 will be the symbol name in all lower case, as required by the draft
5205 (J3/04-007, section 15.4.1). If a binding label was given and
5206 there is more than one argument (num_idents), it is an error. */
5208 static bool
5209 set_binding_label (const char **dest_label, const char *sym_name,
5210 int num_idents)
5212 if (num_idents > 1 && has_name_equals)
5214 gfc_error ("Multiple identifiers provided with "
5215 "single NAME= specifier at %C");
5216 return false;
5219 if (curr_binding_label)
5220 /* Binding label given; store in temp holder till have sym. */
5221 *dest_label = curr_binding_label;
5222 else
5224 /* No binding label given, and the NAME= specifier did not exist,
5225 which means there was no NAME="". */
5226 if (sym_name != NULL && has_name_equals == 0)
5227 *dest_label = IDENTIFIER_POINTER (get_identifier (sym_name));
5230 return true;
5234 /* Set the status of the given common block as being BIND(C) or not,
5235 depending on the given parameter, is_bind_c. */
5237 void
5238 set_com_block_bind_c (gfc_common_head *com_block, int is_bind_c)
5240 com_block->is_bind_c = is_bind_c;
5241 return;
5245 /* Verify that the given gfc_typespec is for a C interoperable type. */
5247 bool
5248 gfc_verify_c_interop (gfc_typespec *ts)
5250 if (ts->type == BT_DERIVED && ts->u.derived != NULL)
5251 return (ts->u.derived->ts.is_c_interop || ts->u.derived->attr.is_bind_c)
5252 ? true : false;
5253 else if (ts->type == BT_CLASS)
5254 return false;
5255 else if (ts->is_c_interop != 1 && ts->type != BT_ASSUMED)
5256 return false;
5258 return true;
5262 /* Verify that the variables of a given common block, which has been
5263 defined with the attribute specifier bind(c), to be of a C
5264 interoperable type. Errors will be reported here, if
5265 encountered. */
5267 bool
5268 verify_com_block_vars_c_interop (gfc_common_head *com_block)
5270 gfc_symbol *curr_sym = NULL;
5271 bool retval = true;
5273 curr_sym = com_block->head;
5275 /* Make sure we have at least one symbol. */
5276 if (curr_sym == NULL)
5277 return retval;
5279 /* Here we know we have a symbol, so we'll execute this loop
5280 at least once. */
5283 /* The second to last param, 1, says this is in a common block. */
5284 retval = verify_bind_c_sym (curr_sym, &(curr_sym->ts), 1, com_block);
5285 curr_sym = curr_sym->common_next;
5286 } while (curr_sym != NULL);
5288 return retval;
5292 /* Verify that a given BIND(C) symbol is C interoperable. If it is not,
5293 an appropriate error message is reported. */
5295 bool
5296 verify_bind_c_sym (gfc_symbol *tmp_sym, gfc_typespec *ts,
5297 int is_in_common, gfc_common_head *com_block)
5299 bool bind_c_function = false;
5300 bool retval = true;
5302 if (tmp_sym->attr.function && tmp_sym->attr.is_bind_c)
5303 bind_c_function = true;
5305 if (tmp_sym->attr.function && tmp_sym->result != NULL)
5307 tmp_sym = tmp_sym->result;
5308 /* Make sure it wasn't an implicitly typed result. */
5309 if (tmp_sym->attr.implicit_type && warn_c_binding_type)
5311 gfc_warning (OPT_Wc_binding_type,
5312 "Implicitly declared BIND(C) function %qs at "
5313 "%L may not be C interoperable", tmp_sym->name,
5314 &tmp_sym->declared_at);
5315 tmp_sym->ts.f90_type = tmp_sym->ts.type;
5316 /* Mark it as C interoperable to prevent duplicate warnings. */
5317 tmp_sym->ts.is_c_interop = 1;
5318 tmp_sym->attr.is_c_interop = 1;
5322 /* Here, we know we have the bind(c) attribute, so if we have
5323 enough type info, then verify that it's a C interop kind.
5324 The info could be in the symbol already, or possibly still in
5325 the given ts (current_ts), so look in both. */
5326 if (tmp_sym->ts.type != BT_UNKNOWN || ts->type != BT_UNKNOWN)
5328 if (!gfc_verify_c_interop (&(tmp_sym->ts)))
5330 /* See if we're dealing with a sym in a common block or not. */
5331 if (is_in_common == 1 && warn_c_binding_type)
5333 gfc_warning (OPT_Wc_binding_type,
5334 "Variable %qs in common block %qs at %L "
5335 "may not be a C interoperable "
5336 "kind though common block %qs is BIND(C)",
5337 tmp_sym->name, com_block->name,
5338 &(tmp_sym->declared_at), com_block->name);
5340 else
5342 if (tmp_sym->ts.type == BT_DERIVED || ts->type == BT_DERIVED)
5343 gfc_error ("Type declaration %qs at %L is not C "
5344 "interoperable but it is BIND(C)",
5345 tmp_sym->name, &(tmp_sym->declared_at));
5346 else if (warn_c_binding_type)
5347 gfc_warning (OPT_Wc_binding_type, "Variable %qs at %L "
5348 "may not be a C interoperable "
5349 "kind but it is BIND(C)",
5350 tmp_sym->name, &(tmp_sym->declared_at));
5354 /* Variables declared w/in a common block can't be bind(c)
5355 since there's no way for C to see these variables, so there's
5356 semantically no reason for the attribute. */
5357 if (is_in_common == 1 && tmp_sym->attr.is_bind_c == 1)
5359 gfc_error ("Variable %qs in common block %qs at "
5360 "%L cannot be declared with BIND(C) "
5361 "since it is not a global",
5362 tmp_sym->name, com_block->name,
5363 &(tmp_sym->declared_at));
5364 retval = false;
5367 /* Scalar variables that are bind(c) can not have the pointer
5368 or allocatable attributes. */
5369 if (tmp_sym->attr.is_bind_c == 1)
5371 if (tmp_sym->attr.pointer == 1)
5373 gfc_error ("Variable %qs at %L cannot have both the "
5374 "POINTER and BIND(C) attributes",
5375 tmp_sym->name, &(tmp_sym->declared_at));
5376 retval = false;
5379 if (tmp_sym->attr.allocatable == 1)
5381 gfc_error ("Variable %qs at %L cannot have both the "
5382 "ALLOCATABLE and BIND(C) attributes",
5383 tmp_sym->name, &(tmp_sym->declared_at));
5384 retval = false;
5389 /* If it is a BIND(C) function, make sure the return value is a
5390 scalar value. The previous tests in this function made sure
5391 the type is interoperable. */
5392 if (bind_c_function && tmp_sym->as != NULL)
5393 gfc_error ("Return type of BIND(C) function %qs at %L cannot "
5394 "be an array", tmp_sym->name, &(tmp_sym->declared_at));
5396 /* BIND(C) functions can not return a character string. */
5397 if (bind_c_function && tmp_sym->ts.type == BT_CHARACTER)
5398 if (tmp_sym->ts.u.cl == NULL || tmp_sym->ts.u.cl->length == NULL
5399 || tmp_sym->ts.u.cl->length->expr_type != EXPR_CONSTANT
5400 || mpz_cmp_si (tmp_sym->ts.u.cl->length->value.integer, 1) != 0)
5401 gfc_error ("Return type of BIND(C) function %qs at %L cannot "
5402 "be a character string", tmp_sym->name,
5403 &(tmp_sym->declared_at));
5406 /* See if the symbol has been marked as private. If it has, make sure
5407 there is no binding label and warn the user if there is one. */
5408 if (tmp_sym->attr.access == ACCESS_PRIVATE
5409 && tmp_sym->binding_label)
5410 /* Use gfc_warning_now because we won't say that the symbol fails
5411 just because of this. */
5412 gfc_warning_now (0, "Symbol %qs at %L is marked PRIVATE but has been "
5413 "given the binding label %qs", tmp_sym->name,
5414 &(tmp_sym->declared_at), tmp_sym->binding_label);
5416 return retval;
5420 /* Set the appropriate fields for a symbol that's been declared as
5421 BIND(C) (the is_bind_c flag and the binding label), and verify that
5422 the type is C interoperable. Errors are reported by the functions
5423 used to set/test these fields. */
5425 bool
5426 set_verify_bind_c_sym (gfc_symbol *tmp_sym, int num_idents)
5428 bool retval = true;
5430 /* TODO: Do we need to make sure the vars aren't marked private? */
5432 /* Set the is_bind_c bit in symbol_attribute. */
5433 gfc_add_is_bind_c (&(tmp_sym->attr), tmp_sym->name, &gfc_current_locus, 0);
5435 if (!set_binding_label (&tmp_sym->binding_label, tmp_sym->name, num_idents))
5436 return false;
5438 return retval;
5442 /* Set the fields marking the given common block as BIND(C), including
5443 a binding label, and report any errors encountered. */
5445 bool
5446 set_verify_bind_c_com_block (gfc_common_head *com_block, int num_idents)
5448 bool retval = true;
5450 /* destLabel, common name, typespec (which may have binding label). */
5451 if (!set_binding_label (&com_block->binding_label, com_block->name,
5452 num_idents))
5453 return false;
5455 /* Set the given common block (com_block) to being bind(c) (1). */
5456 set_com_block_bind_c (com_block, 1);
5458 return retval;
5462 /* Retrieve the list of one or more identifiers that the given bind(c)
5463 attribute applies to. */
5465 bool
5466 get_bind_c_idents (void)
5468 char name[GFC_MAX_SYMBOL_LEN + 1];
5469 int num_idents = 0;
5470 gfc_symbol *tmp_sym = NULL;
5471 match found_id;
5472 gfc_common_head *com_block = NULL;
5474 if (gfc_match_name (name) == MATCH_YES)
5476 found_id = MATCH_YES;
5477 gfc_get_ha_symbol (name, &tmp_sym);
5479 else if (match_common_name (name) == MATCH_YES)
5481 found_id = MATCH_YES;
5482 com_block = gfc_get_common (name, 0);
5484 else
5486 gfc_error ("Need either entity or common block name for "
5487 "attribute specification statement at %C");
5488 return false;
5491 /* Save the current identifier and look for more. */
5494 /* Increment the number of identifiers found for this spec stmt. */
5495 num_idents++;
5497 /* Make sure we have a sym or com block, and verify that it can
5498 be bind(c). Set the appropriate field(s) and look for more
5499 identifiers. */
5500 if (tmp_sym != NULL || com_block != NULL)
5502 if (tmp_sym != NULL)
5504 if (!set_verify_bind_c_sym (tmp_sym, num_idents))
5505 return false;
5507 else
5509 if (!set_verify_bind_c_com_block (com_block, num_idents))
5510 return false;
5513 /* Look to see if we have another identifier. */
5514 tmp_sym = NULL;
5515 if (gfc_match_eos () == MATCH_YES)
5516 found_id = MATCH_NO;
5517 else if (gfc_match_char (',') != MATCH_YES)
5518 found_id = MATCH_NO;
5519 else if (gfc_match_name (name) == MATCH_YES)
5521 found_id = MATCH_YES;
5522 gfc_get_ha_symbol (name, &tmp_sym);
5524 else if (match_common_name (name) == MATCH_YES)
5526 found_id = MATCH_YES;
5527 com_block = gfc_get_common (name, 0);
5529 else
5531 gfc_error ("Missing entity or common block name for "
5532 "attribute specification statement at %C");
5533 return false;
5536 else
5538 gfc_internal_error ("Missing symbol");
5540 } while (found_id == MATCH_YES);
5542 /* if we get here we were successful */
5543 return true;
5547 /* Try and match a BIND(C) attribute specification statement. */
5549 match
5550 gfc_match_bind_c_stmt (void)
5552 match found_match = MATCH_NO;
5553 gfc_typespec *ts;
5555 ts = &current_ts;
5557 /* This may not be necessary. */
5558 gfc_clear_ts (ts);
5559 /* Clear the temporary binding label holder. */
5560 curr_binding_label = NULL;
5562 /* Look for the bind(c). */
5563 found_match = gfc_match_bind_c (NULL, true);
5565 if (found_match == MATCH_YES)
5567 if (!gfc_notify_std (GFC_STD_F2003, "BIND(C) statement at %C"))
5568 return MATCH_ERROR;
5570 /* Look for the :: now, but it is not required. */
5571 gfc_match (" :: ");
5573 /* Get the identifier(s) that needs to be updated. This may need to
5574 change to hand the flag(s) for the attr specified so all identifiers
5575 found can have all appropriate parts updated (assuming that the same
5576 spec stmt can have multiple attrs, such as both bind(c) and
5577 allocatable...). */
5578 if (!get_bind_c_idents ())
5579 /* Error message should have printed already. */
5580 return MATCH_ERROR;
5583 return found_match;
5587 /* Match a data declaration statement. */
5589 match
5590 gfc_match_data_decl (void)
5592 gfc_symbol *sym;
5593 match m;
5594 int elem;
5596 type_param_spec_list = NULL;
5597 decl_type_param_list = NULL;
5599 num_idents_on_line = 0;
5601 m = gfc_match_decl_type_spec (&current_ts, 0);
5602 if (m != MATCH_YES)
5603 return m;
5605 if ((current_ts.type == BT_DERIVED || current_ts.type == BT_CLASS)
5606 && !gfc_comp_struct (gfc_current_state ()))
5608 sym = gfc_use_derived (current_ts.u.derived);
5610 if (sym == NULL)
5612 m = MATCH_ERROR;
5613 goto cleanup;
5616 current_ts.u.derived = sym;
5619 m = match_attr_spec ();
5620 if (m == MATCH_ERROR)
5622 m = MATCH_NO;
5623 goto cleanup;
5626 if (current_ts.type == BT_CLASS
5627 && current_ts.u.derived->attr.unlimited_polymorphic)
5628 goto ok;
5630 if ((current_ts.type == BT_DERIVED || current_ts.type == BT_CLASS)
5631 && current_ts.u.derived->components == NULL
5632 && !current_ts.u.derived->attr.zero_comp)
5635 if (current_attr.pointer && gfc_comp_struct (gfc_current_state ()))
5636 goto ok;
5638 if (current_attr.allocatable && gfc_current_state () == COMP_DERIVED
5639 && current_ts.u.derived == gfc_current_block ())
5640 goto ok;
5642 gfc_find_symbol (current_ts.u.derived->name,
5643 current_ts.u.derived->ns, 1, &sym);
5645 /* Any symbol that we find had better be a type definition
5646 which has its components defined, or be a structure definition
5647 actively being parsed. */
5648 if (sym != NULL && gfc_fl_struct (sym->attr.flavor)
5649 && (current_ts.u.derived->components != NULL
5650 || current_ts.u.derived->attr.zero_comp
5651 || current_ts.u.derived == gfc_new_block))
5652 goto ok;
5654 gfc_error ("Derived type at %C has not been previously defined "
5655 "and so cannot appear in a derived type definition");
5656 m = MATCH_ERROR;
5657 goto cleanup;
5661 /* If we have an old-style character declaration, and no new-style
5662 attribute specifications, then there a comma is optional between
5663 the type specification and the variable list. */
5664 if (m == MATCH_NO && current_ts.type == BT_CHARACTER && old_char_selector)
5665 gfc_match_char (',');
5667 /* Give the types/attributes to symbols that follow. Give the element
5668 a number so that repeat character length expressions can be copied. */
5669 elem = 1;
5670 for (;;)
5672 num_idents_on_line++;
5673 m = variable_decl (elem++);
5674 if (m == MATCH_ERROR)
5675 goto cleanup;
5676 if (m == MATCH_NO)
5677 break;
5679 if (gfc_match_eos () == MATCH_YES)
5680 goto cleanup;
5681 if (gfc_match_char (',') != MATCH_YES)
5682 break;
5685 if (!gfc_error_flag_test ())
5687 /* An anonymous structure declaration is unambiguous; if we matched one
5688 according to gfc_match_structure_decl, we need to return MATCH_YES
5689 here to avoid confusing the remaining matchers, even if there was an
5690 error during variable_decl. We must flush any such errors. Note this
5691 causes the parser to gracefully continue parsing the remaining input
5692 as a structure body, which likely follows. */
5693 if (current_ts.type == BT_DERIVED && current_ts.u.derived
5694 && gfc_fl_struct (current_ts.u.derived->attr.flavor))
5696 gfc_error_now ("Syntax error in anonymous structure declaration"
5697 " at %C");
5698 /* Skip the bad variable_decl and line up for the start of the
5699 structure body. */
5700 gfc_error_recovery ();
5701 m = MATCH_YES;
5702 goto cleanup;
5705 gfc_error ("Syntax error in data declaration at %C");
5708 m = MATCH_ERROR;
5710 gfc_free_data_all (gfc_current_ns);
5712 cleanup:
5713 if (saved_kind_expr)
5714 gfc_free_expr (saved_kind_expr);
5715 if (type_param_spec_list)
5716 gfc_free_actual_arglist (type_param_spec_list);
5717 if (decl_type_param_list)
5718 gfc_free_actual_arglist (decl_type_param_list);
5719 saved_kind_expr = NULL;
5720 gfc_free_array_spec (current_as);
5721 current_as = NULL;
5722 return m;
5726 /* Match a prefix associated with a function or subroutine
5727 declaration. If the typespec pointer is nonnull, then a typespec
5728 can be matched. Note that if nothing matches, MATCH_YES is
5729 returned (the null string was matched). */
5731 match
5732 gfc_match_prefix (gfc_typespec *ts)
5734 bool seen_type;
5735 bool seen_impure;
5736 bool found_prefix;
5738 gfc_clear_attr (&current_attr);
5739 seen_type = false;
5740 seen_impure = false;
5742 gcc_assert (!gfc_matching_prefix);
5743 gfc_matching_prefix = true;
5747 found_prefix = false;
5749 /* MODULE is a prefix like PURE, ELEMENTAL, etc., having a
5750 corresponding attribute seems natural and distinguishes these
5751 procedures from procedure types of PROC_MODULE, which these are
5752 as well. */
5753 if (gfc_match ("module% ") == MATCH_YES)
5755 if (!gfc_notify_std (GFC_STD_F2008, "MODULE prefix at %C"))
5756 goto error;
5758 current_attr.module_procedure = 1;
5759 found_prefix = true;
5762 if (!seen_type && ts != NULL
5763 && gfc_match_decl_type_spec (ts, 0) == MATCH_YES
5764 && gfc_match_space () == MATCH_YES)
5767 seen_type = true;
5768 found_prefix = true;
5771 if (gfc_match ("elemental% ") == MATCH_YES)
5773 if (!gfc_add_elemental (&current_attr, NULL))
5774 goto error;
5776 found_prefix = true;
5779 if (gfc_match ("pure% ") == MATCH_YES)
5781 if (!gfc_add_pure (&current_attr, NULL))
5782 goto error;
5784 found_prefix = true;
5787 if (gfc_match ("recursive% ") == MATCH_YES)
5789 if (!gfc_add_recursive (&current_attr, NULL))
5790 goto error;
5792 found_prefix = true;
5795 /* IMPURE is a somewhat special case, as it needs not set an actual
5796 attribute but rather only prevents ELEMENTAL routines from being
5797 automatically PURE. */
5798 if (gfc_match ("impure% ") == MATCH_YES)
5800 if (!gfc_notify_std (GFC_STD_F2008, "IMPURE procedure at %C"))
5801 goto error;
5803 seen_impure = true;
5804 found_prefix = true;
5807 while (found_prefix);
5809 /* IMPURE and PURE must not both appear, of course. */
5810 if (seen_impure && current_attr.pure)
5812 gfc_error ("PURE and IMPURE must not appear both at %C");
5813 goto error;
5816 /* If IMPURE it not seen but the procedure is ELEMENTAL, mark it as PURE. */
5817 if (!seen_impure && current_attr.elemental && !current_attr.pure)
5819 if (!gfc_add_pure (&current_attr, NULL))
5820 goto error;
5823 /* At this point, the next item is not a prefix. */
5824 gcc_assert (gfc_matching_prefix);
5826 gfc_matching_prefix = false;
5827 return MATCH_YES;
5829 error:
5830 gcc_assert (gfc_matching_prefix);
5831 gfc_matching_prefix = false;
5832 return MATCH_ERROR;
5836 /* Copy attributes matched by gfc_match_prefix() to attributes on a symbol. */
5838 static bool
5839 copy_prefix (symbol_attribute *dest, locus *where)
5841 if (dest->module_procedure)
5843 if (current_attr.elemental)
5844 dest->elemental = 1;
5846 if (current_attr.pure)
5847 dest->pure = 1;
5849 if (current_attr.recursive)
5850 dest->recursive = 1;
5852 /* Module procedures are unusual in that the 'dest' is copied from
5853 the interface declaration. However, this is an oportunity to
5854 check that the submodule declaration is compliant with the
5855 interface. */
5856 if (dest->elemental && !current_attr.elemental)
5858 gfc_error ("ELEMENTAL prefix in MODULE PROCEDURE interface is "
5859 "missing at %L", where);
5860 return false;
5863 if (dest->pure && !current_attr.pure)
5865 gfc_error ("PURE prefix in MODULE PROCEDURE interface is "
5866 "missing at %L", where);
5867 return false;
5870 if (dest->recursive && !current_attr.recursive)
5872 gfc_error ("RECURSIVE prefix in MODULE PROCEDURE interface is "
5873 "missing at %L", where);
5874 return false;
5877 return true;
5880 if (current_attr.elemental && !gfc_add_elemental (dest, where))
5881 return false;
5883 if (current_attr.pure && !gfc_add_pure (dest, where))
5884 return false;
5886 if (current_attr.recursive && !gfc_add_recursive (dest, where))
5887 return false;
5889 return true;
5893 /* Match a formal argument list or, if typeparam is true, a
5894 type_param_name_list. */
5896 match
5897 gfc_match_formal_arglist (gfc_symbol *progname, int st_flag,
5898 int null_flag, bool typeparam)
5900 gfc_formal_arglist *head, *tail, *p, *q;
5901 char name[GFC_MAX_SYMBOL_LEN + 1];
5902 gfc_symbol *sym;
5903 match m;
5904 gfc_formal_arglist *formal = NULL;
5906 head = tail = NULL;
5908 /* Keep the interface formal argument list and null it so that the
5909 matching for the new declaration can be done. The numbers and
5910 names of the arguments are checked here. The interface formal
5911 arguments are retained in formal_arglist and the characteristics
5912 are compared in resolve.c(resolve_fl_procedure). See the remark
5913 in get_proc_name about the eventual need to copy the formal_arglist
5914 and populate the formal namespace of the interface symbol. */
5915 if (progname->attr.module_procedure
5916 && progname->attr.host_assoc)
5918 formal = progname->formal;
5919 progname->formal = NULL;
5922 if (gfc_match_char ('(') != MATCH_YES)
5924 if (null_flag)
5925 goto ok;
5926 return MATCH_NO;
5929 if (gfc_match_char (')') == MATCH_YES)
5930 goto ok;
5932 for (;;)
5934 if (gfc_match_char ('*') == MATCH_YES)
5936 sym = NULL;
5937 if (!gfc_notify_std (GFC_STD_F95_OBS, "Alternate-return argument "
5938 "at %C"))
5940 m = MATCH_ERROR;
5941 goto cleanup;
5944 else
5946 m = gfc_match_name (name);
5947 if (m != MATCH_YES)
5948 goto cleanup;
5950 if (!typeparam && gfc_get_symbol (name, NULL, &sym))
5951 goto cleanup;
5952 else if (typeparam
5953 && gfc_get_symbol (name, progname->f2k_derived, &sym))
5954 goto cleanup;
5957 p = gfc_get_formal_arglist ();
5959 if (head == NULL)
5960 head = tail = p;
5961 else
5963 tail->next = p;
5964 tail = p;
5967 tail->sym = sym;
5969 /* We don't add the VARIABLE flavor because the name could be a
5970 dummy procedure. We don't apply these attributes to formal
5971 arguments of statement functions. */
5972 if (sym != NULL && !st_flag
5973 && (!gfc_add_dummy(&sym->attr, sym->name, NULL)
5974 || !gfc_missing_attr (&sym->attr, NULL)))
5976 m = MATCH_ERROR;
5977 goto cleanup;
5980 /* The name of a program unit can be in a different namespace,
5981 so check for it explicitly. After the statement is accepted,
5982 the name is checked for especially in gfc_get_symbol(). */
5983 if (gfc_new_block != NULL && sym != NULL
5984 && strcmp (sym->name, gfc_new_block->name) == 0)
5986 gfc_error ("Name %qs at %C is the name of the procedure",
5987 sym->name);
5988 m = MATCH_ERROR;
5989 goto cleanup;
5992 if (gfc_match_char (')') == MATCH_YES)
5993 goto ok;
5995 m = gfc_match_char (',');
5996 if (m != MATCH_YES)
5998 gfc_error ("Unexpected junk in formal argument list at %C");
5999 goto cleanup;
6004 /* Check for duplicate symbols in the formal argument list. */
6005 if (head != NULL)
6007 for (p = head; p->next; p = p->next)
6009 if (p->sym == NULL)
6010 continue;
6012 for (q = p->next; q; q = q->next)
6013 if (p->sym == q->sym)
6015 gfc_error ("Duplicate symbol %qs in formal argument list "
6016 "at %C", p->sym->name);
6018 m = MATCH_ERROR;
6019 goto cleanup;
6024 if (!gfc_add_explicit_interface (progname, IFSRC_DECL, head, NULL))
6026 m = MATCH_ERROR;
6027 goto cleanup;
6030 /* gfc_error_now used in following and return with MATCH_YES because
6031 doing otherwise results in a cascade of extraneous errors and in
6032 some cases an ICE in symbol.c(gfc_release_symbol). */
6033 if (progname->attr.module_procedure && progname->attr.host_assoc)
6035 bool arg_count_mismatch = false;
6037 if (!formal && head)
6038 arg_count_mismatch = true;
6040 /* Abbreviated module procedure declaration is not meant to have any
6041 formal arguments! */
6042 if (!progname->abr_modproc_decl && formal && !head)
6043 arg_count_mismatch = true;
6045 for (p = formal, q = head; p && q; p = p->next, q = q->next)
6047 if ((p->next != NULL && q->next == NULL)
6048 || (p->next == NULL && q->next != NULL))
6049 arg_count_mismatch = true;
6050 else if ((p->sym == NULL && q->sym == NULL)
6051 || strcmp (p->sym->name, q->sym->name) == 0)
6052 continue;
6053 else
6054 gfc_error_now ("Mismatch in MODULE PROCEDURE formal "
6055 "argument names (%s/%s) at %C",
6056 p->sym->name, q->sym->name);
6059 if (arg_count_mismatch)
6060 gfc_error_now ("Mismatch in number of MODULE PROCEDURE "
6061 "formal arguments at %C");
6064 return MATCH_YES;
6066 cleanup:
6067 gfc_free_formal_arglist (head);
6068 return m;
6072 /* Match a RESULT specification following a function declaration or
6073 ENTRY statement. Also matches the end-of-statement. */
6075 static match
6076 match_result (gfc_symbol *function, gfc_symbol **result)
6078 char name[GFC_MAX_SYMBOL_LEN + 1];
6079 gfc_symbol *r;
6080 match m;
6082 if (gfc_match (" result (") != MATCH_YES)
6083 return MATCH_NO;
6085 m = gfc_match_name (name);
6086 if (m != MATCH_YES)
6087 return m;
6089 /* Get the right paren, and that's it because there could be the
6090 bind(c) attribute after the result clause. */
6091 if (gfc_match_char (')') != MATCH_YES)
6093 /* TODO: should report the missing right paren here. */
6094 return MATCH_ERROR;
6097 if (strcmp (function->name, name) == 0)
6099 gfc_error ("RESULT variable at %C must be different than function name");
6100 return MATCH_ERROR;
6103 if (gfc_get_symbol (name, NULL, &r))
6104 return MATCH_ERROR;
6106 if (!gfc_add_result (&r->attr, r->name, NULL))
6107 return MATCH_ERROR;
6109 *result = r;
6111 return MATCH_YES;
6115 /* Match a function suffix, which could be a combination of a result
6116 clause and BIND(C), either one, or neither. The draft does not
6117 require them to come in a specific order. */
6119 match
6120 gfc_match_suffix (gfc_symbol *sym, gfc_symbol **result)
6122 match is_bind_c; /* Found bind(c). */
6123 match is_result; /* Found result clause. */
6124 match found_match; /* Status of whether we've found a good match. */
6125 char peek_char; /* Character we're going to peek at. */
6126 bool allow_binding_name;
6128 /* Initialize to having found nothing. */
6129 found_match = MATCH_NO;
6130 is_bind_c = MATCH_NO;
6131 is_result = MATCH_NO;
6133 /* Get the next char to narrow between result and bind(c). */
6134 gfc_gobble_whitespace ();
6135 peek_char = gfc_peek_ascii_char ();
6137 /* C binding names are not allowed for internal procedures. */
6138 if (gfc_current_state () == COMP_CONTAINS
6139 && sym->ns->proc_name->attr.flavor != FL_MODULE)
6140 allow_binding_name = false;
6141 else
6142 allow_binding_name = true;
6144 switch (peek_char)
6146 case 'r':
6147 /* Look for result clause. */
6148 is_result = match_result (sym, result);
6149 if (is_result == MATCH_YES)
6151 /* Now see if there is a bind(c) after it. */
6152 is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
6153 /* We've found the result clause and possibly bind(c). */
6154 found_match = MATCH_YES;
6156 else
6157 /* This should only be MATCH_ERROR. */
6158 found_match = is_result;
6159 break;
6160 case 'b':
6161 /* Look for bind(c) first. */
6162 is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
6163 if (is_bind_c == MATCH_YES)
6165 /* Now see if a result clause followed it. */
6166 is_result = match_result (sym, result);
6167 found_match = MATCH_YES;
6169 else
6171 /* Should only be a MATCH_ERROR if we get here after seeing 'b'. */
6172 found_match = MATCH_ERROR;
6174 break;
6175 default:
6176 gfc_error ("Unexpected junk after function declaration at %C");
6177 found_match = MATCH_ERROR;
6178 break;
6181 if (is_bind_c == MATCH_YES)
6183 /* Fortran 2008 draft allows BIND(C) for internal procedures. */
6184 if (gfc_current_state () == COMP_CONTAINS
6185 && sym->ns->proc_name->attr.flavor != FL_MODULE
6186 && !gfc_notify_std (GFC_STD_F2008, "BIND(C) attribute "
6187 "at %L may not be specified for an internal "
6188 "procedure", &gfc_current_locus))
6189 return MATCH_ERROR;
6191 if (!gfc_add_is_bind_c (&(sym->attr), sym->name, &gfc_current_locus, 1))
6192 return MATCH_ERROR;
6195 return found_match;
6199 /* Procedure pointer return value without RESULT statement:
6200 Add "hidden" result variable named "ppr@". */
6202 static bool
6203 add_hidden_procptr_result (gfc_symbol *sym)
6205 bool case1,case2;
6207 if (gfc_notification_std (GFC_STD_F2003) == ERROR)
6208 return false;
6210 /* First usage case: PROCEDURE and EXTERNAL statements. */
6211 case1 = gfc_current_state () == COMP_FUNCTION && gfc_current_block ()
6212 && strcmp (gfc_current_block ()->name, sym->name) == 0
6213 && sym->attr.external;
6214 /* Second usage case: INTERFACE statements. */
6215 case2 = gfc_current_state () == COMP_INTERFACE && gfc_state_stack->previous
6216 && gfc_state_stack->previous->state == COMP_FUNCTION
6217 && strcmp (gfc_state_stack->previous->sym->name, sym->name) == 0;
6219 if (case1 || case2)
6221 gfc_symtree *stree;
6222 if (case1)
6223 gfc_get_sym_tree ("ppr@", gfc_current_ns, &stree, false);
6224 else if (case2)
6226 gfc_symtree *st2;
6227 gfc_get_sym_tree ("ppr@", gfc_current_ns->parent, &stree, false);
6228 st2 = gfc_new_symtree (&gfc_current_ns->sym_root, "ppr@");
6229 st2->n.sym = stree->n.sym;
6230 stree->n.sym->refs++;
6232 sym->result = stree->n.sym;
6234 sym->result->attr.proc_pointer = sym->attr.proc_pointer;
6235 sym->result->attr.pointer = sym->attr.pointer;
6236 sym->result->attr.external = sym->attr.external;
6237 sym->result->attr.referenced = sym->attr.referenced;
6238 sym->result->ts = sym->ts;
6239 sym->attr.proc_pointer = 0;
6240 sym->attr.pointer = 0;
6241 sym->attr.external = 0;
6242 if (sym->result->attr.external && sym->result->attr.pointer)
6244 sym->result->attr.pointer = 0;
6245 sym->result->attr.proc_pointer = 1;
6248 return gfc_add_result (&sym->result->attr, sym->result->name, NULL);
6250 /* POINTER after PROCEDURE/EXTERNAL/INTERFACE statement. */
6251 else if (sym->attr.function && !sym->attr.external && sym->attr.pointer
6252 && sym->result && sym->result != sym && sym->result->attr.external
6253 && sym == gfc_current_ns->proc_name
6254 && sym == sym->result->ns->proc_name
6255 && strcmp ("ppr@", sym->result->name) == 0)
6257 sym->result->attr.proc_pointer = 1;
6258 sym->attr.pointer = 0;
6259 return true;
6261 else
6262 return false;
6266 /* Match the interface for a PROCEDURE declaration,
6267 including brackets (R1212). */
6269 static match
6270 match_procedure_interface (gfc_symbol **proc_if)
6272 match m;
6273 gfc_symtree *st;
6274 locus old_loc, entry_loc;
6275 gfc_namespace *old_ns = gfc_current_ns;
6276 char name[GFC_MAX_SYMBOL_LEN + 1];
6278 old_loc = entry_loc = gfc_current_locus;
6279 gfc_clear_ts (&current_ts);
6281 if (gfc_match (" (") != MATCH_YES)
6283 gfc_current_locus = entry_loc;
6284 return MATCH_NO;
6287 /* Get the type spec. for the procedure interface. */
6288 old_loc = gfc_current_locus;
6289 m = gfc_match_decl_type_spec (&current_ts, 0);
6290 gfc_gobble_whitespace ();
6291 if (m == MATCH_YES || (m == MATCH_NO && gfc_peek_ascii_char () == ')'))
6292 goto got_ts;
6294 if (m == MATCH_ERROR)
6295 return m;
6297 /* Procedure interface is itself a procedure. */
6298 gfc_current_locus = old_loc;
6299 m = gfc_match_name (name);
6301 /* First look to see if it is already accessible in the current
6302 namespace because it is use associated or contained. */
6303 st = NULL;
6304 if (gfc_find_sym_tree (name, NULL, 0, &st))
6305 return MATCH_ERROR;
6307 /* If it is still not found, then try the parent namespace, if it
6308 exists and create the symbol there if it is still not found. */
6309 if (gfc_current_ns->parent)
6310 gfc_current_ns = gfc_current_ns->parent;
6311 if (st == NULL && gfc_get_ha_sym_tree (name, &st))
6312 return MATCH_ERROR;
6314 gfc_current_ns = old_ns;
6315 *proc_if = st->n.sym;
6317 if (*proc_if)
6319 (*proc_if)->refs++;
6320 /* Resolve interface if possible. That way, attr.procedure is only set
6321 if it is declared by a later procedure-declaration-stmt, which is
6322 invalid per F08:C1216 (cf. resolve_procedure_interface). */
6323 while ((*proc_if)->ts.interface
6324 && *proc_if != (*proc_if)->ts.interface)
6325 *proc_if = (*proc_if)->ts.interface;
6327 if ((*proc_if)->attr.flavor == FL_UNKNOWN
6328 && (*proc_if)->ts.type == BT_UNKNOWN
6329 && !gfc_add_flavor (&(*proc_if)->attr, FL_PROCEDURE,
6330 (*proc_if)->name, NULL))
6331 return MATCH_ERROR;
6334 got_ts:
6335 if (gfc_match (" )") != MATCH_YES)
6337 gfc_current_locus = entry_loc;
6338 return MATCH_NO;
6341 return MATCH_YES;
6345 /* Match a PROCEDURE declaration (R1211). */
6347 static match
6348 match_procedure_decl (void)
6350 match m;
6351 gfc_symbol *sym, *proc_if = NULL;
6352 int num;
6353 gfc_expr *initializer = NULL;
6355 /* Parse interface (with brackets). */
6356 m = match_procedure_interface (&proc_if);
6357 if (m != MATCH_YES)
6358 return m;
6360 /* Parse attributes (with colons). */
6361 m = match_attr_spec();
6362 if (m == MATCH_ERROR)
6363 return MATCH_ERROR;
6365 if (proc_if && proc_if->attr.is_bind_c && !current_attr.is_bind_c)
6367 current_attr.is_bind_c = 1;
6368 has_name_equals = 0;
6369 curr_binding_label = NULL;
6372 /* Get procedure symbols. */
6373 for(num=1;;num++)
6375 m = gfc_match_symbol (&sym, 0);
6376 if (m == MATCH_NO)
6377 goto syntax;
6378 else if (m == MATCH_ERROR)
6379 return m;
6381 /* Add current_attr to the symbol attributes. */
6382 if (!gfc_copy_attr (&sym->attr, &current_attr, NULL))
6383 return MATCH_ERROR;
6385 if (sym->attr.is_bind_c)
6387 /* Check for C1218. */
6388 if (!proc_if || !proc_if->attr.is_bind_c)
6390 gfc_error ("BIND(C) attribute at %C requires "
6391 "an interface with BIND(C)");
6392 return MATCH_ERROR;
6394 /* Check for C1217. */
6395 if (has_name_equals && sym->attr.pointer)
6397 gfc_error ("BIND(C) procedure with NAME may not have "
6398 "POINTER attribute at %C");
6399 return MATCH_ERROR;
6401 if (has_name_equals && sym->attr.dummy)
6403 gfc_error ("Dummy procedure at %C may not have "
6404 "BIND(C) attribute with NAME");
6405 return MATCH_ERROR;
6407 /* Set binding label for BIND(C). */
6408 if (!set_binding_label (&sym->binding_label, sym->name, num))
6409 return MATCH_ERROR;
6412 if (!gfc_add_external (&sym->attr, NULL))
6413 return MATCH_ERROR;
6415 if (add_hidden_procptr_result (sym))
6416 sym = sym->result;
6418 if (!gfc_add_proc (&sym->attr, sym->name, NULL))
6419 return MATCH_ERROR;
6421 /* Set interface. */
6422 if (proc_if != NULL)
6424 if (sym->ts.type != BT_UNKNOWN)
6426 gfc_error ("Procedure %qs at %L already has basic type of %s",
6427 sym->name, &gfc_current_locus,
6428 gfc_basic_typename (sym->ts.type));
6429 return MATCH_ERROR;
6431 sym->ts.interface = proc_if;
6432 sym->attr.untyped = 1;
6433 sym->attr.if_source = IFSRC_IFBODY;
6435 else if (current_ts.type != BT_UNKNOWN)
6437 if (!gfc_add_type (sym, &current_ts, &gfc_current_locus))
6438 return MATCH_ERROR;
6439 sym->ts.interface = gfc_new_symbol ("", gfc_current_ns);
6440 sym->ts.interface->ts = current_ts;
6441 sym->ts.interface->attr.flavor = FL_PROCEDURE;
6442 sym->ts.interface->attr.function = 1;
6443 sym->attr.function = 1;
6444 sym->attr.if_source = IFSRC_UNKNOWN;
6447 if (gfc_match (" =>") == MATCH_YES)
6449 if (!current_attr.pointer)
6451 gfc_error ("Initialization at %C isn't for a pointer variable");
6452 m = MATCH_ERROR;
6453 goto cleanup;
6456 m = match_pointer_init (&initializer, 1);
6457 if (m != MATCH_YES)
6458 goto cleanup;
6460 if (!add_init_expr_to_sym (sym->name, &initializer, &gfc_current_locus))
6461 goto cleanup;
6465 if (gfc_match_eos () == MATCH_YES)
6466 return MATCH_YES;
6467 if (gfc_match_char (',') != MATCH_YES)
6468 goto syntax;
6471 syntax:
6472 gfc_error ("Syntax error in PROCEDURE statement at %C");
6473 return MATCH_ERROR;
6475 cleanup:
6476 /* Free stuff up and return. */
6477 gfc_free_expr (initializer);
6478 return m;
6482 static match
6483 match_binding_attributes (gfc_typebound_proc* ba, bool generic, bool ppc);
6486 /* Match a procedure pointer component declaration (R445). */
6488 static match
6489 match_ppc_decl (void)
6491 match m;
6492 gfc_symbol *proc_if = NULL;
6493 gfc_typespec ts;
6494 int num;
6495 gfc_component *c;
6496 gfc_expr *initializer = NULL;
6497 gfc_typebound_proc* tb;
6498 char name[GFC_MAX_SYMBOL_LEN + 1];
6500 /* Parse interface (with brackets). */
6501 m = match_procedure_interface (&proc_if);
6502 if (m != MATCH_YES)
6503 goto syntax;
6505 /* Parse attributes. */
6506 tb = XCNEW (gfc_typebound_proc);
6507 tb->where = gfc_current_locus;
6508 m = match_binding_attributes (tb, false, true);
6509 if (m == MATCH_ERROR)
6510 return m;
6512 gfc_clear_attr (&current_attr);
6513 current_attr.procedure = 1;
6514 current_attr.proc_pointer = 1;
6515 current_attr.access = tb->access;
6516 current_attr.flavor = FL_PROCEDURE;
6518 /* Match the colons (required). */
6519 if (gfc_match (" ::") != MATCH_YES)
6521 gfc_error ("Expected %<::%> after binding-attributes at %C");
6522 return MATCH_ERROR;
6525 /* Check for C450. */
6526 if (!tb->nopass && proc_if == NULL)
6528 gfc_error("NOPASS or explicit interface required at %C");
6529 return MATCH_ERROR;
6532 if (!gfc_notify_std (GFC_STD_F2003, "Procedure pointer component at %C"))
6533 return MATCH_ERROR;
6535 /* Match PPC names. */
6536 ts = current_ts;
6537 for(num=1;;num++)
6539 m = gfc_match_name (name);
6540 if (m == MATCH_NO)
6541 goto syntax;
6542 else if (m == MATCH_ERROR)
6543 return m;
6545 if (!gfc_add_component (gfc_current_block(), name, &c))
6546 return MATCH_ERROR;
6548 /* Add current_attr to the symbol attributes. */
6549 if (!gfc_copy_attr (&c->attr, &current_attr, NULL))
6550 return MATCH_ERROR;
6552 if (!gfc_add_external (&c->attr, NULL))
6553 return MATCH_ERROR;
6555 if (!gfc_add_proc (&c->attr, name, NULL))
6556 return MATCH_ERROR;
6558 if (num == 1)
6559 c->tb = tb;
6560 else
6562 c->tb = XCNEW (gfc_typebound_proc);
6563 c->tb->where = gfc_current_locus;
6564 *c->tb = *tb;
6567 /* Set interface. */
6568 if (proc_if != NULL)
6570 c->ts.interface = proc_if;
6571 c->attr.untyped = 1;
6572 c->attr.if_source = IFSRC_IFBODY;
6574 else if (ts.type != BT_UNKNOWN)
6576 c->ts = ts;
6577 c->ts.interface = gfc_new_symbol ("", gfc_current_ns);
6578 c->ts.interface->result = c->ts.interface;
6579 c->ts.interface->ts = ts;
6580 c->ts.interface->attr.flavor = FL_PROCEDURE;
6581 c->ts.interface->attr.function = 1;
6582 c->attr.function = 1;
6583 c->attr.if_source = IFSRC_UNKNOWN;
6586 if (gfc_match (" =>") == MATCH_YES)
6588 m = match_pointer_init (&initializer, 1);
6589 if (m != MATCH_YES)
6591 gfc_free_expr (initializer);
6592 return m;
6594 c->initializer = initializer;
6597 if (gfc_match_eos () == MATCH_YES)
6598 return MATCH_YES;
6599 if (gfc_match_char (',') != MATCH_YES)
6600 goto syntax;
6603 syntax:
6604 gfc_error ("Syntax error in procedure pointer component at %C");
6605 return MATCH_ERROR;
6609 /* Match a PROCEDURE declaration inside an interface (R1206). */
6611 static match
6612 match_procedure_in_interface (void)
6614 match m;
6615 gfc_symbol *sym;
6616 char name[GFC_MAX_SYMBOL_LEN + 1];
6617 locus old_locus;
6619 if (current_interface.type == INTERFACE_NAMELESS
6620 || current_interface.type == INTERFACE_ABSTRACT)
6622 gfc_error ("PROCEDURE at %C must be in a generic interface");
6623 return MATCH_ERROR;
6626 /* Check if the F2008 optional double colon appears. */
6627 gfc_gobble_whitespace ();
6628 old_locus = gfc_current_locus;
6629 if (gfc_match ("::") == MATCH_YES)
6631 if (!gfc_notify_std (GFC_STD_F2008, "double colon in "
6632 "MODULE PROCEDURE statement at %L", &old_locus))
6633 return MATCH_ERROR;
6635 else
6636 gfc_current_locus = old_locus;
6638 for(;;)
6640 m = gfc_match_name (name);
6641 if (m == MATCH_NO)
6642 goto syntax;
6643 else if (m == MATCH_ERROR)
6644 return m;
6645 if (gfc_get_symbol (name, gfc_current_ns->parent, &sym))
6646 return MATCH_ERROR;
6648 if (!gfc_add_interface (sym))
6649 return MATCH_ERROR;
6651 if (gfc_match_eos () == MATCH_YES)
6652 break;
6653 if (gfc_match_char (',') != MATCH_YES)
6654 goto syntax;
6657 return MATCH_YES;
6659 syntax:
6660 gfc_error ("Syntax error in PROCEDURE statement at %C");
6661 return MATCH_ERROR;
6665 /* General matcher for PROCEDURE declarations. */
6667 static match match_procedure_in_type (void);
6669 match
6670 gfc_match_procedure (void)
6672 match m;
6674 switch (gfc_current_state ())
6676 case COMP_NONE:
6677 case COMP_PROGRAM:
6678 case COMP_MODULE:
6679 case COMP_SUBMODULE:
6680 case COMP_SUBROUTINE:
6681 case COMP_FUNCTION:
6682 case COMP_BLOCK:
6683 m = match_procedure_decl ();
6684 break;
6685 case COMP_INTERFACE:
6686 m = match_procedure_in_interface ();
6687 break;
6688 case COMP_DERIVED:
6689 m = match_ppc_decl ();
6690 break;
6691 case COMP_DERIVED_CONTAINS:
6692 m = match_procedure_in_type ();
6693 break;
6694 default:
6695 return MATCH_NO;
6698 if (m != MATCH_YES)
6699 return m;
6701 if (!gfc_notify_std (GFC_STD_F2003, "PROCEDURE statement at %C"))
6702 return MATCH_ERROR;
6704 return m;
6708 /* Warn if a matched procedure has the same name as an intrinsic; this is
6709 simply a wrapper around gfc_warn_intrinsic_shadow that interprets the current
6710 parser-state-stack to find out whether we're in a module. */
6712 static void
6713 do_warn_intrinsic_shadow (const gfc_symbol* sym, bool func)
6715 bool in_module;
6717 in_module = (gfc_state_stack->previous
6718 && (gfc_state_stack->previous->state == COMP_MODULE
6719 || gfc_state_stack->previous->state == COMP_SUBMODULE));
6721 gfc_warn_intrinsic_shadow (sym, in_module, func);
6725 /* Match a function declaration. */
6727 match
6728 gfc_match_function_decl (void)
6730 char name[GFC_MAX_SYMBOL_LEN + 1];
6731 gfc_symbol *sym, *result;
6732 locus old_loc;
6733 match m;
6734 match suffix_match;
6735 match found_match; /* Status returned by match func. */
6737 if (gfc_current_state () != COMP_NONE
6738 && gfc_current_state () != COMP_INTERFACE
6739 && gfc_current_state () != COMP_CONTAINS)
6740 return MATCH_NO;
6742 gfc_clear_ts (&current_ts);
6744 old_loc = gfc_current_locus;
6746 m = gfc_match_prefix (&current_ts);
6747 if (m != MATCH_YES)
6749 gfc_current_locus = old_loc;
6750 return m;
6753 if (gfc_match ("function% %n", name) != MATCH_YES)
6755 gfc_current_locus = old_loc;
6756 return MATCH_NO;
6759 if (get_proc_name (name, &sym, false))
6760 return MATCH_ERROR;
6762 if (add_hidden_procptr_result (sym))
6763 sym = sym->result;
6765 if (current_attr.module_procedure)
6766 sym->attr.module_procedure = 1;
6768 gfc_new_block = sym;
6770 m = gfc_match_formal_arglist (sym, 0, 0);
6771 if (m == MATCH_NO)
6773 gfc_error ("Expected formal argument list in function "
6774 "definition at %C");
6775 m = MATCH_ERROR;
6776 goto cleanup;
6778 else if (m == MATCH_ERROR)
6779 goto cleanup;
6781 result = NULL;
6783 /* According to the draft, the bind(c) and result clause can
6784 come in either order after the formal_arg_list (i.e., either
6785 can be first, both can exist together or by themselves or neither
6786 one). Therefore, the match_result can't match the end of the
6787 string, and check for the bind(c) or result clause in either order. */
6788 found_match = gfc_match_eos ();
6790 /* Make sure that it isn't already declared as BIND(C). If it is, it
6791 must have been marked BIND(C) with a BIND(C) attribute and that is
6792 not allowed for procedures. */
6793 if (sym->attr.is_bind_c == 1)
6795 sym->attr.is_bind_c = 0;
6796 if (sym->old_symbol != NULL)
6797 gfc_error_now ("BIND(C) attribute at %L can only be used for "
6798 "variables or common blocks",
6799 &(sym->old_symbol->declared_at));
6800 else
6801 gfc_error_now ("BIND(C) attribute at %L can only be used for "
6802 "variables or common blocks", &gfc_current_locus);
6805 if (found_match != MATCH_YES)
6807 /* If we haven't found the end-of-statement, look for a suffix. */
6808 suffix_match = gfc_match_suffix (sym, &result);
6809 if (suffix_match == MATCH_YES)
6810 /* Need to get the eos now. */
6811 found_match = gfc_match_eos ();
6812 else
6813 found_match = suffix_match;
6816 if(found_match != MATCH_YES)
6817 m = MATCH_ERROR;
6818 else
6820 /* Make changes to the symbol. */
6821 m = MATCH_ERROR;
6823 if (!gfc_add_function (&sym->attr, sym->name, NULL))
6824 goto cleanup;
6826 if (!gfc_missing_attr (&sym->attr, NULL))
6827 goto cleanup;
6829 if (!copy_prefix (&sym->attr, &sym->declared_at))
6831 if(!sym->attr.module_procedure)
6832 goto cleanup;
6833 else
6834 gfc_error_check ();
6837 /* Delay matching the function characteristics until after the
6838 specification block by signalling kind=-1. */
6839 sym->declared_at = old_loc;
6840 if (current_ts.type != BT_UNKNOWN)
6841 current_ts.kind = -1;
6842 else
6843 current_ts.kind = 0;
6845 if (result == NULL)
6847 if (current_ts.type != BT_UNKNOWN
6848 && !gfc_add_type (sym, &current_ts, &gfc_current_locus))
6849 goto cleanup;
6850 sym->result = sym;
6852 else
6854 if (current_ts.type != BT_UNKNOWN
6855 && !gfc_add_type (result, &current_ts, &gfc_current_locus))
6856 goto cleanup;
6857 sym->result = result;
6860 /* Warn if this procedure has the same name as an intrinsic. */
6861 do_warn_intrinsic_shadow (sym, true);
6863 return MATCH_YES;
6866 cleanup:
6867 gfc_current_locus = old_loc;
6868 return m;
6872 /* This is mostly a copy of parse.c(add_global_procedure) but modified to
6873 pass the name of the entry, rather than the gfc_current_block name, and
6874 to return false upon finding an existing global entry. */
6876 static bool
6877 add_global_entry (const char *name, const char *binding_label, bool sub,
6878 locus *where)
6880 gfc_gsymbol *s;
6881 enum gfc_symbol_type type;
6883 type = sub ? GSYM_SUBROUTINE : GSYM_FUNCTION;
6885 /* Only in Fortran 2003: For procedures with a binding label also the Fortran
6886 name is a global identifier. */
6887 if (!binding_label || gfc_notification_std (GFC_STD_F2008))
6889 s = gfc_get_gsymbol (name);
6891 if (s->defined || (s->type != GSYM_UNKNOWN && s->type != type))
6893 gfc_global_used (s, where);
6894 return false;
6896 else
6898 s->type = type;
6899 s->sym_name = name;
6900 s->where = *where;
6901 s->defined = 1;
6902 s->ns = gfc_current_ns;
6906 /* Don't add the symbol multiple times. */
6907 if (binding_label
6908 && (!gfc_notification_std (GFC_STD_F2008)
6909 || strcmp (name, binding_label) != 0))
6911 s = gfc_get_gsymbol (binding_label);
6913 if (s->defined || (s->type != GSYM_UNKNOWN && s->type != type))
6915 gfc_global_used (s, where);
6916 return false;
6918 else
6920 s->type = type;
6921 s->sym_name = name;
6922 s->binding_label = binding_label;
6923 s->where = *where;
6924 s->defined = 1;
6925 s->ns = gfc_current_ns;
6929 return true;
6933 /* Match an ENTRY statement. */
6935 match
6936 gfc_match_entry (void)
6938 gfc_symbol *proc;
6939 gfc_symbol *result;
6940 gfc_symbol *entry;
6941 char name[GFC_MAX_SYMBOL_LEN + 1];
6942 gfc_compile_state state;
6943 match m;
6944 gfc_entry_list *el;
6945 locus old_loc;
6946 bool module_procedure;
6947 char peek_char;
6948 match is_bind_c;
6950 m = gfc_match_name (name);
6951 if (m != MATCH_YES)
6952 return m;
6954 if (!gfc_notify_std (GFC_STD_F2008_OBS, "ENTRY statement at %C"))
6955 return MATCH_ERROR;
6957 state = gfc_current_state ();
6958 if (state != COMP_SUBROUTINE && state != COMP_FUNCTION)
6960 switch (state)
6962 case COMP_PROGRAM:
6963 gfc_error ("ENTRY statement at %C cannot appear within a PROGRAM");
6964 break;
6965 case COMP_MODULE:
6966 gfc_error ("ENTRY statement at %C cannot appear within a MODULE");
6967 break;
6968 case COMP_SUBMODULE:
6969 gfc_error ("ENTRY statement at %C cannot appear within a SUBMODULE");
6970 break;
6971 case COMP_BLOCK_DATA:
6972 gfc_error ("ENTRY statement at %C cannot appear within "
6973 "a BLOCK DATA");
6974 break;
6975 case COMP_INTERFACE:
6976 gfc_error ("ENTRY statement at %C cannot appear within "
6977 "an INTERFACE");
6978 break;
6979 case COMP_STRUCTURE:
6980 gfc_error ("ENTRY statement at %C cannot appear within "
6981 "a STRUCTURE block");
6982 break;
6983 case COMP_DERIVED:
6984 gfc_error ("ENTRY statement at %C cannot appear within "
6985 "a DERIVED TYPE block");
6986 break;
6987 case COMP_IF:
6988 gfc_error ("ENTRY statement at %C cannot appear within "
6989 "an IF-THEN block");
6990 break;
6991 case COMP_DO:
6992 case COMP_DO_CONCURRENT:
6993 gfc_error ("ENTRY statement at %C cannot appear within "
6994 "a DO block");
6995 break;
6996 case COMP_SELECT:
6997 gfc_error ("ENTRY statement at %C cannot appear within "
6998 "a SELECT block");
6999 break;
7000 case COMP_FORALL:
7001 gfc_error ("ENTRY statement at %C cannot appear within "
7002 "a FORALL block");
7003 break;
7004 case COMP_WHERE:
7005 gfc_error ("ENTRY statement at %C cannot appear within "
7006 "a WHERE block");
7007 break;
7008 case COMP_CONTAINS:
7009 gfc_error ("ENTRY statement at %C cannot appear within "
7010 "a contained subprogram");
7011 break;
7012 default:
7013 gfc_error ("Unexpected ENTRY statement at %C");
7015 return MATCH_ERROR;
7018 if ((state == COMP_SUBROUTINE || state == COMP_FUNCTION)
7019 && gfc_state_stack->previous->state == COMP_INTERFACE)
7021 gfc_error ("ENTRY statement at %C cannot appear within an INTERFACE");
7022 return MATCH_ERROR;
7025 module_procedure = gfc_current_ns->parent != NULL
7026 && gfc_current_ns->parent->proc_name
7027 && gfc_current_ns->parent->proc_name->attr.flavor
7028 == FL_MODULE;
7030 if (gfc_current_ns->parent != NULL
7031 && gfc_current_ns->parent->proc_name
7032 && !module_procedure)
7034 gfc_error("ENTRY statement at %C cannot appear in a "
7035 "contained procedure");
7036 return MATCH_ERROR;
7039 /* Module function entries need special care in get_proc_name
7040 because previous references within the function will have
7041 created symbols attached to the current namespace. */
7042 if (get_proc_name (name, &entry,
7043 gfc_current_ns->parent != NULL
7044 && module_procedure))
7045 return MATCH_ERROR;
7047 proc = gfc_current_block ();
7049 /* Make sure that it isn't already declared as BIND(C). If it is, it
7050 must have been marked BIND(C) with a BIND(C) attribute and that is
7051 not allowed for procedures. */
7052 if (entry->attr.is_bind_c == 1)
7054 entry->attr.is_bind_c = 0;
7055 if (entry->old_symbol != NULL)
7056 gfc_error_now ("BIND(C) attribute at %L can only be used for "
7057 "variables or common blocks",
7058 &(entry->old_symbol->declared_at));
7059 else
7060 gfc_error_now ("BIND(C) attribute at %L can only be used for "
7061 "variables or common blocks", &gfc_current_locus);
7064 /* Check what next non-whitespace character is so we can tell if there
7065 is the required parens if we have a BIND(C). */
7066 old_loc = gfc_current_locus;
7067 gfc_gobble_whitespace ();
7068 peek_char = gfc_peek_ascii_char ();
7070 if (state == COMP_SUBROUTINE)
7072 m = gfc_match_formal_arglist (entry, 0, 1);
7073 if (m != MATCH_YES)
7074 return MATCH_ERROR;
7076 /* Call gfc_match_bind_c with allow_binding_name = true as ENTRY can
7077 never be an internal procedure. */
7078 is_bind_c = gfc_match_bind_c (entry, true);
7079 if (is_bind_c == MATCH_ERROR)
7080 return MATCH_ERROR;
7081 if (is_bind_c == MATCH_YES)
7083 if (peek_char != '(')
7085 gfc_error ("Missing required parentheses before BIND(C) at %C");
7086 return MATCH_ERROR;
7088 if (!gfc_add_is_bind_c (&(entry->attr), entry->name,
7089 &(entry->declared_at), 1))
7090 return MATCH_ERROR;
7093 if (!gfc_current_ns->parent
7094 && !add_global_entry (name, entry->binding_label, true,
7095 &old_loc))
7096 return MATCH_ERROR;
7098 /* An entry in a subroutine. */
7099 if (!gfc_add_entry (&entry->attr, entry->name, NULL)
7100 || !gfc_add_subroutine (&entry->attr, entry->name, NULL))
7101 return MATCH_ERROR;
7103 else
7105 /* An entry in a function.
7106 We need to take special care because writing
7107 ENTRY f()
7109 ENTRY f
7110 is allowed, whereas
7111 ENTRY f() RESULT (r)
7112 can't be written as
7113 ENTRY f RESULT (r). */
7114 if (gfc_match_eos () == MATCH_YES)
7116 gfc_current_locus = old_loc;
7117 /* Match the empty argument list, and add the interface to
7118 the symbol. */
7119 m = gfc_match_formal_arglist (entry, 0, 1);
7121 else
7122 m = gfc_match_formal_arglist (entry, 0, 0);
7124 if (m != MATCH_YES)
7125 return MATCH_ERROR;
7127 result = NULL;
7129 if (gfc_match_eos () == MATCH_YES)
7131 if (!gfc_add_entry (&entry->attr, entry->name, NULL)
7132 || !gfc_add_function (&entry->attr, entry->name, NULL))
7133 return MATCH_ERROR;
7135 entry->result = entry;
7137 else
7139 m = gfc_match_suffix (entry, &result);
7140 if (m == MATCH_NO)
7141 gfc_syntax_error (ST_ENTRY);
7142 if (m != MATCH_YES)
7143 return MATCH_ERROR;
7145 if (result)
7147 if (!gfc_add_result (&result->attr, result->name, NULL)
7148 || !gfc_add_entry (&entry->attr, result->name, NULL)
7149 || !gfc_add_function (&entry->attr, result->name, NULL))
7150 return MATCH_ERROR;
7151 entry->result = result;
7153 else
7155 if (!gfc_add_entry (&entry->attr, entry->name, NULL)
7156 || !gfc_add_function (&entry->attr, entry->name, NULL))
7157 return MATCH_ERROR;
7158 entry->result = entry;
7162 if (!gfc_current_ns->parent
7163 && !add_global_entry (name, entry->binding_label, false,
7164 &old_loc))
7165 return MATCH_ERROR;
7168 if (gfc_match_eos () != MATCH_YES)
7170 gfc_syntax_error (ST_ENTRY);
7171 return MATCH_ERROR;
7174 entry->attr.recursive = proc->attr.recursive;
7175 entry->attr.elemental = proc->attr.elemental;
7176 entry->attr.pure = proc->attr.pure;
7178 el = gfc_get_entry_list ();
7179 el->sym = entry;
7180 el->next = gfc_current_ns->entries;
7181 gfc_current_ns->entries = el;
7182 if (el->next)
7183 el->id = el->next->id + 1;
7184 else
7185 el->id = 1;
7187 new_st.op = EXEC_ENTRY;
7188 new_st.ext.entry = el;
7190 return MATCH_YES;
7194 /* Match a subroutine statement, including optional prefixes. */
7196 match
7197 gfc_match_subroutine (void)
7199 char name[GFC_MAX_SYMBOL_LEN + 1];
7200 gfc_symbol *sym;
7201 match m;
7202 match is_bind_c;
7203 char peek_char;
7204 bool allow_binding_name;
7206 if (gfc_current_state () != COMP_NONE
7207 && gfc_current_state () != COMP_INTERFACE
7208 && gfc_current_state () != COMP_CONTAINS)
7209 return MATCH_NO;
7211 m = gfc_match_prefix (NULL);
7212 if (m != MATCH_YES)
7213 return m;
7215 m = gfc_match ("subroutine% %n", name);
7216 if (m != MATCH_YES)
7217 return m;
7219 if (get_proc_name (name, &sym, false))
7220 return MATCH_ERROR;
7222 /* Set declared_at as it might point to, e.g., a PUBLIC statement, if
7223 the symbol existed before. */
7224 sym->declared_at = gfc_current_locus;
7226 if (current_attr.module_procedure)
7227 sym->attr.module_procedure = 1;
7229 if (add_hidden_procptr_result (sym))
7230 sym = sym->result;
7232 gfc_new_block = sym;
7234 /* Check what next non-whitespace character is so we can tell if there
7235 is the required parens if we have a BIND(C). */
7236 gfc_gobble_whitespace ();
7237 peek_char = gfc_peek_ascii_char ();
7239 if (!gfc_add_subroutine (&sym->attr, sym->name, NULL))
7240 return MATCH_ERROR;
7242 if (gfc_match_formal_arglist (sym, 0, 1) != MATCH_YES)
7243 return MATCH_ERROR;
7245 /* Make sure that it isn't already declared as BIND(C). If it is, it
7246 must have been marked BIND(C) with a BIND(C) attribute and that is
7247 not allowed for procedures. */
7248 if (sym->attr.is_bind_c == 1)
7250 sym->attr.is_bind_c = 0;
7251 if (sym->old_symbol != NULL)
7252 gfc_error_now ("BIND(C) attribute at %L can only be used for "
7253 "variables or common blocks",
7254 &(sym->old_symbol->declared_at));
7255 else
7256 gfc_error_now ("BIND(C) attribute at %L can only be used for "
7257 "variables or common blocks", &gfc_current_locus);
7260 /* C binding names are not allowed for internal procedures. */
7261 if (gfc_current_state () == COMP_CONTAINS
7262 && sym->ns->proc_name->attr.flavor != FL_MODULE)
7263 allow_binding_name = false;
7264 else
7265 allow_binding_name = true;
7267 /* Here, we are just checking if it has the bind(c) attribute, and if
7268 so, then we need to make sure it's all correct. If it doesn't,
7269 we still need to continue matching the rest of the subroutine line. */
7270 is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
7271 if (is_bind_c == MATCH_ERROR)
7273 /* There was an attempt at the bind(c), but it was wrong. An
7274 error message should have been printed w/in the gfc_match_bind_c
7275 so here we'll just return the MATCH_ERROR. */
7276 return MATCH_ERROR;
7279 if (is_bind_c == MATCH_YES)
7281 /* The following is allowed in the Fortran 2008 draft. */
7282 if (gfc_current_state () == COMP_CONTAINS
7283 && sym->ns->proc_name->attr.flavor != FL_MODULE
7284 && !gfc_notify_std (GFC_STD_F2008, "BIND(C) attribute "
7285 "at %L may not be specified for an internal "
7286 "procedure", &gfc_current_locus))
7287 return MATCH_ERROR;
7289 if (peek_char != '(')
7291 gfc_error ("Missing required parentheses before BIND(C) at %C");
7292 return MATCH_ERROR;
7294 if (!gfc_add_is_bind_c (&(sym->attr), sym->name,
7295 &(sym->declared_at), 1))
7296 return MATCH_ERROR;
7299 if (gfc_match_eos () != MATCH_YES)
7301 gfc_syntax_error (ST_SUBROUTINE);
7302 return MATCH_ERROR;
7305 if (!copy_prefix (&sym->attr, &sym->declared_at))
7307 if(!sym->attr.module_procedure)
7308 return MATCH_ERROR;
7309 else
7310 gfc_error_check ();
7313 /* Warn if it has the same name as an intrinsic. */
7314 do_warn_intrinsic_shadow (sym, false);
7316 return MATCH_YES;
7320 /* Check that the NAME identifier in a BIND attribute or statement
7321 is conform to C identifier rules. */
7323 match
7324 check_bind_name_identifier (char **name)
7326 char *n = *name, *p;
7328 /* Remove leading spaces. */
7329 while (*n == ' ')
7330 n++;
7332 /* On an empty string, free memory and set name to NULL. */
7333 if (*n == '\0')
7335 free (*name);
7336 *name = NULL;
7337 return MATCH_YES;
7340 /* Remove trailing spaces. */
7341 p = n + strlen(n) - 1;
7342 while (*p == ' ')
7343 *(p--) = '\0';
7345 /* Insert the identifier into the symbol table. */
7346 p = xstrdup (n);
7347 free (*name);
7348 *name = p;
7350 /* Now check that identifier is valid under C rules. */
7351 if (ISDIGIT (*p))
7353 gfc_error ("Invalid C identifier in NAME= specifier at %C");
7354 return MATCH_ERROR;
7357 for (; *p; p++)
7358 if (!(ISALNUM (*p) || *p == '_' || *p == '$'))
7360 gfc_error ("Invalid C identifier in NAME= specifier at %C");
7361 return MATCH_ERROR;
7364 return MATCH_YES;
7368 /* Match a BIND(C) specifier, with the optional 'name=' specifier if
7369 given, and set the binding label in either the given symbol (if not
7370 NULL), or in the current_ts. The symbol may be NULL because we may
7371 encounter the BIND(C) before the declaration itself. Return
7372 MATCH_NO if what we're looking at isn't a BIND(C) specifier,
7373 MATCH_ERROR if it is a BIND(C) clause but an error was encountered,
7374 or MATCH_YES if the specifier was correct and the binding label and
7375 bind(c) fields were set correctly for the given symbol or the
7376 current_ts. If allow_binding_name is false, no binding name may be
7377 given. */
7379 match
7380 gfc_match_bind_c (gfc_symbol *sym, bool allow_binding_name)
7382 char *binding_label = NULL;
7383 gfc_expr *e = NULL;
7385 /* Initialize the flag that specifies whether we encountered a NAME=
7386 specifier or not. */
7387 has_name_equals = 0;
7389 /* This much we have to be able to match, in this order, if
7390 there is a bind(c) label. */
7391 if (gfc_match (" bind ( c ") != MATCH_YES)
7392 return MATCH_NO;
7394 /* Now see if there is a binding label, or if we've reached the
7395 end of the bind(c) attribute without one. */
7396 if (gfc_match_char (',') == MATCH_YES)
7398 if (gfc_match (" name = ") != MATCH_YES)
7400 gfc_error ("Syntax error in NAME= specifier for binding label "
7401 "at %C");
7402 /* should give an error message here */
7403 return MATCH_ERROR;
7406 has_name_equals = 1;
7408 if (gfc_match_init_expr (&e) != MATCH_YES)
7410 gfc_free_expr (e);
7411 return MATCH_ERROR;
7414 if (!gfc_simplify_expr(e, 0))
7416 gfc_error ("NAME= specifier at %C should be a constant expression");
7417 gfc_free_expr (e);
7418 return MATCH_ERROR;
7421 if (e->expr_type != EXPR_CONSTANT || e->ts.type != BT_CHARACTER
7422 || e->ts.kind != gfc_default_character_kind || e->rank != 0)
7424 gfc_error ("NAME= specifier at %C should be a scalar of "
7425 "default character kind");
7426 gfc_free_expr(e);
7427 return MATCH_ERROR;
7430 // Get a C string from the Fortran string constant
7431 binding_label = gfc_widechar_to_char (e->value.character.string,
7432 e->value.character.length);
7433 gfc_free_expr(e);
7435 // Check that it is valid (old gfc_match_name_C)
7436 if (check_bind_name_identifier (&binding_label) != MATCH_YES)
7437 return MATCH_ERROR;
7440 /* Get the required right paren. */
7441 if (gfc_match_char (')') != MATCH_YES)
7443 gfc_error ("Missing closing paren for binding label at %C");
7444 return MATCH_ERROR;
7447 if (has_name_equals && !allow_binding_name)
7449 gfc_error ("No binding name is allowed in BIND(C) at %C");
7450 return MATCH_ERROR;
7453 if (has_name_equals && sym != NULL && sym->attr.dummy)
7455 gfc_error ("For dummy procedure %s, no binding name is "
7456 "allowed in BIND(C) at %C", sym->name);
7457 return MATCH_ERROR;
7461 /* Save the binding label to the symbol. If sym is null, we're
7462 probably matching the typespec attributes of a declaration and
7463 haven't gotten the name yet, and therefore, no symbol yet. */
7464 if (binding_label)
7466 if (sym != NULL)
7467 sym->binding_label = binding_label;
7468 else
7469 curr_binding_label = binding_label;
7471 else if (allow_binding_name)
7473 /* No binding label, but if symbol isn't null, we
7474 can set the label for it here.
7475 If name="" or allow_binding_name is false, no C binding name is
7476 created. */
7477 if (sym != NULL && sym->name != NULL && has_name_equals == 0)
7478 sym->binding_label = IDENTIFIER_POINTER (get_identifier (sym->name));
7481 if (has_name_equals && gfc_current_state () == COMP_INTERFACE
7482 && current_interface.type == INTERFACE_ABSTRACT)
7484 gfc_error ("NAME not allowed on BIND(C) for ABSTRACT INTERFACE at %C");
7485 return MATCH_ERROR;
7488 return MATCH_YES;
7492 /* Return nonzero if we're currently compiling a contained procedure. */
7494 static int
7495 contained_procedure (void)
7497 gfc_state_data *s = gfc_state_stack;
7499 if ((s->state == COMP_SUBROUTINE || s->state == COMP_FUNCTION)
7500 && s->previous != NULL && s->previous->state == COMP_CONTAINS)
7501 return 1;
7503 return 0;
7506 /* Set the kind of each enumerator. The kind is selected such that it is
7507 interoperable with the corresponding C enumeration type, making
7508 sure that -fshort-enums is honored. */
7510 static void
7511 set_enum_kind(void)
7513 enumerator_history *current_history = NULL;
7514 int kind;
7515 int i;
7517 if (max_enum == NULL || enum_history == NULL)
7518 return;
7520 if (!flag_short_enums)
7521 return;
7523 i = 0;
7526 kind = gfc_integer_kinds[i++].kind;
7528 while (kind < gfc_c_int_kind
7529 && gfc_check_integer_range (max_enum->initializer->value.integer,
7530 kind) != ARITH_OK);
7532 current_history = enum_history;
7533 while (current_history != NULL)
7535 current_history->sym->ts.kind = kind;
7536 current_history = current_history->next;
7541 /* Match any of the various end-block statements. Returns the type of
7542 END to the caller. The END INTERFACE, END IF, END DO, END SELECT
7543 and END BLOCK statements cannot be replaced by a single END statement. */
7545 match
7546 gfc_match_end (gfc_statement *st)
7548 char name[GFC_MAX_SYMBOL_LEN + 1];
7549 gfc_compile_state state;
7550 locus old_loc;
7551 const char *block_name;
7552 const char *target;
7553 int eos_ok;
7554 match m;
7555 gfc_namespace *parent_ns, *ns, *prev_ns;
7556 gfc_namespace **nsp;
7557 bool abreviated_modproc_decl = false;
7558 bool got_matching_end = false;
7560 old_loc = gfc_current_locus;
7561 if (gfc_match ("end") != MATCH_YES)
7562 return MATCH_NO;
7564 state = gfc_current_state ();
7565 block_name = gfc_current_block () == NULL
7566 ? NULL : gfc_current_block ()->name;
7568 switch (state)
7570 case COMP_ASSOCIATE:
7571 case COMP_BLOCK:
7572 if (!strncmp (block_name, "block@", strlen("block@")))
7573 block_name = NULL;
7574 break;
7576 case COMP_CONTAINS:
7577 case COMP_DERIVED_CONTAINS:
7578 state = gfc_state_stack->previous->state;
7579 block_name = gfc_state_stack->previous->sym == NULL
7580 ? NULL : gfc_state_stack->previous->sym->name;
7581 abreviated_modproc_decl = gfc_state_stack->previous->sym
7582 && gfc_state_stack->previous->sym->abr_modproc_decl;
7583 break;
7585 default:
7586 break;
7589 if (!abreviated_modproc_decl)
7590 abreviated_modproc_decl = gfc_current_block ()
7591 && gfc_current_block ()->abr_modproc_decl;
7593 switch (state)
7595 case COMP_NONE:
7596 case COMP_PROGRAM:
7597 *st = ST_END_PROGRAM;
7598 target = " program";
7599 eos_ok = 1;
7600 break;
7602 case COMP_SUBROUTINE:
7603 *st = ST_END_SUBROUTINE;
7604 if (!abreviated_modproc_decl)
7605 target = " subroutine";
7606 else
7607 target = " procedure";
7608 eos_ok = !contained_procedure ();
7609 break;
7611 case COMP_FUNCTION:
7612 *st = ST_END_FUNCTION;
7613 if (!abreviated_modproc_decl)
7614 target = " function";
7615 else
7616 target = " procedure";
7617 eos_ok = !contained_procedure ();
7618 break;
7620 case COMP_BLOCK_DATA:
7621 *st = ST_END_BLOCK_DATA;
7622 target = " block data";
7623 eos_ok = 1;
7624 break;
7626 case COMP_MODULE:
7627 *st = ST_END_MODULE;
7628 target = " module";
7629 eos_ok = 1;
7630 break;
7632 case COMP_SUBMODULE:
7633 *st = ST_END_SUBMODULE;
7634 target = " submodule";
7635 eos_ok = 1;
7636 break;
7638 case COMP_INTERFACE:
7639 *st = ST_END_INTERFACE;
7640 target = " interface";
7641 eos_ok = 0;
7642 break;
7644 case COMP_MAP:
7645 *st = ST_END_MAP;
7646 target = " map";
7647 eos_ok = 0;
7648 break;
7650 case COMP_UNION:
7651 *st = ST_END_UNION;
7652 target = " union";
7653 eos_ok = 0;
7654 break;
7656 case COMP_STRUCTURE:
7657 *st = ST_END_STRUCTURE;
7658 target = " structure";
7659 eos_ok = 0;
7660 break;
7662 case COMP_DERIVED:
7663 case COMP_DERIVED_CONTAINS:
7664 *st = ST_END_TYPE;
7665 target = " type";
7666 eos_ok = 0;
7667 break;
7669 case COMP_ASSOCIATE:
7670 *st = ST_END_ASSOCIATE;
7671 target = " associate";
7672 eos_ok = 0;
7673 break;
7675 case COMP_BLOCK:
7676 *st = ST_END_BLOCK;
7677 target = " block";
7678 eos_ok = 0;
7679 break;
7681 case COMP_IF:
7682 *st = ST_ENDIF;
7683 target = " if";
7684 eos_ok = 0;
7685 break;
7687 case COMP_DO:
7688 case COMP_DO_CONCURRENT:
7689 *st = ST_ENDDO;
7690 target = " do";
7691 eos_ok = 0;
7692 break;
7694 case COMP_CRITICAL:
7695 *st = ST_END_CRITICAL;
7696 target = " critical";
7697 eos_ok = 0;
7698 break;
7700 case COMP_SELECT:
7701 case COMP_SELECT_TYPE:
7702 *st = ST_END_SELECT;
7703 target = " select";
7704 eos_ok = 0;
7705 break;
7707 case COMP_FORALL:
7708 *st = ST_END_FORALL;
7709 target = " forall";
7710 eos_ok = 0;
7711 break;
7713 case COMP_WHERE:
7714 *st = ST_END_WHERE;
7715 target = " where";
7716 eos_ok = 0;
7717 break;
7719 case COMP_ENUM:
7720 *st = ST_END_ENUM;
7721 target = " enum";
7722 eos_ok = 0;
7723 last_initializer = NULL;
7724 set_enum_kind ();
7725 gfc_free_enum_history ();
7726 break;
7728 default:
7729 gfc_error ("Unexpected END statement at %C");
7730 goto cleanup;
7733 old_loc = gfc_current_locus;
7734 if (gfc_match_eos () == MATCH_YES)
7736 if (!eos_ok && (*st == ST_END_SUBROUTINE || *st == ST_END_FUNCTION))
7738 if (!gfc_notify_std (GFC_STD_F2008, "END statement "
7739 "instead of %s statement at %L",
7740 abreviated_modproc_decl ? "END PROCEDURE"
7741 : gfc_ascii_statement(*st), &old_loc))
7742 goto cleanup;
7744 else if (!eos_ok)
7746 /* We would have required END [something]. */
7747 gfc_error ("%s statement expected at %L",
7748 gfc_ascii_statement (*st), &old_loc);
7749 goto cleanup;
7752 return MATCH_YES;
7755 /* Verify that we've got the sort of end-block that we're expecting. */
7756 if (gfc_match (target) != MATCH_YES)
7758 gfc_error ("Expecting %s statement at %L", abreviated_modproc_decl
7759 ? "END PROCEDURE" : gfc_ascii_statement(*st), &old_loc);
7760 goto cleanup;
7762 else
7763 got_matching_end = true;
7765 old_loc = gfc_current_locus;
7766 /* If we're at the end, make sure a block name wasn't required. */
7767 if (gfc_match_eos () == MATCH_YES)
7770 if (*st != ST_ENDDO && *st != ST_ENDIF && *st != ST_END_SELECT
7771 && *st != ST_END_FORALL && *st != ST_END_WHERE && *st != ST_END_BLOCK
7772 && *st != ST_END_ASSOCIATE && *st != ST_END_CRITICAL)
7773 return MATCH_YES;
7775 if (!block_name)
7776 return MATCH_YES;
7778 gfc_error ("Expected block name of %qs in %s statement at %L",
7779 block_name, gfc_ascii_statement (*st), &old_loc);
7781 return MATCH_ERROR;
7784 /* END INTERFACE has a special handler for its several possible endings. */
7785 if (*st == ST_END_INTERFACE)
7786 return gfc_match_end_interface ();
7788 /* We haven't hit the end of statement, so what is left must be an
7789 end-name. */
7790 m = gfc_match_space ();
7791 if (m == MATCH_YES)
7792 m = gfc_match_name (name);
7794 if (m == MATCH_NO)
7795 gfc_error ("Expected terminating name at %C");
7796 if (m != MATCH_YES)
7797 goto cleanup;
7799 if (block_name == NULL)
7800 goto syntax;
7802 /* We have to pick out the declared submodule name from the composite
7803 required by F2008:11.2.3 para 2, which ends in the declared name. */
7804 if (state == COMP_SUBMODULE)
7805 block_name = strchr (block_name, '.') + 1;
7807 if (strcmp (name, block_name) != 0 && strcmp (block_name, "ppr@") != 0)
7809 gfc_error ("Expected label %qs for %s statement at %C", block_name,
7810 gfc_ascii_statement (*st));
7811 goto cleanup;
7813 /* Procedure pointer as function result. */
7814 else if (strcmp (block_name, "ppr@") == 0
7815 && strcmp (name, gfc_current_block ()->ns->proc_name->name) != 0)
7817 gfc_error ("Expected label %qs for %s statement at %C",
7818 gfc_current_block ()->ns->proc_name->name,
7819 gfc_ascii_statement (*st));
7820 goto cleanup;
7823 if (gfc_match_eos () == MATCH_YES)
7824 return MATCH_YES;
7826 syntax:
7827 gfc_syntax_error (*st);
7829 cleanup:
7830 gfc_current_locus = old_loc;
7832 /* If we are missing an END BLOCK, we created a half-ready namespace.
7833 Remove it from the parent namespace's sibling list. */
7835 while (state == COMP_BLOCK && !got_matching_end)
7837 parent_ns = gfc_current_ns->parent;
7839 nsp = &(gfc_state_stack->previous->tail->ext.block.ns);
7841 prev_ns = NULL;
7842 ns = *nsp;
7843 while (ns)
7845 if (ns == gfc_current_ns)
7847 if (prev_ns == NULL)
7848 *nsp = NULL;
7849 else
7850 prev_ns->sibling = ns->sibling;
7852 prev_ns = ns;
7853 ns = ns->sibling;
7856 gfc_free_namespace (gfc_current_ns);
7857 gfc_current_ns = parent_ns;
7858 gfc_state_stack = gfc_state_stack->previous;
7859 state = gfc_current_state ();
7862 return MATCH_ERROR;
7867 /***************** Attribute declaration statements ****************/
7869 /* Set the attribute of a single variable. */
7871 static match
7872 attr_decl1 (void)
7874 char name[GFC_MAX_SYMBOL_LEN + 1];
7875 gfc_array_spec *as;
7877 /* Workaround -Wmaybe-uninitialized false positive during
7878 profiledbootstrap by initializing them. */
7879 gfc_symbol *sym = NULL;
7880 locus var_locus;
7881 match m;
7883 as = NULL;
7885 m = gfc_match_name (name);
7886 if (m != MATCH_YES)
7887 goto cleanup;
7889 if (find_special (name, &sym, false))
7890 return MATCH_ERROR;
7892 if (!check_function_name (name))
7894 m = MATCH_ERROR;
7895 goto cleanup;
7898 var_locus = gfc_current_locus;
7900 /* Deal with possible array specification for certain attributes. */
7901 if (current_attr.dimension
7902 || current_attr.codimension
7903 || current_attr.allocatable
7904 || current_attr.pointer
7905 || current_attr.target)
7907 m = gfc_match_array_spec (&as, !current_attr.codimension,
7908 !current_attr.dimension
7909 && !current_attr.pointer
7910 && !current_attr.target);
7911 if (m == MATCH_ERROR)
7912 goto cleanup;
7914 if (current_attr.dimension && m == MATCH_NO)
7916 gfc_error ("Missing array specification at %L in DIMENSION "
7917 "statement", &var_locus);
7918 m = MATCH_ERROR;
7919 goto cleanup;
7922 if (current_attr.dimension && sym->value)
7924 gfc_error ("Dimensions specified for %s at %L after its "
7925 "initialization", sym->name, &var_locus);
7926 m = MATCH_ERROR;
7927 goto cleanup;
7930 if (current_attr.codimension && m == MATCH_NO)
7932 gfc_error ("Missing array specification at %L in CODIMENSION "
7933 "statement", &var_locus);
7934 m = MATCH_ERROR;
7935 goto cleanup;
7938 if ((current_attr.allocatable || current_attr.pointer)
7939 && (m == MATCH_YES) && (as->type != AS_DEFERRED))
7941 gfc_error ("Array specification must be deferred at %L", &var_locus);
7942 m = MATCH_ERROR;
7943 goto cleanup;
7947 /* Update symbol table. DIMENSION attribute is set in
7948 gfc_set_array_spec(). For CLASS variables, this must be applied
7949 to the first component, or '_data' field. */
7950 if (sym->ts.type == BT_CLASS && sym->ts.u.derived->attr.is_class)
7952 if (!gfc_copy_attr (&CLASS_DATA(sym)->attr, &current_attr, &var_locus))
7954 m = MATCH_ERROR;
7955 goto cleanup;
7958 else
7960 if (current_attr.dimension == 0 && current_attr.codimension == 0
7961 && !gfc_copy_attr (&sym->attr, &current_attr, &var_locus))
7963 m = MATCH_ERROR;
7964 goto cleanup;
7968 if (sym->ts.type == BT_CLASS
7969 && !gfc_build_class_symbol (&sym->ts, &sym->attr, &sym->as))
7971 m = MATCH_ERROR;
7972 goto cleanup;
7975 if (!gfc_set_array_spec (sym, as, &var_locus))
7977 m = MATCH_ERROR;
7978 goto cleanup;
7981 if (sym->attr.cray_pointee && sym->as != NULL)
7983 /* Fix the array spec. */
7984 m = gfc_mod_pointee_as (sym->as);
7985 if (m == MATCH_ERROR)
7986 goto cleanup;
7989 if (!gfc_add_attribute (&sym->attr, &var_locus))
7991 m = MATCH_ERROR;
7992 goto cleanup;
7995 if ((current_attr.external || current_attr.intrinsic)
7996 && sym->attr.flavor != FL_PROCEDURE
7997 && !gfc_add_flavor (&sym->attr, FL_PROCEDURE, sym->name, NULL))
7999 m = MATCH_ERROR;
8000 goto cleanup;
8003 add_hidden_procptr_result (sym);
8005 return MATCH_YES;
8007 cleanup:
8008 gfc_free_array_spec (as);
8009 return m;
8013 /* Generic attribute declaration subroutine. Used for attributes that
8014 just have a list of names. */
8016 static match
8017 attr_decl (void)
8019 match m;
8021 /* Gobble the optional double colon, by simply ignoring the result
8022 of gfc_match(). */
8023 gfc_match (" ::");
8025 for (;;)
8027 m = attr_decl1 ();
8028 if (m != MATCH_YES)
8029 break;
8031 if (gfc_match_eos () == MATCH_YES)
8033 m = MATCH_YES;
8034 break;
8037 if (gfc_match_char (',') != MATCH_YES)
8039 gfc_error ("Unexpected character in variable list at %C");
8040 m = MATCH_ERROR;
8041 break;
8045 return m;
8049 /* This routine matches Cray Pointer declarations of the form:
8050 pointer ( <pointer>, <pointee> )
8052 pointer ( <pointer1>, <pointee1> ), ( <pointer2>, <pointee2> ), ...
8053 The pointer, if already declared, should be an integer. Otherwise, we
8054 set it as BT_INTEGER with kind gfc_index_integer_kind. The pointee may
8055 be either a scalar, or an array declaration. No space is allocated for
8056 the pointee. For the statement
8057 pointer (ipt, ar(10))
8058 any subsequent uses of ar will be translated (in C-notation) as
8059 ar(i) => ((<type> *) ipt)(i)
8060 After gimplification, pointee variable will disappear in the code. */
8062 static match
8063 cray_pointer_decl (void)
8065 match m;
8066 gfc_array_spec *as = NULL;
8067 gfc_symbol *cptr; /* Pointer symbol. */
8068 gfc_symbol *cpte; /* Pointee symbol. */
8069 locus var_locus;
8070 bool done = false;
8072 while (!done)
8074 if (gfc_match_char ('(') != MATCH_YES)
8076 gfc_error ("Expected %<(%> at %C");
8077 return MATCH_ERROR;
8080 /* Match pointer. */
8081 var_locus = gfc_current_locus;
8082 gfc_clear_attr (&current_attr);
8083 gfc_add_cray_pointer (&current_attr, &var_locus);
8084 current_ts.type = BT_INTEGER;
8085 current_ts.kind = gfc_index_integer_kind;
8087 m = gfc_match_symbol (&cptr, 0);
8088 if (m != MATCH_YES)
8090 gfc_error ("Expected variable name at %C");
8091 return m;
8094 if (!gfc_add_cray_pointer (&cptr->attr, &var_locus))
8095 return MATCH_ERROR;
8097 gfc_set_sym_referenced (cptr);
8099 if (cptr->ts.type == BT_UNKNOWN) /* Override the type, if necessary. */
8101 cptr->ts.type = BT_INTEGER;
8102 cptr->ts.kind = gfc_index_integer_kind;
8104 else if (cptr->ts.type != BT_INTEGER)
8106 gfc_error ("Cray pointer at %C must be an integer");
8107 return MATCH_ERROR;
8109 else if (cptr->ts.kind < gfc_index_integer_kind)
8110 gfc_warning (0, "Cray pointer at %C has %d bytes of precision;"
8111 " memory addresses require %d bytes",
8112 cptr->ts.kind, gfc_index_integer_kind);
8114 if (gfc_match_char (',') != MATCH_YES)
8116 gfc_error ("Expected \",\" at %C");
8117 return MATCH_ERROR;
8120 /* Match Pointee. */
8121 var_locus = gfc_current_locus;
8122 gfc_clear_attr (&current_attr);
8123 gfc_add_cray_pointee (&current_attr, &var_locus);
8124 current_ts.type = BT_UNKNOWN;
8125 current_ts.kind = 0;
8127 m = gfc_match_symbol (&cpte, 0);
8128 if (m != MATCH_YES)
8130 gfc_error ("Expected variable name at %C");
8131 return m;
8134 /* Check for an optional array spec. */
8135 m = gfc_match_array_spec (&as, true, false);
8136 if (m == MATCH_ERROR)
8138 gfc_free_array_spec (as);
8139 return m;
8141 else if (m == MATCH_NO)
8143 gfc_free_array_spec (as);
8144 as = NULL;
8147 if (!gfc_add_cray_pointee (&cpte->attr, &var_locus))
8148 return MATCH_ERROR;
8150 gfc_set_sym_referenced (cpte);
8152 if (cpte->as == NULL)
8154 if (!gfc_set_array_spec (cpte, as, &var_locus))
8155 gfc_internal_error ("Couldn't set Cray pointee array spec.");
8157 else if (as != NULL)
8159 gfc_error ("Duplicate array spec for Cray pointee at %C");
8160 gfc_free_array_spec (as);
8161 return MATCH_ERROR;
8164 as = NULL;
8166 if (cpte->as != NULL)
8168 /* Fix array spec. */
8169 m = gfc_mod_pointee_as (cpte->as);
8170 if (m == MATCH_ERROR)
8171 return m;
8174 /* Point the Pointee at the Pointer. */
8175 cpte->cp_pointer = cptr;
8177 if (gfc_match_char (')') != MATCH_YES)
8179 gfc_error ("Expected \")\" at %C");
8180 return MATCH_ERROR;
8182 m = gfc_match_char (',');
8183 if (m != MATCH_YES)
8184 done = true; /* Stop searching for more declarations. */
8188 if (m == MATCH_ERROR /* Failed when trying to find ',' above. */
8189 || gfc_match_eos () != MATCH_YES)
8191 gfc_error ("Expected %<,%> or end of statement at %C");
8192 return MATCH_ERROR;
8194 return MATCH_YES;
8198 match
8199 gfc_match_external (void)
8202 gfc_clear_attr (&current_attr);
8203 current_attr.external = 1;
8205 return attr_decl ();
8209 match
8210 gfc_match_intent (void)
8212 sym_intent intent;
8214 /* This is not allowed within a BLOCK construct! */
8215 if (gfc_current_state () == COMP_BLOCK)
8217 gfc_error ("INTENT is not allowed inside of BLOCK at %C");
8218 return MATCH_ERROR;
8221 intent = match_intent_spec ();
8222 if (intent == INTENT_UNKNOWN)
8223 return MATCH_ERROR;
8225 gfc_clear_attr (&current_attr);
8226 current_attr.intent = intent;
8228 return attr_decl ();
8232 match
8233 gfc_match_intrinsic (void)
8236 gfc_clear_attr (&current_attr);
8237 current_attr.intrinsic = 1;
8239 return attr_decl ();
8243 match
8244 gfc_match_optional (void)
8246 /* This is not allowed within a BLOCK construct! */
8247 if (gfc_current_state () == COMP_BLOCK)
8249 gfc_error ("OPTIONAL is not allowed inside of BLOCK at %C");
8250 return MATCH_ERROR;
8253 gfc_clear_attr (&current_attr);
8254 current_attr.optional = 1;
8256 return attr_decl ();
8260 match
8261 gfc_match_pointer (void)
8263 gfc_gobble_whitespace ();
8264 if (gfc_peek_ascii_char () == '(')
8266 if (!flag_cray_pointer)
8268 gfc_error ("Cray pointer declaration at %C requires -fcray-pointer "
8269 "flag");
8270 return MATCH_ERROR;
8272 return cray_pointer_decl ();
8274 else
8276 gfc_clear_attr (&current_attr);
8277 current_attr.pointer = 1;
8279 return attr_decl ();
8284 match
8285 gfc_match_allocatable (void)
8287 gfc_clear_attr (&current_attr);
8288 current_attr.allocatable = 1;
8290 return attr_decl ();
8294 match
8295 gfc_match_codimension (void)
8297 gfc_clear_attr (&current_attr);
8298 current_attr.codimension = 1;
8300 return attr_decl ();
8304 match
8305 gfc_match_contiguous (void)
8307 if (!gfc_notify_std (GFC_STD_F2008, "CONTIGUOUS statement at %C"))
8308 return MATCH_ERROR;
8310 gfc_clear_attr (&current_attr);
8311 current_attr.contiguous = 1;
8313 return attr_decl ();
8317 match
8318 gfc_match_dimension (void)
8320 gfc_clear_attr (&current_attr);
8321 current_attr.dimension = 1;
8323 return attr_decl ();
8327 match
8328 gfc_match_target (void)
8330 gfc_clear_attr (&current_attr);
8331 current_attr.target = 1;
8333 return attr_decl ();
8337 /* Match the list of entities being specified in a PUBLIC or PRIVATE
8338 statement. */
8340 static match
8341 access_attr_decl (gfc_statement st)
8343 char name[GFC_MAX_SYMBOL_LEN + 1];
8344 interface_type type;
8345 gfc_user_op *uop;
8346 gfc_symbol *sym, *dt_sym;
8347 gfc_intrinsic_op op;
8348 match m;
8350 if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
8351 goto done;
8353 for (;;)
8355 m = gfc_match_generic_spec (&type, name, &op);
8356 if (m == MATCH_NO)
8357 goto syntax;
8358 if (m == MATCH_ERROR)
8359 return MATCH_ERROR;
8361 switch (type)
8363 case INTERFACE_NAMELESS:
8364 case INTERFACE_ABSTRACT:
8365 goto syntax;
8367 case INTERFACE_GENERIC:
8368 case INTERFACE_DTIO:
8370 if (gfc_get_symbol (name, NULL, &sym))
8371 goto done;
8373 if (type == INTERFACE_DTIO
8374 && gfc_current_ns->proc_name
8375 && gfc_current_ns->proc_name->attr.flavor == FL_MODULE
8376 && sym->attr.flavor == FL_UNKNOWN)
8377 sym->attr.flavor = FL_PROCEDURE;
8379 if (!gfc_add_access (&sym->attr,
8380 (st == ST_PUBLIC)
8381 ? ACCESS_PUBLIC : ACCESS_PRIVATE,
8382 sym->name, NULL))
8383 return MATCH_ERROR;
8385 if (sym->attr.generic && (dt_sym = gfc_find_dt_in_generic (sym))
8386 && !gfc_add_access (&dt_sym->attr,
8387 (st == ST_PUBLIC)
8388 ? ACCESS_PUBLIC : ACCESS_PRIVATE,
8389 sym->name, NULL))
8390 return MATCH_ERROR;
8392 break;
8394 case INTERFACE_INTRINSIC_OP:
8395 if (gfc_current_ns->operator_access[op] == ACCESS_UNKNOWN)
8397 gfc_intrinsic_op other_op;
8399 gfc_current_ns->operator_access[op] =
8400 (st == ST_PUBLIC) ? ACCESS_PUBLIC : ACCESS_PRIVATE;
8402 /* Handle the case if there is another op with the same
8403 function, for INTRINSIC_EQ vs. INTRINSIC_EQ_OS and so on. */
8404 other_op = gfc_equivalent_op (op);
8406 if (other_op != INTRINSIC_NONE)
8407 gfc_current_ns->operator_access[other_op] =
8408 (st == ST_PUBLIC) ? ACCESS_PUBLIC : ACCESS_PRIVATE;
8411 else
8413 gfc_error ("Access specification of the %s operator at %C has "
8414 "already been specified", gfc_op2string (op));
8415 goto done;
8418 break;
8420 case INTERFACE_USER_OP:
8421 uop = gfc_get_uop (name);
8423 if (uop->access == ACCESS_UNKNOWN)
8425 uop->access = (st == ST_PUBLIC)
8426 ? ACCESS_PUBLIC : ACCESS_PRIVATE;
8428 else
8430 gfc_error ("Access specification of the .%s. operator at %C "
8431 "has already been specified", sym->name);
8432 goto done;
8435 break;
8438 if (gfc_match_char (',') == MATCH_NO)
8439 break;
8442 if (gfc_match_eos () != MATCH_YES)
8443 goto syntax;
8444 return MATCH_YES;
8446 syntax:
8447 gfc_syntax_error (st);
8449 done:
8450 return MATCH_ERROR;
8454 match
8455 gfc_match_protected (void)
8457 gfc_symbol *sym;
8458 match m;
8460 if (!gfc_current_ns->proc_name
8461 || gfc_current_ns->proc_name->attr.flavor != FL_MODULE)
8463 gfc_error ("PROTECTED at %C only allowed in specification "
8464 "part of a module");
8465 return MATCH_ERROR;
8469 if (!gfc_notify_std (GFC_STD_F2003, "PROTECTED statement at %C"))
8470 return MATCH_ERROR;
8472 if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
8474 return MATCH_ERROR;
8477 if (gfc_match_eos () == MATCH_YES)
8478 goto syntax;
8480 for(;;)
8482 m = gfc_match_symbol (&sym, 0);
8483 switch (m)
8485 case MATCH_YES:
8486 if (!gfc_add_protected (&sym->attr, sym->name, &gfc_current_locus))
8487 return MATCH_ERROR;
8488 goto next_item;
8490 case MATCH_NO:
8491 break;
8493 case MATCH_ERROR:
8494 return MATCH_ERROR;
8497 next_item:
8498 if (gfc_match_eos () == MATCH_YES)
8499 break;
8500 if (gfc_match_char (',') != MATCH_YES)
8501 goto syntax;
8504 return MATCH_YES;
8506 syntax:
8507 gfc_error ("Syntax error in PROTECTED statement at %C");
8508 return MATCH_ERROR;
8512 /* The PRIVATE statement is a bit weird in that it can be an attribute
8513 declaration, but also works as a standalone statement inside of a
8514 type declaration or a module. */
8516 match
8517 gfc_match_private (gfc_statement *st)
8520 if (gfc_match ("private") != MATCH_YES)
8521 return MATCH_NO;
8523 if (gfc_current_state () != COMP_MODULE
8524 && !(gfc_current_state () == COMP_DERIVED
8525 && gfc_state_stack->previous
8526 && gfc_state_stack->previous->state == COMP_MODULE)
8527 && !(gfc_current_state () == COMP_DERIVED_CONTAINS
8528 && gfc_state_stack->previous && gfc_state_stack->previous->previous
8529 && gfc_state_stack->previous->previous->state == COMP_MODULE))
8531 gfc_error ("PRIVATE statement at %C is only allowed in the "
8532 "specification part of a module");
8533 return MATCH_ERROR;
8536 if (gfc_current_state () == COMP_DERIVED)
8538 if (gfc_match_eos () == MATCH_YES)
8540 *st = ST_PRIVATE;
8541 return MATCH_YES;
8544 gfc_syntax_error (ST_PRIVATE);
8545 return MATCH_ERROR;
8548 if (gfc_match_eos () == MATCH_YES)
8550 *st = ST_PRIVATE;
8551 return MATCH_YES;
8554 *st = ST_ATTR_DECL;
8555 return access_attr_decl (ST_PRIVATE);
8559 match
8560 gfc_match_public (gfc_statement *st)
8563 if (gfc_match ("public") != MATCH_YES)
8564 return MATCH_NO;
8566 if (gfc_current_state () != COMP_MODULE)
8568 gfc_error ("PUBLIC statement at %C is only allowed in the "
8569 "specification part of a module");
8570 return MATCH_ERROR;
8573 if (gfc_match_eos () == MATCH_YES)
8575 *st = ST_PUBLIC;
8576 return MATCH_YES;
8579 *st = ST_ATTR_DECL;
8580 return access_attr_decl (ST_PUBLIC);
8584 /* Workhorse for gfc_match_parameter. */
8586 static match
8587 do_parm (void)
8589 gfc_symbol *sym;
8590 gfc_expr *init;
8591 match m;
8592 bool t;
8594 m = gfc_match_symbol (&sym, 0);
8595 if (m == MATCH_NO)
8596 gfc_error ("Expected variable name at %C in PARAMETER statement");
8598 if (m != MATCH_YES)
8599 return m;
8601 if (gfc_match_char ('=') == MATCH_NO)
8603 gfc_error ("Expected = sign in PARAMETER statement at %C");
8604 return MATCH_ERROR;
8607 m = gfc_match_init_expr (&init);
8608 if (m == MATCH_NO)
8609 gfc_error ("Expected expression at %C in PARAMETER statement");
8610 if (m != MATCH_YES)
8611 return m;
8613 if (sym->ts.type == BT_UNKNOWN
8614 && !gfc_set_default_type (sym, 1, NULL))
8616 m = MATCH_ERROR;
8617 goto cleanup;
8620 if (!gfc_check_assign_symbol (sym, NULL, init)
8621 || !gfc_add_flavor (&sym->attr, FL_PARAMETER, sym->name, NULL))
8623 m = MATCH_ERROR;
8624 goto cleanup;
8627 if (sym->value)
8629 gfc_error ("Initializing already initialized variable at %C");
8630 m = MATCH_ERROR;
8631 goto cleanup;
8634 t = add_init_expr_to_sym (sym->name, &init, &gfc_current_locus);
8635 return (t) ? MATCH_YES : MATCH_ERROR;
8637 cleanup:
8638 gfc_free_expr (init);
8639 return m;
8643 /* Match a parameter statement, with the weird syntax that these have. */
8645 match
8646 gfc_match_parameter (void)
8648 const char *term = " )%t";
8649 match m;
8651 if (gfc_match_char ('(') == MATCH_NO)
8653 /* With legacy PARAMETER statements, don't expect a terminating ')'. */
8654 if (!gfc_notify_std (GFC_STD_LEGACY, "PARAMETER without '()' at %C"))
8655 return MATCH_NO;
8656 term = " %t";
8659 for (;;)
8661 m = do_parm ();
8662 if (m != MATCH_YES)
8663 break;
8665 if (gfc_match (term) == MATCH_YES)
8666 break;
8668 if (gfc_match_char (',') != MATCH_YES)
8670 gfc_error ("Unexpected characters in PARAMETER statement at %C");
8671 m = MATCH_ERROR;
8672 break;
8676 return m;
8680 match
8681 gfc_match_automatic (void)
8683 gfc_symbol *sym;
8684 match m;
8685 bool seen_symbol = false;
8687 if (!flag_dec_static)
8689 gfc_error ("%s at %C is a DEC extension, enable with "
8690 "%<-fdec-static%>",
8691 "AUTOMATIC"
8693 return MATCH_ERROR;
8696 gfc_match (" ::");
8698 for (;;)
8700 m = gfc_match_symbol (&sym, 0);
8701 switch (m)
8703 case MATCH_NO:
8704 break;
8706 case MATCH_ERROR:
8707 return MATCH_ERROR;
8709 case MATCH_YES:
8710 if (!gfc_add_automatic (&sym->attr, sym->name, &gfc_current_locus))
8711 return MATCH_ERROR;
8712 seen_symbol = true;
8713 break;
8716 if (gfc_match_eos () == MATCH_YES)
8717 break;
8718 if (gfc_match_char (',') != MATCH_YES)
8719 goto syntax;
8722 if (!seen_symbol)
8724 gfc_error ("Expected entity-list in AUTOMATIC statement at %C");
8725 return MATCH_ERROR;
8728 return MATCH_YES;
8730 syntax:
8731 gfc_error ("Syntax error in AUTOMATIC statement at %C");
8732 return MATCH_ERROR;
8736 match
8737 gfc_match_static (void)
8739 gfc_symbol *sym;
8740 match m;
8741 bool seen_symbol = false;
8743 if (!flag_dec_static)
8745 gfc_error ("%s at %C is a DEC extension, enable with "
8746 "%<-fdec-static%>",
8747 "STATIC");
8748 return MATCH_ERROR;
8751 gfc_match (" ::");
8753 for (;;)
8755 m = gfc_match_symbol (&sym, 0);
8756 switch (m)
8758 case MATCH_NO:
8759 break;
8761 case MATCH_ERROR:
8762 return MATCH_ERROR;
8764 case MATCH_YES:
8765 if (!gfc_add_save (&sym->attr, SAVE_EXPLICIT, sym->name,
8766 &gfc_current_locus))
8767 return MATCH_ERROR;
8768 seen_symbol = true;
8769 break;
8772 if (gfc_match_eos () == MATCH_YES)
8773 break;
8774 if (gfc_match_char (',') != MATCH_YES)
8775 goto syntax;
8778 if (!seen_symbol)
8780 gfc_error ("Expected entity-list in STATIC statement at %C");
8781 return MATCH_ERROR;
8784 return MATCH_YES;
8786 syntax:
8787 gfc_error ("Syntax error in STATIC statement at %C");
8788 return MATCH_ERROR;
8792 /* Save statements have a special syntax. */
8794 match
8795 gfc_match_save (void)
8797 char n[GFC_MAX_SYMBOL_LEN+1];
8798 gfc_common_head *c;
8799 gfc_symbol *sym;
8800 match m;
8802 if (gfc_match_eos () == MATCH_YES)
8804 if (gfc_current_ns->seen_save)
8806 if (!gfc_notify_std (GFC_STD_LEGACY, "Blanket SAVE statement at %C "
8807 "follows previous SAVE statement"))
8808 return MATCH_ERROR;
8811 gfc_current_ns->save_all = gfc_current_ns->seen_save = 1;
8812 return MATCH_YES;
8815 if (gfc_current_ns->save_all)
8817 if (!gfc_notify_std (GFC_STD_LEGACY, "SAVE statement at %C follows "
8818 "blanket SAVE statement"))
8819 return MATCH_ERROR;
8822 gfc_match (" ::");
8824 for (;;)
8826 m = gfc_match_symbol (&sym, 0);
8827 switch (m)
8829 case MATCH_YES:
8830 if (!gfc_add_save (&sym->attr, SAVE_EXPLICIT, sym->name,
8831 &gfc_current_locus))
8832 return MATCH_ERROR;
8833 goto next_item;
8835 case MATCH_NO:
8836 break;
8838 case MATCH_ERROR:
8839 return MATCH_ERROR;
8842 m = gfc_match (" / %n /", &n);
8843 if (m == MATCH_ERROR)
8844 return MATCH_ERROR;
8845 if (m == MATCH_NO)
8846 goto syntax;
8848 c = gfc_get_common (n, 0);
8849 c->saved = 1;
8851 gfc_current_ns->seen_save = 1;
8853 next_item:
8854 if (gfc_match_eos () == MATCH_YES)
8855 break;
8856 if (gfc_match_char (',') != MATCH_YES)
8857 goto syntax;
8860 return MATCH_YES;
8862 syntax:
8863 gfc_error ("Syntax error in SAVE statement at %C");
8864 return MATCH_ERROR;
8868 match
8869 gfc_match_value (void)
8871 gfc_symbol *sym;
8872 match m;
8874 /* This is not allowed within a BLOCK construct! */
8875 if (gfc_current_state () == COMP_BLOCK)
8877 gfc_error ("VALUE is not allowed inside of BLOCK at %C");
8878 return MATCH_ERROR;
8881 if (!gfc_notify_std (GFC_STD_F2003, "VALUE statement at %C"))
8882 return MATCH_ERROR;
8884 if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
8886 return MATCH_ERROR;
8889 if (gfc_match_eos () == MATCH_YES)
8890 goto syntax;
8892 for(;;)
8894 m = gfc_match_symbol (&sym, 0);
8895 switch (m)
8897 case MATCH_YES:
8898 if (!gfc_add_value (&sym->attr, sym->name, &gfc_current_locus))
8899 return MATCH_ERROR;
8900 goto next_item;
8902 case MATCH_NO:
8903 break;
8905 case MATCH_ERROR:
8906 return MATCH_ERROR;
8909 next_item:
8910 if (gfc_match_eos () == MATCH_YES)
8911 break;
8912 if (gfc_match_char (',') != MATCH_YES)
8913 goto syntax;
8916 return MATCH_YES;
8918 syntax:
8919 gfc_error ("Syntax error in VALUE statement at %C");
8920 return MATCH_ERROR;
8924 match
8925 gfc_match_volatile (void)
8927 gfc_symbol *sym;
8928 match m;
8930 if (!gfc_notify_std (GFC_STD_F2003, "VOLATILE statement at %C"))
8931 return MATCH_ERROR;
8933 if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
8935 return MATCH_ERROR;
8938 if (gfc_match_eos () == MATCH_YES)
8939 goto syntax;
8941 for(;;)
8943 /* VOLATILE is special because it can be added to host-associated
8944 symbols locally. Except for coarrays. */
8945 m = gfc_match_symbol (&sym, 1);
8946 switch (m)
8948 case MATCH_YES:
8949 /* F2008, C560+C561. VOLATILE for host-/use-associated variable or
8950 for variable in a BLOCK which is defined outside of the BLOCK. */
8951 if (sym->ns != gfc_current_ns && sym->attr.codimension)
8953 gfc_error ("Specifying VOLATILE for coarray variable %qs at "
8954 "%C, which is use-/host-associated", sym->name);
8955 return MATCH_ERROR;
8957 if (!gfc_add_volatile (&sym->attr, sym->name, &gfc_current_locus))
8958 return MATCH_ERROR;
8959 goto next_item;
8961 case MATCH_NO:
8962 break;
8964 case MATCH_ERROR:
8965 return MATCH_ERROR;
8968 next_item:
8969 if (gfc_match_eos () == MATCH_YES)
8970 break;
8971 if (gfc_match_char (',') != MATCH_YES)
8972 goto syntax;
8975 return MATCH_YES;
8977 syntax:
8978 gfc_error ("Syntax error in VOLATILE statement at %C");
8979 return MATCH_ERROR;
8983 match
8984 gfc_match_asynchronous (void)
8986 gfc_symbol *sym;
8987 match m;
8989 if (!gfc_notify_std (GFC_STD_F2003, "ASYNCHRONOUS statement at %C"))
8990 return MATCH_ERROR;
8992 if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
8994 return MATCH_ERROR;
8997 if (gfc_match_eos () == MATCH_YES)
8998 goto syntax;
9000 for(;;)
9002 /* ASYNCHRONOUS is special because it can be added to host-associated
9003 symbols locally. */
9004 m = gfc_match_symbol (&sym, 1);
9005 switch (m)
9007 case MATCH_YES:
9008 if (!gfc_add_asynchronous (&sym->attr, sym->name, &gfc_current_locus))
9009 return MATCH_ERROR;
9010 goto next_item;
9012 case MATCH_NO:
9013 break;
9015 case MATCH_ERROR:
9016 return MATCH_ERROR;
9019 next_item:
9020 if (gfc_match_eos () == MATCH_YES)
9021 break;
9022 if (gfc_match_char (',') != MATCH_YES)
9023 goto syntax;
9026 return MATCH_YES;
9028 syntax:
9029 gfc_error ("Syntax error in ASYNCHRONOUS statement at %C");
9030 return MATCH_ERROR;
9034 /* Match a module procedure statement in a submodule. */
9036 match
9037 gfc_match_submod_proc (void)
9039 char name[GFC_MAX_SYMBOL_LEN + 1];
9040 gfc_symbol *sym, *fsym;
9041 match m;
9042 gfc_formal_arglist *formal, *head, *tail;
9044 if (gfc_current_state () != COMP_CONTAINS
9045 || !(gfc_state_stack->previous
9046 && (gfc_state_stack->previous->state == COMP_SUBMODULE
9047 || gfc_state_stack->previous->state == COMP_MODULE)))
9048 return MATCH_NO;
9050 m = gfc_match (" module% procedure% %n", name);
9051 if (m != MATCH_YES)
9052 return m;
9054 if (!gfc_notify_std (GFC_STD_F2008, "MODULE PROCEDURE declaration "
9055 "at %C"))
9056 return MATCH_ERROR;
9058 if (get_proc_name (name, &sym, false))
9059 return MATCH_ERROR;
9061 /* Make sure that the result field is appropriately filled, even though
9062 the result symbol will be replaced later on. */
9063 if (sym->tlink && sym->tlink->attr.function)
9065 if (sym->tlink->result
9066 && sym->tlink->result != sym->tlink)
9067 sym->result= sym->tlink->result;
9068 else
9069 sym->result = sym;
9072 /* Set declared_at as it might point to, e.g., a PUBLIC statement, if
9073 the symbol existed before. */
9074 sym->declared_at = gfc_current_locus;
9076 if (!sym->attr.module_procedure)
9077 return MATCH_ERROR;
9079 /* Signal match_end to expect "end procedure". */
9080 sym->abr_modproc_decl = 1;
9082 /* Change from IFSRC_IFBODY coming from the interface declaration. */
9083 sym->attr.if_source = IFSRC_DECL;
9085 gfc_new_block = sym;
9087 /* Make a new formal arglist with the symbols in the procedure
9088 namespace. */
9089 head = tail = NULL;
9090 for (formal = sym->formal; formal && formal->sym; formal = formal->next)
9092 if (formal == sym->formal)
9093 head = tail = gfc_get_formal_arglist ();
9094 else
9096 tail->next = gfc_get_formal_arglist ();
9097 tail = tail->next;
9100 if (gfc_copy_dummy_sym (&fsym, formal->sym, 0))
9101 goto cleanup;
9103 tail->sym = fsym;
9104 gfc_set_sym_referenced (fsym);
9107 /* The dummy symbols get cleaned up, when the formal_namespace of the
9108 interface declaration is cleared. This allows us to add the
9109 explicit interface as is done for other type of procedure. */
9110 if (!gfc_add_explicit_interface (sym, IFSRC_DECL, head,
9111 &gfc_current_locus))
9112 return MATCH_ERROR;
9114 if (gfc_match_eos () != MATCH_YES)
9116 gfc_syntax_error (ST_MODULE_PROC);
9117 return MATCH_ERROR;
9120 return MATCH_YES;
9122 cleanup:
9123 gfc_free_formal_arglist (head);
9124 return MATCH_ERROR;
9128 /* Match a module procedure statement. Note that we have to modify
9129 symbols in the parent's namespace because the current one was there
9130 to receive symbols that are in an interface's formal argument list. */
9132 match
9133 gfc_match_modproc (void)
9135 char name[GFC_MAX_SYMBOL_LEN + 1];
9136 gfc_symbol *sym;
9137 match m;
9138 locus old_locus;
9139 gfc_namespace *module_ns;
9140 gfc_interface *old_interface_head, *interface;
9142 if (gfc_state_stack->state != COMP_INTERFACE
9143 || gfc_state_stack->previous == NULL
9144 || current_interface.type == INTERFACE_NAMELESS
9145 || current_interface.type == INTERFACE_ABSTRACT)
9147 gfc_error ("MODULE PROCEDURE at %C must be in a generic module "
9148 "interface");
9149 return MATCH_ERROR;
9152 module_ns = gfc_current_ns->parent;
9153 for (; module_ns; module_ns = module_ns->parent)
9154 if (module_ns->proc_name->attr.flavor == FL_MODULE
9155 || module_ns->proc_name->attr.flavor == FL_PROGRAM
9156 || (module_ns->proc_name->attr.flavor == FL_PROCEDURE
9157 && !module_ns->proc_name->attr.contained))
9158 break;
9160 if (module_ns == NULL)
9161 return MATCH_ERROR;
9163 /* Store the current state of the interface. We will need it if we
9164 end up with a syntax error and need to recover. */
9165 old_interface_head = gfc_current_interface_head ();
9167 /* Check if the F2008 optional double colon appears. */
9168 gfc_gobble_whitespace ();
9169 old_locus = gfc_current_locus;
9170 if (gfc_match ("::") == MATCH_YES)
9172 if (!gfc_notify_std (GFC_STD_F2008, "double colon in "
9173 "MODULE PROCEDURE statement at %L", &old_locus))
9174 return MATCH_ERROR;
9176 else
9177 gfc_current_locus = old_locus;
9179 for (;;)
9181 bool last = false;
9182 old_locus = gfc_current_locus;
9184 m = gfc_match_name (name);
9185 if (m == MATCH_NO)
9186 goto syntax;
9187 if (m != MATCH_YES)
9188 return MATCH_ERROR;
9190 /* Check for syntax error before starting to add symbols to the
9191 current namespace. */
9192 if (gfc_match_eos () == MATCH_YES)
9193 last = true;
9195 if (!last && gfc_match_char (',') != MATCH_YES)
9196 goto syntax;
9198 /* Now we're sure the syntax is valid, we process this item
9199 further. */
9200 if (gfc_get_symbol (name, module_ns, &sym))
9201 return MATCH_ERROR;
9203 if (sym->attr.intrinsic)
9205 gfc_error ("Intrinsic procedure at %L cannot be a MODULE "
9206 "PROCEDURE", &old_locus);
9207 return MATCH_ERROR;
9210 if (sym->attr.proc != PROC_MODULE
9211 && !gfc_add_procedure (&sym->attr, PROC_MODULE, sym->name, NULL))
9212 return MATCH_ERROR;
9214 if (!gfc_add_interface (sym))
9215 return MATCH_ERROR;
9217 sym->attr.mod_proc = 1;
9218 sym->declared_at = old_locus;
9220 if (last)
9221 break;
9224 return MATCH_YES;
9226 syntax:
9227 /* Restore the previous state of the interface. */
9228 interface = gfc_current_interface_head ();
9229 gfc_set_current_interface_head (old_interface_head);
9231 /* Free the new interfaces. */
9232 while (interface != old_interface_head)
9234 gfc_interface *i = interface->next;
9235 free (interface);
9236 interface = i;
9239 /* And issue a syntax error. */
9240 gfc_syntax_error (ST_MODULE_PROC);
9241 return MATCH_ERROR;
9245 /* Check a derived type that is being extended. */
9247 static gfc_symbol*
9248 check_extended_derived_type (char *name)
9250 gfc_symbol *extended;
9252 if (gfc_find_symbol (name, gfc_current_ns, 1, &extended))
9254 gfc_error ("Ambiguous symbol in TYPE definition at %C");
9255 return NULL;
9258 extended = gfc_find_dt_in_generic (extended);
9260 /* F08:C428. */
9261 if (!extended)
9263 gfc_error ("Symbol %qs at %C has not been previously defined", name);
9264 return NULL;
9267 if (extended->attr.flavor != FL_DERIVED)
9269 gfc_error ("%qs in EXTENDS expression at %C is not a "
9270 "derived type", name);
9271 return NULL;
9274 if (extended->attr.is_bind_c)
9276 gfc_error ("%qs cannot be extended at %C because it "
9277 "is BIND(C)", extended->name);
9278 return NULL;
9281 if (extended->attr.sequence)
9283 gfc_error ("%qs cannot be extended at %C because it "
9284 "is a SEQUENCE type", extended->name);
9285 return NULL;
9288 return extended;
9292 /* Match the optional attribute specifiers for a type declaration.
9293 Return MATCH_ERROR if an error is encountered in one of the handled
9294 attributes (public, private, bind(c)), MATCH_NO if what's found is
9295 not a handled attribute, and MATCH_YES otherwise. TODO: More error
9296 checking on attribute conflicts needs to be done. */
9298 match
9299 gfc_get_type_attr_spec (symbol_attribute *attr, char *name)
9301 /* See if the derived type is marked as private. */
9302 if (gfc_match (" , private") == MATCH_YES)
9304 if (gfc_current_state () != COMP_MODULE)
9306 gfc_error ("Derived type at %C can only be PRIVATE in the "
9307 "specification part of a module");
9308 return MATCH_ERROR;
9311 if (!gfc_add_access (attr, ACCESS_PRIVATE, NULL, NULL))
9312 return MATCH_ERROR;
9314 else if (gfc_match (" , public") == MATCH_YES)
9316 if (gfc_current_state () != COMP_MODULE)
9318 gfc_error ("Derived type at %C can only be PUBLIC in the "
9319 "specification part of a module");
9320 return MATCH_ERROR;
9323 if (!gfc_add_access (attr, ACCESS_PUBLIC, NULL, NULL))
9324 return MATCH_ERROR;
9326 else if (gfc_match (" , bind ( c )") == MATCH_YES)
9328 /* If the type is defined to be bind(c) it then needs to make
9329 sure that all fields are interoperable. This will
9330 need to be a semantic check on the finished derived type.
9331 See 15.2.3 (lines 9-12) of F2003 draft. */
9332 if (!gfc_add_is_bind_c (attr, NULL, &gfc_current_locus, 0))
9333 return MATCH_ERROR;
9335 /* TODO: attr conflicts need to be checked, probably in symbol.c. */
9337 else if (gfc_match (" , abstract") == MATCH_YES)
9339 if (!gfc_notify_std (GFC_STD_F2003, "ABSTRACT type at %C"))
9340 return MATCH_ERROR;
9342 if (!gfc_add_abstract (attr, &gfc_current_locus))
9343 return MATCH_ERROR;
9345 else if (name && gfc_match (" , extends ( %n )", name) == MATCH_YES)
9347 if (!gfc_add_extension (attr, &gfc_current_locus))
9348 return MATCH_ERROR;
9350 else
9351 return MATCH_NO;
9353 /* If we get here, something matched. */
9354 return MATCH_YES;
9358 /* Common function for type declaration blocks similar to derived types, such
9359 as STRUCTURES and MAPs. Unlike derived types, a structure type
9360 does NOT have a generic symbol matching the name given by the user.
9361 STRUCTUREs can share names with variables and PARAMETERs so we must allow
9362 for the creation of an independent symbol.
9363 Other parameters are a message to prefix errors with, the name of the new
9364 type to be created, and the flavor to add to the resulting symbol. */
9366 static bool
9367 get_struct_decl (const char *name, sym_flavor fl, locus *decl,
9368 gfc_symbol **result)
9370 gfc_symbol *sym;
9371 locus where;
9373 gcc_assert (name[0] == (char) TOUPPER (name[0]));
9375 if (decl)
9376 where = *decl;
9377 else
9378 where = gfc_current_locus;
9380 if (gfc_get_symbol (name, NULL, &sym))
9381 return false;
9383 if (!sym)
9385 gfc_internal_error ("Failed to create structure type '%s' at %C", name);
9386 return false;
9389 if (sym->components != NULL || sym->attr.zero_comp)
9391 gfc_error ("Type definition of %qs at %C was already defined at %L",
9392 sym->name, &sym->declared_at);
9393 return false;
9396 sym->declared_at = where;
9398 if (sym->attr.flavor != fl
9399 && !gfc_add_flavor (&sym->attr, fl, sym->name, NULL))
9400 return false;
9402 if (!sym->hash_value)
9403 /* Set the hash for the compound name for this type. */
9404 sym->hash_value = gfc_hash_value (sym);
9406 /* Normally the type is expected to have been completely parsed by the time
9407 a field declaration with this type is seen. For unions, maps, and nested
9408 structure declarations, we need to indicate that it is okay that we
9409 haven't seen any components yet. This will be updated after the structure
9410 is fully parsed. */
9411 sym->attr.zero_comp = 0;
9413 /* Structures always act like derived-types with the SEQUENCE attribute */
9414 gfc_add_sequence (&sym->attr, sym->name, NULL);
9416 if (result) *result = sym;
9418 return true;
9422 /* Match the opening of a MAP block. Like a struct within a union in C;
9423 behaves identical to STRUCTURE blocks. */
9425 match
9426 gfc_match_map (void)
9428 /* Counter used to give unique internal names to map structures. */
9429 static unsigned int gfc_map_id = 0;
9430 char name[GFC_MAX_SYMBOL_LEN + 1];
9431 gfc_symbol *sym;
9432 locus old_loc;
9434 old_loc = gfc_current_locus;
9436 if (gfc_match_eos () != MATCH_YES)
9438 gfc_error ("Junk after MAP statement at %C");
9439 gfc_current_locus = old_loc;
9440 return MATCH_ERROR;
9443 /* Map blocks are anonymous so we make up unique names for the symbol table
9444 which are invalid Fortran identifiers. */
9445 snprintf (name, GFC_MAX_SYMBOL_LEN + 1, "MM$%u", gfc_map_id++);
9447 if (!get_struct_decl (name, FL_STRUCT, &old_loc, &sym))
9448 return MATCH_ERROR;
9450 gfc_new_block = sym;
9452 return MATCH_YES;
9456 /* Match the opening of a UNION block. */
9458 match
9459 gfc_match_union (void)
9461 /* Counter used to give unique internal names to union types. */
9462 static unsigned int gfc_union_id = 0;
9463 char name[GFC_MAX_SYMBOL_LEN + 1];
9464 gfc_symbol *sym;
9465 locus old_loc;
9467 old_loc = gfc_current_locus;
9469 if (gfc_match_eos () != MATCH_YES)
9471 gfc_error ("Junk after UNION statement at %C");
9472 gfc_current_locus = old_loc;
9473 return MATCH_ERROR;
9476 /* Unions are anonymous so we make up unique names for the symbol table
9477 which are invalid Fortran identifiers. */
9478 snprintf (name, GFC_MAX_SYMBOL_LEN + 1, "UU$%u", gfc_union_id++);
9480 if (!get_struct_decl (name, FL_UNION, &old_loc, &sym))
9481 return MATCH_ERROR;
9483 gfc_new_block = sym;
9485 return MATCH_YES;
9489 /* Match the beginning of a STRUCTURE declaration. This is similar to
9490 matching the beginning of a derived type declaration with a few
9491 twists. The resulting type symbol has no access control or other
9492 interesting attributes. */
9494 match
9495 gfc_match_structure_decl (void)
9497 /* Counter used to give unique internal names to anonymous structures. */
9498 static unsigned int gfc_structure_id = 0;
9499 char name[GFC_MAX_SYMBOL_LEN + 1];
9500 gfc_symbol *sym;
9501 match m;
9502 locus where;
9504 if (!flag_dec_structure)
9506 gfc_error ("%s at %C is a DEC extension, enable with "
9507 "%<-fdec-structure%>",
9508 "STRUCTURE");
9509 return MATCH_ERROR;
9512 name[0] = '\0';
9514 m = gfc_match (" /%n/", name);
9515 if (m != MATCH_YES)
9517 /* Non-nested structure declarations require a structure name. */
9518 if (!gfc_comp_struct (gfc_current_state ()))
9520 gfc_error ("Structure name expected in non-nested structure "
9521 "declaration at %C");
9522 return MATCH_ERROR;
9524 /* This is an anonymous structure; make up a unique name for it
9525 (upper-case letters never make it to symbol names from the source).
9526 The important thing is initializing the type variable
9527 and setting gfc_new_symbol, which is immediately used by
9528 parse_structure () and variable_decl () to add components of
9529 this type. */
9530 snprintf (name, GFC_MAX_SYMBOL_LEN + 1, "SS$%u", gfc_structure_id++);
9533 where = gfc_current_locus;
9534 /* No field list allowed after non-nested structure declaration. */
9535 if (!gfc_comp_struct (gfc_current_state ())
9536 && gfc_match_eos () != MATCH_YES)
9538 gfc_error ("Junk after non-nested STRUCTURE statement at %C");
9539 return MATCH_ERROR;
9542 /* Make sure the name is not the name of an intrinsic type. */
9543 if (gfc_is_intrinsic_typename (name))
9545 gfc_error ("Structure name %qs at %C cannot be the same as an"
9546 " intrinsic type", name);
9547 return MATCH_ERROR;
9550 /* Store the actual type symbol for the structure with an upper-case first
9551 letter (an invalid Fortran identifier). */
9553 if (!get_struct_decl (gfc_dt_upper_string (name), FL_STRUCT, &where, &sym))
9554 return MATCH_ERROR;
9556 gfc_new_block = sym;
9557 return MATCH_YES;
9561 /* This function does some work to determine which matcher should be used to
9562 * match a statement beginning with "TYPE". This is used to disambiguate TYPE
9563 * as an alias for PRINT from derived type declarations, TYPE IS statements,
9564 * and derived type data declarations. */
9566 match
9567 gfc_match_type (gfc_statement *st)
9569 char name[GFC_MAX_SYMBOL_LEN + 1];
9570 match m;
9571 locus old_loc;
9573 /* Requires -fdec. */
9574 if (!flag_dec)
9575 return MATCH_NO;
9577 m = gfc_match ("type");
9578 if (m != MATCH_YES)
9579 return m;
9580 /* If we already have an error in the buffer, it is probably from failing to
9581 * match a derived type data declaration. Let it happen. */
9582 else if (gfc_error_flag_test ())
9583 return MATCH_NO;
9585 old_loc = gfc_current_locus;
9586 *st = ST_NONE;
9588 /* If we see an attribute list before anything else it's definitely a derived
9589 * type declaration. */
9590 if (gfc_match (" ,") == MATCH_YES || gfc_match (" ::") == MATCH_YES)
9592 gfc_current_locus = old_loc;
9593 *st = ST_DERIVED_DECL;
9594 return gfc_match_derived_decl ();
9597 /* By now "TYPE" has already been matched. If we do not see a name, this may
9598 * be something like "TYPE *" or "TYPE <fmt>". */
9599 m = gfc_match_name (name);
9600 if (m != MATCH_YES)
9602 /* Let print match if it can, otherwise throw an error from
9603 * gfc_match_derived_decl. */
9604 gfc_current_locus = old_loc;
9605 if (gfc_match_print () == MATCH_YES)
9607 *st = ST_WRITE;
9608 return MATCH_YES;
9610 gfc_current_locus = old_loc;
9611 *st = ST_DERIVED_DECL;
9612 return gfc_match_derived_decl ();
9615 /* A derived type declaration requires an EOS. Without it, assume print. */
9616 m = gfc_match_eos ();
9617 if (m == MATCH_NO)
9619 /* Check manually for TYPE IS (... - this is invalid print syntax. */
9620 if (strncmp ("is", name, 3) == 0
9621 && gfc_match (" (", name) == MATCH_YES)
9623 gfc_current_locus = old_loc;
9624 gcc_assert (gfc_match (" is") == MATCH_YES);
9625 *st = ST_TYPE_IS;
9626 return gfc_match_type_is ();
9628 gfc_current_locus = old_loc;
9629 *st = ST_WRITE;
9630 return gfc_match_print ();
9632 else
9634 /* By now we have "TYPE <name> <EOS>". Check first if the name is an
9635 * intrinsic typename - if so let gfc_match_derived_decl dump an error.
9636 * Otherwise if gfc_match_derived_decl fails it's probably an existing
9637 * symbol which can be printed. */
9638 gfc_current_locus = old_loc;
9639 m = gfc_match_derived_decl ();
9640 if (gfc_is_intrinsic_typename (name) || m == MATCH_YES)
9642 *st = ST_DERIVED_DECL;
9643 return m;
9645 gfc_current_locus = old_loc;
9646 *st = ST_WRITE;
9647 return gfc_match_print ();
9650 return MATCH_NO;
9654 /* Match the beginning of a derived type declaration. If a type name
9655 was the result of a function, then it is possible to have a symbol
9656 already to be known as a derived type yet have no components. */
9658 match
9659 gfc_match_derived_decl (void)
9661 char name[GFC_MAX_SYMBOL_LEN + 1];
9662 char parent[GFC_MAX_SYMBOL_LEN + 1];
9663 symbol_attribute attr;
9664 gfc_symbol *sym, *gensym;
9665 gfc_symbol *extended;
9666 match m;
9667 match is_type_attr_spec = MATCH_NO;
9668 bool seen_attr = false;
9669 gfc_interface *intr = NULL, *head;
9670 bool parameterized_type = false;
9671 bool seen_colons = false;
9673 if (gfc_comp_struct (gfc_current_state ()))
9674 return MATCH_NO;
9676 name[0] = '\0';
9677 parent[0] = '\0';
9678 gfc_clear_attr (&attr);
9679 extended = NULL;
9683 is_type_attr_spec = gfc_get_type_attr_spec (&attr, parent);
9684 if (is_type_attr_spec == MATCH_ERROR)
9685 return MATCH_ERROR;
9686 if (is_type_attr_spec == MATCH_YES)
9687 seen_attr = true;
9688 } while (is_type_attr_spec == MATCH_YES);
9690 /* Deal with derived type extensions. The extension attribute has
9691 been added to 'attr' but now the parent type must be found and
9692 checked. */
9693 if (parent[0])
9694 extended = check_extended_derived_type (parent);
9696 if (parent[0] && !extended)
9697 return MATCH_ERROR;
9699 m = gfc_match (" ::");
9700 if (m == MATCH_YES)
9702 seen_colons = true;
9704 else if (seen_attr)
9706 gfc_error ("Expected :: in TYPE definition at %C");
9707 return MATCH_ERROR;
9710 m = gfc_match (" %n ", name);
9711 if (m != MATCH_YES)
9712 return m;
9714 /* Make sure that we don't identify TYPE IS (...) as a parameterized
9715 derived type named 'is'.
9716 TODO Expand the check, when 'name' = "is" by matching " (tname) "
9717 and checking if this is a(n intrinsic) typename. his picks up
9718 misplaced TYPE IS statements such as in select_type_1.f03. */
9719 if (gfc_peek_ascii_char () == '(')
9721 if (gfc_current_state () == COMP_SELECT_TYPE
9722 || (!seen_colons && !strcmp (name, "is")))
9723 return MATCH_NO;
9724 parameterized_type = true;
9727 m = gfc_match_eos ();
9728 if (m != MATCH_YES && !parameterized_type)
9729 return m;
9731 /* Make sure the name is not the name of an intrinsic type. */
9732 if (gfc_is_intrinsic_typename (name))
9734 gfc_error ("Type name %qs at %C cannot be the same as an intrinsic "
9735 "type", name);
9736 return MATCH_ERROR;
9739 if (gfc_get_symbol (name, NULL, &gensym))
9740 return MATCH_ERROR;
9742 if (!gensym->attr.generic && gensym->ts.type != BT_UNKNOWN)
9744 gfc_error ("Derived type name %qs at %C already has a basic type "
9745 "of %s", gensym->name, gfc_typename (&gensym->ts));
9746 return MATCH_ERROR;
9749 if (!gensym->attr.generic
9750 && !gfc_add_generic (&gensym->attr, gensym->name, NULL))
9751 return MATCH_ERROR;
9753 if (!gensym->attr.function
9754 && !gfc_add_function (&gensym->attr, gensym->name, NULL))
9755 return MATCH_ERROR;
9757 sym = gfc_find_dt_in_generic (gensym);
9759 if (sym && (sym->components != NULL || sym->attr.zero_comp))
9761 gfc_error ("Derived type definition of %qs at %C has already been "
9762 "defined", sym->name);
9763 return MATCH_ERROR;
9766 if (!sym)
9768 /* Use upper case to save the actual derived-type symbol. */
9769 gfc_get_symbol (gfc_dt_upper_string (gensym->name), NULL, &sym);
9770 sym->name = gfc_get_string ("%s", gensym->name);
9771 head = gensym->generic;
9772 intr = gfc_get_interface ();
9773 intr->sym = sym;
9774 intr->where = gfc_current_locus;
9775 intr->sym->declared_at = gfc_current_locus;
9776 intr->next = head;
9777 gensym->generic = intr;
9778 gensym->attr.if_source = IFSRC_DECL;
9781 /* The symbol may already have the derived attribute without the
9782 components. The ways this can happen is via a function
9783 definition, an INTRINSIC statement or a subtype in another
9784 derived type that is a pointer. The first part of the AND clause
9785 is true if the symbol is not the return value of a function. */
9786 if (sym->attr.flavor != FL_DERIVED
9787 && !gfc_add_flavor (&sym->attr, FL_DERIVED, sym->name, NULL))
9788 return MATCH_ERROR;
9790 if (attr.access != ACCESS_UNKNOWN
9791 && !gfc_add_access (&sym->attr, attr.access, sym->name, NULL))
9792 return MATCH_ERROR;
9793 else if (sym->attr.access == ACCESS_UNKNOWN
9794 && gensym->attr.access != ACCESS_UNKNOWN
9795 && !gfc_add_access (&sym->attr, gensym->attr.access,
9796 sym->name, NULL))
9797 return MATCH_ERROR;
9799 if (sym->attr.access != ACCESS_UNKNOWN
9800 && gensym->attr.access == ACCESS_UNKNOWN)
9801 gensym->attr.access = sym->attr.access;
9803 /* See if the derived type was labeled as bind(c). */
9804 if (attr.is_bind_c != 0)
9805 sym->attr.is_bind_c = attr.is_bind_c;
9807 /* Construct the f2k_derived namespace if it is not yet there. */
9808 if (!sym->f2k_derived)
9809 sym->f2k_derived = gfc_get_namespace (NULL, 0);
9811 if (parameterized_type)
9813 m = gfc_match_formal_arglist (sym, 0, 0, true);
9814 if (m != MATCH_YES)
9815 return m;
9816 m = gfc_match_eos ();
9817 if (m != MATCH_YES)
9818 return m;
9819 sym->attr.pdt_template = 1;
9822 if (extended && !sym->components)
9824 gfc_component *p;
9825 gfc_formal_arglist *f, *g, *h;
9827 /* Add the extended derived type as the first component. */
9828 gfc_add_component (sym, parent, &p);
9829 extended->refs++;
9830 gfc_set_sym_referenced (extended);
9832 p->ts.type = BT_DERIVED;
9833 p->ts.u.derived = extended;
9834 p->initializer = gfc_default_initializer (&p->ts);
9836 /* Set extension level. */
9837 if (extended->attr.extension == 255)
9839 /* Since the extension field is 8 bit wide, we can only have
9840 up to 255 extension levels. */
9841 gfc_error ("Maximum extension level reached with type %qs at %L",
9842 extended->name, &extended->declared_at);
9843 return MATCH_ERROR;
9845 sym->attr.extension = extended->attr.extension + 1;
9847 /* Provide the links between the extended type and its extension. */
9848 if (!extended->f2k_derived)
9849 extended->f2k_derived = gfc_get_namespace (NULL, 0);
9851 /* Copy the extended type-param-name-list from the extended type,
9852 append those of the extension and add the whole lot to the
9853 extension. */
9854 if (extended->attr.pdt_template)
9856 g = h = NULL;
9857 sym->attr.pdt_template = 1;
9858 for (f = extended->formal; f; f = f->next)
9860 if (f == extended->formal)
9862 g = gfc_get_formal_arglist ();
9863 h = g;
9865 else
9867 g->next = gfc_get_formal_arglist ();
9868 g = g->next;
9870 g->sym = f->sym;
9872 g->next = sym->formal;
9873 sym->formal = h;
9877 if (!sym->hash_value)
9878 /* Set the hash for the compound name for this type. */
9879 sym->hash_value = gfc_hash_value (sym);
9881 /* Take over the ABSTRACT attribute. */
9882 sym->attr.abstract = attr.abstract;
9884 gfc_new_block = sym;
9886 return MATCH_YES;
9890 /* Cray Pointees can be declared as:
9891 pointer (ipt, a (n,m,...,*)) */
9893 match
9894 gfc_mod_pointee_as (gfc_array_spec *as)
9896 as->cray_pointee = true; /* This will be useful to know later. */
9897 if (as->type == AS_ASSUMED_SIZE)
9898 as->cp_was_assumed = true;
9899 else if (as->type == AS_ASSUMED_SHAPE)
9901 gfc_error ("Cray Pointee at %C cannot be assumed shape array");
9902 return MATCH_ERROR;
9904 return MATCH_YES;
9908 /* Match the enum definition statement, here we are trying to match
9909 the first line of enum definition statement.
9910 Returns MATCH_YES if match is found. */
9912 match
9913 gfc_match_enum (void)
9915 match m;
9917 m = gfc_match_eos ();
9918 if (m != MATCH_YES)
9919 return m;
9921 if (!gfc_notify_std (GFC_STD_F2003, "ENUM and ENUMERATOR at %C"))
9922 return MATCH_ERROR;
9924 return MATCH_YES;
9928 /* Returns an initializer whose value is one higher than the value of the
9929 LAST_INITIALIZER argument. If the argument is NULL, the
9930 initializers value will be set to zero. The initializer's kind
9931 will be set to gfc_c_int_kind.
9933 If -fshort-enums is given, the appropriate kind will be selected
9934 later after all enumerators have been parsed. A warning is issued
9935 here if an initializer exceeds gfc_c_int_kind. */
9937 static gfc_expr *
9938 enum_initializer (gfc_expr *last_initializer, locus where)
9940 gfc_expr *result;
9941 result = gfc_get_constant_expr (BT_INTEGER, gfc_c_int_kind, &where);
9943 mpz_init (result->value.integer);
9945 if (last_initializer != NULL)
9947 mpz_add_ui (result->value.integer, last_initializer->value.integer, 1);
9948 result->where = last_initializer->where;
9950 if (gfc_check_integer_range (result->value.integer,
9951 gfc_c_int_kind) != ARITH_OK)
9953 gfc_error ("Enumerator exceeds the C integer type at %C");
9954 return NULL;
9957 else
9959 /* Control comes here, if it's the very first enumerator and no
9960 initializer has been given. It will be initialized to zero. */
9961 mpz_set_si (result->value.integer, 0);
9964 return result;
9968 /* Match a variable name with an optional initializer. When this
9969 subroutine is called, a variable is expected to be parsed next.
9970 Depending on what is happening at the moment, updates either the
9971 symbol table or the current interface. */
9973 static match
9974 enumerator_decl (void)
9976 char name[GFC_MAX_SYMBOL_LEN + 1];
9977 gfc_expr *initializer;
9978 gfc_array_spec *as = NULL;
9979 gfc_symbol *sym;
9980 locus var_locus;
9981 match m;
9982 bool t;
9983 locus old_locus;
9985 initializer = NULL;
9986 old_locus = gfc_current_locus;
9988 /* When we get here, we've just matched a list of attributes and
9989 maybe a type and a double colon. The next thing we expect to see
9990 is the name of the symbol. */
9991 m = gfc_match_name (name);
9992 if (m != MATCH_YES)
9993 goto cleanup;
9995 var_locus = gfc_current_locus;
9997 /* OK, we've successfully matched the declaration. Now put the
9998 symbol in the current namespace. If we fail to create the symbol,
9999 bail out. */
10000 if (!build_sym (name, NULL, false, &as, &var_locus))
10002 m = MATCH_ERROR;
10003 goto cleanup;
10006 /* The double colon must be present in order to have initializers.
10007 Otherwise the statement is ambiguous with an assignment statement. */
10008 if (colon_seen)
10010 if (gfc_match_char ('=') == MATCH_YES)
10012 m = gfc_match_init_expr (&initializer);
10013 if (m == MATCH_NO)
10015 gfc_error ("Expected an initialization expression at %C");
10016 m = MATCH_ERROR;
10019 if (m != MATCH_YES)
10020 goto cleanup;
10024 /* If we do not have an initializer, the initialization value of the
10025 previous enumerator (stored in last_initializer) is incremented
10026 by 1 and is used to initialize the current enumerator. */
10027 if (initializer == NULL)
10028 initializer = enum_initializer (last_initializer, old_locus);
10030 if (initializer == NULL || initializer->ts.type != BT_INTEGER)
10032 gfc_error ("ENUMERATOR %L not initialized with integer expression",
10033 &var_locus);
10034 m = MATCH_ERROR;
10035 goto cleanup;
10038 /* Store this current initializer, for the next enumerator variable
10039 to be parsed. add_init_expr_to_sym() zeros initializer, so we
10040 use last_initializer below. */
10041 last_initializer = initializer;
10042 t = add_init_expr_to_sym (name, &initializer, &var_locus);
10044 /* Maintain enumerator history. */
10045 gfc_find_symbol (name, NULL, 0, &sym);
10046 create_enum_history (sym, last_initializer);
10048 return (t) ? MATCH_YES : MATCH_ERROR;
10050 cleanup:
10051 /* Free stuff up and return. */
10052 gfc_free_expr (initializer);
10054 return m;
10058 /* Match the enumerator definition statement. */
10060 match
10061 gfc_match_enumerator_def (void)
10063 match m;
10064 bool t;
10066 gfc_clear_ts (&current_ts);
10068 m = gfc_match (" enumerator");
10069 if (m != MATCH_YES)
10070 return m;
10072 m = gfc_match (" :: ");
10073 if (m == MATCH_ERROR)
10074 return m;
10076 colon_seen = (m == MATCH_YES);
10078 if (gfc_current_state () != COMP_ENUM)
10080 gfc_error ("ENUM definition statement expected before %C");
10081 gfc_free_enum_history ();
10082 return MATCH_ERROR;
10085 (&current_ts)->type = BT_INTEGER;
10086 (&current_ts)->kind = gfc_c_int_kind;
10088 gfc_clear_attr (&current_attr);
10089 t = gfc_add_flavor (&current_attr, FL_PARAMETER, NULL, NULL);
10090 if (!t)
10092 m = MATCH_ERROR;
10093 goto cleanup;
10096 for (;;)
10098 m = enumerator_decl ();
10099 if (m == MATCH_ERROR)
10101 gfc_free_enum_history ();
10102 goto cleanup;
10104 if (m == MATCH_NO)
10105 break;
10107 if (gfc_match_eos () == MATCH_YES)
10108 goto cleanup;
10109 if (gfc_match_char (',') != MATCH_YES)
10110 break;
10113 if (gfc_current_state () == COMP_ENUM)
10115 gfc_free_enum_history ();
10116 gfc_error ("Syntax error in ENUMERATOR definition at %C");
10117 m = MATCH_ERROR;
10120 cleanup:
10121 gfc_free_array_spec (current_as);
10122 current_as = NULL;
10123 return m;
10128 /* Match binding attributes. */
10130 static match
10131 match_binding_attributes (gfc_typebound_proc* ba, bool generic, bool ppc)
10133 bool found_passing = false;
10134 bool seen_ptr = false;
10135 match m = MATCH_YES;
10137 /* Initialize to defaults. Do so even before the MATCH_NO check so that in
10138 this case the defaults are in there. */
10139 ba->access = ACCESS_UNKNOWN;
10140 ba->pass_arg = NULL;
10141 ba->pass_arg_num = 0;
10142 ba->nopass = 0;
10143 ba->non_overridable = 0;
10144 ba->deferred = 0;
10145 ba->ppc = ppc;
10147 /* If we find a comma, we believe there are binding attributes. */
10148 m = gfc_match_char (',');
10149 if (m == MATCH_NO)
10150 goto done;
10154 /* Access specifier. */
10156 m = gfc_match (" public");
10157 if (m == MATCH_ERROR)
10158 goto error;
10159 if (m == MATCH_YES)
10161 if (ba->access != ACCESS_UNKNOWN)
10163 gfc_error ("Duplicate access-specifier at %C");
10164 goto error;
10167 ba->access = ACCESS_PUBLIC;
10168 continue;
10171 m = gfc_match (" private");
10172 if (m == MATCH_ERROR)
10173 goto error;
10174 if (m == MATCH_YES)
10176 if (ba->access != ACCESS_UNKNOWN)
10178 gfc_error ("Duplicate access-specifier at %C");
10179 goto error;
10182 ba->access = ACCESS_PRIVATE;
10183 continue;
10186 /* If inside GENERIC, the following is not allowed. */
10187 if (!generic)
10190 /* NOPASS flag. */
10191 m = gfc_match (" nopass");
10192 if (m == MATCH_ERROR)
10193 goto error;
10194 if (m == MATCH_YES)
10196 if (found_passing)
10198 gfc_error ("Binding attributes already specify passing,"
10199 " illegal NOPASS at %C");
10200 goto error;
10203 found_passing = true;
10204 ba->nopass = 1;
10205 continue;
10208 /* PASS possibly including argument. */
10209 m = gfc_match (" pass");
10210 if (m == MATCH_ERROR)
10211 goto error;
10212 if (m == MATCH_YES)
10214 char arg[GFC_MAX_SYMBOL_LEN + 1];
10216 if (found_passing)
10218 gfc_error ("Binding attributes already specify passing,"
10219 " illegal PASS at %C");
10220 goto error;
10223 m = gfc_match (" ( %n )", arg);
10224 if (m == MATCH_ERROR)
10225 goto error;
10226 if (m == MATCH_YES)
10227 ba->pass_arg = gfc_get_string ("%s", arg);
10228 gcc_assert ((m == MATCH_YES) == (ba->pass_arg != NULL));
10230 found_passing = true;
10231 ba->nopass = 0;
10232 continue;
10235 if (ppc)
10237 /* POINTER flag. */
10238 m = gfc_match (" pointer");
10239 if (m == MATCH_ERROR)
10240 goto error;
10241 if (m == MATCH_YES)
10243 if (seen_ptr)
10245 gfc_error ("Duplicate POINTER attribute at %C");
10246 goto error;
10249 seen_ptr = true;
10250 continue;
10253 else
10255 /* NON_OVERRIDABLE flag. */
10256 m = gfc_match (" non_overridable");
10257 if (m == MATCH_ERROR)
10258 goto error;
10259 if (m == MATCH_YES)
10261 if (ba->non_overridable)
10263 gfc_error ("Duplicate NON_OVERRIDABLE at %C");
10264 goto error;
10267 ba->non_overridable = 1;
10268 continue;
10271 /* DEFERRED flag. */
10272 m = gfc_match (" deferred");
10273 if (m == MATCH_ERROR)
10274 goto error;
10275 if (m == MATCH_YES)
10277 if (ba->deferred)
10279 gfc_error ("Duplicate DEFERRED at %C");
10280 goto error;
10283 ba->deferred = 1;
10284 continue;
10290 /* Nothing matching found. */
10291 if (generic)
10292 gfc_error ("Expected access-specifier at %C");
10293 else
10294 gfc_error ("Expected binding attribute at %C");
10295 goto error;
10297 while (gfc_match_char (',') == MATCH_YES);
10299 /* NON_OVERRIDABLE and DEFERRED exclude themselves. */
10300 if (ba->non_overridable && ba->deferred)
10302 gfc_error ("NON_OVERRIDABLE and DEFERRED can't both appear at %C");
10303 goto error;
10306 m = MATCH_YES;
10308 done:
10309 if (ba->access == ACCESS_UNKNOWN)
10310 ba->access = gfc_typebound_default_access;
10312 if (ppc && !seen_ptr)
10314 gfc_error ("POINTER attribute is required for procedure pointer component"
10315 " at %C");
10316 goto error;
10319 return m;
10321 error:
10322 return MATCH_ERROR;
10326 /* Match a PROCEDURE specific binding inside a derived type. */
10328 static match
10329 match_procedure_in_type (void)
10331 char name[GFC_MAX_SYMBOL_LEN + 1];
10332 char target_buf[GFC_MAX_SYMBOL_LEN + 1];
10333 char* target = NULL, *ifc = NULL;
10334 gfc_typebound_proc tb;
10335 bool seen_colons;
10336 bool seen_attrs;
10337 match m;
10338 gfc_symtree* stree;
10339 gfc_namespace* ns;
10340 gfc_symbol* block;
10341 int num;
10343 /* Check current state. */
10344 gcc_assert (gfc_state_stack->state == COMP_DERIVED_CONTAINS);
10345 block = gfc_state_stack->previous->sym;
10346 gcc_assert (block);
10348 /* Try to match PROCEDURE(interface). */
10349 if (gfc_match (" (") == MATCH_YES)
10351 m = gfc_match_name (target_buf);
10352 if (m == MATCH_ERROR)
10353 return m;
10354 if (m != MATCH_YES)
10356 gfc_error ("Interface-name expected after %<(%> at %C");
10357 return MATCH_ERROR;
10360 if (gfc_match (" )") != MATCH_YES)
10362 gfc_error ("%<)%> expected at %C");
10363 return MATCH_ERROR;
10366 ifc = target_buf;
10369 /* Construct the data structure. */
10370 memset (&tb, 0, sizeof (tb));
10371 tb.where = gfc_current_locus;
10373 /* Match binding attributes. */
10374 m = match_binding_attributes (&tb, false, false);
10375 if (m == MATCH_ERROR)
10376 return m;
10377 seen_attrs = (m == MATCH_YES);
10379 /* Check that attribute DEFERRED is given if an interface is specified. */
10380 if (tb.deferred && !ifc)
10382 gfc_error ("Interface must be specified for DEFERRED binding at %C");
10383 return MATCH_ERROR;
10385 if (ifc && !tb.deferred)
10387 gfc_error ("PROCEDURE(interface) at %C should be declared DEFERRED");
10388 return MATCH_ERROR;
10391 /* Match the colons. */
10392 m = gfc_match (" ::");
10393 if (m == MATCH_ERROR)
10394 return m;
10395 seen_colons = (m == MATCH_YES);
10396 if (seen_attrs && !seen_colons)
10398 gfc_error ("Expected %<::%> after binding-attributes at %C");
10399 return MATCH_ERROR;
10402 /* Match the binding names. */
10403 for(num=1;;num++)
10405 m = gfc_match_name (name);
10406 if (m == MATCH_ERROR)
10407 return m;
10408 if (m == MATCH_NO)
10410 gfc_error ("Expected binding name at %C");
10411 return MATCH_ERROR;
10414 if (num>1 && !gfc_notify_std (GFC_STD_F2008, "PROCEDURE list at %C"))
10415 return MATCH_ERROR;
10417 /* Try to match the '=> target', if it's there. */
10418 target = ifc;
10419 m = gfc_match (" =>");
10420 if (m == MATCH_ERROR)
10421 return m;
10422 if (m == MATCH_YES)
10424 if (tb.deferred)
10426 gfc_error ("%<=> target%> is invalid for DEFERRED binding at %C");
10427 return MATCH_ERROR;
10430 if (!seen_colons)
10432 gfc_error ("%<::%> needed in PROCEDURE binding with explicit target"
10433 " at %C");
10434 return MATCH_ERROR;
10437 m = gfc_match_name (target_buf);
10438 if (m == MATCH_ERROR)
10439 return m;
10440 if (m == MATCH_NO)
10442 gfc_error ("Expected binding target after %<=>%> at %C");
10443 return MATCH_ERROR;
10445 target = target_buf;
10448 /* If no target was found, it has the same name as the binding. */
10449 if (!target)
10450 target = name;
10452 /* Get the namespace to insert the symbols into. */
10453 ns = block->f2k_derived;
10454 gcc_assert (ns);
10456 /* If the binding is DEFERRED, check that the containing type is ABSTRACT. */
10457 if (tb.deferred && !block->attr.abstract)
10459 gfc_error ("Type %qs containing DEFERRED binding at %C "
10460 "is not ABSTRACT", block->name);
10461 return MATCH_ERROR;
10464 /* See if we already have a binding with this name in the symtree which
10465 would be an error. If a GENERIC already targeted this binding, it may
10466 be already there but then typebound is still NULL. */
10467 stree = gfc_find_symtree (ns->tb_sym_root, name);
10468 if (stree && stree->n.tb)
10470 gfc_error ("There is already a procedure with binding name %qs for "
10471 "the derived type %qs at %C", name, block->name);
10472 return MATCH_ERROR;
10475 /* Insert it and set attributes. */
10477 if (!stree)
10479 stree = gfc_new_symtree (&ns->tb_sym_root, name);
10480 gcc_assert (stree);
10482 stree->n.tb = gfc_get_typebound_proc (&tb);
10484 if (gfc_get_sym_tree (target, gfc_current_ns, &stree->n.tb->u.specific,
10485 false))
10486 return MATCH_ERROR;
10487 gfc_set_sym_referenced (stree->n.tb->u.specific->n.sym);
10488 gfc_add_flavor(&stree->n.tb->u.specific->n.sym->attr, FL_PROCEDURE,
10489 target, &stree->n.tb->u.specific->n.sym->declared_at);
10491 if (gfc_match_eos () == MATCH_YES)
10492 return MATCH_YES;
10493 if (gfc_match_char (',') != MATCH_YES)
10494 goto syntax;
10497 syntax:
10498 gfc_error ("Syntax error in PROCEDURE statement at %C");
10499 return MATCH_ERROR;
10503 /* Match a GENERIC procedure binding inside a derived type. */
10505 match
10506 gfc_match_generic (void)
10508 char name[GFC_MAX_SYMBOL_LEN + 1];
10509 char bind_name[GFC_MAX_SYMBOL_LEN + 16]; /* Allow space for OPERATOR(...). */
10510 gfc_symbol* block;
10511 gfc_typebound_proc tbattr; /* Used for match_binding_attributes. */
10512 gfc_typebound_proc* tb;
10513 gfc_namespace* ns;
10514 interface_type op_type;
10515 gfc_intrinsic_op op;
10516 match m;
10518 /* Check current state. */
10519 if (gfc_current_state () == COMP_DERIVED)
10521 gfc_error ("GENERIC at %C must be inside a derived-type CONTAINS");
10522 return MATCH_ERROR;
10524 if (gfc_current_state () != COMP_DERIVED_CONTAINS)
10525 return MATCH_NO;
10526 block = gfc_state_stack->previous->sym;
10527 ns = block->f2k_derived;
10528 gcc_assert (block && ns);
10530 memset (&tbattr, 0, sizeof (tbattr));
10531 tbattr.where = gfc_current_locus;
10533 /* See if we get an access-specifier. */
10534 m = match_binding_attributes (&tbattr, true, false);
10535 if (m == MATCH_ERROR)
10536 goto error;
10538 /* Now the colons, those are required. */
10539 if (gfc_match (" ::") != MATCH_YES)
10541 gfc_error ("Expected %<::%> at %C");
10542 goto error;
10545 /* Match the binding name; depending on type (operator / generic) format
10546 it for future error messages into bind_name. */
10548 m = gfc_match_generic_spec (&op_type, name, &op);
10549 if (m == MATCH_ERROR)
10550 return MATCH_ERROR;
10551 if (m == MATCH_NO)
10553 gfc_error ("Expected generic name or operator descriptor at %C");
10554 goto error;
10557 switch (op_type)
10559 case INTERFACE_GENERIC:
10560 case INTERFACE_DTIO:
10561 snprintf (bind_name, sizeof (bind_name), "%s", name);
10562 break;
10564 case INTERFACE_USER_OP:
10565 snprintf (bind_name, sizeof (bind_name), "OPERATOR(.%s.)", name);
10566 break;
10568 case INTERFACE_INTRINSIC_OP:
10569 snprintf (bind_name, sizeof (bind_name), "OPERATOR(%s)",
10570 gfc_op2string (op));
10571 break;
10573 case INTERFACE_NAMELESS:
10574 gfc_error ("Malformed GENERIC statement at %C");
10575 goto error;
10576 break;
10578 default:
10579 gcc_unreachable ();
10582 /* Match the required =>. */
10583 if (gfc_match (" =>") != MATCH_YES)
10585 gfc_error ("Expected %<=>%> at %C");
10586 goto error;
10589 /* Try to find existing GENERIC binding with this name / for this operator;
10590 if there is something, check that it is another GENERIC and then extend
10591 it rather than building a new node. Otherwise, create it and put it
10592 at the right position. */
10594 switch (op_type)
10596 case INTERFACE_DTIO:
10597 case INTERFACE_USER_OP:
10598 case INTERFACE_GENERIC:
10600 const bool is_op = (op_type == INTERFACE_USER_OP);
10601 gfc_symtree* st;
10603 st = gfc_find_symtree (is_op ? ns->tb_uop_root : ns->tb_sym_root, name);
10604 tb = st ? st->n.tb : NULL;
10605 break;
10608 case INTERFACE_INTRINSIC_OP:
10609 tb = ns->tb_op[op];
10610 break;
10612 default:
10613 gcc_unreachable ();
10616 if (tb)
10618 if (!tb->is_generic)
10620 gcc_assert (op_type == INTERFACE_GENERIC);
10621 gfc_error ("There's already a non-generic procedure with binding name"
10622 " %qs for the derived type %qs at %C",
10623 bind_name, block->name);
10624 goto error;
10627 if (tb->access != tbattr.access)
10629 gfc_error ("Binding at %C must have the same access as already"
10630 " defined binding %qs", bind_name);
10631 goto error;
10634 else
10636 tb = gfc_get_typebound_proc (NULL);
10637 tb->where = gfc_current_locus;
10638 tb->access = tbattr.access;
10639 tb->is_generic = 1;
10640 tb->u.generic = NULL;
10642 switch (op_type)
10644 case INTERFACE_DTIO:
10645 case INTERFACE_GENERIC:
10646 case INTERFACE_USER_OP:
10648 const bool is_op = (op_type == INTERFACE_USER_OP);
10649 gfc_symtree* st = gfc_get_tbp_symtree (is_op ? &ns->tb_uop_root :
10650 &ns->tb_sym_root, name);
10651 gcc_assert (st);
10652 st->n.tb = tb;
10654 break;
10657 case INTERFACE_INTRINSIC_OP:
10658 ns->tb_op[op] = tb;
10659 break;
10661 default:
10662 gcc_unreachable ();
10666 /* Now, match all following names as specific targets. */
10669 gfc_symtree* target_st;
10670 gfc_tbp_generic* target;
10672 m = gfc_match_name (name);
10673 if (m == MATCH_ERROR)
10674 goto error;
10675 if (m == MATCH_NO)
10677 gfc_error ("Expected specific binding name at %C");
10678 goto error;
10681 target_st = gfc_get_tbp_symtree (&ns->tb_sym_root, name);
10683 /* See if this is a duplicate specification. */
10684 for (target = tb->u.generic; target; target = target->next)
10685 if (target_st == target->specific_st)
10687 gfc_error ("%qs already defined as specific binding for the"
10688 " generic %qs at %C", name, bind_name);
10689 goto error;
10692 target = gfc_get_tbp_generic ();
10693 target->specific_st = target_st;
10694 target->specific = NULL;
10695 target->next = tb->u.generic;
10696 target->is_operator = ((op_type == INTERFACE_USER_OP)
10697 || (op_type == INTERFACE_INTRINSIC_OP));
10698 tb->u.generic = target;
10700 while (gfc_match (" ,") == MATCH_YES);
10702 /* Here should be the end. */
10703 if (gfc_match_eos () != MATCH_YES)
10705 gfc_error ("Junk after GENERIC binding at %C");
10706 goto error;
10709 return MATCH_YES;
10711 error:
10712 return MATCH_ERROR;
10716 /* Match a FINAL declaration inside a derived type. */
10718 match
10719 gfc_match_final_decl (void)
10721 char name[GFC_MAX_SYMBOL_LEN + 1];
10722 gfc_symbol* sym;
10723 match m;
10724 gfc_namespace* module_ns;
10725 bool first, last;
10726 gfc_symbol* block;
10728 if (gfc_current_form == FORM_FREE)
10730 char c = gfc_peek_ascii_char ();
10731 if (!gfc_is_whitespace (c) && c != ':')
10732 return MATCH_NO;
10735 if (gfc_state_stack->state != COMP_DERIVED_CONTAINS)
10737 if (gfc_current_form == FORM_FIXED)
10738 return MATCH_NO;
10740 gfc_error ("FINAL declaration at %C must be inside a derived type "
10741 "CONTAINS section");
10742 return MATCH_ERROR;
10745 block = gfc_state_stack->previous->sym;
10746 gcc_assert (block);
10748 if (!gfc_state_stack->previous || !gfc_state_stack->previous->previous
10749 || gfc_state_stack->previous->previous->state != COMP_MODULE)
10751 gfc_error ("Derived type declaration with FINAL at %C must be in the"
10752 " specification part of a MODULE");
10753 return MATCH_ERROR;
10756 module_ns = gfc_current_ns;
10757 gcc_assert (module_ns);
10758 gcc_assert (module_ns->proc_name->attr.flavor == FL_MODULE);
10760 /* Match optional ::, don't care about MATCH_YES or MATCH_NO. */
10761 if (gfc_match (" ::") == MATCH_ERROR)
10762 return MATCH_ERROR;
10764 /* Match the sequence of procedure names. */
10765 first = true;
10766 last = false;
10769 gfc_finalizer* f;
10771 if (first && gfc_match_eos () == MATCH_YES)
10773 gfc_error ("Empty FINAL at %C");
10774 return MATCH_ERROR;
10777 m = gfc_match_name (name);
10778 if (m == MATCH_NO)
10780 gfc_error ("Expected module procedure name at %C");
10781 return MATCH_ERROR;
10783 else if (m != MATCH_YES)
10784 return MATCH_ERROR;
10786 if (gfc_match_eos () == MATCH_YES)
10787 last = true;
10788 if (!last && gfc_match_char (',') != MATCH_YES)
10790 gfc_error ("Expected %<,%> at %C");
10791 return MATCH_ERROR;
10794 if (gfc_get_symbol (name, module_ns, &sym))
10796 gfc_error ("Unknown procedure name %qs at %C", name);
10797 return MATCH_ERROR;
10800 /* Mark the symbol as module procedure. */
10801 if (sym->attr.proc != PROC_MODULE
10802 && !gfc_add_procedure (&sym->attr, PROC_MODULE, sym->name, NULL))
10803 return MATCH_ERROR;
10805 /* Check if we already have this symbol in the list, this is an error. */
10806 for (f = block->f2k_derived->finalizers; f; f = f->next)
10807 if (f->proc_sym == sym)
10809 gfc_error ("%qs at %C is already defined as FINAL procedure",
10810 name);
10811 return MATCH_ERROR;
10814 /* Add this symbol to the list of finalizers. */
10815 gcc_assert (block->f2k_derived);
10816 sym->refs++;
10817 f = XCNEW (gfc_finalizer);
10818 f->proc_sym = sym;
10819 f->proc_tree = NULL;
10820 f->where = gfc_current_locus;
10821 f->next = block->f2k_derived->finalizers;
10822 block->f2k_derived->finalizers = f;
10824 first = false;
10826 while (!last);
10828 return MATCH_YES;
10832 const ext_attr_t ext_attr_list[] = {
10833 { "dllimport", EXT_ATTR_DLLIMPORT, "dllimport" },
10834 { "dllexport", EXT_ATTR_DLLEXPORT, "dllexport" },
10835 { "cdecl", EXT_ATTR_CDECL, "cdecl" },
10836 { "stdcall", EXT_ATTR_STDCALL, "stdcall" },
10837 { "fastcall", EXT_ATTR_FASTCALL, "fastcall" },
10838 { "no_arg_check", EXT_ATTR_NO_ARG_CHECK, NULL },
10839 { NULL, EXT_ATTR_LAST, NULL }
10842 /* Match a !GCC$ ATTRIBUTES statement of the form:
10843 !GCC$ ATTRIBUTES attribute-list :: var-name [, var-name] ...
10844 When we come here, we have already matched the !GCC$ ATTRIBUTES string.
10846 TODO: We should support all GCC attributes using the same syntax for
10847 the attribute list, i.e. the list in C
10848 __attributes(( attribute-list ))
10849 matches then
10850 !GCC$ ATTRIBUTES attribute-list ::
10851 Cf. c-parser.c's c_parser_attributes; the data can then directly be
10852 saved into a TREE.
10854 As there is absolutely no risk of confusion, we should never return
10855 MATCH_NO. */
10856 match
10857 gfc_match_gcc_attributes (void)
10859 symbol_attribute attr;
10860 char name[GFC_MAX_SYMBOL_LEN + 1];
10861 unsigned id;
10862 gfc_symbol *sym;
10863 match m;
10865 gfc_clear_attr (&attr);
10866 for(;;)
10868 char ch;
10870 if (gfc_match_name (name) != MATCH_YES)
10871 return MATCH_ERROR;
10873 for (id = 0; id < EXT_ATTR_LAST; id++)
10874 if (strcmp (name, ext_attr_list[id].name) == 0)
10875 break;
10877 if (id == EXT_ATTR_LAST)
10879 gfc_error ("Unknown attribute in !GCC$ ATTRIBUTES statement at %C");
10880 return MATCH_ERROR;
10883 if (!gfc_add_ext_attribute (&attr, (ext_attr_id_t)id, &gfc_current_locus))
10884 return MATCH_ERROR;
10886 gfc_gobble_whitespace ();
10887 ch = gfc_next_ascii_char ();
10888 if (ch == ':')
10890 /* This is the successful exit condition for the loop. */
10891 if (gfc_next_ascii_char () == ':')
10892 break;
10895 if (ch == ',')
10896 continue;
10898 goto syntax;
10901 if (gfc_match_eos () == MATCH_YES)
10902 goto syntax;
10904 for(;;)
10906 m = gfc_match_name (name);
10907 if (m != MATCH_YES)
10908 return m;
10910 if (find_special (name, &sym, true))
10911 return MATCH_ERROR;
10913 sym->attr.ext_attr |= attr.ext_attr;
10915 if (gfc_match_eos () == MATCH_YES)
10916 break;
10918 if (gfc_match_char (',') != MATCH_YES)
10919 goto syntax;
10922 return MATCH_YES;
10924 syntax:
10925 gfc_error ("Syntax error in !GCC$ ATTRIBUTES statement at %C");
10926 return MATCH_ERROR;