OSDN Git Service

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