OSDN Git Service

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