OSDN Git Service

c5273075dac2230e60e0f2a2a54a1e301c21847f
[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
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_NONE,
2879     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
2943             case 'b':
2944               /* Try and match the bind(c).  */
2945               m = gfc_match_bind_c (NULL, true);
2946               if (m == MATCH_YES)
2947                 d = DECL_IS_BIND_C;
2948               else if (m == MATCH_ERROR)
2949                 goto cleanup;
2950               break;
2951
2952             case 'c':
2953               if (match_string_p ("codimension"))
2954                 d = DECL_CODIMENSION;
2955               break;
2956
2957             case 'd':
2958               if (match_string_p ("dimension"))
2959                 d = DECL_DIMENSION;
2960               break;
2961
2962             case 'e':
2963               if (match_string_p ("external"))
2964                 d = DECL_EXTERNAL;
2965               break;
2966
2967             case 'i':
2968               if (match_string_p ("int"))
2969                 {
2970                   ch = gfc_next_ascii_char ();
2971                   if (ch == 'e')
2972                     {
2973                       if (match_string_p ("nt"))
2974                         {
2975                           /* Matched "intent".  */
2976                           /* TODO: Call match_intent_spec from here.  */
2977                           if (gfc_match (" ( in out )") == MATCH_YES)
2978                             d = DECL_INOUT;
2979                           else if (gfc_match (" ( in )") == MATCH_YES)
2980                             d = DECL_IN;
2981                           else if (gfc_match (" ( out )") == MATCH_YES)
2982                             d = DECL_OUT;
2983                         }
2984                     }
2985                   else if (ch == 'r')
2986                     {
2987                       if (match_string_p ("insic"))
2988                         {
2989                           /* Matched "intrinsic".  */
2990                           d = DECL_INTRINSIC;
2991                         }
2992                     }
2993                 }
2994               break;
2995
2996             case 'o':
2997               if (match_string_p ("optional"))
2998                 d = DECL_OPTIONAL;
2999               break;
3000
3001             case 'p':
3002               gfc_next_ascii_char ();
3003               switch (gfc_next_ascii_char ())
3004                 {
3005                 case 'a':
3006                   if (match_string_p ("rameter"))
3007                     {
3008                       /* Matched "parameter".  */
3009                       d = DECL_PARAMETER;
3010                     }
3011                   break;
3012
3013                 case 'o':
3014                   if (match_string_p ("inter"))
3015                     {
3016                       /* Matched "pointer".  */
3017                       d = DECL_POINTER;
3018                     }
3019                   break;
3020
3021                 case 'r':
3022                   ch = gfc_next_ascii_char ();
3023                   if (ch == 'i')
3024                     {
3025                       if (match_string_p ("vate"))
3026                         {
3027                           /* Matched "private".  */
3028                           d = DECL_PRIVATE;
3029                         }
3030                     }
3031                   else if (ch == 'o')
3032                     {
3033                       if (match_string_p ("tected"))
3034                         {
3035                           /* Matched "protected".  */
3036                           d = DECL_PROTECTED;
3037                         }
3038                     }
3039                   break;
3040
3041                 case 'u':
3042                   if (match_string_p ("blic"))
3043                     {
3044                       /* Matched "public".  */
3045                       d = DECL_PUBLIC;
3046                     }
3047                   break;
3048                 }
3049               break;
3050
3051             case 's':
3052               if (match_string_p ("save"))
3053                 d = DECL_SAVE;
3054               break;
3055
3056             case 't':
3057               if (match_string_p ("target"))
3058                 d = DECL_TARGET;
3059               break;
3060
3061             case 'v':
3062               gfc_next_ascii_char ();
3063               ch = gfc_next_ascii_char ();
3064               if (ch == 'a')
3065                 {
3066                   if (match_string_p ("lue"))
3067                     {
3068                       /* Matched "value".  */
3069                       d = DECL_VALUE;
3070                     }
3071                 }
3072               else if (ch == 'o')
3073                 {
3074                   if (match_string_p ("latile"))
3075                     {
3076                       /* Matched "volatile".  */
3077                       d = DECL_VOLATILE;
3078                     }
3079                 }
3080               break;
3081             }
3082         }
3083
3084       /* No double colon and no recognizable decl_type, so assume that
3085          we've been looking at something else the whole time.  */
3086       if (d == DECL_NONE)
3087         {
3088           m = MATCH_NO;
3089           goto cleanup;
3090         }
3091
3092       /* Check to make sure any parens are paired up correctly.  */
3093       if (gfc_match_parens () == MATCH_ERROR)
3094         {
3095           m = MATCH_ERROR;
3096           goto cleanup;
3097         }
3098
3099       seen[d]++;
3100       seen_at[d] = gfc_current_locus;
3101
3102       if (d == DECL_DIMENSION || d == DECL_CODIMENSION)
3103         {
3104           m = gfc_match_array_spec (&current_as, true, false);
3105
3106           if (m == MATCH_NO)
3107             {
3108               if (d == DECL_CODIMENSION)
3109                 gfc_error ("Missing codimension specification at %C");
3110               else
3111                 gfc_error ("Missing dimension specification at %C");
3112               m = MATCH_ERROR;
3113             }
3114
3115           if (m == MATCH_ERROR)
3116             goto cleanup;
3117         }
3118
3119       if (d == DECL_CODIMENSION)
3120         {
3121           m = gfc_match_array_spec (&current_as, false, true);
3122
3123           if (m == MATCH_NO)
3124             {
3125               gfc_error ("Missing codimension specification at %C");
3126               m = MATCH_ERROR;
3127             }
3128
3129           if (m == MATCH_ERROR)
3130             goto cleanup;
3131         }
3132     }
3133
3134   /* Since we've seen a double colon, we have to be looking at an
3135      attr-spec.  This means that we can now issue errors.  */
3136   for (d = GFC_DECL_BEGIN; d != GFC_DECL_END; d++)
3137     if (seen[d] > 1)
3138       {
3139         switch (d)
3140           {
3141           case DECL_ALLOCATABLE:
3142             attr = "ALLOCATABLE";
3143             break;
3144           case DECL_ASYNCHRONOUS:
3145             attr = "ASYNCHRONOUS";
3146             break;
3147           case DECL_CODIMENSION:
3148             attr = "CODIMENSION";
3149             break;
3150           case DECL_DIMENSION:
3151             attr = "DIMENSION";
3152             break;
3153           case DECL_EXTERNAL:
3154             attr = "EXTERNAL";
3155             break;
3156           case DECL_IN:
3157             attr = "INTENT (IN)";
3158             break;
3159           case DECL_OUT:
3160             attr = "INTENT (OUT)";
3161             break;
3162           case DECL_INOUT:
3163             attr = "INTENT (IN OUT)";
3164             break;
3165           case DECL_INTRINSIC:
3166             attr = "INTRINSIC";
3167             break;
3168           case DECL_OPTIONAL:
3169             attr = "OPTIONAL";
3170             break;
3171           case DECL_PARAMETER:
3172             attr = "PARAMETER";
3173             break;
3174           case DECL_POINTER:
3175             attr = "POINTER";
3176             break;
3177           case DECL_PROTECTED:
3178             attr = "PROTECTED";
3179             break;
3180           case DECL_PRIVATE:
3181             attr = "PRIVATE";
3182             break;
3183           case DECL_PUBLIC:
3184             attr = "PUBLIC";
3185             break;
3186           case DECL_SAVE:
3187             attr = "SAVE";
3188             break;
3189           case DECL_TARGET:
3190             attr = "TARGET";
3191             break;
3192           case DECL_IS_BIND_C:
3193             attr = "IS_BIND_C";
3194             break;
3195           case DECL_VALUE:
3196             attr = "VALUE";
3197             break;
3198           case DECL_VOLATILE:
3199             attr = "VOLATILE";
3200             break;
3201           default:
3202             attr = NULL;        /* This shouldn't happen.  */
3203           }
3204
3205         gfc_error ("Duplicate %s attribute at %L", attr, &seen_at[d]);
3206         m = MATCH_ERROR;
3207         goto cleanup;
3208       }
3209
3210   /* Now that we've dealt with duplicate attributes, add the attributes
3211      to the current attribute.  */
3212   for (d = GFC_DECL_BEGIN; d != GFC_DECL_END; d++)
3213     {
3214       if (seen[d] == 0)
3215         continue;
3216
3217       if (gfc_current_state () == COMP_DERIVED
3218           && d != DECL_DIMENSION && d != DECL_CODIMENSION
3219           && d != DECL_POINTER   && d != DECL_PRIVATE
3220           && d != DECL_PUBLIC && d != DECL_NONE)
3221         {
3222           if (d == DECL_ALLOCATABLE)
3223             {
3224               if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ALLOCATABLE "
3225                                   "attribute at %C in a TYPE definition")
3226                   == FAILURE)
3227                 {
3228                   m = MATCH_ERROR;
3229                   goto cleanup;
3230                 }
3231             }
3232           else
3233             {
3234               gfc_error ("Attribute at %L is not allowed in a TYPE definition",
3235                          &seen_at[d]);
3236               m = MATCH_ERROR;
3237               goto cleanup;
3238             }
3239         }
3240
3241       if ((d == DECL_PRIVATE || d == DECL_PUBLIC)
3242           && gfc_current_state () != COMP_MODULE)
3243         {
3244           if (d == DECL_PRIVATE)
3245             attr = "PRIVATE";
3246           else
3247             attr = "PUBLIC";
3248           if (gfc_current_state () == COMP_DERIVED
3249               && gfc_state_stack->previous
3250               && gfc_state_stack->previous->state == COMP_MODULE)
3251             {
3252               if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Attribute %s "
3253                                   "at %L in a TYPE definition", attr,
3254                                   &seen_at[d])
3255                   == FAILURE)
3256                 {
3257                   m = MATCH_ERROR;
3258                   goto cleanup;
3259                 }
3260             }
3261           else
3262             {
3263               gfc_error ("%s attribute at %L is not allowed outside of the "
3264                          "specification part of a module", attr, &seen_at[d]);
3265               m = MATCH_ERROR;
3266               goto cleanup;
3267             }
3268         }
3269
3270       switch (d)
3271         {
3272         case DECL_ALLOCATABLE:
3273           t = gfc_add_allocatable (&current_attr, &seen_at[d]);
3274           break;
3275
3276         case DECL_ASYNCHRONOUS:
3277           if (gfc_notify_std (GFC_STD_F2003,
3278                               "Fortran 2003: ASYNCHRONOUS attribute at %C")
3279               == FAILURE)
3280             t = FAILURE;
3281           else
3282             t = gfc_add_asynchronous (&current_attr, NULL, &seen_at[d]);
3283           break;
3284
3285         case DECL_CODIMENSION:
3286           t = gfc_add_codimension (&current_attr, NULL, &seen_at[d]);
3287           break;
3288
3289         case DECL_DIMENSION:
3290           t = gfc_add_dimension (&current_attr, NULL, &seen_at[d]);
3291           break;
3292
3293         case DECL_EXTERNAL:
3294           t = gfc_add_external (&current_attr, &seen_at[d]);
3295           break;
3296
3297         case DECL_IN:
3298           t = gfc_add_intent (&current_attr, INTENT_IN, &seen_at[d]);
3299           break;
3300
3301         case DECL_OUT:
3302           t = gfc_add_intent (&current_attr, INTENT_OUT, &seen_at[d]);
3303           break;
3304
3305         case DECL_INOUT:
3306           t = gfc_add_intent (&current_attr, INTENT_INOUT, &seen_at[d]);
3307           break;
3308
3309         case DECL_INTRINSIC:
3310           t = gfc_add_intrinsic (&current_attr, &seen_at[d]);
3311           break;
3312
3313         case DECL_OPTIONAL:
3314           t = gfc_add_optional (&current_attr, &seen_at[d]);
3315           break;
3316
3317         case DECL_PARAMETER:
3318           t = gfc_add_flavor (&current_attr, FL_PARAMETER, NULL, &seen_at[d]);
3319           break;
3320
3321         case DECL_POINTER:
3322           t = gfc_add_pointer (&current_attr, &seen_at[d]);
3323           break;
3324
3325         case DECL_PROTECTED:
3326           if (gfc_current_ns->proc_name->attr.flavor != FL_MODULE)
3327             {
3328                gfc_error ("PROTECTED at %C only allowed in specification "
3329                           "part of a module");
3330                t = FAILURE;
3331                break;
3332             }
3333
3334           if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: PROTECTED "
3335                               "attribute at %C")
3336               == FAILURE)
3337             t = FAILURE;
3338           else
3339             t = gfc_add_protected (&current_attr, NULL, &seen_at[d]);
3340           break;
3341
3342         case DECL_PRIVATE:
3343           t = gfc_add_access (&current_attr, ACCESS_PRIVATE, NULL,
3344                               &seen_at[d]);
3345           break;
3346
3347         case DECL_PUBLIC:
3348           t = gfc_add_access (&current_attr, ACCESS_PUBLIC, NULL,
3349                               &seen_at[d]);
3350           break;
3351
3352         case DECL_SAVE:
3353           t = gfc_add_save (&current_attr, NULL, &seen_at[d]);
3354           break;
3355
3356         case DECL_TARGET:
3357           t = gfc_add_target (&current_attr, &seen_at[d]);
3358           break;
3359
3360         case DECL_IS_BIND_C:
3361            t = gfc_add_is_bind_c(&current_attr, NULL, &seen_at[d], 0);
3362            break;
3363            
3364         case DECL_VALUE:
3365           if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: VALUE attribute "
3366                               "at %C")
3367               == FAILURE)
3368             t = FAILURE;
3369           else
3370             t = gfc_add_value (&current_attr, NULL, &seen_at[d]);
3371           break;
3372
3373         case DECL_VOLATILE:
3374           if (gfc_notify_std (GFC_STD_F2003,
3375                               "Fortran 2003: VOLATILE attribute at %C")
3376               == FAILURE)
3377             t = FAILURE;
3378           else
3379             t = gfc_add_volatile (&current_attr, NULL, &seen_at[d]);
3380           break;
3381
3382         default:
3383           gfc_internal_error ("match_attr_spec(): Bad attribute");
3384         }
3385
3386       if (t == FAILURE)
3387         {
3388           m = MATCH_ERROR;
3389           goto cleanup;
3390         }
3391     }
3392
3393   colon_seen = 1;
3394   return MATCH_YES;
3395
3396 cleanup:
3397   gfc_current_locus = start;
3398   gfc_free_array_spec (current_as);
3399   current_as = NULL;
3400   return m;
3401 }
3402
3403
3404 /* Set the binding label, dest_label, either with the binding label
3405    stored in the given gfc_typespec, ts, or if none was provided, it
3406    will be the symbol name in all lower case, as required by the draft
3407    (J3/04-007, section 15.4.1).  If a binding label was given and
3408    there is more than one argument (num_idents), it is an error.  */
3409
3410 gfc_try
3411 set_binding_label (char *dest_label, const char *sym_name, int num_idents)
3412 {
3413   if (num_idents > 1 && has_name_equals)
3414     {
3415       gfc_error ("Multiple identifiers provided with "
3416                  "single NAME= specifier at %C");
3417       return FAILURE;
3418     }
3419
3420   if (curr_binding_label[0] != '\0')
3421     {
3422       /* Binding label given; store in temp holder til have sym.  */
3423       strcpy (dest_label, curr_binding_label);
3424     }
3425   else
3426     {
3427       /* No binding label given, and the NAME= specifier did not exist,
3428          which means there was no NAME="".  */
3429       if (sym_name != NULL && has_name_equals == 0)
3430         strcpy (dest_label, sym_name);
3431     }
3432    
3433   return SUCCESS;
3434 }
3435
3436
3437 /* Set the status of the given common block as being BIND(C) or not,
3438    depending on the given parameter, is_bind_c.  */
3439
3440 void
3441 set_com_block_bind_c (gfc_common_head *com_block, int is_bind_c)
3442 {
3443   com_block->is_bind_c = is_bind_c;
3444   return;
3445 }
3446
3447
3448 /* Verify that the given gfc_typespec is for a C interoperable type.  */
3449
3450 gfc_try
3451 verify_c_interop (gfc_typespec *ts)
3452 {
3453   if (ts->type == BT_DERIVED && ts->u.derived != NULL)
3454     return (ts->u.derived->ts.is_c_interop ? SUCCESS : FAILURE);
3455   else if (ts->is_c_interop != 1)
3456     return FAILURE;
3457   
3458   return SUCCESS;
3459 }
3460
3461
3462 /* Verify that the variables of a given common block, which has been
3463    defined with the attribute specifier bind(c), to be of a C
3464    interoperable type.  Errors will be reported here, if
3465    encountered.  */
3466
3467 gfc_try
3468 verify_com_block_vars_c_interop (gfc_common_head *com_block)
3469 {
3470   gfc_symbol *curr_sym = NULL;
3471   gfc_try retval = SUCCESS;
3472
3473   curr_sym = com_block->head;
3474   
3475   /* Make sure we have at least one symbol.  */
3476   if (curr_sym == NULL)
3477     return retval;
3478
3479   /* Here we know we have a symbol, so we'll execute this loop
3480      at least once.  */
3481   do
3482     {
3483       /* The second to last param, 1, says this is in a common block.  */
3484       retval = verify_bind_c_sym (curr_sym, &(curr_sym->ts), 1, com_block);
3485       curr_sym = curr_sym->common_next;
3486     } while (curr_sym != NULL); 
3487
3488   return retval;
3489 }
3490
3491
3492 /* Verify that a given BIND(C) symbol is C interoperable.  If it is not,
3493    an appropriate error message is reported.  */
3494
3495 gfc_try
3496 verify_bind_c_sym (gfc_symbol *tmp_sym, gfc_typespec *ts,
3497                    int is_in_common, gfc_common_head *com_block)
3498 {
3499   bool bind_c_function = false;
3500   gfc_try retval = SUCCESS;
3501
3502   if (tmp_sym->attr.function && tmp_sym->attr.is_bind_c)
3503     bind_c_function = true;
3504
3505   if (tmp_sym->attr.function && tmp_sym->result != NULL)
3506     {
3507       tmp_sym = tmp_sym->result;
3508       /* Make sure it wasn't an implicitly typed result.  */
3509       if (tmp_sym->attr.implicit_type)
3510         {
3511           gfc_warning ("Implicitly declared BIND(C) function '%s' at "
3512                        "%L may not be C interoperable", tmp_sym->name,
3513                        &tmp_sym->declared_at);
3514           tmp_sym->ts.f90_type = tmp_sym->ts.type;
3515           /* Mark it as C interoperable to prevent duplicate warnings.  */
3516           tmp_sym->ts.is_c_interop = 1;
3517           tmp_sym->attr.is_c_interop = 1;
3518         }
3519     }
3520
3521   /* Here, we know we have the bind(c) attribute, so if we have
3522      enough type info, then verify that it's a C interop kind.
3523      The info could be in the symbol already, or possibly still in
3524      the given ts (current_ts), so look in both.  */
3525   if (tmp_sym->ts.type != BT_UNKNOWN || ts->type != BT_UNKNOWN) 
3526     {
3527       if (verify_c_interop (&(tmp_sym->ts)) != SUCCESS)
3528         {
3529           /* See if we're dealing with a sym in a common block or not.  */
3530           if (is_in_common == 1)
3531             {
3532               gfc_warning ("Variable '%s' in common block '%s' at %L "
3533                            "may not be a C interoperable "
3534                            "kind though common block '%s' is BIND(C)",
3535                            tmp_sym->name, com_block->name,
3536                            &(tmp_sym->declared_at), com_block->name);
3537             }
3538           else
3539             {
3540               if (tmp_sym->ts.type == BT_DERIVED || ts->type == BT_DERIVED)
3541                 gfc_error ("Type declaration '%s' at %L is not C "
3542                            "interoperable but it is BIND(C)",
3543                            tmp_sym->name, &(tmp_sym->declared_at));
3544               else
3545                 gfc_warning ("Variable '%s' at %L "
3546                              "may not be a C interoperable "
3547                              "kind but it is bind(c)",
3548                              tmp_sym->name, &(tmp_sym->declared_at));
3549             }
3550         }
3551       
3552       /* Variables declared w/in a common block can't be bind(c)
3553          since there's no way for C to see these variables, so there's
3554          semantically no reason for the attribute.  */
3555       if (is_in_common == 1 && tmp_sym->attr.is_bind_c == 1)
3556         {
3557           gfc_error ("Variable '%s' in common block '%s' at "
3558                      "%L cannot be declared with BIND(C) "
3559                      "since it is not a global",
3560                      tmp_sym->name, com_block->name,
3561                      &(tmp_sym->declared_at));
3562           retval = FAILURE;
3563         }
3564       
3565       /* Scalar variables that are bind(c) can not have the pointer
3566          or allocatable attributes.  */
3567       if (tmp_sym->attr.is_bind_c == 1)
3568         {
3569           if (tmp_sym->attr.pointer == 1)
3570             {
3571               gfc_error ("Variable '%s' at %L cannot have both the "
3572                          "POINTER and BIND(C) attributes",
3573                          tmp_sym->name, &(tmp_sym->declared_at));
3574               retval = FAILURE;
3575             }
3576
3577           if (tmp_sym->attr.allocatable == 1)
3578             {
3579               gfc_error ("Variable '%s' at %L cannot have both the "
3580                          "ALLOCATABLE and BIND(C) attributes",
3581                          tmp_sym->name, &(tmp_sym->declared_at));
3582               retval = FAILURE;
3583             }
3584
3585         }
3586
3587       /* If it is a BIND(C) function, make sure the return value is a
3588          scalar value.  The previous tests in this function made sure
3589          the type is interoperable.  */
3590       if (bind_c_function && tmp_sym->as != NULL)
3591         gfc_error ("Return type of BIND(C) function '%s' at %L cannot "
3592                    "be an array", tmp_sym->name, &(tmp_sym->declared_at));
3593
3594       /* BIND(C) functions can not return a character string.  */
3595       if (bind_c_function && tmp_sym->ts.type == BT_CHARACTER)
3596         if (tmp_sym->ts.u.cl == NULL || tmp_sym->ts.u.cl->length == NULL
3597             || tmp_sym->ts.u.cl->length->expr_type != EXPR_CONSTANT
3598             || mpz_cmp_si (tmp_sym->ts.u.cl->length->value.integer, 1) != 0)
3599           gfc_error ("Return type of BIND(C) function '%s' at %L cannot "
3600                          "be a character string", tmp_sym->name,
3601                          &(tmp_sym->declared_at));
3602     }
3603
3604   /* See if the symbol has been marked as private.  If it has, make sure
3605      there is no binding label and warn the user if there is one.  */
3606   if (tmp_sym->attr.access == ACCESS_PRIVATE
3607       && tmp_sym->binding_label[0] != '\0')
3608       /* Use gfc_warning_now because we won't say that the symbol fails
3609          just because of this.  */
3610       gfc_warning_now ("Symbol '%s' at %L is marked PRIVATE but has been "
3611                        "given the binding label '%s'", tmp_sym->name,
3612                        &(tmp_sym->declared_at), tmp_sym->binding_label);
3613
3614   return retval;
3615 }
3616
3617
3618 /* Set the appropriate fields for a symbol that's been declared as
3619    BIND(C) (the is_bind_c flag and the binding label), and verify that
3620    the type is C interoperable.  Errors are reported by the functions
3621    used to set/test these fields.  */
3622
3623 gfc_try
3624 set_verify_bind_c_sym (gfc_symbol *tmp_sym, int num_idents)
3625 {
3626   gfc_try retval = SUCCESS;
3627   
3628   /* TODO: Do we need to make sure the vars aren't marked private?  */
3629
3630   /* Set the is_bind_c bit in symbol_attribute.  */
3631   gfc_add_is_bind_c (&(tmp_sym->attr), tmp_sym->name, &gfc_current_locus, 0);
3632
3633   if (set_binding_label (tmp_sym->binding_label, tmp_sym->name, 
3634                          num_idents) != SUCCESS)
3635     return FAILURE;
3636
3637   return retval;
3638 }
3639
3640
3641 /* Set the fields marking the given common block as BIND(C), including
3642    a binding label, and report any errors encountered.  */
3643
3644 gfc_try
3645 set_verify_bind_c_com_block (gfc_common_head *com_block, int num_idents)
3646 {
3647   gfc_try retval = SUCCESS;
3648   
3649   /* destLabel, common name, typespec (which may have binding label).  */
3650   if (set_binding_label (com_block->binding_label, com_block->name, num_idents)
3651       != SUCCESS)
3652     return FAILURE;
3653
3654   /* Set the given common block (com_block) to being bind(c) (1).  */
3655   set_com_block_bind_c (com_block, 1);
3656
3657   return retval;
3658 }
3659
3660
3661 /* Retrieve the list of one or more identifiers that the given bind(c)
3662    attribute applies to.  */
3663
3664 gfc_try
3665 get_bind_c_idents (void)
3666 {
3667   char name[GFC_MAX_SYMBOL_LEN + 1];
3668   int num_idents = 0;
3669   gfc_symbol *tmp_sym = NULL;
3670   match found_id;
3671   gfc_common_head *com_block = NULL;
3672   
3673   if (gfc_match_name (name) == MATCH_YES)
3674     {
3675       found_id = MATCH_YES;
3676       gfc_get_ha_symbol (name, &tmp_sym);
3677     }
3678   else if (match_common_name (name) == MATCH_YES)
3679     {
3680       found_id = MATCH_YES;
3681       com_block = gfc_get_common (name, 0);
3682     }
3683   else
3684     {
3685       gfc_error ("Need either entity or common block name for "
3686                  "attribute specification statement at %C");
3687       return FAILURE;
3688     }
3689    
3690   /* Save the current identifier and look for more.  */
3691   do
3692     {
3693       /* Increment the number of identifiers found for this spec stmt.  */
3694       num_idents++;
3695
3696       /* Make sure we have a sym or com block, and verify that it can
3697          be bind(c).  Set the appropriate field(s) and look for more
3698          identifiers.  */
3699       if (tmp_sym != NULL || com_block != NULL)         
3700         {
3701           if (tmp_sym != NULL)
3702             {
3703               if (set_verify_bind_c_sym (tmp_sym, num_idents)
3704                   != SUCCESS)
3705                 return FAILURE;
3706             }
3707           else
3708             {
3709               if (set_verify_bind_c_com_block(com_block, num_idents)
3710                   != SUCCESS)
3711                 return FAILURE;
3712             }
3713          
3714           /* Look to see if we have another identifier.  */
3715           tmp_sym = NULL;
3716           if (gfc_match_eos () == MATCH_YES)
3717             found_id = MATCH_NO;
3718           else if (gfc_match_char (',') != MATCH_YES)
3719             found_id = MATCH_NO;
3720           else if (gfc_match_name (name) == MATCH_YES)
3721             {
3722               found_id = MATCH_YES;
3723               gfc_get_ha_symbol (name, &tmp_sym);
3724             }
3725           else if (match_common_name (name) == MATCH_YES)
3726             {
3727               found_id = MATCH_YES;
3728               com_block = gfc_get_common (name, 0);
3729             }
3730           else
3731             {
3732               gfc_error ("Missing entity or common block name for "
3733                          "attribute specification statement at %C");
3734               return FAILURE;
3735             }
3736         }
3737       else
3738         {
3739           gfc_internal_error ("Missing symbol");
3740         }
3741     } while (found_id == MATCH_YES);
3742
3743   /* if we get here we were successful */
3744   return SUCCESS;
3745 }
3746
3747
3748 /* Try and match a BIND(C) attribute specification statement.  */
3749    
3750 match
3751 gfc_match_bind_c_stmt (void)
3752 {
3753   match found_match = MATCH_NO;
3754   gfc_typespec *ts;
3755
3756   ts = &current_ts;
3757   
3758   /* This may not be necessary.  */
3759   gfc_clear_ts (ts);
3760   /* Clear the temporary binding label holder.  */
3761   curr_binding_label[0] = '\0';
3762
3763   /* Look for the bind(c).  */
3764   found_match = gfc_match_bind_c (NULL, true);
3765
3766   if (found_match == MATCH_YES)
3767     {
3768       /* Look for the :: now, but it is not required.  */
3769       gfc_match (" :: ");
3770
3771       /* Get the identifier(s) that needs to be updated.  This may need to
3772          change to hand the flag(s) for the attr specified so all identifiers
3773          found can have all appropriate parts updated (assuming that the same
3774          spec stmt can have multiple attrs, such as both bind(c) and
3775          allocatable...).  */
3776       if (get_bind_c_idents () != SUCCESS)
3777         /* Error message should have printed already.  */
3778         return MATCH_ERROR;
3779     }
3780
3781   return found_match;
3782 }
3783
3784
3785 /* Match a data declaration statement.  */
3786
3787 match
3788 gfc_match_data_decl (void)
3789 {
3790   gfc_symbol *sym;
3791   match m;
3792   int elem;
3793
3794   num_idents_on_line = 0;
3795   
3796   m = gfc_match_decl_type_spec (&current_ts, 0);
3797   if (m != MATCH_YES)
3798     return m;
3799
3800   if ((current_ts.type == BT_DERIVED || current_ts.type == BT_CLASS)
3801         && gfc_current_state () != COMP_DERIVED)
3802     {
3803       sym = gfc_use_derived (current_ts.u.derived);
3804
3805       if (sym == NULL)
3806         {
3807           m = MATCH_ERROR;
3808           goto cleanup;
3809         }
3810
3811       current_ts.u.derived = sym;
3812     }
3813
3814   m = match_attr_spec ();
3815   if (m == MATCH_ERROR)
3816     {
3817       m = MATCH_NO;
3818       goto cleanup;
3819     }
3820
3821   if ((current_ts.type == BT_DERIVED || current_ts.type == BT_CLASS)
3822       && current_ts.u.derived->components == NULL
3823       && !current_ts.u.derived->attr.zero_comp)
3824     {
3825
3826       if (current_attr.pointer && gfc_current_state () == COMP_DERIVED)
3827         goto ok;
3828
3829       gfc_find_symbol (current_ts.u.derived->name,
3830                        current_ts.u.derived->ns->parent, 1, &sym);
3831
3832       /* Any symbol that we find had better be a type definition
3833          which has its components defined.  */
3834       if (sym != NULL && sym->attr.flavor == FL_DERIVED
3835           && (current_ts.u.derived->components != NULL
3836               || current_ts.u.derived->attr.zero_comp))
3837         goto ok;
3838
3839       /* Now we have an error, which we signal, and then fix up
3840          because the knock-on is plain and simple confusing.  */
3841       gfc_error_now ("Derived type at %C has not been previously defined "
3842                      "and so cannot appear in a derived type definition");
3843       current_attr.pointer = 1;
3844       goto ok;
3845     }
3846
3847 ok:
3848   /* If we have an old-style character declaration, and no new-style
3849      attribute specifications, then there a comma is optional between
3850      the type specification and the variable list.  */
3851   if (m == MATCH_NO && current_ts.type == BT_CHARACTER && old_char_selector)
3852     gfc_match_char (',');
3853
3854   /* Give the types/attributes to symbols that follow. Give the element
3855      a number so that repeat character length expressions can be copied.  */
3856   elem = 1;
3857   for (;;)
3858     {
3859       num_idents_on_line++;
3860       m = variable_decl (elem++);
3861       if (m == MATCH_ERROR)
3862         goto cleanup;
3863       if (m == MATCH_NO)
3864         break;
3865
3866       if (gfc_match_eos () == MATCH_YES)
3867         goto cleanup;
3868       if (gfc_match_char (',') != MATCH_YES)
3869         break;
3870     }
3871
3872   if (gfc_error_flag_test () == 0)
3873     gfc_error ("Syntax error in data declaration at %C");
3874   m = MATCH_ERROR;
3875
3876   gfc_free_data_all (gfc_current_ns);
3877
3878 cleanup:
3879   gfc_free_array_spec (current_as);
3880   current_as = NULL;
3881   return m;
3882 }
3883
3884
3885 /* Match a prefix associated with a function or subroutine
3886    declaration.  If the typespec pointer is nonnull, then a typespec
3887    can be matched.  Note that if nothing matches, MATCH_YES is
3888    returned (the null string was matched).  */
3889
3890 match
3891 gfc_match_prefix (gfc_typespec *ts)
3892 {
3893   bool seen_type;
3894
3895   gfc_clear_attr (&current_attr);
3896   seen_type = 0;
3897
3898   gcc_assert (!gfc_matching_prefix);
3899   gfc_matching_prefix = true;
3900
3901 loop:
3902   if (!seen_type && ts != NULL
3903       && gfc_match_decl_type_spec (ts, 0) == MATCH_YES
3904       && gfc_match_space () == MATCH_YES)
3905     {
3906
3907       seen_type = 1;
3908       goto loop;
3909     }
3910
3911   if (gfc_match ("elemental% ") == MATCH_YES)
3912     {
3913       if (gfc_add_elemental (&current_attr, NULL) == FAILURE)
3914         goto error;
3915
3916       goto loop;
3917     }
3918
3919   if (gfc_match ("pure% ") == MATCH_YES)
3920     {
3921       if (gfc_add_pure (&current_attr, NULL) == FAILURE)
3922         goto error;
3923
3924       goto loop;
3925     }
3926
3927   if (gfc_match ("recursive% ") == MATCH_YES)
3928     {
3929       if (gfc_add_recursive (&current_attr, NULL) == FAILURE)
3930         goto error;
3931
3932       goto loop;
3933     }
3934
3935   /* At this point, the next item is not a prefix.  */
3936   gcc_assert (gfc_matching_prefix);
3937   gfc_matching_prefix = false;
3938   return MATCH_YES;
3939
3940 error:
3941   gcc_assert (gfc_matching_prefix);
3942   gfc_matching_prefix = false;
3943   return MATCH_ERROR;
3944 }
3945
3946
3947 /* Copy attributes matched by gfc_match_prefix() to attributes on a symbol.  */
3948
3949 static gfc_try
3950 copy_prefix (symbol_attribute *dest, locus *where)
3951 {
3952   if (current_attr.pure && gfc_add_pure (dest, where) == FAILURE)
3953     return FAILURE;
3954
3955   if (current_attr.elemental && gfc_add_elemental (dest, where) == FAILURE)
3956     return FAILURE;
3957
3958   if (current_attr.recursive && gfc_add_recursive (dest, where) == FAILURE)
3959     return FAILURE;
3960
3961   return SUCCESS;
3962 }
3963
3964
3965 /* Match a formal argument list.  */
3966
3967 match
3968 gfc_match_formal_arglist (gfc_symbol *progname, int st_flag, int null_flag)
3969 {
3970   gfc_formal_arglist *head, *tail, *p, *q;
3971   char name[GFC_MAX_SYMBOL_LEN + 1];
3972   gfc_symbol *sym;
3973   match m;
3974
3975   head = tail = NULL;
3976
3977   if (gfc_match_char ('(') != MATCH_YES)
3978     {
3979       if (null_flag)
3980         goto ok;
3981       return MATCH_NO;
3982     }
3983
3984   if (gfc_match_char (')') == MATCH_YES)
3985     goto ok;
3986
3987   for (;;)
3988     {
3989       if (gfc_match_char ('*') == MATCH_YES)
3990         sym = NULL;
3991       else
3992         {
3993           m = gfc_match_name (name);
3994           if (m != MATCH_YES)
3995             goto cleanup;
3996
3997           if (gfc_get_symbol (name, NULL, &sym))
3998             goto cleanup;
3999         }
4000
4001       p = gfc_get_formal_arglist ();
4002
4003       if (head == NULL)
4004         head = tail = p;
4005       else
4006         {
4007           tail->next = p;
4008           tail = p;
4009         }
4010
4011       tail->sym = sym;
4012
4013       /* We don't add the VARIABLE flavor because the name could be a
4014          dummy procedure.  We don't apply these attributes to formal
4015          arguments of statement functions.  */
4016       if (sym != NULL && !st_flag
4017           && (gfc_add_dummy (&sym->attr, sym->name, NULL) == FAILURE
4018               || gfc_missing_attr (&sym->attr, NULL) == FAILURE))
4019         {
4020           m = MATCH_ERROR;
4021           goto cleanup;
4022         }
4023
4024       /* The name of a program unit can be in a different namespace,
4025          so check for it explicitly.  After the statement is accepted,
4026          the name is checked for especially in gfc_get_symbol().  */
4027       if (gfc_new_block != NULL && sym != NULL
4028           && strcmp (sym->name, gfc_new_block->name) == 0)
4029         {
4030           gfc_error ("Name '%s' at %C is the name of the procedure",
4031                      sym->name);
4032           m = MATCH_ERROR;
4033           goto cleanup;
4034         }
4035
4036       if (gfc_match_char (')') == MATCH_YES)
4037         goto ok;
4038
4039       m = gfc_match_char (',');
4040       if (m != MATCH_YES)
4041         {
4042           gfc_error ("Unexpected junk in formal argument list at %C");
4043           goto cleanup;
4044         }
4045     }
4046
4047 ok:
4048   /* Check for duplicate symbols in the formal argument list.  */
4049   if (head != NULL)
4050     {
4051       for (p = head; p->next; p = p->next)
4052         {
4053           if (p->sym == NULL)
4054             continue;
4055
4056           for (q = p->next; q; q = q->next)
4057             if (p->sym == q->sym)
4058               {
4059                 gfc_error ("Duplicate symbol '%s' in formal argument list "
4060                            "at %C", p->sym->name);
4061
4062                 m = MATCH_ERROR;
4063                 goto cleanup;
4064               }
4065         }
4066     }
4067
4068   if (gfc_add_explicit_interface (progname, IFSRC_DECL, head, NULL)
4069       == FAILURE)
4070     {
4071       m = MATCH_ERROR;
4072       goto cleanup;
4073     }
4074
4075   return MATCH_YES;
4076
4077 cleanup:
4078   gfc_free_formal_arglist (head);
4079   return m;
4080 }
4081
4082
4083 /* Match a RESULT specification following a function declaration or
4084    ENTRY statement.  Also matches the end-of-statement.  */
4085
4086 static match
4087 match_result (gfc_symbol *function, gfc_symbol **result)
4088 {
4089   char name[GFC_MAX_SYMBOL_LEN + 1];
4090   gfc_symbol *r;
4091   match m;
4092
4093   if (gfc_match (" result (") != MATCH_YES)
4094     return MATCH_NO;
4095
4096   m = gfc_match_name (name);
4097   if (m != MATCH_YES)
4098     return m;
4099
4100   /* Get the right paren, and that's it because there could be the
4101      bind(c) attribute after the result clause.  */
4102   if (gfc_match_char(')') != MATCH_YES)
4103     {
4104      /* TODO: should report the missing right paren here.  */
4105       return MATCH_ERROR;
4106     }
4107
4108   if (strcmp (function->name, name) == 0)
4109     {
4110       gfc_error ("RESULT variable at %C must be different than function name");
4111       return MATCH_ERROR;
4112     }
4113
4114   if (gfc_get_symbol (name, NULL, &r))
4115     return MATCH_ERROR;
4116
4117   if (gfc_add_result (&r->attr, r->name, NULL) == FAILURE)
4118     return MATCH_ERROR;
4119
4120   *result = r;
4121
4122   return MATCH_YES;
4123 }
4124
4125
4126 /* Match a function suffix, which could be a combination of a result
4127    clause and BIND(C), either one, or neither.  The draft does not
4128    require them to come in a specific order.  */
4129
4130 match
4131 gfc_match_suffix (gfc_symbol *sym, gfc_symbol **result)
4132 {
4133   match is_bind_c;   /* Found bind(c).  */
4134   match is_result;   /* Found result clause.  */
4135   match found_match; /* Status of whether we've found a good match.  */
4136   char peek_char;    /* Character we're going to peek at.  */
4137   bool allow_binding_name;
4138
4139   /* Initialize to having found nothing.  */
4140   found_match = MATCH_NO;
4141   is_bind_c = MATCH_NO; 
4142   is_result = MATCH_NO;
4143
4144   /* Get the next char to narrow between result and bind(c).  */
4145   gfc_gobble_whitespace ();
4146   peek_char = gfc_peek_ascii_char ();
4147
4148   /* C binding names are not allowed for internal procedures.  */
4149   if (gfc_current_state () == COMP_CONTAINS
4150       && sym->ns->proc_name->attr.flavor != FL_MODULE)
4151     allow_binding_name = false;
4152   else
4153     allow_binding_name = true;
4154
4155   switch (peek_char)
4156     {
4157     case 'r':
4158       /* Look for result clause.  */
4159       is_result = match_result (sym, result);
4160       if (is_result == MATCH_YES)
4161         {
4162           /* Now see if there is a bind(c) after it.  */
4163           is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
4164           /* We've found the result clause and possibly bind(c).  */
4165           found_match = MATCH_YES;
4166         }
4167       else
4168         /* This should only be MATCH_ERROR.  */
4169         found_match = is_result; 
4170       break;
4171     case 'b':
4172       /* Look for bind(c) first.  */
4173       is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
4174       if (is_bind_c == MATCH_YES)
4175         {
4176           /* Now see if a result clause followed it.  */
4177           is_result = match_result (sym, result);
4178           found_match = MATCH_YES;
4179         }
4180       else
4181         {
4182           /* Should only be a MATCH_ERROR if we get here after seeing 'b'.  */
4183           found_match = MATCH_ERROR;
4184         }
4185       break;
4186     default:
4187       gfc_error ("Unexpected junk after function declaration at %C");
4188       found_match = MATCH_ERROR;
4189       break;
4190     }
4191
4192   if (is_bind_c == MATCH_YES)
4193     {
4194       /* Fortran 2008 draft allows BIND(C) for internal procedures.  */
4195       if (gfc_current_state () == COMP_CONTAINS
4196           && sym->ns->proc_name->attr.flavor != FL_MODULE
4197           && gfc_notify_std (GFC_STD_F2008, "Fortran 2008: BIND(C) attribute "
4198                              "at %L may not be specified for an internal "
4199                              "procedure", &gfc_current_locus)
4200              == FAILURE)
4201         return MATCH_ERROR;
4202
4203       if (gfc_add_is_bind_c (&(sym->attr), sym->name, &gfc_current_locus, 1)
4204           == FAILURE)
4205         return MATCH_ERROR;
4206     }
4207   
4208   return found_match;
4209 }
4210
4211
4212 /* Procedure pointer return value without RESULT statement:
4213    Add "hidden" result variable named "ppr@".  */
4214
4215 static gfc_try
4216 add_hidden_procptr_result (gfc_symbol *sym)
4217 {
4218   bool case1,case2;
4219
4220   if (gfc_notification_std (GFC_STD_F2003) == ERROR)
4221     return FAILURE;
4222
4223   /* First usage case: PROCEDURE and EXTERNAL statements.  */
4224   case1 = gfc_current_state () == COMP_FUNCTION && gfc_current_block ()
4225           && strcmp (gfc_current_block ()->name, sym->name) == 0
4226           && sym->attr.external;
4227   /* Second usage case: INTERFACE statements.  */
4228   case2 = gfc_current_state () == COMP_INTERFACE && gfc_state_stack->previous
4229           && gfc_state_stack->previous->state == COMP_FUNCTION
4230           && strcmp (gfc_state_stack->previous->sym->name, sym->name) == 0;
4231
4232   if (case1 || case2)
4233     {
4234       gfc_symtree *stree;
4235       if (case1)
4236         gfc_get_sym_tree ("ppr@", gfc_current_ns, &stree, false);
4237       else if (case2)
4238         {
4239           gfc_symtree *st2;
4240           gfc_get_sym_tree ("ppr@", gfc_current_ns->parent, &stree, false);
4241           st2 = gfc_new_symtree (&gfc_current_ns->sym_root, "ppr@");
4242           st2->n.sym = stree->n.sym;
4243         }
4244       sym->result = stree->n.sym;
4245
4246       sym->result->attr.proc_pointer = sym->attr.proc_pointer;
4247       sym->result->attr.pointer = sym->attr.pointer;
4248       sym->result->attr.external = sym->attr.external;
4249       sym->result->attr.referenced = sym->attr.referenced;
4250       sym->result->ts = sym->ts;
4251       sym->attr.proc_pointer = 0;
4252       sym->attr.pointer = 0;
4253       sym->attr.external = 0;
4254       if (sym->result->attr.external && sym->result->attr.pointer)
4255         {
4256           sym->result->attr.pointer = 0;
4257           sym->result->attr.proc_pointer = 1;
4258         }
4259
4260       return gfc_add_result (&sym->result->attr, sym->result->name, NULL);
4261     }
4262   /* POINTER after PROCEDURE/EXTERNAL/INTERFACE statement.  */
4263   else if (sym->attr.function && !sym->attr.external && sym->attr.pointer
4264            && sym->result && sym->result != sym && sym->result->attr.external
4265            && sym == gfc_current_ns->proc_name
4266            && sym == sym->result->ns->proc_name
4267            && strcmp ("ppr@", sym->result->name) == 0)
4268     {
4269       sym->result->attr.proc_pointer = 1;
4270       sym->attr.pointer = 0;
4271       return SUCCESS;
4272     }
4273   else
4274     return FAILURE;
4275 }
4276
4277
4278 /* Match the interface for a PROCEDURE declaration,
4279    including brackets (R1212).  */
4280
4281 static match
4282 match_procedure_interface (gfc_symbol **proc_if)
4283 {
4284   match m;
4285   gfc_symtree *st;
4286   locus old_loc, entry_loc;
4287   gfc_namespace *old_ns = gfc_current_ns;
4288   char name[GFC_MAX_SYMBOL_LEN + 1];
4289
4290   old_loc = entry_loc = gfc_current_locus;
4291   gfc_clear_ts (&current_ts);
4292
4293   if (gfc_match (" (") != MATCH_YES)
4294     {
4295       gfc_current_locus = entry_loc;
4296       return MATCH_NO;
4297     }
4298
4299   /* Get the type spec. for the procedure interface.  */
4300   old_loc = gfc_current_locus;
4301   m = gfc_match_decl_type_spec (&current_ts, 0);
4302   gfc_gobble_whitespace ();
4303   if (m == MATCH_YES || (m == MATCH_NO && gfc_peek_ascii_char () == ')'))
4304     goto got_ts;
4305
4306   if (m == MATCH_ERROR)
4307     return m;
4308
4309   /* Procedure interface is itself a procedure.  */
4310   gfc_current_locus = old_loc;
4311   m = gfc_match_name (name);
4312
4313   /* First look to see if it is already accessible in the current
4314      namespace because it is use associated or contained.  */
4315   st = NULL;
4316   if (gfc_find_sym_tree (name, NULL, 0, &st))
4317     return MATCH_ERROR;
4318
4319   /* If it is still not found, then try the parent namespace, if it
4320      exists and create the symbol there if it is still not found.  */
4321   if (gfc_current_ns->parent)
4322     gfc_current_ns = gfc_current_ns->parent;
4323   if (st == NULL && gfc_get_ha_sym_tree (name, &st))
4324     return MATCH_ERROR;
4325
4326   gfc_current_ns = old_ns;
4327   *proc_if = st->n.sym;
4328
4329   /* Various interface checks.  */
4330   if (*proc_if)
4331     {
4332       (*proc_if)->refs++;
4333       /* Resolve interface if possible. That way, attr.procedure is only set
4334          if it is declared by a later procedure-declaration-stmt, which is
4335          invalid per C1212.  */
4336       while ((*proc_if)->ts.interface)
4337         *proc_if = (*proc_if)->ts.interface;
4338
4339       if ((*proc_if)->generic)
4340         {
4341           gfc_error ("Interface '%s' at %C may not be generic",
4342                      (*proc_if)->name);
4343           return MATCH_ERROR;
4344         }
4345       if ((*proc_if)->attr.proc == PROC_ST_FUNCTION)
4346         {
4347           gfc_error ("Interface '%s' at %C may not be a statement function",
4348                      (*proc_if)->name);
4349           return MATCH_ERROR;
4350         }
4351       /* Handle intrinsic procedures.  */
4352       if (!((*proc_if)->attr.external || (*proc_if)->attr.use_assoc
4353             || (*proc_if)->attr.if_source == IFSRC_IFBODY)
4354           && (gfc_is_intrinsic ((*proc_if), 0, gfc_current_locus)
4355               || gfc_is_intrinsic ((*proc_if), 1, gfc_current_locus)))
4356         (*proc_if)->attr.intrinsic = 1;
4357       if ((*proc_if)->attr.intrinsic
4358           && !gfc_intrinsic_actual_ok ((*proc_if)->name, 0))
4359         {
4360           gfc_error ("Intrinsic procedure '%s' not allowed "
4361                     "in PROCEDURE statement at %C", (*proc_if)->name);
4362           return MATCH_ERROR;
4363         }
4364     }
4365
4366 got_ts:
4367   if (gfc_match (" )") != MATCH_YES)
4368     {
4369       gfc_current_locus = entry_loc;
4370       return MATCH_NO;
4371     }
4372
4373   return MATCH_YES;
4374 }
4375
4376
4377 /* Match a PROCEDURE declaration (R1211).  */
4378
4379 static match
4380 match_procedure_decl (void)
4381 {
4382   match m;
4383   gfc_symbol *sym, *proc_if = NULL;
4384   int num;
4385   gfc_expr *initializer = NULL;
4386
4387   /* Parse interface (with brackets). */
4388   m = match_procedure_interface (&proc_if);
4389   if (m != MATCH_YES)
4390     return m;
4391
4392   /* Parse attributes (with colons).  */
4393   m = match_attr_spec();
4394   if (m == MATCH_ERROR)
4395     return MATCH_ERROR;
4396
4397   /* Get procedure symbols.  */
4398   for(num=1;;num++)
4399     {
4400       m = gfc_match_symbol (&sym, 0);
4401       if (m == MATCH_NO)
4402         goto syntax;
4403       else if (m == MATCH_ERROR)
4404         return m;
4405
4406       /* Add current_attr to the symbol attributes.  */
4407       if (gfc_copy_attr (&sym->attr, &current_attr, NULL) == FAILURE)
4408         return MATCH_ERROR;
4409
4410       if (sym->attr.is_bind_c)
4411         {
4412           /* Check for C1218.  */
4413           if (!proc_if || !proc_if->attr.is_bind_c)
4414             {
4415               gfc_error ("BIND(C) attribute at %C requires "
4416                         "an interface with BIND(C)");
4417               return MATCH_ERROR;
4418             }
4419           /* Check for C1217.  */
4420           if (has_name_equals && sym->attr.pointer)
4421             {
4422               gfc_error ("BIND(C) procedure with NAME may not have "
4423                         "POINTER attribute at %C");
4424               return MATCH_ERROR;
4425             }
4426           if (has_name_equals && sym->attr.dummy)
4427             {
4428               gfc_error ("Dummy procedure at %C may not have "
4429                         "BIND(C) attribute with NAME");
4430               return MATCH_ERROR;
4431             }
4432           /* Set binding label for BIND(C).  */
4433           if (set_binding_label (sym->binding_label, sym->name, num) != SUCCESS)
4434             return MATCH_ERROR;
4435         }
4436
4437       if (gfc_add_external (&sym->attr, NULL) == FAILURE)
4438         return MATCH_ERROR;
4439
4440       if (add_hidden_procptr_result (sym) == SUCCESS)
4441         sym = sym->result;
4442
4443       if (gfc_add_proc (&sym->attr, sym->name, NULL) == FAILURE)
4444         return MATCH_ERROR;
4445
4446       /* Set interface.  */
4447       if (proc_if != NULL)
4448         {
4449           if (sym->ts.type != BT_UNKNOWN)
4450             {
4451               gfc_error ("Procedure '%s' at %L already has basic type of %s",
4452                          sym->name, &gfc_current_locus,
4453                          gfc_basic_typename (sym->ts.type));
4454               return MATCH_ERROR;
4455             }
4456           sym->ts.interface = proc_if;
4457           sym->attr.untyped = 1;
4458           sym->attr.if_source = IFSRC_IFBODY;
4459         }
4460       else if (current_ts.type != BT_UNKNOWN)
4461         {
4462           if (gfc_add_type (sym, &current_ts, &gfc_current_locus) == FAILURE)
4463             return MATCH_ERROR;
4464           sym->ts.interface = gfc_new_symbol ("", gfc_current_ns);
4465           sym->ts.interface->ts = current_ts;
4466           sym->ts.interface->attr.function = 1;
4467           sym->attr.function = sym->ts.interface->attr.function;
4468           sym->attr.if_source = IFSRC_UNKNOWN;
4469         }
4470
4471       if (gfc_match (" =>") == MATCH_YES)
4472         {
4473           if (!current_attr.pointer)
4474             {
4475               gfc_error ("Initialization at %C isn't for a pointer variable");
4476               m = MATCH_ERROR;
4477               goto cleanup;
4478             }
4479
4480           m = gfc_match_null (&initializer);
4481           if (m == MATCH_NO)
4482             {
4483               gfc_error ("Pointer initialization requires a NULL() at %C");
4484               m = MATCH_ERROR;
4485             }
4486
4487           if (gfc_pure (NULL))
4488             {
4489               gfc_error ("Initialization of pointer at %C is not allowed in "
4490                          "a PURE procedure");
4491               m = MATCH_ERROR;
4492             }
4493
4494           if (m != MATCH_YES)
4495             goto cleanup;
4496
4497           if (add_init_expr_to_sym (sym->name, &initializer, &gfc_current_locus)
4498               != SUCCESS)
4499             goto cleanup;
4500
4501         }
4502
4503       gfc_set_sym_referenced (sym);
4504
4505       if (gfc_match_eos () == MATCH_YES)
4506         return MATCH_YES;
4507       if (gfc_match_char (',') != MATCH_YES)
4508         goto syntax;
4509     }
4510
4511 syntax:
4512   gfc_error ("Syntax error in PROCEDURE statement at %C");
4513   return MATCH_ERROR;
4514
4515 cleanup:
4516   /* Free stuff up and return.  */
4517   gfc_free_expr (initializer);
4518   return m;
4519 }
4520
4521
4522 static match
4523 match_binding_attributes (gfc_typebound_proc* ba, bool generic, bool ppc);
4524
4525
4526 /* Match a procedure pointer component declaration (R445).  */
4527
4528 static match
4529 match_ppc_decl (void)
4530 {
4531   match m;
4532   gfc_symbol *proc_if = NULL;
4533   gfc_typespec ts;
4534   int num;
4535   gfc_component *c;
4536   gfc_expr *initializer = NULL;
4537   gfc_typebound_proc* tb;
4538   char name[GFC_MAX_SYMBOL_LEN + 1];
4539
4540   /* Parse interface (with brackets).  */
4541   m = match_procedure_interface (&proc_if);
4542   if (m != MATCH_YES)
4543     goto syntax;
4544
4545   /* Parse attributes.  */
4546   tb = XCNEW (gfc_typebound_proc);
4547   tb->where = gfc_current_locus;
4548   m = match_binding_attributes (tb, false, true);
4549   if (m == MATCH_ERROR)
4550     return m;
4551
4552   gfc_clear_attr (&current_attr);
4553   current_attr.procedure = 1;
4554   current_attr.proc_pointer = 1;
4555   current_attr.access = tb->access;
4556   current_attr.flavor = FL_PROCEDURE;
4557
4558   /* Match the colons (required).  */
4559   if (gfc_match (" ::") != MATCH_YES)
4560     {
4561       gfc_error ("Expected '::' after binding-attributes at %C");
4562       return MATCH_ERROR;
4563     }
4564
4565   /* Check for C450.  */
4566   if (!tb->nopass && proc_if == NULL)
4567     {
4568       gfc_error("NOPASS or explicit interface required at %C");
4569       return MATCH_ERROR;
4570     }
4571
4572   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Procedure pointer "
4573                      "component at %C") == FAILURE)
4574     return MATCH_ERROR;
4575
4576   /* Match PPC names.  */
4577   ts = current_ts;
4578   for(num=1;;num++)
4579     {
4580       m = gfc_match_name (name);
4581       if (m == MATCH_NO)
4582         goto syntax;
4583       else if (m == MATCH_ERROR)
4584         return m;
4585
4586       if (gfc_add_component (gfc_current_block (), name, &c) == FAILURE)
4587         return MATCH_ERROR;
4588
4589       /* Add current_attr to the symbol attributes.  */
4590       if (gfc_copy_attr (&c->attr, &current_attr, NULL) == FAILURE)
4591         return MATCH_ERROR;
4592
4593       if (gfc_add_external (&c->attr, NULL) == FAILURE)
4594         return MATCH_ERROR;
4595
4596       if (gfc_add_proc (&c->attr, name, NULL) == FAILURE)
4597         return MATCH_ERROR;
4598
4599       c->tb = tb;
4600
4601       /* Set interface.  */
4602       if (proc_if != NULL)
4603         {
4604           c->ts.interface = proc_if;
4605           c->attr.untyped = 1;
4606           c->attr.if_source = IFSRC_IFBODY;
4607         }
4608       else if (ts.type != BT_UNKNOWN)
4609         {
4610           c->ts = ts;
4611           c->ts.interface = gfc_new_symbol ("", gfc_current_ns);
4612           c->ts.interface->ts = ts;
4613           c->ts.interface->attr.function = 1;
4614           c->attr.function = c->ts.interface->attr.function;
4615           c->attr.if_source = IFSRC_UNKNOWN;
4616         }
4617
4618       if (gfc_match (" =>") == MATCH_YES)
4619         {
4620           m = gfc_match_null (&initializer);
4621           if (m == MATCH_NO)
4622             {
4623               gfc_error ("Pointer initialization requires a NULL() at %C");
4624               m = MATCH_ERROR;
4625             }
4626           if (gfc_pure (NULL))
4627             {
4628               gfc_error ("Initialization of pointer at %C is not allowed in "
4629                          "a PURE procedure");
4630               m = MATCH_ERROR;
4631             }
4632           if (m != MATCH_YES)
4633             {
4634               gfc_free_expr (initializer);
4635               return m;
4636             }
4637           c->initializer = initializer;
4638         }
4639
4640       if (gfc_match_eos () == MATCH_YES)
4641         return MATCH_YES;
4642       if (gfc_match_char (',') != MATCH_YES)
4643         goto syntax;
4644     }
4645
4646 syntax:
4647   gfc_error ("Syntax error in procedure pointer component at %C");
4648   return MATCH_ERROR;
4649 }
4650
4651
4652 /* Match a PROCEDURE declaration inside an interface (R1206).  */
4653
4654 static match
4655 match_procedure_in_interface (void)
4656 {
4657   match m;
4658   gfc_symbol *sym;
4659   char name[GFC_MAX_SYMBOL_LEN + 1];
4660
4661   if (current_interface.type == INTERFACE_NAMELESS
4662       || current_interface.type == INTERFACE_ABSTRACT)
4663     {
4664       gfc_error ("PROCEDURE at %C must be in a generic interface");
4665       return MATCH_ERROR;
4666     }
4667
4668   for(;;)
4669     {
4670       m = gfc_match_name (name);
4671       if (m == MATCH_NO)
4672         goto syntax;
4673       else if (m == MATCH_ERROR)
4674         return m;
4675       if (gfc_get_symbol (name, gfc_current_ns->parent, &sym))
4676         return MATCH_ERROR;
4677
4678       if (gfc_add_interface (sym) == FAILURE)
4679         return MATCH_ERROR;
4680
4681       if (gfc_match_eos () == MATCH_YES)
4682         break;
4683       if (gfc_match_char (',') != MATCH_YES)
4684         goto syntax;
4685     }
4686
4687   return MATCH_YES;
4688
4689 syntax:
4690   gfc_error ("Syntax error in PROCEDURE statement at %C");
4691   return MATCH_ERROR;
4692 }
4693
4694
4695 /* General matcher for PROCEDURE declarations.  */
4696
4697 static match match_procedure_in_type (void);
4698
4699 match
4700 gfc_match_procedure (void)
4701 {
4702   match m;
4703
4704   switch (gfc_current_state ())
4705     {
4706     case COMP_NONE:
4707     case COMP_PROGRAM:
4708     case COMP_MODULE:
4709     case COMP_SUBROUTINE:
4710     case COMP_FUNCTION:
4711       m = match_procedure_decl ();
4712       break;
4713     case COMP_INTERFACE:
4714       m = match_procedure_in_interface ();
4715       break;
4716     case COMP_DERIVED:
4717       m = match_ppc_decl ();
4718       break;
4719     case COMP_DERIVED_CONTAINS:
4720       m = match_procedure_in_type ();
4721       break;
4722     default:
4723       return MATCH_NO;
4724     }
4725
4726   if (m != MATCH_YES)
4727     return m;
4728
4729   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: PROCEDURE statement at %C")
4730       == FAILURE)
4731     return MATCH_ERROR;
4732
4733   return m;
4734 }
4735
4736
4737 /* Warn if a matched procedure has the same name as an intrinsic; this is
4738    simply a wrapper around gfc_warn_intrinsic_shadow that interprets the current
4739    parser-state-stack to find out whether we're in a module.  */
4740
4741 static void
4742 warn_intrinsic_shadow (const gfc_symbol* sym, bool func)
4743 {
4744   bool in_module;
4745
4746   in_module = (gfc_state_stack->previous
4747                && gfc_state_stack->previous->state == COMP_MODULE);
4748
4749   gfc_warn_intrinsic_shadow (sym, in_module, func);
4750 }
4751
4752
4753 /* Match a function declaration.  */
4754
4755 match
4756 gfc_match_function_decl (void)
4757 {
4758   char name[GFC_MAX_SYMBOL_LEN + 1];
4759   gfc_symbol *sym, *result;
4760   locus old_loc;
4761   match m;
4762   match suffix_match;
4763   match found_match; /* Status returned by match func.  */  
4764
4765   if (gfc_current_state () != COMP_NONE
4766       && gfc_current_state () != COMP_INTERFACE
4767       && gfc_current_state () != COMP_CONTAINS)
4768     return MATCH_NO;
4769
4770   gfc_clear_ts (&current_ts);
4771
4772   old_loc = gfc_current_locus;
4773
4774   m = gfc_match_prefix (&current_ts);
4775   if (m != MATCH_YES)
4776     {
4777       gfc_current_locus = old_loc;
4778       return m;
4779     }
4780
4781   if (gfc_match ("function% %n", name) != MATCH_YES)
4782     {
4783       gfc_current_locus = old_loc;
4784       return MATCH_NO;
4785     }
4786   if (get_proc_name (name, &sym, false))
4787     return MATCH_ERROR;
4788
4789   if (add_hidden_procptr_result (sym) == SUCCESS)
4790     sym = sym->result;
4791
4792   gfc_new_block = sym;
4793
4794   m = gfc_match_formal_arglist (sym, 0, 0);
4795   if (m == MATCH_NO)
4796     {
4797       gfc_error ("Expected formal argument list in function "
4798                  "definition at %C");
4799       m = MATCH_ERROR;
4800       goto cleanup;
4801     }
4802   else if (m == MATCH_ERROR)
4803     goto cleanup;
4804
4805   result = NULL;
4806
4807   /* According to the draft, the bind(c) and result clause can
4808      come in either order after the formal_arg_list (i.e., either
4809      can be first, both can exist together or by themselves or neither
4810      one).  Therefore, the match_result can't match the end of the
4811      string, and check for the bind(c) or result clause in either order.  */
4812   found_match = gfc_match_eos ();
4813
4814   /* Make sure that it isn't already declared as BIND(C).  If it is, it
4815      must have been marked BIND(C) with a BIND(C) attribute and that is
4816      not allowed for procedures.  */
4817   if (sym->attr.is_bind_c == 1)
4818     {
4819       sym->attr.is_bind_c = 0;
4820       if (sym->old_symbol != NULL)
4821         gfc_error_now ("BIND(C) attribute at %L can only be used for "
4822                        "variables or common blocks",
4823                        &(sym->old_symbol->declared_at));
4824       else
4825         gfc_error_now ("BIND(C) attribute at %L can only be used for "
4826                        "variables or common blocks", &gfc_current_locus);
4827     }
4828
4829   if (found_match != MATCH_YES)
4830     {
4831       /* If we haven't found the end-of-statement, look for a suffix.  */
4832       suffix_match = gfc_match_suffix (sym, &result);
4833       if (suffix_match == MATCH_YES)
4834         /* Need to get the eos now.  */
4835         found_match = gfc_match_eos ();
4836       else
4837         found_match = suffix_match;
4838     }
4839
4840   if(found_match != MATCH_YES)
4841     m = MATCH_ERROR;
4842   else
4843     {
4844       /* Make changes to the symbol.  */
4845       m = MATCH_ERROR;
4846       
4847       if (gfc_add_function (&sym->attr, sym->name, NULL) == FAILURE)
4848         goto cleanup;
4849       
4850       if (gfc_missing_attr (&sym->attr, NULL) == FAILURE
4851           || copy_prefix (&sym->attr, &sym->declared_at) == FAILURE)
4852         goto cleanup;
4853
4854       /* Delay matching the function characteristics until after the
4855          specification block by signalling kind=-1.  */
4856       sym->declared_at = old_loc;
4857       if (current_ts.type != BT_UNKNOWN)
4858         current_ts.kind = -1;
4859       else
4860         current_ts.kind = 0;
4861
4862       if (result == NULL)
4863         {
4864           if (current_ts.type != BT_UNKNOWN
4865               && gfc_add_type (sym, &current_ts, &gfc_current_locus) == FAILURE)
4866             goto cleanup;
4867           sym->result = sym;
4868         }
4869       else
4870         {
4871           if (current_ts.type != BT_UNKNOWN
4872               && gfc_add_type (result, &current_ts, &gfc_current_locus)
4873                  == FAILURE)
4874             goto cleanup;
4875           sym->result = result;
4876         }
4877
4878       /* Warn if this procedure has the same name as an intrinsic.  */
4879       warn_intrinsic_shadow (sym, true);
4880
4881       return MATCH_YES;
4882     }
4883
4884 cleanup:
4885   gfc_current_locus = old_loc;
4886   return m;
4887 }
4888
4889
4890 /* This is mostly a copy of parse.c(add_global_procedure) but modified to
4891    pass the name of the entry, rather than the gfc_current_block name, and
4892    to return false upon finding an existing global entry.  */
4893
4894 static bool
4895 add_global_entry (const char *name, int sub)
4896 {
4897   gfc_gsymbol *s;
4898   enum gfc_symbol_type type;
4899
4900   s = gfc_get_gsymbol(name);
4901   type = sub ? GSYM_SUBROUTINE : GSYM_FUNCTION;
4902
4903   if (s->defined
4904       || (s->type != GSYM_UNKNOWN
4905           && s->type != type))
4906     gfc_global_used(s, NULL);
4907   else
4908     {
4909       s->type = type;
4910       s->where = gfc_current_locus;
4911       s->defined = 1;
4912       s->ns = gfc_current_ns;
4913       return true;
4914     }
4915   return false;
4916 }
4917
4918
4919 /* Match an ENTRY statement.  */
4920
4921 match
4922 gfc_match_entry (void)
4923 {
4924   gfc_symbol *proc;
4925   gfc_symbol *result;
4926   gfc_symbol *entry;
4927   char name[GFC_MAX_SYMBOL_LEN + 1];
4928   gfc_compile_state state;
4929   match m;
4930   gfc_entry_list *el;
4931   locus old_loc;
4932   bool module_procedure;
4933   char peek_char;
4934   match is_bind_c;
4935
4936   m = gfc_match_name (name);
4937   if (m != MATCH_YES)
4938     return m;
4939
4940   state = gfc_current_state ();
4941   if (state != COMP_SUBROUTINE && state != COMP_FUNCTION)
4942     {
4943       switch (state)
4944         {
4945           case COMP_PROGRAM:
4946             gfc_error ("ENTRY statement at %C cannot appear within a PROGRAM");
4947             break;
4948           case COMP_MODULE:
4949             gfc_error ("ENTRY statement at %C cannot appear within a MODULE");
4950             break;
4951           case COMP_BLOCK_DATA:
4952             gfc_error ("ENTRY statement at %C cannot appear within "
4953                        "a BLOCK DATA");
4954             break;
4955           case COMP_INTERFACE:
4956             gfc_error ("ENTRY statement at %C cannot appear within "
4957                        "an INTERFACE");
4958             break;
4959           case COMP_DERIVED:
4960             gfc_error ("ENTRY statement at %C cannot appear within "
4961                        "a DERIVED TYPE block");
4962             break;
4963           case COMP_IF:
4964             gfc_error ("ENTRY statement at %C cannot appear within "
4965                        "an IF-THEN block");
4966             break;
4967           case COMP_DO:
4968             gfc_error ("ENTRY statement at %C cannot appear within "
4969                        "a DO block");
4970             break;
4971           case COMP_SELECT:
4972             gfc_error ("ENTRY statement at %C cannot appear within "
4973                        "a SELECT block");
4974             break;
4975           case COMP_FORALL:
4976             gfc_error ("ENTRY statement at %C cannot appear within "
4977                        "a FORALL block");
4978             break;
4979           case COMP_WHERE:
4980             gfc_error ("ENTRY statement at %C cannot appear within "
4981                        "a WHERE block");
4982             break;
4983           case COMP_CONTAINS:
4984             gfc_error ("ENTRY statement at %C cannot appear within "
4985                        "a contained subprogram");
4986             break;
4987           default:
4988             gfc_internal_error ("gfc_match_entry(): Bad state");
4989         }
4990       return MATCH_ERROR;
4991     }
4992
4993   module_procedure = gfc_current_ns->parent != NULL
4994                    && gfc_current_ns->parent->proc_name
4995                    && gfc_current_ns->parent->proc_name->attr.flavor
4996                       == FL_MODULE;
4997
4998   if (gfc_current_ns->parent != NULL
4999       && gfc_current_ns->parent->proc_name
5000       && !module_procedure)
5001     {
5002       gfc_error("ENTRY statement at %C cannot appear in a "
5003                 "contained procedure");
5004       return MATCH_ERROR;
5005     }
5006
5007   /* Module function entries need special care in get_proc_name
5008      because previous references within the function will have
5009      created symbols attached to the current namespace.  */
5010   if (get_proc_name (name, &entry,
5011                      gfc_current_ns->parent != NULL
5012                      && module_procedure))
5013     return MATCH_ERROR;
5014
5015   proc = gfc_current_block ();
5016
5017   /* Make sure that it isn't already declared as BIND(C).  If it is, it
5018      must have been marked BIND(C) with a BIND(C) attribute and that is
5019      not allowed for procedures.  */
5020   if (entry->attr.is_bind_c == 1)
5021     {
5022       entry->attr.is_bind_c = 0;
5023       if (entry->old_symbol != NULL)
5024         gfc_error_now ("BIND(C) attribute at %L can only be used for "
5025                        "variables or common blocks",
5026                        &(entry->old_symbol->declared_at));
5027       else
5028         gfc_error_now ("BIND(C) attribute at %L can only be used for "
5029                        "variables or common blocks", &gfc_current_locus);
5030     }
5031   
5032   /* Check what next non-whitespace character is so we can tell if there
5033      is the required parens if we have a BIND(C).  */
5034   gfc_gobble_whitespace ();
5035   peek_char = gfc_peek_ascii_char ();
5036
5037   if (state == COMP_SUBROUTINE)
5038     {
5039       /* An entry in a subroutine.  */
5040       if (!gfc_current_ns->parent && !add_global_entry (name, 1))
5041         return MATCH_ERROR;
5042
5043       m = gfc_match_formal_arglist (entry, 0, 1);
5044       if (m != MATCH_YES)
5045         return MATCH_ERROR;
5046
5047       /* Call gfc_match_bind_c with allow_binding_name = true as ENTRY can
5048          never be an internal procedure.  */
5049       is_bind_c = gfc_match_bind_c (entry, true);
5050       if (is_bind_c == MATCH_ERROR)
5051         return MATCH_ERROR;
5052       if (is_bind_c == MATCH_YES)
5053         {
5054           if (peek_char != '(')
5055             {
5056               gfc_error ("Missing required parentheses before BIND(C) at %C");
5057               return MATCH_ERROR;
5058             }
5059             if (gfc_add_is_bind_c (&(entry->attr), entry->name, &(entry->declared_at), 1)
5060                 == FAILURE)
5061               return MATCH_ERROR;
5062         }
5063
5064       if (gfc_add_entry (&entry->attr, entry->name, NULL) == FAILURE
5065           || gfc_add_subroutine (&entry->attr, entry->name, NULL) == FAILURE)
5066         return MATCH_ERROR;
5067     }
5068   else
5069     {
5070       /* An entry in a function.
5071          We need to take special care because writing
5072             ENTRY f()
5073          as
5074             ENTRY f
5075          is allowed, whereas
5076             ENTRY f() RESULT (r)
5077          can't be written as
5078             ENTRY f RESULT (r).  */
5079       if (!gfc_current_ns->parent && !add_global_entry (name, 0))
5080         return MATCH_ERROR;
5081
5082       old_loc = gfc_current_locus;
5083       if (gfc_match_eos () == MATCH_YES)
5084         {
5085           gfc_current_locus = old_loc;
5086           /* Match the empty argument list, and add the interface to
5087              the symbol.  */
5088           m = gfc_match_formal_arglist (entry, 0, 1);
5089         }
5090       else
5091         m = gfc_match_formal_arglist (entry, 0, 0);
5092
5093       if (m != MATCH_YES)
5094         return MATCH_ERROR;
5095
5096       result = NULL;
5097
5098       if (gfc_match_eos () == MATCH_YES)
5099         {
5100           if (gfc_add_entry (&entry->attr, entry->name, NULL) == FAILURE
5101               || gfc_add_function (&entry->attr, entry->name, NULL) == FAILURE)
5102             return MATCH_ERROR;
5103
5104           entry->result = entry;
5105         }
5106       else
5107         {
5108           m = gfc_match_suffix (entry, &result);
5109           if (m == MATCH_NO)
5110             gfc_syntax_error (ST_ENTRY);
5111           if (m != MATCH_YES)
5112             return MATCH_ERROR;
5113
5114           if (result)
5115             {
5116               if (gfc_add_result (&result->attr, result->name, NULL) == FAILURE
5117                   || gfc_add_entry (&entry->attr, result->name, NULL) == FAILURE
5118                   || gfc_add_function (&entry->attr, result->name, NULL)
5119                   == FAILURE)
5120                 return MATCH_ERROR;
5121               entry->result = result;
5122             }
5123           else
5124             {
5125               if (gfc_add_entry (&entry->attr, entry->name, NULL) == FAILURE
5126                   || gfc_add_function (&entry->attr, entry->name, NULL) == FAILURE)
5127                 return MATCH_ERROR;
5128               entry->result = entry;
5129             }
5130         }
5131     }
5132
5133   if (gfc_match_eos () != MATCH_YES)
5134     {
5135       gfc_syntax_error (ST_ENTRY);
5136       return MATCH_ERROR;
5137     }
5138
5139   entry->attr.recursive = proc->attr.recursive;
5140   entry->attr.elemental = proc->attr.elemental;
5141   entry->attr.pure = proc->attr.pure;
5142
5143   el = gfc_get_entry_list ();
5144   el->sym = entry;
5145   el->next = gfc_current_ns->entries;
5146   gfc_current_ns->entries = el;
5147   if (el->next)
5148     el->id = el->next->id + 1;
5149   else
5150     el->id = 1;
5151
5152   new_st.op = EXEC_ENTRY;
5153   new_st.ext.entry = el;
5154
5155   return MATCH_YES;
5156 }
5157
5158
5159 /* Match a subroutine statement, including optional prefixes.  */
5160
5161 match
5162 gfc_match_subroutine (void)
5163 {
5164   char name[GFC_MAX_SYMBOL_LEN + 1];
5165   gfc_symbol *sym;
5166   match m;
5167   match is_bind_c;
5168   char peek_char;
5169   bool allow_binding_name;
5170
5171   if (gfc_current_state () != COMP_NONE
5172       && gfc_current_state () != COMP_INTERFACE
5173       && gfc_current_state () != COMP_CONTAINS)
5174     return MATCH_NO;
5175
5176   m = gfc_match_prefix (NULL);
5177   if (m != MATCH_YES)
5178     return m;
5179
5180   m = gfc_match ("subroutine% %n", name);
5181   if (m != MATCH_YES)
5182     return m;
5183
5184   if (get_proc_name (name, &sym, false))
5185     return MATCH_ERROR;
5186
5187   /* Set declared_at as it might point to, e.g., a PUBLIC statement, if
5188      the symbol existed before. */
5189   sym->declared_at = gfc_current_locus;
5190
5191   if (add_hidden_procptr_result (sym) == SUCCESS)
5192     sym = sym->result;
5193
5194   gfc_new_block = sym;
5195
5196   /* Check what next non-whitespace character is so we can tell if there
5197      is the required parens if we have a BIND(C).  */
5198   gfc_gobble_whitespace ();
5199   peek_char = gfc_peek_ascii_char ();
5200   
5201   if (gfc_add_subroutine (&sym->attr, sym->name, NULL) == FAILURE)
5202     return MATCH_ERROR;
5203
5204   if (gfc_match_formal_arglist (sym, 0, 1) != MATCH_YES)
5205     return MATCH_ERROR;
5206
5207   /* Make sure that it isn't already declared as BIND(C).  If it is, it
5208      must have been marked BIND(C) with a BIND(C) attribute and that is
5209      not allowed for procedures.  */
5210   if (sym->attr.is_bind_c == 1)
5211     {
5212       sym->attr.is_bind_c = 0;
5213       if (sym->old_symbol != NULL)
5214         gfc_error_now ("BIND(C) attribute at %L can only be used for "
5215                        "variables or common blocks",
5216                        &(sym->old_symbol->declared_at));
5217       else
5218         gfc_error_now ("BIND(C) attribute at %L can only be used for "
5219                        "variables or common blocks", &gfc_current_locus);
5220     }
5221
5222   /* C binding names are not allowed for internal procedures.  */
5223   if (gfc_current_state () == COMP_CONTAINS
5224       && sym->ns->proc_name->attr.flavor != FL_MODULE)
5225     allow_binding_name = false;
5226   else
5227     allow_binding_name = true;
5228
5229   /* Here, we are just checking if it has the bind(c) attribute, and if
5230      so, then we need to make sure it's all correct.  If it doesn't,
5231      we still need to continue matching the rest of the subroutine line.  */
5232   is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
5233   if (is_bind_c == MATCH_ERROR)
5234     {
5235       /* There was an attempt at the bind(c), but it was wrong.  An
5236          error message should have been printed w/in the gfc_match_bind_c
5237          so here we'll just return the MATCH_ERROR.  */
5238       return MATCH_ERROR;
5239     }
5240
5241   if (is_bind_c == MATCH_YES)
5242     {
5243       /* The following is allowed in the Fortran 2008 draft.  */
5244       if (gfc_current_state () == COMP_CONTAINS
5245           && sym->ns->proc_name->attr.flavor != FL_MODULE
5246           && gfc_notify_std (GFC_STD_F2008, "Fortran 2008: BIND(C) attribute "
5247                              "at %L may not be specified for an internal "
5248                              "procedure", &gfc_current_locus)
5249              == FAILURE)
5250         return MATCH_ERROR;
5251
5252       if (peek_char != '(')
5253         {
5254           gfc_error ("Missing required parentheses before BIND(C) at %C");
5255           return MATCH_ERROR;
5256         }
5257       if (gfc_add_is_bind_c (&(sym->attr), sym->name, &(sym->declared_at), 1)
5258           == FAILURE)
5259         return MATCH_ERROR;
5260     }
5261   
5262   if (gfc_match_eos () != MATCH_YES)
5263     {
5264       gfc_syntax_error (ST_SUBROUTINE);
5265       return MATCH_ERROR;
5266     }
5267
5268   if (copy_prefix (&sym->attr, &sym->declared_at) == FAILURE)
5269     return MATCH_ERROR;
5270
5271   /* Warn if it has the same name as an intrinsic.  */
5272   warn_intrinsic_shadow (sym, false);
5273
5274   return MATCH_YES;
5275 }
5276
5277
5278 /* Match a BIND(C) specifier, with the optional 'name=' specifier if
5279    given, and set the binding label in either the given symbol (if not
5280    NULL), or in the current_ts.  The symbol may be NULL because we may
5281    encounter the BIND(C) before the declaration itself.  Return
5282    MATCH_NO if what we're looking at isn't a BIND(C) specifier,
5283    MATCH_ERROR if it is a BIND(C) clause but an error was encountered,
5284    or MATCH_YES if the specifier was correct and the binding label and
5285    bind(c) fields were set correctly for the given symbol or the
5286    current_ts. If allow_binding_name is false, no binding name may be
5287    given.  */
5288
5289 match
5290 gfc_match_bind_c (gfc_symbol *sym, bool allow_binding_name)
5291 {
5292   /* binding label, if exists */   
5293   char binding_label[GFC_MAX_SYMBOL_LEN + 1];
5294   match double_quote;
5295   match single_quote;
5296
5297   /* Initialize the flag that specifies whether we encountered a NAME= 
5298      specifier or not.  */
5299   has_name_equals = 0;
5300
5301   /* Init the first char to nil so we can catch if we don't have
5302      the label (name attr) or the symbol name yet.  */
5303   binding_label[0] = '\0';
5304    
5305   /* This much we have to be able to match, in this order, if
5306      there is a bind(c) label.  */
5307   if (gfc_match (" bind ( c ") != MATCH_YES)
5308     return MATCH_NO;
5309
5310   /* Now see if there is a binding label, or if we've reached the
5311      end of the bind(c) attribute without one.  */
5312   if (gfc_match_char (',') == MATCH_YES)
5313     {
5314       if (gfc_match (" name = ") != MATCH_YES)
5315         {
5316           gfc_error ("Syntax error in NAME= specifier for binding label "
5317                      "at %C");
5318           /* should give an error message here */
5319           return MATCH_ERROR;
5320         }
5321
5322       has_name_equals = 1;
5323
5324       /* Get the opening quote.  */
5325       double_quote = MATCH_YES;
5326       single_quote = MATCH_YES;
5327       double_quote = gfc_match_char ('"');
5328       if (double_quote != MATCH_YES)
5329         single_quote = gfc_match_char ('\'');
5330       if (double_quote != MATCH_YES && single_quote != MATCH_YES)
5331         {
5332           gfc_error ("Syntax error in NAME= specifier for binding label "
5333                      "at %C");
5334           return MATCH_ERROR;
5335         }
5336       
5337       /* Grab the binding label, using functions that will not lower
5338          case the names automatically.  */
5339       if (gfc_match_name_C (binding_label) != MATCH_YES)
5340          return MATCH_ERROR;
5341       
5342       /* Get the closing quotation.  */
5343       if (double_quote == MATCH_YES)
5344         {
5345           if (gfc_match_char ('"') != MATCH_YES)
5346             {
5347               gfc_error ("Missing closing quote '\"' for binding label at %C");
5348               /* User started string with '"' so looked to match it.  */
5349               return MATCH_ERROR;
5350             }
5351         }
5352       else
5353         {
5354           if (gfc_match_char ('\'') != MATCH_YES)
5355             {
5356               gfc_error ("Missing closing quote '\'' for binding label at %C");
5357               /* User started string with "'" char.  */
5358               return MATCH_ERROR;
5359             }
5360         }
5361    }
5362
5363   /* Get the required right paren.  */
5364   if (gfc_match_char (')') != MATCH_YES)
5365     {
5366       gfc_error ("Missing closing paren for binding label at %C");
5367       return MATCH_ERROR;
5368     }
5369
5370   if (has_name_equals && !allow_binding_name)
5371     {
5372       gfc_error ("No binding name is allowed in BIND(C) at %C");
5373       return MATCH_ERROR;
5374     }
5375
5376   if (has_name_equals && sym != NULL && sym->attr.dummy)
5377     {
5378       gfc_error ("For dummy procedure %s, no binding name is "
5379                  "allowed in BIND(C) at %C", sym->name);
5380       return MATCH_ERROR;
5381     }
5382
5383
5384   /* Save the binding label to the symbol.  If sym is null, we're
5385      probably matching the typespec attributes of a declaration and
5386      haven't gotten the name yet, and therefore, no symbol yet.  */
5387   if (binding_label[0] != '\0')
5388     {
5389       if (sym != NULL)
5390       {
5391         strcpy (sym->binding_label, binding_label);
5392       }
5393       else
5394         strcpy (curr_binding_label, binding_label);
5395     }
5396   else if (allow_binding_name)
5397     {
5398       /* No binding label, but if symbol isn't null, we
5399          can set the label for it here.
5400          If name="" or allow_binding_name is false, no C binding name is
5401          created. */
5402       if (sym != NULL && sym->name != NULL && has_name_equals == 0)
5403         strncpy (sym->binding_label, sym->name, strlen (sym->name) + 1);
5404     }
5405
5406   if (has_name_equals && gfc_current_state () == COMP_INTERFACE
5407       && current_interface.type == INTERFACE_ABSTRACT)
5408     {
5409       gfc_error ("NAME not allowed on BIND(C) for ABSTRACT INTERFACE at %C");
5410       return MATCH_ERROR;
5411     }
5412
5413   return MATCH_YES;
5414 }
5415
5416
5417 /* Return nonzero if we're currently compiling a contained procedure.  */
5418
5419 static int
5420 contained_procedure (void)
5421 {
5422   gfc_state_data *s = gfc_state_stack;
5423
5424   if ((s->state == COMP_SUBROUTINE || s->state == COMP_FUNCTION)
5425       && s->previous != NULL && s->previous->state == COMP_CONTAINS)
5426     return 1;
5427
5428   return 0;
5429 }
5430
5431 /* Set the kind of each enumerator.  The kind is selected such that it is
5432    interoperable with the corresponding C enumeration type, making
5433    sure that -fshort-enums is honored.  */
5434
5435 static void
5436 set_enum_kind(void)
5437 {
5438   enumerator_history *current_history = NULL;
5439   int kind;
5440   int i;
5441
5442   if (max_enum == NULL || enum_history == NULL)
5443     return;
5444
5445   if (!flag_short_enums)
5446     return;
5447
5448   i = 0;
5449   do
5450     {
5451       kind = gfc_integer_kinds[i++].kind;
5452     }
5453   while (kind < gfc_c_int_kind
5454          && gfc_check_integer_range (max_enum->initializer->value.integer,
5455                                      kind) != ARITH_OK);
5456
5457   current_history = enum_history;
5458   while (current_history != NULL)
5459     {
5460       current_history->sym->ts.kind = kind;
5461       current_history = current_history->next;
5462     }
5463 }
5464
5465
5466 /* Match any of the various end-block statements.  Returns the type of
5467    END to the caller.  The END INTERFACE, END IF, END DO, END SELECT
5468    and END BLOCK statements cannot be replaced by a single END statement.  */
5469
5470 match
5471 gfc_match_end (gfc_statement *st)
5472 {
5473   char name[GFC_MAX_SYMBOL_LEN + 1];
5474   gfc_compile_state state;
5475   locus old_loc;
5476   const char *block_name;
5477   const char *target;
5478   int eos_ok;
5479   match m;
5480
5481   old_loc = gfc_current_locus;
5482   if (gfc_match ("end") != MATCH_YES)
5483     return MATCH_NO;
5484
5485   state = gfc_current_state ();
5486   block_name = gfc_current_block () == NULL
5487              ? NULL : gfc_current_block ()->name;
5488
5489   if (state == COMP_BLOCK && !strcmp (block_name, "block@"))
5490     block_name = NULL;
5491
5492   if (state == COMP_CONTAINS || state == COMP_DERIVED_CONTAINS)
5493     {
5494       state = gfc_state_stack->previous->state;
5495       block_name = gfc_state_stack->previous->sym == NULL
5496                  ? NULL : gfc_state_stack->previous->sym->name;
5497     }
5498
5499   switch (state)
5500     {
5501     case COMP_NONE:
5502     case COMP_PROGRAM:
5503       *st = ST_END_PROGRAM;
5504       target = " program";
5505       eos_ok = 1;
5506       break;
5507
5508     case COMP_SUBROUTINE:
5509       *st = ST_END_SUBROUTINE;
5510       target = " subroutine";
5511       eos_ok = !contained_procedure ();
5512       break;
5513
5514     case COMP_FUNCTION:
5515       *st = ST_END_FUNCTION;
5516       target = " function";
5517       eos_ok = !contained_procedure ();
5518       break;
5519
5520     case COMP_BLOCK_DATA:
5521       *st = ST_END_BLOCK_DATA;
5522       target = " block data";
5523       eos_ok = 1;
5524       break;
5525
5526     case COMP_MODULE:
5527       *st = ST_END_MODULE;
5528       target = " module";
5529       eos_ok = 1;
5530       break;
5531
5532     case COMP_INTERFACE:
5533       *st = ST_END_INTERFACE;
5534       target = " interface";
5535       eos_ok = 0;
5536       break;
5537
5538     case COMP_DERIVED:
5539     case COMP_DERIVED_CONTAINS:
5540       *st = ST_END_TYPE;
5541       target = " type";
5542       eos_ok = 0;
5543       break;
5544
5545     case COMP_BLOCK:
5546       *st = ST_END_BLOCK;
5547       target = " block";
5548       eos_ok = 0;
5549       break;
5550
5551     case COMP_IF:
5552       *st = ST_ENDIF;
5553       target = " if";
5554       eos_ok = 0;
5555       break;
5556
5557     case COMP_DO:
5558       *st = ST_ENDDO;
5559       target = " do";
5560       eos_ok = 0;
5561       break;
5562
5563     case COMP_CRITICAL:
5564       *st = ST_END_CRITICAL;
5565       target = " critical";
5566       eos_ok = 0;
5567       break;
5568
5569     case COMP_SELECT:
5570     case COMP_SELECT_TYPE:
5571       *st = ST_END_SELECT;
5572       target = " select";
5573       eos_ok = 0;
5574       break;
5575
5576     case COMP_FORALL:
5577       *st = ST_END_FORALL;
5578       target = " forall";
5579       eos_ok = 0;
5580       break;
5581
5582     case COMP_WHERE:
5583       *st = ST_END_WHERE;
5584       target = " where";
5585       eos_ok = 0;
5586       break;
5587
5588     case COMP_ENUM:
5589       *st = ST_END_ENUM;
5590       target = " enum";
5591       eos_ok = 0;
5592       last_initializer = NULL;
5593       set_enum_kind ();
5594       gfc_free_enum_history ();
5595       break;
5596
5597     default:
5598       gfc_error ("Unexpected END statement at %C");
5599       goto cleanup;
5600     }
5601
5602   if (gfc_match_eos () == MATCH_YES)
5603     {
5604       if (!eos_ok)
5605         {
5606           /* We would have required END [something].  */
5607           gfc_error ("%s statement expected at %L",
5608                      gfc_ascii_statement (*st), &old_loc);
5609           goto cleanup;
5610         }
5611
5612       return MATCH_YES;
5613     }
5614
5615   /* Verify that we've got the sort of end-block that we're expecting.  */
5616   if (gfc_match (target) != MATCH_YES)
5617     {
5618       gfc_error ("Expecting %s statement at %C", gfc_ascii_statement (*st));
5619       goto cleanup;
5620     }
5621
5622   /* If we're at the end, make sure a block name wasn't required.  */
5623   if (gfc_match_eos () == MATCH_YES)
5624     {
5625
5626       if (*st != ST_ENDDO && *st != ST_ENDIF && *st != ST_END_SELECT
5627           && *st != ST_END_FORALL && *st != ST_END_WHERE && *st != ST_END_BLOCK
5628           && *st != ST_END_CRITICAL)
5629         return MATCH_YES;
5630
5631       if (!block_name)
5632         return MATCH_YES;
5633
5634       gfc_error ("Expected block name of '%s' in %s statement at %C",
5635                  block_name, gfc_ascii_statement (*st));
5636
5637       return MATCH_ERROR;
5638     }
5639
5640   /* END INTERFACE has a special handler for its several possible endings.  */
5641   if (*st == ST_END_INTERFACE)
5642     return gfc_match_end_interface ();
5643
5644   /* We haven't hit the end of statement, so what is left must be an
5645      end-name.  */
5646   m = gfc_match_space ();
5647   if (m == MATCH_YES)
5648     m = gfc_match_name (name);
5649
5650   if (m == MATCH_NO)
5651     gfc_error ("Expected terminating name at %C");
5652   if (m != MATCH_YES)
5653     goto cleanup;
5654
5655   if (block_name == NULL)
5656     goto syntax;
5657
5658   if (strcmp (name, block_name) != 0 && strcmp (block_name, "ppr@") != 0)
5659     {
5660       gfc_error ("Expected label '%s' for %s statement at %C", block_name,
5661                  gfc_ascii_statement (*st));
5662       goto cleanup;
5663     }
5664   /* Procedure pointer as function result.  */
5665   else if (strcmp (block_name, "ppr@") == 0
5666            && strcmp (name, gfc_current_block ()->ns->proc_name->name) != 0)
5667     {
5668       gfc_error ("Expected label '%s' for %s statement at %C",
5669                  gfc_current_block ()->ns->proc_name->name,
5670                  gfc_ascii_statement (*st));
5671       goto cleanup;
5672     }
5673
5674   if (gfc_match_eos () == MATCH_YES)
5675     return MATCH_YES;
5676
5677 syntax:
5678   gfc_syntax_error (*st);
5679
5680 cleanup:
5681   gfc_current_locus = old_loc;
5682   return MATCH_ERROR;
5683 }
5684
5685
5686
5687 /***************** Attribute declaration statements ****************/
5688
5689 /* Set the attribute of a single variable.  */
5690
5691 static match
5692 attr_decl1 (void)
5693 {
5694   char name[GFC_MAX_SYMBOL_LEN + 1];
5695   gfc_array_spec *as;
5696   gfc_symbol *sym;
5697   locus var_locus;
5698   match m;
5699
5700   as = NULL;
5701
5702   m = gfc_match_name (name);
5703   if (m != MATCH_YES)
5704     goto cleanup;
5705
5706   if (find_special (name, &sym, false))
5707     return MATCH_ERROR;
5708
5709   var_locus = gfc_current_locus;
5710
5711   /* Deal with possible array specification for certain attributes.  */
5712   if (current_attr.dimension
5713       || current_attr.codimension
5714       || current_attr.allocatable
5715       || current_attr.pointer
5716       || current_attr.target)
5717     {
5718       m = gfc_match_array_spec (&as, !current_attr.codimension,
5719                                 !current_attr.dimension
5720                                 && !current_attr.pointer
5721                                 && !current_attr.target);
5722       if (m == MATCH_ERROR)
5723         goto cleanup;
5724
5725       if (current_attr.dimension && m == MATCH_NO)
5726         {
5727           gfc_error ("Missing array specification at %L in DIMENSION "
5728                      "statement", &var_locus);
5729           m = MATCH_ERROR;
5730           goto cleanup;
5731         }
5732
5733       if (current_attr.dimension && sym->value)
5734         {
5735           gfc_error ("Dimensions specified for %s at %L after its "
5736                      "initialisation", sym->name, &var_locus);
5737           m = MATCH_ERROR;
5738           goto cleanup;
5739         }
5740
5741       if (current_attr.codimension && m == MATCH_NO)
5742         {
5743           gfc_error ("Missing array specification at %L in CODIMENSION "
5744                      "statement", &var_locus);
5745           m = MATCH_ERROR;
5746           goto cleanup;
5747         }
5748
5749       if ((current_attr.allocatable || current_attr.pointer)
5750           && (m == MATCH_YES) && (as->type != AS_DEFERRED))
5751         {
5752           gfc_error ("Array specification must be deferred at %L", &var_locus);
5753           m = MATCH_ERROR;
5754           goto cleanup;
5755         }
5756     }
5757
5758   /* Update symbol table.  DIMENSION attribute is set in
5759      gfc_set_array_spec().  For CLASS variables, this must be applied
5760      to the first component, or '$data' field.  */
5761   if (sym->ts.type == BT_CLASS && sym->ts.u.derived)
5762     {
5763       gfc_component *comp;
5764       comp = gfc_find_component (sym->ts.u.derived, "$data", true, true);
5765       if (comp == NULL || gfc_copy_attr (&comp->attr, &current_attr,
5766                                          &var_locus) == FAILURE)
5767         {
5768           m = MATCH_ERROR;
5769           goto cleanup;
5770         }
5771       sym->attr.class_ok = (sym->attr.class_ok
5772                               || current_attr.allocatable
5773                               || current_attr.pointer);
5774     }
5775   else
5776     {
5777       if (current_attr.dimension == 0 && current_attr.codimension == 0
5778           && gfc_copy_attr (&sym->attr, &current_attr, &var_locus) == FAILURE)
5779         {
5780           m = MATCH_ERROR;
5781           goto cleanup;
5782         }
5783     }
5784
5785   if (gfc_set_array_spec (sym, as, &var_locus) == FAILURE)
5786     {
5787       m = MATCH_ERROR;
5788       goto cleanup;
5789     }
5790
5791   if (sym->attr.cray_pointee && sym->as != NULL)
5792     {
5793       /* Fix the array spec.  */
5794       m = gfc_mod_pointee_as (sym->as);         
5795       if (m == MATCH_ERROR)
5796         goto cleanup;
5797     }
5798
5799   if (gfc_add_attribute (&sym->attr, &var_locus) == FAILURE)
5800     {
5801       m = MATCH_ERROR;
5802       goto cleanup;
5803     }
5804
5805   if ((current_attr.external || current_attr.intrinsic)
5806       && sym->attr.flavor != FL_PROCEDURE
5807       && gfc_add_flavor (&sym->attr, FL_PROCEDURE, sym->name, NULL) == FAILURE)
5808     {
5809       m = MATCH_ERROR;
5810       goto cleanup;
5811     }
5812
5813   add_hidden_procptr_result (sym);
5814
5815   return MATCH_YES;
5816
5817 cleanup:
5818   gfc_free_array_spec (as);
5819   return m;
5820 }
5821
5822
5823 /* Generic attribute declaration subroutine.  Used for attributes that
5824    just have a list of names.  */
5825
5826 static match
5827 attr_decl (void)
5828 {
5829   match m;
5830
5831   /* Gobble the optional double colon, by simply ignoring the result
5832      of gfc_match().  */
5833   gfc_match (" ::");
5834
5835   for (;;)
5836     {
5837       m = attr_decl1 ();
5838       if (m != MATCH_YES)
5839         break;
5840
5841       if (gfc_match_eos () == MATCH_YES)
5842         {
5843           m = MATCH_YES;
5844           break;
5845         }
5846
5847       if (gfc_match_char (',') != MATCH_YES)
5848         {
5849           gfc_error ("Unexpected character in variable list at %C");
5850           m = MATCH_ERROR;
5851           break;
5852         }
5853     }
5854
5855   return m;
5856 }
5857
5858
5859 /* This routine matches Cray Pointer declarations of the form:
5860    pointer ( <pointer>, <pointee> )
5861    or
5862    pointer ( <pointer1>, <pointee1> ), ( <pointer2>, <pointee2> ), ...
5863    The pointer, if already declared, should be an integer.  Otherwise, we
5864    set it as BT_INTEGER with kind gfc_index_integer_kind.  The pointee may
5865    be either a scalar, or an array declaration.  No space is allocated for
5866    the pointee.  For the statement
5867    pointer (ipt, ar(10))
5868    any subsequent uses of ar will be translated (in C-notation) as
5869    ar(i) => ((<type> *) ipt)(i)
5870    After gimplification, pointee variable will disappear in the code.  */
5871
5872 static match
5873 cray_pointer_decl (void)
5874 {
5875   match m;
5876   gfc_array_spec *as = NULL;
5877   gfc_symbol *cptr; /* Pointer symbol.  */
5878   gfc_symbol *cpte; /* Pointee symbol.  */
5879   locus var_locus;
5880   bool done = false;
5881
5882   while (!done)
5883     {
5884       if (gfc_match_char ('(') != MATCH_YES)
5885         {
5886           gfc_error ("Expected '(' at %C");
5887           return MATCH_ERROR;
5888         }
5889
5890       /* Match pointer.  */
5891       var_locus = gfc_current_locus;
5892       gfc_clear_attr (&current_attr);
5893       gfc_add_cray_pointer (&current_attr, &var_locus);
5894       current_ts.type = BT_INTEGER;
5895       current_ts.kind = gfc_index_integer_kind;
5896
5897       m = gfc_match_symbol (&cptr, 0);
5898       if (m != MATCH_YES)
5899         {
5900           gfc_error ("Expected variable name at %C");
5901           return m;
5902         }
5903
5904       if (gfc_add_cray_pointer (&cptr->attr, &var_locus) == FAILURE)
5905         return MATCH_ERROR;
5906
5907       gfc_set_sym_referenced (cptr);
5908
5909       if (cptr->ts.type == BT_UNKNOWN) /* Override the type, if necessary.  */
5910         {
5911           cptr->ts.type = BT_INTEGER;
5912           cptr->ts.kind = gfc_index_integer_kind;
5913         }
5914       else if (cptr->ts.type != BT_INTEGER)
5915         {
5916           gfc_error ("Cray pointer at %C must be an integer");
5917           return MATCH_ERROR;
5918         }
5919       else if (cptr->ts.kind < gfc_index_integer_kind)
5920         gfc_warning ("Cray pointer at %C has %d bytes of precision;"
5921                      " memory addresses require %d bytes",
5922                      cptr->ts.kind, gfc_index_integer_kind);
5923
5924       if (gfc_match_char (',') != MATCH_YES)
5925         {
5926           gfc_error ("Expected \",\" at %C");
5927           return MATCH_ERROR;
5928         }
5929
5930       /* Match Pointee.  */
5931       var_locus = gfc_current_locus;
5932       gfc_clear_attr (&current_attr);
5933       gfc_add_cray_pointee (&current_attr, &var_locus);
5934       current_ts.type = BT_UNKNOWN;
5935       current_ts.kind = 0;
5936
5937       m = gfc_match_symbol (&cpte, 0);
5938       if (m != MATCH_YES)
5939         {
5940           gfc_error ("Expected variable name at %C");
5941           return m;
5942         }
5943
5944       /* Check for an optional array spec.  */
5945       m = gfc_match_array_spec (&as, true, false);
5946       if (m == MATCH_ERROR)
5947         {
5948           gfc_free_array_spec (as);
5949           return m;
5950         }
5951       else if (m == MATCH_NO)
5952         {
5953           gfc_free_array_spec (as);
5954           as = NULL;
5955         }   
5956
5957       if (gfc_add_cray_pointee (&cpte->attr, &var_locus) == FAILURE)
5958         return MATCH_ERROR;
5959
5960       gfc_set_sym_referenced (cpte);
5961
5962       if (cpte->as == NULL)
5963         {
5964           if (gfc_set_array_spec (cpte, as, &var_locus) == FAILURE)
5965             gfc_internal_error ("Couldn't set Cray pointee array spec.");
5966         }
5967       else if (as != NULL)
5968         {
5969           gfc_error ("Duplicate array spec for Cray pointee at %C");
5970           gfc_free_array_spec (as);
5971           return MATCH_ERROR;
5972         }
5973       
5974       as = NULL;
5975     
5976       if (cpte->as != NULL)
5977         {
5978           /* Fix array spec.  */
5979           m = gfc_mod_pointee_as (cpte->as);
5980           if (m == MATCH_ERROR)
5981             return m;
5982         } 
5983    
5984       /* Point the Pointee at the Pointer.  */
5985       cpte->cp_pointer = cptr;
5986
5987       if (gfc_match_char (')') != MATCH_YES)
5988         {
5989           gfc_error ("Expected \")\" at %C");
5990           return MATCH_ERROR;    
5991         }
5992       m = gfc_match_char (',');
5993       if (m != MATCH_YES)
5994         done = true; /* Stop searching for more declarations.  */
5995
5996     }
5997   
5998   if (m == MATCH_ERROR /* Failed when trying to find ',' above.  */
5999       || gfc_match_eos () != MATCH_YES)
6000     {
6001       gfc_error ("Expected \",\" or end of statement at %C");
6002       return MATCH_ERROR;
6003     }
6004   return MATCH_YES;
6005 }
6006
6007
6008 match
6009 gfc_match_external (void)
6010 {
6011
6012   gfc_clear_attr (&current_attr);
6013   current_attr.external = 1;
6014
6015   return attr_decl ();
6016 }
6017
6018
6019 match
6020 gfc_match_intent (void)
6021 {
6022   sym_intent intent;
6023
6024   /* This is not allowed within a BLOCK construct!  */
6025   if (gfc_current_state () == COMP_BLOCK)
6026     {
6027       gfc_error ("INTENT is not allowed inside of BLOCK at %C");
6028       return MATCH_ERROR;
6029     }
6030
6031   intent = match_intent_spec ();
6032   if (intent == INTENT_UNKNOWN)
6033     return MATCH_ERROR;
6034
6035   gfc_clear_attr (&current_attr);
6036   current_attr.intent = intent;
6037
6038   return attr_decl ();
6039 }
6040
6041
6042 match
6043 gfc_match_intrinsic (void)
6044 {
6045
6046   gfc_clear_attr (&current_attr);
6047   current_attr.intrinsic = 1;
6048
6049   return attr_decl ();
6050 }
6051
6052
6053 match
6054 gfc_match_optional (void)
6055 {
6056   /* This is not allowed within a BLOCK construct!  */
6057   if (gfc_current_state () == COMP_BLOCK)
6058     {
6059       gfc_error ("OPTIONAL is not allowed inside of BLOCK at %C");
6060       return MATCH_ERROR;
6061     }
6062
6063   gfc_clear_attr (&current_attr);
6064   current_attr.optional = 1;
6065
6066   return attr_decl ();
6067 }
6068
6069
6070 match
6071 gfc_match_pointer (void)
6072 {
6073   gfc_gobble_whitespace ();
6074   if (gfc_peek_ascii_char () == '(')
6075     {
6076       if (!gfc_option.flag_cray_pointer)
6077         {
6078           gfc_error ("Cray pointer declaration at %C requires -fcray-pointer "
6079                      "flag");
6080           return MATCH_ERROR;
6081         }
6082       return cray_pointer_decl ();
6083     }
6084   else
6085     {
6086       gfc_clear_attr (&current_attr);
6087       current_attr.pointer = 1;
6088     
6089       return attr_decl ();
6090     }
6091 }
6092
6093
6094 match
6095 gfc_match_allocatable (void)
6096 {
6097   gfc_clear_attr (&current_attr);
6098   current_attr.allocatable = 1;
6099
6100   return attr_decl ();
6101 }
6102
6103
6104 match
6105 gfc_match_codimension (void)
6106 {
6107   gfc_clear_attr (&current_attr);
6108   current_attr.codimension = 1;
6109
6110   return attr_decl ();
6111 }
6112
6113
6114 match
6115 gfc_match_dimension (void)
6116 {
6117   gfc_clear_attr (&current_attr);
6118   current_attr.dimension = 1;
6119
6120   return attr_decl ();
6121 }
6122
6123
6124 match
6125 gfc_match_target (void)
6126 {
6127   gfc_clear_attr (&current_attr);
6128   current_attr.target = 1;
6129
6130   return attr_decl ();
6131 }
6132
6133
6134 /* Match the list of entities being specified in a PUBLIC or PRIVATE
6135    statement.  */
6136
6137 static match
6138 access_attr_decl (gfc_statement st)
6139 {
6140   char name[GFC_MAX_SYMBOL_LEN + 1];
6141   interface_type type;
6142   gfc_user_op *uop;
6143   gfc_symbol *sym;
6144   gfc_intrinsic_op op;
6145   match m;
6146
6147   if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
6148     goto done;
6149
6150   for (;;)
6151     {
6152       m = gfc_match_generic_spec (&type, name, &op);
6153       if (m == MATCH_NO)
6154         goto syntax;
6155       if (m == MATCH_ERROR)
6156         return MATCH_ERROR;
6157
6158       switch (type)
6159         {
6160         case INTERFACE_NAMELESS:
6161         case INTERFACE_ABSTRACT:
6162           goto syntax;
6163
6164         case INTERFACE_GENERIC:
6165           if (gfc_get_symbol (name, NULL, &sym))
6166             goto done;
6167
6168           if (gfc_add_access (&sym->attr, (st == ST_PUBLIC)
6169                                           ? ACCESS_PUBLIC : ACCESS_PRIVATE,
6170                               sym->name, NULL) == FAILURE)
6171             return MATCH_ERROR;
6172
6173           break;
6174
6175         case INTERFACE_INTRINSIC_OP:
6176           if (gfc_current_ns->operator_access[op] == ACCESS_UNKNOWN)
6177             {
6178               gfc_current_ns->operator_access[op] =
6179                 (st == ST_PUBLIC) ? ACCESS_PUBLIC : ACCESS_PRIVATE;
6180             }
6181           else
6182             {
6183               gfc_error ("Access specification of the %s operator at %C has "
6184                          "already been specified", gfc_op2string (op));
6185               goto done;
6186             }
6187
6188           break;
6189
6190         case INTERFACE_USER_OP:
6191           uop = gfc_get_uop (name);
6192
6193           if (uop->access == ACCESS_UNKNOWN)
6194             {
6195               uop->access = (st == ST_PUBLIC)
6196                           ? ACCESS_PUBLIC : ACCESS_PRIVATE;
6197             }
6198           else
6199             {
6200               gfc_error ("Access specification of the .%s. operator at %C "
6201                          "has already been specified", sym->name);
6202               goto done;
6203             }
6204
6205           break;
6206         }
6207
6208       if (gfc_match_char (',') == MATCH_NO)
6209         break;
6210     }
6211
6212   if (gfc_match_eos () != MATCH_YES)
6213     goto syntax;
6214   return MATCH_YES;
6215
6216 syntax:
6217   gfc_syntax_error (st);
6218
6219 done:
6220   return MATCH_ERROR;
6221 }
6222
6223
6224 match
6225 gfc_match_protected (void)
6226 {
6227   gfc_symbol *sym;
6228   match m;
6229
6230   if (gfc_current_ns->proc_name->attr.flavor != FL_MODULE)
6231     {
6232        gfc_error ("PROTECTED at %C only allowed in specification "
6233                   "part of a module");
6234        return MATCH_ERROR;
6235
6236     }
6237
6238   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: PROTECTED statement at %C")
6239       == FAILURE)
6240     return MATCH_ERROR;
6241
6242   if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
6243     {
6244       return MATCH_ERROR;
6245     }
6246
6247   if (gfc_match_eos () == MATCH_YES)
6248     goto syntax;
6249
6250   for(;;)
6251     {
6252       m = gfc_match_symbol (&sym, 0);
6253       switch (m)
6254         {
6255         case MATCH_YES:
6256           if (gfc_add_protected (&sym->attr, sym->name, &gfc_current_locus)
6257               == FAILURE)
6258             return MATCH_ERROR;
6259           goto next_item;
6260
6261         case MATCH_NO:
6262           break;
6263
6264         case MATCH_ERROR:
6265           return MATCH_ERROR;
6266         }
6267
6268     next_item:
6269       if (gfc_match_eos () == MATCH_YES)
6270         break;
6271       if (gfc_match_char (',') != MATCH_YES)
6272         goto syntax;
6273     }
6274
6275   return MATCH_YES;
6276
6277 syntax:
6278   gfc_error ("Syntax error in PROTECTED statement at %C");
6279   return MATCH_ERROR;
6280 }
6281
6282
6283 /* The PRIVATE statement is a bit weird in that it can be an attribute
6284    declaration, but also works as a standalone statement inside of a
6285    type declaration or a module.  */
6286
6287 match
6288 gfc_match_private (gfc_statement *st)
6289 {
6290
6291   if (gfc_match ("private") != MATCH_YES)
6292     return MATCH_NO;
6293
6294   if (gfc_current_state () != COMP_MODULE
6295       && !(gfc_current_state () == COMP_DERIVED
6296            && gfc_state_stack->previous
6297            && gfc_state_stack->previous->state == COMP_MODULE)
6298       && !(gfc_current_state () == COMP_DERIVED_CONTAINS
6299            && gfc_state_stack->previous && gfc_state_stack->previous->previous
6300            && gfc_state_stack->previous->previous->state == COMP_MODULE))
6301     {
6302       gfc_error ("PRIVATE statement at %C is only allowed in the "
6303                  "specification part of a module");
6304       return MATCH_ERROR;
6305     }
6306
6307   if (gfc_current_state () == COMP_DERIVED)
6308     {
6309       if (gfc_match_eos () == MATCH_YES)
6310         {
6311           *st = ST_PRIVATE;
6312           return MATCH_YES;
6313         }
6314
6315       gfc_syntax_error (ST_PRIVATE);
6316       return MATCH_ERROR;
6317     }
6318
6319   if (gfc_match_eos () == MATCH_YES)
6320     {
6321       *st = ST_PRIVATE;
6322       return MATCH_YES;
6323     }
6324
6325   *st = ST_ATTR_DECL;
6326   return access_attr_decl (ST_PRIVATE);
6327 }
6328
6329
6330 match
6331 gfc_match_public (gfc_statement *st)
6332 {
6333
6334   if (gfc_match ("public") != MATCH_YES)
6335     return MATCH_NO;
6336
6337   if (gfc_current_state () != COMP_MODULE)
6338     {
6339       gfc_error ("PUBLIC statement at %C is only allowed in the "
6340                  "specification part of a module");
6341       return MATCH_ERROR;
6342     }
6343
6344   if (gfc_match_eos () == MATCH_YES)
6345     {
6346       *st = ST_PUBLIC;
6347       return MATCH_YES;
6348     }
6349
6350   *st = ST_ATTR_DECL;
6351   return access_attr_decl (ST_PUBLIC);
6352 }
6353
6354
6355 /* Workhorse for gfc_match_parameter.  */
6356
6357 static match
6358 do_parm (void)
6359 {
6360   gfc_symbol *sym;
6361   gfc_expr *init;
6362   match m;
6363   gfc_try t;
6364
6365   m = gfc_match_symbol (&sym, 0);
6366   if (m == MATCH_NO)
6367     gfc_error ("Expected variable name at %C in PARAMETER statement");
6368
6369   if (m != MATCH_YES)
6370     return m;
6371
6372   if (gfc_match_char ('=') == MATCH_NO)
6373     {
6374       gfc_error ("Expected = sign in PARAMETER statement at %C");
6375       return MATCH_ERROR;
6376     }
6377
6378   m = gfc_match_init_expr (&init);
6379   if (m == MATCH_NO)
6380     gfc_error ("Expected expression at %C in PARAMETER statement");
6381   if (m != MATCH_YES)
6382     return m;
6383
6384   if (sym->ts.type == BT_UNKNOWN
6385       && gfc_set_default_type (sym, 1, NULL) == FAILURE)
6386     {
6387       m = MATCH_ERROR;
6388       goto cleanup;
6389     }
6390
6391   if (gfc_check_assign_symbol (sym, init) == FAILURE
6392       || gfc_add_flavor (&sym->attr, FL_PARAMETER, sym->name, NULL) == FAILURE)
6393     {
6394       m = MATCH_ERROR;
6395       goto cleanup;
6396     }
6397
6398   if (sym->value)
6399     {
6400       gfc_error ("Initializing already initialized variable at %C");
6401       m = MATCH_ERROR;
6402       goto cleanup;
6403     }
6404
6405   t = add_init_expr_to_sym (sym->name, &init, &gfc_current_locus);
6406   return (t == SUCCESS) ? MATCH_YES : MATCH_ERROR;
6407
6408 cleanup:
6409   gfc_free_expr (init);
6410   return m;
6411 }
6412
6413
6414 /* Match a parameter statement, with the weird syntax that these have.  */
6415
6416 match
6417 gfc_match_parameter (void)
6418 {
6419   match m;
6420
6421   if (gfc_match_char ('(') == MATCH_NO)
6422     return MATCH_NO;
6423
6424   for (;;)
6425     {
6426       m = do_parm ();
6427       if (m != MATCH_YES)
6428         break;
6429
6430       if (gfc_match (" )%t") == MATCH_YES)
6431         break;
6432
6433       if (gfc_match_char (',') != MATCH_YES)
6434         {
6435           gfc_error ("Unexpected characters in PARAMETER statement at %C");
6436           m = MATCH_ERROR;
6437           break;
6438         }
6439     }
6440
6441   return m;
6442 }
6443
6444
6445 /* Save statements have a special syntax.  */
6446
6447 match
6448 gfc_match_save (void)
6449 {
6450   char n[GFC_MAX_SYMBOL_LEN+1];
6451   gfc_common_head *c;
6452   gfc_symbol *sym;
6453   match m;
6454
6455   if (gfc_match_eos () == MATCH_YES)
6456     {
6457       if (gfc_current_ns->seen_save)
6458         {
6459           if (gfc_notify_std (GFC_STD_LEGACY, "Blanket SAVE statement at %C "
6460                               "follows previous SAVE statement")
6461               == FAILURE)
6462             return MATCH_ERROR;
6463         }
6464
6465       gfc_current_ns->save_all = gfc_current_ns->seen_save = 1;
6466       return MATCH_YES;
6467     }
6468
6469   if (gfc_current_ns->save_all)
6470     {
6471       if (gfc_notify_std (GFC_STD_LEGACY, "SAVE statement at %C follows "
6472                           "blanket SAVE statement")
6473           == FAILURE)
6474         return MATCH_ERROR;
6475     }
6476
6477   gfc_match (" ::");
6478
6479   for (;;)
6480     {
6481       m = gfc_match_symbol (&sym, 0);
6482       switch (m)
6483         {
6484         case MATCH_YES:
6485           if (gfc_add_save (&sym->attr, sym->name, &gfc_current_locus)
6486               == FAILURE)
6487             return MATCH_ERROR;
6488           goto next_item;
6489
6490         case MATCH_NO:
6491           break;
6492
6493         case MATCH_ERROR:
6494           return MATCH_ERROR;
6495         }
6496
6497       m = gfc_match (" / %n /", &n);
6498       if (m == MATCH_ERROR)
6499         return MATCH_ERROR;
6500       if (m == MATCH_NO)
6501         goto syntax;
6502
6503       c = gfc_get_common (n, 0);
6504       c->saved = 1;
6505
6506       gfc_current_ns->seen_save = 1;
6507
6508     next_item:
6509       if (gfc_match_eos () == MATCH_YES)
6510         break;
6511       if (gfc_match_char (',') != MATCH_YES)
6512         goto syntax;
6513     }
6514
6515   return MATCH_YES;
6516
6517 syntax:
6518   gfc_error ("Syntax error in SAVE statement at %C");
6519   return MATCH_ERROR;
6520 }
6521
6522
6523 match
6524 gfc_match_value (void)
6525 {
6526   gfc_symbol *sym;
6527   match m;
6528
6529   /* This is not allowed within a BLOCK construct!  */
6530   if (gfc_current_state () == COMP_BLOCK)
6531     {
6532       gfc_error ("VALUE is not allowed inside of BLOCK at %C");
6533       return MATCH_ERROR;
6534     }
6535
6536   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: VALUE statement at %C")
6537       == FAILURE)
6538     return MATCH_ERROR;
6539
6540   if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
6541     {
6542       return MATCH_ERROR;
6543     }
6544
6545   if (gfc_match_eos () == MATCH_YES)
6546     goto syntax;
6547
6548   for(;;)
6549     {
6550       m = gfc_match_symbol (&sym, 0);
6551       switch (m)
6552         {
6553         case MATCH_YES:
6554           if (gfc_add_value (&sym->attr, sym->name, &gfc_current_locus)
6555               == FAILURE)
6556             return MATCH_ERROR;
6557           goto next_item;
6558
6559         case MATCH_NO:
6560           break;
6561
6562         case MATCH_ERROR:
6563           return MATCH_ERROR;
6564         }
6565
6566     next_item:
6567       if (gfc_match_eos () == MATCH_YES)
6568         break;
6569       if (gfc_match_char (',') != MATCH_YES)
6570         goto syntax;
6571     }
6572
6573   return MATCH_YES;
6574
6575 syntax:
6576   gfc_error ("Syntax error in VALUE statement at %C");
6577   return MATCH_ERROR;
6578 }
6579
6580
6581 match
6582 gfc_match_volatile (void)
6583 {
6584   gfc_symbol *sym;
6585   match m;
6586
6587   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: VOLATILE statement at %C")
6588       == FAILURE)
6589     return MATCH_ERROR;
6590
6591   if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
6592     {
6593       return MATCH_ERROR;
6594     }
6595
6596   if (gfc_match_eos () == MATCH_YES)
6597     goto syntax;
6598
6599   for(;;)
6600     {
6601       /* VOLATILE is special because it can be added to host-associated 
6602          symbols locally. Except for coarrays. */
6603       m = gfc_match_symbol (&sym, 1);
6604       switch (m)
6605         {
6606         case MATCH_YES:
6607           /* F2008, C560+C561. VOLATILE for host-/use-associated variable or
6608              for variable in a BLOCK which is defined outside of the BLOCK.  */
6609           if (sym->ns != gfc_current_ns && sym->attr.codimension)
6610             {
6611               gfc_error ("Specifying VOLATILE for coarray variable '%s' at "
6612                          "%C, which is use-/host-associated", sym->name);
6613               return MATCH_ERROR;
6614             }
6615           if (gfc_add_volatile (&sym->attr, sym->name, &gfc_current_locus)
6616               == FAILURE)
6617             return MATCH_ERROR;
6618           goto next_item;
6619
6620         case MATCH_NO:
6621           break;
6622
6623         case MATCH_ERROR:
6624           return MATCH_ERROR;
6625         }
6626
6627     next_item:
6628       if (gfc_match_eos () == MATCH_YES)
6629         break;
6630       if (gfc_match_char (',') != MATCH_YES)
6631         goto syntax;
6632     }
6633
6634   return MATCH_YES;
6635
6636 syntax:
6637   gfc_error ("Syntax error in VOLATILE statement at %C");
6638   return MATCH_ERROR;
6639 }
6640
6641
6642 match
6643 gfc_match_asynchronous (void)
6644 {
6645   gfc_symbol *sym;
6646   match m;
6647
6648   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ASYNCHRONOUS statement at %C")
6649       == FAILURE)
6650     return MATCH_ERROR;
6651
6652   if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
6653     {
6654       return MATCH_ERROR;
6655     }
6656
6657   if (gfc_match_eos () == MATCH_YES)
6658     goto syntax;
6659
6660   for(;;)
6661     {
6662       /* ASYNCHRONOUS is special because it can be added to host-associated 
6663          symbols locally.  */
6664       m = gfc_match_symbol (&sym, 1);
6665       switch (m)
6666         {
6667         case MATCH_YES:
6668           if (gfc_add_asynchronous (&sym->attr, sym->name, &gfc_current_locus)
6669               == FAILURE)
6670             return MATCH_ERROR;
6671           goto next_item;
6672
6673         case MATCH_NO:
6674           break;
6675
6676         case MATCH_ERROR:
6677           return MATCH_ERROR;
6678         }
6679
6680     next_item:
6681       if (gfc_match_eos () == MATCH_YES)
6682         break;
6683       if (gfc_match_char (',') != MATCH_YES)
6684         goto syntax;
6685     }
6686
6687   return MATCH_YES;
6688
6689 syntax:
6690   gfc_error ("Syntax error in ASYNCHRONOUS statement at %C");
6691   return MATCH_ERROR;
6692 }
6693
6694
6695 /* Match a module procedure statement.  Note that we have to modify
6696    symbols in the parent's namespace because the current one was there
6697    to receive symbols that are in an interface's formal argument list.  */
6698
6699 match
6700 gfc_match_modproc (void)
6701 {
6702   char name[GFC_MAX_SYMBOL_LEN + 1];
6703   gfc_symbol *sym;
6704   match m;
6705   gfc_namespace *module_ns;
6706   gfc_interface *old_interface_head, *interface;
6707
6708   if (gfc_state_stack->state != COMP_INTERFACE
6709       || gfc_state_stack->previous == NULL
6710       || current_interface.type == INTERFACE_NAMELESS
6711       || current_interface.type == INTERFACE_ABSTRACT)
6712     {
6713       gfc_error ("MODULE PROCEDURE at %C must be in a generic module "
6714                  "interface");
6715       return MATCH_ERROR;
6716     }
6717
6718   module_ns = gfc_current_ns->parent;
6719   for (; module_ns; module_ns = module_ns->parent)
6720     if (module_ns->proc_name->attr.flavor == FL_MODULE
6721         || module_ns->proc_name->attr.flavor == FL_PROGRAM
6722         || (module_ns->proc_name->attr.flavor == FL_PROCEDURE
6723             && !module_ns->proc_name->attr.contained))
6724       break;
6725
6726   if (module_ns == NULL)
6727     return MATCH_ERROR;
6728
6729   /* Store the current state of the interface. We will need it if we
6730      end up with a syntax error and need to recover.  */
6731   old_interface_head = gfc_current_interface_head ();
6732
6733   for (;;)
6734     {
6735       locus old_locus = gfc_current_locus;
6736       bool last = false;
6737
6738       m = gfc_match_name (name);
6739       if (m == MATCH_NO)
6740         goto syntax;
6741       if (m != MATCH_YES)
6742         return MATCH_ERROR;
6743
6744       /* Check for syntax error before starting to add symbols to the
6745          current namespace.  */
6746       if (gfc_match_eos () == MATCH_YES)
6747         last = true;
6748       if (!last && gfc_match_char (',') != MATCH_YES)
6749         goto syntax;
6750
6751       /* Now we're sure the syntax is valid, we process this item
6752          further.  */
6753       if (gfc_get_symbol (name, module_ns, &sym))
6754         return MATCH_ERROR;
6755
6756       if (sym->attr.intrinsic)
6757         {
6758           gfc_error ("Intrinsic procedure at %L cannot be a MODULE "
6759                      "PROCEDURE", &old_locus);
6760           return MATCH_ERROR;
6761         }
6762
6763       if (sym->attr.proc != PROC_MODULE
6764           && gfc_add_procedure (&sym->attr, PROC_MODULE,
6765                                 sym->name, NULL) == FAILURE)
6766         return MATCH_ERROR;
6767
6768       if (gfc_add_interface (sym) == FAILURE)
6769         return MATCH_ERROR;
6770
6771       sym->attr.mod_proc = 1;
6772       sym->declared_at = old_locus;
6773
6774       if (last)
6775         break;
6776     }
6777
6778   return MATCH_YES;
6779
6780 syntax:
6781   /* Restore the previous state of the interface.  */
6782   interface = gfc_current_interface_head ();
6783   gfc_set_current_interface_head (old_interface_head);
6784
6785   /* Free the new interfaces.  */
6786   while (interface != old_interface_head)
6787   {
6788     gfc_interface *i = interface->next;
6789     gfc_free (interface);
6790     interface = i;
6791   }
6792
6793   /* And issue a syntax error.  */
6794   gfc_syntax_error (ST_MODULE_PROC);
6795   return MATCH_ERROR;
6796 }
6797
6798
6799 /* Check a derived type that is being extended.  */
6800 static gfc_symbol*
6801 check_extended_derived_type (char *name)
6802 {
6803   gfc_symbol *extended;
6804
6805   if (gfc_find_symbol (name, gfc_current_ns, 1, &extended))
6806     {
6807       gfc_error ("Ambiguous symbol in TYPE definition at %C");
6808       return NULL;
6809     }
6810
6811   if (!extended)
6812     {
6813       gfc_error ("No such symbol in TYPE definition at %C");
6814       return NULL;
6815     }
6816
6817   if (extended->attr.flavor != FL_DERIVED)
6818     {
6819       gfc_error ("'%s' in EXTENDS expression at %C is not a "
6820                  "derived type", name);
6821       return NULL;
6822     }
6823
6824   if (extended->attr.is_bind_c)
6825     {
6826       gfc_error ("'%s' cannot be extended at %C because it "
6827                  "is BIND(C)", extended->name);
6828       return NULL;
6829     }
6830
6831   if (extended->attr.sequence)
6832     {
6833       gfc_error ("'%s' cannot be extended at %C because it "
6834                  "is a SEQUENCE type", extended->name);
6835       return NULL;
6836     }
6837
6838   return extended;
6839 }
6840
6841
6842 /* Match the optional attribute specifiers for a type declaration.
6843    Return MATCH_ERROR if an error is encountered in one of the handled
6844    attributes (public, private, bind(c)), MATCH_NO if what's found is
6845    not a handled attribute, and MATCH_YES otherwise.  TODO: More error
6846    checking on attribute conflicts needs to be done.  */
6847
6848 match
6849 gfc_get_type_attr_spec (symbol_attribute *attr, char *name)
6850 {
6851   /* See if the derived type is marked as private.  */
6852   if (gfc_match (" , private") == MATCH_YES)
6853     {
6854       if (gfc_current_state () != COMP_MODULE)
6855         {
6856           gfc_error ("Derived type at %C can only be PRIVATE in the "
6857                      "specification part of a module");
6858           return MATCH_ERROR;
6859         }
6860
6861       if (gfc_add_access (attr, ACCESS_PRIVATE, NULL, NULL) == FAILURE)
6862         return MATCH_ERROR;
6863     }
6864   else if (gfc_match (" , public") == MATCH_YES)
6865     {
6866       if (gfc_current_state () != COMP_MODULE)
6867         {
6868           gfc_error ("Derived type at %C can only be PUBLIC in the "
6869                      "specification part of a module");
6870           return MATCH_ERROR;
6871         }
6872
6873       if (gfc_add_access (attr, ACCESS_PUBLIC, NULL, NULL) == FAILURE)
6874         return MATCH_ERROR;
6875     }
6876   else if (gfc_match (" , bind ( c )") == MATCH_YES)
6877     {
6878       /* If the type is defined to be bind(c) it then needs to make
6879          sure that all fields are interoperable.  This will
6880          need to be a semantic check on the finished derived type.
6881          See 15.2.3 (lines 9-12) of F2003 draft.  */
6882       if (gfc_add_is_bind_c (attr, NULL, &gfc_current_locus, 0) != SUCCESS)
6883         return MATCH_ERROR;
6884
6885       /* TODO: attr conflicts need to be checked, probably in symbol.c.  */
6886     }
6887   else if (gfc_match (" , abstract") == MATCH_YES)
6888     {
6889       if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ABSTRACT type at %C")
6890             == FAILURE)
6891         return MATCH_ERROR;
6892
6893       if (gfc_add_abstract (attr, &gfc_current_locus) == FAILURE)
6894         return MATCH_ERROR;
6895     }
6896   else if (name && gfc_match(" , extends ( %n )", name) == MATCH_YES)
6897     {
6898       if (gfc_add_extension (attr, &gfc_current_locus) == FAILURE)
6899         return MATCH_ERROR;
6900     }
6901   else
6902     return MATCH_NO;
6903
6904   /* If we get here, something matched.  */
6905   return MATCH_YES;
6906 }
6907
6908
6909 /* Assign a hash value for a derived type. The algorithm is that of
6910    SDBM. The hashed string is '[module_name #] derived_name'.  */
6911 static unsigned int
6912 hash_value (gfc_symbol *sym)
6913 {
6914   unsigned int hash = 0;
6915   const char *c;
6916   int i, len;
6917
6918   /* Hash of the module or procedure name.  */
6919   if (sym->module != NULL)
6920     c = sym->module;
6921   else if (sym->ns && sym->ns->proc_name
6922              && sym->ns->proc_name->attr.flavor == FL_MODULE)
6923     c = sym->ns->proc_name->name;
6924   else
6925     c = NULL;
6926
6927   if (c)
6928     { 
6929       len = strlen (c);
6930       for (i = 0; i < len; i++, c++)
6931         hash =  (hash << 6) + (hash << 16) - hash + (*c);
6932
6933       /* Disambiguate between 'a' in 'aa' and 'aa' in 'a'.  */ 
6934       hash =  (hash << 6) + (hash << 16) - hash + '#';
6935     }
6936
6937   /* Hash of the derived type name.  */
6938   len = strlen (sym->name);
6939   c = sym->name;
6940   for (i = 0; i < len; i++, c++)
6941     hash = (hash << 6) + (hash << 16) - hash + (*c);
6942
6943   /* Return the hash but take the modulus for the sake of module read,
6944      even though this slightly increases the chance of collision.  */
6945   return (hash % 100000000);
6946 }
6947
6948
6949 /* Match the beginning of a derived type declaration.  If a type name
6950    was the result of a function, then it is possible to have a symbol
6951    already to be known as a derived type yet have no components.  */
6952
6953 match
6954 gfc_match_derived_decl (void)
6955 {
6956   char name[GFC_MAX_SYMBOL_LEN + 1];
6957   char parent[GFC_MAX_SYMBOL_LEN + 1];
6958   symbol_attribute attr;
6959   gfc_symbol *sym;
6960   gfc_symbol *extended;
6961   match m;
6962   match is_type_attr_spec = MATCH_NO;
6963   bool seen_attr = false;
6964
6965   if (gfc_current_state () == COMP_DERIVED)
6966     return MATCH_NO;
6967
6968   name[0] = '\0';
6969   parent[0] = '\0';
6970   gfc_clear_attr (&attr);
6971   extended = NULL;
6972
6973   do
6974     {
6975       is_type_attr_spec = gfc_get_type_attr_spec (&attr, parent);
6976       if (is_type_attr_spec == MATCH_ERROR)
6977         return MATCH_ERROR;
6978       if (is_type_attr_spec == MATCH_YES)
6979         seen_attr = true;
6980     } while (is_type_attr_spec == MATCH_YES);
6981
6982   /* Deal with derived type extensions.  The extension attribute has
6983      been added to 'attr' but now the parent type must be found and
6984      checked.  */
6985   if (parent[0])
6986     extended = check_extended_derived_type (parent);
6987
6988   if (parent[0] && !extended)
6989     return MATCH_ERROR;
6990
6991   if (gfc_match (" ::") != MATCH_YES && seen_attr)
6992     {
6993       gfc_error ("Expected :: in TYPE definition at %C");
6994       return MATCH_ERROR;
6995     }
6996
6997   m = gfc_match (" %n%t", name);
6998   if (m != MATCH_YES)
6999     return m;
7000
7001   /* Make sure the name is not the name of an intrinsic type.  */
7002   if (gfc_is_intrinsic_typename (name))
7003     {
7004       gfc_error ("Type name '%s' at %C cannot be the same as an intrinsic "
7005                  "type", name);
7006       return MATCH_ERROR;
7007     }
7008
7009   if (gfc_get_symbol (name, NULL, &sym))
7010     return MATCH_ERROR;
7011
7012   if (sym->ts.type != BT_UNKNOWN)
7013     {
7014       gfc_error ("Derived type name '%s' at %C already has a basic type "
7015                  "of %s", sym->name, gfc_typename (&sym->ts));
7016       return MATCH_ERROR;
7017     }
7018
7019   /* The symbol may already have the derived attribute without the
7020      components.  The ways this can happen is via a function
7021      definition, an INTRINSIC statement or a subtype in another
7022      derived type that is a pointer.  The first part of the AND clause
7023      is true if the symbol is not the return value of a function.  */
7024   if (sym->attr.flavor != FL_DERIVED
7025       && gfc_add_flavor (&sym->attr, FL_DERIVED, sym->name, NULL) == FAILURE)
7026     return MATCH_ERROR;
7027
7028   if (sym->components != NULL || sym->attr.zero_comp)
7029     {
7030       gfc_error ("Derived type definition of '%s' at %C has already been "
7031                  "defined", sym->name);
7032       return MATCH_ERROR;
7033     }
7034
7035   if (attr.access != ACCESS_UNKNOWN
7036       && gfc_add_access (&sym->attr, attr.access, sym->name, NULL) == FAILURE)
7037     return MATCH_ERROR;
7038
7039   /* See if the derived type was labeled as bind(c).  */
7040   if (attr.is_bind_c != 0)
7041     sym->attr.is_bind_c = attr.is_bind_c;
7042
7043   /* Construct the f2k_derived namespace if it is not yet there.  */
7044   if (!sym->f2k_derived)
7045     sym->f2k_derived = gfc_get_namespace (NULL, 0);
7046   
7047   if (extended && !sym->components)
7048     {
7049       gfc_component *p;
7050       gfc_symtree *st;
7051
7052       /* Add the extended derived type as the first component.  */
7053       gfc_add_component (sym, parent, &p);
7054       extended->refs++;
7055       gfc_set_sym_referenced (extended);
7056
7057       p->ts.type = BT_DERIVED;
7058       p->ts.u.derived = extended;
7059       p->initializer = gfc_default_initializer (&p->ts);
7060       
7061       /* Set extension level.  */
7062       if (extended->attr.extension == 255)
7063         {
7064           /* Since the extension field is 8 bit wide, we can only have
7065              up to 255 extension levels.  */
7066           gfc_error ("Maximum extension level reached with type '%s' at %L",
7067                      extended->name, &extended->declared_at);
7068           return MATCH_ERROR;
7069         }
7070       sym->attr.extension = extended->attr.extension + 1;
7071
7072       /* Provide the links between the extended type and its extension.  */
7073       if (!extended->f2k_derived)
7074         extended->f2k_derived = gfc_get_namespace (NULL, 0);
7075       st = gfc_new_symtree (&extended->f2k_derived->sym_root, sym->name);
7076       st->n.sym = sym;
7077     }
7078
7079   if (!sym->hash_value)
7080     /* Set the hash for the compound name for this type.  */
7081     sym->hash_value = hash_value (sym);
7082
7083   /* Take over the ABSTRACT attribute.  */
7084   sym->attr.abstract = attr.abstract;
7085
7086   gfc_new_block = sym;
7087
7088   return MATCH_YES;
7089 }
7090
7091
7092 /* Cray Pointees can be declared as: 
7093       pointer (ipt, a (n,m,...,*))  */
7094
7095 match
7096 gfc_mod_pointee_as (gfc_array_spec *as)
7097 {
7098   as->cray_pointee = true; /* This will be useful to know later.  */
7099   if (as->type == AS_ASSUMED_SIZE)
7100     as->cp_was_assumed = true;
7101   else if (as->type == AS_ASSUMED_SHAPE)
7102     {
7103       gfc_error ("Cray Pointee at %C cannot be assumed shape array");
7104       return MATCH_ERROR;
7105     }
7106   return MATCH_YES;
7107 }
7108
7109
7110 /* Match the enum definition statement, here we are trying to match 
7111    the first line of enum definition statement.  
7112    Returns MATCH_YES if match is found.  */
7113
7114 match
7115 gfc_match_enum (void)
7116 {
7117   match m;
7118   
7119   m = gfc_match_eos ();
7120   if (m != MATCH_YES)
7121     return m;
7122
7123   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ENUM and ENUMERATOR at %C")
7124       == FAILURE)
7125     return MATCH_ERROR;
7126
7127   return MATCH_YES;
7128 }
7129
7130
7131 /* Returns an initializer whose value is one higher than the value of the
7132    LAST_INITIALIZER argument.  If the argument is NULL, the
7133    initializers value will be set to zero.  The initializer's kind
7134    will be set to gfc_c_int_kind.
7135
7136    If -fshort-enums is given, the appropriate kind will be selected
7137    later after all enumerators have been parsed.  A warning is issued
7138    here if an initializer exceeds gfc_c_int_kind.  */
7139
7140 static gfc_expr *
7141 enum_initializer (gfc_expr *last_initializer, locus where)
7142 {
7143   gfc_expr *result;
7144   result = gfc_get_constant_expr (BT_INTEGER, gfc_c_int_kind, &where);
7145
7146   mpz_init (result->value.integer);
7147
7148   if (last_initializer != NULL)
7149     {
7150       mpz_add_ui (result->value.integer, last_initializer->value.integer, 1);
7151       result->where = last_initializer->where;
7152
7153       if (gfc_check_integer_range (result->value.integer,
7154              gfc_c_int_kind) != ARITH_OK)
7155         {
7156           gfc_error ("Enumerator exceeds the C integer type at %C");
7157           return NULL;
7158         }
7159     }
7160   else
7161     {
7162       /* Control comes here, if it's the very first enumerator and no
7163          initializer has been given.  It will be initialized to zero.  */
7164       mpz_set_si (result->value.integer, 0);
7165     }
7166
7167   return result;
7168 }
7169
7170
7171 /* Match a variable name with an optional initializer.  When this
7172    subroutine is called, a variable is expected to be parsed next.
7173    Depending on what is happening at the moment, updates either the
7174    symbol table or the current interface.  */
7175
7176 static match
7177 enumerator_decl (void)
7178 {
7179   char name[GFC_MAX_SYMBOL_LEN + 1];
7180   gfc_expr *initializer;
7181   gfc_array_spec *as = NULL;
7182   gfc_symbol *sym;
7183   locus var_locus;
7184   match m;
7185   gfc_try t;
7186   locus old_locus;
7187
7188   initializer = NULL;
7189   old_locus = gfc_current_locus;
7190
7191   /* When we get here, we've just matched a list of attributes and
7192      maybe a type and a double colon.  The next thing we expect to see
7193      is the name of the symbol.  */
7194   m = gfc_match_name (name);
7195   if (m != MATCH_YES)
7196     goto cleanup;
7197
7198   var_locus = gfc_current_locus;
7199
7200   /* OK, we've successfully matched the declaration.  Now put the
7201      symbol in the current namespace. If we fail to create the symbol,
7202      bail out.  */
7203   if (build_sym (name, NULL, &as, &var_locus) == FAILURE)
7204     {
7205       m = MATCH_ERROR;
7206       goto cleanup;
7207     }
7208
7209   /* The double colon must be present in order to have initializers.
7210      Otherwise the statement is ambiguous with an assignment statement.  */
7211   if (colon_seen)
7212     {
7213       if (gfc_match_char ('=') == MATCH_YES)
7214         {
7215           m = gfc_match_init_expr (&initializer);
7216           if (m == MATCH_NO)
7217             {
7218               gfc_error ("Expected an initialization expression at %C");
7219               m = MATCH_ERROR;
7220             }
7221
7222           if (m != MATCH_YES)
7223             goto cleanup;
7224         }
7225     }
7226
7227   /* If we do not have an initializer, the initialization value of the
7228      previous enumerator (stored in last_initializer) is incremented
7229      by 1 and is used to initialize the current enumerator.  */
7230   if (initializer == NULL)
7231     initializer = enum_initializer (last_initializer, old_locus);
7232
7233   if (initializer == NULL || initializer->ts.type != BT_INTEGER)
7234     {
7235       gfc_error ("ENUMERATOR %L not initialized with integer expression",
7236                  &var_locus);
7237       m = MATCH_ERROR;
7238       goto cleanup;
7239     }
7240
7241   /* Store this current initializer, for the next enumerator variable
7242      to be parsed.  add_init_expr_to_sym() zeros initializer, so we
7243      use last_initializer below.  */
7244   last_initializer = initializer;
7245   t = add_init_expr_to_sym (name, &initializer, &var_locus);
7246
7247   /* Maintain enumerator history.  */
7248   gfc_find_symbol (name, NULL, 0, &sym);
7249   create_enum_history (sym, last_initializer);
7250
7251   return (t == SUCCESS) ? MATCH_YES : MATCH_ERROR;
7252
7253 cleanup:
7254   /* Free stuff up and return.  */
7255   gfc_free_expr (initializer);
7256
7257   return m;
7258 }
7259
7260
7261 /* Match the enumerator definition statement.  */
7262
7263 match
7264 gfc_match_enumerator_def (void)
7265 {
7266   match m;
7267   gfc_try t;
7268
7269   gfc_clear_ts (&current_ts);
7270
7271   m = gfc_match (" enumerator");
7272   if (m != MATCH_YES)
7273     return m;
7274
7275   m = gfc_match (" :: ");
7276   if (m == MATCH_ERROR)
7277     return m;
7278
7279   colon_seen = (m == MATCH_YES);
7280
7281   if (gfc_current_state () != COMP_ENUM)
7282     {
7283       gfc_error ("ENUM definition statement expected before %C");
7284       gfc_free_enum_history ();
7285       return MATCH_ERROR;
7286     }
7287
7288   (&current_ts)->type = BT_INTEGER;
7289   (&current_ts)->kind = gfc_c_int_kind;
7290
7291   gfc_clear_attr (&current_attr);
7292   t = gfc_add_flavor (&current_attr, FL_PARAMETER, NULL, NULL);
7293   if (t == FAILURE)
7294     {
7295       m = MATCH_ERROR;
7296       goto cleanup;
7297     }
7298
7299   for (;;)
7300     {
7301       m = enumerator_decl ();
7302       if (m == MATCH_ERROR)
7303         {
7304           gfc_free_enum_history ();
7305           goto cleanup;
7306         }
7307       if (m == MATCH_NO)
7308         break;
7309
7310       if (gfc_match_eos () == MATCH_YES)
7311         goto cleanup;
7312       if (gfc_match_char (',') != MATCH_YES)
7313         break;
7314     }
7315
7316   if (gfc_current_state () == COMP_ENUM)
7317     {
7318       gfc_free_enum_history ();
7319       gfc_error ("Syntax error in ENUMERATOR definition at %C");
7320       m = MATCH_ERROR;
7321     }
7322
7323 cleanup:
7324   gfc_free_array_spec (current_as);
7325   current_as = NULL;
7326   return m;
7327
7328 }
7329
7330
7331 /* Match binding attributes.  */
7332
7333 static match
7334 match_binding_attributes (gfc_typebound_proc* ba, bool generic, bool ppc)
7335 {
7336   bool found_passing = false;
7337   bool seen_ptr = false;
7338   match m = MATCH_YES;
7339
7340   /* Intialize to defaults.  Do so even before the MATCH_NO check so that in
7341      this case the defaults are in there.  */
7342   ba->access = ACCESS_UNKNOWN;
7343   ba->pass_arg = NULL;
7344   ba->pass_arg_num = 0;
7345   ba->nopass = 0;
7346   ba->non_overridable = 0;
7347   ba->deferred = 0;
7348   ba->ppc = ppc;
7349
7350   /* If we find a comma, we believe there are binding attributes.  */
7351   m = gfc_match_char (',');
7352   if (m == MATCH_NO)
7353     goto done;
7354
7355   do
7356     {
7357       /* Access specifier.  */
7358
7359       m = gfc_match (" public");
7360       if (m == MATCH_ERROR)
7361         goto error;
7362       if (m == MATCH_YES)
7363         {
7364           if (ba->access != ACCESS_UNKNOWN)
7365             {
7366               gfc_error ("Duplicate access-specifier at %C");
7367               goto error;
7368             }
7369
7370           ba->access = ACCESS_PUBLIC;
7371           continue;
7372         }
7373
7374       m = gfc_match (" private");
7375       if (m == MATCH_ERROR)
7376         goto error;
7377       if (m == MATCH_YES)
7378         {
7379           if (ba->access != ACCESS_UNKNOWN)
7380             {
7381               gfc_error ("Duplicate access-specifier at %C");
7382               goto error;
7383             }
7384
7385           ba->access = ACCESS_PRIVATE;
7386           continue;
7387         }
7388
7389       /* If inside GENERIC, the following is not allowed.  */
7390       if (!generic)
7391         {
7392
7393           /* NOPASS flag.  */
7394           m = gfc_match (" nopass");
7395           if (m == MATCH_ERROR)
7396             goto error;
7397           if (m == MATCH_YES)
7398             {
7399               if (found_passing)
7400                 {
7401                   gfc_error ("Binding attributes already specify passing,"
7402                              " illegal NOPASS at %C");
7403                   goto error;
7404                 }
7405
7406               found_passing = true;
7407               ba->nopass = 1;
7408               continue;
7409             }
7410
7411           /* PASS possibly including argument.  */
7412           m = gfc_match (" pass");
7413           if (m == MATCH_ERROR)
7414             goto error;
7415           if (m == MATCH_YES)
7416             {
7417               char arg[GFC_MAX_SYMBOL_LEN + 1];
7418
7419               if (found_passing)
7420                 {
7421                   gfc_error ("Binding attributes already specify passing,"
7422                              " illegal PASS at %C");
7423                   goto error;
7424                 }
7425
7426               m = gfc_match (" ( %n )", arg);
7427               if (m == MATCH_ERROR)
7428                 goto error;
7429               if (m == MATCH_YES)
7430                 ba->pass_arg = gfc_get_string (arg);
7431               gcc_assert ((m == MATCH_YES) == (ba->pass_arg != NULL));
7432
7433               found_passing = true;
7434               ba->nopass = 0;
7435               continue;
7436             }
7437
7438           if (ppc)
7439             {
7440               /* POINTER flag.  */
7441               m = gfc_match (" pointer");
7442               if (m == MATCH_ERROR)
7443                 goto error;
7444               if (m == MATCH_YES)
7445                 {
7446                   if (seen_ptr)
7447                     {
7448                       gfc_error ("Duplicate POINTER attribute at %C");
7449                       goto error;
7450                     }
7451
7452                   seen_ptr = true;
7453                   continue;
7454                 }
7455             }
7456           else
7457             {
7458               /* NON_OVERRIDABLE flag.  */
7459               m = gfc_match (" non_overridable");
7460               if (m == MATCH_ERROR)
7461                 goto error;
7462               if (m == MATCH_YES)
7463                 {
7464                   if (ba->non_overridable)
7465                     {
7466                       gfc_error ("Duplicate NON_OVERRIDABLE at %C");
7467                       goto error;
7468                     }
7469
7470                   ba->non_overridable = 1;
7471                   continue;
7472                 }
7473
7474               /* DEFERRED flag.  */
7475               m = gfc_match (" deferred");
7476               if (m == MATCH_ERROR)
7477                 goto error;
7478               if (m == MATCH_YES)
7479                 {
7480                   if (ba->deferred)
7481                     {
7482                       gfc_error ("Duplicate DEFERRED at %C");
7483                       goto error;
7484                     }
7485
7486                   ba->deferred = 1;
7487                   continue;
7488                 }
7489             }
7490
7491         }
7492
7493       /* Nothing matching found.  */
7494       if (generic)
7495         gfc_error ("Expected access-specifier at %C");
7496       else
7497         gfc_error ("Expected binding attribute at %C");
7498       goto error;
7499     }
7500   while (gfc_match_char (',') == MATCH_YES);
7501
7502   /* NON_OVERRIDABLE and DEFERRED exclude themselves.  */
7503   if (ba->non_overridable && ba->deferred)
7504     {
7505       gfc_error ("NON_OVERRIDABLE and DEFERRED can't both appear at %C");
7506       goto error;
7507     }
7508
7509   m = MATCH_YES;
7510
7511 done:
7512   if (ba->access == ACCESS_UNKNOWN)
7513     ba->access = gfc_typebound_default_access;
7514
7515   if (ppc && !seen_ptr)
7516     {
7517       gfc_error ("POINTER attribute is required for procedure pointer component"
7518                  " at %C");
7519       goto error;
7520     }
7521
7522   return m;
7523
7524 error:
7525   return MATCH_ERROR;
7526 }
7527
7528
7529 /* Match a PROCEDURE specific binding inside a derived type.  */
7530
7531 static match
7532 match_procedure_in_type (void)
7533 {
7534   char name[GFC_MAX_SYMBOL_LEN + 1];
7535   char target_buf[GFC_MAX_SYMBOL_LEN + 1];
7536   char* target = NULL;
7537   gfc_typebound_proc* tb;
7538   bool seen_colons;
7539   bool seen_attrs;
7540   match m;
7541   gfc_symtree* stree;
7542   gfc_namespace* ns;
7543   gfc_symbol* block;
7544
7545   /* Check current state.  */
7546   gcc_assert (gfc_state_stack->state == COMP_DERIVED_CONTAINS);
7547   block = gfc_state_stack->previous->sym;
7548   gcc_assert (block);
7549
7550   /* Try to match PROCEDURE(interface).  */
7551   if (gfc_match (" (") == MATCH_YES)
7552     {
7553       m = gfc_match_name (target_buf);
7554       if (m == MATCH_ERROR)
7555         return m;
7556       if (m != MATCH_YES)
7557         {
7558           gfc_error ("Interface-name expected after '(' at %C");
7559           return MATCH_ERROR;
7560         }
7561
7562       if (gfc_match (" )") != MATCH_YES)
7563         {
7564           gfc_error ("')' expected at %C");
7565           return MATCH_ERROR;
7566         }
7567
7568       target = target_buf;
7569     }
7570
7571   /* Construct the data structure.  */
7572   tb = gfc_get_typebound_proc ();
7573   tb->where = gfc_current_locus;
7574   tb->is_generic = 0;
7575
7576   /* Match binding attributes.  */
7577   m = match_binding_attributes (tb, false, false);
7578   if (m == MATCH_ERROR)
7579     return m;
7580   seen_attrs = (m == MATCH_YES);
7581
7582   /* Check that attribute DEFERRED is given iff an interface is specified, which
7583      means target != NULL.  */
7584   if (tb->deferred && !target)
7585     {
7586       gfc_error ("Interface must be specified for DEFERRED binding at %C");
7587       return MATCH_ERROR;
7588     }
7589   if (target && !tb->deferred)
7590     {
7591       gfc_error ("PROCEDURE(interface) at %C should be declared DEFERRED");
7592       return MATCH_ERROR;
7593     }
7594
7595   /* Match the colons.  */
7596   m = gfc_match (" ::");
7597   if (m == MATCH_ERROR)
7598     return m;
7599   seen_colons = (m == MATCH_YES);
7600   if (seen_attrs && !seen_colons)
7601     {
7602       gfc_error ("Expected '::' after binding-attributes at %C");
7603       return MATCH_ERROR;
7604     }
7605
7606   /* Match the binding name.  */ 
7607   m = gfc_match_name (name);
7608   if (m == MATCH_ERROR)
7609     return m;
7610   if (m == MATCH_NO)
7611     {
7612       gfc_error ("Expected binding name at %C");
7613       return MATCH_ERROR;
7614     }
7615
7616   /* Try to match the '=> target', if it's there.  */
7617   m = gfc_match (" =>");
7618   if (m == MATCH_ERROR)
7619     return m;
7620   if (m == MATCH_YES)
7621     {
7622       if (tb->deferred)
7623         {
7624           gfc_error ("'=> target' is invalid for DEFERRED binding at %C");
7625           return MATCH_ERROR;
7626         }
7627
7628       if (!seen_colons)
7629         {
7630           gfc_error ("'::' needed in PROCEDURE binding with explicit target"
7631                      " at %C");
7632           return MATCH_ERROR;
7633         }
7634
7635       m = gfc_match_name (target_buf);
7636       if (m == MATCH_ERROR)
7637         return m;
7638       if (m == MATCH_NO)
7639         {
7640           gfc_error ("Expected binding target after '=>' at %C");
7641           return MATCH_ERROR;
7642         }
7643       target = target_buf;
7644     }
7645
7646   /* Now we should have the end.  */
7647   m = gfc_match_eos ();
7648   if (m == MATCH_ERROR)
7649     return m;
7650   if (m == MATCH_NO)
7651     {
7652       gfc_error ("Junk after PROCEDURE declaration at %C");
7653       return MATCH_ERROR;
7654     }
7655
7656   /* If no target was found, it has the same name as the binding.  */
7657   if (!target)
7658     target = name;
7659
7660   /* Get the namespace to insert the symbols into.  */
7661   ns = block->f2k_derived;
7662   gcc_assert (ns);
7663
7664   /* If the binding is DEFERRED, check that the containing type is ABSTRACT.  */
7665   if (tb->deferred && !block->attr.abstract)
7666     {
7667       gfc_error ("Type '%s' containing DEFERRED binding at %C is not ABSTRACT",
7668                  block->name);
7669       return MATCH_ERROR;
7670     }
7671
7672   /* See if we already have a binding with this name in the symtree which would
7673      be an error.  If a GENERIC already targetted this binding, it may be
7674      already there but then typebound is still NULL.  */
7675   stree = gfc_find_symtree (ns->tb_sym_root, name);
7676   if (stree && stree->n.tb)
7677     {
7678       gfc_error ("There's already a procedure with binding name '%s' for the"
7679                  " derived type '%s' at %C", name, block->name);
7680       return MATCH_ERROR;
7681     }
7682
7683   /* Insert it and set attributes.  */
7684
7685   if (!stree)
7686     {
7687       stree = gfc_new_symtree (&ns->tb_sym_root, name);
7688       gcc_assert (stree);
7689     }
7690   stree->n.tb = tb;
7691
7692   if (gfc_get_sym_tree (target, gfc_current_ns, &tb->u.specific, false))
7693     return MATCH_ERROR;
7694   gfc_set_sym_referenced (tb->u.specific->n.sym);
7695
7696   return MATCH_YES;
7697 }
7698
7699
7700 /* Match a GENERIC procedure binding inside a derived type.  */
7701
7702 match
7703 gfc_match_generic (void)
7704 {
7705   char name[GFC_MAX_SYMBOL_LEN + 1];
7706   char bind_name[GFC_MAX_SYMBOL_LEN + 16]; /* Allow space for OPERATOR(...).  */
7707   gfc_symbol* block;
7708   gfc_typebound_proc tbattr; /* Used for match_binding_attributes.  */
7709   gfc_typebound_proc* tb;
7710   gfc_namespace* ns;
7711   interface_type op_type;
7712   gfc_intrinsic_op op;
7713   match m;
7714
7715   /* Check current state.  */
7716   if (gfc_current_state () == COMP_DERIVED)
7717     {
7718       gfc_error ("GENERIC at %C must be inside a derived-type CONTAINS");
7719       return MATCH_ERROR;
7720     }
7721   if (gfc_current_state () != COMP_DERIVED_CONTAINS)
7722     return MATCH_NO;
7723   block = gfc_state_stack->previous->sym;
7724   ns = block->f2k_derived;
7725   gcc_assert (block && ns);
7726
7727   /* See if we get an access-specifier.  */
7728   m = match_binding_attributes (&tbattr, true, false);
7729   if (m == MATCH_ERROR)
7730     goto error;
7731
7732   /* Now the colons, those are required.  */
7733   if (gfc_match (" ::") != MATCH_YES)
7734     {
7735       gfc_error ("Expected '::' at %C");
7736       goto error;
7737     }
7738
7739   /* Match the binding name; depending on type (operator / generic) format
7740      it for future error messages into bind_name.  */
7741  
7742   m = gfc_match_generic_spec (&op_type, name, &op);
7743   if (m == MATCH_ERROR)
7744     return MATCH_ERROR;
7745   if (m == MATCH_NO)
7746     {
7747       gfc_error ("Expected generic name or operator descriptor at %C");
7748       goto error;
7749     }
7750
7751   switch (op_type)
7752     {
7753     case INTERFACE_GENERIC:
7754       snprintf (bind_name, sizeof (bind_name), "%s", name);
7755       break;
7756  
7757     case INTERFACE_USER_OP:
7758       snprintf (bind_name, sizeof (bind_name), "OPERATOR(.%s.)", name);
7759       break;
7760  
7761     case INTERFACE_INTRINSIC_OP:
7762       snprintf (bind_name, sizeof (bind_name), "OPERATOR(%s)",
7763                 gfc_op2string (op));
7764       break;
7765
7766     default:
7767       gcc_unreachable ();
7768     }
7769
7770   /* Match the required =>.  */
7771   if (gfc_match (" =>") != MATCH_YES)
7772     {
7773       gfc_error ("Expected '=>' at %C");
7774       goto error;
7775     }
7776   
7777   /* Try to find existing GENERIC binding with this name / for this operator;
7778      if there is something, check that it is another GENERIC and then extend
7779      it rather than building a new node.  Otherwise, create it and put it
7780      at the right position.  */
7781
7782   switch (op_type)
7783     {
7784     case INTERFACE_USER_OP:
7785     case INTERFACE_GENERIC:
7786       {
7787         const bool is_op = (op_type == INTERFACE_USER_OP);
7788         gfc_symtree* st;
7789
7790         st = gfc_find_symtree (is_op ? ns->tb_uop_root : ns->tb_sym_root, name);
7791         if (st)
7792           {
7793             tb = st->n.tb;
7794             gcc_assert (tb);
7795           }
7796         else
7797           tb = NULL;
7798
7799         break;
7800       }
7801
7802     case INTERFACE_INTRINSIC_OP:
7803       tb = ns->tb_op[op];
7804       break;
7805
7806     default:
7807       gcc_unreachable ();
7808     }
7809
7810   if (tb)
7811     {
7812       if (!tb->is_generic)
7813         {
7814           gcc_assert (op_type == INTERFACE_GENERIC);
7815           gfc_error ("There's already a non-generic procedure with binding name"
7816                      " '%s' for the derived type '%s' at %C",
7817                      bind_name, block->name);
7818           goto error;
7819         }
7820
7821       if (tb->access != tbattr.access)
7822         {
7823           gfc_error ("Binding at %C must have the same access as already"
7824                      " defined binding '%s'", bind_name);
7825           goto error;
7826         }
7827     }
7828   else
7829     {
7830       tb = gfc_get_typebound_proc ();
7831       tb->where = gfc_current_locus;
7832       tb->access = tbattr.access;
7833       tb->is_generic = 1;
7834       tb->u.generic = NULL;
7835
7836       switch (op_type)
7837         {
7838         case INTERFACE_GENERIC:
7839         case INTERFACE_USER_OP:
7840           {
7841             const bool is_op = (op_type == INTERFACE_USER_OP);
7842             gfc_symtree* st;
7843
7844             st = gfc_new_symtree (is_op ? &ns->tb_uop_root : &ns->tb_sym_root,
7845                                   name);
7846             gcc_assert (st);
7847             st->n.tb = tb;
7848
7849             break;
7850           }
7851           
7852         case INTERFACE_INTRINSIC_OP:
7853           ns->tb_op[op] = tb;
7854           break;
7855
7856         default:
7857           gcc_unreachable ();
7858         }
7859     }
7860
7861   /* Now, match all following names as specific targets.  */
7862   do
7863     {
7864       gfc_symtree* target_st;
7865       gfc_tbp_generic* target;
7866
7867       m = gfc_match_name (name);
7868       if (m == MATCH_ERROR)
7869         goto error;
7870       if (m == MATCH_NO)
7871         {
7872           gfc_error ("Expected specific binding name at %C");
7873           goto error;
7874         }
7875
7876       target_st = gfc_get_tbp_symtree (&ns->tb_sym_root, name);
7877
7878       /* See if this is a duplicate specification.  */
7879       for (target = tb->u.generic; target; target = target->next)
7880         if (target_st == target->specific_st)
7881           {
7882             gfc_error ("'%s' already defined as specific binding for the"
7883                        " generic '%s' at %C", name, bind_name);
7884             goto error;
7885           }
7886
7887       target = gfc_get_tbp_generic ();
7888       target->specific_st = target_st;
7889       target->specific = NULL;
7890       target->next = tb->u.generic;
7891       tb->u.generic = target;
7892     }
7893   while (gfc_match (" ,") == MATCH_YES);
7894
7895   /* Here should be the end.  */
7896   if (gfc_match_eos () != MATCH_YES)
7897     {
7898       gfc_error ("Junk after GENERIC binding at %C");
7899       goto error;
7900     }
7901
7902   return MATCH_YES;
7903
7904 error:
7905   return MATCH_ERROR;
7906 }
7907
7908
7909 /* Match a FINAL declaration inside a derived type.  */
7910
7911 match
7912 gfc_match_final_decl (void)
7913 {
7914   char name[GFC_MAX_SYMBOL_LEN + 1];
7915   gfc_symbol* sym;
7916   match m;
7917   gfc_namespace* module_ns;
7918   bool first, last;
7919   gfc_symbol* block;
7920
7921   if (gfc_current_form == FORM_FREE)
7922     {
7923       char c = gfc_peek_ascii_char ();
7924       if (!gfc_is_whitespace (c) && c != ':')
7925         return MATCH_NO;
7926     }
7927   
7928   if (gfc_state_stack->state != COMP_DERIVED_CONTAINS)
7929     {
7930       if (gfc_current_form == FORM_FIXED)
7931         return MATCH_NO;
7932
7933       gfc_error ("FINAL declaration at %C must be inside a derived type "
7934                  "CONTAINS section");
7935       return MATCH_ERROR;
7936     }
7937
7938   block = gfc_state_stack->previous->sym;
7939   gcc_assert (block);
7940
7941   if (!gfc_state_stack->previous || !gfc_state_stack->previous->previous
7942       || gfc_state_stack->previous->previous->state != COMP_MODULE)
7943     {
7944       gfc_error ("Derived type declaration with FINAL at %C must be in the"
7945                  " specification part of a MODULE");
7946       return MATCH_ERROR;
7947     }
7948
7949   module_ns = gfc_current_ns;
7950   gcc_assert (module_ns);
7951   gcc_assert (module_ns->proc_name->attr.flavor == FL_MODULE);
7952
7953   /* Match optional ::, don't care about MATCH_YES or MATCH_NO.  */
7954   if (gfc_match (" ::") == MATCH_ERROR)
7955     return MATCH_ERROR;
7956
7957   /* Match the sequence of procedure names.  */
7958   first = true;
7959   last = false;
7960   do
7961     {
7962       gfc_finalizer* f;
7963
7964       if (first && gfc_match_eos () == MATCH_YES)
7965         {
7966           gfc_error ("Empty FINAL at %C");
7967           return MATCH_ERROR;
7968         }
7969
7970       m = gfc_match_name (name);
7971       if (m == MATCH_NO)
7972         {
7973           gfc_error ("Expected module procedure name at %C");
7974           return MATCH_ERROR;
7975         }
7976       else if (m != MATCH_YES)
7977         return MATCH_ERROR;
7978
7979       if (gfc_match_eos () == MATCH_YES)
7980         last = true;
7981       if (!last && gfc_match_char (',') != MATCH_YES)
7982         {
7983           gfc_error ("Expected ',' at %C");
7984           return MATCH_ERROR;
7985         }
7986
7987       if (gfc_get_symbol (name, module_ns, &sym))
7988         {
7989           gfc_error ("Unknown procedure name \"%s\" at %C", name);
7990           return MATCH_ERROR;
7991         }
7992
7993       /* Mark the symbol as module procedure.  */
7994       if (sym->attr.proc != PROC_MODULE
7995           && gfc_add_procedure (&sym->attr, PROC_MODULE,
7996                                 sym->name, NULL) == FAILURE)
7997         return MATCH_ERROR;
7998
7999       /* Check if we already have this symbol in the list, this is an error.  */
8000       for (f = block->f2k_derived->finalizers; f; f = f->next)
8001         if (f->proc_sym == sym)
8002           {
8003             gfc_error ("'%s' at %C is already defined as FINAL procedure!",
8004                        name);
8005             return MATCH_ERROR;
8006           }
8007
8008       /* Add this symbol to the list of finalizers.  */
8009       gcc_assert (block->f2k_derived);
8010       ++sym->refs;
8011       f = XCNEW (gfc_finalizer);
8012       f->proc_sym = sym;
8013       f->proc_tree = NULL;
8014       f->where = gfc_current_locus;
8015       f->next = block->f2k_derived->finalizers;
8016       block->f2k_derived->finalizers = f;
8017
8018       first = false;
8019     }
8020   while (!last);
8021
8022   return MATCH_YES;
8023 }
8024
8025
8026 const ext_attr_t ext_attr_list[] = {
8027   { "dllimport", EXT_ATTR_DLLIMPORT, "dllimport" },
8028   { "dllexport", EXT_ATTR_DLLEXPORT, "dllexport" },
8029   { "cdecl",     EXT_ATTR_CDECL,     "cdecl"     },
8030   { "stdcall",   EXT_ATTR_STDCALL,   "stdcall"   },
8031   { "fastcall",  EXT_ATTR_FASTCALL,  "fastcall"  },
8032   { NULL,        EXT_ATTR_LAST,      NULL        }
8033 };
8034
8035 /* Match a !GCC$ ATTRIBUTES statement of the form:
8036       !GCC$ ATTRIBUTES attribute-list :: var-name [, var-name] ...
8037    When we come here, we have already matched the !GCC$ ATTRIBUTES string.
8038
8039    TODO: We should support all GCC attributes using the same syntax for
8040    the attribute list, i.e. the list in C
8041       __attributes(( attribute-list ))
8042    matches then
8043       !GCC$ ATTRIBUTES attribute-list ::
8044    Cf. c-parser.c's c_parser_attributes; the data can then directly be
8045    saved into a TREE.
8046
8047    As there is absolutely no risk of confusion, we should never return
8048    MATCH_NO.  */
8049 match
8050 gfc_match_gcc_attributes (void)
8051
8052   symbol_attribute attr;
8053   char name[GFC_MAX_SYMBOL_LEN + 1];
8054   unsigned id;
8055   gfc_symbol *sym;
8056   match m;
8057
8058   gfc_clear_attr (&attr);
8059   for(;;)
8060     {
8061       char ch;
8062
8063       if (gfc_match_name (name) != MATCH_YES)
8064         return MATCH_ERROR;
8065
8066       for (id = 0; id < EXT_ATTR_LAST; id++)
8067         if (strcmp (name, ext_attr_list[id].name) == 0)
8068           break;
8069
8070       if (id == EXT_ATTR_LAST)
8071         {
8072           gfc_error ("Unknown attribute in !GCC$ ATTRIBUTES statement at %C");
8073           return MATCH_ERROR;
8074         }
8075
8076       if (gfc_add_ext_attribute (&attr, (ext_attr_id_t) id, &gfc_current_locus)
8077           == FAILURE)
8078         return MATCH_ERROR;
8079
8080       gfc_gobble_whitespace ();
8081       ch = gfc_next_ascii_char ();
8082       if (ch == ':')
8083         {
8084           /* This is the successful exit condition for the loop.  */
8085           if (gfc_next_ascii_char () == ':')
8086             break;
8087         }
8088
8089       if (ch == ',')
8090         continue;
8091
8092       goto syntax;
8093     }
8094
8095   if (gfc_match_eos () == MATCH_YES)
8096     goto syntax;
8097
8098   for(;;)
8099     {
8100       m = gfc_match_name (name);
8101       if (m != MATCH_YES)
8102         return m;
8103
8104       if (find_special (name, &sym, true))
8105         return MATCH_ERROR;
8106       
8107       sym->attr.ext_attr |= attr.ext_attr;
8108
8109       if (gfc_match_eos () == MATCH_YES)
8110         break;
8111
8112       if (gfc_match_char (',') != MATCH_YES)
8113         goto syntax;
8114     }
8115
8116   return MATCH_YES;
8117
8118 syntax:
8119   gfc_error ("Syntax error in !GCC$ ATTRIBUTES statement at %C");
8120   return MATCH_ERROR;
8121 }