1 /* Declaration statement matcher
2    Copyright (C) 2002-2013 Free Software Foundation, Inc.
3    Contributed by Andy Vaught
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11 
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20 
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "gfortran.h"
25 #include "match.h"
26 #include "parse.h"
27 #include "flags.h"
28 #include "constructor.h"
29 #include "tree.h"
30 
31 /* Macros to access allocate memory for gfc_data_variable,
32    gfc_data_value and gfc_data.  */
33 #define gfc_get_data_variable() XCNEW (gfc_data_variable)
34 #define gfc_get_data_value() XCNEW (gfc_data_value)
35 #define gfc_get_data() XCNEW (gfc_data)
36 
37 
38 static gfc_try set_binding_label (const char **, const char *, int);
39 
40 
41 /* This flag is set if an old-style length selector is matched
42    during a type-declaration statement.  */
43 
44 static int old_char_selector;
45 
46 /* When variables acquire types and attributes from a declaration
47    statement, they get them from the following static variables.  The
48    first part of a declaration sets these variables and the second
49    part copies these into symbol structures.  */
50 
51 static gfc_typespec current_ts;
52 
53 static symbol_attribute current_attr;
54 static gfc_array_spec *current_as;
55 static int colon_seen;
56 
57 /* The current binding label (if any).  */
58 static const char* curr_binding_label;
59 /* Need to know how many identifiers are on the current data declaration
60    line in case we're given the BIND(C) attribute with a NAME= specifier.  */
61 static int num_idents_on_line;
62 /* Need to know if a NAME= specifier was found during gfc_match_bind_c so we
63    can supply a name if the curr_binding_label is nil and NAME= was not.  */
64 static int has_name_equals = 0;
65 
66 /* Initializer of the previous enumerator.  */
67 
68 static gfc_expr *last_initializer;
69 
70 /* History of all the enumerators is maintained, so that
71    kind values of all the enumerators could be updated depending
72    upon the maximum initialized value.  */
73 
74 typedef struct enumerator_history
75 {
76   gfc_symbol *sym;
77   gfc_expr *initializer;
78   struct enumerator_history *next;
79 }
80 enumerator_history;
81 
82 /* Header of enum history chain.  */
83 
84 static enumerator_history *enum_history = NULL;
85 
86 /* Pointer of enum history node containing largest initializer.  */
87 
88 static enumerator_history *max_enum = NULL;
89 
90 /* gfc_new_block points to the symbol of a newly matched block.  */
91 
92 gfc_symbol *gfc_new_block;
93 
94 bool gfc_matching_function;
95 
96 
97 /********************* DATA statement subroutines *********************/
98 
99 static bool in_match_data = false;
100 
101 bool
gfc_in_match_data(void)102 gfc_in_match_data (void)
103 {
104   return in_match_data;
105 }
106 
107 static void
set_in_match_data(bool set_value)108 set_in_match_data (bool set_value)
109 {
110   in_match_data = set_value;
111 }
112 
113 /* Free a gfc_data_variable structure and everything beneath it.  */
114 
115 static void
free_variable(gfc_data_variable * p)116 free_variable (gfc_data_variable *p)
117 {
118   gfc_data_variable *q;
119 
120   for (; p; p = q)
121     {
122       q = p->next;
123       gfc_free_expr (p->expr);
124       gfc_free_iterator (&p->iter, 0);
125       free_variable (p->list);
126       free (p);
127     }
128 }
129 
130 
131 /* Free a gfc_data_value structure and everything beneath it.  */
132 
133 static void
free_value(gfc_data_value * p)134 free_value (gfc_data_value *p)
135 {
136   gfc_data_value *q;
137 
138   for (; p; p = q)
139     {
140       q = p->next;
141       mpz_clear (p->repeat);
142       gfc_free_expr (p->expr);
143       free (p);
144     }
145 }
146 
147 
148 /* Free a list of gfc_data structures.  */
149 
150 void
gfc_free_data(gfc_data * p)151 gfc_free_data (gfc_data *p)
152 {
153   gfc_data *q;
154 
155   for (; p; p = q)
156     {
157       q = p->next;
158       free_variable (p->var);
159       free_value (p->value);
160       free (p);
161     }
162 }
163 
164 
165 /* Free all data in a namespace.  */
166 
167 static void
gfc_free_data_all(gfc_namespace * ns)168 gfc_free_data_all (gfc_namespace *ns)
169 {
170   gfc_data *d;
171 
172   for (;ns->data;)
173     {
174       d = ns->data->next;
175       free (ns->data);
176       ns->data = d;
177     }
178 }
179 
180 
181 static match var_element (gfc_data_variable *);
182 
183 /* Match a list of variables terminated by an iterator and a right
184    parenthesis.  */
185 
186 static match
var_list(gfc_data_variable * parent)187 var_list (gfc_data_variable *parent)
188 {
189   gfc_data_variable *tail, var;
190   match m;
191 
192   m = var_element (&var);
193   if (m == MATCH_ERROR)
194     return MATCH_ERROR;
195   if (m == MATCH_NO)
196     goto syntax;
197 
198   tail = gfc_get_data_variable ();
199   *tail = var;
200 
201   parent->list = tail;
202 
203   for (;;)
204     {
205       if (gfc_match_char (',') != MATCH_YES)
206 	goto syntax;
207 
208       m = gfc_match_iterator (&parent->iter, 1);
209       if (m == MATCH_YES)
210 	break;
211       if (m == MATCH_ERROR)
212 	return MATCH_ERROR;
213 
214       m = var_element (&var);
215       if (m == MATCH_ERROR)
216 	return MATCH_ERROR;
217       if (m == MATCH_NO)
218 	goto syntax;
219 
220       tail->next = gfc_get_data_variable ();
221       tail = tail->next;
222 
223       *tail = var;
224     }
225 
226   if (gfc_match_char (')') != MATCH_YES)
227     goto syntax;
228   return MATCH_YES;
229 
230 syntax:
231   gfc_syntax_error (ST_DATA);
232   return MATCH_ERROR;
233 }
234 
235 
236 /* Match a single element in a data variable list, which can be a
237    variable-iterator list.  */
238 
239 static match
var_element(gfc_data_variable * new_var)240 var_element (gfc_data_variable *new_var)
241 {
242   match m;
243   gfc_symbol *sym;
244 
245   memset (new_var, 0, sizeof (gfc_data_variable));
246 
247   if (gfc_match_char ('(') == MATCH_YES)
248     return var_list (new_var);
249 
250   m = gfc_match_variable (&new_var->expr, 0);
251   if (m != MATCH_YES)
252     return m;
253 
254   sym = new_var->expr->symtree->n.sym;
255 
256   /* Symbol should already have an associated type.  */
257   if (gfc_check_symbol_typed (sym, gfc_current_ns,
258 			      false, gfc_current_locus) == FAILURE)
259     return MATCH_ERROR;
260 
261   if (!sym->attr.function && gfc_current_ns->parent
262       && gfc_current_ns->parent == sym->ns)
263     {
264       gfc_error ("Host associated variable '%s' may not be in the DATA "
265 		 "statement at %C", sym->name);
266       return MATCH_ERROR;
267     }
268 
269   if (gfc_current_state () != COMP_BLOCK_DATA
270       && sym->attr.in_common
271       && gfc_notify_std (GFC_STD_GNU, "initialization of "
272 			 "common block variable '%s' in DATA statement at %C",
273 			 sym->name) == FAILURE)
274     return MATCH_ERROR;
275 
276   if (gfc_add_data (&sym->attr, sym->name, &new_var->expr->where) == FAILURE)
277     return MATCH_ERROR;
278 
279   return MATCH_YES;
280 }
281 
282 
283 /* Match the top-level list of data variables.  */
284 
285 static match
top_var_list(gfc_data * d)286 top_var_list (gfc_data *d)
287 {
288   gfc_data_variable var, *tail, *new_var;
289   match m;
290 
291   tail = NULL;
292 
293   for (;;)
294     {
295       m = var_element (&var);
296       if (m == MATCH_NO)
297 	goto syntax;
298       if (m == MATCH_ERROR)
299 	return MATCH_ERROR;
300 
301       new_var = gfc_get_data_variable ();
302       *new_var = var;
303 
304       if (tail == NULL)
305 	d->var = new_var;
306       else
307 	tail->next = new_var;
308 
309       tail = new_var;
310 
311       if (gfc_match_char ('/') == MATCH_YES)
312 	break;
313       if (gfc_match_char (',') != MATCH_YES)
314 	goto syntax;
315     }
316 
317   return MATCH_YES;
318 
319 syntax:
320   gfc_syntax_error (ST_DATA);
321   gfc_free_data_all (gfc_current_ns);
322   return MATCH_ERROR;
323 }
324 
325 
326 static match
match_data_constant(gfc_expr ** result)327 match_data_constant (gfc_expr **result)
328 {
329   char name[GFC_MAX_SYMBOL_LEN + 1];
330   gfc_symbol *sym, *dt_sym = NULL;
331   gfc_expr *expr;
332   match m;
333   locus old_loc;
334 
335   m = gfc_match_literal_constant (&expr, 1);
336   if (m == MATCH_YES)
337     {
338       *result = expr;
339       return MATCH_YES;
340     }
341 
342   if (m == MATCH_ERROR)
343     return MATCH_ERROR;
344 
345   m = gfc_match_null (result);
346   if (m != MATCH_NO)
347     return m;
348 
349   old_loc = gfc_current_locus;
350 
351   /* Should this be a structure component, try to match it
352      before matching a name.  */
353   m = gfc_match_rvalue (result);
354   if (m == MATCH_ERROR)
355     return m;
356 
357   if (m == MATCH_YES && (*result)->expr_type == EXPR_STRUCTURE)
358     {
359       if (gfc_simplify_expr (*result, 0) == FAILURE)
360 	m = MATCH_ERROR;
361       return m;
362     }
363   else if (m == MATCH_YES)
364     gfc_free_expr (*result);
365 
366   gfc_current_locus = old_loc;
367 
368   m = gfc_match_name (name);
369   if (m != MATCH_YES)
370     return m;
371 
372   if (gfc_find_symbol (name, NULL, 1, &sym))
373     return MATCH_ERROR;
374 
375   if (sym && sym->attr.generic)
376     dt_sym = gfc_find_dt_in_generic (sym);
377 
378   if (sym == NULL
379       || (sym->attr.flavor != FL_PARAMETER
380 	  && (!dt_sym || dt_sym->attr.flavor != FL_DERIVED)))
381     {
382       gfc_error ("Symbol '%s' must be a PARAMETER in DATA statement at %C",
383 		 name);
384       return MATCH_ERROR;
385     }
386   else if (dt_sym && dt_sym->attr.flavor == FL_DERIVED)
387     return gfc_match_structure_constructor (dt_sym, result);
388 
389   /* Check to see if the value is an initialization array expression.  */
390   if (sym->value->expr_type == EXPR_ARRAY)
391     {
392       gfc_current_locus = old_loc;
393 
394       m = gfc_match_init_expr (result);
395       if (m == MATCH_ERROR)
396 	return m;
397 
398       if (m == MATCH_YES)
399 	{
400 	  if (gfc_simplify_expr (*result, 0) == FAILURE)
401 	    m = MATCH_ERROR;
402 
403 	  if ((*result)->expr_type == EXPR_CONSTANT)
404 	    return m;
405           else
406 	    {
407 	      gfc_error ("Invalid initializer %s in Data statement at %C", name);
408 	      return MATCH_ERROR;
409 	    }
410 	}
411     }
412 
413   *result = gfc_copy_expr (sym->value);
414   return MATCH_YES;
415 }
416 
417 
418 /* Match a list of values in a DATA statement.  The leading '/' has
419    already been seen at this point.  */
420 
421 static match
top_val_list(gfc_data * data)422 top_val_list (gfc_data *data)
423 {
424   gfc_data_value *new_val, *tail;
425   gfc_expr *expr;
426   match m;
427 
428   tail = NULL;
429 
430   for (;;)
431     {
432       m = match_data_constant (&expr);
433       if (m == MATCH_NO)
434 	goto syntax;
435       if (m == MATCH_ERROR)
436 	return MATCH_ERROR;
437 
438       new_val = gfc_get_data_value ();
439       mpz_init (new_val->repeat);
440 
441       if (tail == NULL)
442 	data->value = new_val;
443       else
444 	tail->next = new_val;
445 
446       tail = new_val;
447 
448       if (expr->ts.type != BT_INTEGER || gfc_match_char ('*') != MATCH_YES)
449 	{
450 	  tail->expr = expr;
451 	  mpz_set_ui (tail->repeat, 1);
452 	}
453       else
454 	{
455 	  mpz_set (tail->repeat, expr->value.integer);
456 	  gfc_free_expr (expr);
457 
458 	  m = match_data_constant (&tail->expr);
459 	  if (m == MATCH_NO)
460 	    goto syntax;
461 	  if (m == MATCH_ERROR)
462 	    return MATCH_ERROR;
463 	}
464 
465       if (gfc_match_char ('/') == MATCH_YES)
466 	break;
467       if (gfc_match_char (',') == MATCH_NO)
468 	goto syntax;
469     }
470 
471   return MATCH_YES;
472 
473 syntax:
474   gfc_syntax_error (ST_DATA);
475   gfc_free_data_all (gfc_current_ns);
476   return MATCH_ERROR;
477 }
478 
479 
480 /* Matches an old style initialization.  */
481 
482 static match
match_old_style_init(const char * name)483 match_old_style_init (const char *name)
484 {
485   match m;
486   gfc_symtree *st;
487   gfc_symbol *sym;
488   gfc_data *newdata;
489 
490   /* Set up data structure to hold initializers.  */
491   gfc_find_sym_tree (name, NULL, 0, &st);
492   sym = st->n.sym;
493 
494   newdata = gfc_get_data ();
495   newdata->var = gfc_get_data_variable ();
496   newdata->var->expr = gfc_get_variable_expr (st);
497   newdata->where = gfc_current_locus;
498 
499   /* Match initial value list. This also eats the terminal '/'.  */
500   m = top_val_list (newdata);
501   if (m != MATCH_YES)
502     {
503       free (newdata);
504       return m;
505     }
506 
507   if (gfc_pure (NULL))
508     {
509       gfc_error ("Initialization at %C is not allowed in a PURE procedure");
510       free (newdata);
511       return MATCH_ERROR;
512     }
513 
514   if (gfc_implicit_pure (NULL))
515     gfc_current_ns->proc_name->attr.implicit_pure = 0;
516 
517   /* Mark the variable as having appeared in a data statement.  */
518   if (gfc_add_data (&sym->attr, sym->name, &sym->declared_at) == FAILURE)
519     {
520       free (newdata);
521       return MATCH_ERROR;
522     }
523 
524   /* Chain in namespace list of DATA initializers.  */
525   newdata->next = gfc_current_ns->data;
526   gfc_current_ns->data = newdata;
527 
528   return m;
529 }
530 
531 
532 /* Match the stuff following a DATA statement. If ERROR_FLAG is set,
533    we are matching a DATA statement and are therefore issuing an error
534    if we encounter something unexpected, if not, we're trying to match
535    an old-style initialization expression of the form INTEGER I /2/.  */
536 
537 match
gfc_match_data(void)538 gfc_match_data (void)
539 {
540   gfc_data *new_data;
541   match m;
542 
543   set_in_match_data (true);
544 
545   for (;;)
546     {
547       new_data = gfc_get_data ();
548       new_data->where = gfc_current_locus;
549 
550       m = top_var_list (new_data);
551       if (m != MATCH_YES)
552 	goto cleanup;
553 
554       m = top_val_list (new_data);
555       if (m != MATCH_YES)
556 	goto cleanup;
557 
558       new_data->next = gfc_current_ns->data;
559       gfc_current_ns->data = new_data;
560 
561       if (gfc_match_eos () == MATCH_YES)
562 	break;
563 
564       gfc_match_char (',');	/* Optional comma */
565     }
566 
567   set_in_match_data (false);
568 
569   if (gfc_pure (NULL))
570     {
571       gfc_error ("DATA statement at %C is not allowed in a PURE procedure");
572       return MATCH_ERROR;
573     }
574 
575   if (gfc_implicit_pure (NULL))
576     gfc_current_ns->proc_name->attr.implicit_pure = 0;
577 
578   return MATCH_YES;
579 
580 cleanup:
581   set_in_match_data (false);
582   gfc_free_data (new_data);
583   return MATCH_ERROR;
584 }
585 
586 
587 /************************ Declaration statements *********************/
588 
589 
590 /* Auxiliary function to merge DIMENSION and CODIMENSION array specs.  */
591 
592 static gfc_try
merge_array_spec(gfc_array_spec * from,gfc_array_spec * to,bool copy)593 merge_array_spec (gfc_array_spec *from, gfc_array_spec *to, bool copy)
594 {
595   int i;
596 
597   if ((from->type == AS_ASSUMED_RANK && to->corank)
598       || (to->type == AS_ASSUMED_RANK && from->corank))
599     {
600       gfc_error ("The assumed-rank array at %C shall not have a codimension");
601       return FAILURE;
602     }
603 
604   if (to->rank == 0 && from->rank > 0)
605     {
606       to->rank = from->rank;
607       to->type = from->type;
608       to->cray_pointee = from->cray_pointee;
609       to->cp_was_assumed = from->cp_was_assumed;
610 
611       for (i = 0; i < to->corank; i++)
612 	{
613 	  to->lower[from->rank + i] = to->lower[i];
614 	  to->upper[from->rank + i] = to->upper[i];
615 	}
616       for (i = 0; i < from->rank; i++)
617 	{
618 	  if (copy)
619 	    {
620 	      to->lower[i] = gfc_copy_expr (from->lower[i]);
621 	      to->upper[i] = gfc_copy_expr (from->upper[i]);
622 	    }
623 	  else
624 	    {
625 	      to->lower[i] = from->lower[i];
626 	      to->upper[i] = from->upper[i];
627 	    }
628 	}
629     }
630   else if (to->corank == 0 && from->corank > 0)
631     {
632       to->corank = from->corank;
633       to->cotype = from->cotype;
634 
635       for (i = 0; i < from->corank; i++)
636 	{
637 	  if (copy)
638 	    {
639 	      to->lower[to->rank + i] = gfc_copy_expr (from->lower[i]);
640 	      to->upper[to->rank + i] = gfc_copy_expr (from->upper[i]);
641 	    }
642 	  else
643 	    {
644 	      to->lower[to->rank + i] = from->lower[i];
645 	      to->upper[to->rank + i] = from->upper[i];
646 	    }
647 	}
648     }
649 
650   return SUCCESS;
651 }
652 
653 
654 /* Match an intent specification.  Since this can only happen after an
655    INTENT word, a legal intent-spec must follow.  */
656 
657 static sym_intent
match_intent_spec(void)658 match_intent_spec (void)
659 {
660 
661   if (gfc_match (" ( in out )") == MATCH_YES)
662     return INTENT_INOUT;
663   if (gfc_match (" ( in )") == MATCH_YES)
664     return INTENT_IN;
665   if (gfc_match (" ( out )") == MATCH_YES)
666     return INTENT_OUT;
667 
668   gfc_error ("Bad INTENT specification at %C");
669   return INTENT_UNKNOWN;
670 }
671 
672 
673 /* Matches a character length specification, which is either a
674    specification expression, '*', or ':'.  */
675 
676 static match
char_len_param_value(gfc_expr ** expr,bool * deferred)677 char_len_param_value (gfc_expr **expr, bool *deferred)
678 {
679   match m;
680 
681   *expr = NULL;
682   *deferred = false;
683 
684   if (gfc_match_char ('*') == MATCH_YES)
685     return MATCH_YES;
686 
687   if (gfc_match_char (':') == MATCH_YES)
688     {
689       if (gfc_notify_std (GFC_STD_F2003, "deferred type "
690 			  "parameter at %C") == FAILURE)
691 	return MATCH_ERROR;
692 
693       *deferred = true;
694 
695       return MATCH_YES;
696     }
697 
698   m = gfc_match_expr (expr);
699 
700   if (m == MATCH_YES
701       && gfc_expr_check_typed (*expr, gfc_current_ns, false) == FAILURE)
702     return MATCH_ERROR;
703 
704   if (m == MATCH_YES && (*expr)->expr_type == EXPR_FUNCTION)
705     {
706       if ((*expr)->value.function.actual
707 	  && (*expr)->value.function.actual->expr->symtree)
708 	{
709 	  gfc_expr *e;
710 	  e = (*expr)->value.function.actual->expr;
711 	  if (e->symtree->n.sym->attr.flavor == FL_PROCEDURE
712 	      && e->expr_type == EXPR_VARIABLE)
713 	    {
714 	      if (e->symtree->n.sym->ts.type == BT_UNKNOWN)
715 		goto syntax;
716 	      if (e->symtree->n.sym->ts.type == BT_CHARACTER
717 		  && e->symtree->n.sym->ts.u.cl
718 		  && e->symtree->n.sym->ts.u.cl->length->ts.type == BT_UNKNOWN)
719 	        goto syntax;
720 	    }
721 	}
722     }
723   return m;
724 
725 syntax:
726   gfc_error ("Conflict in attributes of function argument at %C");
727   return MATCH_ERROR;
728 }
729 
730 
731 /* A character length is a '*' followed by a literal integer or a
732    char_len_param_value in parenthesis.  */
733 
734 static match
match_char_length(gfc_expr ** expr,bool * deferred,bool obsolescent_check)735 match_char_length (gfc_expr **expr, bool *deferred, bool obsolescent_check)
736 {
737   int length;
738   match m;
739 
740   *deferred = false;
741   m = gfc_match_char ('*');
742   if (m != MATCH_YES)
743     return m;
744 
745   m = gfc_match_small_literal_int (&length, NULL);
746   if (m == MATCH_ERROR)
747     return m;
748 
749   if (m == MATCH_YES)
750     {
751       if (obsolescent_check
752 	  && gfc_notify_std (GFC_STD_F95_OBS,
753 			     "Old-style character length at %C") == FAILURE)
754 	return MATCH_ERROR;
755       *expr = gfc_get_int_expr (gfc_default_integer_kind, NULL, length);
756       return m;
757     }
758 
759   if (gfc_match_char ('(') == MATCH_NO)
760     goto syntax;
761 
762   m = char_len_param_value (expr, deferred);
763   if (m != MATCH_YES && gfc_matching_function)
764     {
765       gfc_undo_symbols ();
766       m = MATCH_YES;
767     }
768 
769   if (m == MATCH_ERROR)
770     return m;
771   if (m == MATCH_NO)
772     goto syntax;
773 
774   if (gfc_match_char (')') == MATCH_NO)
775     {
776       gfc_free_expr (*expr);
777       *expr = NULL;
778       goto syntax;
779     }
780 
781   return MATCH_YES;
782 
783 syntax:
784   gfc_error ("Syntax error in character length specification at %C");
785   return MATCH_ERROR;
786 }
787 
788 
789 /* Special subroutine for finding a symbol.  Check if the name is found
790    in the current name space.  If not, and we're compiling a function or
791    subroutine and the parent compilation unit is an interface, then check
792    to see if the name we've been given is the name of the interface
793    (located in another namespace).  */
794 
795 static int
find_special(const char * name,gfc_symbol ** result,bool allow_subroutine)796 find_special (const char *name, gfc_symbol **result, bool allow_subroutine)
797 {
798   gfc_state_data *s;
799   gfc_symtree *st;
800   int i;
801 
802   i = gfc_get_sym_tree (name, NULL, &st, allow_subroutine);
803   if (i == 0)
804     {
805       *result = st ? st->n.sym : NULL;
806       goto end;
807     }
808 
809   if (gfc_current_state () != COMP_SUBROUTINE
810       && gfc_current_state () != COMP_FUNCTION)
811     goto end;
812 
813   s = gfc_state_stack->previous;
814   if (s == NULL)
815     goto end;
816 
817   if (s->state != COMP_INTERFACE)
818     goto end;
819   if (s->sym == NULL)
820     goto end;		  /* Nameless interface.  */
821 
822   if (strcmp (name, s->sym->name) == 0)
823     {
824       *result = s->sym;
825       return 0;
826     }
827 
828 end:
829   return i;
830 }
831 
832 
833 /* Special subroutine for getting a symbol node associated with a
834    procedure name, used in SUBROUTINE and FUNCTION statements.  The
835    symbol is created in the parent using with symtree node in the
836    child unit pointing to the symbol.  If the current namespace has no
837    parent, then the symbol is just created in the current unit.  */
838 
839 static int
get_proc_name(const char * name,gfc_symbol ** result,bool module_fcn_entry)840 get_proc_name (const char *name, gfc_symbol **result, bool module_fcn_entry)
841 {
842   gfc_symtree *st;
843   gfc_symbol *sym;
844   int rc = 0;
845 
846   /* Module functions have to be left in their own namespace because
847      they have potentially (almost certainly!) already been referenced.
848      In this sense, they are rather like external functions.  This is
849      fixed up in resolve.c(resolve_entries), where the symbol name-
850      space is set to point to the master function, so that the fake
851      result mechanism can work.  */
852   if (module_fcn_entry)
853     {
854       /* Present if entry is declared to be a module procedure.  */
855       rc = gfc_find_symbol (name, gfc_current_ns->parent, 0, result);
856 
857       if (*result == NULL)
858 	rc = gfc_get_symbol (name, NULL, result);
859       else if (!gfc_get_symbol (name, NULL, &sym) && sym
860 		 && (*result)->ts.type == BT_UNKNOWN
861 		 && sym->attr.flavor == FL_UNKNOWN)
862 	/* Pick up the typespec for the entry, if declared in the function
863 	   body.  Note that this symbol is FL_UNKNOWN because it will
864 	   only have appeared in a type declaration.  The local symtree
865 	   is set to point to the module symbol and a unique symtree
866 	   to the local version.  This latter ensures a correct clearing
867 	   of the symbols.  */
868 	{
869 	  /* If the ENTRY proceeds its specification, we need to ensure
870 	     that this does not raise a "has no IMPLICIT type" error.  */
871 	  if (sym->ts.type == BT_UNKNOWN)
872 	    sym->attr.untyped = 1;
873 
874 	  (*result)->ts = sym->ts;
875 
876 	  /* Put the symbol in the procedure namespace so that, should
877 	     the ENTRY precede its specification, the specification
878 	     can be applied.  */
879 	  (*result)->ns = gfc_current_ns;
880 
881 	  gfc_find_sym_tree (name, gfc_current_ns, 0, &st);
882 	  st->n.sym = *result;
883 	  st = gfc_get_unique_symtree (gfc_current_ns);
884 	  st->n.sym = sym;
885 	}
886     }
887   else
888     rc = gfc_get_symbol (name, gfc_current_ns->parent, result);
889 
890   if (rc)
891     return rc;
892 
893   sym = *result;
894 
895   if (sym && !sym->gfc_new && gfc_current_state () != COMP_INTERFACE)
896     {
897       /* Trap another encompassed procedure with the same name.  All
898 	 these conditions are necessary to avoid picking up an entry
899 	 whose name clashes with that of the encompassing procedure;
900 	 this is handled using gsymbols to register unique,globally
901 	 accessible names.  */
902       if (sym->attr.flavor != 0
903 	  && sym->attr.proc != 0
904 	  && (sym->attr.subroutine || sym->attr.function)
905 	  && sym->attr.if_source != IFSRC_UNKNOWN)
906 	gfc_error_now ("Procedure '%s' at %C is already defined at %L",
907 		       name, &sym->declared_at);
908 
909       /* Trap a procedure with a name the same as interface in the
910 	 encompassing scope.  */
911       if (sym->attr.generic != 0
912 	  && (sym->attr.subroutine || sym->attr.function)
913 	  && !sym->attr.mod_proc)
914 	gfc_error_now ("Name '%s' at %C is already defined"
915 		       " as a generic interface at %L",
916 		       name, &sym->declared_at);
917 
918       /* Trap declarations of attributes in encompassing scope.  The
919 	 signature for this is that ts.kind is set.  Legitimate
920 	 references only set ts.type.  */
921       if (sym->ts.kind != 0
922 	  && !sym->attr.implicit_type
923 	  && sym->attr.proc == 0
924 	  && gfc_current_ns->parent != NULL
925 	  && sym->attr.access == 0
926 	  && !module_fcn_entry)
927 	gfc_error_now ("Procedure '%s' at %C has an explicit interface "
928 		       "and must not have attributes declared at %L",
929 		       name, &sym->declared_at);
930     }
931 
932   if (gfc_current_ns->parent == NULL || *result == NULL)
933     return rc;
934 
935   /* Module function entries will already have a symtree in
936      the current namespace but will need one at module level.  */
937   if (module_fcn_entry)
938     {
939       /* Present if entry is declared to be a module procedure.  */
940       rc = gfc_find_sym_tree (name, gfc_current_ns->parent, 0, &st);
941       if (st == NULL)
942 	st = gfc_new_symtree (&gfc_current_ns->parent->sym_root, name);
943     }
944   else
945     st = gfc_new_symtree (&gfc_current_ns->sym_root, name);
946 
947   st->n.sym = sym;
948   sym->refs++;
949 
950   /* See if the procedure should be a module procedure.  */
951 
952   if (((sym->ns->proc_name != NULL
953 		&& sym->ns->proc_name->attr.flavor == FL_MODULE
954 		&& sym->attr.proc != PROC_MODULE)
955 	    || (module_fcn_entry && sym->attr.proc != PROC_MODULE))
956 	&& gfc_add_procedure (&sym->attr, PROC_MODULE,
957 			      sym->name, NULL) == FAILURE)
958     rc = 2;
959 
960   return rc;
961 }
962 
963 
964 /* Verify that the given symbol representing a parameter is C
965    interoperable, by checking to see if it was marked as such after
966    its declaration.  If the given symbol is not interoperable, a
967    warning is reported, thus removing the need to return the status to
968    the calling function.  The standard does not require the user use
969    one of the iso_c_binding named constants to declare an
970    interoperable parameter, but we can't be sure if the param is C
971    interop or not if the user doesn't.  For example, integer(4) may be
972    legal Fortran, but doesn't have meaning in C.  It may interop with
973    a number of the C types, which causes a problem because the
974    compiler can't know which one.  This code is almost certainly not
975    portable, and the user will get what they deserve if the C type
976    across platforms isn't always interoperable with integer(4).  If
977    the user had used something like integer(c_int) or integer(c_long),
978    the compiler could have automatically handled the varying sizes
979    across platforms.  */
980 
981 gfc_try
gfc_verify_c_interop_param(gfc_symbol * sym)982 gfc_verify_c_interop_param (gfc_symbol *sym)
983 {
984   int is_c_interop = 0;
985   gfc_try retval = SUCCESS;
986 
987   /* We check implicitly typed variables in symbol.c:gfc_set_default_type().
988      Don't repeat the checks here.  */
989   if (sym->attr.implicit_type)
990     return SUCCESS;
991 
992   /* For subroutines or functions that are passed to a BIND(C) procedure,
993      they're interoperable if they're BIND(C) and their params are all
994      interoperable.  */
995   if (sym->attr.flavor == FL_PROCEDURE)
996     {
997       if (sym->attr.is_bind_c == 0)
998         {
999           gfc_error_now ("Procedure '%s' at %L must have the BIND(C) "
1000                          "attribute to be C interoperable", sym->name,
1001                          &(sym->declared_at));
1002 
1003           return FAILURE;
1004         }
1005       else
1006         {
1007           if (sym->attr.is_c_interop == 1)
1008             /* We've already checked this procedure; don't check it again.  */
1009             return SUCCESS;
1010           else
1011             return verify_bind_c_sym (sym, &(sym->ts), sym->attr.in_common,
1012                                       sym->common_block);
1013         }
1014     }
1015 
1016   /* See if we've stored a reference to a procedure that owns sym.  */
1017   if (sym->ns != NULL && sym->ns->proc_name != NULL)
1018     {
1019       if (sym->ns->proc_name->attr.is_bind_c == 1)
1020 	{
1021 	  is_c_interop = (gfc_verify_c_interop (&(sym->ts)) == SUCCESS ? 1 : 0);
1022 
1023 	  if (is_c_interop != 1)
1024 	    {
1025 	      /* Make personalized messages to give better feedback.  */
1026 	      if (sym->ts.type == BT_DERIVED)
1027 		gfc_error ("Variable '%s' at %L is a dummy argument to the "
1028 			   "BIND(C) procedure '%s' but is not C interoperable "
1029 			   "because derived type '%s' is not C interoperable",
1030 			   sym->name, &(sym->declared_at),
1031 			   sym->ns->proc_name->name,
1032 			   sym->ts.u.derived->name);
1033 	      else if (sym->ts.type == BT_CLASS)
1034 		gfc_error ("Variable '%s' at %L is a dummy argument to the "
1035 			   "BIND(C) procedure '%s' but is not C interoperable "
1036 			   "because it is polymorphic",
1037 			   sym->name, &(sym->declared_at),
1038 			   sym->ns->proc_name->name);
1039 	      else if (gfc_option.warn_c_binding_type)
1040 		gfc_warning ("Variable '%s' at %L is a dummy argument of the "
1041 			     "BIND(C) procedure '%s' but may not be C "
1042 			     "interoperable",
1043 			     sym->name, &(sym->declared_at),
1044 			     sym->ns->proc_name->name);
1045 	    }
1046 
1047           /* Character strings are only C interoperable if they have a
1048              length of 1.  */
1049           if (sym->ts.type == BT_CHARACTER)
1050 	    {
1051 	      gfc_charlen *cl = sym->ts.u.cl;
1052 	      if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT
1053                   || mpz_cmp_si (cl->length->value.integer, 1) != 0)
1054 		{
1055 		  gfc_error ("Character argument '%s' at %L "
1056 			     "must be length 1 because "
1057                              "procedure '%s' is BIND(C)",
1058 			     sym->name, &sym->declared_at,
1059                              sym->ns->proc_name->name);
1060 		  retval = FAILURE;
1061 		}
1062 	    }
1063 
1064 	  /* We have to make sure that any param to a bind(c) routine does
1065 	     not have the allocatable, pointer, or optional attributes,
1066 	     according to J3/04-007, section 5.1.  */
1067 	  if (sym->attr.allocatable == 1)
1068 	    {
1069 	      gfc_error ("Variable '%s' at %L cannot have the "
1070 			 "ALLOCATABLE attribute because procedure '%s'"
1071 			 " is BIND(C)", sym->name, &(sym->declared_at),
1072 			 sym->ns->proc_name->name);
1073 	      retval = FAILURE;
1074 	    }
1075 
1076 	  if (sym->attr.pointer == 1)
1077 	    {
1078 	      gfc_error ("Variable '%s' at %L cannot have the "
1079 			 "POINTER attribute because procedure '%s'"
1080 			 " is BIND(C)", sym->name, &(sym->declared_at),
1081 			 sym->ns->proc_name->name);
1082 	      retval = FAILURE;
1083 	    }
1084 
1085 	  if (sym->attr.optional == 1 && sym->attr.value)
1086 	    {
1087 	      gfc_error ("Variable '%s' at %L cannot have both the OPTIONAL "
1088 			 "and the VALUE attribute because procedure '%s' "
1089 			 "is BIND(C)", sym->name, &(sym->declared_at),
1090 			 sym->ns->proc_name->name);
1091 	      retval = FAILURE;
1092 	    }
1093 	  else if (sym->attr.optional == 1
1094 		   && gfc_notify_std (GFC_STD_F2008_TS, "Variable '%s' "
1095 				      "at %L with OPTIONAL attribute in "
1096 				      "procedure '%s' which is BIND(C)",
1097 				      sym->name, &(sym->declared_at),
1098 				      sym->ns->proc_name->name)
1099 		      == FAILURE)
1100 	    retval = FAILURE;
1101 
1102           /* Make sure that if it has the dimension attribute, that it is
1103 	     either assumed size or explicit shape. Deferred shape is already
1104 	     covered by the pointer/allocatable attribute.  */
1105 	  if (sym->as != NULL && sym->as->type == AS_ASSUMED_SHAPE
1106 	      && gfc_notify_std (GFC_STD_F2008_TS, "Assumed-shape array '%s' "
1107 			      "at %L as dummy argument to the BIND(C) "
1108 			      "procedure '%s' at %L", sym->name,
1109 			      &(sym->declared_at), sym->ns->proc_name->name,
1110 			      &(sym->ns->proc_name->declared_at)) == FAILURE)
1111 	    retval = FAILURE;
1112 	}
1113     }
1114 
1115   return retval;
1116 }
1117 
1118 
1119 
1120 /* Function called by variable_decl() that adds a name to the symbol table.  */
1121 
1122 static gfc_try
build_sym(const char * name,gfc_charlen * cl,bool cl_deferred,gfc_array_spec ** as,locus * var_locus)1123 build_sym (const char *name, gfc_charlen *cl, bool cl_deferred,
1124 	   gfc_array_spec **as, locus *var_locus)
1125 {
1126   symbol_attribute attr;
1127   gfc_symbol *sym;
1128 
1129   if (gfc_get_symbol (name, NULL, &sym))
1130     return FAILURE;
1131 
1132   /* Start updating the symbol table.  Add basic type attribute if present.  */
1133   if (current_ts.type != BT_UNKNOWN
1134       && (sym->attr.implicit_type == 0
1135 	  || !gfc_compare_types (&sym->ts, &current_ts))
1136       && gfc_add_type (sym, &current_ts, var_locus) == FAILURE)
1137     return FAILURE;
1138 
1139   if (sym->ts.type == BT_CHARACTER)
1140     {
1141       sym->ts.u.cl = cl;
1142       sym->ts.deferred = cl_deferred;
1143     }
1144 
1145   /* Add dimension attribute if present.  */
1146   if (gfc_set_array_spec (sym, *as, var_locus) == FAILURE)
1147     return FAILURE;
1148   *as = NULL;
1149 
1150   /* Add attribute to symbol.  The copy is so that we can reset the
1151      dimension attribute.  */
1152   attr = current_attr;
1153   attr.dimension = 0;
1154   attr.codimension = 0;
1155 
1156   if (gfc_copy_attr (&sym->attr, &attr, var_locus) == FAILURE)
1157     return FAILURE;
1158 
1159   /* Finish any work that may need to be done for the binding label,
1160      if it's a bind(c).  The bind(c) attr is found before the symbol
1161      is made, and before the symbol name (for data decls), so the
1162      current_ts is holding the binding label, or nothing if the
1163      name= attr wasn't given.  Therefore, test here if we're dealing
1164      with a bind(c) and make sure the binding label is set correctly.  */
1165   if (sym->attr.is_bind_c == 1)
1166     {
1167       if (!sym->binding_label)
1168         {
1169 	  /* Set the binding label and verify that if a NAME= was specified
1170 	     then only one identifier was in the entity-decl-list.  */
1171 	  if (set_binding_label (&sym->binding_label, sym->name,
1172 				 num_idents_on_line) == FAILURE)
1173             return FAILURE;
1174         }
1175     }
1176 
1177   /* See if we know we're in a common block, and if it's a bind(c)
1178      common then we need to make sure we're an interoperable type.  */
1179   if (sym->attr.in_common == 1)
1180     {
1181       /* Test the common block object.  */
1182       if (sym->common_block != NULL && sym->common_block->is_bind_c == 1
1183           && sym->ts.is_c_interop != 1)
1184         {
1185           gfc_error_now ("Variable '%s' in common block '%s' at %C "
1186                          "must be declared with a C interoperable "
1187                          "kind since common block '%s' is BIND(C)",
1188                          sym->name, sym->common_block->name,
1189                          sym->common_block->name);
1190           gfc_clear_error ();
1191         }
1192     }
1193 
1194   sym->attr.implied_index = 0;
1195 
1196   if (sym->ts.type == BT_CLASS)
1197     return gfc_build_class_symbol (&sym->ts, &sym->attr, &sym->as, false);
1198 
1199   return SUCCESS;
1200 }
1201 
1202 
1203 /* Set character constant to the given length. The constant will be padded or
1204    truncated.  If we're inside an array constructor without a typespec, we
1205    additionally check that all elements have the same length; check_len -1
1206    means no checking.  */
1207 
1208 void
gfc_set_constant_character_len(int len,gfc_expr * expr,int check_len)1209 gfc_set_constant_character_len (int len, gfc_expr *expr, int check_len)
1210 {
1211   gfc_char_t *s;
1212   int slen;
1213 
1214   gcc_assert (expr->expr_type == EXPR_CONSTANT);
1215   gcc_assert (expr->ts.type == BT_CHARACTER);
1216 
1217   slen = expr->value.character.length;
1218   if (len != slen)
1219     {
1220       s = gfc_get_wide_string (len + 1);
1221       memcpy (s, expr->value.character.string,
1222 	      MIN (len, slen) * sizeof (gfc_char_t));
1223       if (len > slen)
1224 	gfc_wide_memset (&s[slen], ' ', len - slen);
1225 
1226       if (gfc_option.warn_character_truncation && slen > len)
1227 	gfc_warning_now ("CHARACTER expression at %L is being truncated "
1228 			 "(%d/%d)", &expr->where, slen, len);
1229 
1230       /* Apply the standard by 'hand' otherwise it gets cleared for
1231 	 initializers.  */
1232       if (check_len != -1 && slen != check_len
1233           && !(gfc_option.allow_std & GFC_STD_GNU))
1234 	gfc_error_now ("The CHARACTER elements of the array constructor "
1235 		       "at %L must have the same length (%d/%d)",
1236 			&expr->where, slen, check_len);
1237 
1238       s[len] = '\0';
1239       free (expr->value.character.string);
1240       expr->value.character.string = s;
1241       expr->value.character.length = len;
1242     }
1243 }
1244 
1245 
1246 /* Function to create and update the enumerator history
1247    using the information passed as arguments.
1248    Pointer "max_enum" is also updated, to point to
1249    enum history node containing largest initializer.
1250 
1251    SYM points to the symbol node of enumerator.
1252    INIT points to its enumerator value.  */
1253 
1254 static void
create_enum_history(gfc_symbol * sym,gfc_expr * init)1255 create_enum_history (gfc_symbol *sym, gfc_expr *init)
1256 {
1257   enumerator_history *new_enum_history;
1258   gcc_assert (sym != NULL && init != NULL);
1259 
1260   new_enum_history = XCNEW (enumerator_history);
1261 
1262   new_enum_history->sym = sym;
1263   new_enum_history->initializer = init;
1264   new_enum_history->next = NULL;
1265 
1266   if (enum_history == NULL)
1267     {
1268       enum_history = new_enum_history;
1269       max_enum = enum_history;
1270     }
1271   else
1272     {
1273       new_enum_history->next = enum_history;
1274       enum_history = new_enum_history;
1275 
1276       if (mpz_cmp (max_enum->initializer->value.integer,
1277 		   new_enum_history->initializer->value.integer) < 0)
1278 	max_enum = new_enum_history;
1279     }
1280 }
1281 
1282 
1283 /* Function to free enum kind history.  */
1284 
1285 void
gfc_free_enum_history(void)1286 gfc_free_enum_history (void)
1287 {
1288   enumerator_history *current = enum_history;
1289   enumerator_history *next;
1290 
1291   while (current != NULL)
1292     {
1293       next = current->next;
1294       free (current);
1295       current = next;
1296     }
1297   max_enum = NULL;
1298   enum_history = NULL;
1299 }
1300 
1301 
1302 /* Function called by variable_decl() that adds an initialization
1303    expression to a symbol.  */
1304 
1305 static gfc_try
add_init_expr_to_sym(const char * name,gfc_expr ** initp,locus * var_locus)1306 add_init_expr_to_sym (const char *name, gfc_expr **initp, locus *var_locus)
1307 {
1308   symbol_attribute attr;
1309   gfc_symbol *sym;
1310   gfc_expr *init;
1311 
1312   init = *initp;
1313   if (find_special (name, &sym, false))
1314     return FAILURE;
1315 
1316   attr = sym->attr;
1317 
1318   /* If this symbol is confirming an implicit parameter type,
1319      then an initialization expression is not allowed.  */
1320   if (attr.flavor == FL_PARAMETER
1321       && sym->value != NULL
1322       && *initp != NULL)
1323     {
1324       gfc_error ("Initializer not allowed for PARAMETER '%s' at %C",
1325 		 sym->name);
1326       return FAILURE;
1327     }
1328 
1329   if (init == NULL)
1330     {
1331       /* An initializer is required for PARAMETER declarations.  */
1332       if (attr.flavor == FL_PARAMETER)
1333 	{
1334 	  gfc_error ("PARAMETER at %L is missing an initializer", var_locus);
1335 	  return FAILURE;
1336 	}
1337     }
1338   else
1339     {
1340       /* If a variable appears in a DATA block, it cannot have an
1341 	 initializer.  */
1342       if (sym->attr.data)
1343 	{
1344 	  gfc_error ("Variable '%s' at %C with an initializer already "
1345 		     "appears in a DATA statement", sym->name);
1346 	  return FAILURE;
1347 	}
1348 
1349       /* Check if the assignment can happen. This has to be put off
1350 	 until later for derived type variables and procedure pointers.  */
1351       if (sym->ts.type != BT_DERIVED && init->ts.type != BT_DERIVED
1352 	  && sym->ts.type != BT_CLASS && init->ts.type != BT_CLASS
1353 	  && !sym->attr.proc_pointer
1354 	  && gfc_check_assign_symbol (sym, NULL, init) == FAILURE)
1355 	return FAILURE;
1356 
1357       if (sym->ts.type == BT_CHARACTER && sym->ts.u.cl
1358 	    && init->ts.type == BT_CHARACTER)
1359 	{
1360 	  /* Update symbol character length according initializer.  */
1361 	  if (gfc_check_assign_symbol (sym, NULL, init) == FAILURE)
1362 	    return FAILURE;
1363 
1364 	  if (sym->ts.u.cl->length == NULL)
1365 	    {
1366 	      int clen;
1367 	      /* If there are multiple CHARACTER variables declared on the
1368 		 same line, we don't want them to share the same length.  */
1369 	      sym->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
1370 
1371 	      if (sym->attr.flavor == FL_PARAMETER)
1372 		{
1373 		  if (init->expr_type == EXPR_CONSTANT)
1374 		    {
1375 		      clen = init->value.character.length;
1376 		      sym->ts.u.cl->length
1377 				= gfc_get_int_expr (gfc_default_integer_kind,
1378 						    NULL, clen);
1379 		    }
1380 		  else if (init->expr_type == EXPR_ARRAY)
1381 		    {
1382 		      gfc_constructor *c;
1383 		      c = gfc_constructor_first (init->value.constructor);
1384 		      clen = c->expr->value.character.length;
1385 		      sym->ts.u.cl->length
1386 				= gfc_get_int_expr (gfc_default_integer_kind,
1387 						    NULL, clen);
1388 		    }
1389 		  else if (init->ts.u.cl && init->ts.u.cl->length)
1390 		    sym->ts.u.cl->length =
1391 				gfc_copy_expr (sym->value->ts.u.cl->length);
1392 		}
1393 	    }
1394 	  /* Update initializer character length according symbol.  */
1395 	  else if (sym->ts.u.cl->length->expr_type == EXPR_CONSTANT)
1396 	    {
1397 	      int len = mpz_get_si (sym->ts.u.cl->length->value.integer);
1398 
1399 	      if (init->expr_type == EXPR_CONSTANT)
1400 		gfc_set_constant_character_len (len, init, -1);
1401 	      else if (init->expr_type == EXPR_ARRAY)
1402 		{
1403 		  gfc_constructor *c;
1404 
1405 		  /* Build a new charlen to prevent simplification from
1406 		     deleting the length before it is resolved.  */
1407 		  init->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
1408 		  init->ts.u.cl->length = gfc_copy_expr (sym->ts.u.cl->length);
1409 
1410 		  for (c = gfc_constructor_first (init->value.constructor);
1411 		       c; c = gfc_constructor_next (c))
1412 		    gfc_set_constant_character_len (len, c->expr, -1);
1413 		}
1414 	    }
1415 	}
1416 
1417       /* If sym is implied-shape, set its upper bounds from init.  */
1418       if (sym->attr.flavor == FL_PARAMETER && sym->attr.dimension
1419 	  && sym->as->type == AS_IMPLIED_SHAPE)
1420 	{
1421 	  int dim;
1422 
1423 	  if (init->rank == 0)
1424 	    {
1425 	      gfc_error ("Can't initialize implied-shape array at %L"
1426 			 " with scalar", &sym->declared_at);
1427 	      return FAILURE;
1428 	    }
1429 	  gcc_assert (sym->as->rank == init->rank);
1430 
1431 	  /* Shape should be present, we get an initialization expression.  */
1432 	  gcc_assert (init->shape);
1433 
1434 	  for (dim = 0; dim < sym->as->rank; ++dim)
1435 	    {
1436 	      int k;
1437 	      gfc_expr* lower;
1438 	      gfc_expr* e;
1439 
1440 	      lower = sym->as->lower[dim];
1441 	      if (lower->expr_type != EXPR_CONSTANT)
1442 		{
1443 		  gfc_error ("Non-constant lower bound in implied-shape"
1444 			     " declaration at %L", &lower->where);
1445 		  return FAILURE;
1446 		}
1447 
1448 	      /* All dimensions must be without upper bound.  */
1449 	      gcc_assert (!sym->as->upper[dim]);
1450 
1451 	      k = lower->ts.kind;
1452 	      e = gfc_get_constant_expr (BT_INTEGER, k, &sym->declared_at);
1453 	      mpz_add (e->value.integer,
1454 		       lower->value.integer, init->shape[dim]);
1455 	      mpz_sub_ui (e->value.integer, e->value.integer, 1);
1456 	      sym->as->upper[dim] = e;
1457 	    }
1458 
1459 	  sym->as->type = AS_EXPLICIT;
1460 	}
1461 
1462       /* Need to check if the expression we initialized this
1463 	 to was one of the iso_c_binding named constants.  If so,
1464 	 and we're a parameter (constant), let it be iso_c.
1465 	 For example:
1466 	 integer(c_int), parameter :: my_int = c_int
1467 	 integer(my_int) :: my_int_2
1468 	 If we mark my_int as iso_c (since we can see it's value
1469 	 is equal to one of the named constants), then my_int_2
1470 	 will be considered C interoperable.  */
1471       if (sym->ts.type != BT_CHARACTER && sym->ts.type != BT_DERIVED)
1472 	{
1473 	  sym->ts.is_iso_c |= init->ts.is_iso_c;
1474 	  sym->ts.is_c_interop |= init->ts.is_c_interop;
1475 	  /* attr bits needed for module files.  */
1476 	  sym->attr.is_iso_c |= init->ts.is_iso_c;
1477 	  sym->attr.is_c_interop |= init->ts.is_c_interop;
1478 	  if (init->ts.is_iso_c)
1479 	    sym->ts.f90_type = init->ts.f90_type;
1480 	}
1481 
1482       /* Add initializer.  Make sure we keep the ranks sane.  */
1483       if (sym->attr.dimension && init->rank == 0)
1484 	{
1485 	  mpz_t size;
1486 	  gfc_expr *array;
1487 	  int n;
1488 	  if (sym->attr.flavor == FL_PARAMETER
1489 		&& init->expr_type == EXPR_CONSTANT
1490 		&& spec_size (sym->as, &size) == SUCCESS
1491 		&& mpz_cmp_si (size, 0) > 0)
1492 	    {
1493 	      array = gfc_get_array_expr (init->ts.type, init->ts.kind,
1494 					  &init->where);
1495 	      for (n = 0; n < (int)mpz_get_si (size); n++)
1496 		gfc_constructor_append_expr (&array->value.constructor,
1497 					     n == 0
1498 						? init
1499 						: gfc_copy_expr (init),
1500 					     &init->where);
1501 
1502 	      array->shape = gfc_get_shape (sym->as->rank);
1503 	      for (n = 0; n < sym->as->rank; n++)
1504 		spec_dimen_size (sym->as, n, &array->shape[n]);
1505 
1506 	      init = array;
1507 	      mpz_clear (size);
1508 	    }
1509 	  init->rank = sym->as->rank;
1510 	}
1511 
1512       sym->value = init;
1513       if (sym->attr.save == SAVE_NONE)
1514 	sym->attr.save = SAVE_IMPLICIT;
1515       *initp = NULL;
1516     }
1517 
1518   return SUCCESS;
1519 }
1520 
1521 
1522 /* Function called by variable_decl() that adds a name to a structure
1523    being built.  */
1524 
1525 static gfc_try
build_struct(const char * name,gfc_charlen * cl,gfc_expr ** init,gfc_array_spec ** as)1526 build_struct (const char *name, gfc_charlen *cl, gfc_expr **init,
1527 	      gfc_array_spec **as)
1528 {
1529   gfc_component *c;
1530   gfc_try t = SUCCESS;
1531 
1532   /* F03:C438/C439. If the current symbol is of the same derived type that we're
1533      constructing, it must have the pointer attribute.  */
1534   if ((current_ts.type == BT_DERIVED || current_ts.type == BT_CLASS)
1535       && current_ts.u.derived == gfc_current_block ()
1536       && current_attr.pointer == 0)
1537     {
1538       gfc_error ("Component at %C must have the POINTER attribute");
1539       return FAILURE;
1540     }
1541 
1542   if (gfc_current_block ()->attr.pointer && (*as)->rank != 0)
1543     {
1544       if ((*as)->type != AS_DEFERRED && (*as)->type != AS_EXPLICIT)
1545 	{
1546 	  gfc_error ("Array component of structure at %C must have explicit "
1547 		     "or deferred shape");
1548 	  return FAILURE;
1549 	}
1550     }
1551 
1552   if (gfc_add_component (gfc_current_block (), name, &c) == FAILURE)
1553     return FAILURE;
1554 
1555   c->ts = current_ts;
1556   if (c->ts.type == BT_CHARACTER)
1557     c->ts.u.cl = cl;
1558   c->attr = current_attr;
1559 
1560   c->initializer = *init;
1561   *init = NULL;
1562 
1563   c->as = *as;
1564   if (c->as != NULL)
1565     {
1566       if (c->as->corank)
1567 	c->attr.codimension = 1;
1568       if (c->as->rank)
1569 	c->attr.dimension = 1;
1570     }
1571   *as = NULL;
1572 
1573   /* Should this ever get more complicated, combine with similar section
1574      in add_init_expr_to_sym into a separate function.  */
1575   if (c->ts.type == BT_CHARACTER && !c->attr.pointer && c->initializer
1576       && c->ts.u.cl
1577       && c->ts.u.cl->length && c->ts.u.cl->length->expr_type == EXPR_CONSTANT)
1578     {
1579       int len;
1580 
1581       gcc_assert (c->ts.u.cl && c->ts.u.cl->length);
1582       gcc_assert (c->ts.u.cl->length->expr_type == EXPR_CONSTANT);
1583       gcc_assert (c->ts.u.cl->length->ts.type == BT_INTEGER);
1584 
1585       len = mpz_get_si (c->ts.u.cl->length->value.integer);
1586 
1587       if (c->initializer->expr_type == EXPR_CONSTANT)
1588 	gfc_set_constant_character_len (len, c->initializer, -1);
1589       else if (mpz_cmp (c->ts.u.cl->length->value.integer,
1590 			c->initializer->ts.u.cl->length->value.integer))
1591 	{
1592 	  gfc_constructor *ctor;
1593 	  ctor = gfc_constructor_first (c->initializer->value.constructor);
1594 
1595 	  if (ctor)
1596 	    {
1597 	      int first_len;
1598 	      bool has_ts = (c->initializer->ts.u.cl
1599 			     && c->initializer->ts.u.cl->length_from_typespec);
1600 
1601 	      /* Remember the length of the first element for checking
1602 		 that all elements *in the constructor* have the same
1603 		 length.  This need not be the length of the LHS!  */
1604 	      gcc_assert (ctor->expr->expr_type == EXPR_CONSTANT);
1605 	      gcc_assert (ctor->expr->ts.type == BT_CHARACTER);
1606 	      first_len = ctor->expr->value.character.length;
1607 
1608 	      for ( ; ctor; ctor = gfc_constructor_next (ctor))
1609 		if (ctor->expr->expr_type == EXPR_CONSTANT)
1610 		{
1611 		  gfc_set_constant_character_len (len, ctor->expr,
1612 						  has_ts ? -1 : first_len);
1613 		  ctor->expr->ts.u.cl->length = gfc_copy_expr (c->ts.u.cl->length);
1614 		}
1615 	    }
1616 	}
1617     }
1618 
1619   /* Check array components.  */
1620   if (!c->attr.dimension)
1621     goto scalar;
1622 
1623   if (c->attr.pointer)
1624     {
1625       if (c->as->type != AS_DEFERRED)
1626 	{
1627 	  gfc_error ("Pointer array component of structure at %C must have a "
1628 		     "deferred shape");
1629 	  t = FAILURE;
1630 	}
1631     }
1632   else if (c->attr.allocatable)
1633     {
1634       if (c->as->type != AS_DEFERRED)
1635 	{
1636 	  gfc_error ("Allocatable component of structure at %C must have a "
1637 		     "deferred shape");
1638 	  t = FAILURE;
1639 	}
1640     }
1641   else
1642     {
1643       if (c->as->type != AS_EXPLICIT)
1644 	{
1645 	  gfc_error ("Array component of structure at %C must have an "
1646 		     "explicit shape");
1647 	  t = FAILURE;
1648 	}
1649     }
1650 
1651 scalar:
1652   if (c->ts.type == BT_CLASS)
1653     {
1654       bool delayed = (gfc_state_stack->sym == c->ts.u.derived)
1655 		     || (!c->ts.u.derived->components
1656 			 && !c->ts.u.derived->attr.zero_comp);
1657       gfc_try t2 = gfc_build_class_symbol (&c->ts, &c->attr, &c->as, delayed);
1658 
1659       if (t != FAILURE)
1660 	t = t2;
1661     }
1662 
1663   return t;
1664 }
1665 
1666 
1667 /* Match a 'NULL()', and possibly take care of some side effects.  */
1668 
1669 match
gfc_match_null(gfc_expr ** result)1670 gfc_match_null (gfc_expr **result)
1671 {
1672   gfc_symbol *sym;
1673   match m, m2 = MATCH_NO;
1674 
1675   if ((m = gfc_match (" null ( )")) == MATCH_ERROR)
1676     return MATCH_ERROR;
1677 
1678   if (m == MATCH_NO)
1679     {
1680       locus old_loc;
1681       char name[GFC_MAX_SYMBOL_LEN + 1];
1682 
1683       if ((m2 = gfc_match (" null (")) != MATCH_YES)
1684 	return m2;
1685 
1686       old_loc = gfc_current_locus;
1687       if ((m2 = gfc_match (" %n ) ", name)) == MATCH_ERROR)
1688 	return MATCH_ERROR;
1689       if (m2 != MATCH_YES
1690 	  && ((m2 = gfc_match (" mold = %n )", name)) == MATCH_ERROR))
1691 	return MATCH_ERROR;
1692       if (m2 == MATCH_NO)
1693 	{
1694 	  gfc_current_locus = old_loc;
1695 	  return MATCH_NO;
1696 	}
1697     }
1698 
1699   /* The NULL symbol now has to be/become an intrinsic function.  */
1700   if (gfc_get_symbol ("null", NULL, &sym))
1701     {
1702       gfc_error ("NULL() initialization at %C is ambiguous");
1703       return MATCH_ERROR;
1704     }
1705 
1706   gfc_intrinsic_symbol (sym);
1707 
1708   if (sym->attr.proc != PROC_INTRINSIC
1709       && (gfc_add_procedure (&sym->attr, PROC_INTRINSIC,
1710 			     sym->name, NULL) == FAILURE
1711 	  || gfc_add_function (&sym->attr, sym->name, NULL) == FAILURE))
1712     return MATCH_ERROR;
1713 
1714   *result = gfc_get_null_expr (&gfc_current_locus);
1715 
1716   /* Invalid per F2008, C512.  */
1717   if (m2 == MATCH_YES)
1718     {
1719       gfc_error ("NULL() initialization at %C may not have MOLD");
1720       return MATCH_ERROR;
1721     }
1722 
1723   return MATCH_YES;
1724 }
1725 
1726 
1727 /* Match the initialization expr for a data pointer or procedure pointer.  */
1728 
1729 static match
match_pointer_init(gfc_expr ** init,int procptr)1730 match_pointer_init (gfc_expr **init, int procptr)
1731 {
1732   match m;
1733 
1734   if (gfc_pure (NULL) && gfc_state_stack->state != COMP_DERIVED)
1735     {
1736       gfc_error ("Initialization of pointer at %C is not allowed in "
1737 		 "a PURE procedure");
1738       return MATCH_ERROR;
1739     }
1740 
1741   /* Match NULL() initialization.  */
1742   m = gfc_match_null (init);
1743   if (m != MATCH_NO)
1744     return m;
1745 
1746   /* Match non-NULL initialization.  */
1747   gfc_matching_ptr_assignment = !procptr;
1748   gfc_matching_procptr_assignment = procptr;
1749   m = gfc_match_rvalue (init);
1750   gfc_matching_ptr_assignment = 0;
1751   gfc_matching_procptr_assignment = 0;
1752   if (m == MATCH_ERROR)
1753     return MATCH_ERROR;
1754   else if (m == MATCH_NO)
1755     {
1756       gfc_error ("Error in pointer initialization at %C");
1757       return MATCH_ERROR;
1758     }
1759 
1760   if (!procptr)
1761     gfc_resolve_expr (*init);
1762 
1763   if (gfc_notify_std (GFC_STD_F2008, "non-NULL pointer "
1764 		      "initialization at %C") == FAILURE)
1765     return MATCH_ERROR;
1766 
1767   return MATCH_YES;
1768 }
1769 
1770 
1771 static gfc_try
check_function_name(char * name)1772 check_function_name (char *name)
1773 {
1774   /* In functions that have a RESULT variable defined, the function name always
1775      refers to function calls.  Therefore, the name is not allowed to appear in
1776      specification statements. When checking this, be careful about
1777      'hidden' procedure pointer results ('ppr@').  */
1778 
1779   if (gfc_current_state () == COMP_FUNCTION)
1780     {
1781       gfc_symbol *block = gfc_current_block ();
1782       if (block && block->result && block->result != block
1783 	  && strcmp (block->result->name, "ppr@") != 0
1784 	  && strcmp (block->name, name) == 0)
1785 	{
1786 	  gfc_error ("Function name '%s' not allowed at %C", name);
1787 	  return FAILURE;
1788 	}
1789     }
1790 
1791   return SUCCESS;
1792 }
1793 
1794 
1795 /* Match a variable name with an optional initializer.  When this
1796    subroutine is called, a variable is expected to be parsed next.
1797    Depending on what is happening at the moment, updates either the
1798    symbol table or the current interface.  */
1799 
1800 static match
variable_decl(int elem)1801 variable_decl (int elem)
1802 {
1803   char name[GFC_MAX_SYMBOL_LEN + 1];
1804   gfc_expr *initializer, *char_len;
1805   gfc_array_spec *as;
1806   gfc_array_spec *cp_as; /* Extra copy for Cray Pointees.  */
1807   gfc_charlen *cl;
1808   bool cl_deferred;
1809   locus var_locus;
1810   match m;
1811   gfc_try t;
1812   gfc_symbol *sym;
1813 
1814   initializer = NULL;
1815   as = NULL;
1816   cp_as = NULL;
1817 
1818   /* When we get here, we've just matched a list of attributes and
1819      maybe a type and a double colon.  The next thing we expect to see
1820      is the name of the symbol.  */
1821   m = gfc_match_name (name);
1822   if (m != MATCH_YES)
1823     goto cleanup;
1824 
1825   var_locus = gfc_current_locus;
1826 
1827   /* Now we could see the optional array spec. or character length.  */
1828   m = gfc_match_array_spec (&as, true, true);
1829   if (m == MATCH_ERROR)
1830     goto cleanup;
1831 
1832   if (m == MATCH_NO)
1833     as = gfc_copy_array_spec (current_as);
1834   else if (current_as
1835 	   && merge_array_spec (current_as, as, true) == FAILURE)
1836     {
1837       m = MATCH_ERROR;
1838       goto cleanup;
1839     }
1840 
1841   if (gfc_option.flag_cray_pointer)
1842     cp_as = gfc_copy_array_spec (as);
1843 
1844   /* At this point, we know for sure if the symbol is PARAMETER and can thus
1845      determine (and check) whether it can be implied-shape.  If it
1846      was parsed as assumed-size, change it because PARAMETERs can not
1847      be assumed-size.  */
1848   if (as)
1849     {
1850       if (as->type == AS_IMPLIED_SHAPE && current_attr.flavor != FL_PARAMETER)
1851 	{
1852 	  m = MATCH_ERROR;
1853 	  gfc_error ("Non-PARAMETER symbol '%s' at %L can't be implied-shape",
1854 		     name, &var_locus);
1855 	  goto cleanup;
1856 	}
1857 
1858       if (as->type == AS_ASSUMED_SIZE && as->rank == 1
1859 	  && current_attr.flavor == FL_PARAMETER)
1860 	as->type = AS_IMPLIED_SHAPE;
1861 
1862       if (as->type == AS_IMPLIED_SHAPE
1863 	  && gfc_notify_std (GFC_STD_F2008,
1864 			     "Implied-shape array at %L",
1865 			     &var_locus) == FAILURE)
1866 	{
1867 	  m = MATCH_ERROR;
1868 	  goto cleanup;
1869 	}
1870     }
1871 
1872   char_len = NULL;
1873   cl = NULL;
1874   cl_deferred = false;
1875 
1876   if (current_ts.type == BT_CHARACTER)
1877     {
1878       switch (match_char_length (&char_len, &cl_deferred, false))
1879 	{
1880 	case MATCH_YES:
1881 	  cl = gfc_new_charlen (gfc_current_ns, NULL);
1882 
1883 	  cl->length = char_len;
1884 	  break;
1885 
1886 	/* Non-constant lengths need to be copied after the first
1887 	   element.  Also copy assumed lengths.  */
1888 	case MATCH_NO:
1889 	  if (elem > 1
1890 	      && (current_ts.u.cl->length == NULL
1891 		  || current_ts.u.cl->length->expr_type != EXPR_CONSTANT))
1892 	    {
1893 	      cl = gfc_new_charlen (gfc_current_ns, NULL);
1894 	      cl->length = gfc_copy_expr (current_ts.u.cl->length);
1895 	    }
1896 	  else
1897 	    cl = current_ts.u.cl;
1898 
1899 	  cl_deferred = current_ts.deferred;
1900 
1901 	  break;
1902 
1903 	case MATCH_ERROR:
1904 	  goto cleanup;
1905 	}
1906     }
1907 
1908   /*  If this symbol has already shown up in a Cray Pointer declaration,
1909       then we want to set the type & bail out.  */
1910   if (gfc_option.flag_cray_pointer)
1911     {
1912       gfc_find_symbol (name, gfc_current_ns, 1, &sym);
1913       if (sym != NULL && sym->attr.cray_pointee)
1914 	{
1915 	  sym->ts.type = current_ts.type;
1916 	  sym->ts.kind = current_ts.kind;
1917 	  sym->ts.u.cl = cl;
1918 	  sym->ts.u.derived = current_ts.u.derived;
1919 	  sym->ts.is_c_interop = current_ts.is_c_interop;
1920 	  sym->ts.is_iso_c = current_ts.is_iso_c;
1921 	  m = MATCH_YES;
1922 
1923 	  /* Check to see if we have an array specification.  */
1924 	  if (cp_as != NULL)
1925 	    {
1926 	      if (sym->as != NULL)
1927 		{
1928 		  gfc_error ("Duplicate array spec for Cray pointee at %C");
1929 		  gfc_free_array_spec (cp_as);
1930 		  m = MATCH_ERROR;
1931 		  goto cleanup;
1932 		}
1933 	      else
1934 		{
1935 		  if (gfc_set_array_spec (sym, cp_as, &var_locus) == FAILURE)
1936 		    gfc_internal_error ("Couldn't set pointee array spec.");
1937 
1938 		  /* Fix the array spec.  */
1939 		  m = gfc_mod_pointee_as (sym->as);
1940 		  if (m == MATCH_ERROR)
1941 		    goto cleanup;
1942 		}
1943 	    }
1944 	  goto cleanup;
1945 	}
1946       else
1947 	{
1948 	  gfc_free_array_spec (cp_as);
1949 	}
1950     }
1951 
1952   /* Procedure pointer as function result.  */
1953   if (gfc_current_state () == COMP_FUNCTION
1954       && strcmp ("ppr@", gfc_current_block ()->name) == 0
1955       && strcmp (name, gfc_current_block ()->ns->proc_name->name) == 0)
1956     strcpy (name, "ppr@");
1957 
1958   if (gfc_current_state () == COMP_FUNCTION
1959       && strcmp (name, gfc_current_block ()->name) == 0
1960       && gfc_current_block ()->result
1961       && strcmp ("ppr@", gfc_current_block ()->result->name) == 0)
1962     strcpy (name, "ppr@");
1963 
1964   /* OK, we've successfully matched the declaration.  Now put the
1965      symbol in the current namespace, because it might be used in the
1966      optional initialization expression for this symbol, e.g. this is
1967      perfectly legal:
1968 
1969      integer, parameter :: i = huge(i)
1970 
1971      This is only true for parameters or variables of a basic type.
1972      For components of derived types, it is not true, so we don't
1973      create a symbol for those yet.  If we fail to create the symbol,
1974      bail out.  */
1975   if (gfc_current_state () != COMP_DERIVED
1976       && build_sym (name, cl, cl_deferred, &as, &var_locus) == FAILURE)
1977     {
1978       m = MATCH_ERROR;
1979       goto cleanup;
1980     }
1981 
1982   if (check_function_name (name) == FAILURE)
1983     {
1984       m = MATCH_ERROR;
1985       goto cleanup;
1986     }
1987 
1988   /* We allow old-style initializations of the form
1989        integer i /2/, j(4) /3*3, 1/
1990      (if no colon has been seen). These are different from data
1991      statements in that initializers are only allowed to apply to the
1992      variable immediately preceding, i.e.
1993        integer i, j /1, 2/
1994      is not allowed. Therefore we have to do some work manually, that
1995      could otherwise be left to the matchers for DATA statements.  */
1996 
1997   if (!colon_seen && gfc_match (" /") == MATCH_YES)
1998     {
1999       if (gfc_notify_std (GFC_STD_GNU, "Old-style "
2000 			  "initialization at %C") == FAILURE)
2001 	return MATCH_ERROR;
2002 
2003       return match_old_style_init (name);
2004     }
2005 
2006   /* The double colon must be present in order to have initializers.
2007      Otherwise the statement is ambiguous with an assignment statement.  */
2008   if (colon_seen)
2009     {
2010       if (gfc_match (" =>") == MATCH_YES)
2011 	{
2012 	  if (!current_attr.pointer)
2013 	    {
2014 	      gfc_error ("Initialization at %C isn't for a pointer variable");
2015 	      m = MATCH_ERROR;
2016 	      goto cleanup;
2017 	    }
2018 
2019 	  m = match_pointer_init (&initializer, 0);
2020 	  if (m != MATCH_YES)
2021 	    goto cleanup;
2022 	}
2023       else if (gfc_match_char ('=') == MATCH_YES)
2024 	{
2025 	  if (current_attr.pointer)
2026 	    {
2027 	      gfc_error ("Pointer initialization at %C requires '=>', "
2028 			 "not '='");
2029 	      m = MATCH_ERROR;
2030 	      goto cleanup;
2031 	    }
2032 
2033 	  m = gfc_match_init_expr (&initializer);
2034 	  if (m == MATCH_NO)
2035 	    {
2036 	      gfc_error ("Expected an initialization expression at %C");
2037 	      m = MATCH_ERROR;
2038 	    }
2039 
2040 	  if (current_attr.flavor != FL_PARAMETER && gfc_pure (NULL)
2041 	      && gfc_state_stack->state != COMP_DERIVED)
2042 	    {
2043 	      gfc_error ("Initialization of variable at %C is not allowed in "
2044 			 "a PURE procedure");
2045 	      m = MATCH_ERROR;
2046 	    }
2047 
2048 	  if (m != MATCH_YES)
2049 	    goto cleanup;
2050 	}
2051     }
2052 
2053   if (initializer != NULL && current_attr.allocatable
2054 	&& gfc_current_state () == COMP_DERIVED)
2055     {
2056       gfc_error ("Initialization of allocatable component at %C is not "
2057 		 "allowed");
2058       m = MATCH_ERROR;
2059       goto cleanup;
2060     }
2061 
2062   /* Add the initializer.  Note that it is fine if initializer is
2063      NULL here, because we sometimes also need to check if a
2064      declaration *must* have an initialization expression.  */
2065   if (gfc_current_state () != COMP_DERIVED)
2066     t = add_init_expr_to_sym (name, &initializer, &var_locus);
2067   else
2068     {
2069       if (current_ts.type == BT_DERIVED
2070 	  && !current_attr.pointer && !initializer)
2071 	initializer = gfc_default_initializer (&current_ts);
2072       t = build_struct (name, cl, &initializer, &as);
2073     }
2074 
2075   m = (t == SUCCESS) ? MATCH_YES : MATCH_ERROR;
2076 
2077 cleanup:
2078   /* Free stuff up and return.  */
2079   gfc_free_expr (initializer);
2080   gfc_free_array_spec (as);
2081 
2082   return m;
2083 }
2084 
2085 
2086 /* Match an extended-f77 "TYPESPEC*bytesize"-style kind specification.
2087    This assumes that the byte size is equal to the kind number for
2088    non-COMPLEX types, and equal to twice the kind number for COMPLEX.  */
2089 
2090 match
gfc_match_old_kind_spec(gfc_typespec * ts)2091 gfc_match_old_kind_spec (gfc_typespec *ts)
2092 {
2093   match m;
2094   int original_kind;
2095 
2096   if (gfc_match_char ('*') != MATCH_YES)
2097     return MATCH_NO;
2098 
2099   m = gfc_match_small_literal_int (&ts->kind, NULL);
2100   if (m != MATCH_YES)
2101     return MATCH_ERROR;
2102 
2103   original_kind = ts->kind;
2104 
2105   /* Massage the kind numbers for complex types.  */
2106   if (ts->type == BT_COMPLEX)
2107     {
2108       if (ts->kind % 2)
2109 	{
2110 	  gfc_error ("Old-style type declaration %s*%d not supported at %C",
2111 		     gfc_basic_typename (ts->type), original_kind);
2112 	  return MATCH_ERROR;
2113 	}
2114       ts->kind /= 2;
2115 
2116     }
2117 
2118   if (ts->type == BT_INTEGER && ts->kind == 4 && gfc_option.flag_integer4_kind == 8)
2119     ts->kind = 8;
2120 
2121   if (ts->type == BT_REAL || ts->type == BT_COMPLEX)
2122     {
2123       if (ts->kind == 4)
2124 	{
2125 	  if (gfc_option.flag_real4_kind == 8)
2126 	    ts->kind =  8;
2127 	  if (gfc_option.flag_real4_kind == 10)
2128 	    ts->kind = 10;
2129 	  if (gfc_option.flag_real4_kind == 16)
2130 	    ts->kind = 16;
2131 	}
2132 
2133       if (ts->kind == 8)
2134 	{
2135 	  if (gfc_option.flag_real8_kind == 4)
2136 	    ts->kind = 4;
2137 	  if (gfc_option.flag_real8_kind == 10)
2138 	    ts->kind = 10;
2139 	  if (gfc_option.flag_real8_kind == 16)
2140 	    ts->kind = 16;
2141 	}
2142     }
2143 
2144   if (gfc_validate_kind (ts->type, ts->kind, true) < 0)
2145     {
2146       gfc_error ("Old-style type declaration %s*%d not supported at %C",
2147 		 gfc_basic_typename (ts->type), original_kind);
2148       return MATCH_ERROR;
2149     }
2150 
2151   if (gfc_notify_std (GFC_STD_GNU, "Nonstandard type declaration %s*%d at %C",
2152 		      gfc_basic_typename (ts->type), original_kind) == FAILURE)
2153     return MATCH_ERROR;
2154 
2155   return MATCH_YES;
2156 }
2157 
2158 
2159 /* Match a kind specification.  Since kinds are generally optional, we
2160    usually return MATCH_NO if something goes wrong.  If a "kind="
2161    string is found, then we know we have an error.  */
2162 
2163 match
gfc_match_kind_spec(gfc_typespec * ts,bool kind_expr_only)2164 gfc_match_kind_spec (gfc_typespec *ts, bool kind_expr_only)
2165 {
2166   locus where, loc;
2167   gfc_expr *e;
2168   match m, n;
2169   char c;
2170   const char *msg;
2171 
2172   m = MATCH_NO;
2173   n = MATCH_YES;
2174   e = NULL;
2175 
2176   where = loc = gfc_current_locus;
2177 
2178   if (kind_expr_only)
2179     goto kind_expr;
2180 
2181   if (gfc_match_char ('(') == MATCH_NO)
2182     return MATCH_NO;
2183 
2184   /* Also gobbles optional text.  */
2185   if (gfc_match (" kind = ") == MATCH_YES)
2186     m = MATCH_ERROR;
2187 
2188   loc = gfc_current_locus;
2189 
2190 kind_expr:
2191   n = gfc_match_init_expr (&e);
2192 
2193   if (n != MATCH_YES)
2194     {
2195       if (gfc_matching_function)
2196 	{
2197 	  /* The function kind expression might include use associated or
2198 	     imported parameters and try again after the specification
2199 	     expressions.....  */
2200 	  if (gfc_match_char (')') != MATCH_YES)
2201 	    {
2202 	      gfc_error ("Missing right parenthesis at %C");
2203 	      m = MATCH_ERROR;
2204 	      goto no_match;
2205 	    }
2206 
2207 	  gfc_free_expr (e);
2208 	  gfc_undo_symbols ();
2209 	  return MATCH_YES;
2210 	}
2211       else
2212 	{
2213 	  /* ....or else, the match is real.  */
2214 	  if (n == MATCH_NO)
2215 	    gfc_error ("Expected initialization expression at %C");
2216 	  if (n != MATCH_YES)
2217 	    return MATCH_ERROR;
2218 	}
2219     }
2220 
2221   if (e->rank != 0)
2222     {
2223       gfc_error ("Expected scalar initialization expression at %C");
2224       m = MATCH_ERROR;
2225       goto no_match;
2226     }
2227 
2228   msg = gfc_extract_int (e, &ts->kind);
2229 
2230   if (msg != NULL)
2231     {
2232       gfc_error (msg);
2233       m = MATCH_ERROR;
2234       goto no_match;
2235     }
2236 
2237   /* Before throwing away the expression, let's see if we had a
2238      C interoperable kind (and store the fact).	 */
2239   if (e->ts.is_c_interop == 1)
2240     {
2241       /* Mark this as C interoperable if being declared with one
2242 	 of the named constants from iso_c_binding.  */
2243       ts->is_c_interop = e->ts.is_iso_c;
2244       ts->f90_type = e->ts.f90_type;
2245     }
2246 
2247   gfc_free_expr (e);
2248   e = NULL;
2249 
2250   /* Ignore errors to this point, if we've gotten here.  This means
2251      we ignore the m=MATCH_ERROR from above.  */
2252   if (gfc_validate_kind (ts->type, ts->kind, true) < 0)
2253     {
2254       gfc_error ("Kind %d not supported for type %s at %C", ts->kind,
2255 		 gfc_basic_typename (ts->type));
2256       gfc_current_locus = where;
2257       return MATCH_ERROR;
2258     }
2259 
2260   /* Warn if, e.g., c_int is used for a REAL variable, but not
2261      if, e.g., c_double is used for COMPLEX as the standard
2262      explicitly says that the kind type parameter for complex and real
2263      variable is the same, i.e. c_float == c_float_complex.  */
2264   if (ts->f90_type != BT_UNKNOWN && ts->f90_type != ts->type
2265       && !((ts->f90_type == BT_REAL && ts->type == BT_COMPLEX)
2266 	   || (ts->f90_type == BT_COMPLEX && ts->type == BT_REAL)))
2267     gfc_warning_now ("C kind type parameter is for type %s but type at %L "
2268 		     "is %s", gfc_basic_typename (ts->f90_type), &where,
2269 		     gfc_basic_typename (ts->type));
2270 
2271   gfc_gobble_whitespace ();
2272   if ((c = gfc_next_ascii_char ()) != ')'
2273       && (ts->type != BT_CHARACTER || c != ','))
2274     {
2275       if (ts->type == BT_CHARACTER)
2276 	gfc_error ("Missing right parenthesis or comma at %C");
2277       else
2278 	gfc_error ("Missing right parenthesis at %C");
2279       m = MATCH_ERROR;
2280     }
2281   else
2282      /* All tests passed.  */
2283      m = MATCH_YES;
2284 
2285   if(m == MATCH_ERROR)
2286      gfc_current_locus = where;
2287 
2288   if (ts->type == BT_INTEGER && ts->kind == 4 && gfc_option.flag_integer4_kind == 8)
2289     ts->kind =  8;
2290 
2291   if (ts->type == BT_REAL || ts->type == BT_COMPLEX)
2292     {
2293       if (ts->kind == 4)
2294 	{
2295 	  if (gfc_option.flag_real4_kind == 8)
2296 	    ts->kind =  8;
2297 	  if (gfc_option.flag_real4_kind == 10)
2298 	    ts->kind = 10;
2299 	  if (gfc_option.flag_real4_kind == 16)
2300 	    ts->kind = 16;
2301 	}
2302 
2303       if (ts->kind == 8)
2304 	{
2305 	  if (gfc_option.flag_real8_kind == 4)
2306 	    ts->kind = 4;
2307 	  if (gfc_option.flag_real8_kind == 10)
2308 	    ts->kind = 10;
2309 	  if (gfc_option.flag_real8_kind == 16)
2310 	    ts->kind = 16;
2311 	}
2312     }
2313 
2314   /* Return what we know from the test(s).  */
2315   return m;
2316 
2317 no_match:
2318   gfc_free_expr (e);
2319   gfc_current_locus = where;
2320   return m;
2321 }
2322 
2323 
2324 static match
match_char_kind(int * kind,int * is_iso_c)2325 match_char_kind (int * kind, int * is_iso_c)
2326 {
2327   locus where;
2328   gfc_expr *e;
2329   match m, n;
2330   const char *msg;
2331 
2332   m = MATCH_NO;
2333   e = NULL;
2334   where = gfc_current_locus;
2335 
2336   n = gfc_match_init_expr (&e);
2337 
2338   if (n != MATCH_YES && gfc_matching_function)
2339     {
2340       /* The expression might include use-associated or imported
2341 	 parameters and try again after the specification
2342 	 expressions.  */
2343       gfc_free_expr (e);
2344       gfc_undo_symbols ();
2345       return MATCH_YES;
2346     }
2347 
2348   if (n == MATCH_NO)
2349     gfc_error ("Expected initialization expression at %C");
2350   if (n != MATCH_YES)
2351     return MATCH_ERROR;
2352 
2353   if (e->rank != 0)
2354     {
2355       gfc_error ("Expected scalar initialization expression at %C");
2356       m = MATCH_ERROR;
2357       goto no_match;
2358     }
2359 
2360   msg = gfc_extract_int (e, kind);
2361   *is_iso_c = e->ts.is_iso_c;
2362   if (msg != NULL)
2363     {
2364       gfc_error (msg);
2365       m = MATCH_ERROR;
2366       goto no_match;
2367     }
2368 
2369   gfc_free_expr (e);
2370 
2371   /* Ignore errors to this point, if we've gotten here.  This means
2372      we ignore the m=MATCH_ERROR from above.  */
2373   if (gfc_validate_kind (BT_CHARACTER, *kind, true) < 0)
2374     {
2375       gfc_error ("Kind %d is not supported for CHARACTER at %C", *kind);
2376       m = MATCH_ERROR;
2377     }
2378   else
2379      /* All tests passed.  */
2380      m = MATCH_YES;
2381 
2382   if (m == MATCH_ERROR)
2383      gfc_current_locus = where;
2384 
2385   /* Return what we know from the test(s).  */
2386   return m;
2387 
2388 no_match:
2389   gfc_free_expr (e);
2390   gfc_current_locus = where;
2391   return m;
2392 }
2393 
2394 
2395 /* Match the various kind/length specifications in a CHARACTER
2396    declaration.  We don't return MATCH_NO.  */
2397 
2398 match
gfc_match_char_spec(gfc_typespec * ts)2399 gfc_match_char_spec (gfc_typespec *ts)
2400 {
2401   int kind, seen_length, is_iso_c;
2402   gfc_charlen *cl;
2403   gfc_expr *len;
2404   match m;
2405   bool deferred;
2406 
2407   len = NULL;
2408   seen_length = 0;
2409   kind = 0;
2410   is_iso_c = 0;
2411   deferred = false;
2412 
2413   /* Try the old-style specification first.  */
2414   old_char_selector = 0;
2415 
2416   m = match_char_length (&len, &deferred, true);
2417   if (m != MATCH_NO)
2418     {
2419       if (m == MATCH_YES)
2420 	old_char_selector = 1;
2421       seen_length = 1;
2422       goto done;
2423     }
2424 
2425   m = gfc_match_char ('(');
2426   if (m != MATCH_YES)
2427     {
2428       m = MATCH_YES;	/* Character without length is a single char.  */
2429       goto done;
2430     }
2431 
2432   /* Try the weird case:  ( KIND = <int> [ , LEN = <len-param> ] ).  */
2433   if (gfc_match (" kind =") == MATCH_YES)
2434     {
2435       m = match_char_kind (&kind, &is_iso_c);
2436 
2437       if (m == MATCH_ERROR)
2438 	goto done;
2439       if (m == MATCH_NO)
2440 	goto syntax;
2441 
2442       if (gfc_match (" , len =") == MATCH_NO)
2443 	goto rparen;
2444 
2445       m = char_len_param_value (&len, &deferred);
2446       if (m == MATCH_NO)
2447 	goto syntax;
2448       if (m == MATCH_ERROR)
2449 	goto done;
2450       seen_length = 1;
2451 
2452       goto rparen;
2453     }
2454 
2455   /* Try to match "LEN = <len-param>" or "LEN = <len-param>, KIND = <int>".  */
2456   if (gfc_match (" len =") == MATCH_YES)
2457     {
2458       m = char_len_param_value (&len, &deferred);
2459       if (m == MATCH_NO)
2460 	goto syntax;
2461       if (m == MATCH_ERROR)
2462 	goto done;
2463       seen_length = 1;
2464 
2465       if (gfc_match_char (')') == MATCH_YES)
2466 	goto done;
2467 
2468       if (gfc_match (" , kind =") != MATCH_YES)
2469 	goto syntax;
2470 
2471       if (match_char_kind (&kind, &is_iso_c) == MATCH_ERROR)
2472 	goto done;
2473 
2474       goto rparen;
2475     }
2476 
2477   /* Try to match ( <len-param> ) or ( <len-param> , [ KIND = ] <int> ).  */
2478   m = char_len_param_value (&len, &deferred);
2479   if (m == MATCH_NO)
2480     goto syntax;
2481   if (m == MATCH_ERROR)
2482     goto done;
2483   seen_length = 1;
2484 
2485   m = gfc_match_char (')');
2486   if (m == MATCH_YES)
2487     goto done;
2488 
2489   if (gfc_match_char (',') != MATCH_YES)
2490     goto syntax;
2491 
2492   gfc_match (" kind =");	/* Gobble optional text.  */
2493 
2494   m = match_char_kind (&kind, &is_iso_c);
2495   if (m == MATCH_ERROR)
2496     goto done;
2497   if (m == MATCH_NO)
2498     goto syntax;
2499 
2500 rparen:
2501   /* Require a right-paren at this point.  */
2502   m = gfc_match_char (')');
2503   if (m == MATCH_YES)
2504     goto done;
2505 
2506 syntax:
2507   gfc_error ("Syntax error in CHARACTER declaration at %C");
2508   m = MATCH_ERROR;
2509   gfc_free_expr (len);
2510   return m;
2511 
2512 done:
2513   /* Deal with character functions after USE and IMPORT statements.  */
2514   if (gfc_matching_function)
2515     {
2516       gfc_free_expr (len);
2517       gfc_undo_symbols ();
2518       return MATCH_YES;
2519     }
2520 
2521   if (m != MATCH_YES)
2522     {
2523       gfc_free_expr (len);
2524       return m;
2525     }
2526 
2527   /* Do some final massaging of the length values.  */
2528   cl = gfc_new_charlen (gfc_current_ns, NULL);
2529 
2530   if (seen_length == 0)
2531     cl->length = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
2532   else
2533     cl->length = len;
2534 
2535   ts->u.cl = cl;
2536   ts->kind = kind == 0 ? gfc_default_character_kind : kind;
2537   ts->deferred = deferred;
2538 
2539   /* We have to know if it was a C interoperable kind so we can
2540      do accurate type checking of bind(c) procs, etc.  */
2541   if (kind != 0)
2542     /* Mark this as C interoperable if being declared with one
2543        of the named constants from iso_c_binding.  */
2544     ts->is_c_interop = is_iso_c;
2545   else if (len != NULL)
2546     /* Here, we might have parsed something such as: character(c_char)
2547        In this case, the parsing code above grabs the c_char when
2548        looking for the length (line 1690, roughly).  it's the last
2549        testcase for parsing the kind params of a character variable.
2550        However, it's not actually the length.	 this seems like it
2551        could be an error.
2552        To see if the user used a C interop kind, test the expr
2553        of the so called length, and see if it's C interoperable.  */
2554     ts->is_c_interop = len->ts.is_iso_c;
2555 
2556   return MATCH_YES;
2557 }
2558 
2559 
2560 /* Matches a declaration-type-spec (F03:R502).  If successful, sets the ts
2561    structure to the matched specification.  This is necessary for FUNCTION and
2562    IMPLICIT statements.
2563 
2564    If implicit_flag is nonzero, then we don't check for the optional
2565    kind specification.  Not doing so is needed for matching an IMPLICIT
2566    statement correctly.  */
2567 
2568 match
gfc_match_decl_type_spec(gfc_typespec * ts,int implicit_flag)2569 gfc_match_decl_type_spec (gfc_typespec *ts, int implicit_flag)
2570 {
2571   char name[GFC_MAX_SYMBOL_LEN + 1];
2572   gfc_symbol *sym, *dt_sym;
2573   match m;
2574   char c;
2575   bool seen_deferred_kind, matched_type;
2576   const char *dt_name;
2577 
2578   /* A belt and braces check that the typespec is correctly being treated
2579      as a deferred characteristic association.  */
2580   seen_deferred_kind = (gfc_current_state () == COMP_FUNCTION)
2581 			  && (gfc_current_block ()->result->ts.kind == -1)
2582 			  && (ts->kind == -1);
2583   gfc_clear_ts (ts);
2584   if (seen_deferred_kind)
2585     ts->kind = -1;
2586 
2587   /* Clear the current binding label, in case one is given.  */
2588   curr_binding_label = NULL;
2589 
2590   if (gfc_match (" byte") == MATCH_YES)
2591     {
2592       if (gfc_notify_std (GFC_STD_GNU, "BYTE type at %C")
2593 	  == FAILURE)
2594 	return MATCH_ERROR;
2595 
2596       if (gfc_validate_kind (BT_INTEGER, 1, true) < 0)
2597 	{
2598 	  gfc_error ("BYTE type used at %C "
2599 		     "is not available on the target machine");
2600 	  return MATCH_ERROR;
2601 	}
2602 
2603       ts->type = BT_INTEGER;
2604       ts->kind = 1;
2605       return MATCH_YES;
2606     }
2607 
2608 
2609   m = gfc_match (" type (");
2610   matched_type = (m == MATCH_YES);
2611   if (matched_type)
2612     {
2613       gfc_gobble_whitespace ();
2614       if (gfc_peek_ascii_char () == '*')
2615 	{
2616 	  if ((m = gfc_match ("*)")) != MATCH_YES)
2617 	    return m;
2618 	  if (gfc_current_state () == COMP_DERIVED)
2619 	    {
2620 	      gfc_error ("Assumed type at %C is not allowed for components");
2621 	      return MATCH_ERROR;
2622 	    }
2623 	  if (gfc_notify_std (GFC_STD_F2008_TS, "Assumed type "
2624 			  "at %C") == FAILURE)
2625 	    return MATCH_ERROR;
2626 	  ts->type = BT_ASSUMED;
2627 	  return MATCH_YES;
2628 	}
2629 
2630       m = gfc_match ("%n", name);
2631       matched_type = (m == MATCH_YES);
2632     }
2633 
2634   if ((matched_type && strcmp ("integer", name) == 0)
2635       || (!matched_type && gfc_match (" integer") == MATCH_YES))
2636     {
2637       ts->type = BT_INTEGER;
2638       ts->kind = gfc_default_integer_kind;
2639       goto get_kind;
2640     }
2641 
2642   if ((matched_type && strcmp ("character", name) == 0)
2643       || (!matched_type && gfc_match (" character") == MATCH_YES))
2644     {
2645       if (matched_type
2646 	  && gfc_notify_std (GFC_STD_F2008, "TYPE with "
2647 			  "intrinsic-type-spec at %C") == FAILURE)
2648 	return MATCH_ERROR;
2649 
2650       ts->type = BT_CHARACTER;
2651       if (implicit_flag == 0)
2652 	m = gfc_match_char_spec (ts);
2653       else
2654 	m = MATCH_YES;
2655 
2656       if (matched_type && m == MATCH_YES && gfc_match_char (')') != MATCH_YES)
2657 	m = MATCH_ERROR;
2658 
2659       return m;
2660     }
2661 
2662   if ((matched_type && strcmp ("real", name) == 0)
2663       || (!matched_type && gfc_match (" real") == MATCH_YES))
2664     {
2665       ts->type = BT_REAL;
2666       ts->kind = gfc_default_real_kind;
2667       goto get_kind;
2668     }
2669 
2670   if ((matched_type
2671        && (strcmp ("doubleprecision", name) == 0
2672 	   || (strcmp ("double", name) == 0
2673 	       && gfc_match (" precision") == MATCH_YES)))
2674       || (!matched_type && gfc_match (" double precision") == MATCH_YES))
2675     {
2676       if (matched_type
2677 	  && gfc_notify_std (GFC_STD_F2008, "TYPE with "
2678 			  "intrinsic-type-spec at %C") == FAILURE)
2679 	return MATCH_ERROR;
2680       if (matched_type && gfc_match_char (')') != MATCH_YES)
2681 	return MATCH_ERROR;
2682 
2683       ts->type = BT_REAL;
2684       ts->kind = gfc_default_double_kind;
2685       return MATCH_YES;
2686     }
2687 
2688   if ((matched_type && strcmp ("complex", name) == 0)
2689       || (!matched_type && gfc_match (" complex") == MATCH_YES))
2690     {
2691       ts->type = BT_COMPLEX;
2692       ts->kind = gfc_default_complex_kind;
2693       goto get_kind;
2694     }
2695 
2696   if ((matched_type
2697        && (strcmp ("doublecomplex", name) == 0
2698 	   || (strcmp ("double", name) == 0
2699 	       && gfc_match (" complex") == MATCH_YES)))
2700       || (!matched_type && gfc_match (" double complex") == MATCH_YES))
2701     {
2702       if (gfc_notify_std (GFC_STD_GNU, "DOUBLE COMPLEX at %C")
2703 	  == FAILURE)
2704 	return MATCH_ERROR;
2705 
2706       if (matched_type
2707 	  && gfc_notify_std (GFC_STD_F2008, "TYPE with "
2708 			  "intrinsic-type-spec at %C") == FAILURE)
2709 	return MATCH_ERROR;
2710 
2711       if (matched_type && gfc_match_char (')') != MATCH_YES)
2712 	return MATCH_ERROR;
2713 
2714       ts->type = BT_COMPLEX;
2715       ts->kind = gfc_default_double_kind;
2716       return MATCH_YES;
2717     }
2718 
2719   if ((matched_type && strcmp ("logical", name) == 0)
2720       || (!matched_type && gfc_match (" logical") == MATCH_YES))
2721     {
2722       ts->type = BT_LOGICAL;
2723       ts->kind = gfc_default_logical_kind;
2724       goto get_kind;
2725     }
2726 
2727   if (matched_type)
2728     m = gfc_match_char (')');
2729 
2730   if (m == MATCH_YES)
2731     ts->type = BT_DERIVED;
2732   else
2733     {
2734       /* Match CLASS declarations.  */
2735       m = gfc_match (" class ( * )");
2736       if (m == MATCH_ERROR)
2737 	return MATCH_ERROR;
2738       else if (m == MATCH_YES)
2739 	{
2740 	  gfc_symbol *upe;
2741 	  gfc_symtree *st;
2742 	  ts->type = BT_CLASS;
2743 	  gfc_find_symbol ("STAR", gfc_current_ns, 1, &upe);
2744 	  if (upe == NULL)
2745 	    {
2746 	      upe = gfc_new_symbol ("STAR", gfc_current_ns);
2747 	      st = gfc_new_symtree (&gfc_current_ns->sym_root, "STAR");
2748 	      st->n.sym = upe;
2749 	      gfc_set_sym_referenced (upe);
2750 	      upe->refs++;
2751 	      upe->ts.type = BT_VOID;
2752 	      upe->attr.unlimited_polymorphic = 1;
2753 	      /* This is essential to force the construction of
2754 		 unlimited polymorphic component class containers.  */
2755 	      upe->attr.zero_comp = 1;
2756 	      if (gfc_add_flavor (&upe->attr, FL_DERIVED,
2757 				  NULL, &gfc_current_locus) == FAILURE)
2758 	  return MATCH_ERROR;
2759 	}
2760 	  else
2761 	    {
2762 	      st = gfc_find_symtree (gfc_current_ns->sym_root, "STAR");
2763 	      if (st == NULL)
2764 		st = gfc_new_symtree (&gfc_current_ns->sym_root, "STAR");
2765 	      st->n.sym = upe;
2766 	      upe->refs++;
2767 	    }
2768 	  ts->u.derived = upe;
2769 	  return m;
2770 	}
2771 
2772       m = gfc_match (" class ( %n )", name);
2773       if (m != MATCH_YES)
2774 	return m;
2775       ts->type = BT_CLASS;
2776 
2777       if (gfc_notify_std (GFC_STD_F2003, "CLASS statement at %C")
2778 			  == FAILURE)
2779 	return MATCH_ERROR;
2780     }
2781 
2782   /* Defer association of the derived type until the end of the
2783      specification block.  However, if the derived type can be
2784      found, add it to the typespec.  */
2785   if (gfc_matching_function)
2786     {
2787       ts->u.derived = NULL;
2788       if (gfc_current_state () != COMP_INTERFACE
2789 	    && !gfc_find_symbol (name, NULL, 1, &sym) && sym)
2790 	{
2791 	  sym = gfc_find_dt_in_generic (sym);
2792 	  ts->u.derived = sym;
2793 	}
2794       return MATCH_YES;
2795     }
2796 
2797   /* Search for the name but allow the components to be defined later.  If
2798      type = -1, this typespec has been seen in a function declaration but
2799      the type could not be accessed at that point.  The actual derived type is
2800      stored in a symtree with the first letter of the name capitalized; the
2801      symtree with the all lower-case name contains the associated
2802      generic function.  */
2803   dt_name = gfc_get_string ("%c%s",
2804 			    (char) TOUPPER ((unsigned char) name[0]),
2805 			    (const char*)&name[1]);
2806   sym = NULL;
2807   dt_sym = NULL;
2808   if (ts->kind != -1)
2809     {
2810       gfc_get_ha_symbol (name, &sym);
2811       if (sym->generic && gfc_find_symbol (dt_name, NULL, 0, &dt_sym))
2812 	{
2813 	  gfc_error ("Type name '%s' at %C is ambiguous", name);
2814 	  return MATCH_ERROR;
2815 	}
2816       if (sym->generic && !dt_sym)
2817 	dt_sym = gfc_find_dt_in_generic (sym);
2818     }
2819   else if (ts->kind == -1)
2820     {
2821       int iface = gfc_state_stack->previous->state != COMP_INTERFACE
2822 		    || gfc_current_ns->has_import_set;
2823       gfc_find_symbol (name, NULL, iface, &sym);
2824       if (sym && sym->generic && gfc_find_symbol (dt_name, NULL, 1, &dt_sym))
2825 	{
2826 	  gfc_error ("Type name '%s' at %C is ambiguous", name);
2827 	  return MATCH_ERROR;
2828 	}
2829       if (sym && sym->generic && !dt_sym)
2830 	dt_sym = gfc_find_dt_in_generic (sym);
2831 
2832       ts->kind = 0;
2833       if (sym == NULL)
2834 	return MATCH_NO;
2835     }
2836 
2837   if ((sym->attr.flavor != FL_UNKNOWN
2838        && !(sym->attr.flavor == FL_PROCEDURE && sym->attr.generic))
2839       || sym->attr.subroutine)
2840     {
2841       gfc_error ("Type name '%s' at %C conflicts with previously declared "
2842 	         "entity at %L, which has the same name", name,
2843 		 &sym->declared_at);
2844       return MATCH_ERROR;
2845     }
2846 
2847   gfc_set_sym_referenced (sym);
2848   if (!sym->attr.generic
2849       && gfc_add_generic (&sym->attr, sym->name, NULL) == FAILURE)
2850     return MATCH_ERROR;
2851 
2852   if (!sym->attr.function
2853       && gfc_add_function (&sym->attr, sym->name, NULL) == FAILURE)
2854     return MATCH_ERROR;
2855 
2856   if (!dt_sym)
2857     {
2858       gfc_interface *intr, *head;
2859 
2860       /* Use upper case to save the actual derived-type symbol.  */
2861       gfc_get_symbol (dt_name, NULL, &dt_sym);
2862       dt_sym->name = gfc_get_string (sym->name);
2863       head = sym->generic;
2864       intr = gfc_get_interface ();
2865       intr->sym = dt_sym;
2866       intr->where = gfc_current_locus;
2867       intr->next = head;
2868       sym->generic = intr;
2869       sym->attr.if_source = IFSRC_DECL;
2870     }
2871 
2872   gfc_set_sym_referenced (dt_sym);
2873 
2874   if (dt_sym->attr.flavor != FL_DERIVED
2875       && gfc_add_flavor (&dt_sym->attr, FL_DERIVED, sym->name, NULL)
2876 			 == FAILURE)
2877     return MATCH_ERROR;
2878 
2879   ts->u.derived = dt_sym;
2880 
2881   return MATCH_YES;
2882 
2883 get_kind:
2884   if (matched_type
2885       && gfc_notify_std (GFC_STD_F2008, "TYPE with "
2886 			 "intrinsic-type-spec at %C") == FAILURE)
2887     return MATCH_ERROR;
2888 
2889   /* For all types except double, derived and character, look for an
2890      optional kind specifier.  MATCH_NO is actually OK at this point.  */
2891   if (implicit_flag == 1)
2892     {
2893 	if (matched_type && gfc_match_char (')') != MATCH_YES)
2894 	  return MATCH_ERROR;
2895 
2896 	return MATCH_YES;
2897     }
2898 
2899   if (gfc_current_form == FORM_FREE)
2900     {
2901       c = gfc_peek_ascii_char ();
2902       if (!gfc_is_whitespace (c) && c != '*' && c != '('
2903 	  && c != ':' && c != ',')
2904         {
2905 	  if (matched_type && c == ')')
2906 	    {
2907 	      gfc_next_ascii_char ();
2908 	      return MATCH_YES;
2909 	    }
2910 	  return MATCH_NO;
2911 	}
2912     }
2913 
2914   m = gfc_match_kind_spec (ts, false);
2915   if (m == MATCH_NO && ts->type != BT_CHARACTER)
2916     m = gfc_match_old_kind_spec (ts);
2917 
2918   if (matched_type && gfc_match_char (')') != MATCH_YES)
2919     return MATCH_ERROR;
2920 
2921   /* Defer association of the KIND expression of function results
2922      until after USE and IMPORT statements.  */
2923   if ((gfc_current_state () == COMP_NONE && gfc_error_flag_test ())
2924 	 || gfc_matching_function)
2925     return MATCH_YES;
2926 
2927   if (m == MATCH_NO)
2928     m = MATCH_YES;		/* No kind specifier found.  */
2929 
2930   return m;
2931 }
2932 
2933 
2934 /* Match an IMPLICIT NONE statement.  Actually, this statement is
2935    already matched in parse.c, or we would not end up here in the
2936    first place.  So the only thing we need to check, is if there is
2937    trailing garbage.  If not, the match is successful.  */
2938 
2939 match
gfc_match_implicit_none(void)2940 gfc_match_implicit_none (void)
2941 {
2942   return (gfc_match_eos () == MATCH_YES) ? MATCH_YES : MATCH_NO;
2943 }
2944 
2945 
2946 /* Match the letter range(s) of an IMPLICIT statement.  */
2947 
2948 static match
match_implicit_range(void)2949 match_implicit_range (void)
2950 {
2951   char c, c1, c2;
2952   int inner;
2953   locus cur_loc;
2954 
2955   cur_loc = gfc_current_locus;
2956 
2957   gfc_gobble_whitespace ();
2958   c = gfc_next_ascii_char ();
2959   if (c != '(')
2960     {
2961       gfc_error ("Missing character range in IMPLICIT at %C");
2962       goto bad;
2963     }
2964 
2965   inner = 1;
2966   while (inner)
2967     {
2968       gfc_gobble_whitespace ();
2969       c1 = gfc_next_ascii_char ();
2970       if (!ISALPHA (c1))
2971 	goto bad;
2972 
2973       gfc_gobble_whitespace ();
2974       c = gfc_next_ascii_char ();
2975 
2976       switch (c)
2977 	{
2978 	case ')':
2979 	  inner = 0;		/* Fall through.  */
2980 
2981 	case ',':
2982 	  c2 = c1;
2983 	  break;
2984 
2985 	case '-':
2986 	  gfc_gobble_whitespace ();
2987 	  c2 = gfc_next_ascii_char ();
2988 	  if (!ISALPHA (c2))
2989 	    goto bad;
2990 
2991 	  gfc_gobble_whitespace ();
2992 	  c = gfc_next_ascii_char ();
2993 
2994 	  if ((c != ',') && (c != ')'))
2995 	    goto bad;
2996 	  if (c == ')')
2997 	    inner = 0;
2998 
2999 	  break;
3000 
3001 	default:
3002 	  goto bad;
3003 	}
3004 
3005       if (c1 > c2)
3006 	{
3007 	  gfc_error ("Letters must be in alphabetic order in "
3008 		     "IMPLICIT statement at %C");
3009 	  goto bad;
3010 	}
3011 
3012       /* See if we can add the newly matched range to the pending
3013 	 implicits from this IMPLICIT statement.  We do not check for
3014 	 conflicts with whatever earlier IMPLICIT statements may have
3015 	 set.  This is done when we've successfully finished matching
3016 	 the current one.  */
3017       if (gfc_add_new_implicit_range (c1, c2) != SUCCESS)
3018 	goto bad;
3019     }
3020 
3021   return MATCH_YES;
3022 
3023 bad:
3024   gfc_syntax_error (ST_IMPLICIT);
3025 
3026   gfc_current_locus = cur_loc;
3027   return MATCH_ERROR;
3028 }
3029 
3030 
3031 /* Match an IMPLICIT statement, storing the types for
3032    gfc_set_implicit() if the statement is accepted by the parser.
3033    There is a strange looking, but legal syntactic construction
3034    possible.  It looks like:
3035 
3036      IMPLICIT INTEGER (a-b) (c-d)
3037 
3038    This is legal if "a-b" is a constant expression that happens to
3039    equal one of the legal kinds for integers.  The real problem
3040    happens with an implicit specification that looks like:
3041 
3042      IMPLICIT INTEGER (a-b)
3043 
3044    In this case, a typespec matcher that is "greedy" (as most of the
3045    matchers are) gobbles the character range as a kindspec, leaving
3046    nothing left.  We therefore have to go a bit more slowly in the
3047    matching process by inhibiting the kindspec checking during
3048    typespec matching and checking for a kind later.  */
3049 
3050 match
gfc_match_implicit(void)3051 gfc_match_implicit (void)
3052 {
3053   gfc_typespec ts;
3054   locus cur_loc;
3055   char c;
3056   match m;
3057 
3058   gfc_clear_ts (&ts);
3059 
3060   /* We don't allow empty implicit statements.  */
3061   if (gfc_match_eos () == MATCH_YES)
3062     {
3063       gfc_error ("Empty IMPLICIT statement at %C");
3064       return MATCH_ERROR;
3065     }
3066 
3067   do
3068     {
3069       /* First cleanup.  */
3070       gfc_clear_new_implicit ();
3071 
3072       /* A basic type is mandatory here.  */
3073       m = gfc_match_decl_type_spec (&ts, 1);
3074       if (m == MATCH_ERROR)
3075 	goto error;
3076       if (m == MATCH_NO)
3077 	goto syntax;
3078 
3079       cur_loc = gfc_current_locus;
3080       m = match_implicit_range ();
3081 
3082       if (m == MATCH_YES)
3083 	{
3084 	  /* We may have <TYPE> (<RANGE>).  */
3085 	  gfc_gobble_whitespace ();
3086 	  c = gfc_next_ascii_char ();
3087 	  if ((c == '\n') || (c == ','))
3088 	    {
3089 	      /* Check for CHARACTER with no length parameter.  */
3090 	      if (ts.type == BT_CHARACTER && !ts.u.cl)
3091 		{
3092 		  ts.kind = gfc_default_character_kind;
3093 		  ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
3094 		  ts.u.cl->length = gfc_get_int_expr (gfc_default_integer_kind,
3095 						      NULL, 1);
3096 		}
3097 
3098 	      /* Record the Successful match.  */
3099 	      if (gfc_merge_new_implicit (&ts) != SUCCESS)
3100 		return MATCH_ERROR;
3101 	      continue;
3102 	    }
3103 
3104 	  gfc_current_locus = cur_loc;
3105 	}
3106 
3107       /* Discard the (incorrectly) matched range.  */
3108       gfc_clear_new_implicit ();
3109 
3110       /* Last chance -- check <TYPE> <SELECTOR> (<RANGE>).  */
3111       if (ts.type == BT_CHARACTER)
3112 	m = gfc_match_char_spec (&ts);
3113       else
3114 	{
3115 	  m = gfc_match_kind_spec (&ts, false);
3116 	  if (m == MATCH_NO)
3117 	    {
3118 	      m = gfc_match_old_kind_spec (&ts);
3119 	      if (m == MATCH_ERROR)
3120 		goto error;
3121 	      if (m == MATCH_NO)
3122 		goto syntax;
3123 	    }
3124 	}
3125       if (m == MATCH_ERROR)
3126 	goto error;
3127 
3128       m = match_implicit_range ();
3129       if (m == MATCH_ERROR)
3130 	goto error;
3131       if (m == MATCH_NO)
3132 	goto syntax;
3133 
3134       gfc_gobble_whitespace ();
3135       c = gfc_next_ascii_char ();
3136       if ((c != '\n') && (c != ','))
3137 	goto syntax;
3138 
3139       if (gfc_merge_new_implicit (&ts) != SUCCESS)
3140 	return MATCH_ERROR;
3141     }
3142   while (c == ',');
3143 
3144   return MATCH_YES;
3145 
3146 syntax:
3147   gfc_syntax_error (ST_IMPLICIT);
3148 
3149 error:
3150   return MATCH_ERROR;
3151 }
3152 
3153 
3154 match
gfc_match_import(void)3155 gfc_match_import (void)
3156 {
3157   char name[GFC_MAX_SYMBOL_LEN + 1];
3158   match m;
3159   gfc_symbol *sym;
3160   gfc_symtree *st;
3161 
3162   if (gfc_current_ns->proc_name == NULL
3163       || gfc_current_ns->proc_name->attr.if_source != IFSRC_IFBODY)
3164     {
3165       gfc_error ("IMPORT statement at %C only permitted in "
3166 		 "an INTERFACE body");
3167       return MATCH_ERROR;
3168     }
3169 
3170   if (gfc_notify_std (GFC_STD_F2003, "IMPORT statement at %C")
3171       == FAILURE)
3172     return MATCH_ERROR;
3173 
3174   if (gfc_match_eos () == MATCH_YES)
3175     {
3176       /* All host variables should be imported.  */
3177       gfc_current_ns->has_import_set = 1;
3178       return MATCH_YES;
3179     }
3180 
3181   if (gfc_match (" ::") == MATCH_YES)
3182     {
3183       if (gfc_match_eos () == MATCH_YES)
3184 	{
3185 	   gfc_error ("Expecting list of named entities at %C");
3186 	   return MATCH_ERROR;
3187 	}
3188     }
3189 
3190   for(;;)
3191     {
3192       sym = NULL;
3193       m = gfc_match (" %n", name);
3194       switch (m)
3195 	{
3196 	case MATCH_YES:
3197 	  if (gfc_current_ns->parent !=  NULL
3198 	      && gfc_find_symbol (name, gfc_current_ns->parent, 1, &sym))
3199 	    {
3200 	       gfc_error ("Type name '%s' at %C is ambiguous", name);
3201 	       return MATCH_ERROR;
3202 	    }
3203 	  else if (!sym && gfc_current_ns->proc_name->ns->parent !=  NULL
3204 		   && gfc_find_symbol (name,
3205 				       gfc_current_ns->proc_name->ns->parent,
3206 				       1, &sym))
3207 	    {
3208 	       gfc_error ("Type name '%s' at %C is ambiguous", name);
3209 	       return MATCH_ERROR;
3210 	    }
3211 
3212 	  if (sym == NULL)
3213 	    {
3214 	      gfc_error ("Cannot IMPORT '%s' from host scoping unit "
3215 			 "at %C - does not exist.", name);
3216 	      return MATCH_ERROR;
3217 	    }
3218 
3219 	  if (gfc_find_symtree (gfc_current_ns->sym_root, name))
3220 	    {
3221 	      gfc_warning ("'%s' is already IMPORTed from host scoping unit "
3222 			   "at %C.", name);
3223 	      goto next_item;
3224 	    }
3225 
3226 	  st = gfc_new_symtree (&gfc_current_ns->sym_root, name);
3227 	  st->n.sym = sym;
3228 	  sym->refs++;
3229 	  sym->attr.imported = 1;
3230 
3231 	  if (sym->attr.generic && (sym = gfc_find_dt_in_generic (sym)))
3232 	    {
3233 	      /* The actual derived type is stored in a symtree with the first
3234 		 letter of the name capitalized; the symtree with the all
3235 		 lower-case name contains the associated generic function. */
3236 	      st = gfc_new_symtree (&gfc_current_ns->sym_root,
3237 			gfc_get_string ("%c%s",
3238 				(char) TOUPPER ((unsigned char) name[0]),
3239 				&name[1]));
3240 	      st->n.sym = sym;
3241 	      sym->refs++;
3242 	      sym->attr.imported = 1;
3243 	    }
3244 
3245 	  goto next_item;
3246 
3247 	case MATCH_NO:
3248 	  break;
3249 
3250 	case MATCH_ERROR:
3251 	  return MATCH_ERROR;
3252 	}
3253 
3254     next_item:
3255       if (gfc_match_eos () == MATCH_YES)
3256 	break;
3257       if (gfc_match_char (',') != MATCH_YES)
3258 	goto syntax;
3259     }
3260 
3261   return MATCH_YES;
3262 
3263 syntax:
3264   gfc_error ("Syntax error in IMPORT statement at %C");
3265   return MATCH_ERROR;
3266 }
3267 
3268 
3269 /* A minimal implementation of gfc_match without whitespace, escape
3270    characters or variable arguments.  Returns true if the next
3271    characters match the TARGET template exactly.  */
3272 
3273 static bool
match_string_p(const char * target)3274 match_string_p (const char *target)
3275 {
3276   const char *p;
3277 
3278   for (p = target; *p; p++)
3279     if ((char) gfc_next_ascii_char () != *p)
3280       return false;
3281   return true;
3282 }
3283 
3284 /* Matches an attribute specification including array specs.  If
3285    successful, leaves the variables current_attr and current_as
3286    holding the specification.  Also sets the colon_seen variable for
3287    later use by matchers associated with initializations.
3288 
3289    This subroutine is a little tricky in the sense that we don't know
3290    if we really have an attr-spec until we hit the double colon.
3291    Until that time, we can only return MATCH_NO.  This forces us to
3292    check for duplicate specification at this level.  */
3293 
3294 static match
match_attr_spec(void)3295 match_attr_spec (void)
3296 {
3297   /* Modifiers that can exist in a type statement.  */
3298   enum
3299   { GFC_DECL_BEGIN = 0,
3300     DECL_ALLOCATABLE = GFC_DECL_BEGIN, DECL_DIMENSION, DECL_EXTERNAL,
3301     DECL_IN, DECL_OUT, DECL_INOUT, DECL_INTRINSIC, DECL_OPTIONAL,
3302     DECL_PARAMETER, DECL_POINTER, DECL_PROTECTED, DECL_PRIVATE,
3303     DECL_PUBLIC, DECL_SAVE, DECL_TARGET, DECL_VALUE, DECL_VOLATILE,
3304     DECL_IS_BIND_C, DECL_CODIMENSION, DECL_ASYNCHRONOUS, DECL_CONTIGUOUS,
3305     DECL_NONE, GFC_DECL_END /* Sentinel */
3306   };
3307 
3308 /* GFC_DECL_END is the sentinel, index starts at 0.  */
3309 #define NUM_DECL GFC_DECL_END
3310 
3311   locus start, seen_at[NUM_DECL];
3312   int seen[NUM_DECL];
3313   unsigned int d;
3314   const char *attr;
3315   match m;
3316   gfc_try t;
3317 
3318   gfc_clear_attr (&current_attr);
3319   start = gfc_current_locus;
3320 
3321   current_as = NULL;
3322   colon_seen = 0;
3323 
3324   /* See if we get all of the keywords up to the final double colon.  */
3325   for (d = GFC_DECL_BEGIN; d != GFC_DECL_END; d++)
3326     seen[d] = 0;
3327 
3328   for (;;)
3329     {
3330       char ch;
3331 
3332       d = DECL_NONE;
3333       gfc_gobble_whitespace ();
3334 
3335       ch = gfc_next_ascii_char ();
3336       if (ch == ':')
3337 	{
3338 	  /* This is the successful exit condition for the loop.  */
3339 	  if (gfc_next_ascii_char () == ':')
3340 	    break;
3341 	}
3342       else if (ch == ',')
3343 	{
3344 	  gfc_gobble_whitespace ();
3345 	  switch (gfc_peek_ascii_char ())
3346 	    {
3347 	    case 'a':
3348 	      gfc_next_ascii_char ();
3349 	      switch (gfc_next_ascii_char ())
3350 		{
3351 		case 'l':
3352 		  if (match_string_p ("locatable"))
3353 		    {
3354 		      /* Matched "allocatable".  */
3355 		      d = DECL_ALLOCATABLE;
3356 		    }
3357 		  break;
3358 
3359 		case 's':
3360 		  if (match_string_p ("ynchronous"))
3361 		    {
3362 		      /* Matched "asynchronous".  */
3363 		      d = DECL_ASYNCHRONOUS;
3364 		    }
3365 		  break;
3366 		}
3367 	      break;
3368 
3369 	    case 'b':
3370 	      /* Try and match the bind(c).  */
3371 	      m = gfc_match_bind_c (NULL, true);
3372 	      if (m == MATCH_YES)
3373 		d = DECL_IS_BIND_C;
3374 	      else if (m == MATCH_ERROR)
3375 		goto cleanup;
3376 	      break;
3377 
3378 	    case 'c':
3379 	      gfc_next_ascii_char ();
3380 	      if ('o' != gfc_next_ascii_char ())
3381 		break;
3382 	      switch (gfc_next_ascii_char ())
3383 		{
3384 		case 'd':
3385 		  if (match_string_p ("imension"))
3386 		    {
3387 		      d = DECL_CODIMENSION;
3388 		      break;
3389 		    }
3390 		case 'n':
3391 		  if (match_string_p ("tiguous"))
3392 		    {
3393 		      d = DECL_CONTIGUOUS;
3394 		      break;
3395 		    }
3396 		}
3397 	      break;
3398 
3399 	    case 'd':
3400 	      if (match_string_p ("dimension"))
3401 		d = DECL_DIMENSION;
3402 	      break;
3403 
3404 	    case 'e':
3405 	      if (match_string_p ("external"))
3406 		d = DECL_EXTERNAL;
3407 	      break;
3408 
3409 	    case 'i':
3410 	      if (match_string_p ("int"))
3411 		{
3412 		  ch = gfc_next_ascii_char ();
3413 		  if (ch == 'e')
3414 		    {
3415 		      if (match_string_p ("nt"))
3416 			{
3417 			  /* Matched "intent".  */
3418 			  /* TODO: Call match_intent_spec from here.  */
3419 			  if (gfc_match (" ( in out )") == MATCH_YES)
3420 			    d = DECL_INOUT;
3421 			  else if (gfc_match (" ( in )") == MATCH_YES)
3422 			    d = DECL_IN;
3423 			  else if (gfc_match (" ( out )") == MATCH_YES)
3424 			    d = DECL_OUT;
3425 			}
3426 		    }
3427 		  else if (ch == 'r')
3428 		    {
3429 		      if (match_string_p ("insic"))
3430 			{
3431 			  /* Matched "intrinsic".  */
3432 			  d = DECL_INTRINSIC;
3433 			}
3434 		    }
3435 		}
3436 	      break;
3437 
3438 	    case 'o':
3439 	      if (match_string_p ("optional"))
3440 		d = DECL_OPTIONAL;
3441 	      break;
3442 
3443 	    case 'p':
3444 	      gfc_next_ascii_char ();
3445 	      switch (gfc_next_ascii_char ())
3446 		{
3447 		case 'a':
3448 		  if (match_string_p ("rameter"))
3449 		    {
3450 		      /* Matched "parameter".  */
3451 		      d = DECL_PARAMETER;
3452 		    }
3453 		  break;
3454 
3455 		case 'o':
3456 		  if (match_string_p ("inter"))
3457 		    {
3458 		      /* Matched "pointer".  */
3459 		      d = DECL_POINTER;
3460 		    }
3461 		  break;
3462 
3463 		case 'r':
3464 		  ch = gfc_next_ascii_char ();
3465 		  if (ch == 'i')
3466 		    {
3467 		      if (match_string_p ("vate"))
3468 			{
3469 			  /* Matched "private".  */
3470 			  d = DECL_PRIVATE;
3471 			}
3472 		    }
3473 		  else if (ch == 'o')
3474 		    {
3475 		      if (match_string_p ("tected"))
3476 			{
3477 			  /* Matched "protected".  */
3478 			  d = DECL_PROTECTED;
3479 			}
3480 		    }
3481 		  break;
3482 
3483 		case 'u':
3484 		  if (match_string_p ("blic"))
3485 		    {
3486 		      /* Matched "public".  */
3487 		      d = DECL_PUBLIC;
3488 		    }
3489 		  break;
3490 		}
3491 	      break;
3492 
3493 	    case 's':
3494 	      if (match_string_p ("save"))
3495 		d = DECL_SAVE;
3496 	      break;
3497 
3498 	    case 't':
3499 	      if (match_string_p ("target"))
3500 		d = DECL_TARGET;
3501 	      break;
3502 
3503 	    case 'v':
3504 	      gfc_next_ascii_char ();
3505 	      ch = gfc_next_ascii_char ();
3506 	      if (ch == 'a')
3507 		{
3508 		  if (match_string_p ("lue"))
3509 		    {
3510 		      /* Matched "value".  */
3511 		      d = DECL_VALUE;
3512 		    }
3513 		}
3514 	      else if (ch == 'o')
3515 		{
3516 		  if (match_string_p ("latile"))
3517 		    {
3518 		      /* Matched "volatile".  */
3519 		      d = DECL_VOLATILE;
3520 		    }
3521 		}
3522 	      break;
3523 	    }
3524 	}
3525 
3526       /* No double colon and no recognizable decl_type, so assume that
3527 	 we've been looking at something else the whole time.  */
3528       if (d == DECL_NONE)
3529 	{
3530 	  m = MATCH_NO;
3531 	  goto cleanup;
3532 	}
3533 
3534       /* Check to make sure any parens are paired up correctly.  */
3535       if (gfc_match_parens () == MATCH_ERROR)
3536 	{
3537 	  m = MATCH_ERROR;
3538 	  goto cleanup;
3539 	}
3540 
3541       seen[d]++;
3542       seen_at[d] = gfc_current_locus;
3543 
3544       if (d == DECL_DIMENSION || d == DECL_CODIMENSION)
3545 	{
3546 	  gfc_array_spec *as = NULL;
3547 
3548 	  m = gfc_match_array_spec (&as, d == DECL_DIMENSION,
3549 				    d == DECL_CODIMENSION);
3550 
3551 	  if (current_as == NULL)
3552 	    current_as = as;
3553 	  else if (m == MATCH_YES)
3554 	    {
3555 	      if (merge_array_spec (as, current_as, false) == FAILURE)
3556 		m = MATCH_ERROR;
3557 	      free (as);
3558 	    }
3559 
3560 	  if (m == MATCH_NO)
3561 	    {
3562 	      if (d == DECL_CODIMENSION)
3563 		gfc_error ("Missing codimension specification at %C");
3564 	      else
3565 		gfc_error ("Missing dimension specification at %C");
3566 	      m = MATCH_ERROR;
3567 	    }
3568 
3569 	  if (m == MATCH_ERROR)
3570 	    goto cleanup;
3571 	}
3572     }
3573 
3574   /* Since we've seen a double colon, we have to be looking at an
3575      attr-spec.  This means that we can now issue errors.  */
3576   for (d = GFC_DECL_BEGIN; d != GFC_DECL_END; d++)
3577     if (seen[d] > 1)
3578       {
3579 	switch (d)
3580 	  {
3581 	  case DECL_ALLOCATABLE:
3582 	    attr = "ALLOCATABLE";
3583 	    break;
3584 	  case DECL_ASYNCHRONOUS:
3585 	    attr = "ASYNCHRONOUS";
3586 	    break;
3587 	  case DECL_CODIMENSION:
3588 	    attr = "CODIMENSION";
3589 	    break;
3590 	  case DECL_CONTIGUOUS:
3591 	    attr = "CONTIGUOUS";
3592 	    break;
3593 	  case DECL_DIMENSION:
3594 	    attr = "DIMENSION";
3595 	    break;
3596 	  case DECL_EXTERNAL:
3597 	    attr = "EXTERNAL";
3598 	    break;
3599 	  case DECL_IN:
3600 	    attr = "INTENT (IN)";
3601 	    break;
3602 	  case DECL_OUT:
3603 	    attr = "INTENT (OUT)";
3604 	    break;
3605 	  case DECL_INOUT:
3606 	    attr = "INTENT (IN OUT)";
3607 	    break;
3608 	  case DECL_INTRINSIC:
3609 	    attr = "INTRINSIC";
3610 	    break;
3611 	  case DECL_OPTIONAL:
3612 	    attr = "OPTIONAL";
3613 	    break;
3614 	  case DECL_PARAMETER:
3615 	    attr = "PARAMETER";
3616 	    break;
3617 	  case DECL_POINTER:
3618 	    attr = "POINTER";
3619 	    break;
3620 	  case DECL_PROTECTED:
3621 	    attr = "PROTECTED";
3622 	    break;
3623 	  case DECL_PRIVATE:
3624 	    attr = "PRIVATE";
3625 	    break;
3626 	  case DECL_PUBLIC:
3627 	    attr = "PUBLIC";
3628 	    break;
3629 	  case DECL_SAVE:
3630 	    attr = "SAVE";
3631 	    break;
3632 	  case DECL_TARGET:
3633 	    attr = "TARGET";
3634 	    break;
3635           case DECL_IS_BIND_C:
3636             attr = "IS_BIND_C";
3637             break;
3638           case DECL_VALUE:
3639             attr = "VALUE";
3640             break;
3641 	  case DECL_VOLATILE:
3642 	    attr = "VOLATILE";
3643 	    break;
3644 	  default:
3645 	    attr = NULL;	/* This shouldn't happen.  */
3646 	  }
3647 
3648 	gfc_error ("Duplicate %s attribute at %L", attr, &seen_at[d]);
3649 	m = MATCH_ERROR;
3650 	goto cleanup;
3651       }
3652 
3653   /* Now that we've dealt with duplicate attributes, add the attributes
3654      to the current attribute.  */
3655   for (d = GFC_DECL_BEGIN; d != GFC_DECL_END; d++)
3656     {
3657       if (seen[d] == 0)
3658 	continue;
3659 
3660       if (gfc_current_state () == COMP_DERIVED
3661 	  && d != DECL_DIMENSION && d != DECL_CODIMENSION
3662 	  && d != DECL_POINTER   && d != DECL_PRIVATE
3663 	  && d != DECL_PUBLIC && d != DECL_CONTIGUOUS && d != DECL_NONE)
3664 	{
3665 	  if (d == DECL_ALLOCATABLE)
3666 	    {
3667 	      if (gfc_notify_std (GFC_STD_F2003, "ALLOCATABLE "
3668 				  "attribute at %C in a TYPE definition")
3669 		  == FAILURE)
3670 		{
3671 		  m = MATCH_ERROR;
3672 		  goto cleanup;
3673 		}
3674 	    }
3675 	  else
3676 	    {
3677 	      gfc_error ("Attribute at %L is not allowed in a TYPE definition",
3678 			 &seen_at[d]);
3679 	      m = MATCH_ERROR;
3680 	      goto cleanup;
3681 	    }
3682 	}
3683 
3684       if ((d == DECL_PRIVATE || d == DECL_PUBLIC)
3685 	  && gfc_current_state () != COMP_MODULE)
3686 	{
3687 	  if (d == DECL_PRIVATE)
3688 	    attr = "PRIVATE";
3689 	  else
3690 	    attr = "PUBLIC";
3691 	  if (gfc_current_state () == COMP_DERIVED
3692 	      && gfc_state_stack->previous
3693 	      && gfc_state_stack->previous->state == COMP_MODULE)
3694 	    {
3695 	      if (gfc_notify_std (GFC_STD_F2003, "Attribute %s "
3696 				  "at %L in a TYPE definition", attr,
3697 				  &seen_at[d])
3698 		  == FAILURE)
3699 		{
3700 		  m = MATCH_ERROR;
3701 		  goto cleanup;
3702 		}
3703 	    }
3704 	  else
3705 	    {
3706 	      gfc_error ("%s attribute at %L is not allowed outside of the "
3707 			 "specification part of a module", attr, &seen_at[d]);
3708 	      m = MATCH_ERROR;
3709 	      goto cleanup;
3710 	    }
3711 	}
3712 
3713       switch (d)
3714 	{
3715 	case DECL_ALLOCATABLE:
3716 	  t = gfc_add_allocatable (&current_attr, &seen_at[d]);
3717 	  break;
3718 
3719 	case DECL_ASYNCHRONOUS:
3720 	  if (gfc_notify_std (GFC_STD_F2003,
3721 			      "ASYNCHRONOUS attribute at %C")
3722 	      == FAILURE)
3723 	    t = FAILURE;
3724 	  else
3725 	    t = gfc_add_asynchronous (&current_attr, NULL, &seen_at[d]);
3726 	  break;
3727 
3728 	case DECL_CODIMENSION:
3729 	  t = gfc_add_codimension (&current_attr, NULL, &seen_at[d]);
3730 	  break;
3731 
3732 	case DECL_CONTIGUOUS:
3733 	  if (gfc_notify_std (GFC_STD_F2008,
3734 			      "CONTIGUOUS attribute at %C")
3735 	      == FAILURE)
3736 	    t = FAILURE;
3737 	  else
3738 	    t = gfc_add_contiguous (&current_attr, NULL, &seen_at[d]);
3739 	  break;
3740 
3741 	case DECL_DIMENSION:
3742 	  t = gfc_add_dimension (&current_attr, NULL, &seen_at[d]);
3743 	  break;
3744 
3745 	case DECL_EXTERNAL:
3746 	  t = gfc_add_external (&current_attr, &seen_at[d]);
3747 	  break;
3748 
3749 	case DECL_IN:
3750 	  t = gfc_add_intent (&current_attr, INTENT_IN, &seen_at[d]);
3751 	  break;
3752 
3753 	case DECL_OUT:
3754 	  t = gfc_add_intent (&current_attr, INTENT_OUT, &seen_at[d]);
3755 	  break;
3756 
3757 	case DECL_INOUT:
3758 	  t = gfc_add_intent (&current_attr, INTENT_INOUT, &seen_at[d]);
3759 	  break;
3760 
3761 	case DECL_INTRINSIC:
3762 	  t = gfc_add_intrinsic (&current_attr, &seen_at[d]);
3763 	  break;
3764 
3765 	case DECL_OPTIONAL:
3766 	  t = gfc_add_optional (&current_attr, &seen_at[d]);
3767 	  break;
3768 
3769 	case DECL_PARAMETER:
3770 	  t = gfc_add_flavor (&current_attr, FL_PARAMETER, NULL, &seen_at[d]);
3771 	  break;
3772 
3773 	case DECL_POINTER:
3774 	  t = gfc_add_pointer (&current_attr, &seen_at[d]);
3775 	  break;
3776 
3777 	case DECL_PROTECTED:
3778 	  if (gfc_current_ns->proc_name->attr.flavor != FL_MODULE)
3779 	    {
3780 	       gfc_error ("PROTECTED at %C only allowed in specification "
3781 			  "part of a module");
3782 	       t = FAILURE;
3783 	       break;
3784 	    }
3785 
3786 	  if (gfc_notify_std (GFC_STD_F2003, "PROTECTED "
3787 			      "attribute at %C")
3788 	      == FAILURE)
3789 	    t = FAILURE;
3790 	  else
3791 	    t = gfc_add_protected (&current_attr, NULL, &seen_at[d]);
3792 	  break;
3793 
3794 	case DECL_PRIVATE:
3795 	  t = gfc_add_access (&current_attr, ACCESS_PRIVATE, NULL,
3796 			      &seen_at[d]);
3797 	  break;
3798 
3799 	case DECL_PUBLIC:
3800 	  t = gfc_add_access (&current_attr, ACCESS_PUBLIC, NULL,
3801 			      &seen_at[d]);
3802 	  break;
3803 
3804 	case DECL_SAVE:
3805 	  t = gfc_add_save (&current_attr, SAVE_EXPLICIT, NULL, &seen_at[d]);
3806 	  break;
3807 
3808 	case DECL_TARGET:
3809 	  t = gfc_add_target (&current_attr, &seen_at[d]);
3810 	  break;
3811 
3812         case DECL_IS_BIND_C:
3813            t = gfc_add_is_bind_c(&current_attr, NULL, &seen_at[d], 0);
3814            break;
3815 
3816 	case DECL_VALUE:
3817 	  if (gfc_notify_std (GFC_STD_F2003, "VALUE attribute "
3818 			      "at %C")
3819 	      == FAILURE)
3820 	    t = FAILURE;
3821 	  else
3822 	    t = gfc_add_value (&current_attr, NULL, &seen_at[d]);
3823 	  break;
3824 
3825 	case DECL_VOLATILE:
3826 	  if (gfc_notify_std (GFC_STD_F2003,
3827 			      "VOLATILE attribute at %C")
3828 	      == FAILURE)
3829 	    t = FAILURE;
3830 	  else
3831 	    t = gfc_add_volatile (&current_attr, NULL, &seen_at[d]);
3832 	  break;
3833 
3834 	default:
3835 	  gfc_internal_error ("match_attr_spec(): Bad attribute");
3836 	}
3837 
3838       if (t == FAILURE)
3839 	{
3840 	  m = MATCH_ERROR;
3841 	  goto cleanup;
3842 	}
3843     }
3844 
3845   /* Since Fortran 2008 module variables implicitly have the SAVE attribute.  */
3846   if (gfc_current_state () == COMP_MODULE && !current_attr.save
3847       && (gfc_option.allow_std & GFC_STD_F2008) != 0)
3848     current_attr.save = SAVE_IMPLICIT;
3849 
3850   colon_seen = 1;
3851   return MATCH_YES;
3852 
3853 cleanup:
3854   gfc_current_locus = start;
3855   gfc_free_array_spec (current_as);
3856   current_as = NULL;
3857   return m;
3858 }
3859 
3860 
3861 /* Set the binding label, dest_label, either with the binding label
3862    stored in the given gfc_typespec, ts, or if none was provided, it
3863    will be the symbol name in all lower case, as required by the draft
3864    (J3/04-007, section 15.4.1).  If a binding label was given and
3865    there is more than one argument (num_idents), it is an error.  */
3866 
3867 static gfc_try
set_binding_label(const char ** dest_label,const char * sym_name,int num_idents)3868 set_binding_label (const char **dest_label, const char *sym_name,
3869 		   int num_idents)
3870 {
3871   if (num_idents > 1 && has_name_equals)
3872     {
3873       gfc_error ("Multiple identifiers provided with "
3874 		 "single NAME= specifier at %C");
3875       return FAILURE;
3876     }
3877 
3878   if (curr_binding_label)
3879     /* Binding label given; store in temp holder till have sym.  */
3880     *dest_label = curr_binding_label;
3881   else
3882     {
3883       /* No binding label given, and the NAME= specifier did not exist,
3884          which means there was no NAME="".  */
3885       if (sym_name != NULL && has_name_equals == 0)
3886         *dest_label = IDENTIFIER_POINTER (get_identifier (sym_name));
3887     }
3888 
3889   return SUCCESS;
3890 }
3891 
3892 
3893 /* Set the status of the given common block as being BIND(C) or not,
3894    depending on the given parameter, is_bind_c.  */
3895 
3896 void
set_com_block_bind_c(gfc_common_head * com_block,int is_bind_c)3897 set_com_block_bind_c (gfc_common_head *com_block, int is_bind_c)
3898 {
3899   com_block->is_bind_c = is_bind_c;
3900   return;
3901 }
3902 
3903 
3904 /* Verify that the given gfc_typespec is for a C interoperable type.  */
3905 
3906 gfc_try
gfc_verify_c_interop(gfc_typespec * ts)3907 gfc_verify_c_interop (gfc_typespec *ts)
3908 {
3909   if (ts->type == BT_DERIVED && ts->u.derived != NULL)
3910     return (ts->u.derived->ts.is_c_interop || ts->u.derived->attr.is_bind_c)
3911 	   ? SUCCESS : FAILURE;
3912   else if (ts->type == BT_CLASS)
3913     return FAILURE;
3914   else if (ts->is_c_interop != 1 && ts->type != BT_ASSUMED)
3915     return FAILURE;
3916 
3917   return SUCCESS;
3918 }
3919 
3920 
3921 /* Verify that the variables of a given common block, which has been
3922    defined with the attribute specifier bind(c), to be of a C
3923    interoperable type.  Errors will be reported here, if
3924    encountered.  */
3925 
3926 gfc_try
verify_com_block_vars_c_interop(gfc_common_head * com_block)3927 verify_com_block_vars_c_interop (gfc_common_head *com_block)
3928 {
3929   gfc_symbol *curr_sym = NULL;
3930   gfc_try retval = SUCCESS;
3931 
3932   curr_sym = com_block->head;
3933 
3934   /* Make sure we have at least one symbol.  */
3935   if (curr_sym == NULL)
3936     return retval;
3937 
3938   /* Here we know we have a symbol, so we'll execute this loop
3939      at least once.  */
3940   do
3941     {
3942       /* The second to last param, 1, says this is in a common block.  */
3943       retval = verify_bind_c_sym (curr_sym, &(curr_sym->ts), 1, com_block);
3944       curr_sym = curr_sym->common_next;
3945     } while (curr_sym != NULL);
3946 
3947   return retval;
3948 }
3949 
3950 
3951 /* Verify that a given BIND(C) symbol is C interoperable.  If it is not,
3952    an appropriate error message is reported.  */
3953 
3954 gfc_try
verify_bind_c_sym(gfc_symbol * tmp_sym,gfc_typespec * ts,int is_in_common,gfc_common_head * com_block)3955 verify_bind_c_sym (gfc_symbol *tmp_sym, gfc_typespec *ts,
3956                    int is_in_common, gfc_common_head *com_block)
3957 {
3958   bool bind_c_function = false;
3959   gfc_try retval = SUCCESS;
3960 
3961   if (tmp_sym->attr.function && tmp_sym->attr.is_bind_c)
3962     bind_c_function = true;
3963 
3964   if (tmp_sym->attr.function && tmp_sym->result != NULL)
3965     {
3966       tmp_sym = tmp_sym->result;
3967       /* Make sure it wasn't an implicitly typed result.  */
3968       if (tmp_sym->attr.implicit_type && gfc_option.warn_c_binding_type)
3969 	{
3970 	  gfc_warning ("Implicitly declared BIND(C) function '%s' at "
3971                        "%L may not be C interoperable", tmp_sym->name,
3972                        &tmp_sym->declared_at);
3973 	  tmp_sym->ts.f90_type = tmp_sym->ts.type;
3974 	  /* Mark it as C interoperable to prevent duplicate warnings.	*/
3975 	  tmp_sym->ts.is_c_interop = 1;
3976 	  tmp_sym->attr.is_c_interop = 1;
3977 	}
3978     }
3979 
3980   /* Here, we know we have the bind(c) attribute, so if we have
3981      enough type info, then verify that it's a C interop kind.
3982      The info could be in the symbol already, or possibly still in
3983      the given ts (current_ts), so look in both.  */
3984   if (tmp_sym->ts.type != BT_UNKNOWN || ts->type != BT_UNKNOWN)
3985     {
3986       if (gfc_verify_c_interop (&(tmp_sym->ts)) != SUCCESS)
3987 	{
3988 	  /* See if we're dealing with a sym in a common block or not.	*/
3989 	  if (is_in_common == 1 && gfc_option.warn_c_binding_type)
3990 	    {
3991 	      gfc_warning ("Variable '%s' in common block '%s' at %L "
3992                            "may not be a C interoperable "
3993                            "kind though common block '%s' is BIND(C)",
3994                            tmp_sym->name, com_block->name,
3995                            &(tmp_sym->declared_at), com_block->name);
3996 	    }
3997 	  else
3998 	    {
3999               if (tmp_sym->ts.type == BT_DERIVED || ts->type == BT_DERIVED)
4000                 gfc_error ("Type declaration '%s' at %L is not C "
4001                            "interoperable but it is BIND(C)",
4002                            tmp_sym->name, &(tmp_sym->declared_at));
4003               else if (gfc_option.warn_c_binding_type)
4004                 gfc_warning ("Variable '%s' at %L "
4005                              "may not be a C interoperable "
4006                              "kind but it is bind(c)",
4007                              tmp_sym->name, &(tmp_sym->declared_at));
4008 	    }
4009 	}
4010 
4011       /* Variables declared w/in a common block can't be bind(c)
4012 	 since there's no way for C to see these variables, so there's
4013 	 semantically no reason for the attribute.  */
4014       if (is_in_common == 1 && tmp_sym->attr.is_bind_c == 1)
4015 	{
4016 	  gfc_error ("Variable '%s' in common block '%s' at "
4017 		     "%L cannot be declared with BIND(C) "
4018 		     "since it is not a global",
4019 		     tmp_sym->name, com_block->name,
4020 		     &(tmp_sym->declared_at));
4021 	  retval = FAILURE;
4022 	}
4023 
4024       /* Scalar variables that are bind(c) can not have the pointer
4025 	 or allocatable attributes.  */
4026       if (tmp_sym->attr.is_bind_c == 1)
4027 	{
4028 	  if (tmp_sym->attr.pointer == 1)
4029 	    {
4030 	      gfc_error ("Variable '%s' at %L cannot have both the "
4031 			 "POINTER and BIND(C) attributes",
4032 			 tmp_sym->name, &(tmp_sym->declared_at));
4033 	      retval = FAILURE;
4034 	    }
4035 
4036 	  if (tmp_sym->attr.allocatable == 1)
4037 	    {
4038 	      gfc_error ("Variable '%s' at %L cannot have both the "
4039 			 "ALLOCATABLE and BIND(C) attributes",
4040 			 tmp_sym->name, &(tmp_sym->declared_at));
4041 	      retval = FAILURE;
4042 	    }
4043 
4044         }
4045 
4046       /* If it is a BIND(C) function, make sure the return value is a
4047 	 scalar value.  The previous tests in this function made sure
4048 	 the type is interoperable.  */
4049       if (bind_c_function && tmp_sym->as != NULL)
4050 	gfc_error ("Return type of BIND(C) function '%s' at %L cannot "
4051 		   "be an array", tmp_sym->name, &(tmp_sym->declared_at));
4052 
4053       /* BIND(C) functions can not return a character string.  */
4054       if (bind_c_function && tmp_sym->ts.type == BT_CHARACTER)
4055 	if (tmp_sym->ts.u.cl == NULL || tmp_sym->ts.u.cl->length == NULL
4056 	    || tmp_sym->ts.u.cl->length->expr_type != EXPR_CONSTANT
4057 	    || mpz_cmp_si (tmp_sym->ts.u.cl->length->value.integer, 1) != 0)
4058 	  gfc_error ("Return type of BIND(C) function '%s' at %L cannot "
4059 			 "be a character string", tmp_sym->name,
4060 			 &(tmp_sym->declared_at));
4061     }
4062 
4063   /* See if the symbol has been marked as private.  If it has, make sure
4064      there is no binding label and warn the user if there is one.  */
4065   if (tmp_sym->attr.access == ACCESS_PRIVATE
4066       && tmp_sym->binding_label)
4067       /* Use gfc_warning_now because we won't say that the symbol fails
4068 	 just because of this.	*/
4069       gfc_warning_now ("Symbol '%s' at %L is marked PRIVATE but has been "
4070 		       "given the binding label '%s'", tmp_sym->name,
4071 		       &(tmp_sym->declared_at), tmp_sym->binding_label);
4072 
4073   return retval;
4074 }
4075 
4076 
4077 /* Set the appropriate fields for a symbol that's been declared as
4078    BIND(C) (the is_bind_c flag and the binding label), and verify that
4079    the type is C interoperable.  Errors are reported by the functions
4080    used to set/test these fields.  */
4081 
4082 gfc_try
set_verify_bind_c_sym(gfc_symbol * tmp_sym,int num_idents)4083 set_verify_bind_c_sym (gfc_symbol *tmp_sym, int num_idents)
4084 {
4085   gfc_try retval = SUCCESS;
4086 
4087   /* TODO: Do we need to make sure the vars aren't marked private?  */
4088 
4089   /* Set the is_bind_c bit in symbol_attribute.  */
4090   gfc_add_is_bind_c (&(tmp_sym->attr), tmp_sym->name, &gfc_current_locus, 0);
4091 
4092   if (set_binding_label (&tmp_sym->binding_label, tmp_sym->name,
4093 			 num_idents) != SUCCESS)
4094     return FAILURE;
4095 
4096   return retval;
4097 }
4098 
4099 
4100 /* Set the fields marking the given common block as BIND(C), including
4101    a binding label, and report any errors encountered.  */
4102 
4103 gfc_try
set_verify_bind_c_com_block(gfc_common_head * com_block,int num_idents)4104 set_verify_bind_c_com_block (gfc_common_head *com_block, int num_idents)
4105 {
4106   gfc_try retval = SUCCESS;
4107 
4108   /* destLabel, common name, typespec (which may have binding label).  */
4109   if (set_binding_label (&com_block->binding_label, com_block->name,
4110 			 num_idents)
4111       != SUCCESS)
4112     return FAILURE;
4113 
4114   /* Set the given common block (com_block) to being bind(c) (1).  */
4115   set_com_block_bind_c (com_block, 1);
4116 
4117   return retval;
4118 }
4119 
4120 
4121 /* Retrieve the list of one or more identifiers that the given bind(c)
4122    attribute applies to.  */
4123 
4124 gfc_try
get_bind_c_idents(void)4125 get_bind_c_idents (void)
4126 {
4127   char name[GFC_MAX_SYMBOL_LEN + 1];
4128   int num_idents = 0;
4129   gfc_symbol *tmp_sym = NULL;
4130   match found_id;
4131   gfc_common_head *com_block = NULL;
4132 
4133   if (gfc_match_name (name) == MATCH_YES)
4134     {
4135       found_id = MATCH_YES;
4136       gfc_get_ha_symbol (name, &tmp_sym);
4137     }
4138   else if (match_common_name (name) == MATCH_YES)
4139     {
4140       found_id = MATCH_YES;
4141       com_block = gfc_get_common (name, 0);
4142     }
4143   else
4144     {
4145       gfc_error ("Need either entity or common block name for "
4146 		 "attribute specification statement at %C");
4147       return FAILURE;
4148     }
4149 
4150   /* Save the current identifier and look for more.  */
4151   do
4152     {
4153       /* Increment the number of identifiers found for this spec stmt.  */
4154       num_idents++;
4155 
4156       /* Make sure we have a sym or com block, and verify that it can
4157 	 be bind(c).  Set the appropriate field(s) and look for more
4158 	 identifiers.  */
4159       if (tmp_sym != NULL || com_block != NULL)
4160         {
4161 	  if (tmp_sym != NULL)
4162 	    {
4163 	      if (set_verify_bind_c_sym (tmp_sym, num_idents)
4164 		  != SUCCESS)
4165 		return FAILURE;
4166 	    }
4167 	  else
4168 	    {
4169 	      if (set_verify_bind_c_com_block(com_block, num_idents)
4170 		  != SUCCESS)
4171 		return FAILURE;
4172 	    }
4173 
4174 	  /* Look to see if we have another identifier.  */
4175 	  tmp_sym = NULL;
4176 	  if (gfc_match_eos () == MATCH_YES)
4177 	    found_id = MATCH_NO;
4178 	  else if (gfc_match_char (',') != MATCH_YES)
4179 	    found_id = MATCH_NO;
4180 	  else if (gfc_match_name (name) == MATCH_YES)
4181 	    {
4182 	      found_id = MATCH_YES;
4183 	      gfc_get_ha_symbol (name, &tmp_sym);
4184 	    }
4185 	  else if (match_common_name (name) == MATCH_YES)
4186 	    {
4187 	      found_id = MATCH_YES;
4188 	      com_block = gfc_get_common (name, 0);
4189 	    }
4190 	  else
4191 	    {
4192 	      gfc_error ("Missing entity or common block name for "
4193 			 "attribute specification statement at %C");
4194 	      return FAILURE;
4195 	    }
4196 	}
4197       else
4198 	{
4199 	  gfc_internal_error ("Missing symbol");
4200 	}
4201     } while (found_id == MATCH_YES);
4202 
4203   /* if we get here we were successful */
4204   return SUCCESS;
4205 }
4206 
4207 
4208 /* Try and match a BIND(C) attribute specification statement.  */
4209 
4210 match
gfc_match_bind_c_stmt(void)4211 gfc_match_bind_c_stmt (void)
4212 {
4213   match found_match = MATCH_NO;
4214   gfc_typespec *ts;
4215 
4216   ts = &current_ts;
4217 
4218   /* This may not be necessary.  */
4219   gfc_clear_ts (ts);
4220   /* Clear the temporary binding label holder.  */
4221   curr_binding_label = NULL;
4222 
4223   /* Look for the bind(c).  */
4224   found_match = gfc_match_bind_c (NULL, true);
4225 
4226   if (found_match == MATCH_YES)
4227     {
4228       /* Look for the :: now, but it is not required.  */
4229       gfc_match (" :: ");
4230 
4231       /* Get the identifier(s) that needs to be updated.  This may need to
4232 	 change to hand the flag(s) for the attr specified so all identifiers
4233 	 found can have all appropriate parts updated (assuming that the same
4234 	 spec stmt can have multiple attrs, such as both bind(c) and
4235 	 allocatable...).  */
4236       if (get_bind_c_idents () != SUCCESS)
4237 	/* Error message should have printed already.  */
4238 	return MATCH_ERROR;
4239     }
4240 
4241   return found_match;
4242 }
4243 
4244 
4245 /* Match a data declaration statement.  */
4246 
4247 match
gfc_match_data_decl(void)4248 gfc_match_data_decl (void)
4249 {
4250   gfc_symbol *sym;
4251   match m;
4252   int elem;
4253 
4254   num_idents_on_line = 0;
4255 
4256   m = gfc_match_decl_type_spec (&current_ts, 0);
4257   if (m != MATCH_YES)
4258     return m;
4259 
4260   if ((current_ts.type == BT_DERIVED || current_ts.type == BT_CLASS)
4261 	&& gfc_current_state () != COMP_DERIVED)
4262     {
4263       sym = gfc_use_derived (current_ts.u.derived);
4264 
4265       if (sym == NULL)
4266 	{
4267 	  m = MATCH_ERROR;
4268 	  goto cleanup;
4269 	}
4270 
4271       current_ts.u.derived = sym;
4272     }
4273 
4274   m = match_attr_spec ();
4275   if (m == MATCH_ERROR)
4276     {
4277       m = MATCH_NO;
4278       goto cleanup;
4279     }
4280 
4281   if (current_ts.type == BT_CLASS
4282 	&& current_ts.u.derived->attr.unlimited_polymorphic)
4283     goto ok;
4284 
4285   if ((current_ts.type == BT_DERIVED || current_ts.type == BT_CLASS)
4286       && current_ts.u.derived->components == NULL
4287       && !current_ts.u.derived->attr.zero_comp)
4288     {
4289 
4290       if (current_attr.pointer && gfc_current_state () == COMP_DERIVED)
4291 	goto ok;
4292 
4293       gfc_find_symbol (current_ts.u.derived->name,
4294 		       current_ts.u.derived->ns, 1, &sym);
4295 
4296       /* Any symbol that we find had better be a type definition
4297 	 which has its components defined.  */
4298       if (sym != NULL && sym->attr.flavor == FL_DERIVED
4299 	  && (current_ts.u.derived->components != NULL
4300 	      || current_ts.u.derived->attr.zero_comp))
4301 	goto ok;
4302 
4303       /* Now we have an error, which we signal, and then fix up
4304 	 because the knock-on is plain and simple confusing.  */
4305       gfc_error_now ("Derived type at %C has not been previously defined "
4306 		     "and so cannot appear in a derived type definition");
4307       current_attr.pointer = 1;
4308       goto ok;
4309     }
4310 
4311 ok:
4312   /* If we have an old-style character declaration, and no new-style
4313      attribute specifications, then there a comma is optional between
4314      the type specification and the variable list.  */
4315   if (m == MATCH_NO && current_ts.type == BT_CHARACTER && old_char_selector)
4316     gfc_match_char (',');
4317 
4318   /* Give the types/attributes to symbols that follow. Give the element
4319      a number so that repeat character length expressions can be copied.  */
4320   elem = 1;
4321   for (;;)
4322     {
4323       num_idents_on_line++;
4324       m = variable_decl (elem++);
4325       if (m == MATCH_ERROR)
4326 	goto cleanup;
4327       if (m == MATCH_NO)
4328 	break;
4329 
4330       if (gfc_match_eos () == MATCH_YES)
4331 	goto cleanup;
4332       if (gfc_match_char (',') != MATCH_YES)
4333 	break;
4334     }
4335 
4336   if (gfc_error_flag_test () == 0)
4337     gfc_error ("Syntax error in data declaration at %C");
4338   m = MATCH_ERROR;
4339 
4340   gfc_free_data_all (gfc_current_ns);
4341 
4342 cleanup:
4343   gfc_free_array_spec (current_as);
4344   current_as = NULL;
4345   return m;
4346 }
4347 
4348 
4349 /* Match a prefix associated with a function or subroutine
4350    declaration.  If the typespec pointer is nonnull, then a typespec
4351    can be matched.  Note that if nothing matches, MATCH_YES is
4352    returned (the null string was matched).  */
4353 
4354 match
gfc_match_prefix(gfc_typespec * ts)4355 gfc_match_prefix (gfc_typespec *ts)
4356 {
4357   bool seen_type;
4358   bool seen_impure;
4359   bool found_prefix;
4360 
4361   gfc_clear_attr (&current_attr);
4362   seen_type = false;
4363   seen_impure = false;
4364 
4365   gcc_assert (!gfc_matching_prefix);
4366   gfc_matching_prefix = true;
4367 
4368   do
4369     {
4370       found_prefix = false;
4371 
4372       if (!seen_type && ts != NULL
4373 	  && gfc_match_decl_type_spec (ts, 0) == MATCH_YES
4374 	  && gfc_match_space () == MATCH_YES)
4375 	{
4376 
4377 	  seen_type = true;
4378 	  found_prefix = true;
4379 	}
4380 
4381       if (gfc_match ("elemental% ") == MATCH_YES)
4382 	{
4383 	  if (gfc_add_elemental (&current_attr, NULL) == FAILURE)
4384 	    goto error;
4385 
4386 	  found_prefix = true;
4387 	}
4388 
4389       if (gfc_match ("pure% ") == MATCH_YES)
4390 	{
4391 	  if (gfc_add_pure (&current_attr, NULL) == FAILURE)
4392 	    goto error;
4393 
4394 	  found_prefix = true;
4395 	}
4396 
4397       if (gfc_match ("recursive% ") == MATCH_YES)
4398 	{
4399 	  if (gfc_add_recursive (&current_attr, NULL) == FAILURE)
4400 	    goto error;
4401 
4402 	  found_prefix = true;
4403 	}
4404 
4405       /* IMPURE is a somewhat special case, as it needs not set an actual
4406 	 attribute but rather only prevents ELEMENTAL routines from being
4407 	 automatically PURE.  */
4408       if (gfc_match ("impure% ") == MATCH_YES)
4409 	{
4410 	  if (gfc_notify_std (GFC_STD_F2008,
4411 			      "IMPURE procedure at %C")
4412 		== FAILURE)
4413 	    goto error;
4414 
4415 	  seen_impure = true;
4416 	  found_prefix = true;
4417 	}
4418     }
4419   while (found_prefix);
4420 
4421   /* IMPURE and PURE must not both appear, of course.  */
4422   if (seen_impure && current_attr.pure)
4423     {
4424       gfc_error ("PURE and IMPURE must not appear both at %C");
4425       goto error;
4426     }
4427 
4428   /* If IMPURE it not seen but the procedure is ELEMENTAL, mark it as PURE.  */
4429   if (!seen_impure && current_attr.elemental && !current_attr.pure)
4430     {
4431       if (gfc_add_pure (&current_attr, NULL) == FAILURE)
4432 	goto error;
4433     }
4434 
4435   /* At this point, the next item is not a prefix.  */
4436   gcc_assert (gfc_matching_prefix);
4437   gfc_matching_prefix = false;
4438   return MATCH_YES;
4439 
4440 error:
4441   gcc_assert (gfc_matching_prefix);
4442   gfc_matching_prefix = false;
4443   return MATCH_ERROR;
4444 }
4445 
4446 
4447 /* Copy attributes matched by gfc_match_prefix() to attributes on a symbol.  */
4448 
4449 static gfc_try
copy_prefix(symbol_attribute * dest,locus * where)4450 copy_prefix (symbol_attribute *dest, locus *where)
4451 {
4452   if (current_attr.pure && gfc_add_pure (dest, where) == FAILURE)
4453     return FAILURE;
4454 
4455   if (current_attr.elemental && gfc_add_elemental (dest, where) == FAILURE)
4456     return FAILURE;
4457 
4458   if (current_attr.recursive && gfc_add_recursive (dest, where) == FAILURE)
4459     return FAILURE;
4460 
4461   return SUCCESS;
4462 }
4463 
4464 
4465 /* Match a formal argument list.  */
4466 
4467 match
gfc_match_formal_arglist(gfc_symbol * progname,int st_flag,int null_flag)4468 gfc_match_formal_arglist (gfc_symbol *progname, int st_flag, int null_flag)
4469 {
4470   gfc_formal_arglist *head, *tail, *p, *q;
4471   char name[GFC_MAX_SYMBOL_LEN + 1];
4472   gfc_symbol *sym;
4473   match m;
4474 
4475   head = tail = NULL;
4476 
4477   if (gfc_match_char ('(') != MATCH_YES)
4478     {
4479       if (null_flag)
4480 	goto ok;
4481       return MATCH_NO;
4482     }
4483 
4484   if (gfc_match_char (')') == MATCH_YES)
4485     goto ok;
4486 
4487   for (;;)
4488     {
4489       if (gfc_match_char ('*') == MATCH_YES)
4490 	sym = NULL;
4491       else
4492 	{
4493 	  m = gfc_match_name (name);
4494 	  if (m != MATCH_YES)
4495 	    goto cleanup;
4496 
4497 	  if (gfc_get_symbol (name, NULL, &sym))
4498 	    goto cleanup;
4499 	}
4500 
4501       p = gfc_get_formal_arglist ();
4502 
4503       if (head == NULL)
4504 	head = tail = p;
4505       else
4506 	{
4507 	  tail->next = p;
4508 	  tail = p;
4509 	}
4510 
4511       tail->sym = sym;
4512 
4513       /* We don't add the VARIABLE flavor because the name could be a
4514 	 dummy procedure.  We don't apply these attributes to formal
4515 	 arguments of statement functions.  */
4516       if (sym != NULL && !st_flag
4517 	  && (gfc_add_dummy (&sym->attr, sym->name, NULL) == FAILURE
4518 	      || gfc_missing_attr (&sym->attr, NULL) == FAILURE))
4519 	{
4520 	  m = MATCH_ERROR;
4521 	  goto cleanup;
4522 	}
4523 
4524       /* The name of a program unit can be in a different namespace,
4525 	 so check for it explicitly.  After the statement is accepted,
4526 	 the name is checked for especially in gfc_get_symbol().  */
4527       if (gfc_new_block != NULL && sym != NULL
4528 	  && strcmp (sym->name, gfc_new_block->name) == 0)
4529 	{
4530 	  gfc_error ("Name '%s' at %C is the name of the procedure",
4531 		     sym->name);
4532 	  m = MATCH_ERROR;
4533 	  goto cleanup;
4534 	}
4535 
4536       if (gfc_match_char (')') == MATCH_YES)
4537 	goto ok;
4538 
4539       m = gfc_match_char (',');
4540       if (m != MATCH_YES)
4541 	{
4542 	  gfc_error ("Unexpected junk in formal argument list at %C");
4543 	  goto cleanup;
4544 	}
4545     }
4546 
4547 ok:
4548   /* Check for duplicate symbols in the formal argument list.  */
4549   if (head != NULL)
4550     {
4551       for (p = head; p->next; p = p->next)
4552 	{
4553 	  if (p->sym == NULL)
4554 	    continue;
4555 
4556 	  for (q = p->next; q; q = q->next)
4557 	    if (p->sym == q->sym)
4558 	      {
4559 		gfc_error ("Duplicate symbol '%s' in formal argument list "
4560 			   "at %C", p->sym->name);
4561 
4562 		m = MATCH_ERROR;
4563 		goto cleanup;
4564 	      }
4565 	}
4566     }
4567 
4568   if (gfc_add_explicit_interface (progname, IFSRC_DECL, head, NULL)
4569       == FAILURE)
4570     {
4571       m = MATCH_ERROR;
4572       goto cleanup;
4573     }
4574 
4575   return MATCH_YES;
4576 
4577 cleanup:
4578   gfc_free_formal_arglist (head);
4579   return m;
4580 }
4581 
4582 
4583 /* Match a RESULT specification following a function declaration or
4584    ENTRY statement.  Also matches the end-of-statement.  */
4585 
4586 static match
match_result(gfc_symbol * function,gfc_symbol ** result)4587 match_result (gfc_symbol *function, gfc_symbol **result)
4588 {
4589   char name[GFC_MAX_SYMBOL_LEN + 1];
4590   gfc_symbol *r;
4591   match m;
4592 
4593   if (gfc_match (" result (") != MATCH_YES)
4594     return MATCH_NO;
4595 
4596   m = gfc_match_name (name);
4597   if (m != MATCH_YES)
4598     return m;
4599 
4600   /* Get the right paren, and that's it because there could be the
4601      bind(c) attribute after the result clause.  */
4602   if (gfc_match_char(')') != MATCH_YES)
4603     {
4604      /* TODO: should report the missing right paren here.  */
4605       return MATCH_ERROR;
4606     }
4607 
4608   if (strcmp (function->name, name) == 0)
4609     {
4610       gfc_error ("RESULT variable at %C must be different than function name");
4611       return MATCH_ERROR;
4612     }
4613 
4614   if (gfc_get_symbol (name, NULL, &r))
4615     return MATCH_ERROR;
4616 
4617   if (gfc_add_result (&r->attr, r->name, NULL) == FAILURE)
4618     return MATCH_ERROR;
4619 
4620   *result = r;
4621 
4622   return MATCH_YES;
4623 }
4624 
4625 
4626 /* Match a function suffix, which could be a combination of a result
4627    clause and BIND(C), either one, or neither.  The draft does not
4628    require them to come in a specific order.  */
4629 
4630 match
gfc_match_suffix(gfc_symbol * sym,gfc_symbol ** result)4631 gfc_match_suffix (gfc_symbol *sym, gfc_symbol **result)
4632 {
4633   match is_bind_c;   /* Found bind(c).  */
4634   match is_result;   /* Found result clause.  */
4635   match found_match; /* Status of whether we've found a good match.  */
4636   char peek_char;    /* Character we're going to peek at.  */
4637   bool allow_binding_name;
4638 
4639   /* Initialize to having found nothing.  */
4640   found_match = MATCH_NO;
4641   is_bind_c = MATCH_NO;
4642   is_result = MATCH_NO;
4643 
4644   /* Get the next char to narrow between result and bind(c).  */
4645   gfc_gobble_whitespace ();
4646   peek_char = gfc_peek_ascii_char ();
4647 
4648   /* C binding names are not allowed for internal procedures.  */
4649   if (gfc_current_state () == COMP_CONTAINS
4650       && sym->ns->proc_name->attr.flavor != FL_MODULE)
4651     allow_binding_name = false;
4652   else
4653     allow_binding_name = true;
4654 
4655   switch (peek_char)
4656     {
4657     case 'r':
4658       /* Look for result clause.  */
4659       is_result = match_result (sym, result);
4660       if (is_result == MATCH_YES)
4661 	{
4662 	  /* Now see if there is a bind(c) after it.  */
4663 	  is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
4664 	  /* We've found the result clause and possibly bind(c).  */
4665 	  found_match = MATCH_YES;
4666 	}
4667       else
4668 	/* This should only be MATCH_ERROR.  */
4669 	found_match = is_result;
4670       break;
4671     case 'b':
4672       /* Look for bind(c) first.  */
4673       is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
4674       if (is_bind_c == MATCH_YES)
4675 	{
4676 	  /* Now see if a result clause followed it.  */
4677 	  is_result = match_result (sym, result);
4678 	  found_match = MATCH_YES;
4679 	}
4680       else
4681 	{
4682 	  /* Should only be a MATCH_ERROR if we get here after seeing 'b'.  */
4683 	  found_match = MATCH_ERROR;
4684 	}
4685       break;
4686     default:
4687       gfc_error ("Unexpected junk after function declaration at %C");
4688       found_match = MATCH_ERROR;
4689       break;
4690     }
4691 
4692   if (is_bind_c == MATCH_YES)
4693     {
4694       /* Fortran 2008 draft allows BIND(C) for internal procedures.  */
4695       if (gfc_current_state () == COMP_CONTAINS
4696 	  && sym->ns->proc_name->attr.flavor != FL_MODULE
4697 	  && gfc_notify_std (GFC_STD_F2008, "BIND(C) attribute "
4698 			     "at %L may not be specified for an internal "
4699 			     "procedure", &gfc_current_locus)
4700 	     == FAILURE)
4701 	return MATCH_ERROR;
4702 
4703       if (gfc_add_is_bind_c (&(sym->attr), sym->name, &gfc_current_locus, 1)
4704 	  == FAILURE)
4705      	return MATCH_ERROR;
4706     }
4707 
4708   return found_match;
4709 }
4710 
4711 
4712 /* Procedure pointer return value without RESULT statement:
4713    Add "hidden" result variable named "ppr@".  */
4714 
4715 static gfc_try
add_hidden_procptr_result(gfc_symbol * sym)4716 add_hidden_procptr_result (gfc_symbol *sym)
4717 {
4718   bool case1,case2;
4719 
4720   if (gfc_notification_std (GFC_STD_F2003) == ERROR)
4721     return FAILURE;
4722 
4723   /* First usage case: PROCEDURE and EXTERNAL statements.  */
4724   case1 = gfc_current_state () == COMP_FUNCTION && gfc_current_block ()
4725 	  && strcmp (gfc_current_block ()->name, sym->name) == 0
4726 	  && sym->attr.external;
4727   /* Second usage case: INTERFACE statements.  */
4728   case2 = gfc_current_state () == COMP_INTERFACE && gfc_state_stack->previous
4729 	  && gfc_state_stack->previous->state == COMP_FUNCTION
4730 	  && strcmp (gfc_state_stack->previous->sym->name, sym->name) == 0;
4731 
4732   if (case1 || case2)
4733     {
4734       gfc_symtree *stree;
4735       if (case1)
4736 	gfc_get_sym_tree ("ppr@", gfc_current_ns, &stree, false);
4737       else if (case2)
4738 	{
4739 	  gfc_symtree *st2;
4740 	  gfc_get_sym_tree ("ppr@", gfc_current_ns->parent, &stree, false);
4741 	  st2 = gfc_new_symtree (&gfc_current_ns->sym_root, "ppr@");
4742 	  st2->n.sym = stree->n.sym;
4743 	}
4744       sym->result = stree->n.sym;
4745 
4746       sym->result->attr.proc_pointer = sym->attr.proc_pointer;
4747       sym->result->attr.pointer = sym->attr.pointer;
4748       sym->result->attr.external = sym->attr.external;
4749       sym->result->attr.referenced = sym->attr.referenced;
4750       sym->result->ts = sym->ts;
4751       sym->attr.proc_pointer = 0;
4752       sym->attr.pointer = 0;
4753       sym->attr.external = 0;
4754       if (sym->result->attr.external && sym->result->attr.pointer)
4755 	{
4756 	  sym->result->attr.pointer = 0;
4757 	  sym->result->attr.proc_pointer = 1;
4758 	}
4759 
4760       return gfc_add_result (&sym->result->attr, sym->result->name, NULL);
4761     }
4762   /* POINTER after PROCEDURE/EXTERNAL/INTERFACE statement.  */
4763   else if (sym->attr.function && !sym->attr.external && sym->attr.pointer
4764 	   && sym->result && sym->result != sym && sym->result->attr.external
4765 	   && sym == gfc_current_ns->proc_name
4766 	   && sym == sym->result->ns->proc_name
4767 	   && strcmp ("ppr@", sym->result->name) == 0)
4768     {
4769       sym->result->attr.proc_pointer = 1;
4770       sym->attr.pointer = 0;
4771       return SUCCESS;
4772     }
4773   else
4774     return FAILURE;
4775 }
4776 
4777 
4778 /* Match the interface for a PROCEDURE declaration,
4779    including brackets (R1212).  */
4780 
4781 static match
match_procedure_interface(gfc_symbol ** proc_if)4782 match_procedure_interface (gfc_symbol **proc_if)
4783 {
4784   match m;
4785   gfc_symtree *st;
4786   locus old_loc, entry_loc;
4787   gfc_namespace *old_ns = gfc_current_ns;
4788   char name[GFC_MAX_SYMBOL_LEN + 1];
4789 
4790   old_loc = entry_loc = gfc_current_locus;
4791   gfc_clear_ts (&current_ts);
4792 
4793   if (gfc_match (" (") != MATCH_YES)
4794     {
4795       gfc_current_locus = entry_loc;
4796       return MATCH_NO;
4797     }
4798 
4799   /* Get the type spec. for the procedure interface.  */
4800   old_loc = gfc_current_locus;
4801   m = gfc_match_decl_type_spec (&current_ts, 0);
4802   gfc_gobble_whitespace ();
4803   if (m == MATCH_YES || (m == MATCH_NO && gfc_peek_ascii_char () == ')'))
4804     goto got_ts;
4805 
4806   if (m == MATCH_ERROR)
4807     return m;
4808 
4809   /* Procedure interface is itself a procedure.  */
4810   gfc_current_locus = old_loc;
4811   m = gfc_match_name (name);
4812 
4813   /* First look to see if it is already accessible in the current
4814      namespace because it is use associated or contained.  */
4815   st = NULL;
4816   if (gfc_find_sym_tree (name, NULL, 0, &st))
4817     return MATCH_ERROR;
4818 
4819   /* If it is still not found, then try the parent namespace, if it
4820      exists and create the symbol there if it is still not found.  */
4821   if (gfc_current_ns->parent)
4822     gfc_current_ns = gfc_current_ns->parent;
4823   if (st == NULL && gfc_get_ha_sym_tree (name, &st))
4824     return MATCH_ERROR;
4825 
4826   gfc_current_ns = old_ns;
4827   *proc_if = st->n.sym;
4828 
4829   if (*proc_if)
4830     {
4831       (*proc_if)->refs++;
4832       /* Resolve interface if possible. That way, attr.procedure is only set
4833 	 if it is declared by a later procedure-declaration-stmt, which is
4834 	 invalid per F08:C1216 (cf. resolve_procedure_interface).  */
4835       while ((*proc_if)->ts.interface)
4836 	*proc_if = (*proc_if)->ts.interface;
4837 
4838       if ((*proc_if)->attr.flavor == FL_UNKNOWN
4839 	  && (*proc_if)->ts.type == BT_UNKNOWN
4840 	  && gfc_add_flavor (&(*proc_if)->attr, FL_PROCEDURE,
4841 			      (*proc_if)->name, NULL) == FAILURE)
4842 	return MATCH_ERROR;
4843     }
4844 
4845 got_ts:
4846   if (gfc_match (" )") != MATCH_YES)
4847     {
4848       gfc_current_locus = entry_loc;
4849       return MATCH_NO;
4850     }
4851 
4852   return MATCH_YES;
4853 }
4854 
4855 
4856 /* Match a PROCEDURE declaration (R1211).  */
4857 
4858 static match
match_procedure_decl(void)4859 match_procedure_decl (void)
4860 {
4861   match m;
4862   gfc_symbol *sym, *proc_if = NULL;
4863   int num;
4864   gfc_expr *initializer = NULL;
4865 
4866   /* Parse interface (with brackets). */
4867   m = match_procedure_interface (&proc_if);
4868   if (m != MATCH_YES)
4869     return m;
4870 
4871   /* Parse attributes (with colons).  */
4872   m = match_attr_spec();
4873   if (m == MATCH_ERROR)
4874     return MATCH_ERROR;
4875 
4876   if (proc_if && proc_if->attr.is_bind_c && !current_attr.is_bind_c)
4877     {
4878       current_attr.is_bind_c = 1;
4879       has_name_equals = 0;
4880       curr_binding_label = NULL;
4881     }
4882 
4883   /* Get procedure symbols.  */
4884   for(num=1;;num++)
4885     {
4886       m = gfc_match_symbol (&sym, 0);
4887       if (m == MATCH_NO)
4888 	goto syntax;
4889       else if (m == MATCH_ERROR)
4890 	return m;
4891 
4892       /* Add current_attr to the symbol attributes.  */
4893       if (gfc_copy_attr (&sym->attr, &current_attr, NULL) == FAILURE)
4894 	return MATCH_ERROR;
4895 
4896       if (sym->attr.is_bind_c)
4897 	{
4898 	  /* Check for C1218.  */
4899 	  if (!proc_if || !proc_if->attr.is_bind_c)
4900 	    {
4901 	      gfc_error ("BIND(C) attribute at %C requires "
4902 			"an interface with BIND(C)");
4903 	      return MATCH_ERROR;
4904 	    }
4905 	  /* Check for C1217.  */
4906 	  if (has_name_equals && sym->attr.pointer)
4907 	    {
4908 	      gfc_error ("BIND(C) procedure with NAME may not have "
4909 			"POINTER attribute at %C");
4910 	      return MATCH_ERROR;
4911 	    }
4912 	  if (has_name_equals && sym->attr.dummy)
4913 	    {
4914 	      gfc_error ("Dummy procedure at %C may not have "
4915 			"BIND(C) attribute with NAME");
4916 	      return MATCH_ERROR;
4917 	    }
4918 	  /* Set binding label for BIND(C).  */
4919 	  if (set_binding_label (&sym->binding_label, sym->name, num)
4920 	      != SUCCESS)
4921 	    return MATCH_ERROR;
4922 	}
4923 
4924       if (gfc_add_external (&sym->attr, NULL) == FAILURE)
4925 	return MATCH_ERROR;
4926 
4927       if (add_hidden_procptr_result (sym) == SUCCESS)
4928 	sym = sym->result;
4929 
4930       if (gfc_add_proc (&sym->attr, sym->name, NULL) == FAILURE)
4931 	return MATCH_ERROR;
4932 
4933       /* Set interface.  */
4934       if (proc_if != NULL)
4935 	{
4936           if (sym->ts.type != BT_UNKNOWN)
4937 	    {
4938 	      gfc_error ("Procedure '%s' at %L already has basic type of %s",
4939 			 sym->name, &gfc_current_locus,
4940 			 gfc_basic_typename (sym->ts.type));
4941 	      return MATCH_ERROR;
4942 	    }
4943 	  sym->ts.interface = proc_if;
4944 	  sym->attr.untyped = 1;
4945 	  sym->attr.if_source = IFSRC_IFBODY;
4946 	}
4947       else if (current_ts.type != BT_UNKNOWN)
4948 	{
4949 	  if (gfc_add_type (sym, &current_ts, &gfc_current_locus) == FAILURE)
4950 	    return MATCH_ERROR;
4951 	  sym->ts.interface = gfc_new_symbol ("", gfc_current_ns);
4952 	  sym->ts.interface->ts = current_ts;
4953 	  sym->ts.interface->attr.flavor = FL_PROCEDURE;
4954 	  sym->ts.interface->attr.function = 1;
4955 	  sym->attr.function = 1;
4956 	  sym->attr.if_source = IFSRC_UNKNOWN;
4957 	}
4958 
4959       if (gfc_match (" =>") == MATCH_YES)
4960 	{
4961 	  if (!current_attr.pointer)
4962 	    {
4963 	      gfc_error ("Initialization at %C isn't for a pointer variable");
4964 	      m = MATCH_ERROR;
4965 	      goto cleanup;
4966 	    }
4967 
4968 	  m = match_pointer_init (&initializer, 1);
4969 	  if (m != MATCH_YES)
4970 	    goto cleanup;
4971 
4972 	  if (add_init_expr_to_sym (sym->name, &initializer, &gfc_current_locus)
4973 	      != SUCCESS)
4974 	    goto cleanup;
4975 
4976 	}
4977 
4978       if (gfc_match_eos () == MATCH_YES)
4979 	return MATCH_YES;
4980       if (gfc_match_char (',') != MATCH_YES)
4981 	goto syntax;
4982     }
4983 
4984 syntax:
4985   gfc_error ("Syntax error in PROCEDURE statement at %C");
4986   return MATCH_ERROR;
4987 
4988 cleanup:
4989   /* Free stuff up and return.  */
4990   gfc_free_expr (initializer);
4991   return m;
4992 }
4993 
4994 
4995 static match
4996 match_binding_attributes (gfc_typebound_proc* ba, bool generic, bool ppc);
4997 
4998 
4999 /* Match a procedure pointer component declaration (R445).  */
5000 
5001 static match
match_ppc_decl(void)5002 match_ppc_decl (void)
5003 {
5004   match m;
5005   gfc_symbol *proc_if = NULL;
5006   gfc_typespec ts;
5007   int num;
5008   gfc_component *c;
5009   gfc_expr *initializer = NULL;
5010   gfc_typebound_proc* tb;
5011   char name[GFC_MAX_SYMBOL_LEN + 1];
5012 
5013   /* Parse interface (with brackets).  */
5014   m = match_procedure_interface (&proc_if);
5015   if (m != MATCH_YES)
5016     goto syntax;
5017 
5018   /* Parse attributes.  */
5019   tb = XCNEW (gfc_typebound_proc);
5020   tb->where = gfc_current_locus;
5021   m = match_binding_attributes (tb, false, true);
5022   if (m == MATCH_ERROR)
5023     return m;
5024 
5025   gfc_clear_attr (&current_attr);
5026   current_attr.procedure = 1;
5027   current_attr.proc_pointer = 1;
5028   current_attr.access = tb->access;
5029   current_attr.flavor = FL_PROCEDURE;
5030 
5031   /* Match the colons (required).  */
5032   if (gfc_match (" ::") != MATCH_YES)
5033     {
5034       gfc_error ("Expected '::' after binding-attributes at %C");
5035       return MATCH_ERROR;
5036     }
5037 
5038   /* Check for C450.  */
5039   if (!tb->nopass && proc_if == NULL)
5040     {
5041       gfc_error("NOPASS or explicit interface required at %C");
5042       return MATCH_ERROR;
5043     }
5044 
5045   if (gfc_notify_std (GFC_STD_F2003, "Procedure pointer "
5046                      "component at %C") == FAILURE)
5047     return MATCH_ERROR;
5048 
5049   /* Match PPC names.  */
5050   ts = current_ts;
5051   for(num=1;;num++)
5052     {
5053       m = gfc_match_name (name);
5054       if (m == MATCH_NO)
5055 	goto syntax;
5056       else if (m == MATCH_ERROR)
5057 	return m;
5058 
5059       if (gfc_add_component (gfc_current_block (), name, &c) == FAILURE)
5060 	return MATCH_ERROR;
5061 
5062       /* Add current_attr to the symbol attributes.  */
5063       if (gfc_copy_attr (&c->attr, &current_attr, NULL) == FAILURE)
5064 	return MATCH_ERROR;
5065 
5066       if (gfc_add_external (&c->attr, NULL) == FAILURE)
5067 	return MATCH_ERROR;
5068 
5069       if (gfc_add_proc (&c->attr, name, NULL) == FAILURE)
5070 	return MATCH_ERROR;
5071 
5072       c->tb = tb;
5073 
5074       /* Set interface.  */
5075       if (proc_if != NULL)
5076 	{
5077 	  c->ts.interface = proc_if;
5078 	  c->attr.untyped = 1;
5079 	  c->attr.if_source = IFSRC_IFBODY;
5080 	}
5081       else if (ts.type != BT_UNKNOWN)
5082 	{
5083 	  c->ts = ts;
5084 	  c->ts.interface = gfc_new_symbol ("", gfc_current_ns);
5085 	  c->ts.interface->result = c->ts.interface;
5086 	  c->ts.interface->ts = ts;
5087 	  c->ts.interface->attr.flavor = FL_PROCEDURE;
5088 	  c->ts.interface->attr.function = 1;
5089 	  c->attr.function = 1;
5090 	  c->attr.if_source = IFSRC_UNKNOWN;
5091 	}
5092 
5093       if (gfc_match (" =>") == MATCH_YES)
5094 	{
5095 	  m = match_pointer_init (&initializer, 1);
5096 	  if (m != MATCH_YES)
5097 	    {
5098 	      gfc_free_expr (initializer);
5099 	      return m;
5100 	    }
5101 	  c->initializer = initializer;
5102 	}
5103 
5104       if (gfc_match_eos () == MATCH_YES)
5105 	return MATCH_YES;
5106       if (gfc_match_char (',') != MATCH_YES)
5107 	goto syntax;
5108     }
5109 
5110 syntax:
5111   gfc_error ("Syntax error in procedure pointer component at %C");
5112   return MATCH_ERROR;
5113 }
5114 
5115 
5116 /* Match a PROCEDURE declaration inside an interface (R1206).  */
5117 
5118 static match
match_procedure_in_interface(void)5119 match_procedure_in_interface (void)
5120 {
5121   match m;
5122   gfc_symbol *sym;
5123   char name[GFC_MAX_SYMBOL_LEN + 1];
5124   locus old_locus;
5125 
5126   if (current_interface.type == INTERFACE_NAMELESS
5127       || current_interface.type == INTERFACE_ABSTRACT)
5128     {
5129       gfc_error ("PROCEDURE at %C must be in a generic interface");
5130       return MATCH_ERROR;
5131     }
5132 
5133   /* Check if the F2008 optional double colon appears.  */
5134   gfc_gobble_whitespace ();
5135   old_locus = gfc_current_locus;
5136   if (gfc_match ("::") == MATCH_YES)
5137     {
5138       if (gfc_notify_std (GFC_STD_F2008, "double colon in "
5139 			 "MODULE PROCEDURE statement at %L", &old_locus)
5140 	  == FAILURE)
5141 	return MATCH_ERROR;
5142     }
5143   else
5144     gfc_current_locus = old_locus;
5145 
5146   for(;;)
5147     {
5148       m = gfc_match_name (name);
5149       if (m == MATCH_NO)
5150 	goto syntax;
5151       else if (m == MATCH_ERROR)
5152 	return m;
5153       if (gfc_get_symbol (name, gfc_current_ns->parent, &sym))
5154 	return MATCH_ERROR;
5155 
5156       if (gfc_add_interface (sym) == FAILURE)
5157 	return MATCH_ERROR;
5158 
5159       if (gfc_match_eos () == MATCH_YES)
5160 	break;
5161       if (gfc_match_char (',') != MATCH_YES)
5162 	goto syntax;
5163     }
5164 
5165   return MATCH_YES;
5166 
5167 syntax:
5168   gfc_error ("Syntax error in PROCEDURE statement at %C");
5169   return MATCH_ERROR;
5170 }
5171 
5172 
5173 /* General matcher for PROCEDURE declarations.  */
5174 
5175 static match match_procedure_in_type (void);
5176 
5177 match
gfc_match_procedure(void)5178 gfc_match_procedure (void)
5179 {
5180   match m;
5181 
5182   switch (gfc_current_state ())
5183     {
5184     case COMP_NONE:
5185     case COMP_PROGRAM:
5186     case COMP_MODULE:
5187     case COMP_SUBROUTINE:
5188     case COMP_FUNCTION:
5189     case COMP_BLOCK:
5190       m = match_procedure_decl ();
5191       break;
5192     case COMP_INTERFACE:
5193       m = match_procedure_in_interface ();
5194       break;
5195     case COMP_DERIVED:
5196       m = match_ppc_decl ();
5197       break;
5198     case COMP_DERIVED_CONTAINS:
5199       m = match_procedure_in_type ();
5200       break;
5201     default:
5202       return MATCH_NO;
5203     }
5204 
5205   if (m != MATCH_YES)
5206     return m;
5207 
5208   if (gfc_notify_std (GFC_STD_F2003, "PROCEDURE statement at %C")
5209       == FAILURE)
5210     return MATCH_ERROR;
5211 
5212   return m;
5213 }
5214 
5215 
5216 /* Warn if a matched procedure has the same name as an intrinsic; this is
5217    simply a wrapper around gfc_warn_intrinsic_shadow that interprets the current
5218    parser-state-stack to find out whether we're in a module.  */
5219 
5220 static void
warn_intrinsic_shadow(const gfc_symbol * sym,bool func)5221 warn_intrinsic_shadow (const gfc_symbol* sym, bool func)
5222 {
5223   bool in_module;
5224 
5225   in_module = (gfc_state_stack->previous
5226 	       && gfc_state_stack->previous->state == COMP_MODULE);
5227 
5228   gfc_warn_intrinsic_shadow (sym, in_module, func);
5229 }
5230 
5231 
5232 /* Match a function declaration.  */
5233 
5234 match
gfc_match_function_decl(void)5235 gfc_match_function_decl (void)
5236 {
5237   char name[GFC_MAX_SYMBOL_LEN + 1];
5238   gfc_symbol *sym, *result;
5239   locus old_loc;
5240   match m;
5241   match suffix_match;
5242   match found_match; /* Status returned by match func.  */
5243 
5244   if (gfc_current_state () != COMP_NONE
5245       && gfc_current_state () != COMP_INTERFACE
5246       && gfc_current_state () != COMP_CONTAINS)
5247     return MATCH_NO;
5248 
5249   gfc_clear_ts (&current_ts);
5250 
5251   old_loc = gfc_current_locus;
5252 
5253   m = gfc_match_prefix (&current_ts);
5254   if (m != MATCH_YES)
5255     {
5256       gfc_current_locus = old_loc;
5257       return m;
5258     }
5259 
5260   if (gfc_match ("function% %n", name) != MATCH_YES)
5261     {
5262       gfc_current_locus = old_loc;
5263       return MATCH_NO;
5264     }
5265   if (get_proc_name (name, &sym, false))
5266     return MATCH_ERROR;
5267 
5268   if (add_hidden_procptr_result (sym) == SUCCESS)
5269     sym = sym->result;
5270 
5271   gfc_new_block = sym;
5272 
5273   m = gfc_match_formal_arglist (sym, 0, 0);
5274   if (m == MATCH_NO)
5275     {
5276       gfc_error ("Expected formal argument list in function "
5277 		 "definition at %C");
5278       m = MATCH_ERROR;
5279       goto cleanup;
5280     }
5281   else if (m == MATCH_ERROR)
5282     goto cleanup;
5283 
5284   result = NULL;
5285 
5286   /* According to the draft, the bind(c) and result clause can
5287      come in either order after the formal_arg_list (i.e., either
5288      can be first, both can exist together or by themselves or neither
5289      one).  Therefore, the match_result can't match the end of the
5290      string, and check for the bind(c) or result clause in either order.  */
5291   found_match = gfc_match_eos ();
5292 
5293   /* Make sure that it isn't already declared as BIND(C).  If it is, it
5294      must have been marked BIND(C) with a BIND(C) attribute and that is
5295      not allowed for procedures.  */
5296   if (sym->attr.is_bind_c == 1)
5297     {
5298       sym->attr.is_bind_c = 0;
5299       if (sym->old_symbol != NULL)
5300         gfc_error_now ("BIND(C) attribute at %L can only be used for "
5301                        "variables or common blocks",
5302                        &(sym->old_symbol->declared_at));
5303       else
5304         gfc_error_now ("BIND(C) attribute at %L can only be used for "
5305                        "variables or common blocks", &gfc_current_locus);
5306     }
5307 
5308   if (found_match != MATCH_YES)
5309     {
5310       /* If we haven't found the end-of-statement, look for a suffix.  */
5311       suffix_match = gfc_match_suffix (sym, &result);
5312       if (suffix_match == MATCH_YES)
5313         /* Need to get the eos now.  */
5314         found_match = gfc_match_eos ();
5315       else
5316 	found_match = suffix_match;
5317     }
5318 
5319   if(found_match != MATCH_YES)
5320     m = MATCH_ERROR;
5321   else
5322     {
5323       /* Make changes to the symbol.  */
5324       m = MATCH_ERROR;
5325 
5326       if (gfc_add_function (&sym->attr, sym->name, NULL) == FAILURE)
5327 	goto cleanup;
5328 
5329       if (gfc_missing_attr (&sym->attr, NULL) == FAILURE
5330 	  || copy_prefix (&sym->attr, &sym->declared_at) == FAILURE)
5331 	goto cleanup;
5332 
5333       /* Delay matching the function characteristics until after the
5334 	 specification block by signalling kind=-1.  */
5335       sym->declared_at = old_loc;
5336       if (current_ts.type != BT_UNKNOWN)
5337 	current_ts.kind = -1;
5338       else
5339 	current_ts.kind = 0;
5340 
5341       if (result == NULL)
5342 	{
5343           if (current_ts.type != BT_UNKNOWN
5344 	      && gfc_add_type (sym, &current_ts, &gfc_current_locus) == FAILURE)
5345 	    goto cleanup;
5346 	  sym->result = sym;
5347 	}
5348       else
5349 	{
5350           if (current_ts.type != BT_UNKNOWN
5351 	      && gfc_add_type (result, &current_ts, &gfc_current_locus)
5352 		 == FAILURE)
5353 	    goto cleanup;
5354 	  sym->result = result;
5355 	}
5356 
5357       /* Warn if this procedure has the same name as an intrinsic.  */
5358       warn_intrinsic_shadow (sym, true);
5359 
5360       return MATCH_YES;
5361     }
5362 
5363 cleanup:
5364   gfc_current_locus = old_loc;
5365   return m;
5366 }
5367 
5368 
5369 /* This is mostly a copy of parse.c(add_global_procedure) but modified to
5370    pass the name of the entry, rather than the gfc_current_block name, and
5371    to return false upon finding an existing global entry.  */
5372 
5373 static bool
add_global_entry(const char * name,int sub)5374 add_global_entry (const char *name, int sub)
5375 {
5376   gfc_gsymbol *s;
5377   enum gfc_symbol_type type;
5378 
5379   s = gfc_get_gsymbol(name);
5380   type = sub ? GSYM_SUBROUTINE : GSYM_FUNCTION;
5381 
5382   if (s->defined
5383       || (s->type != GSYM_UNKNOWN
5384 	  && s->type != type))
5385     gfc_global_used(s, NULL);
5386   else
5387     {
5388       s->type = type;
5389       s->where = gfc_current_locus;
5390       s->defined = 1;
5391       s->ns = gfc_current_ns;
5392       return true;
5393     }
5394   return false;
5395 }
5396 
5397 
5398 /* Match an ENTRY statement.  */
5399 
5400 match
gfc_match_entry(void)5401 gfc_match_entry (void)
5402 {
5403   gfc_symbol *proc;
5404   gfc_symbol *result;
5405   gfc_symbol *entry;
5406   char name[GFC_MAX_SYMBOL_LEN + 1];
5407   gfc_compile_state state;
5408   match m;
5409   gfc_entry_list *el;
5410   locus old_loc;
5411   bool module_procedure;
5412   char peek_char;
5413   match is_bind_c;
5414 
5415   m = gfc_match_name (name);
5416   if (m != MATCH_YES)
5417     return m;
5418 
5419   if (gfc_notify_std (GFC_STD_F2008_OBS,
5420 		      "ENTRY statement at %C") == FAILURE)
5421     return MATCH_ERROR;
5422 
5423   state = gfc_current_state ();
5424   if (state != COMP_SUBROUTINE && state != COMP_FUNCTION)
5425     {
5426       switch (state)
5427 	{
5428 	  case COMP_PROGRAM:
5429 	    gfc_error ("ENTRY statement at %C cannot appear within a PROGRAM");
5430 	    break;
5431 	  case COMP_MODULE:
5432 	    gfc_error ("ENTRY statement at %C cannot appear within a MODULE");
5433 	    break;
5434 	  case COMP_BLOCK_DATA:
5435 	    gfc_error ("ENTRY statement at %C cannot appear within "
5436 		       "a BLOCK DATA");
5437 	    break;
5438 	  case COMP_INTERFACE:
5439 	    gfc_error ("ENTRY statement at %C cannot appear within "
5440 		       "an INTERFACE");
5441 	    break;
5442 	  case COMP_DERIVED:
5443 	    gfc_error ("ENTRY statement at %C cannot appear within "
5444 		       "a DERIVED TYPE block");
5445 	    break;
5446 	  case COMP_IF:
5447 	    gfc_error ("ENTRY statement at %C cannot appear within "
5448 		       "an IF-THEN block");
5449 	    break;
5450 	  case COMP_DO:
5451 	  case COMP_DO_CONCURRENT:
5452 	    gfc_error ("ENTRY statement at %C cannot appear within "
5453 		       "a DO block");
5454 	    break;
5455 	  case COMP_SELECT:
5456 	    gfc_error ("ENTRY statement at %C cannot appear within "
5457 		       "a SELECT block");
5458 	    break;
5459 	  case COMP_FORALL:
5460 	    gfc_error ("ENTRY statement at %C cannot appear within "
5461 		       "a FORALL block");
5462 	    break;
5463 	  case COMP_WHERE:
5464 	    gfc_error ("ENTRY statement at %C cannot appear within "
5465 		       "a WHERE block");
5466 	    break;
5467 	  case COMP_CONTAINS:
5468 	    gfc_error ("ENTRY statement at %C cannot appear within "
5469 		       "a contained subprogram");
5470 	    break;
5471 	  default:
5472 	    gfc_internal_error ("gfc_match_entry(): Bad state");
5473 	}
5474       return MATCH_ERROR;
5475     }
5476 
5477   module_procedure = gfc_current_ns->parent != NULL
5478 		   && gfc_current_ns->parent->proc_name
5479 		   && gfc_current_ns->parent->proc_name->attr.flavor
5480 		      == FL_MODULE;
5481 
5482   if (gfc_current_ns->parent != NULL
5483       && gfc_current_ns->parent->proc_name
5484       && !module_procedure)
5485     {
5486       gfc_error("ENTRY statement at %C cannot appear in a "
5487 		"contained procedure");
5488       return MATCH_ERROR;
5489     }
5490 
5491   /* Module function entries need special care in get_proc_name
5492      because previous references within the function will have
5493      created symbols attached to the current namespace.  */
5494   if (get_proc_name (name, &entry,
5495 		     gfc_current_ns->parent != NULL
5496 		     && module_procedure))
5497     return MATCH_ERROR;
5498 
5499   proc = gfc_current_block ();
5500 
5501   /* Make sure that it isn't already declared as BIND(C).  If it is, it
5502      must have been marked BIND(C) with a BIND(C) attribute and that is
5503      not allowed for procedures.  */
5504   if (entry->attr.is_bind_c == 1)
5505     {
5506       entry->attr.is_bind_c = 0;
5507       if (entry->old_symbol != NULL)
5508         gfc_error_now ("BIND(C) attribute at %L can only be used for "
5509                        "variables or common blocks",
5510                        &(entry->old_symbol->declared_at));
5511       else
5512         gfc_error_now ("BIND(C) attribute at %L can only be used for "
5513                        "variables or common blocks", &gfc_current_locus);
5514     }
5515 
5516   /* Check what next non-whitespace character is so we can tell if there
5517      is the required parens if we have a BIND(C).  */
5518   gfc_gobble_whitespace ();
5519   peek_char = gfc_peek_ascii_char ();
5520 
5521   if (state == COMP_SUBROUTINE)
5522     {
5523       /* An entry in a subroutine.  */
5524       if (!gfc_current_ns->parent && !add_global_entry (name, 1))
5525 	return MATCH_ERROR;
5526 
5527       m = gfc_match_formal_arglist (entry, 0, 1);
5528       if (m != MATCH_YES)
5529 	return MATCH_ERROR;
5530 
5531       /* Call gfc_match_bind_c with allow_binding_name = true as ENTRY can
5532 	 never be an internal procedure.  */
5533       is_bind_c = gfc_match_bind_c (entry, true);
5534       if (is_bind_c == MATCH_ERROR)
5535 	return MATCH_ERROR;
5536       if (is_bind_c == MATCH_YES)
5537 	{
5538 	  if (peek_char != '(')
5539 	    {
5540 	      gfc_error ("Missing required parentheses before BIND(C) at %C");
5541 	      return MATCH_ERROR;
5542 	    }
5543 	    if (gfc_add_is_bind_c (&(entry->attr), entry->name, &(entry->declared_at), 1)
5544 		== FAILURE)
5545 	      return MATCH_ERROR;
5546 	}
5547 
5548       if (gfc_add_entry (&entry->attr, entry->name, NULL) == FAILURE
5549 	  || gfc_add_subroutine (&entry->attr, entry->name, NULL) == FAILURE)
5550 	return MATCH_ERROR;
5551     }
5552   else
5553     {
5554       /* An entry in a function.
5555 	 We need to take special care because writing
5556 	    ENTRY f()
5557 	 as
5558 	    ENTRY f
5559 	 is allowed, whereas
5560 	    ENTRY f() RESULT (r)
5561 	 can't be written as
5562 	    ENTRY f RESULT (r).  */
5563       if (!gfc_current_ns->parent && !add_global_entry (name, 0))
5564 	return MATCH_ERROR;
5565 
5566       old_loc = gfc_current_locus;
5567       if (gfc_match_eos () == MATCH_YES)
5568 	{
5569 	  gfc_current_locus = old_loc;
5570 	  /* Match the empty argument list, and add the interface to
5571 	     the symbol.  */
5572 	  m = gfc_match_formal_arglist (entry, 0, 1);
5573 	}
5574       else
5575 	m = gfc_match_formal_arglist (entry, 0, 0);
5576 
5577       if (m != MATCH_YES)
5578 	return MATCH_ERROR;
5579 
5580       result = NULL;
5581 
5582       if (gfc_match_eos () == MATCH_YES)
5583 	{
5584 	  if (gfc_add_entry (&entry->attr, entry->name, NULL) == FAILURE
5585 	      || gfc_add_function (&entry->attr, entry->name, NULL) == FAILURE)
5586 	    return MATCH_ERROR;
5587 
5588 	  entry->result = entry;
5589 	}
5590       else
5591 	{
5592 	  m = gfc_match_suffix (entry, &result);
5593 	  if (m == MATCH_NO)
5594 	    gfc_syntax_error (ST_ENTRY);
5595 	  if (m != MATCH_YES)
5596 	    return MATCH_ERROR;
5597 
5598           if (result)
5599 	    {
5600 	      if (gfc_add_result (&result->attr, result->name, NULL) == FAILURE
5601 		  || gfc_add_entry (&entry->attr, result->name, NULL) == FAILURE
5602 		  || gfc_add_function (&entry->attr, result->name, NULL)
5603 		  == FAILURE)
5604 	        return MATCH_ERROR;
5605 	      entry->result = result;
5606 	    }
5607 	  else
5608 	    {
5609 	      if (gfc_add_entry (&entry->attr, entry->name, NULL) == FAILURE
5610 		  || gfc_add_function (&entry->attr, entry->name, NULL) == FAILURE)
5611 		return MATCH_ERROR;
5612 	      entry->result = entry;
5613 	    }
5614 	}
5615     }
5616 
5617   if (gfc_match_eos () != MATCH_YES)
5618     {
5619       gfc_syntax_error (ST_ENTRY);
5620       return MATCH_ERROR;
5621     }
5622 
5623   entry->attr.recursive = proc->attr.recursive;
5624   entry->attr.elemental = proc->attr.elemental;
5625   entry->attr.pure = proc->attr.pure;
5626 
5627   el = gfc_get_entry_list ();
5628   el->sym = entry;
5629   el->next = gfc_current_ns->entries;
5630   gfc_current_ns->entries = el;
5631   if (el->next)
5632     el->id = el->next->id + 1;
5633   else
5634     el->id = 1;
5635 
5636   new_st.op = EXEC_ENTRY;
5637   new_st.ext.entry = el;
5638 
5639   return MATCH_YES;
5640 }
5641 
5642 
5643 /* Match a subroutine statement, including optional prefixes.  */
5644 
5645 match
gfc_match_subroutine(void)5646 gfc_match_subroutine (void)
5647 {
5648   char name[GFC_MAX_SYMBOL_LEN + 1];
5649   gfc_symbol *sym;
5650   match m;
5651   match is_bind_c;
5652   char peek_char;
5653   bool allow_binding_name;
5654 
5655   if (gfc_current_state () != COMP_NONE
5656       && gfc_current_state () != COMP_INTERFACE
5657       && gfc_current_state () != COMP_CONTAINS)
5658     return MATCH_NO;
5659 
5660   m = gfc_match_prefix (NULL);
5661   if (m != MATCH_YES)
5662     return m;
5663 
5664   m = gfc_match ("subroutine% %n", name);
5665   if (m != MATCH_YES)
5666     return m;
5667 
5668   if (get_proc_name (name, &sym, false))
5669     return MATCH_ERROR;
5670 
5671   /* Set declared_at as it might point to, e.g., a PUBLIC statement, if
5672      the symbol existed before. */
5673   sym->declared_at = gfc_current_locus;
5674 
5675   if (add_hidden_procptr_result (sym) == SUCCESS)
5676     sym = sym->result;
5677 
5678   gfc_new_block = sym;
5679 
5680   /* Check what next non-whitespace character is so we can tell if there
5681      is the required parens if we have a BIND(C).  */
5682   gfc_gobble_whitespace ();
5683   peek_char = gfc_peek_ascii_char ();
5684 
5685   if (gfc_add_subroutine (&sym->attr, sym->name, NULL) == FAILURE)
5686     return MATCH_ERROR;
5687 
5688   if (gfc_match_formal_arglist (sym, 0, 1) != MATCH_YES)
5689     return MATCH_ERROR;
5690 
5691   /* Make sure that it isn't already declared as BIND(C).  If it is, it
5692      must have been marked BIND(C) with a BIND(C) attribute and that is
5693      not allowed for procedures.  */
5694   if (sym->attr.is_bind_c == 1)
5695     {
5696       sym->attr.is_bind_c = 0;
5697       if (sym->old_symbol != NULL)
5698         gfc_error_now ("BIND(C) attribute at %L can only be used for "
5699                        "variables or common blocks",
5700                        &(sym->old_symbol->declared_at));
5701       else
5702         gfc_error_now ("BIND(C) attribute at %L can only be used for "
5703                        "variables or common blocks", &gfc_current_locus);
5704     }
5705 
5706   /* C binding names are not allowed for internal procedures.  */
5707   if (gfc_current_state () == COMP_CONTAINS
5708       && sym->ns->proc_name->attr.flavor != FL_MODULE)
5709     allow_binding_name = false;
5710   else
5711     allow_binding_name = true;
5712 
5713   /* Here, we are just checking if it has the bind(c) attribute, and if
5714      so, then we need to make sure it's all correct.  If it doesn't,
5715      we still need to continue matching the rest of the subroutine line.  */
5716   is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
5717   if (is_bind_c == MATCH_ERROR)
5718     {
5719       /* There was an attempt at the bind(c), but it was wrong.	 An
5720 	 error message should have been printed w/in the gfc_match_bind_c
5721 	 so here we'll just return the MATCH_ERROR.  */
5722       return MATCH_ERROR;
5723     }
5724 
5725   if (is_bind_c == MATCH_YES)
5726     {
5727       /* The following is allowed in the Fortran 2008 draft.  */
5728       if (gfc_current_state () == COMP_CONTAINS
5729 	  && sym->ns->proc_name->attr.flavor != FL_MODULE
5730 	  && gfc_notify_std (GFC_STD_F2008, "BIND(C) attribute "
5731 			     "at %L may not be specified for an internal "
5732 			     "procedure", &gfc_current_locus)
5733 	     == FAILURE)
5734 	return MATCH_ERROR;
5735 
5736       if (peek_char != '(')
5737         {
5738           gfc_error ("Missing required parentheses before BIND(C) at %C");
5739           return MATCH_ERROR;
5740         }
5741       if (gfc_add_is_bind_c (&(sym->attr), sym->name, &(sym->declared_at), 1)
5742 	  == FAILURE)
5743         return MATCH_ERROR;
5744     }
5745 
5746   if (gfc_match_eos () != MATCH_YES)
5747     {
5748       gfc_syntax_error (ST_SUBROUTINE);
5749       return MATCH_ERROR;
5750     }
5751 
5752   if (copy_prefix (&sym->attr, &sym->declared_at) == FAILURE)
5753     return MATCH_ERROR;
5754 
5755   /* Warn if it has the same name as an intrinsic.  */
5756   warn_intrinsic_shadow (sym, false);
5757 
5758   return MATCH_YES;
5759 }
5760 
5761 
5762 /* Match a BIND(C) specifier, with the optional 'name=' specifier if
5763    given, and set the binding label in either the given symbol (if not
5764    NULL), or in the current_ts.  The symbol may be NULL because we may
5765    encounter the BIND(C) before the declaration itself.  Return
5766    MATCH_NO if what we're looking at isn't a BIND(C) specifier,
5767    MATCH_ERROR if it is a BIND(C) clause but an error was encountered,
5768    or MATCH_YES if the specifier was correct and the binding label and
5769    bind(c) fields were set correctly for the given symbol or the
5770    current_ts. If allow_binding_name is false, no binding name may be
5771    given.  */
5772 
5773 match
gfc_match_bind_c(gfc_symbol * sym,bool allow_binding_name)5774 gfc_match_bind_c (gfc_symbol *sym, bool allow_binding_name)
5775 {
5776   /* binding label, if exists */
5777   const char* binding_label = NULL;
5778   match double_quote;
5779   match single_quote;
5780 
5781   /* Initialize the flag that specifies whether we encountered a NAME=
5782      specifier or not.  */
5783   has_name_equals = 0;
5784 
5785   /* This much we have to be able to match, in this order, if
5786      there is a bind(c) label.	*/
5787   if (gfc_match (" bind ( c ") != MATCH_YES)
5788     return MATCH_NO;
5789 
5790   /* Now see if there is a binding label, or if we've reached the
5791      end of the bind(c) attribute without one.	*/
5792   if (gfc_match_char (',') == MATCH_YES)
5793     {
5794       if (gfc_match (" name = ") != MATCH_YES)
5795         {
5796           gfc_error ("Syntax error in NAME= specifier for binding label "
5797                      "at %C");
5798           /* should give an error message here */
5799           return MATCH_ERROR;
5800         }
5801 
5802       has_name_equals = 1;
5803 
5804       /* Get the opening quote.  */
5805       double_quote = MATCH_YES;
5806       single_quote = MATCH_YES;
5807       double_quote = gfc_match_char ('"');
5808       if (double_quote != MATCH_YES)
5809 	single_quote = gfc_match_char ('\'');
5810       if (double_quote != MATCH_YES && single_quote != MATCH_YES)
5811         {
5812           gfc_error ("Syntax error in NAME= specifier for binding label "
5813                      "at %C");
5814           return MATCH_ERROR;
5815         }
5816 
5817       /* Grab the binding label, using functions that will not lower
5818 	 case the names automatically.	*/
5819       if (gfc_match_name_C (&binding_label) != MATCH_YES)
5820 	 return MATCH_ERROR;
5821 
5822       /* Get the closing quotation.  */
5823       if (double_quote == MATCH_YES)
5824 	{
5825 	  if (gfc_match_char ('"') != MATCH_YES)
5826             {
5827               gfc_error ("Missing closing quote '\"' for binding label at %C");
5828               /* User started string with '"' so looked to match it.  */
5829               return MATCH_ERROR;
5830             }
5831 	}
5832       else
5833 	{
5834 	  if (gfc_match_char ('\'') != MATCH_YES)
5835             {
5836               gfc_error ("Missing closing quote '\'' for binding label at %C");
5837               /* User started string with "'" char.  */
5838               return MATCH_ERROR;
5839             }
5840 	}
5841    }
5842 
5843   /* Get the required right paren.  */
5844   if (gfc_match_char (')') != MATCH_YES)
5845     {
5846       gfc_error ("Missing closing paren for binding label at %C");
5847       return MATCH_ERROR;
5848     }
5849 
5850   if (has_name_equals && !allow_binding_name)
5851     {
5852       gfc_error ("No binding name is allowed in BIND(C) at %C");
5853       return MATCH_ERROR;
5854     }
5855 
5856   if (has_name_equals && sym != NULL && sym->attr.dummy)
5857     {
5858       gfc_error ("For dummy procedure %s, no binding name is "
5859 		 "allowed in BIND(C) at %C", sym->name);
5860       return MATCH_ERROR;
5861     }
5862 
5863 
5864   /* Save the binding label to the symbol.  If sym is null, we're
5865      probably matching the typespec attributes of a declaration and
5866      haven't gotten the name yet, and therefore, no symbol yet.	 */
5867   if (binding_label)
5868     {
5869       if (sym != NULL)
5870 	sym->binding_label = binding_label;
5871       else
5872 	curr_binding_label = binding_label;
5873     }
5874   else if (allow_binding_name)
5875     {
5876       /* No binding label, but if symbol isn't null, we
5877 	 can set the label for it here.
5878 	 If name="" or allow_binding_name is false, no C binding name is
5879 	 created. */
5880       if (sym != NULL && sym->name != NULL && has_name_equals == 0)
5881 	sym->binding_label = IDENTIFIER_POINTER (get_identifier (sym->name));
5882     }
5883 
5884   if (has_name_equals && gfc_current_state () == COMP_INTERFACE
5885       && current_interface.type == INTERFACE_ABSTRACT)
5886     {
5887       gfc_error ("NAME not allowed on BIND(C) for ABSTRACT INTERFACE at %C");
5888       return MATCH_ERROR;
5889     }
5890 
5891   return MATCH_YES;
5892 }
5893 
5894 
5895 /* Return nonzero if we're currently compiling a contained procedure.  */
5896 
5897 static int
contained_procedure(void)5898 contained_procedure (void)
5899 {
5900   gfc_state_data *s = gfc_state_stack;
5901 
5902   if ((s->state == COMP_SUBROUTINE || s->state == COMP_FUNCTION)
5903       && s->previous != NULL && s->previous->state == COMP_CONTAINS)
5904     return 1;
5905 
5906   return 0;
5907 }
5908 
5909 /* Set the kind of each enumerator.  The kind is selected such that it is
5910    interoperable with the corresponding C enumeration type, making
5911    sure that -fshort-enums is honored.  */
5912 
5913 static void
set_enum_kind(void)5914 set_enum_kind(void)
5915 {
5916   enumerator_history *current_history = NULL;
5917   int kind;
5918   int i;
5919 
5920   if (max_enum == NULL || enum_history == NULL)
5921     return;
5922 
5923   if (!flag_short_enums)
5924     return;
5925 
5926   i = 0;
5927   do
5928     {
5929       kind = gfc_integer_kinds[i++].kind;
5930     }
5931   while (kind < gfc_c_int_kind
5932 	 && gfc_check_integer_range (max_enum->initializer->value.integer,
5933 				     kind) != ARITH_OK);
5934 
5935   current_history = enum_history;
5936   while (current_history != NULL)
5937     {
5938       current_history->sym->ts.kind = kind;
5939       current_history = current_history->next;
5940     }
5941 }
5942 
5943 
5944 /* Match any of the various end-block statements.  Returns the type of
5945    END to the caller.  The END INTERFACE, END IF, END DO, END SELECT
5946    and END BLOCK statements cannot be replaced by a single END statement.  */
5947 
5948 match
gfc_match_end(gfc_statement * st)5949 gfc_match_end (gfc_statement *st)
5950 {
5951   char name[GFC_MAX_SYMBOL_LEN + 1];
5952   gfc_compile_state state;
5953   locus old_loc;
5954   const char *block_name;
5955   const char *target;
5956   int eos_ok;
5957   match m;
5958   gfc_namespace *parent_ns, *ns, *prev_ns;
5959   gfc_namespace **nsp;
5960 
5961   old_loc = gfc_current_locus;
5962   if (gfc_match ("end") != MATCH_YES)
5963     return MATCH_NO;
5964 
5965   state = gfc_current_state ();
5966   block_name = gfc_current_block () == NULL
5967 	     ? NULL : gfc_current_block ()->name;
5968 
5969   switch (state)
5970     {
5971     case COMP_ASSOCIATE:
5972     case COMP_BLOCK:
5973       if (!strncmp (block_name, "block@", strlen("block@")))
5974 	block_name = NULL;
5975       break;
5976 
5977     case COMP_CONTAINS:
5978     case COMP_DERIVED_CONTAINS:
5979       state = gfc_state_stack->previous->state;
5980       block_name = gfc_state_stack->previous->sym == NULL
5981 		 ? NULL : gfc_state_stack->previous->sym->name;
5982       break;
5983 
5984     default:
5985       break;
5986     }
5987 
5988   switch (state)
5989     {
5990     case COMP_NONE:
5991     case COMP_PROGRAM:
5992       *st = ST_END_PROGRAM;
5993       target = " program";
5994       eos_ok = 1;
5995       break;
5996 
5997     case COMP_SUBROUTINE:
5998       *st = ST_END_SUBROUTINE;
5999       target = " subroutine";
6000       eos_ok = !contained_procedure ();
6001       break;
6002 
6003     case COMP_FUNCTION:
6004       *st = ST_END_FUNCTION;
6005       target = " function";
6006       eos_ok = !contained_procedure ();
6007       break;
6008 
6009     case COMP_BLOCK_DATA:
6010       *st = ST_END_BLOCK_DATA;
6011       target = " block data";
6012       eos_ok = 1;
6013       break;
6014 
6015     case COMP_MODULE:
6016       *st = ST_END_MODULE;
6017       target = " module";
6018       eos_ok = 1;
6019       break;
6020 
6021     case COMP_INTERFACE:
6022       *st = ST_END_INTERFACE;
6023       target = " interface";
6024       eos_ok = 0;
6025       break;
6026 
6027     case COMP_DERIVED:
6028     case COMP_DERIVED_CONTAINS:
6029       *st = ST_END_TYPE;
6030       target = " type";
6031       eos_ok = 0;
6032       break;
6033 
6034     case COMP_ASSOCIATE:
6035       *st = ST_END_ASSOCIATE;
6036       target = " associate";
6037       eos_ok = 0;
6038       break;
6039 
6040     case COMP_BLOCK:
6041       *st = ST_END_BLOCK;
6042       target = " block";
6043       eos_ok = 0;
6044       break;
6045 
6046     case COMP_IF:
6047       *st = ST_ENDIF;
6048       target = " if";
6049       eos_ok = 0;
6050       break;
6051 
6052     case COMP_DO:
6053     case COMP_DO_CONCURRENT:
6054       *st = ST_ENDDO;
6055       target = " do";
6056       eos_ok = 0;
6057       break;
6058 
6059     case COMP_CRITICAL:
6060       *st = ST_END_CRITICAL;
6061       target = " critical";
6062       eos_ok = 0;
6063       break;
6064 
6065     case COMP_SELECT:
6066     case COMP_SELECT_TYPE:
6067       *st = ST_END_SELECT;
6068       target = " select";
6069       eos_ok = 0;
6070       break;
6071 
6072     case COMP_FORALL:
6073       *st = ST_END_FORALL;
6074       target = " forall";
6075       eos_ok = 0;
6076       break;
6077 
6078     case COMP_WHERE:
6079       *st = ST_END_WHERE;
6080       target = " where";
6081       eos_ok = 0;
6082       break;
6083 
6084     case COMP_ENUM:
6085       *st = ST_END_ENUM;
6086       target = " enum";
6087       eos_ok = 0;
6088       last_initializer = NULL;
6089       set_enum_kind ();
6090       gfc_free_enum_history ();
6091       break;
6092 
6093     default:
6094       gfc_error ("Unexpected END statement at %C");
6095       goto cleanup;
6096     }
6097 
6098   if (gfc_match_eos () == MATCH_YES)
6099     {
6100       if (!eos_ok && (*st == ST_END_SUBROUTINE || *st == ST_END_FUNCTION))
6101 	{
6102 	  if (gfc_notify_std (GFC_STD_F2008, "END statement "
6103 			      "instead of %s statement at %L",
6104 			      gfc_ascii_statement (*st), &old_loc) == FAILURE)
6105 	    goto cleanup;
6106 	}
6107       else if (!eos_ok)
6108 	{
6109 	  /* We would have required END [something].  */
6110 	  gfc_error ("%s statement expected at %L",
6111 		     gfc_ascii_statement (*st), &old_loc);
6112 	  goto cleanup;
6113 	}
6114 
6115       return MATCH_YES;
6116     }
6117 
6118   /* Verify that we've got the sort of end-block that we're expecting.  */
6119   if (gfc_match (target) != MATCH_YES)
6120     {
6121       gfc_error ("Expecting %s statement at %C", gfc_ascii_statement (*st));
6122       goto cleanup;
6123     }
6124 
6125   /* If we're at the end, make sure a block name wasn't required.  */
6126   if (gfc_match_eos () == MATCH_YES)
6127     {
6128 
6129       if (*st != ST_ENDDO && *st != ST_ENDIF && *st != ST_END_SELECT
6130 	  && *st != ST_END_FORALL && *st != ST_END_WHERE && *st != ST_END_BLOCK
6131 	  && *st != ST_END_ASSOCIATE && *st != ST_END_CRITICAL)
6132 	return MATCH_YES;
6133 
6134       if (!block_name)
6135 	return MATCH_YES;
6136 
6137       gfc_error ("Expected block name of '%s' in %s statement at %C",
6138 		 block_name, gfc_ascii_statement (*st));
6139 
6140       return MATCH_ERROR;
6141     }
6142 
6143   /* END INTERFACE has a special handler for its several possible endings.  */
6144   if (*st == ST_END_INTERFACE)
6145     return gfc_match_end_interface ();
6146 
6147   /* We haven't hit the end of statement, so what is left must be an
6148      end-name.  */
6149   m = gfc_match_space ();
6150   if (m == MATCH_YES)
6151     m = gfc_match_name (name);
6152 
6153   if (m == MATCH_NO)
6154     gfc_error ("Expected terminating name at %C");
6155   if (m != MATCH_YES)
6156     goto cleanup;
6157 
6158   if (block_name == NULL)
6159     goto syntax;
6160 
6161   if (strcmp (name, block_name) != 0 && strcmp (block_name, "ppr@") != 0)
6162     {
6163       gfc_error ("Expected label '%s' for %s statement at %C", block_name,
6164 		 gfc_ascii_statement (*st));
6165       goto cleanup;
6166     }
6167   /* Procedure pointer as function result.  */
6168   else if (strcmp (block_name, "ppr@") == 0
6169 	   && strcmp (name, gfc_current_block ()->ns->proc_name->name) != 0)
6170     {
6171       gfc_error ("Expected label '%s' for %s statement at %C",
6172 		 gfc_current_block ()->ns->proc_name->name,
6173 		 gfc_ascii_statement (*st));
6174       goto cleanup;
6175     }
6176 
6177   if (gfc_match_eos () == MATCH_YES)
6178     return MATCH_YES;
6179 
6180 syntax:
6181   gfc_syntax_error (*st);
6182 
6183 cleanup:
6184   gfc_current_locus = old_loc;
6185 
6186   /* If we are missing an END BLOCK, we created a half-ready namespace.
6187      Remove it from the parent namespace's sibling list.  */
6188 
6189   if (state == COMP_BLOCK)
6190     {
6191       parent_ns = gfc_current_ns->parent;
6192 
6193       nsp = &(gfc_state_stack->previous->tail->ext.block.ns);
6194 
6195       prev_ns = NULL;
6196       ns = *nsp;
6197       while (ns)
6198 	{
6199 	  if (ns == gfc_current_ns)
6200 	    {
6201 	      if (prev_ns == NULL)
6202 		*nsp = NULL;
6203 	      else
6204 		prev_ns->sibling = ns->sibling;
6205 	    }
6206 	  prev_ns = ns;
6207 	  ns = ns->sibling;
6208 	}
6209 
6210       gfc_free_namespace (gfc_current_ns);
6211       gfc_current_ns = parent_ns;
6212     }
6213 
6214   return MATCH_ERROR;
6215 }
6216 
6217 
6218 
6219 /***************** Attribute declaration statements ****************/
6220 
6221 /* Set the attribute of a single variable.  */
6222 
6223 static match
attr_decl1(void)6224 attr_decl1 (void)
6225 {
6226   char name[GFC_MAX_SYMBOL_LEN + 1];
6227   gfc_array_spec *as;
6228   gfc_symbol *sym;
6229   locus var_locus;
6230   match m;
6231 
6232   as = NULL;
6233 
6234   m = gfc_match_name (name);
6235   if (m != MATCH_YES)
6236     goto cleanup;
6237 
6238   if (find_special (name, &sym, false))
6239     return MATCH_ERROR;
6240 
6241   if (check_function_name (name) == FAILURE)
6242     {
6243       m = MATCH_ERROR;
6244       goto cleanup;
6245     }
6246 
6247   var_locus = gfc_current_locus;
6248 
6249   /* Deal with possible array specification for certain attributes.  */
6250   if (current_attr.dimension
6251       || current_attr.codimension
6252       || current_attr.allocatable
6253       || current_attr.pointer
6254       || current_attr.target)
6255     {
6256       m = gfc_match_array_spec (&as, !current_attr.codimension,
6257 				!current_attr.dimension
6258 				&& !current_attr.pointer
6259 				&& !current_attr.target);
6260       if (m == MATCH_ERROR)
6261 	goto cleanup;
6262 
6263       if (current_attr.dimension && m == MATCH_NO)
6264 	{
6265 	  gfc_error ("Missing array specification at %L in DIMENSION "
6266 		     "statement", &var_locus);
6267 	  m = MATCH_ERROR;
6268 	  goto cleanup;
6269 	}
6270 
6271       if (current_attr.dimension && sym->value)
6272 	{
6273 	  gfc_error ("Dimensions specified for %s at %L after its "
6274 		     "initialisation", sym->name, &var_locus);
6275 	  m = MATCH_ERROR;
6276 	  goto cleanup;
6277 	}
6278 
6279       if (current_attr.codimension && m == MATCH_NO)
6280 	{
6281 	  gfc_error ("Missing array specification at %L in CODIMENSION "
6282 		     "statement", &var_locus);
6283 	  m = MATCH_ERROR;
6284 	  goto cleanup;
6285 	}
6286 
6287       if ((current_attr.allocatable || current_attr.pointer)
6288 	  && (m == MATCH_YES) && (as->type != AS_DEFERRED))
6289 	{
6290 	  gfc_error ("Array specification must be deferred at %L", &var_locus);
6291 	  m = MATCH_ERROR;
6292 	  goto cleanup;
6293 	}
6294     }
6295 
6296   /* Update symbol table.  DIMENSION attribute is set in
6297      gfc_set_array_spec().  For CLASS variables, this must be applied
6298      to the first component, or '_data' field.  */
6299   if (sym->ts.type == BT_CLASS && sym->ts.u.derived->attr.is_class)
6300     {
6301       if (gfc_copy_attr (&CLASS_DATA (sym)->attr, &current_attr, &var_locus)
6302 	  == FAILURE)
6303 	{
6304 	  m = MATCH_ERROR;
6305 	  goto cleanup;
6306 	}
6307     }
6308   else
6309     {
6310       if (current_attr.dimension == 0 && current_attr.codimension == 0
6311 	  && gfc_copy_attr (&sym->attr, &current_attr, &var_locus) == FAILURE)
6312 	{
6313 	  m = MATCH_ERROR;
6314 	  goto cleanup;
6315 	}
6316     }
6317 
6318   if (sym->ts.type == BT_CLASS
6319       && gfc_build_class_symbol (&sym->ts, &sym->attr, &sym->as, false) == FAILURE)
6320     {
6321       m = MATCH_ERROR;
6322       goto cleanup;
6323     }
6324 
6325   if (gfc_set_array_spec (sym, as, &var_locus) == FAILURE)
6326     {
6327       m = MATCH_ERROR;
6328       goto cleanup;
6329     }
6330 
6331   if (sym->attr.cray_pointee && sym->as != NULL)
6332     {
6333       /* Fix the array spec.  */
6334       m = gfc_mod_pointee_as (sym->as);
6335       if (m == MATCH_ERROR)
6336 	goto cleanup;
6337     }
6338 
6339   if (gfc_add_attribute (&sym->attr, &var_locus) == FAILURE)
6340     {
6341       m = MATCH_ERROR;
6342       goto cleanup;
6343     }
6344 
6345   if ((current_attr.external || current_attr.intrinsic)
6346       && sym->attr.flavor != FL_PROCEDURE
6347       && gfc_add_flavor (&sym->attr, FL_PROCEDURE, sym->name, NULL) == FAILURE)
6348     {
6349       m = MATCH_ERROR;
6350       goto cleanup;
6351     }
6352 
6353   add_hidden_procptr_result (sym);
6354 
6355   return MATCH_YES;
6356 
6357 cleanup:
6358   gfc_free_array_spec (as);
6359   return m;
6360 }
6361 
6362 
6363 /* Generic attribute declaration subroutine.  Used for attributes that
6364    just have a list of names.  */
6365 
6366 static match
attr_decl(void)6367 attr_decl (void)
6368 {
6369   match m;
6370 
6371   /* Gobble the optional double colon, by simply ignoring the result
6372      of gfc_match().  */
6373   gfc_match (" ::");
6374 
6375   for (;;)
6376     {
6377       m = attr_decl1 ();
6378       if (m != MATCH_YES)
6379 	break;
6380 
6381       if (gfc_match_eos () == MATCH_YES)
6382 	{
6383 	  m = MATCH_YES;
6384 	  break;
6385 	}
6386 
6387       if (gfc_match_char (',') != MATCH_YES)
6388 	{
6389 	  gfc_error ("Unexpected character in variable list at %C");
6390 	  m = MATCH_ERROR;
6391 	  break;
6392 	}
6393     }
6394 
6395   return m;
6396 }
6397 
6398 
6399 /* This routine matches Cray Pointer declarations of the form:
6400    pointer ( <pointer>, <pointee> )
6401    or
6402    pointer ( <pointer1>, <pointee1> ), ( <pointer2>, <pointee2> ), ...
6403    The pointer, if already declared, should be an integer.  Otherwise, we
6404    set it as BT_INTEGER with kind gfc_index_integer_kind.  The pointee may
6405    be either a scalar, or an array declaration.  No space is allocated for
6406    the pointee.  For the statement
6407    pointer (ipt, ar(10))
6408    any subsequent uses of ar will be translated (in C-notation) as
6409    ar(i) => ((<type> *) ipt)(i)
6410    After gimplification, pointee variable will disappear in the code.  */
6411 
6412 static match
cray_pointer_decl(void)6413 cray_pointer_decl (void)
6414 {
6415   match m;
6416   gfc_array_spec *as = NULL;
6417   gfc_symbol *cptr; /* Pointer symbol.  */
6418   gfc_symbol *cpte; /* Pointee symbol.  */
6419   locus var_locus;
6420   bool done = false;
6421 
6422   while (!done)
6423     {
6424       if (gfc_match_char ('(') != MATCH_YES)
6425 	{
6426 	  gfc_error ("Expected '(' at %C");
6427 	  return MATCH_ERROR;
6428 	}
6429 
6430       /* Match pointer.  */
6431       var_locus = gfc_current_locus;
6432       gfc_clear_attr (&current_attr);
6433       gfc_add_cray_pointer (&current_attr, &var_locus);
6434       current_ts.type = BT_INTEGER;
6435       current_ts.kind = gfc_index_integer_kind;
6436 
6437       m = gfc_match_symbol (&cptr, 0);
6438       if (m != MATCH_YES)
6439 	{
6440 	  gfc_error ("Expected variable name at %C");
6441 	  return m;
6442 	}
6443 
6444       if (gfc_add_cray_pointer (&cptr->attr, &var_locus) == FAILURE)
6445 	return MATCH_ERROR;
6446 
6447       gfc_set_sym_referenced (cptr);
6448 
6449       if (cptr->ts.type == BT_UNKNOWN) /* Override the type, if necessary.  */
6450 	{
6451 	  cptr->ts.type = BT_INTEGER;
6452 	  cptr->ts.kind = gfc_index_integer_kind;
6453 	}
6454       else if (cptr->ts.type != BT_INTEGER)
6455 	{
6456 	  gfc_error ("Cray pointer at %C must be an integer");
6457 	  return MATCH_ERROR;
6458 	}
6459       else if (cptr->ts.kind < gfc_index_integer_kind)
6460 	gfc_warning ("Cray pointer at %C has %d bytes of precision;"
6461 		     " memory addresses require %d bytes",
6462 		     cptr->ts.kind, gfc_index_integer_kind);
6463 
6464       if (gfc_match_char (',') != MATCH_YES)
6465 	{
6466 	  gfc_error ("Expected \",\" at %C");
6467 	  return MATCH_ERROR;
6468 	}
6469 
6470       /* Match Pointee.  */
6471       var_locus = gfc_current_locus;
6472       gfc_clear_attr (&current_attr);
6473       gfc_add_cray_pointee (&current_attr, &var_locus);
6474       current_ts.type = BT_UNKNOWN;
6475       current_ts.kind = 0;
6476 
6477       m = gfc_match_symbol (&cpte, 0);
6478       if (m != MATCH_YES)
6479 	{
6480 	  gfc_error ("Expected variable name at %C");
6481 	  return m;
6482 	}
6483 
6484       /* Check for an optional array spec.  */
6485       m = gfc_match_array_spec (&as, true, false);
6486       if (m == MATCH_ERROR)
6487 	{
6488 	  gfc_free_array_spec (as);
6489 	  return m;
6490 	}
6491       else if (m == MATCH_NO)
6492 	{
6493 	  gfc_free_array_spec (as);
6494 	  as = NULL;
6495 	}
6496 
6497       if (gfc_add_cray_pointee (&cpte->attr, &var_locus) == FAILURE)
6498 	return MATCH_ERROR;
6499 
6500       gfc_set_sym_referenced (cpte);
6501 
6502       if (cpte->as == NULL)
6503 	{
6504 	  if (gfc_set_array_spec (cpte, as, &var_locus) == FAILURE)
6505 	    gfc_internal_error ("Couldn't set Cray pointee array spec.");
6506 	}
6507       else if (as != NULL)
6508 	{
6509 	  gfc_error ("Duplicate array spec for Cray pointee at %C");
6510 	  gfc_free_array_spec (as);
6511 	  return MATCH_ERROR;
6512 	}
6513 
6514       as = NULL;
6515 
6516       if (cpte->as != NULL)
6517 	{
6518 	  /* Fix array spec.  */
6519 	  m = gfc_mod_pointee_as (cpte->as);
6520 	  if (m == MATCH_ERROR)
6521 	    return m;
6522 	}
6523 
6524       /* Point the Pointee at the Pointer.  */
6525       cpte->cp_pointer = cptr;
6526 
6527       if (gfc_match_char (')') != MATCH_YES)
6528 	{
6529 	  gfc_error ("Expected \")\" at %C");
6530 	  return MATCH_ERROR;
6531 	}
6532       m = gfc_match_char (',');
6533       if (m != MATCH_YES)
6534 	done = true; /* Stop searching for more declarations.  */
6535 
6536     }
6537 
6538   if (m == MATCH_ERROR /* Failed when trying to find ',' above.  */
6539       || gfc_match_eos () != MATCH_YES)
6540     {
6541       gfc_error ("Expected \",\" or end of statement at %C");
6542       return MATCH_ERROR;
6543     }
6544   return MATCH_YES;
6545 }
6546 
6547 
6548 match
gfc_match_external(void)6549 gfc_match_external (void)
6550 {
6551 
6552   gfc_clear_attr (&current_attr);
6553   current_attr.external = 1;
6554 
6555   return attr_decl ();
6556 }
6557 
6558 
6559 match
gfc_match_intent(void)6560 gfc_match_intent (void)
6561 {
6562   sym_intent intent;
6563 
6564   /* This is not allowed within a BLOCK construct!  */
6565   if (gfc_current_state () == COMP_BLOCK)
6566     {
6567       gfc_error ("INTENT is not allowed inside of BLOCK at %C");
6568       return MATCH_ERROR;
6569     }
6570 
6571   intent = match_intent_spec ();
6572   if (intent == INTENT_UNKNOWN)
6573     return MATCH_ERROR;
6574 
6575   gfc_clear_attr (&current_attr);
6576   current_attr.intent = intent;
6577 
6578   return attr_decl ();
6579 }
6580 
6581 
6582 match
gfc_match_intrinsic(void)6583 gfc_match_intrinsic (void)
6584 {
6585 
6586   gfc_clear_attr (&current_attr);
6587   current_attr.intrinsic = 1;
6588 
6589   return attr_decl ();
6590 }
6591 
6592 
6593 match
gfc_match_optional(void)6594 gfc_match_optional (void)
6595 {
6596   /* This is not allowed within a BLOCK construct!  */
6597   if (gfc_current_state () == COMP_BLOCK)
6598     {
6599       gfc_error ("OPTIONAL is not allowed inside of BLOCK at %C");
6600       return MATCH_ERROR;
6601     }
6602 
6603   gfc_clear_attr (&current_attr);
6604   current_attr.optional = 1;
6605 
6606   return attr_decl ();
6607 }
6608 
6609 
6610 match
gfc_match_pointer(void)6611 gfc_match_pointer (void)
6612 {
6613   gfc_gobble_whitespace ();
6614   if (gfc_peek_ascii_char () == '(')
6615     {
6616       if (!gfc_option.flag_cray_pointer)
6617 	{
6618 	  gfc_error ("Cray pointer declaration at %C requires -fcray-pointer "
6619 		     "flag");
6620 	  return MATCH_ERROR;
6621 	}
6622       return cray_pointer_decl ();
6623     }
6624   else
6625     {
6626       gfc_clear_attr (&current_attr);
6627       current_attr.pointer = 1;
6628 
6629       return attr_decl ();
6630     }
6631 }
6632 
6633 
6634 match
gfc_match_allocatable(void)6635 gfc_match_allocatable (void)
6636 {
6637   gfc_clear_attr (&current_attr);
6638   current_attr.allocatable = 1;
6639 
6640   return attr_decl ();
6641 }
6642 
6643 
6644 match
gfc_match_codimension(void)6645 gfc_match_codimension (void)
6646 {
6647   gfc_clear_attr (&current_attr);
6648   current_attr.codimension = 1;
6649 
6650   return attr_decl ();
6651 }
6652 
6653 
6654 match
gfc_match_contiguous(void)6655 gfc_match_contiguous (void)
6656 {
6657   if (gfc_notify_std (GFC_STD_F2008, "CONTIGUOUS statement at %C")
6658       == FAILURE)
6659     return MATCH_ERROR;
6660 
6661   gfc_clear_attr (&current_attr);
6662   current_attr.contiguous = 1;
6663 
6664   return attr_decl ();
6665 }
6666 
6667 
6668 match
gfc_match_dimension(void)6669 gfc_match_dimension (void)
6670 {
6671   gfc_clear_attr (&current_attr);
6672   current_attr.dimension = 1;
6673 
6674   return attr_decl ();
6675 }
6676 
6677 
6678 match
gfc_match_target(void)6679 gfc_match_target (void)
6680 {
6681   gfc_clear_attr (&current_attr);
6682   current_attr.target = 1;
6683 
6684   return attr_decl ();
6685 }
6686 
6687 
6688 /* Match the list of entities being specified in a PUBLIC or PRIVATE
6689    statement.  */
6690 
6691 static match
access_attr_decl(gfc_statement st)6692 access_attr_decl (gfc_statement st)
6693 {
6694   char name[GFC_MAX_SYMBOL_LEN + 1];
6695   interface_type type;
6696   gfc_user_op *uop;
6697   gfc_symbol *sym, *dt_sym;
6698   gfc_intrinsic_op op;
6699   match m;
6700 
6701   if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
6702     goto done;
6703 
6704   for (;;)
6705     {
6706       m = gfc_match_generic_spec (&type, name, &op);
6707       if (m == MATCH_NO)
6708 	goto syntax;
6709       if (m == MATCH_ERROR)
6710 	return MATCH_ERROR;
6711 
6712       switch (type)
6713 	{
6714 	case INTERFACE_NAMELESS:
6715 	case INTERFACE_ABSTRACT:
6716 	  goto syntax;
6717 
6718 	case INTERFACE_GENERIC:
6719 	  if (gfc_get_symbol (name, NULL, &sym))
6720 	    goto done;
6721 
6722 	  if (gfc_add_access (&sym->attr, (st == ST_PUBLIC)
6723 					  ? ACCESS_PUBLIC : ACCESS_PRIVATE,
6724 			      sym->name, NULL) == FAILURE)
6725 	    return MATCH_ERROR;
6726 
6727 	  if (sym->attr.generic && (dt_sym = gfc_find_dt_in_generic (sym))
6728 	      && gfc_add_access (&dt_sym->attr,
6729 				 (st == ST_PUBLIC) ? ACCESS_PUBLIC
6730 						   : ACCESS_PRIVATE,
6731 				 sym->name, NULL) == FAILURE)
6732 	    return MATCH_ERROR;
6733 
6734 	  break;
6735 
6736 	case INTERFACE_INTRINSIC_OP:
6737 	  if (gfc_current_ns->operator_access[op] == ACCESS_UNKNOWN)
6738 	    {
6739 	      gfc_intrinsic_op other_op;
6740 
6741 	      gfc_current_ns->operator_access[op] =
6742 		(st == ST_PUBLIC) ? ACCESS_PUBLIC : ACCESS_PRIVATE;
6743 
6744 	      /* Handle the case if there is another op with the same
6745 		 function, for INTRINSIC_EQ vs. INTRINSIC_EQ_OS and so on.  */
6746 	      other_op = gfc_equivalent_op (op);
6747 
6748 	      if (other_op != INTRINSIC_NONE)
6749 		gfc_current_ns->operator_access[other_op] =
6750 		  (st == ST_PUBLIC) ? ACCESS_PUBLIC : ACCESS_PRIVATE;
6751 
6752 	    }
6753 	  else
6754 	    {
6755 	      gfc_error ("Access specification of the %s operator at %C has "
6756 			 "already been specified", gfc_op2string (op));
6757 	      goto done;
6758 	    }
6759 
6760 	  break;
6761 
6762 	case INTERFACE_USER_OP:
6763 	  uop = gfc_get_uop (name);
6764 
6765 	  if (uop->access == ACCESS_UNKNOWN)
6766 	    {
6767 	      uop->access = (st == ST_PUBLIC)
6768 			  ? ACCESS_PUBLIC : ACCESS_PRIVATE;
6769 	    }
6770 	  else
6771 	    {
6772 	      gfc_error ("Access specification of the .%s. operator at %C "
6773 			 "has already been specified", sym->name);
6774 	      goto done;
6775 	    }
6776 
6777 	  break;
6778 	}
6779 
6780       if (gfc_match_char (',') == MATCH_NO)
6781 	break;
6782     }
6783 
6784   if (gfc_match_eos () != MATCH_YES)
6785     goto syntax;
6786   return MATCH_YES;
6787 
6788 syntax:
6789   gfc_syntax_error (st);
6790 
6791 done:
6792   return MATCH_ERROR;
6793 }
6794 
6795 
6796 match
gfc_match_protected(void)6797 gfc_match_protected (void)
6798 {
6799   gfc_symbol *sym;
6800   match m;
6801 
6802   if (gfc_current_ns->proc_name->attr.flavor != FL_MODULE)
6803     {
6804        gfc_error ("PROTECTED at %C only allowed in specification "
6805 		  "part of a module");
6806        return MATCH_ERROR;
6807 
6808     }
6809 
6810   if (gfc_notify_std (GFC_STD_F2003, "PROTECTED statement at %C")
6811       == FAILURE)
6812     return MATCH_ERROR;
6813 
6814   if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
6815     {
6816       return MATCH_ERROR;
6817     }
6818 
6819   if (gfc_match_eos () == MATCH_YES)
6820     goto syntax;
6821 
6822   for(;;)
6823     {
6824       m = gfc_match_symbol (&sym, 0);
6825       switch (m)
6826 	{
6827 	case MATCH_YES:
6828 	  if (gfc_add_protected (&sym->attr, sym->name, &gfc_current_locus)
6829 	      == FAILURE)
6830 	    return MATCH_ERROR;
6831 	  goto next_item;
6832 
6833 	case MATCH_NO:
6834 	  break;
6835 
6836 	case MATCH_ERROR:
6837 	  return MATCH_ERROR;
6838 	}
6839 
6840     next_item:
6841       if (gfc_match_eos () == MATCH_YES)
6842 	break;
6843       if (gfc_match_char (',') != MATCH_YES)
6844 	goto syntax;
6845     }
6846 
6847   return MATCH_YES;
6848 
6849 syntax:
6850   gfc_error ("Syntax error in PROTECTED statement at %C");
6851   return MATCH_ERROR;
6852 }
6853 
6854 
6855 /* The PRIVATE statement is a bit weird in that it can be an attribute
6856    declaration, but also works as a standalone statement inside of a
6857    type declaration or a module.  */
6858 
6859 match
gfc_match_private(gfc_statement * st)6860 gfc_match_private (gfc_statement *st)
6861 {
6862 
6863   if (gfc_match ("private") != MATCH_YES)
6864     return MATCH_NO;
6865 
6866   if (gfc_current_state () != COMP_MODULE
6867       && !(gfc_current_state () == COMP_DERIVED
6868 	   && gfc_state_stack->previous
6869 	   && gfc_state_stack->previous->state == COMP_MODULE)
6870       && !(gfc_current_state () == COMP_DERIVED_CONTAINS
6871 	   && gfc_state_stack->previous && gfc_state_stack->previous->previous
6872 	   && gfc_state_stack->previous->previous->state == COMP_MODULE))
6873     {
6874       gfc_error ("PRIVATE statement at %C is only allowed in the "
6875 		 "specification part of a module");
6876       return MATCH_ERROR;
6877     }
6878 
6879   if (gfc_current_state () == COMP_DERIVED)
6880     {
6881       if (gfc_match_eos () == MATCH_YES)
6882 	{
6883 	  *st = ST_PRIVATE;
6884 	  return MATCH_YES;
6885 	}
6886 
6887       gfc_syntax_error (ST_PRIVATE);
6888       return MATCH_ERROR;
6889     }
6890 
6891   if (gfc_match_eos () == MATCH_YES)
6892     {
6893       *st = ST_PRIVATE;
6894       return MATCH_YES;
6895     }
6896 
6897   *st = ST_ATTR_DECL;
6898   return access_attr_decl (ST_PRIVATE);
6899 }
6900 
6901 
6902 match
gfc_match_public(gfc_statement * st)6903 gfc_match_public (gfc_statement *st)
6904 {
6905 
6906   if (gfc_match ("public") != MATCH_YES)
6907     return MATCH_NO;
6908 
6909   if (gfc_current_state () != COMP_MODULE)
6910     {
6911       gfc_error ("PUBLIC statement at %C is only allowed in the "
6912 		 "specification part of a module");
6913       return MATCH_ERROR;
6914     }
6915 
6916   if (gfc_match_eos () == MATCH_YES)
6917     {
6918       *st = ST_PUBLIC;
6919       return MATCH_YES;
6920     }
6921 
6922   *st = ST_ATTR_DECL;
6923   return access_attr_decl (ST_PUBLIC);
6924 }
6925 
6926 
6927 /* Workhorse for gfc_match_parameter.  */
6928 
6929 static match
do_parm(void)6930 do_parm (void)
6931 {
6932   gfc_symbol *sym;
6933   gfc_expr *init;
6934   match m;
6935   gfc_try t;
6936 
6937   m = gfc_match_symbol (&sym, 0);
6938   if (m == MATCH_NO)
6939     gfc_error ("Expected variable name at %C in PARAMETER statement");
6940 
6941   if (m != MATCH_YES)
6942     return m;
6943 
6944   if (gfc_match_char ('=') == MATCH_NO)
6945     {
6946       gfc_error ("Expected = sign in PARAMETER statement at %C");
6947       return MATCH_ERROR;
6948     }
6949 
6950   m = gfc_match_init_expr (&init);
6951   if (m == MATCH_NO)
6952     gfc_error ("Expected expression at %C in PARAMETER statement");
6953   if (m != MATCH_YES)
6954     return m;
6955 
6956   if (sym->ts.type == BT_UNKNOWN
6957       && gfc_set_default_type (sym, 1, NULL) == FAILURE)
6958     {
6959       m = MATCH_ERROR;
6960       goto cleanup;
6961     }
6962 
6963   if (gfc_check_assign_symbol (sym, NULL, init) == FAILURE
6964       || gfc_add_flavor (&sym->attr, FL_PARAMETER, sym->name, NULL) == FAILURE)
6965     {
6966       m = MATCH_ERROR;
6967       goto cleanup;
6968     }
6969 
6970   if (sym->value)
6971     {
6972       gfc_error ("Initializing already initialized variable at %C");
6973       m = MATCH_ERROR;
6974       goto cleanup;
6975     }
6976 
6977   t = add_init_expr_to_sym (sym->name, &init, &gfc_current_locus);
6978   return (t == SUCCESS) ? MATCH_YES : MATCH_ERROR;
6979 
6980 cleanup:
6981   gfc_free_expr (init);
6982   return m;
6983 }
6984 
6985 
6986 /* Match a parameter statement, with the weird syntax that these have.  */
6987 
6988 match
gfc_match_parameter(void)6989 gfc_match_parameter (void)
6990 {
6991   match m;
6992 
6993   if (gfc_match_char ('(') == MATCH_NO)
6994     return MATCH_NO;
6995 
6996   for (;;)
6997     {
6998       m = do_parm ();
6999       if (m != MATCH_YES)
7000 	break;
7001 
7002       if (gfc_match (" )%t") == MATCH_YES)
7003 	break;
7004 
7005       if (gfc_match_char (',') != MATCH_YES)
7006 	{
7007 	  gfc_error ("Unexpected characters in PARAMETER statement at %C");
7008 	  m = MATCH_ERROR;
7009 	  break;
7010 	}
7011     }
7012 
7013   return m;
7014 }
7015 
7016 
7017 /* Save statements have a special syntax.  */
7018 
7019 match
gfc_match_save(void)7020 gfc_match_save (void)
7021 {
7022   char n[GFC_MAX_SYMBOL_LEN+1];
7023   gfc_common_head *c;
7024   gfc_symbol *sym;
7025   match m;
7026 
7027   if (gfc_match_eos () == MATCH_YES)
7028     {
7029       if (gfc_current_ns->seen_save)
7030 	{
7031 	  if (gfc_notify_std (GFC_STD_LEGACY, "Blanket SAVE statement at %C "
7032 			      "follows previous SAVE statement")
7033 	      == FAILURE)
7034 	    return MATCH_ERROR;
7035 	}
7036 
7037       gfc_current_ns->save_all = gfc_current_ns->seen_save = 1;
7038       return MATCH_YES;
7039     }
7040 
7041   if (gfc_current_ns->save_all)
7042     {
7043       if (gfc_notify_std (GFC_STD_LEGACY, "SAVE statement at %C follows "
7044 			  "blanket SAVE statement")
7045 	  == FAILURE)
7046 	return MATCH_ERROR;
7047     }
7048 
7049   gfc_match (" ::");
7050 
7051   for (;;)
7052     {
7053       m = gfc_match_symbol (&sym, 0);
7054       switch (m)
7055 	{
7056 	case MATCH_YES:
7057 	  if (gfc_add_save (&sym->attr, SAVE_EXPLICIT, sym->name,
7058 			    &gfc_current_locus) == FAILURE)
7059 	    return MATCH_ERROR;
7060 	  goto next_item;
7061 
7062 	case MATCH_NO:
7063 	  break;
7064 
7065 	case MATCH_ERROR:
7066 	  return MATCH_ERROR;
7067 	}
7068 
7069       m = gfc_match (" / %n /", &n);
7070       if (m == MATCH_ERROR)
7071 	return MATCH_ERROR;
7072       if (m == MATCH_NO)
7073 	goto syntax;
7074 
7075       c = gfc_get_common (n, 0);
7076       c->saved = 1;
7077 
7078       gfc_current_ns->seen_save = 1;
7079 
7080     next_item:
7081       if (gfc_match_eos () == MATCH_YES)
7082 	break;
7083       if (gfc_match_char (',') != MATCH_YES)
7084 	goto syntax;
7085     }
7086 
7087   return MATCH_YES;
7088 
7089 syntax:
7090   gfc_error ("Syntax error in SAVE statement at %C");
7091   return MATCH_ERROR;
7092 }
7093 
7094 
7095 match
gfc_match_value(void)7096 gfc_match_value (void)
7097 {
7098   gfc_symbol *sym;
7099   match m;
7100 
7101   /* This is not allowed within a BLOCK construct!  */
7102   if (gfc_current_state () == COMP_BLOCK)
7103     {
7104       gfc_error ("VALUE is not allowed inside of BLOCK at %C");
7105       return MATCH_ERROR;
7106     }
7107 
7108   if (gfc_notify_std (GFC_STD_F2003, "VALUE statement at %C")
7109       == FAILURE)
7110     return MATCH_ERROR;
7111 
7112   if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
7113     {
7114       return MATCH_ERROR;
7115     }
7116 
7117   if (gfc_match_eos () == MATCH_YES)
7118     goto syntax;
7119 
7120   for(;;)
7121     {
7122       m = gfc_match_symbol (&sym, 0);
7123       switch (m)
7124 	{
7125 	case MATCH_YES:
7126 	  if (gfc_add_value (&sym->attr, sym->name, &gfc_current_locus)
7127 	      == FAILURE)
7128 	    return MATCH_ERROR;
7129 	  goto next_item;
7130 
7131 	case MATCH_NO:
7132 	  break;
7133 
7134 	case MATCH_ERROR:
7135 	  return MATCH_ERROR;
7136 	}
7137 
7138     next_item:
7139       if (gfc_match_eos () == MATCH_YES)
7140 	break;
7141       if (gfc_match_char (',') != MATCH_YES)
7142 	goto syntax;
7143     }
7144 
7145   return MATCH_YES;
7146 
7147 syntax:
7148   gfc_error ("Syntax error in VALUE statement at %C");
7149   return MATCH_ERROR;
7150 }
7151 
7152 
7153 match
gfc_match_volatile(void)7154 gfc_match_volatile (void)
7155 {
7156   gfc_symbol *sym;
7157   match m;
7158 
7159   if (gfc_notify_std (GFC_STD_F2003, "VOLATILE statement at %C")
7160       == FAILURE)
7161     return MATCH_ERROR;
7162 
7163   if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
7164     {
7165       return MATCH_ERROR;
7166     }
7167 
7168   if (gfc_match_eos () == MATCH_YES)
7169     goto syntax;
7170 
7171   for(;;)
7172     {
7173       /* VOLATILE is special because it can be added to host-associated
7174 	 symbols locally. Except for coarrays. */
7175       m = gfc_match_symbol (&sym, 1);
7176       switch (m)
7177 	{
7178 	case MATCH_YES:
7179 	  /* F2008, C560+C561. VOLATILE for host-/use-associated variable or
7180 	     for variable in a BLOCK which is defined outside of the BLOCK.  */
7181 	  if (sym->ns != gfc_current_ns && sym->attr.codimension)
7182 	    {
7183 	      gfc_error ("Specifying VOLATILE for coarray variable '%s' at "
7184 			 "%C, which is use-/host-associated", sym->name);
7185 	      return MATCH_ERROR;
7186 	    }
7187 	  if (gfc_add_volatile (&sym->attr, sym->name, &gfc_current_locus)
7188 	      == FAILURE)
7189 	    return MATCH_ERROR;
7190 	  goto next_item;
7191 
7192 	case MATCH_NO:
7193 	  break;
7194 
7195 	case MATCH_ERROR:
7196 	  return MATCH_ERROR;
7197 	}
7198 
7199     next_item:
7200       if (gfc_match_eos () == MATCH_YES)
7201 	break;
7202       if (gfc_match_char (',') != MATCH_YES)
7203 	goto syntax;
7204     }
7205 
7206   return MATCH_YES;
7207 
7208 syntax:
7209   gfc_error ("Syntax error in VOLATILE statement at %C");
7210   return MATCH_ERROR;
7211 }
7212 
7213 
7214 match
gfc_match_asynchronous(void)7215 gfc_match_asynchronous (void)
7216 {
7217   gfc_symbol *sym;
7218   match m;
7219 
7220   if (gfc_notify_std (GFC_STD_F2003, "ASYNCHRONOUS statement at %C")
7221       == FAILURE)
7222     return MATCH_ERROR;
7223 
7224   if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
7225     {
7226       return MATCH_ERROR;
7227     }
7228 
7229   if (gfc_match_eos () == MATCH_YES)
7230     goto syntax;
7231 
7232   for(;;)
7233     {
7234       /* ASYNCHRONOUS is special because it can be added to host-associated
7235 	 symbols locally.  */
7236       m = gfc_match_symbol (&sym, 1);
7237       switch (m)
7238 	{
7239 	case MATCH_YES:
7240 	  if (gfc_add_asynchronous (&sym->attr, sym->name, &gfc_current_locus)
7241 	      == FAILURE)
7242 	    return MATCH_ERROR;
7243 	  goto next_item;
7244 
7245 	case MATCH_NO:
7246 	  break;
7247 
7248 	case MATCH_ERROR:
7249 	  return MATCH_ERROR;
7250 	}
7251 
7252     next_item:
7253       if (gfc_match_eos () == MATCH_YES)
7254 	break;
7255       if (gfc_match_char (',') != MATCH_YES)
7256 	goto syntax;
7257     }
7258 
7259   return MATCH_YES;
7260 
7261 syntax:
7262   gfc_error ("Syntax error in ASYNCHRONOUS statement at %C");
7263   return MATCH_ERROR;
7264 }
7265 
7266 
7267 /* Match a module procedure statement.  Note that we have to modify
7268    symbols in the parent's namespace because the current one was there
7269    to receive symbols that are in an interface's formal argument list.  */
7270 
7271 match
gfc_match_modproc(void)7272 gfc_match_modproc (void)
7273 {
7274   char name[GFC_MAX_SYMBOL_LEN + 1];
7275   gfc_symbol *sym;
7276   match m;
7277   locus old_locus;
7278   gfc_namespace *module_ns;
7279   gfc_interface *old_interface_head, *interface;
7280 
7281   if (gfc_state_stack->state != COMP_INTERFACE
7282       || gfc_state_stack->previous == NULL
7283       || current_interface.type == INTERFACE_NAMELESS
7284       || current_interface.type == INTERFACE_ABSTRACT)
7285     {
7286       gfc_error ("MODULE PROCEDURE at %C must be in a generic module "
7287 		 "interface");
7288       return MATCH_ERROR;
7289     }
7290 
7291   module_ns = gfc_current_ns->parent;
7292   for (; module_ns; module_ns = module_ns->parent)
7293     if (module_ns->proc_name->attr.flavor == FL_MODULE
7294 	|| module_ns->proc_name->attr.flavor == FL_PROGRAM
7295 	|| (module_ns->proc_name->attr.flavor == FL_PROCEDURE
7296 	    && !module_ns->proc_name->attr.contained))
7297       break;
7298 
7299   if (module_ns == NULL)
7300     return MATCH_ERROR;
7301 
7302   /* Store the current state of the interface. We will need it if we
7303      end up with a syntax error and need to recover.  */
7304   old_interface_head = gfc_current_interface_head ();
7305 
7306   /* Check if the F2008 optional double colon appears.  */
7307   gfc_gobble_whitespace ();
7308   old_locus = gfc_current_locus;
7309   if (gfc_match ("::") == MATCH_YES)
7310     {
7311       if (gfc_notify_std (GFC_STD_F2008, "double colon in "
7312 			 "MODULE PROCEDURE statement at %L", &old_locus)
7313 	  == FAILURE)
7314 	return MATCH_ERROR;
7315     }
7316   else
7317     gfc_current_locus = old_locus;
7318 
7319   for (;;)
7320     {
7321       bool last = false;
7322       old_locus = gfc_current_locus;
7323 
7324       m = gfc_match_name (name);
7325       if (m == MATCH_NO)
7326 	goto syntax;
7327       if (m != MATCH_YES)
7328 	return MATCH_ERROR;
7329 
7330       /* Check for syntax error before starting to add symbols to the
7331 	 current namespace.  */
7332       if (gfc_match_eos () == MATCH_YES)
7333 	last = true;
7334 
7335       if (!last && gfc_match_char (',') != MATCH_YES)
7336 	goto syntax;
7337 
7338       /* Now we're sure the syntax is valid, we process this item
7339 	 further.  */
7340       if (gfc_get_symbol (name, module_ns, &sym))
7341 	return MATCH_ERROR;
7342 
7343       if (sym->attr.intrinsic)
7344 	{
7345 	  gfc_error ("Intrinsic procedure at %L cannot be a MODULE "
7346 		     "PROCEDURE", &old_locus);
7347 	  return MATCH_ERROR;
7348 	}
7349 
7350       if (sym->attr.proc != PROC_MODULE
7351 	  && gfc_add_procedure (&sym->attr, PROC_MODULE,
7352 				sym->name, NULL) == FAILURE)
7353 	return MATCH_ERROR;
7354 
7355       if (gfc_add_interface (sym) == FAILURE)
7356 	return MATCH_ERROR;
7357 
7358       sym->attr.mod_proc = 1;
7359       sym->declared_at = old_locus;
7360 
7361       if (last)
7362 	break;
7363     }
7364 
7365   return MATCH_YES;
7366 
7367 syntax:
7368   /* Restore the previous state of the interface.  */
7369   interface = gfc_current_interface_head ();
7370   gfc_set_current_interface_head (old_interface_head);
7371 
7372   /* Free the new interfaces.  */
7373   while (interface != old_interface_head)
7374   {
7375     gfc_interface *i = interface->next;
7376     free (interface);
7377     interface = i;
7378   }
7379 
7380   /* And issue a syntax error.  */
7381   gfc_syntax_error (ST_MODULE_PROC);
7382   return MATCH_ERROR;
7383 }
7384 
7385 
7386 /* Check a derived type that is being extended.  */
7387 static gfc_symbol*
check_extended_derived_type(char * name)7388 check_extended_derived_type (char *name)
7389 {
7390   gfc_symbol *extended;
7391 
7392   if (gfc_find_symbol (name, gfc_current_ns, 1, &extended))
7393     {
7394       gfc_error ("Ambiguous symbol in TYPE definition at %C");
7395       return NULL;
7396     }
7397 
7398   if (!extended)
7399     {
7400       gfc_error ("No such symbol in TYPE definition at %C");
7401       return NULL;
7402     }
7403 
7404   extended = gfc_find_dt_in_generic (extended);
7405 
7406   if (extended->attr.flavor != FL_DERIVED)
7407     {
7408       gfc_error ("'%s' in EXTENDS expression at %C is not a "
7409 		 "derived type", name);
7410       return NULL;
7411     }
7412 
7413   if (extended->attr.is_bind_c)
7414     {
7415       gfc_error ("'%s' cannot be extended at %C because it "
7416 		 "is BIND(C)", extended->name);
7417       return NULL;
7418     }
7419 
7420   if (extended->attr.sequence)
7421     {
7422       gfc_error ("'%s' cannot be extended at %C because it "
7423 		 "is a SEQUENCE type", extended->name);
7424       return NULL;
7425     }
7426 
7427   return extended;
7428 }
7429 
7430 
7431 /* Match the optional attribute specifiers for a type declaration.
7432    Return MATCH_ERROR if an error is encountered in one of the handled
7433    attributes (public, private, bind(c)), MATCH_NO if what's found is
7434    not a handled attribute, and MATCH_YES otherwise.  TODO: More error
7435    checking on attribute conflicts needs to be done.  */
7436 
7437 match
gfc_get_type_attr_spec(symbol_attribute * attr,char * name)7438 gfc_get_type_attr_spec (symbol_attribute *attr, char *name)
7439 {
7440   /* See if the derived type is marked as private.  */
7441   if (gfc_match (" , private") == MATCH_YES)
7442     {
7443       if (gfc_current_state () != COMP_MODULE)
7444 	{
7445 	  gfc_error ("Derived type at %C can only be PRIVATE in the "
7446 		     "specification part of a module");
7447 	  return MATCH_ERROR;
7448 	}
7449 
7450       if (gfc_add_access (attr, ACCESS_PRIVATE, NULL, NULL) == FAILURE)
7451 	return MATCH_ERROR;
7452     }
7453   else if (gfc_match (" , public") == MATCH_YES)
7454     {
7455       if (gfc_current_state () != COMP_MODULE)
7456 	{
7457 	  gfc_error ("Derived type at %C can only be PUBLIC in the "
7458 		     "specification part of a module");
7459 	  return MATCH_ERROR;
7460 	}
7461 
7462       if (gfc_add_access (attr, ACCESS_PUBLIC, NULL, NULL) == FAILURE)
7463 	return MATCH_ERROR;
7464     }
7465   else if (gfc_match (" , bind ( c )") == MATCH_YES)
7466     {
7467       /* If the type is defined to be bind(c) it then needs to make
7468 	 sure that all fields are interoperable.  This will
7469 	 need to be a semantic check on the finished derived type.
7470 	 See 15.2.3 (lines 9-12) of F2003 draft.  */
7471       if (gfc_add_is_bind_c (attr, NULL, &gfc_current_locus, 0) != SUCCESS)
7472 	return MATCH_ERROR;
7473 
7474       /* TODO: attr conflicts need to be checked, probably in symbol.c.  */
7475     }
7476   else if (gfc_match (" , abstract") == MATCH_YES)
7477     {
7478       if (gfc_notify_std (GFC_STD_F2003, "ABSTRACT type at %C")
7479 	    == FAILURE)
7480 	return MATCH_ERROR;
7481 
7482       if (gfc_add_abstract (attr, &gfc_current_locus) == FAILURE)
7483 	return MATCH_ERROR;
7484     }
7485   else if (name && gfc_match(" , extends ( %n )", name) == MATCH_YES)
7486     {
7487       if (gfc_add_extension (attr, &gfc_current_locus) == FAILURE)
7488 	return MATCH_ERROR;
7489     }
7490   else
7491     return MATCH_NO;
7492 
7493   /* If we get here, something matched.  */
7494   return MATCH_YES;
7495 }
7496 
7497 
7498 /* Match the beginning of a derived type declaration.  If a type name
7499    was the result of a function, then it is possible to have a symbol
7500    already to be known as a derived type yet have no components.  */
7501 
7502 match
gfc_match_derived_decl(void)7503 gfc_match_derived_decl (void)
7504 {
7505   char name[GFC_MAX_SYMBOL_LEN + 1];
7506   char parent[GFC_MAX_SYMBOL_LEN + 1];
7507   symbol_attribute attr;
7508   gfc_symbol *sym, *gensym;
7509   gfc_symbol *extended;
7510   match m;
7511   match is_type_attr_spec = MATCH_NO;
7512   bool seen_attr = false;
7513   gfc_interface *intr = NULL, *head;
7514 
7515   if (gfc_current_state () == COMP_DERIVED)
7516     return MATCH_NO;
7517 
7518   name[0] = '\0';
7519   parent[0] = '\0';
7520   gfc_clear_attr (&attr);
7521   extended = NULL;
7522 
7523   do
7524     {
7525       is_type_attr_spec = gfc_get_type_attr_spec (&attr, parent);
7526       if (is_type_attr_spec == MATCH_ERROR)
7527 	return MATCH_ERROR;
7528       if (is_type_attr_spec == MATCH_YES)
7529 	seen_attr = true;
7530     } while (is_type_attr_spec == MATCH_YES);
7531 
7532   /* Deal with derived type extensions.  The extension attribute has
7533      been added to 'attr' but now the parent type must be found and
7534      checked.  */
7535   if (parent[0])
7536     extended = check_extended_derived_type (parent);
7537 
7538   if (parent[0] && !extended)
7539     return MATCH_ERROR;
7540 
7541   if (gfc_match (" ::") != MATCH_YES && seen_attr)
7542     {
7543       gfc_error ("Expected :: in TYPE definition at %C");
7544       return MATCH_ERROR;
7545     }
7546 
7547   m = gfc_match (" %n%t", name);
7548   if (m != MATCH_YES)
7549     return m;
7550 
7551   /* Make sure the name is not the name of an intrinsic type.  */
7552   if (gfc_is_intrinsic_typename (name))
7553     {
7554       gfc_error ("Type name '%s' at %C cannot be the same as an intrinsic "
7555 		 "type", name);
7556       return MATCH_ERROR;
7557     }
7558 
7559   if (gfc_get_symbol (name, NULL, &gensym))
7560     return MATCH_ERROR;
7561 
7562   if (!gensym->attr.generic && gensym->ts.type != BT_UNKNOWN)
7563     {
7564       gfc_error ("Derived type name '%s' at %C already has a basic type "
7565 		 "of %s", gensym->name, gfc_typename (&gensym->ts));
7566       return MATCH_ERROR;
7567     }
7568 
7569   if (!gensym->attr.generic
7570       && gfc_add_generic (&gensym->attr, gensym->name, NULL) == FAILURE)
7571     return MATCH_ERROR;
7572 
7573   if (!gensym->attr.function
7574       && gfc_add_function (&gensym->attr, gensym->name, NULL) == FAILURE)
7575     return MATCH_ERROR;
7576 
7577   sym = gfc_find_dt_in_generic (gensym);
7578 
7579   if (sym && (sym->components != NULL || sym->attr.zero_comp))
7580     {
7581       gfc_error ("Derived type definition of '%s' at %C has already been "
7582                  "defined", sym->name);
7583       return MATCH_ERROR;
7584     }
7585 
7586   if (!sym)
7587     {
7588       /* Use upper case to save the actual derived-type symbol.  */
7589       gfc_get_symbol (gfc_get_string ("%c%s",
7590 			(char) TOUPPER ((unsigned char) gensym->name[0]),
7591 			&gensym->name[1]), NULL, &sym);
7592       sym->name = gfc_get_string (gensym->name);
7593       head = gensym->generic;
7594       intr = gfc_get_interface ();
7595       intr->sym = sym;
7596       intr->where = gfc_current_locus;
7597       intr->sym->declared_at = gfc_current_locus;
7598       intr->next = head;
7599       gensym->generic = intr;
7600       gensym->attr.if_source = IFSRC_DECL;
7601     }
7602 
7603   /* The symbol may already have the derived attribute without the
7604      components.  The ways this can happen is via a function
7605      definition, an INTRINSIC statement or a subtype in another
7606      derived type that is a pointer.  The first part of the AND clause
7607      is true if the symbol is not the return value of a function.  */
7608   if (sym->attr.flavor != FL_DERIVED
7609       && gfc_add_flavor (&sym->attr, FL_DERIVED, sym->name, NULL) == FAILURE)
7610     return MATCH_ERROR;
7611 
7612   if (attr.access != ACCESS_UNKNOWN
7613       && gfc_add_access (&sym->attr, attr.access, sym->name, NULL) == FAILURE)
7614     return MATCH_ERROR;
7615   else if (sym->attr.access == ACCESS_UNKNOWN
7616 	   && gensym->attr.access != ACCESS_UNKNOWN
7617 	   && gfc_add_access (&sym->attr, gensym->attr.access, sym->name, NULL)
7618 	      == FAILURE)
7619     return MATCH_ERROR;
7620 
7621   if (sym->attr.access != ACCESS_UNKNOWN
7622       && gensym->attr.access == ACCESS_UNKNOWN)
7623     gensym->attr.access = sym->attr.access;
7624 
7625   /* See if the derived type was labeled as bind(c).  */
7626   if (attr.is_bind_c != 0)
7627     sym->attr.is_bind_c = attr.is_bind_c;
7628 
7629   /* Construct the f2k_derived namespace if it is not yet there.  */
7630   if (!sym->f2k_derived)
7631     sym->f2k_derived = gfc_get_namespace (NULL, 0);
7632 
7633   if (extended && !sym->components)
7634     {
7635       gfc_component *p;
7636       gfc_symtree *st;
7637 
7638       /* Add the extended derived type as the first component.  */
7639       gfc_add_component (sym, parent, &p);
7640       extended->refs++;
7641       gfc_set_sym_referenced (extended);
7642 
7643       p->ts.type = BT_DERIVED;
7644       p->ts.u.derived = extended;
7645       p->initializer = gfc_default_initializer (&p->ts);
7646 
7647       /* Set extension level.  */
7648       if (extended->attr.extension == 255)
7649 	{
7650 	  /* Since the extension field is 8 bit wide, we can only have
7651 	     up to 255 extension levels.  */
7652 	  gfc_error ("Maximum extension level reached with type '%s' at %L",
7653 		     extended->name, &extended->declared_at);
7654 	  return MATCH_ERROR;
7655 	}
7656       sym->attr.extension = extended->attr.extension + 1;
7657 
7658       /* Provide the links between the extended type and its extension.  */
7659       if (!extended->f2k_derived)
7660 	extended->f2k_derived = gfc_get_namespace (NULL, 0);
7661       st = gfc_new_symtree (&extended->f2k_derived->sym_root, sym->name);
7662       st->n.sym = sym;
7663     }
7664 
7665   if (!sym->hash_value)
7666     /* Set the hash for the compound name for this type.  */
7667     sym->hash_value = gfc_hash_value (sym);
7668 
7669   /* Take over the ABSTRACT attribute.  */
7670   sym->attr.abstract = attr.abstract;
7671 
7672   gfc_new_block = sym;
7673 
7674   return MATCH_YES;
7675 }
7676 
7677 
7678 /* Cray Pointees can be declared as:
7679       pointer (ipt, a (n,m,...,*))  */
7680 
7681 match
gfc_mod_pointee_as(gfc_array_spec * as)7682 gfc_mod_pointee_as (gfc_array_spec *as)
7683 {
7684   as->cray_pointee = true; /* This will be useful to know later.  */
7685   if (as->type == AS_ASSUMED_SIZE)
7686     as->cp_was_assumed = true;
7687   else if (as->type == AS_ASSUMED_SHAPE)
7688     {
7689       gfc_error ("Cray Pointee at %C cannot be assumed shape array");
7690       return MATCH_ERROR;
7691     }
7692   return MATCH_YES;
7693 }
7694 
7695 
7696 /* Match the enum definition statement, here we are trying to match
7697    the first line of enum definition statement.
7698    Returns MATCH_YES if match is found.  */
7699 
7700 match
gfc_match_enum(void)7701 gfc_match_enum (void)
7702 {
7703   match m;
7704 
7705   m = gfc_match_eos ();
7706   if (m != MATCH_YES)
7707     return m;
7708 
7709   if (gfc_notify_std (GFC_STD_F2003, "ENUM and ENUMERATOR at %C")
7710       == FAILURE)
7711     return MATCH_ERROR;
7712 
7713   return MATCH_YES;
7714 }
7715 
7716 
7717 /* Returns an initializer whose value is one higher than the value of the
7718    LAST_INITIALIZER argument.  If the argument is NULL, the
7719    initializers value will be set to zero.  The initializer's kind
7720    will be set to gfc_c_int_kind.
7721 
7722    If -fshort-enums is given, the appropriate kind will be selected
7723    later after all enumerators have been parsed.  A warning is issued
7724    here if an initializer exceeds gfc_c_int_kind.  */
7725 
7726 static gfc_expr *
enum_initializer(gfc_expr * last_initializer,locus where)7727 enum_initializer (gfc_expr *last_initializer, locus where)
7728 {
7729   gfc_expr *result;
7730   result = gfc_get_constant_expr (BT_INTEGER, gfc_c_int_kind, &where);
7731 
7732   mpz_init (result->value.integer);
7733 
7734   if (last_initializer != NULL)
7735     {
7736       mpz_add_ui (result->value.integer, last_initializer->value.integer, 1);
7737       result->where = last_initializer->where;
7738 
7739       if (gfc_check_integer_range (result->value.integer,
7740 	     gfc_c_int_kind) != ARITH_OK)
7741 	{
7742 	  gfc_error ("Enumerator exceeds the C integer type at %C");
7743 	  return NULL;
7744 	}
7745     }
7746   else
7747     {
7748       /* Control comes here, if it's the very first enumerator and no
7749 	 initializer has been given.  It will be initialized to zero.  */
7750       mpz_set_si (result->value.integer, 0);
7751     }
7752 
7753   return result;
7754 }
7755 
7756 
7757 /* Match a variable name with an optional initializer.  When this
7758    subroutine is called, a variable is expected to be parsed next.
7759    Depending on what is happening at the moment, updates either the
7760    symbol table or the current interface.  */
7761 
7762 static match
enumerator_decl(void)7763 enumerator_decl (void)
7764 {
7765   char name[GFC_MAX_SYMBOL_LEN + 1];
7766   gfc_expr *initializer;
7767   gfc_array_spec *as = NULL;
7768   gfc_symbol *sym;
7769   locus var_locus;
7770   match m;
7771   gfc_try t;
7772   locus old_locus;
7773 
7774   initializer = NULL;
7775   old_locus = gfc_current_locus;
7776 
7777   /* When we get here, we've just matched a list of attributes and
7778      maybe a type and a double colon.  The next thing we expect to see
7779      is the name of the symbol.  */
7780   m = gfc_match_name (name);
7781   if (m != MATCH_YES)
7782     goto cleanup;
7783 
7784   var_locus = gfc_current_locus;
7785 
7786   /* OK, we've successfully matched the declaration.  Now put the
7787      symbol in the current namespace. If we fail to create the symbol,
7788      bail out.  */
7789   if (build_sym (name, NULL, false, &as, &var_locus) == FAILURE)
7790     {
7791       m = MATCH_ERROR;
7792       goto cleanup;
7793     }
7794 
7795   /* The double colon must be present in order to have initializers.
7796      Otherwise the statement is ambiguous with an assignment statement.  */
7797   if (colon_seen)
7798     {
7799       if (gfc_match_char ('=') == MATCH_YES)
7800 	{
7801 	  m = gfc_match_init_expr (&initializer);
7802 	  if (m == MATCH_NO)
7803 	    {
7804 	      gfc_error ("Expected an initialization expression at %C");
7805 	      m = MATCH_ERROR;
7806 	    }
7807 
7808 	  if (m != MATCH_YES)
7809 	    goto cleanup;
7810 	}
7811     }
7812 
7813   /* If we do not have an initializer, the initialization value of the
7814      previous enumerator (stored in last_initializer) is incremented
7815      by 1 and is used to initialize the current enumerator.  */
7816   if (initializer == NULL)
7817     initializer = enum_initializer (last_initializer, old_locus);
7818 
7819   if (initializer == NULL || initializer->ts.type != BT_INTEGER)
7820     {
7821       gfc_error ("ENUMERATOR %L not initialized with integer expression",
7822 		 &var_locus);
7823       m = MATCH_ERROR;
7824       goto cleanup;
7825     }
7826 
7827   /* Store this current initializer, for the next enumerator variable
7828      to be parsed.  add_init_expr_to_sym() zeros initializer, so we
7829      use last_initializer below.  */
7830   last_initializer = initializer;
7831   t = add_init_expr_to_sym (name, &initializer, &var_locus);
7832 
7833   /* Maintain enumerator history.  */
7834   gfc_find_symbol (name, NULL, 0, &sym);
7835   create_enum_history (sym, last_initializer);
7836 
7837   return (t == SUCCESS) ? MATCH_YES : MATCH_ERROR;
7838 
7839 cleanup:
7840   /* Free stuff up and return.  */
7841   gfc_free_expr (initializer);
7842 
7843   return m;
7844 }
7845 
7846 
7847 /* Match the enumerator definition statement.  */
7848 
7849 match
gfc_match_enumerator_def(void)7850 gfc_match_enumerator_def (void)
7851 {
7852   match m;
7853   gfc_try t;
7854 
7855   gfc_clear_ts (&current_ts);
7856 
7857   m = gfc_match (" enumerator");
7858   if (m != MATCH_YES)
7859     return m;
7860 
7861   m = gfc_match (" :: ");
7862   if (m == MATCH_ERROR)
7863     return m;
7864 
7865   colon_seen = (m == MATCH_YES);
7866 
7867   if (gfc_current_state () != COMP_ENUM)
7868     {
7869       gfc_error ("ENUM definition statement expected before %C");
7870       gfc_free_enum_history ();
7871       return MATCH_ERROR;
7872     }
7873 
7874   (&current_ts)->type = BT_INTEGER;
7875   (&current_ts)->kind = gfc_c_int_kind;
7876 
7877   gfc_clear_attr (&current_attr);
7878   t = gfc_add_flavor (&current_attr, FL_PARAMETER, NULL, NULL);
7879   if (t == FAILURE)
7880     {
7881       m = MATCH_ERROR;
7882       goto cleanup;
7883     }
7884 
7885   for (;;)
7886     {
7887       m = enumerator_decl ();
7888       if (m == MATCH_ERROR)
7889 	{
7890 	  gfc_free_enum_history ();
7891 	  goto cleanup;
7892 	}
7893       if (m == MATCH_NO)
7894 	break;
7895 
7896       if (gfc_match_eos () == MATCH_YES)
7897 	goto cleanup;
7898       if (gfc_match_char (',') != MATCH_YES)
7899 	break;
7900     }
7901 
7902   if (gfc_current_state () == COMP_ENUM)
7903     {
7904       gfc_free_enum_history ();
7905       gfc_error ("Syntax error in ENUMERATOR definition at %C");
7906       m = MATCH_ERROR;
7907     }
7908 
7909 cleanup:
7910   gfc_free_array_spec (current_as);
7911   current_as = NULL;
7912   return m;
7913 
7914 }
7915 
7916 
7917 /* Match binding attributes.  */
7918 
7919 static match
match_binding_attributes(gfc_typebound_proc * ba,bool generic,bool ppc)7920 match_binding_attributes (gfc_typebound_proc* ba, bool generic, bool ppc)
7921 {
7922   bool found_passing = false;
7923   bool seen_ptr = false;
7924   match m = MATCH_YES;
7925 
7926   /* Initialize to defaults.  Do so even before the MATCH_NO check so that in
7927      this case the defaults are in there.  */
7928   ba->access = ACCESS_UNKNOWN;
7929   ba->pass_arg = NULL;
7930   ba->pass_arg_num = 0;
7931   ba->nopass = 0;
7932   ba->non_overridable = 0;
7933   ba->deferred = 0;
7934   ba->ppc = ppc;
7935 
7936   /* If we find a comma, we believe there are binding attributes.  */
7937   m = gfc_match_char (',');
7938   if (m == MATCH_NO)
7939     goto done;
7940 
7941   do
7942     {
7943       /* Access specifier.  */
7944 
7945       m = gfc_match (" public");
7946       if (m == MATCH_ERROR)
7947 	goto error;
7948       if (m == MATCH_YES)
7949 	{
7950 	  if (ba->access != ACCESS_UNKNOWN)
7951 	    {
7952 	      gfc_error ("Duplicate access-specifier at %C");
7953 	      goto error;
7954 	    }
7955 
7956 	  ba->access = ACCESS_PUBLIC;
7957 	  continue;
7958 	}
7959 
7960       m = gfc_match (" private");
7961       if (m == MATCH_ERROR)
7962 	goto error;
7963       if (m == MATCH_YES)
7964 	{
7965 	  if (ba->access != ACCESS_UNKNOWN)
7966 	    {
7967 	      gfc_error ("Duplicate access-specifier at %C");
7968 	      goto error;
7969 	    }
7970 
7971 	  ba->access = ACCESS_PRIVATE;
7972 	  continue;
7973 	}
7974 
7975       /* If inside GENERIC, the following is not allowed.  */
7976       if (!generic)
7977 	{
7978 
7979 	  /* NOPASS flag.  */
7980 	  m = gfc_match (" nopass");
7981 	  if (m == MATCH_ERROR)
7982 	    goto error;
7983 	  if (m == MATCH_YES)
7984 	    {
7985 	      if (found_passing)
7986 		{
7987 		  gfc_error ("Binding attributes already specify passing,"
7988 			     " illegal NOPASS at %C");
7989 		  goto error;
7990 		}
7991 
7992 	      found_passing = true;
7993 	      ba->nopass = 1;
7994 	      continue;
7995 	    }
7996 
7997 	  /* PASS possibly including argument.  */
7998 	  m = gfc_match (" pass");
7999 	  if (m == MATCH_ERROR)
8000 	    goto error;
8001 	  if (m == MATCH_YES)
8002 	    {
8003 	      char arg[GFC_MAX_SYMBOL_LEN + 1];
8004 
8005 	      if (found_passing)
8006 		{
8007 		  gfc_error ("Binding attributes already specify passing,"
8008 			     " illegal PASS at %C");
8009 		  goto error;
8010 		}
8011 
8012 	      m = gfc_match (" ( %n )", arg);
8013 	      if (m == MATCH_ERROR)
8014 		goto error;
8015 	      if (m == MATCH_YES)
8016 		ba->pass_arg = gfc_get_string (arg);
8017 	      gcc_assert ((m == MATCH_YES) == (ba->pass_arg != NULL));
8018 
8019 	      found_passing = true;
8020 	      ba->nopass = 0;
8021 	      continue;
8022 	    }
8023 
8024 	  if (ppc)
8025 	    {
8026 	      /* POINTER flag.  */
8027 	      m = gfc_match (" pointer");
8028 	      if (m == MATCH_ERROR)
8029 		goto error;
8030 	      if (m == MATCH_YES)
8031 		{
8032 		  if (seen_ptr)
8033 		    {
8034 		      gfc_error ("Duplicate POINTER attribute at %C");
8035 		      goto error;
8036 		    }
8037 
8038 		  seen_ptr = true;
8039         	  continue;
8040 		}
8041 	    }
8042 	  else
8043 	    {
8044 	      /* NON_OVERRIDABLE flag.  */
8045 	      m = gfc_match (" non_overridable");
8046 	      if (m == MATCH_ERROR)
8047 		goto error;
8048 	      if (m == MATCH_YES)
8049 		{
8050 		  if (ba->non_overridable)
8051 		    {
8052 		      gfc_error ("Duplicate NON_OVERRIDABLE at %C");
8053 		      goto error;
8054 		    }
8055 
8056 		  ba->non_overridable = 1;
8057 		  continue;
8058 		}
8059 
8060 	      /* DEFERRED flag.  */
8061 	      m = gfc_match (" deferred");
8062 	      if (m == MATCH_ERROR)
8063 		goto error;
8064 	      if (m == MATCH_YES)
8065 		{
8066 		  if (ba->deferred)
8067 		    {
8068 		      gfc_error ("Duplicate DEFERRED at %C");
8069 		      goto error;
8070 		    }
8071 
8072 		  ba->deferred = 1;
8073 		  continue;
8074 		}
8075 	    }
8076 
8077 	}
8078 
8079       /* Nothing matching found.  */
8080       if (generic)
8081 	gfc_error ("Expected access-specifier at %C");
8082       else
8083 	gfc_error ("Expected binding attribute at %C");
8084       goto error;
8085     }
8086   while (gfc_match_char (',') == MATCH_YES);
8087 
8088   /* NON_OVERRIDABLE and DEFERRED exclude themselves.  */
8089   if (ba->non_overridable && ba->deferred)
8090     {
8091       gfc_error ("NON_OVERRIDABLE and DEFERRED can't both appear at %C");
8092       goto error;
8093     }
8094 
8095   m = MATCH_YES;
8096 
8097 done:
8098   if (ba->access == ACCESS_UNKNOWN)
8099     ba->access = gfc_typebound_default_access;
8100 
8101   if (ppc && !seen_ptr)
8102     {
8103       gfc_error ("POINTER attribute is required for procedure pointer component"
8104                  " at %C");
8105       goto error;
8106     }
8107 
8108   return m;
8109 
8110 error:
8111   return MATCH_ERROR;
8112 }
8113 
8114 
8115 /* Match a PROCEDURE specific binding inside a derived type.  */
8116 
8117 static match
match_procedure_in_type(void)8118 match_procedure_in_type (void)
8119 {
8120   char name[GFC_MAX_SYMBOL_LEN + 1];
8121   char target_buf[GFC_MAX_SYMBOL_LEN + 1];
8122   char* target = NULL, *ifc = NULL;
8123   gfc_typebound_proc tb;
8124   bool seen_colons;
8125   bool seen_attrs;
8126   match m;
8127   gfc_symtree* stree;
8128   gfc_namespace* ns;
8129   gfc_symbol* block;
8130   int num;
8131 
8132   /* Check current state.  */
8133   gcc_assert (gfc_state_stack->state == COMP_DERIVED_CONTAINS);
8134   block = gfc_state_stack->previous->sym;
8135   gcc_assert (block);
8136 
8137   /* Try to match PROCEDURE(interface).  */
8138   if (gfc_match (" (") == MATCH_YES)
8139     {
8140       m = gfc_match_name (target_buf);
8141       if (m == MATCH_ERROR)
8142 	return m;
8143       if (m != MATCH_YES)
8144 	{
8145 	  gfc_error ("Interface-name expected after '(' at %C");
8146 	  return MATCH_ERROR;
8147 	}
8148 
8149       if (gfc_match (" )") != MATCH_YES)
8150 	{
8151 	  gfc_error ("')' expected at %C");
8152 	  return MATCH_ERROR;
8153 	}
8154 
8155       ifc = target_buf;
8156     }
8157 
8158   /* Construct the data structure.  */
8159   memset (&tb, 0, sizeof (tb));
8160   tb.where = gfc_current_locus;
8161 
8162   /* Match binding attributes.  */
8163   m = match_binding_attributes (&tb, false, false);
8164   if (m == MATCH_ERROR)
8165     return m;
8166   seen_attrs = (m == MATCH_YES);
8167 
8168   /* Check that attribute DEFERRED is given if an interface is specified.  */
8169   if (tb.deferred && !ifc)
8170     {
8171       gfc_error ("Interface must be specified for DEFERRED binding at %C");
8172       return MATCH_ERROR;
8173     }
8174   if (ifc && !tb.deferred)
8175     {
8176       gfc_error ("PROCEDURE(interface) at %C should be declared DEFERRED");
8177       return MATCH_ERROR;
8178     }
8179 
8180   /* Match the colons.  */
8181   m = gfc_match (" ::");
8182   if (m == MATCH_ERROR)
8183     return m;
8184   seen_colons = (m == MATCH_YES);
8185   if (seen_attrs && !seen_colons)
8186     {
8187       gfc_error ("Expected '::' after binding-attributes at %C");
8188       return MATCH_ERROR;
8189     }
8190 
8191   /* Match the binding names.  */
8192   for(num=1;;num++)
8193     {
8194       m = gfc_match_name (name);
8195       if (m == MATCH_ERROR)
8196 	return m;
8197       if (m == MATCH_NO)
8198 	{
8199 	  gfc_error ("Expected binding name at %C");
8200 	  return MATCH_ERROR;
8201 	}
8202 
8203       if (num>1 && gfc_notify_std (GFC_STD_F2008, "PROCEDURE list"
8204 				   " at %C") == FAILURE)
8205 	return MATCH_ERROR;
8206 
8207       /* Try to match the '=> target', if it's there.  */
8208       target = ifc;
8209       m = gfc_match (" =>");
8210       if (m == MATCH_ERROR)
8211 	return m;
8212       if (m == MATCH_YES)
8213 	{
8214 	  if (tb.deferred)
8215 	    {
8216 	      gfc_error ("'=> target' is invalid for DEFERRED binding at %C");
8217 	      return MATCH_ERROR;
8218 	    }
8219 
8220 	  if (!seen_colons)
8221 	    {
8222 	      gfc_error ("'::' needed in PROCEDURE binding with explicit target"
8223 			 " at %C");
8224 	      return MATCH_ERROR;
8225 	    }
8226 
8227 	  m = gfc_match_name (target_buf);
8228 	  if (m == MATCH_ERROR)
8229 	    return m;
8230 	  if (m == MATCH_NO)
8231 	    {
8232 	      gfc_error ("Expected binding target after '=>' at %C");
8233 	      return MATCH_ERROR;
8234 	    }
8235 	  target = target_buf;
8236 	}
8237 
8238       /* If no target was found, it has the same name as the binding.  */
8239       if (!target)
8240 	target = name;
8241 
8242       /* Get the namespace to insert the symbols into.  */
8243       ns = block->f2k_derived;
8244       gcc_assert (ns);
8245 
8246       /* If the binding is DEFERRED, check that the containing type is ABSTRACT.  */
8247       if (tb.deferred && !block->attr.abstract)
8248 	{
8249 	  gfc_error ("Type '%s' containing DEFERRED binding at %C "
8250 		     "is not ABSTRACT", block->name);
8251 	  return MATCH_ERROR;
8252 	}
8253 
8254       /* See if we already have a binding with this name in the symtree which
8255 	 would be an error.  If a GENERIC already targetted this binding, it may
8256 	 be already there but then typebound is still NULL.  */
8257       stree = gfc_find_symtree (ns->tb_sym_root, name);
8258       if (stree && stree->n.tb)
8259 	{
8260 	  gfc_error ("There is already a procedure with binding name '%s' for "
8261 		     "the derived type '%s' at %C", name, block->name);
8262 	  return MATCH_ERROR;
8263 	}
8264 
8265       /* Insert it and set attributes.  */
8266 
8267       if (!stree)
8268 	{
8269 	  stree = gfc_new_symtree (&ns->tb_sym_root, name);
8270 	  gcc_assert (stree);
8271 	}
8272       stree->n.tb = gfc_get_typebound_proc (&tb);
8273 
8274       if (gfc_get_sym_tree (target, gfc_current_ns, &stree->n.tb->u.specific,
8275 			    false))
8276 	return MATCH_ERROR;
8277       gfc_set_sym_referenced (stree->n.tb->u.specific->n.sym);
8278 
8279       if (gfc_match_eos () == MATCH_YES)
8280 	return MATCH_YES;
8281       if (gfc_match_char (',') != MATCH_YES)
8282 	goto syntax;
8283     }
8284 
8285 syntax:
8286   gfc_error ("Syntax error in PROCEDURE statement at %C");
8287   return MATCH_ERROR;
8288 }
8289 
8290 
8291 /* Match a GENERIC procedure binding inside a derived type.  */
8292 
8293 match
gfc_match_generic(void)8294 gfc_match_generic (void)
8295 {
8296   char name[GFC_MAX_SYMBOL_LEN + 1];
8297   char bind_name[GFC_MAX_SYMBOL_LEN + 16]; /* Allow space for OPERATOR(...).  */
8298   gfc_symbol* block;
8299   gfc_typebound_proc tbattr; /* Used for match_binding_attributes.  */
8300   gfc_typebound_proc* tb;
8301   gfc_namespace* ns;
8302   interface_type op_type;
8303   gfc_intrinsic_op op;
8304   match m;
8305 
8306   /* Check current state.  */
8307   if (gfc_current_state () == COMP_DERIVED)
8308     {
8309       gfc_error ("GENERIC at %C must be inside a derived-type CONTAINS");
8310       return MATCH_ERROR;
8311     }
8312   if (gfc_current_state () != COMP_DERIVED_CONTAINS)
8313     return MATCH_NO;
8314   block = gfc_state_stack->previous->sym;
8315   ns = block->f2k_derived;
8316   gcc_assert (block && ns);
8317 
8318   memset (&tbattr, 0, sizeof (tbattr));
8319   tbattr.where = gfc_current_locus;
8320 
8321   /* See if we get an access-specifier.  */
8322   m = match_binding_attributes (&tbattr, true, false);
8323   if (m == MATCH_ERROR)
8324     goto error;
8325 
8326   /* Now the colons, those are required.  */
8327   if (gfc_match (" ::") != MATCH_YES)
8328     {
8329       gfc_error ("Expected '::' at %C");
8330       goto error;
8331     }
8332 
8333   /* Match the binding name; depending on type (operator / generic) format
8334      it for future error messages into bind_name.  */
8335 
8336   m = gfc_match_generic_spec (&op_type, name, &op);
8337   if (m == MATCH_ERROR)
8338     return MATCH_ERROR;
8339   if (m == MATCH_NO)
8340     {
8341       gfc_error ("Expected generic name or operator descriptor at %C");
8342       goto error;
8343     }
8344 
8345   switch (op_type)
8346     {
8347     case INTERFACE_GENERIC:
8348       snprintf (bind_name, sizeof (bind_name), "%s", name);
8349       break;
8350 
8351     case INTERFACE_USER_OP:
8352       snprintf (bind_name, sizeof (bind_name), "OPERATOR(.%s.)", name);
8353       break;
8354 
8355     case INTERFACE_INTRINSIC_OP:
8356       snprintf (bind_name, sizeof (bind_name), "OPERATOR(%s)",
8357 		gfc_op2string (op));
8358       break;
8359 
8360     default:
8361       gcc_unreachable ();
8362     }
8363 
8364   /* Match the required =>.  */
8365   if (gfc_match (" =>") != MATCH_YES)
8366     {
8367       gfc_error ("Expected '=>' at %C");
8368       goto error;
8369     }
8370 
8371   /* Try to find existing GENERIC binding with this name / for this operator;
8372      if there is something, check that it is another GENERIC and then extend
8373      it rather than building a new node.  Otherwise, create it and put it
8374      at the right position.  */
8375 
8376   switch (op_type)
8377     {
8378     case INTERFACE_USER_OP:
8379     case INTERFACE_GENERIC:
8380       {
8381 	const bool is_op = (op_type == INTERFACE_USER_OP);
8382 	gfc_symtree* st;
8383 
8384 	st = gfc_find_symtree (is_op ? ns->tb_uop_root : ns->tb_sym_root, name);
8385 	if (st)
8386 	  {
8387 	    tb = st->n.tb;
8388 	    gcc_assert (tb);
8389 	  }
8390 	else
8391 	  tb = NULL;
8392 
8393 	break;
8394       }
8395 
8396     case INTERFACE_INTRINSIC_OP:
8397       tb = ns->tb_op[op];
8398       break;
8399 
8400     default:
8401       gcc_unreachable ();
8402     }
8403 
8404   if (tb)
8405     {
8406       if (!tb->is_generic)
8407 	{
8408 	  gcc_assert (op_type == INTERFACE_GENERIC);
8409 	  gfc_error ("There's already a non-generic procedure with binding name"
8410 		     " '%s' for the derived type '%s' at %C",
8411 		     bind_name, block->name);
8412 	  goto error;
8413 	}
8414 
8415       if (tb->access != tbattr.access)
8416 	{
8417 	  gfc_error ("Binding at %C must have the same access as already"
8418 		     " defined binding '%s'", bind_name);
8419 	  goto error;
8420 	}
8421     }
8422   else
8423     {
8424       tb = gfc_get_typebound_proc (NULL);
8425       tb->where = gfc_current_locus;
8426       tb->access = tbattr.access;
8427       tb->is_generic = 1;
8428       tb->u.generic = NULL;
8429 
8430       switch (op_type)
8431 	{
8432 	case INTERFACE_GENERIC:
8433 	case INTERFACE_USER_OP:
8434 	  {
8435 	    const bool is_op = (op_type == INTERFACE_USER_OP);
8436 	    gfc_symtree* st;
8437 
8438 	    st = gfc_new_symtree (is_op ? &ns->tb_uop_root : &ns->tb_sym_root,
8439 				  name);
8440 	    gcc_assert (st);
8441 	    st->n.tb = tb;
8442 
8443 	    break;
8444 	  }
8445 
8446 	case INTERFACE_INTRINSIC_OP:
8447 	  ns->tb_op[op] = tb;
8448 	  break;
8449 
8450 	default:
8451 	  gcc_unreachable ();
8452 	}
8453     }
8454 
8455   /* Now, match all following names as specific targets.  */
8456   do
8457     {
8458       gfc_symtree* target_st;
8459       gfc_tbp_generic* target;
8460 
8461       m = gfc_match_name (name);
8462       if (m == MATCH_ERROR)
8463 	goto error;
8464       if (m == MATCH_NO)
8465 	{
8466 	  gfc_error ("Expected specific binding name at %C");
8467 	  goto error;
8468 	}
8469 
8470       target_st = gfc_get_tbp_symtree (&ns->tb_sym_root, name);
8471 
8472       /* See if this is a duplicate specification.  */
8473       for (target = tb->u.generic; target; target = target->next)
8474 	if (target_st == target->specific_st)
8475 	  {
8476 	    gfc_error ("'%s' already defined as specific binding for the"
8477 		       " generic '%s' at %C", name, bind_name);
8478 	    goto error;
8479 	  }
8480 
8481       target = gfc_get_tbp_generic ();
8482       target->specific_st = target_st;
8483       target->specific = NULL;
8484       target->next = tb->u.generic;
8485       target->is_operator = ((op_type == INTERFACE_USER_OP)
8486 			     || (op_type == INTERFACE_INTRINSIC_OP));
8487       tb->u.generic = target;
8488     }
8489   while (gfc_match (" ,") == MATCH_YES);
8490 
8491   /* Here should be the end.  */
8492   if (gfc_match_eos () != MATCH_YES)
8493     {
8494       gfc_error ("Junk after GENERIC binding at %C");
8495       goto error;
8496     }
8497 
8498   return MATCH_YES;
8499 
8500 error:
8501   return MATCH_ERROR;
8502 }
8503 
8504 
8505 /* Match a FINAL declaration inside a derived type.  */
8506 
8507 match
gfc_match_final_decl(void)8508 gfc_match_final_decl (void)
8509 {
8510   char name[GFC_MAX_SYMBOL_LEN + 1];
8511   gfc_symbol* sym;
8512   match m;
8513   gfc_namespace* module_ns;
8514   bool first, last;
8515   gfc_symbol* block;
8516 
8517   if (gfc_current_form == FORM_FREE)
8518     {
8519       char c = gfc_peek_ascii_char ();
8520       if (!gfc_is_whitespace (c) && c != ':')
8521 	return MATCH_NO;
8522     }
8523 
8524   if (gfc_state_stack->state != COMP_DERIVED_CONTAINS)
8525     {
8526       if (gfc_current_form == FORM_FIXED)
8527 	return MATCH_NO;
8528 
8529       gfc_error ("FINAL declaration at %C must be inside a derived type "
8530 		 "CONTAINS section");
8531       return MATCH_ERROR;
8532     }
8533 
8534   block = gfc_state_stack->previous->sym;
8535   gcc_assert (block);
8536 
8537   if (!gfc_state_stack->previous || !gfc_state_stack->previous->previous
8538       || gfc_state_stack->previous->previous->state != COMP_MODULE)
8539     {
8540       gfc_error ("Derived type declaration with FINAL at %C must be in the"
8541 		 " specification part of a MODULE");
8542       return MATCH_ERROR;
8543     }
8544 
8545   module_ns = gfc_current_ns;
8546   gcc_assert (module_ns);
8547   gcc_assert (module_ns->proc_name->attr.flavor == FL_MODULE);
8548 
8549   /* Match optional ::, don't care about MATCH_YES or MATCH_NO.  */
8550   if (gfc_match (" ::") == MATCH_ERROR)
8551     return MATCH_ERROR;
8552 
8553   /* Match the sequence of procedure names.  */
8554   first = true;
8555   last = false;
8556   do
8557     {
8558       gfc_finalizer* f;
8559 
8560       if (first && gfc_match_eos () == MATCH_YES)
8561 	{
8562 	  gfc_error ("Empty FINAL at %C");
8563 	  return MATCH_ERROR;
8564 	}
8565 
8566       m = gfc_match_name (name);
8567       if (m == MATCH_NO)
8568 	{
8569 	  gfc_error ("Expected module procedure name at %C");
8570 	  return MATCH_ERROR;
8571 	}
8572       else if (m != MATCH_YES)
8573 	return MATCH_ERROR;
8574 
8575       if (gfc_match_eos () == MATCH_YES)
8576 	last = true;
8577       if (!last && gfc_match_char (',') != MATCH_YES)
8578 	{
8579 	  gfc_error ("Expected ',' at %C");
8580 	  return MATCH_ERROR;
8581 	}
8582 
8583       if (gfc_get_symbol (name, module_ns, &sym))
8584 	{
8585 	  gfc_error ("Unknown procedure name \"%s\" at %C", name);
8586 	  return MATCH_ERROR;
8587 	}
8588 
8589       /* Mark the symbol as module procedure.  */
8590       if (sym->attr.proc != PROC_MODULE
8591 	  && gfc_add_procedure (&sym->attr, PROC_MODULE,
8592 				sym->name, NULL) == FAILURE)
8593 	return MATCH_ERROR;
8594 
8595       /* Check if we already have this symbol in the list, this is an error.  */
8596       for (f = block->f2k_derived->finalizers; f; f = f->next)
8597 	if (f->proc_sym == sym)
8598 	  {
8599 	    gfc_error ("'%s' at %C is already defined as FINAL procedure!",
8600 		       name);
8601 	    return MATCH_ERROR;
8602 	  }
8603 
8604       /* Add this symbol to the list of finalizers.  */
8605       gcc_assert (block->f2k_derived);
8606       ++sym->refs;
8607       f = XCNEW (gfc_finalizer);
8608       f->proc_sym = sym;
8609       f->proc_tree = NULL;
8610       f->where = gfc_current_locus;
8611       f->next = block->f2k_derived->finalizers;
8612       block->f2k_derived->finalizers = f;
8613 
8614       first = false;
8615     }
8616   while (!last);
8617 
8618   return MATCH_YES;
8619 }
8620 
8621 
8622 const ext_attr_t ext_attr_list[] = {
8623   { "dllimport", EXT_ATTR_DLLIMPORT, "dllimport" },
8624   { "dllexport", EXT_ATTR_DLLEXPORT, "dllexport" },
8625   { "cdecl",     EXT_ATTR_CDECL,     "cdecl"     },
8626   { "stdcall",   EXT_ATTR_STDCALL,   "stdcall"   },
8627   { "fastcall",  EXT_ATTR_FASTCALL,  "fastcall"  },
8628   { NULL,        EXT_ATTR_LAST,      NULL        }
8629 };
8630 
8631 /* Match a !GCC$ ATTRIBUTES statement of the form:
8632       !GCC$ ATTRIBUTES attribute-list :: var-name [, var-name] ...
8633    When we come here, we have already matched the !GCC$ ATTRIBUTES string.
8634 
8635    TODO: We should support all GCC attributes using the same syntax for
8636    the attribute list, i.e. the list in C
8637       __attributes(( attribute-list ))
8638    matches then
8639       !GCC$ ATTRIBUTES attribute-list ::
8640    Cf. c-parser.c's c_parser_attributes; the data can then directly be
8641    saved into a TREE.
8642 
8643    As there is absolutely no risk of confusion, we should never return
8644    MATCH_NO.  */
8645 match
gfc_match_gcc_attributes(void)8646 gfc_match_gcc_attributes (void)
8647 {
8648   symbol_attribute attr;
8649   char name[GFC_MAX_SYMBOL_LEN + 1];
8650   unsigned id;
8651   gfc_symbol *sym;
8652   match m;
8653 
8654   gfc_clear_attr (&attr);
8655   for(;;)
8656     {
8657       char ch;
8658 
8659       if (gfc_match_name (name) != MATCH_YES)
8660 	return MATCH_ERROR;
8661 
8662       for (id = 0; id < EXT_ATTR_LAST; id++)
8663 	if (strcmp (name, ext_attr_list[id].name) == 0)
8664 	  break;
8665 
8666       if (id == EXT_ATTR_LAST)
8667 	{
8668 	  gfc_error ("Unknown attribute in !GCC$ ATTRIBUTES statement at %C");
8669 	  return MATCH_ERROR;
8670 	}
8671 
8672       if (gfc_add_ext_attribute (&attr, (ext_attr_id_t) id, &gfc_current_locus)
8673 	  == FAILURE)
8674 	return MATCH_ERROR;
8675 
8676       gfc_gobble_whitespace ();
8677       ch = gfc_next_ascii_char ();
8678       if (ch == ':')
8679         {
8680           /* This is the successful exit condition for the loop.  */
8681           if (gfc_next_ascii_char () == ':')
8682             break;
8683         }
8684 
8685       if (ch == ',')
8686 	continue;
8687 
8688       goto syntax;
8689     }
8690 
8691   if (gfc_match_eos () == MATCH_YES)
8692     goto syntax;
8693 
8694   for(;;)
8695     {
8696       m = gfc_match_name (name);
8697       if (m != MATCH_YES)
8698 	return m;
8699 
8700       if (find_special (name, &sym, true))
8701 	return MATCH_ERROR;
8702 
8703       sym->attr.ext_attr |= attr.ext_attr;
8704 
8705       if (gfc_match_eos () == MATCH_YES)
8706 	break;
8707 
8708       if (gfc_match_char (',') != MATCH_YES)
8709 	goto syntax;
8710     }
8711 
8712   return MATCH_YES;
8713 
8714 syntax:
8715   gfc_error ("Syntax error in !GCC$ ATTRIBUTES statement at %C");
8716   return MATCH_ERROR;
8717 }
8718