OSDN Git Service

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