OSDN Git Service

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