OSDN Git Service

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