OSDN Git Service

2010-06-20 Tobias Burnus <burnus@net-b.de>
[pf3gnuchains/gcc-fork.git] / gcc / fortran / module.c
1 /* Handle modules, which amounts to loading and saving symbols and
2    their attendant structures.
3    Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
4    2009, 2010
5    Free Software Foundation, Inc.
6    Contributed by Andy Vaught
7
8 This file is part of GCC.
9
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 3, or (at your option) any later
13 version.
14
15 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
18 for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3.  If not see
22 <http://www.gnu.org/licenses/>.  */
23
24 /* The syntax of gfortran modules resembles that of lisp lists, i.e. a
25    sequence of atoms, which can be left or right parenthesis, names,
26    integers or strings.  Parenthesis are always matched which allows
27    us to skip over sections at high speed without having to know
28    anything about the internal structure of the lists.  A "name" is
29    usually a fortran 95 identifier, but can also start with '@' in
30    order to reference a hidden symbol.
31
32    The first line of a module is an informational message about what
33    created the module, the file it came from and when it was created.
34    The second line is a warning for people not to edit the module.
35    The rest of the module looks like:
36
37    ( ( <Interface info for UPLUS> )
38      ( <Interface info for UMINUS> )
39      ...
40    )
41    ( ( <name of operator interface> <module of op interface> <i/f1> ... )
42      ...
43    )
44    ( ( <name of generic interface> <module of generic interface> <i/f1> ... )
45      ...
46    )
47    ( ( <common name> <symbol> <saved flag>)
48      ...
49    )
50
51    ( equivalence list )
52
53    ( <Symbol Number (in no particular order)>
54      <True name of symbol>
55      <Module name of symbol>
56      ( <symbol information> )
57      ...
58    )
59    ( <Symtree name>
60      <Ambiguous flag>
61      <Symbol number>
62      ...
63    )
64
65    In general, symbols refer to other symbols by their symbol number,
66    which are zero based.  Symbols are written to the module in no
67    particular order.  */
68
69 #include "config.h"
70 #include "system.h"
71 #include "gfortran.h"
72 #include "arith.h"
73 #include "match.h"
74 #include "parse.h" /* FIXME */
75 #include "md5.h"
76 #include "constructor.h"
77 #include "cpp.h"
78
79 #define MODULE_EXTENSION ".mod"
80
81 /* Don't put any single quote (') in MOD_VERSION, 
82    if yout want it to be recognized.  */
83 #define MOD_VERSION "5"
84
85
86 /* Structure that describes a position within a module file.  */
87
88 typedef struct
89 {
90   int column, line;
91   fpos_t pos;
92 }
93 module_locus;
94
95 /* Structure for list of symbols of intrinsic modules.  */
96 typedef struct
97 {
98   int id;
99   const char *name;
100   int value;
101   int standard;
102 }
103 intmod_sym;
104
105
106 typedef enum
107 {
108   P_UNKNOWN = 0, P_OTHER, P_NAMESPACE, P_COMPONENT, P_SYMBOL
109 }
110 pointer_t;
111
112 /* The fixup structure lists pointers to pointers that have to
113    be updated when a pointer value becomes known.  */
114
115 typedef struct fixup_t
116 {
117   void **pointer;
118   struct fixup_t *next;
119 }
120 fixup_t;
121
122
123 /* Structure for holding extra info needed for pointers being read.  */
124
125 enum gfc_rsym_state
126 {
127   UNUSED,
128   NEEDED,
129   USED
130 };
131
132 enum gfc_wsym_state
133 {
134   UNREFERENCED = 0,
135   NEEDS_WRITE,
136   WRITTEN
137 };
138
139 typedef struct pointer_info
140 {
141   BBT_HEADER (pointer_info);
142   int integer;
143   pointer_t type;
144
145   /* The first component of each member of the union is the pointer
146      being stored.  */
147
148   fixup_t *fixup;
149
150   union
151   {
152     void *pointer;      /* Member for doing pointer searches.  */
153
154     struct
155     {
156       gfc_symbol *sym;
157       char true_name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
158       enum gfc_rsym_state state;
159       int ns, referenced, renamed;
160       module_locus where;
161       fixup_t *stfixup;
162       gfc_symtree *symtree;
163       char binding_label[GFC_MAX_SYMBOL_LEN + 1];
164     }
165     rsym;
166
167     struct
168     {
169       gfc_symbol *sym;
170       enum gfc_wsym_state state;
171     }
172     wsym;
173   }
174   u;
175
176 }
177 pointer_info;
178
179 #define gfc_get_pointer_info() XCNEW (pointer_info)
180
181
182 /* Local variables */
183
184 /* The FILE for the module we're reading or writing.  */
185 static FILE *module_fp;
186
187 /* MD5 context structure.  */
188 static struct md5_ctx ctx;
189
190 /* The name of the module we're reading (USE'ing) or writing.  */
191 static char module_name[GFC_MAX_SYMBOL_LEN + 1];
192
193 /* The way the module we're reading was specified.  */
194 static bool specified_nonint, specified_int;
195
196 static int module_line, module_column, only_flag;
197 static enum
198 { IO_INPUT, IO_OUTPUT }
199 iomode;
200
201 static gfc_use_rename *gfc_rename_list;
202 static pointer_info *pi_root;
203 static int symbol_number;       /* Counter for assigning symbol numbers */
204
205 /* Tells mio_expr_ref to make symbols for unused equivalence members.  */
206 static bool in_load_equiv;
207
208 static locus use_locus;
209
210
211
212 /*****************************************************************/
213
214 /* Pointer/integer conversion.  Pointers between structures are stored
215    as integers in the module file.  The next couple of subroutines
216    handle this translation for reading and writing.  */
217
218 /* Recursively free the tree of pointer structures.  */
219
220 static void
221 free_pi_tree (pointer_info *p)
222 {
223   if (p == NULL)
224     return;
225
226   if (p->fixup != NULL)
227     gfc_internal_error ("free_pi_tree(): Unresolved fixup");
228
229   free_pi_tree (p->left);
230   free_pi_tree (p->right);
231
232   gfc_free (p);
233 }
234
235
236 /* Compare pointers when searching by pointer.  Used when writing a
237    module.  */
238
239 static int
240 compare_pointers (void *_sn1, void *_sn2)
241 {
242   pointer_info *sn1, *sn2;
243
244   sn1 = (pointer_info *) _sn1;
245   sn2 = (pointer_info *) _sn2;
246
247   if (sn1->u.pointer < sn2->u.pointer)
248     return -1;
249   if (sn1->u.pointer > sn2->u.pointer)
250     return 1;
251
252   return 0;
253 }
254
255
256 /* Compare integers when searching by integer.  Used when reading a
257    module.  */
258
259 static int
260 compare_integers (void *_sn1, void *_sn2)
261 {
262   pointer_info *sn1, *sn2;
263
264   sn1 = (pointer_info *) _sn1;
265   sn2 = (pointer_info *) _sn2;
266
267   if (sn1->integer < sn2->integer)
268     return -1;
269   if (sn1->integer > sn2->integer)
270     return 1;
271
272   return 0;
273 }
274
275
276 /* Initialize the pointer_info tree.  */
277
278 static void
279 init_pi_tree (void)
280 {
281   compare_fn compare;
282   pointer_info *p;
283
284   pi_root = NULL;
285   compare = (iomode == IO_INPUT) ? compare_integers : compare_pointers;
286
287   /* Pointer 0 is the NULL pointer.  */
288   p = gfc_get_pointer_info ();
289   p->u.pointer = NULL;
290   p->integer = 0;
291   p->type = P_OTHER;
292
293   gfc_insert_bbt (&pi_root, p, compare);
294
295   /* Pointer 1 is the current namespace.  */
296   p = gfc_get_pointer_info ();
297   p->u.pointer = gfc_current_ns;
298   p->integer = 1;
299   p->type = P_NAMESPACE;
300
301   gfc_insert_bbt (&pi_root, p, compare);
302
303   symbol_number = 2;
304 }
305
306
307 /* During module writing, call here with a pointer to something,
308    returning the pointer_info node.  */
309
310 static pointer_info *
311 find_pointer (void *gp)
312 {
313   pointer_info *p;
314
315   p = pi_root;
316   while (p != NULL)
317     {
318       if (p->u.pointer == gp)
319         break;
320       p = (gp < p->u.pointer) ? p->left : p->right;
321     }
322
323   return p;
324 }
325
326
327 /* Given a pointer while writing, returns the pointer_info tree node,
328    creating it if it doesn't exist.  */
329
330 static pointer_info *
331 get_pointer (void *gp)
332 {
333   pointer_info *p;
334
335   p = find_pointer (gp);
336   if (p != NULL)
337     return p;
338
339   /* Pointer doesn't have an integer.  Give it one.  */
340   p = gfc_get_pointer_info ();
341
342   p->u.pointer = gp;
343   p->integer = symbol_number++;
344
345   gfc_insert_bbt (&pi_root, p, compare_pointers);
346
347   return p;
348 }
349
350
351 /* Given an integer during reading, find it in the pointer_info tree,
352    creating the node if not found.  */
353
354 static pointer_info *
355 get_integer (int integer)
356 {
357   pointer_info *p, t;
358   int c;
359
360   t.integer = integer;
361
362   p = pi_root;
363   while (p != NULL)
364     {
365       c = compare_integers (&t, p);
366       if (c == 0)
367         break;
368
369       p = (c < 0) ? p->left : p->right;
370     }
371
372   if (p != NULL)
373     return p;
374
375   p = gfc_get_pointer_info ();
376   p->integer = integer;
377   p->u.pointer = NULL;
378
379   gfc_insert_bbt (&pi_root, p, compare_integers);
380
381   return p;
382 }
383
384
385 /* Recursive function to find a pointer within a tree by brute force.  */
386
387 static pointer_info *
388 fp2 (pointer_info *p, const void *target)
389 {
390   pointer_info *q;
391
392   if (p == NULL)
393     return NULL;
394
395   if (p->u.pointer == target)
396     return p;
397
398   q = fp2 (p->left, target);
399   if (q != NULL)
400     return q;
401
402   return fp2 (p->right, target);
403 }
404
405
406 /* During reading, find a pointer_info node from the pointer value.
407    This amounts to a brute-force search.  */
408
409 static pointer_info *
410 find_pointer2 (void *p)
411 {
412   return fp2 (pi_root, p);
413 }
414
415
416 /* Resolve any fixups using a known pointer.  */
417
418 static void
419 resolve_fixups (fixup_t *f, void *gp)
420 {
421   fixup_t *next;
422
423   for (; f; f = next)
424     {
425       next = f->next;
426       *(f->pointer) = gp;
427       gfc_free (f);
428     }
429 }
430
431
432 /* Call here during module reading when we know what pointer to
433    associate with an integer.  Any fixups that exist are resolved at
434    this time.  */
435
436 static void
437 associate_integer_pointer (pointer_info *p, void *gp)
438 {
439   if (p->u.pointer != NULL)
440     gfc_internal_error ("associate_integer_pointer(): Already associated");
441
442   p->u.pointer = gp;
443
444   resolve_fixups (p->fixup, gp);
445
446   p->fixup = NULL;
447 }
448
449
450 /* During module reading, given an integer and a pointer to a pointer,
451    either store the pointer from an already-known value or create a
452    fixup structure in order to store things later.  Returns zero if
453    the reference has been actually stored, or nonzero if the reference
454    must be fixed later (i.e., associate_integer_pointer must be called
455    sometime later.  Returns the pointer_info structure.  */
456
457 static pointer_info *
458 add_fixup (int integer, void *gp)
459 {
460   pointer_info *p;
461   fixup_t *f;
462   char **cp;
463
464   p = get_integer (integer);
465
466   if (p->integer == 0 || p->u.pointer != NULL)
467     {
468       cp = (char **) gp;
469       *cp = (char *) p->u.pointer;
470     }
471   else
472     {
473       f = XCNEW (fixup_t);
474
475       f->next = p->fixup;
476       p->fixup = f;
477
478       f->pointer = (void **) gp;
479     }
480
481   return p;
482 }
483
484
485 /*****************************************************************/
486
487 /* Parser related subroutines */
488
489 /* Free the rename list left behind by a USE statement.  */
490
491 static void
492 free_rename (void)
493 {
494   gfc_use_rename *next;
495
496   for (; gfc_rename_list; gfc_rename_list = next)
497     {
498       next = gfc_rename_list->next;
499       gfc_free (gfc_rename_list);
500     }
501 }
502
503
504 /* Match a USE statement.  */
505
506 match
507 gfc_match_use (void)
508 {
509   char name[GFC_MAX_SYMBOL_LEN + 1], module_nature[GFC_MAX_SYMBOL_LEN + 1];
510   gfc_use_rename *tail = NULL, *new_use;
511   interface_type type, type2;
512   gfc_intrinsic_op op;
513   match m;
514
515   specified_int = false;
516   specified_nonint = false;
517
518   if (gfc_match (" , ") == MATCH_YES)
519     {
520       if ((m = gfc_match (" %n ::", module_nature)) == MATCH_YES)
521         {
522           if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: module "
523                               "nature in USE statement at %C") == FAILURE)
524             return MATCH_ERROR;
525
526           if (strcmp (module_nature, "intrinsic") == 0)
527             specified_int = true;
528           else
529             {
530               if (strcmp (module_nature, "non_intrinsic") == 0)
531                 specified_nonint = true;
532               else
533                 {
534                   gfc_error ("Module nature in USE statement at %C shall "
535                              "be either INTRINSIC or NON_INTRINSIC");
536                   return MATCH_ERROR;
537                 }
538             }
539         }
540       else
541         {
542           /* Help output a better error message than "Unclassifiable
543              statement".  */
544           gfc_match (" %n", module_nature);
545           if (strcmp (module_nature, "intrinsic") == 0
546               || strcmp (module_nature, "non_intrinsic") == 0)
547             gfc_error ("\"::\" was expected after module nature at %C "
548                        "but was not found");
549           return m;
550         }
551     }
552   else
553     {
554       m = gfc_match (" ::");
555       if (m == MATCH_YES &&
556           gfc_notify_std (GFC_STD_F2003, "Fortran 2003: "
557                           "\"USE :: module\" at %C") == FAILURE)
558         return MATCH_ERROR;
559
560       if (m != MATCH_YES)
561         {
562           m = gfc_match ("% ");
563           if (m != MATCH_YES)
564             return m;
565         }
566     }
567
568   use_locus = gfc_current_locus;
569
570   m = gfc_match_name (module_name);
571   if (m != MATCH_YES)
572     return m;
573
574   free_rename ();
575   only_flag = 0;
576
577   if (gfc_match_eos () == MATCH_YES)
578     return MATCH_YES;
579   if (gfc_match_char (',') != MATCH_YES)
580     goto syntax;
581
582   if (gfc_match (" only :") == MATCH_YES)
583     only_flag = 1;
584
585   if (gfc_match_eos () == MATCH_YES)
586     return MATCH_YES;
587
588   for (;;)
589     {
590       /* Get a new rename struct and add it to the rename list.  */
591       new_use = gfc_get_use_rename ();
592       new_use->where = gfc_current_locus;
593       new_use->found = 0;
594
595       if (gfc_rename_list == NULL)
596         gfc_rename_list = new_use;
597       else
598         tail->next = new_use;
599       tail = new_use;
600
601       /* See what kind of interface we're dealing with.  Assume it is
602          not an operator.  */
603       new_use->op = INTRINSIC_NONE;
604       if (gfc_match_generic_spec (&type, name, &op) == MATCH_ERROR)
605         goto cleanup;
606
607       switch (type)
608         {
609         case INTERFACE_NAMELESS:
610           gfc_error ("Missing generic specification in USE statement at %C");
611           goto cleanup;
612
613         case INTERFACE_USER_OP:
614         case INTERFACE_GENERIC:
615           m = gfc_match (" =>");
616
617           if (type == INTERFACE_USER_OP && m == MATCH_YES
618               && (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Renaming "
619                                   "operators in USE statements at %C")
620                  == FAILURE))
621             goto cleanup;
622
623           if (type == INTERFACE_USER_OP)
624             new_use->op = INTRINSIC_USER;
625
626           if (only_flag)
627             {
628               if (m != MATCH_YES)
629                 strcpy (new_use->use_name, name);
630               else
631                 {
632                   strcpy (new_use->local_name, name);
633                   m = gfc_match_generic_spec (&type2, new_use->use_name, &op);
634                   if (type != type2)
635                     goto syntax;
636                   if (m == MATCH_NO)
637                     goto syntax;
638                   if (m == MATCH_ERROR)
639                     goto cleanup;
640                 }
641             }
642           else
643             {
644               if (m != MATCH_YES)
645                 goto syntax;
646               strcpy (new_use->local_name, name);
647
648               m = gfc_match_generic_spec (&type2, new_use->use_name, &op);
649               if (type != type2)
650                 goto syntax;
651               if (m == MATCH_NO)
652                 goto syntax;
653               if (m == MATCH_ERROR)
654                 goto cleanup;
655             }
656
657           if (strcmp (new_use->use_name, module_name) == 0
658               || strcmp (new_use->local_name, module_name) == 0)
659             {
660               gfc_error ("The name '%s' at %C has already been used as "
661                          "an external module name.", module_name);
662               goto cleanup;
663             }
664           break;
665
666         case INTERFACE_INTRINSIC_OP:
667           new_use->op = op;
668           break;
669
670         default:
671           gcc_unreachable ();
672         }
673
674       if (gfc_match_eos () == MATCH_YES)
675         break;
676       if (gfc_match_char (',') != MATCH_YES)
677         goto syntax;
678     }
679
680   return MATCH_YES;
681
682 syntax:
683   gfc_syntax_error (ST_USE);
684
685 cleanup:
686   free_rename ();
687   return MATCH_ERROR;
688  }
689
690
691 /* Given a name and a number, inst, return the inst name
692    under which to load this symbol. Returns NULL if this
693    symbol shouldn't be loaded. If inst is zero, returns
694    the number of instances of this name. If interface is
695    true, a user-defined operator is sought, otherwise only
696    non-operators are sought.  */
697
698 static const char *
699 find_use_name_n (const char *name, int *inst, bool interface)
700 {
701   gfc_use_rename *u;
702   int i;
703
704   i = 0;
705   for (u = gfc_rename_list; u; u = u->next)
706     {
707       if (strcmp (u->use_name, name) != 0
708           || (u->op == INTRINSIC_USER && !interface)
709           || (u->op != INTRINSIC_USER &&  interface))
710         continue;
711       if (++i == *inst)
712         break;
713     }
714
715   if (!*inst)
716     {
717       *inst = i;
718       return NULL;
719     }
720
721   if (u == NULL)
722     return only_flag ? NULL : name;
723
724   u->found = 1;
725
726   return (u->local_name[0] != '\0') ? u->local_name : name;
727 }
728
729
730 /* Given a name, return the name under which to load this symbol.
731    Returns NULL if this symbol shouldn't be loaded.  */
732
733 static const char *
734 find_use_name (const char *name, bool interface)
735 {
736   int i = 1;
737   return find_use_name_n (name, &i, interface);
738 }
739
740
741 /* Given a real name, return the number of use names associated with it.  */
742
743 static int
744 number_use_names (const char *name, bool interface)
745 {
746   int i = 0;
747   find_use_name_n (name, &i, interface);
748   return i;
749 }
750
751
752 /* Try to find the operator in the current list.  */
753
754 static gfc_use_rename *
755 find_use_operator (gfc_intrinsic_op op)
756 {
757   gfc_use_rename *u;
758
759   for (u = gfc_rename_list; u; u = u->next)
760     if (u->op == op)
761       return u;
762
763   return NULL;
764 }
765
766
767 /*****************************************************************/
768
769 /* The next couple of subroutines maintain a tree used to avoid a
770    brute-force search for a combination of true name and module name.
771    While symtree names, the name that a particular symbol is known by
772    can changed with USE statements, we still have to keep track of the
773    true names to generate the correct reference, and also avoid
774    loading the same real symbol twice in a program unit.
775
776    When we start reading, the true name tree is built and maintained
777    as symbols are read.  The tree is searched as we load new symbols
778    to see if it already exists someplace in the namespace.  */
779
780 typedef struct true_name
781 {
782   BBT_HEADER (true_name);
783   gfc_symbol *sym;
784 }
785 true_name;
786
787 static true_name *true_name_root;
788
789
790 /* Compare two true_name structures.  */
791
792 static int
793 compare_true_names (void *_t1, void *_t2)
794 {
795   true_name *t1, *t2;
796   int c;
797
798   t1 = (true_name *) _t1;
799   t2 = (true_name *) _t2;
800
801   c = ((t1->sym->module > t2->sym->module)
802        - (t1->sym->module < t2->sym->module));
803   if (c != 0)
804     return c;
805
806   return strcmp (t1->sym->name, t2->sym->name);
807 }
808
809
810 /* Given a true name, search the true name tree to see if it exists
811    within the main namespace.  */
812
813 static gfc_symbol *
814 find_true_name (const char *name, const char *module)
815 {
816   true_name t, *p;
817   gfc_symbol sym;
818   int c;
819
820   sym.name = gfc_get_string (name);
821   if (module != NULL)
822     sym.module = gfc_get_string (module);
823   else
824     sym.module = NULL;
825   t.sym = &sym;
826
827   p = true_name_root;
828   while (p != NULL)
829     {
830       c = compare_true_names ((void *) (&t), (void *) p);
831       if (c == 0)
832         return p->sym;
833
834       p = (c < 0) ? p->left : p->right;
835     }
836
837   return NULL;
838 }
839
840
841 /* Given a gfc_symbol pointer that is not in the true name tree, add it.  */
842
843 static void
844 add_true_name (gfc_symbol *sym)
845 {
846   true_name *t;
847
848   t = XCNEW (true_name);
849   t->sym = sym;
850
851   gfc_insert_bbt (&true_name_root, t, compare_true_names);
852 }
853
854
855 /* Recursive function to build the initial true name tree by
856    recursively traversing the current namespace.  */
857
858 static void
859 build_tnt (gfc_symtree *st)
860 {
861   if (st == NULL)
862     return;
863
864   build_tnt (st->left);
865   build_tnt (st->right);
866
867   if (find_true_name (st->n.sym->name, st->n.sym->module) != NULL)
868     return;
869
870   add_true_name (st->n.sym);
871 }
872
873
874 /* Initialize the true name tree with the current namespace.  */
875
876 static void
877 init_true_name_tree (void)
878 {
879   true_name_root = NULL;
880   build_tnt (gfc_current_ns->sym_root);
881 }
882
883
884 /* Recursively free a true name tree node.  */
885
886 static void
887 free_true_name (true_name *t)
888 {
889   if (t == NULL)
890     return;
891   free_true_name (t->left);
892   free_true_name (t->right);
893
894   gfc_free (t);
895 }
896
897
898 /*****************************************************************/
899
900 /* Module reading and writing.  */
901
902 typedef enum
903 {
904   ATOM_NAME, ATOM_LPAREN, ATOM_RPAREN, ATOM_INTEGER, ATOM_STRING
905 }
906 atom_type;
907
908 static atom_type last_atom;
909
910
911 /* The name buffer must be at least as long as a symbol name.  Right
912    now it's not clear how we're going to store numeric constants--
913    probably as a hexadecimal string, since this will allow the exact
914    number to be preserved (this can't be done by a decimal
915    representation).  Worry about that later.  TODO!  */
916
917 #define MAX_ATOM_SIZE 100
918
919 static int atom_int;
920 static char *atom_string, atom_name[MAX_ATOM_SIZE];
921
922
923 /* Report problems with a module.  Error reporting is not very
924    elaborate, since this sorts of errors shouldn't really happen.
925    This subroutine never returns.  */
926
927 static void bad_module (const char *) ATTRIBUTE_NORETURN;
928
929 static void
930 bad_module (const char *msgid)
931 {
932   fclose (module_fp);
933
934   switch (iomode)
935     {
936     case IO_INPUT:
937       gfc_fatal_error ("Reading module %s at line %d column %d: %s",
938                        module_name, module_line, module_column, msgid);
939       break;
940     case IO_OUTPUT:
941       gfc_fatal_error ("Writing module %s at line %d column %d: %s",
942                        module_name, module_line, module_column, msgid);
943       break;
944     default:
945       gfc_fatal_error ("Module %s at line %d column %d: %s",
946                        module_name, module_line, module_column, msgid);
947       break;
948     }
949 }
950
951
952 /* Set the module's input pointer.  */
953
954 static void
955 set_module_locus (module_locus *m)
956 {
957   module_column = m->column;
958   module_line = m->line;
959   fsetpos (module_fp, &m->pos);
960 }
961
962
963 /* Get the module's input pointer so that we can restore it later.  */
964
965 static void
966 get_module_locus (module_locus *m)
967 {
968   m->column = module_column;
969   m->line = module_line;
970   fgetpos (module_fp, &m->pos);
971 }
972
973
974 /* Get the next character in the module, updating our reckoning of
975    where we are.  */
976
977 static int
978 module_char (void)
979 {
980   int c;
981
982   c = getc (module_fp);
983
984   if (c == EOF)
985     bad_module ("Unexpected EOF");
986
987   if (c == '\n')
988     {
989       module_line++;
990       module_column = 0;
991     }
992
993   module_column++;
994   return c;
995 }
996
997
998 /* Parse a string constant.  The delimiter is guaranteed to be a
999    single quote.  */
1000
1001 static void
1002 parse_string (void)
1003 {
1004   module_locus start;
1005   int len, c;
1006   char *p;
1007
1008   get_module_locus (&start);
1009
1010   len = 0;
1011
1012   /* See how long the string is.  */
1013   for ( ; ; )
1014     {
1015       c = module_char ();
1016       if (c == EOF)
1017         bad_module ("Unexpected end of module in string constant");
1018
1019       if (c != '\'')
1020         {
1021           len++;
1022           continue;
1023         }
1024
1025       c = module_char ();
1026       if (c == '\'')
1027         {
1028           len++;
1029           continue;
1030         }
1031
1032       break;
1033     }
1034
1035   set_module_locus (&start);
1036
1037   atom_string = p = XCNEWVEC (char, len + 1);
1038
1039   for (; len > 0; len--)
1040     {
1041       c = module_char ();
1042       if (c == '\'')
1043         module_char ();         /* Guaranteed to be another \'.  */
1044       *p++ = c;
1045     }
1046
1047   module_char ();               /* Terminating \'.  */
1048   *p = '\0';                    /* C-style string for debug purposes.  */
1049 }
1050
1051
1052 /* Parse a small integer.  */
1053
1054 static void
1055 parse_integer (int c)
1056 {
1057   module_locus m;
1058
1059   atom_int = c - '0';
1060
1061   for (;;)
1062     {
1063       get_module_locus (&m);
1064
1065       c = module_char ();
1066       if (!ISDIGIT (c))
1067         break;
1068
1069       atom_int = 10 * atom_int + c - '0';
1070       if (atom_int > 99999999)
1071         bad_module ("Integer overflow");
1072     }
1073
1074   set_module_locus (&m);
1075 }
1076
1077
1078 /* Parse a name.  */
1079
1080 static void
1081 parse_name (int c)
1082 {
1083   module_locus m;
1084   char *p;
1085   int len;
1086
1087   p = atom_name;
1088
1089   *p++ = c;
1090   len = 1;
1091
1092   get_module_locus (&m);
1093
1094   for (;;)
1095     {
1096       c = module_char ();
1097       if (!ISALNUM (c) && c != '_' && c != '-')
1098         break;
1099
1100       *p++ = c;
1101       if (++len > GFC_MAX_SYMBOL_LEN)
1102         bad_module ("Name too long");
1103     }
1104
1105   *p = '\0';
1106
1107   fseek (module_fp, -1, SEEK_CUR);
1108   module_column = m.column + len - 1;
1109
1110   if (c == '\n')
1111     module_line--;
1112 }
1113
1114
1115 /* Read the next atom in the module's input stream.  */
1116
1117 static atom_type
1118 parse_atom (void)
1119 {
1120   int c;
1121
1122   do
1123     {
1124       c = module_char ();
1125     }
1126   while (c == ' ' || c == '\r' || c == '\n');
1127
1128   switch (c)
1129     {
1130     case '(':
1131       return ATOM_LPAREN;
1132
1133     case ')':
1134       return ATOM_RPAREN;
1135
1136     case '\'':
1137       parse_string ();
1138       return ATOM_STRING;
1139
1140     case '0':
1141     case '1':
1142     case '2':
1143     case '3':
1144     case '4':
1145     case '5':
1146     case '6':
1147     case '7':
1148     case '8':
1149     case '9':
1150       parse_integer (c);
1151       return ATOM_INTEGER;
1152
1153     case 'a':
1154     case 'b':
1155     case 'c':
1156     case 'd':
1157     case 'e':
1158     case 'f':
1159     case 'g':
1160     case 'h':
1161     case 'i':
1162     case 'j':
1163     case 'k':
1164     case 'l':
1165     case 'm':
1166     case 'n':
1167     case 'o':
1168     case 'p':
1169     case 'q':
1170     case 'r':
1171     case 's':
1172     case 't':
1173     case 'u':
1174     case 'v':
1175     case 'w':
1176     case 'x':
1177     case 'y':
1178     case 'z':
1179     case 'A':
1180     case 'B':
1181     case 'C':
1182     case 'D':
1183     case 'E':
1184     case 'F':
1185     case 'G':
1186     case 'H':
1187     case 'I':
1188     case 'J':
1189     case 'K':
1190     case 'L':
1191     case 'M':
1192     case 'N':
1193     case 'O':
1194     case 'P':
1195     case 'Q':
1196     case 'R':
1197     case 'S':
1198     case 'T':
1199     case 'U':
1200     case 'V':
1201     case 'W':
1202     case 'X':
1203     case 'Y':
1204     case 'Z':
1205       parse_name (c);
1206       return ATOM_NAME;
1207
1208     default:
1209       bad_module ("Bad name");
1210     }
1211
1212   /* Not reached.  */
1213 }
1214
1215
1216 /* Peek at the next atom on the input.  */
1217
1218 static atom_type
1219 peek_atom (void)
1220 {
1221   module_locus m;
1222   atom_type a;
1223
1224   get_module_locus (&m);
1225
1226   a = parse_atom ();
1227   if (a == ATOM_STRING)
1228     gfc_free (atom_string);
1229
1230   set_module_locus (&m);
1231   return a;
1232 }
1233
1234
1235 /* Read the next atom from the input, requiring that it be a
1236    particular kind.  */
1237
1238 static void
1239 require_atom (atom_type type)
1240 {
1241   module_locus m;
1242   atom_type t;
1243   const char *p;
1244
1245   get_module_locus (&m);
1246
1247   t = parse_atom ();
1248   if (t != type)
1249     {
1250       switch (type)
1251         {
1252         case ATOM_NAME:
1253           p = _("Expected name");
1254           break;
1255         case ATOM_LPAREN:
1256           p = _("Expected left parenthesis");
1257           break;
1258         case ATOM_RPAREN:
1259           p = _("Expected right parenthesis");
1260           break;
1261         case ATOM_INTEGER:
1262           p = _("Expected integer");
1263           break;
1264         case ATOM_STRING:
1265           p = _("Expected string");
1266           break;
1267         default:
1268           gfc_internal_error ("require_atom(): bad atom type required");
1269         }
1270
1271       set_module_locus (&m);
1272       bad_module (p);
1273     }
1274 }
1275
1276
1277 /* Given a pointer to an mstring array, require that the current input
1278    be one of the strings in the array.  We return the enum value.  */
1279
1280 static int
1281 find_enum (const mstring *m)
1282 {
1283   int i;
1284
1285   i = gfc_string2code (m, atom_name);
1286   if (i >= 0)
1287     return i;
1288
1289   bad_module ("find_enum(): Enum not found");
1290
1291   /* Not reached.  */
1292 }
1293
1294
1295 /**************** Module output subroutines ***************************/
1296
1297 /* Output a character to a module file.  */
1298
1299 static void
1300 write_char (char out)
1301 {
1302   if (putc (out, module_fp) == EOF)
1303     gfc_fatal_error ("Error writing modules file: %s", xstrerror (errno));
1304
1305   /* Add this to our MD5.  */
1306   md5_process_bytes (&out, sizeof (out), &ctx);
1307   
1308   if (out != '\n')
1309     module_column++;
1310   else
1311     {
1312       module_column = 1;
1313       module_line++;
1314     }
1315 }
1316
1317
1318 /* Write an atom to a module.  The line wrapping isn't perfect, but it
1319    should work most of the time.  This isn't that big of a deal, since
1320    the file really isn't meant to be read by people anyway.  */
1321
1322 static void
1323 write_atom (atom_type atom, const void *v)
1324 {
1325   char buffer[20];
1326   int i, len;
1327   const char *p;
1328
1329   switch (atom)
1330     {
1331     case ATOM_STRING:
1332     case ATOM_NAME:
1333       p = (const char *) v;
1334       break;
1335
1336     case ATOM_LPAREN:
1337       p = "(";
1338       break;
1339
1340     case ATOM_RPAREN:
1341       p = ")";
1342       break;
1343
1344     case ATOM_INTEGER:
1345       i = *((const int *) v);
1346       if (i < 0)
1347         gfc_internal_error ("write_atom(): Writing negative integer");
1348
1349       sprintf (buffer, "%d", i);
1350       p = buffer;
1351       break;
1352
1353     default:
1354       gfc_internal_error ("write_atom(): Trying to write dab atom");
1355
1356     }
1357
1358   if(p == NULL || *p == '\0') 
1359      len = 0;
1360   else
1361   len = strlen (p);
1362
1363   if (atom != ATOM_RPAREN)
1364     {
1365       if (module_column + len > 72)
1366         write_char ('\n');
1367       else
1368         {
1369
1370           if (last_atom != ATOM_LPAREN && module_column != 1)
1371             write_char (' ');
1372         }
1373     }
1374
1375   if (atom == ATOM_STRING)
1376     write_char ('\'');
1377
1378   while (p != NULL && *p)
1379     {
1380       if (atom == ATOM_STRING && *p == '\'')
1381         write_char ('\'');
1382       write_char (*p++);
1383     }
1384
1385   if (atom == ATOM_STRING)
1386     write_char ('\'');
1387
1388   last_atom = atom;
1389 }
1390
1391
1392
1393 /***************** Mid-level I/O subroutines *****************/
1394
1395 /* These subroutines let their caller read or write atoms without
1396    caring about which of the two is actually happening.  This lets a
1397    subroutine concentrate on the actual format of the data being
1398    written.  */
1399
1400 static void mio_expr (gfc_expr **);
1401 pointer_info *mio_symbol_ref (gfc_symbol **);
1402 pointer_info *mio_interface_rest (gfc_interface **);
1403 static void mio_symtree_ref (gfc_symtree **);
1404
1405 /* Read or write an enumerated value.  On writing, we return the input
1406    value for the convenience of callers.  We avoid using an integer
1407    pointer because enums are sometimes inside bitfields.  */
1408
1409 static int
1410 mio_name (int t, const mstring *m)
1411 {
1412   if (iomode == IO_OUTPUT)
1413     write_atom (ATOM_NAME, gfc_code2string (m, t));
1414   else
1415     {
1416       require_atom (ATOM_NAME);
1417       t = find_enum (m);
1418     }
1419
1420   return t;
1421 }
1422
1423 /* Specialization of mio_name.  */
1424
1425 #define DECL_MIO_NAME(TYPE) \
1426  static inline TYPE \
1427  MIO_NAME(TYPE) (TYPE t, const mstring *m) \
1428  { \
1429    return (TYPE) mio_name ((int) t, m); \
1430  }
1431 #define MIO_NAME(TYPE) mio_name_##TYPE
1432
1433 static void
1434 mio_lparen (void)
1435 {
1436   if (iomode == IO_OUTPUT)
1437     write_atom (ATOM_LPAREN, NULL);
1438   else
1439     require_atom (ATOM_LPAREN);
1440 }
1441
1442
1443 static void
1444 mio_rparen (void)
1445 {
1446   if (iomode == IO_OUTPUT)
1447     write_atom (ATOM_RPAREN, NULL);
1448   else
1449     require_atom (ATOM_RPAREN);
1450 }
1451
1452
1453 static void
1454 mio_integer (int *ip)
1455 {
1456   if (iomode == IO_OUTPUT)
1457     write_atom (ATOM_INTEGER, ip);
1458   else
1459     {
1460       require_atom (ATOM_INTEGER);
1461       *ip = atom_int;
1462     }
1463 }
1464
1465
1466 /* Read or write a gfc_intrinsic_op value.  */
1467
1468 static void
1469 mio_intrinsic_op (gfc_intrinsic_op* op)
1470 {
1471   /* FIXME: Would be nicer to do this via the operators symbolic name.  */
1472   if (iomode == IO_OUTPUT)
1473     {
1474       int converted = (int) *op;
1475       write_atom (ATOM_INTEGER, &converted);
1476     }
1477   else
1478     {
1479       require_atom (ATOM_INTEGER);
1480       *op = (gfc_intrinsic_op) atom_int;
1481     }
1482 }
1483
1484
1485 /* Read or write a character pointer that points to a string on the heap.  */
1486
1487 static const char *
1488 mio_allocated_string (const char *s)
1489 {
1490   if (iomode == IO_OUTPUT)
1491     {
1492       write_atom (ATOM_STRING, s);
1493       return s;
1494     }
1495   else
1496     {
1497       require_atom (ATOM_STRING);
1498       return atom_string;
1499     }
1500 }
1501
1502
1503 /* Functions for quoting and unquoting strings.  */
1504
1505 static char *
1506 quote_string (const gfc_char_t *s, const size_t slength)
1507 {
1508   const gfc_char_t *p;
1509   char *res, *q;
1510   size_t len = 0, i;
1511
1512   /* Calculate the length we'll need: a backslash takes two ("\\"),
1513      non-printable characters take 10 ("\Uxxxxxxxx") and others take 1.  */
1514   for (p = s, i = 0; i < slength; p++, i++)
1515     {
1516       if (*p == '\\')
1517         len += 2;
1518       else if (!gfc_wide_is_printable (*p))
1519         len += 10;
1520       else
1521         len++;
1522     }
1523
1524   q = res = XCNEWVEC (char, len + 1);
1525   for (p = s, i = 0; i < slength; p++, i++)
1526     {
1527       if (*p == '\\')
1528         *q++ = '\\', *q++ = '\\';
1529       else if (!gfc_wide_is_printable (*p))
1530         {
1531           sprintf (q, "\\U%08" HOST_WIDE_INT_PRINT "x",
1532                    (unsigned HOST_WIDE_INT) *p);
1533           q += 10;
1534         }
1535       else
1536         *q++ = (unsigned char) *p;
1537     }
1538
1539   res[len] = '\0';
1540   return res;
1541 }
1542
1543 static gfc_char_t *
1544 unquote_string (const char *s)
1545 {
1546   size_t len, i;
1547   const char *p;
1548   gfc_char_t *res;
1549
1550   for (p = s, len = 0; *p; p++, len++)
1551     {
1552       if (*p != '\\')
1553         continue;
1554         
1555       if (p[1] == '\\')
1556         p++;
1557       else if (p[1] == 'U')
1558         p += 9; /* That is a "\U????????". */
1559       else
1560         gfc_internal_error ("unquote_string(): got bad string");
1561     }
1562
1563   res = gfc_get_wide_string (len + 1);
1564   for (i = 0, p = s; i < len; i++, p++)
1565     {
1566       gcc_assert (*p);
1567
1568       if (*p != '\\')
1569         res[i] = (unsigned char) *p;
1570       else if (p[1] == '\\')
1571         {
1572           res[i] = (unsigned char) '\\';
1573           p++;
1574         }
1575       else
1576         {
1577           /* We read the 8-digits hexadecimal constant that follows.  */
1578           int j;
1579           unsigned n;
1580           gfc_char_t c = 0;
1581
1582           gcc_assert (p[1] == 'U');
1583           for (j = 0; j < 8; j++)
1584             {
1585               c = c << 4;
1586               gcc_assert (sscanf (&p[j+2], "%01x", &n) == 1);
1587               c += n;
1588             }
1589
1590           res[i] = c;
1591           p += 9;
1592         }
1593     }
1594
1595   res[len] = '\0';
1596   return res;
1597 }
1598
1599
1600 /* Read or write a character pointer that points to a wide string on the
1601    heap, performing quoting/unquoting of nonprintable characters using the
1602    form \U???????? (where each ? is a hexadecimal digit).
1603    Length is the length of the string, only known and used in output mode.  */
1604
1605 static const gfc_char_t *
1606 mio_allocated_wide_string (const gfc_char_t *s, const size_t length)
1607 {
1608   if (iomode == IO_OUTPUT)
1609     {
1610       char *quoted = quote_string (s, length);
1611       write_atom (ATOM_STRING, quoted);
1612       gfc_free (quoted);
1613       return s;
1614     }
1615   else
1616     {
1617       gfc_char_t *unquoted;
1618
1619       require_atom (ATOM_STRING);
1620       unquoted = unquote_string (atom_string);
1621       gfc_free (atom_string);
1622       return unquoted;
1623     }
1624 }
1625
1626
1627 /* Read or write a string that is in static memory.  */
1628
1629 static void
1630 mio_pool_string (const char **stringp)
1631 {
1632   /* TODO: one could write the string only once, and refer to it via a
1633      fixup pointer.  */
1634
1635   /* As a special case we have to deal with a NULL string.  This
1636      happens for the 'module' member of 'gfc_symbol's that are not in a
1637      module.  We read / write these as the empty string.  */
1638   if (iomode == IO_OUTPUT)
1639     {
1640       const char *p = *stringp == NULL ? "" : *stringp;
1641       write_atom (ATOM_STRING, p);
1642     }
1643   else
1644     {
1645       require_atom (ATOM_STRING);
1646       *stringp = atom_string[0] == '\0' ? NULL : gfc_get_string (atom_string);
1647       gfc_free (atom_string);
1648     }
1649 }
1650
1651
1652 /* Read or write a string that is inside of some already-allocated
1653    structure.  */
1654
1655 static void
1656 mio_internal_string (char *string)
1657 {
1658   if (iomode == IO_OUTPUT)
1659     write_atom (ATOM_STRING, string);
1660   else
1661     {
1662       require_atom (ATOM_STRING);
1663       strcpy (string, atom_string);
1664       gfc_free (atom_string);
1665     }
1666 }
1667
1668
1669 typedef enum
1670 { AB_ALLOCATABLE, AB_DIMENSION, AB_EXTERNAL, AB_INTRINSIC, AB_OPTIONAL,
1671   AB_POINTER, AB_TARGET, AB_DUMMY, AB_RESULT, AB_DATA,
1672   AB_IN_NAMELIST, AB_IN_COMMON, AB_FUNCTION, AB_SUBROUTINE, AB_SEQUENCE,
1673   AB_ELEMENTAL, AB_PURE, AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT,
1674   AB_CRAY_POINTER, AB_CRAY_POINTEE, AB_THREADPRIVATE, AB_ALLOC_COMP,
1675   AB_POINTER_COMP, AB_PRIVATE_COMP, AB_VALUE, AB_VOLATILE, AB_PROTECTED,
1676   AB_IS_BIND_C, AB_IS_C_INTEROP, AB_IS_ISO_C, AB_ABSTRACT, AB_ZERO_COMP,
1677   AB_IS_CLASS, AB_PROCEDURE, AB_PROC_POINTER, AB_ASYNCHRONOUS, AB_CODIMENSION,
1678   AB_COARRAY_COMP, AB_VTYPE, AB_VTAB, AB_CONTIGUOUS
1679 }
1680 ab_attribute;
1681
1682 static const mstring attr_bits[] =
1683 {
1684     minit ("ALLOCATABLE", AB_ALLOCATABLE),
1685     minit ("ASYNCHRONOUS", AB_ASYNCHRONOUS),
1686     minit ("DIMENSION", AB_DIMENSION),
1687     minit ("CODIMENSION", AB_CODIMENSION),
1688     minit ("CONTIGUOUS", AB_CONTIGUOUS),
1689     minit ("EXTERNAL", AB_EXTERNAL),
1690     minit ("INTRINSIC", AB_INTRINSIC),
1691     minit ("OPTIONAL", AB_OPTIONAL),
1692     minit ("POINTER", AB_POINTER),
1693     minit ("VOLATILE", AB_VOLATILE),
1694     minit ("TARGET", AB_TARGET),
1695     minit ("THREADPRIVATE", AB_THREADPRIVATE),
1696     minit ("DUMMY", AB_DUMMY),
1697     minit ("RESULT", AB_RESULT),
1698     minit ("DATA", AB_DATA),
1699     minit ("IN_NAMELIST", AB_IN_NAMELIST),
1700     minit ("IN_COMMON", AB_IN_COMMON),
1701     minit ("FUNCTION", AB_FUNCTION),
1702     minit ("SUBROUTINE", AB_SUBROUTINE),
1703     minit ("SEQUENCE", AB_SEQUENCE),
1704     minit ("ELEMENTAL", AB_ELEMENTAL),
1705     minit ("PURE", AB_PURE),
1706     minit ("RECURSIVE", AB_RECURSIVE),
1707     minit ("GENERIC", AB_GENERIC),
1708     minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
1709     minit ("CRAY_POINTER", AB_CRAY_POINTER),
1710     minit ("CRAY_POINTEE", AB_CRAY_POINTEE),
1711     minit ("IS_BIND_C", AB_IS_BIND_C),
1712     minit ("IS_C_INTEROP", AB_IS_C_INTEROP),
1713     minit ("IS_ISO_C", AB_IS_ISO_C),
1714     minit ("VALUE", AB_VALUE),
1715     minit ("ALLOC_COMP", AB_ALLOC_COMP),
1716     minit ("COARRAY_COMP", AB_COARRAY_COMP),
1717     minit ("POINTER_COMP", AB_POINTER_COMP),
1718     minit ("PRIVATE_COMP", AB_PRIVATE_COMP),
1719     minit ("ZERO_COMP", AB_ZERO_COMP),
1720     minit ("PROTECTED", AB_PROTECTED),
1721     minit ("ABSTRACT", AB_ABSTRACT),
1722     minit ("IS_CLASS", AB_IS_CLASS),
1723     minit ("PROCEDURE", AB_PROCEDURE),
1724     minit ("PROC_POINTER", AB_PROC_POINTER),
1725     minit ("VTYPE", AB_VTYPE),
1726     minit ("VTAB", AB_VTAB),
1727     minit (NULL, -1)
1728 };
1729
1730 /* For binding attributes.  */
1731 static const mstring binding_passing[] =
1732 {
1733     minit ("PASS", 0),
1734     minit ("NOPASS", 1),
1735     minit (NULL, -1)
1736 };
1737 static const mstring binding_overriding[] =
1738 {
1739     minit ("OVERRIDABLE", 0),
1740     minit ("NON_OVERRIDABLE", 1),
1741     minit ("DEFERRED", 2),
1742     minit (NULL, -1)
1743 };
1744 static const mstring binding_generic[] =
1745 {
1746     minit ("SPECIFIC", 0),
1747     minit ("GENERIC", 1),
1748     minit (NULL, -1)
1749 };
1750 static const mstring binding_ppc[] =
1751 {
1752     minit ("NO_PPC", 0),
1753     minit ("PPC", 1),
1754     minit (NULL, -1)
1755 };
1756
1757 /* Specialization of mio_name.  */
1758 DECL_MIO_NAME (ab_attribute)
1759 DECL_MIO_NAME (ar_type)
1760 DECL_MIO_NAME (array_type)
1761 DECL_MIO_NAME (bt)
1762 DECL_MIO_NAME (expr_t)
1763 DECL_MIO_NAME (gfc_access)
1764 DECL_MIO_NAME (gfc_intrinsic_op)
1765 DECL_MIO_NAME (ifsrc)
1766 DECL_MIO_NAME (save_state)
1767 DECL_MIO_NAME (procedure_type)
1768 DECL_MIO_NAME (ref_type)
1769 DECL_MIO_NAME (sym_flavor)
1770 DECL_MIO_NAME (sym_intent)
1771 #undef DECL_MIO_NAME
1772
1773 /* Symbol attributes are stored in list with the first three elements
1774    being the enumerated fields, while the remaining elements (if any)
1775    indicate the individual attribute bits.  The access field is not
1776    saved-- it controls what symbols are exported when a module is
1777    written.  */
1778
1779 static void
1780 mio_symbol_attribute (symbol_attribute *attr)
1781 {
1782   atom_type t;
1783   unsigned ext_attr,extension_level;
1784
1785   mio_lparen ();
1786
1787   attr->flavor = MIO_NAME (sym_flavor) (attr->flavor, flavors);
1788   attr->intent = MIO_NAME (sym_intent) (attr->intent, intents);
1789   attr->proc = MIO_NAME (procedure_type) (attr->proc, procedures);
1790   attr->if_source = MIO_NAME (ifsrc) (attr->if_source, ifsrc_types);
1791   attr->save = MIO_NAME (save_state) (attr->save, save_status);
1792   
1793   ext_attr = attr->ext_attr;
1794   mio_integer ((int *) &ext_attr);
1795   attr->ext_attr = ext_attr;
1796
1797   extension_level = attr->extension;
1798   mio_integer ((int *) &extension_level);
1799   attr->extension = extension_level;
1800
1801   if (iomode == IO_OUTPUT)
1802     {
1803       if (attr->allocatable)
1804         MIO_NAME (ab_attribute) (AB_ALLOCATABLE, attr_bits);
1805       if (attr->asynchronous)
1806         MIO_NAME (ab_attribute) (AB_ASYNCHRONOUS, attr_bits);
1807       if (attr->dimension)
1808         MIO_NAME (ab_attribute) (AB_DIMENSION, attr_bits);
1809       if (attr->codimension)
1810         MIO_NAME (ab_attribute) (AB_CODIMENSION, attr_bits);
1811       if (attr->contiguous)
1812         MIO_NAME (ab_attribute) (AB_CONTIGUOUS, attr_bits);
1813       if (attr->external)
1814         MIO_NAME (ab_attribute) (AB_EXTERNAL, attr_bits);
1815       if (attr->intrinsic)
1816         MIO_NAME (ab_attribute) (AB_INTRINSIC, attr_bits);
1817       if (attr->optional)
1818         MIO_NAME (ab_attribute) (AB_OPTIONAL, attr_bits);
1819       if (attr->pointer)
1820         MIO_NAME (ab_attribute) (AB_POINTER, attr_bits);
1821       if (attr->is_protected)
1822         MIO_NAME (ab_attribute) (AB_PROTECTED, attr_bits);
1823       if (attr->value)
1824         MIO_NAME (ab_attribute) (AB_VALUE, attr_bits);
1825       if (attr->volatile_)
1826         MIO_NAME (ab_attribute) (AB_VOLATILE, attr_bits);
1827       if (attr->target)
1828         MIO_NAME (ab_attribute) (AB_TARGET, attr_bits);
1829       if (attr->threadprivate)
1830         MIO_NAME (ab_attribute) (AB_THREADPRIVATE, attr_bits);
1831       if (attr->dummy)
1832         MIO_NAME (ab_attribute) (AB_DUMMY, attr_bits);
1833       if (attr->result)
1834         MIO_NAME (ab_attribute) (AB_RESULT, attr_bits);
1835       /* We deliberately don't preserve the "entry" flag.  */
1836
1837       if (attr->data)
1838         MIO_NAME (ab_attribute) (AB_DATA, attr_bits);
1839       if (attr->in_namelist)
1840         MIO_NAME (ab_attribute) (AB_IN_NAMELIST, attr_bits);
1841       if (attr->in_common)
1842         MIO_NAME (ab_attribute) (AB_IN_COMMON, attr_bits);
1843
1844       if (attr->function)
1845         MIO_NAME (ab_attribute) (AB_FUNCTION, attr_bits);
1846       if (attr->subroutine)
1847         MIO_NAME (ab_attribute) (AB_SUBROUTINE, attr_bits);
1848       if (attr->generic)
1849         MIO_NAME (ab_attribute) (AB_GENERIC, attr_bits);
1850       if (attr->abstract)
1851         MIO_NAME (ab_attribute) (AB_ABSTRACT, attr_bits);
1852
1853       if (attr->sequence)
1854         MIO_NAME (ab_attribute) (AB_SEQUENCE, attr_bits);
1855       if (attr->elemental)
1856         MIO_NAME (ab_attribute) (AB_ELEMENTAL, attr_bits);
1857       if (attr->pure)
1858         MIO_NAME (ab_attribute) (AB_PURE, attr_bits);
1859       if (attr->recursive)
1860         MIO_NAME (ab_attribute) (AB_RECURSIVE, attr_bits);
1861       if (attr->always_explicit)
1862         MIO_NAME (ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits);
1863       if (attr->cray_pointer)
1864         MIO_NAME (ab_attribute) (AB_CRAY_POINTER, attr_bits);
1865       if (attr->cray_pointee)
1866         MIO_NAME (ab_attribute) (AB_CRAY_POINTEE, attr_bits);
1867       if (attr->is_bind_c)
1868         MIO_NAME(ab_attribute) (AB_IS_BIND_C, attr_bits);
1869       if (attr->is_c_interop)
1870         MIO_NAME(ab_attribute) (AB_IS_C_INTEROP, attr_bits);
1871       if (attr->is_iso_c)
1872         MIO_NAME(ab_attribute) (AB_IS_ISO_C, attr_bits);
1873       if (attr->alloc_comp)
1874         MIO_NAME (ab_attribute) (AB_ALLOC_COMP, attr_bits);
1875       if (attr->pointer_comp)
1876         MIO_NAME (ab_attribute) (AB_POINTER_COMP, attr_bits);
1877       if (attr->private_comp)
1878         MIO_NAME (ab_attribute) (AB_PRIVATE_COMP, attr_bits);
1879       if (attr->coarray_comp)
1880         MIO_NAME (ab_attribute) (AB_COARRAY_COMP, attr_bits);
1881       if (attr->zero_comp)
1882         MIO_NAME (ab_attribute) (AB_ZERO_COMP, attr_bits);
1883       if (attr->is_class)
1884         MIO_NAME (ab_attribute) (AB_IS_CLASS, attr_bits);
1885       if (attr->procedure)
1886         MIO_NAME (ab_attribute) (AB_PROCEDURE, attr_bits);
1887       if (attr->proc_pointer)
1888         MIO_NAME (ab_attribute) (AB_PROC_POINTER, attr_bits);
1889       if (attr->vtype)
1890         MIO_NAME (ab_attribute) (AB_VTYPE, attr_bits);
1891       if (attr->vtab)
1892         MIO_NAME (ab_attribute) (AB_VTAB, attr_bits);
1893
1894       mio_rparen ();
1895
1896     }
1897   else
1898     {
1899       for (;;)
1900         {
1901           t = parse_atom ();
1902           if (t == ATOM_RPAREN)
1903             break;
1904           if (t != ATOM_NAME)
1905             bad_module ("Expected attribute bit name");
1906
1907           switch ((ab_attribute) find_enum (attr_bits))
1908             {
1909             case AB_ALLOCATABLE:
1910               attr->allocatable = 1;
1911               break;
1912             case AB_ASYNCHRONOUS:
1913               attr->asynchronous = 1;
1914               break;
1915             case AB_DIMENSION:
1916               attr->dimension = 1;
1917               break;
1918             case AB_CODIMENSION:
1919               attr->codimension = 1;
1920               break;
1921             case AB_CONTIGUOUS:
1922               attr->contiguous = 1;
1923               break;
1924             case AB_EXTERNAL:
1925               attr->external = 1;
1926               break;
1927             case AB_INTRINSIC:
1928               attr->intrinsic = 1;
1929               break;
1930             case AB_OPTIONAL:
1931               attr->optional = 1;
1932               break;
1933             case AB_POINTER:
1934               attr->pointer = 1;
1935               break;
1936             case AB_PROTECTED:
1937               attr->is_protected = 1;
1938               break;
1939             case AB_VALUE:
1940               attr->value = 1;
1941               break;
1942             case AB_VOLATILE:
1943               attr->volatile_ = 1;
1944               break;
1945             case AB_TARGET:
1946               attr->target = 1;
1947               break;
1948             case AB_THREADPRIVATE:
1949               attr->threadprivate = 1;
1950               break;
1951             case AB_DUMMY:
1952               attr->dummy = 1;
1953               break;
1954             case AB_RESULT:
1955               attr->result = 1;
1956               break;
1957             case AB_DATA:
1958               attr->data = 1;
1959               break;
1960             case AB_IN_NAMELIST:
1961               attr->in_namelist = 1;
1962               break;
1963             case AB_IN_COMMON:
1964               attr->in_common = 1;
1965               break;
1966             case AB_FUNCTION:
1967               attr->function = 1;
1968               break;
1969             case AB_SUBROUTINE:
1970               attr->subroutine = 1;
1971               break;
1972             case AB_GENERIC:
1973               attr->generic = 1;
1974               break;
1975             case AB_ABSTRACT:
1976               attr->abstract = 1;
1977               break;
1978             case AB_SEQUENCE:
1979               attr->sequence = 1;
1980               break;
1981             case AB_ELEMENTAL:
1982               attr->elemental = 1;
1983               break;
1984             case AB_PURE:
1985               attr->pure = 1;
1986               break;
1987             case AB_RECURSIVE:
1988               attr->recursive = 1;
1989               break;
1990             case AB_ALWAYS_EXPLICIT:
1991               attr->always_explicit = 1;
1992               break;
1993             case AB_CRAY_POINTER:
1994               attr->cray_pointer = 1;
1995               break;
1996             case AB_CRAY_POINTEE:
1997               attr->cray_pointee = 1;
1998               break;
1999             case AB_IS_BIND_C:
2000               attr->is_bind_c = 1;
2001               break;
2002             case AB_IS_C_INTEROP:
2003               attr->is_c_interop = 1;
2004               break;
2005             case AB_IS_ISO_C:
2006               attr->is_iso_c = 1;
2007               break;
2008             case AB_ALLOC_COMP:
2009               attr->alloc_comp = 1;
2010               break;
2011             case AB_COARRAY_COMP:
2012               attr->coarray_comp = 1;
2013               break;
2014             case AB_POINTER_COMP:
2015               attr->pointer_comp = 1;
2016               break;
2017             case AB_PRIVATE_COMP:
2018               attr->private_comp = 1;
2019               break;
2020             case AB_ZERO_COMP:
2021               attr->zero_comp = 1;
2022               break;
2023             case AB_IS_CLASS:
2024               attr->is_class = 1;
2025               break;
2026             case AB_PROCEDURE:
2027               attr->procedure = 1;
2028               break;
2029             case AB_PROC_POINTER:
2030               attr->proc_pointer = 1;
2031               break;
2032             case AB_VTYPE:
2033               attr->vtype = 1;
2034               break;
2035             case AB_VTAB:
2036               attr->vtab = 1;
2037               break;
2038             }
2039         }
2040     }
2041 }
2042
2043
2044 static const mstring bt_types[] = {
2045     minit ("INTEGER", BT_INTEGER),
2046     minit ("REAL", BT_REAL),
2047     minit ("COMPLEX", BT_COMPLEX),
2048     minit ("LOGICAL", BT_LOGICAL),
2049     minit ("CHARACTER", BT_CHARACTER),
2050     minit ("DERIVED", BT_DERIVED),
2051     minit ("CLASS", BT_CLASS),
2052     minit ("PROCEDURE", BT_PROCEDURE),
2053     minit ("UNKNOWN", BT_UNKNOWN),
2054     minit ("VOID", BT_VOID),
2055     minit (NULL, -1)
2056 };
2057
2058
2059 static void
2060 mio_charlen (gfc_charlen **clp)
2061 {
2062   gfc_charlen *cl;
2063
2064   mio_lparen ();
2065
2066   if (iomode == IO_OUTPUT)
2067     {
2068       cl = *clp;
2069       if (cl != NULL)
2070         mio_expr (&cl->length);
2071     }
2072   else
2073     {
2074       if (peek_atom () != ATOM_RPAREN)
2075         {
2076           cl = gfc_new_charlen (gfc_current_ns, NULL);
2077           mio_expr (&cl->length);
2078           *clp = cl;
2079         }
2080     }
2081
2082   mio_rparen ();
2083 }
2084
2085
2086 /* See if a name is a generated name.  */
2087
2088 static int
2089 check_unique_name (const char *name)
2090 {
2091   return *name == '@';
2092 }
2093
2094
2095 static void
2096 mio_typespec (gfc_typespec *ts)
2097 {
2098   mio_lparen ();
2099
2100   ts->type = MIO_NAME (bt) (ts->type, bt_types);
2101
2102   if (ts->type != BT_DERIVED && ts->type != BT_CLASS)
2103     mio_integer (&ts->kind);
2104   else
2105     mio_symbol_ref (&ts->u.derived);
2106
2107   /* Add info for C interop and is_iso_c.  */
2108   mio_integer (&ts->is_c_interop);
2109   mio_integer (&ts->is_iso_c);
2110   
2111   /* If the typespec is for an identifier either from iso_c_binding, or
2112      a constant that was initialized to an identifier from it, use the
2113      f90_type.  Otherwise, use the ts->type, since it shouldn't matter.  */
2114   if (ts->is_iso_c)
2115     ts->f90_type = MIO_NAME (bt) (ts->f90_type, bt_types);
2116   else
2117     ts->f90_type = MIO_NAME (bt) (ts->type, bt_types);
2118
2119   if (ts->type != BT_CHARACTER)
2120     {
2121       /* ts->u.cl is only valid for BT_CHARACTER.  */
2122       mio_lparen ();
2123       mio_rparen ();
2124     }
2125   else
2126     mio_charlen (&ts->u.cl);
2127
2128   mio_rparen ();
2129 }
2130
2131
2132 static const mstring array_spec_types[] = {
2133     minit ("EXPLICIT", AS_EXPLICIT),
2134     minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE),
2135     minit ("DEFERRED", AS_DEFERRED),
2136     minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE),
2137     minit (NULL, -1)
2138 };
2139
2140
2141 static void
2142 mio_array_spec (gfc_array_spec **asp)
2143 {
2144   gfc_array_spec *as;
2145   int i;
2146
2147   mio_lparen ();
2148
2149   if (iomode == IO_OUTPUT)
2150     {
2151       if (*asp == NULL)
2152         goto done;
2153       as = *asp;
2154     }
2155   else
2156     {
2157       if (peek_atom () == ATOM_RPAREN)
2158         {
2159           *asp = NULL;
2160           goto done;
2161         }
2162
2163       *asp = as = gfc_get_array_spec ();
2164     }
2165
2166   mio_integer (&as->rank);
2167   mio_integer (&as->corank);
2168   as->type = MIO_NAME (array_type) (as->type, array_spec_types);
2169
2170   for (i = 0; i < as->rank + as->corank; i++)
2171     {
2172       mio_expr (&as->lower[i]);
2173       mio_expr (&as->upper[i]);
2174     }
2175
2176 done:
2177   mio_rparen ();
2178 }
2179
2180
2181 /* Given a pointer to an array reference structure (which lives in a
2182    gfc_ref structure), find the corresponding array specification
2183    structure.  Storing the pointer in the ref structure doesn't quite
2184    work when loading from a module. Generating code for an array
2185    reference also needs more information than just the array spec.  */
2186
2187 static const mstring array_ref_types[] = {
2188     minit ("FULL", AR_FULL),
2189     minit ("ELEMENT", AR_ELEMENT),
2190     minit ("SECTION", AR_SECTION),
2191     minit (NULL, -1)
2192 };
2193
2194
2195 static void
2196 mio_array_ref (gfc_array_ref *ar)
2197 {
2198   int i;
2199
2200   mio_lparen ();
2201   ar->type = MIO_NAME (ar_type) (ar->type, array_ref_types);
2202   mio_integer (&ar->dimen);
2203
2204   switch (ar->type)
2205     {
2206     case AR_FULL:
2207       break;
2208
2209     case AR_ELEMENT:
2210       for (i = 0; i < ar->dimen; i++)
2211         mio_expr (&ar->start[i]);
2212
2213       break;
2214
2215     case AR_SECTION:
2216       for (i = 0; i < ar->dimen; i++)
2217         {
2218           mio_expr (&ar->start[i]);
2219           mio_expr (&ar->end[i]);
2220           mio_expr (&ar->stride[i]);
2221         }
2222
2223       break;
2224
2225     case AR_UNKNOWN:
2226       gfc_internal_error ("mio_array_ref(): Unknown array ref");
2227     }
2228
2229   /* Unfortunately, ar->dimen_type is an anonymous enumerated type so
2230      we can't call mio_integer directly.  Instead loop over each element
2231      and cast it to/from an integer.  */
2232   if (iomode == IO_OUTPUT)
2233     {
2234       for (i = 0; i < ar->dimen; i++)
2235         {
2236           int tmp = (int)ar->dimen_type[i];
2237           write_atom (ATOM_INTEGER, &tmp);
2238         }
2239     }
2240   else
2241     {
2242       for (i = 0; i < ar->dimen; i++)
2243         {
2244           require_atom (ATOM_INTEGER);
2245           ar->dimen_type[i] = (enum gfc_array_ref_dimen_type) atom_int;
2246         }
2247     }
2248
2249   if (iomode == IO_INPUT)
2250     {
2251       ar->where = gfc_current_locus;
2252
2253       for (i = 0; i < ar->dimen; i++)
2254         ar->c_where[i] = gfc_current_locus;
2255     }
2256
2257   mio_rparen ();
2258 }
2259
2260
2261 /* Saves or restores a pointer.  The pointer is converted back and
2262    forth from an integer.  We return the pointer_info pointer so that
2263    the caller can take additional action based on the pointer type.  */
2264
2265 static pointer_info *
2266 mio_pointer_ref (void *gp)
2267 {
2268   pointer_info *p;
2269
2270   if (iomode == IO_OUTPUT)
2271     {
2272       p = get_pointer (*((char **) gp));
2273       write_atom (ATOM_INTEGER, &p->integer);
2274     }
2275   else
2276     {
2277       require_atom (ATOM_INTEGER);
2278       p = add_fixup (atom_int, gp);
2279     }
2280
2281   return p;
2282 }
2283
2284
2285 /* Save and load references to components that occur within
2286    expressions.  We have to describe these references by a number and
2287    by name.  The number is necessary for forward references during
2288    reading, and the name is necessary if the symbol already exists in
2289    the namespace and is not loaded again.  */
2290
2291 static void
2292 mio_component_ref (gfc_component **cp, gfc_symbol *sym)
2293 {
2294   char name[GFC_MAX_SYMBOL_LEN + 1];
2295   gfc_component *q;
2296   pointer_info *p;
2297
2298   p = mio_pointer_ref (cp);
2299   if (p->type == P_UNKNOWN)
2300     p->type = P_COMPONENT;
2301
2302   if (iomode == IO_OUTPUT)
2303     mio_pool_string (&(*cp)->name);
2304   else
2305     {
2306       mio_internal_string (name);
2307
2308       /* It can happen that a component reference can be read before the
2309          associated derived type symbol has been loaded. Return now and
2310          wait for a later iteration of load_needed.  */
2311       if (sym == NULL)
2312         return;
2313
2314       if (sym->components != NULL && p->u.pointer == NULL)
2315         {
2316           /* Symbol already loaded, so search by name.  */
2317           for (q = sym->components; q; q = q->next)
2318             if (strcmp (q->name, name) == 0)
2319               break;
2320
2321           if (q == NULL)
2322             gfc_internal_error ("mio_component_ref(): Component not found");
2323
2324           associate_integer_pointer (p, q);
2325         }
2326
2327       /* Make sure this symbol will eventually be loaded.  */
2328       p = find_pointer2 (sym);
2329       if (p->u.rsym.state == UNUSED)
2330         p->u.rsym.state = NEEDED;
2331     }
2332 }
2333
2334
2335 static void mio_namespace_ref (gfc_namespace **nsp);
2336 static void mio_formal_arglist (gfc_formal_arglist **formal);
2337 static void mio_typebound_proc (gfc_typebound_proc** proc);
2338
2339 static void
2340 mio_component (gfc_component *c)
2341 {
2342   pointer_info *p;
2343   int n;
2344   gfc_formal_arglist *formal;
2345
2346   mio_lparen ();
2347
2348   if (iomode == IO_OUTPUT)
2349     {
2350       p = get_pointer (c);
2351       mio_integer (&p->integer);
2352     }
2353   else
2354     {
2355       mio_integer (&n);
2356       p = get_integer (n);
2357       associate_integer_pointer (p, c);
2358     }
2359
2360   if (p->type == P_UNKNOWN)
2361     p->type = P_COMPONENT;
2362
2363   mio_pool_string (&c->name);
2364   mio_typespec (&c->ts);
2365   mio_array_spec (&c->as);
2366
2367   mio_symbol_attribute (&c->attr);
2368   c->attr.access = MIO_NAME (gfc_access) (c->attr.access, access_types); 
2369
2370   mio_expr (&c->initializer);
2371
2372   if (c->attr.proc_pointer)
2373     {
2374       if (iomode == IO_OUTPUT)
2375         {
2376           formal = c->formal;
2377           while (formal && !formal->sym)
2378             formal = formal->next;
2379
2380           if (formal)
2381             mio_namespace_ref (&formal->sym->ns);
2382           else
2383             mio_namespace_ref (&c->formal_ns);
2384         }
2385       else
2386         {
2387           mio_namespace_ref (&c->formal_ns);
2388           /* TODO: if (c->formal_ns)
2389             {
2390               c->formal_ns->proc_name = c;
2391               c->refs++;
2392             }*/
2393         }
2394
2395       mio_formal_arglist (&c->formal);
2396
2397       mio_typebound_proc (&c->tb);
2398     }
2399
2400   mio_rparen ();
2401 }
2402
2403
2404 static void
2405 mio_component_list (gfc_component **cp)
2406 {
2407   gfc_component *c, *tail;
2408
2409   mio_lparen ();
2410
2411   if (iomode == IO_OUTPUT)
2412     {
2413       for (c = *cp; c; c = c->next)
2414         mio_component (c);
2415     }
2416   else
2417     {
2418       *cp = NULL;
2419       tail = NULL;
2420
2421       for (;;)
2422         {
2423           if (peek_atom () == ATOM_RPAREN)
2424             break;
2425
2426           c = gfc_get_component ();
2427           mio_component (c);
2428
2429           if (tail == NULL)
2430             *cp = c;
2431           else
2432             tail->next = c;
2433
2434           tail = c;
2435         }
2436     }
2437
2438   mio_rparen ();
2439 }
2440
2441
2442 static void
2443 mio_actual_arg (gfc_actual_arglist *a)
2444 {
2445   mio_lparen ();
2446   mio_pool_string (&a->name);
2447   mio_expr (&a->expr);
2448   mio_rparen ();
2449 }
2450
2451
2452 static void
2453 mio_actual_arglist (gfc_actual_arglist **ap)
2454 {
2455   gfc_actual_arglist *a, *tail;
2456
2457   mio_lparen ();
2458
2459   if (iomode == IO_OUTPUT)
2460     {
2461       for (a = *ap; a; a = a->next)
2462         mio_actual_arg (a);
2463
2464     }
2465   else
2466     {
2467       tail = NULL;
2468
2469       for (;;)
2470         {
2471           if (peek_atom () != ATOM_LPAREN)
2472             break;
2473
2474           a = gfc_get_actual_arglist ();
2475
2476           if (tail == NULL)
2477             *ap = a;
2478           else
2479             tail->next = a;
2480
2481           tail = a;
2482           mio_actual_arg (a);
2483         }
2484     }
2485
2486   mio_rparen ();
2487 }
2488
2489
2490 /* Read and write formal argument lists.  */
2491
2492 static void
2493 mio_formal_arglist (gfc_formal_arglist **formal)
2494 {
2495   gfc_formal_arglist *f, *tail;
2496
2497   mio_lparen ();
2498
2499   if (iomode == IO_OUTPUT)
2500     {
2501       for (f = *formal; f; f = f->next)
2502         mio_symbol_ref (&f->sym);
2503     }
2504   else
2505     {
2506       *formal = tail = NULL;
2507
2508       while (peek_atom () != ATOM_RPAREN)
2509         {
2510           f = gfc_get_formal_arglist ();
2511           mio_symbol_ref (&f->sym);
2512
2513           if (*formal == NULL)
2514             *formal = f;
2515           else
2516             tail->next = f;
2517
2518           tail = f;
2519         }
2520     }
2521
2522   mio_rparen ();
2523 }
2524
2525
2526 /* Save or restore a reference to a symbol node.  */
2527
2528 pointer_info *
2529 mio_symbol_ref (gfc_symbol **symp)
2530 {
2531   pointer_info *p;
2532
2533   p = mio_pointer_ref (symp);
2534   if (p->type == P_UNKNOWN)
2535     p->type = P_SYMBOL;
2536
2537   if (iomode == IO_OUTPUT)
2538     {
2539       if (p->u.wsym.state == UNREFERENCED)
2540         p->u.wsym.state = NEEDS_WRITE;
2541     }
2542   else
2543     {
2544       if (p->u.rsym.state == UNUSED)
2545         p->u.rsym.state = NEEDED;
2546     }
2547   return p;
2548 }
2549
2550
2551 /* Save or restore a reference to a symtree node.  */
2552
2553 static void
2554 mio_symtree_ref (gfc_symtree **stp)
2555 {
2556   pointer_info *p;
2557   fixup_t *f;
2558
2559   if (iomode == IO_OUTPUT)
2560     mio_symbol_ref (&(*stp)->n.sym);
2561   else
2562     {
2563       require_atom (ATOM_INTEGER);
2564       p = get_integer (atom_int);
2565
2566       /* An unused equivalence member; make a symbol and a symtree
2567          for it.  */
2568       if (in_load_equiv && p->u.rsym.symtree == NULL)
2569         {
2570           /* Since this is not used, it must have a unique name.  */
2571           p->u.rsym.symtree = gfc_get_unique_symtree (gfc_current_ns);
2572
2573           /* Make the symbol.  */
2574           if (p->u.rsym.sym == NULL)
2575             {
2576               p->u.rsym.sym = gfc_new_symbol (p->u.rsym.true_name,
2577                                               gfc_current_ns);
2578               p->u.rsym.sym->module = gfc_get_string (p->u.rsym.module);
2579             }
2580
2581           p->u.rsym.symtree->n.sym = p->u.rsym.sym;
2582           p->u.rsym.symtree->n.sym->refs++;
2583           p->u.rsym.referenced = 1;
2584
2585           /* If the symbol is PRIVATE and in COMMON, load_commons will
2586              generate a fixup symbol, which must be associated.  */
2587           if (p->fixup)
2588             resolve_fixups (p->fixup, p->u.rsym.sym);
2589           p->fixup = NULL;
2590         }
2591       
2592       if (p->type == P_UNKNOWN)
2593         p->type = P_SYMBOL;
2594
2595       if (p->u.rsym.state == UNUSED)
2596         p->u.rsym.state = NEEDED;
2597
2598       if (p->u.rsym.symtree != NULL)
2599         {
2600           *stp = p->u.rsym.symtree;
2601         }
2602       else
2603         {
2604           f = XCNEW (fixup_t);
2605
2606           f->next = p->u.rsym.stfixup;
2607           p->u.rsym.stfixup = f;
2608
2609           f->pointer = (void **) stp;
2610         }
2611     }
2612 }
2613
2614
2615 static void
2616 mio_iterator (gfc_iterator **ip)
2617 {
2618   gfc_iterator *iter;
2619
2620   mio_lparen ();
2621
2622   if (iomode == IO_OUTPUT)
2623     {
2624       if (*ip == NULL)
2625         goto done;
2626     }
2627   else
2628     {
2629       if (peek_atom () == ATOM_RPAREN)
2630         {
2631           *ip = NULL;
2632           goto done;
2633         }
2634
2635       *ip = gfc_get_iterator ();
2636     }
2637
2638   iter = *ip;
2639
2640   mio_expr (&iter->var);
2641   mio_expr (&iter->start);
2642   mio_expr (&iter->end);
2643   mio_expr (&iter->step);
2644
2645 done:
2646   mio_rparen ();
2647 }
2648
2649
2650 static void
2651 mio_constructor (gfc_constructor_base *cp)
2652 {
2653   gfc_constructor *c;
2654
2655   mio_lparen ();
2656
2657   if (iomode == IO_OUTPUT)
2658     {
2659       for (c = gfc_constructor_first (*cp); c; c = gfc_constructor_next (c))
2660         {
2661           mio_lparen ();
2662           mio_expr (&c->expr);
2663           mio_iterator (&c->iterator);
2664           mio_rparen ();
2665         }
2666     }
2667   else
2668     {
2669       while (peek_atom () != ATOM_RPAREN)
2670         {
2671           c = gfc_constructor_append_expr (cp, NULL, NULL);
2672
2673           mio_lparen ();
2674           mio_expr (&c->expr);
2675           mio_iterator (&c->iterator);
2676           mio_rparen ();
2677         }
2678     }
2679
2680   mio_rparen ();
2681 }
2682
2683
2684 static const mstring ref_types[] = {
2685     minit ("ARRAY", REF_ARRAY),
2686     minit ("COMPONENT", REF_COMPONENT),
2687     minit ("SUBSTRING", REF_SUBSTRING),
2688     minit (NULL, -1)
2689 };
2690
2691
2692 static void
2693 mio_ref (gfc_ref **rp)
2694 {
2695   gfc_ref *r;
2696
2697   mio_lparen ();
2698
2699   r = *rp;
2700   r->type = MIO_NAME (ref_type) (r->type, ref_types);
2701
2702   switch (r->type)
2703     {
2704     case REF_ARRAY:
2705       mio_array_ref (&r->u.ar);
2706       break;
2707
2708     case REF_COMPONENT:
2709       mio_symbol_ref (&r->u.c.sym);
2710       mio_component_ref (&r->u.c.component, r->u.c.sym);
2711       break;
2712
2713     case REF_SUBSTRING:
2714       mio_expr (&r->u.ss.start);
2715       mio_expr (&r->u.ss.end);
2716       mio_charlen (&r->u.ss.length);
2717       break;
2718     }
2719
2720   mio_rparen ();
2721 }
2722
2723
2724 static void
2725 mio_ref_list (gfc_ref **rp)
2726 {
2727   gfc_ref *ref, *head, *tail;
2728
2729   mio_lparen ();
2730
2731   if (iomode == IO_OUTPUT)
2732     {
2733       for (ref = *rp; ref; ref = ref->next)
2734         mio_ref (&ref);
2735     }
2736   else
2737     {
2738       head = tail = NULL;
2739
2740       while (peek_atom () != ATOM_RPAREN)
2741         {
2742           if (head == NULL)
2743             head = tail = gfc_get_ref ();
2744           else
2745             {
2746               tail->next = gfc_get_ref ();
2747               tail = tail->next;
2748             }
2749
2750           mio_ref (&tail);
2751         }
2752
2753       *rp = head;
2754     }
2755
2756   mio_rparen ();
2757 }
2758
2759
2760 /* Read and write an integer value.  */
2761
2762 static void
2763 mio_gmp_integer (mpz_t *integer)
2764 {
2765   char *p;
2766
2767   if (iomode == IO_INPUT)
2768     {
2769       if (parse_atom () != ATOM_STRING)
2770         bad_module ("Expected integer string");
2771
2772       mpz_init (*integer);
2773       if (mpz_set_str (*integer, atom_string, 10))
2774         bad_module ("Error converting integer");
2775
2776       gfc_free (atom_string);
2777     }
2778   else
2779     {
2780       p = mpz_get_str (NULL, 10, *integer);
2781       write_atom (ATOM_STRING, p);
2782       gfc_free (p);
2783     }
2784 }
2785
2786
2787 static void
2788 mio_gmp_real (mpfr_t *real)
2789 {
2790   mp_exp_t exponent;
2791   char *p;
2792
2793   if (iomode == IO_INPUT)
2794     {
2795       if (parse_atom () != ATOM_STRING)
2796         bad_module ("Expected real string");
2797
2798       mpfr_init (*real);
2799       mpfr_set_str (*real, atom_string, 16, GFC_RND_MODE);
2800       gfc_free (atom_string);
2801     }
2802   else
2803     {
2804       p = mpfr_get_str (NULL, &exponent, 16, 0, *real, GFC_RND_MODE);
2805
2806       if (mpfr_nan_p (*real) || mpfr_inf_p (*real))
2807         {
2808           write_atom (ATOM_STRING, p);
2809           gfc_free (p);
2810           return;
2811         }
2812
2813       atom_string = XCNEWVEC (char, strlen (p) + 20);
2814
2815       sprintf (atom_string, "0.%s@%ld", p, exponent);
2816
2817       /* Fix negative numbers.  */
2818       if (atom_string[2] == '-')
2819         {
2820           atom_string[0] = '-';
2821           atom_string[1] = '0';
2822           atom_string[2] = '.';
2823         }
2824
2825       write_atom (ATOM_STRING, atom_string);
2826
2827       gfc_free (atom_string);
2828       gfc_free (p);
2829     }
2830 }
2831
2832
2833 /* Save and restore the shape of an array constructor.  */
2834
2835 static void
2836 mio_shape (mpz_t **pshape, int rank)
2837 {
2838   mpz_t *shape;
2839   atom_type t;
2840   int n;
2841
2842   /* A NULL shape is represented by ().  */
2843   mio_lparen ();
2844
2845   if (iomode == IO_OUTPUT)
2846     {
2847       shape = *pshape;
2848       if (!shape)
2849         {
2850           mio_rparen ();
2851           return;
2852         }
2853     }
2854   else
2855     {
2856       t = peek_atom ();
2857       if (t == ATOM_RPAREN)
2858         {
2859           *pshape = NULL;
2860           mio_rparen ();
2861           return;
2862         }
2863
2864       shape = gfc_get_shape (rank);
2865       *pshape = shape;
2866     }
2867
2868   for (n = 0; n < rank; n++)
2869     mio_gmp_integer (&shape[n]);
2870
2871   mio_rparen ();
2872 }
2873
2874
2875 static const mstring expr_types[] = {
2876     minit ("OP", EXPR_OP),
2877     minit ("FUNCTION", EXPR_FUNCTION),
2878     minit ("CONSTANT", EXPR_CONSTANT),
2879     minit ("VARIABLE", EXPR_VARIABLE),
2880     minit ("SUBSTRING", EXPR_SUBSTRING),
2881     minit ("STRUCTURE", EXPR_STRUCTURE),
2882     minit ("ARRAY", EXPR_ARRAY),
2883     minit ("NULL", EXPR_NULL),
2884     minit ("COMPCALL", EXPR_COMPCALL),
2885     minit (NULL, -1)
2886 };
2887
2888 /* INTRINSIC_ASSIGN is missing because it is used as an index for
2889    generic operators, not in expressions.  INTRINSIC_USER is also
2890    replaced by the correct function name by the time we see it.  */
2891
2892 static const mstring intrinsics[] =
2893 {
2894     minit ("UPLUS", INTRINSIC_UPLUS),
2895     minit ("UMINUS", INTRINSIC_UMINUS),
2896     minit ("PLUS", INTRINSIC_PLUS),
2897     minit ("MINUS", INTRINSIC_MINUS),
2898     minit ("TIMES", INTRINSIC_TIMES),
2899     minit ("DIVIDE", INTRINSIC_DIVIDE),
2900     minit ("POWER", INTRINSIC_POWER),
2901     minit ("CONCAT", INTRINSIC_CONCAT),
2902     minit ("AND", INTRINSIC_AND),
2903     minit ("OR", INTRINSIC_OR),
2904     minit ("EQV", INTRINSIC_EQV),
2905     minit ("NEQV", INTRINSIC_NEQV),
2906     minit ("EQ_SIGN", INTRINSIC_EQ),
2907     minit ("EQ", INTRINSIC_EQ_OS),
2908     minit ("NE_SIGN", INTRINSIC_NE),
2909     minit ("NE", INTRINSIC_NE_OS),
2910     minit ("GT_SIGN", INTRINSIC_GT),
2911     minit ("GT", INTRINSIC_GT_OS),
2912     minit ("GE_SIGN", INTRINSIC_GE),
2913     minit ("GE", INTRINSIC_GE_OS),
2914     minit ("LT_SIGN", INTRINSIC_LT),
2915     minit ("LT", INTRINSIC_LT_OS),
2916     minit ("LE_SIGN", INTRINSIC_LE),
2917     minit ("LE", INTRINSIC_LE_OS),
2918     minit ("NOT", INTRINSIC_NOT),
2919     minit ("PARENTHESES", INTRINSIC_PARENTHESES),
2920     minit (NULL, -1)
2921 };
2922
2923
2924 /* Remedy a couple of situations where the gfc_expr's can be defective.  */
2925  
2926 static void
2927 fix_mio_expr (gfc_expr *e)
2928 {
2929   gfc_symtree *ns_st = NULL;
2930   const char *fname;
2931
2932   if (iomode != IO_OUTPUT)
2933     return;
2934
2935   if (e->symtree)
2936     {
2937       /* If this is a symtree for a symbol that came from a contained module
2938          namespace, it has a unique name and we should look in the current
2939          namespace to see if the required, non-contained symbol is available
2940          yet. If so, the latter should be written.  */
2941       if (e->symtree->n.sym && check_unique_name (e->symtree->name))
2942         ns_st = gfc_find_symtree (gfc_current_ns->sym_root,
2943                                   e->symtree->n.sym->name);
2944
2945       /* On the other hand, if the existing symbol is the module name or the
2946          new symbol is a dummy argument, do not do the promotion.  */
2947       if (ns_st && ns_st->n.sym
2948           && ns_st->n.sym->attr.flavor != FL_MODULE
2949           && !e->symtree->n.sym->attr.dummy)
2950         e->symtree = ns_st;
2951     }
2952   else if (e->expr_type == EXPR_FUNCTION && e->value.function.name)
2953     {
2954       gfc_symbol *sym;
2955
2956       /* In some circumstances, a function used in an initialization
2957          expression, in one use associated module, can fail to be
2958          coupled to its symtree when used in a specification
2959          expression in another module.  */
2960       fname = e->value.function.esym ? e->value.function.esym->name
2961                                      : e->value.function.isym->name;
2962       e->symtree = gfc_find_symtree (gfc_current_ns->sym_root, fname);
2963
2964       if (e->symtree)
2965         return;
2966
2967       /* This is probably a reference to a private procedure from another
2968          module.  To prevent a segfault, make a generic with no specific
2969          instances.  If this module is used, without the required
2970          specific coming from somewhere, the appropriate error message
2971          is issued.  */
2972       gfc_get_symbol (fname, gfc_current_ns, &sym);
2973       sym->attr.flavor = FL_PROCEDURE;
2974       sym->attr.generic = 1;
2975       e->symtree = gfc_find_symtree (gfc_current_ns->sym_root, fname);
2976     }
2977 }
2978
2979
2980 /* Read and write expressions.  The form "()" is allowed to indicate a
2981    NULL expression.  */
2982
2983 static void
2984 mio_expr (gfc_expr **ep)
2985 {
2986   gfc_expr *e;
2987   atom_type t;
2988   int flag;
2989
2990   mio_lparen ();
2991
2992   if (iomode == IO_OUTPUT)
2993     {
2994       if (*ep == NULL)
2995         {
2996           mio_rparen ();
2997           return;
2998         }
2999
3000       e = *ep;
3001       MIO_NAME (expr_t) (e->expr_type, expr_types);
3002     }
3003   else
3004     {
3005       t = parse_atom ();
3006       if (t == ATOM_RPAREN)
3007         {
3008           *ep = NULL;
3009           return;
3010         }
3011
3012       if (t != ATOM_NAME)
3013         bad_module ("Expected expression type");
3014
3015       e = *ep = gfc_get_expr ();
3016       e->where = gfc_current_locus;
3017       e->expr_type = (expr_t) find_enum (expr_types);
3018     }
3019
3020   mio_typespec (&e->ts);
3021   mio_integer (&e->rank);
3022
3023   fix_mio_expr (e);
3024
3025   switch (e->expr_type)
3026     {
3027     case EXPR_OP:
3028       e->value.op.op
3029         = MIO_NAME (gfc_intrinsic_op) (e->value.op.op, intrinsics);
3030
3031       switch (e->value.op.op)
3032         {
3033         case INTRINSIC_UPLUS:
3034         case INTRINSIC_UMINUS:
3035         case INTRINSIC_NOT:
3036         case INTRINSIC_PARENTHESES:
3037           mio_expr (&e->value.op.op1);
3038           break;
3039
3040         case INTRINSIC_PLUS:
3041         case INTRINSIC_MINUS:
3042         case INTRINSIC_TIMES:
3043         case INTRINSIC_DIVIDE:
3044         case INTRINSIC_POWER:
3045         case INTRINSIC_CONCAT:
3046         case INTRINSIC_AND:
3047         case INTRINSIC_OR:
3048         case INTRINSIC_EQV:
3049         case INTRINSIC_NEQV:
3050         case INTRINSIC_EQ:
3051         case INTRINSIC_EQ_OS:
3052         case INTRINSIC_NE:
3053         case INTRINSIC_NE_OS:
3054         case INTRINSIC_GT:
3055         case INTRINSIC_GT_OS:
3056         case INTRINSIC_GE:
3057         case INTRINSIC_GE_OS:
3058         case INTRINSIC_LT:
3059         case INTRINSIC_LT_OS:
3060         case INTRINSIC_LE:
3061         case INTRINSIC_LE_OS:
3062           mio_expr (&e->value.op.op1);
3063           mio_expr (&e->value.op.op2);
3064           break;
3065
3066         default:
3067           bad_module ("Bad operator");
3068         }
3069
3070       break;
3071
3072     case EXPR_FUNCTION:
3073       mio_symtree_ref (&e->symtree);
3074       mio_actual_arglist (&e->value.function.actual);
3075
3076       if (iomode == IO_OUTPUT)
3077         {
3078           e->value.function.name
3079             = mio_allocated_string (e->value.function.name);
3080           flag = e->value.function.esym != NULL;
3081           mio_integer (&flag);
3082           if (flag)
3083             mio_symbol_ref (&e->value.function.esym);
3084           else
3085             write_atom (ATOM_STRING, e->value.function.isym->name);
3086         }
3087       else
3088         {
3089           require_atom (ATOM_STRING);
3090           e->value.function.name = gfc_get_string (atom_string);
3091           gfc_free (atom_string);
3092
3093           mio_integer (&flag);
3094           if (flag)
3095             mio_symbol_ref (&e->value.function.esym);
3096           else
3097             {
3098               require_atom (ATOM_STRING);
3099               e->value.function.isym = gfc_find_function (atom_string);
3100               gfc_free (atom_string);
3101             }
3102         }
3103
3104       break;
3105
3106     case EXPR_VARIABLE:
3107       mio_symtree_ref (&e->symtree);
3108       mio_ref_list (&e->ref);
3109       break;
3110
3111     case EXPR_SUBSTRING:
3112       e->value.character.string
3113         = CONST_CAST (gfc_char_t *,
3114                       mio_allocated_wide_string (e->value.character.string,
3115                                                  e->value.character.length));
3116       mio_ref_list (&e->ref);
3117       break;
3118
3119     case EXPR_STRUCTURE:
3120     case EXPR_ARRAY:
3121       mio_constructor (&e->value.constructor);
3122       mio_shape (&e->shape, e->rank);
3123       break;
3124
3125     case EXPR_CONSTANT:
3126       switch (e->ts.type)
3127         {
3128         case BT_INTEGER:
3129           mio_gmp_integer (&e->value.integer);
3130           break;
3131
3132         case BT_REAL:
3133           gfc_set_model_kind (e->ts.kind);
3134           mio_gmp_real (&e->value.real);
3135           break;
3136
3137         case BT_COMPLEX:
3138           gfc_set_model_kind (e->ts.kind);
3139           mio_gmp_real (&mpc_realref (e->value.complex));
3140           mio_gmp_real (&mpc_imagref (e->value.complex));
3141           break;
3142
3143         case BT_LOGICAL:
3144           mio_integer (&e->value.logical);
3145           break;
3146
3147         case BT_CHARACTER:
3148           mio_integer (&e->value.character.length);
3149           e->value.character.string
3150             = CONST_CAST (gfc_char_t *,
3151                           mio_allocated_wide_string (e->value.character.string,
3152                                                      e->value.character.length));
3153           break;
3154
3155         default:
3156           bad_module ("Bad type in constant expression");
3157         }
3158
3159       break;
3160
3161     case EXPR_NULL:
3162       break;
3163
3164     case EXPR_COMPCALL:
3165     case EXPR_PPC:
3166       gcc_unreachable ();
3167       break;
3168     }
3169
3170   mio_rparen ();
3171 }
3172
3173
3174 /* Read and write namelists.  */
3175
3176 static void
3177 mio_namelist (gfc_symbol *sym)
3178 {
3179   gfc_namelist *n, *m;
3180   const char *check_name;
3181
3182   mio_lparen ();
3183
3184   if (iomode == IO_OUTPUT)
3185     {
3186       for (n = sym->namelist; n; n = n->next)
3187         mio_symbol_ref (&n->sym);
3188     }
3189   else
3190     {
3191       /* This departure from the standard is flagged as an error.
3192          It does, in fact, work correctly. TODO: Allow it
3193          conditionally?  */
3194       if (sym->attr.flavor == FL_NAMELIST)
3195         {
3196           check_name = find_use_name (sym->name, false);
3197           if (check_name && strcmp (check_name, sym->name) != 0)
3198             gfc_error ("Namelist %s cannot be renamed by USE "
3199                        "association to %s", sym->name, check_name);
3200         }
3201
3202       m = NULL;
3203       while (peek_atom () != ATOM_RPAREN)
3204         {
3205           n = gfc_get_namelist ();
3206           mio_symbol_ref (&n->sym);
3207
3208           if (sym->namelist == NULL)
3209             sym->namelist = n;
3210           else
3211             m->next = n;
3212
3213           m = n;
3214         }
3215       sym->namelist_tail = m;
3216     }
3217
3218   mio_rparen ();
3219 }
3220
3221
3222 /* Save/restore lists of gfc_interface structures.  When loading an
3223    interface, we are really appending to the existing list of
3224    interfaces.  Checking for duplicate and ambiguous interfaces has to
3225    be done later when all symbols have been loaded.  */
3226
3227 pointer_info *
3228 mio_interface_rest (gfc_interface **ip)
3229 {
3230   gfc_interface *tail, *p;
3231   pointer_info *pi = NULL;
3232
3233   if (iomode == IO_OUTPUT)
3234     {
3235       if (ip != NULL)
3236         for (p = *ip; p; p = p->next)
3237           mio_symbol_ref (&p->sym);
3238     }
3239   else
3240     {
3241       if (*ip == NULL)
3242         tail = NULL;
3243       else
3244         {
3245           tail = *ip;
3246           while (tail->next)
3247             tail = tail->next;
3248         }
3249
3250       for (;;)
3251         {
3252           if (peek_atom () == ATOM_RPAREN)
3253             break;
3254
3255           p = gfc_get_interface ();
3256           p->where = gfc_current_locus;
3257           pi = mio_symbol_ref (&p->sym);
3258
3259           if (tail == NULL)
3260             *ip = p;
3261           else
3262             tail->next = p;
3263
3264           tail = p;
3265         }
3266     }
3267
3268   mio_rparen ();
3269   return pi;
3270 }
3271
3272
3273 /* Save/restore a nameless operator interface.  */
3274
3275 static void
3276 mio_interface (gfc_interface **ip)
3277 {
3278   mio_lparen ();
3279   mio_interface_rest (ip);
3280 }
3281
3282
3283 /* Save/restore a named operator interface.  */
3284
3285 static void
3286 mio_symbol_interface (const char **name, const char **module,
3287                       gfc_interface **ip)
3288 {
3289   mio_lparen ();
3290   mio_pool_string (name);
3291   mio_pool_string (module);
3292   mio_interface_rest (ip);
3293 }
3294
3295
3296 static void
3297 mio_namespace_ref (gfc_namespace **nsp)
3298 {
3299   gfc_namespace *ns;
3300   pointer_info *p;
3301
3302   p = mio_pointer_ref (nsp);
3303
3304   if (p->type == P_UNKNOWN)
3305     p->type = P_NAMESPACE;
3306
3307   if (iomode == IO_INPUT && p->integer != 0)
3308     {
3309       ns = (gfc_namespace *) p->u.pointer;
3310       if (ns == NULL)
3311         {
3312           ns = gfc_get_namespace (NULL, 0);
3313           associate_integer_pointer (p, ns);
3314         }
3315       else
3316         ns->refs++;
3317     }
3318 }
3319
3320
3321 /* Save/restore the f2k_derived namespace of a derived-type symbol.  */
3322
3323 static gfc_namespace* current_f2k_derived;
3324
3325 static void
3326 mio_typebound_proc (gfc_typebound_proc** proc)
3327 {
3328   int flag;
3329   int overriding_flag;
3330
3331   if (iomode == IO_INPUT)
3332     {
3333       *proc = gfc_get_typebound_proc (NULL);
3334       (*proc)->where = gfc_current_locus;
3335     }
3336   gcc_assert (*proc);
3337
3338   mio_lparen ();
3339
3340   (*proc)->access = MIO_NAME (gfc_access) ((*proc)->access, access_types);
3341
3342   /* IO the NON_OVERRIDABLE/DEFERRED combination.  */
3343   gcc_assert (!((*proc)->deferred && (*proc)->non_overridable));
3344   overriding_flag = ((*proc)->deferred << 1) | (*proc)->non_overridable;
3345   overriding_flag = mio_name (overriding_flag, binding_overriding);
3346   (*proc)->deferred = ((overriding_flag & 2) != 0);
3347   (*proc)->non_overridable = ((overriding_flag & 1) != 0);
3348   gcc_assert (!((*proc)->deferred && (*proc)->non_overridable));
3349
3350   (*proc)->nopass = mio_name ((*proc)->nopass, binding_passing);
3351   (*proc)->is_generic = mio_name ((*proc)->is_generic, binding_generic);
3352   (*proc)->ppc = mio_name((*proc)->ppc, binding_ppc);
3353
3354   mio_pool_string (&((*proc)->pass_arg));
3355
3356   flag = (int) (*proc)->pass_arg_num;
3357   mio_integer (&flag);
3358   (*proc)->pass_arg_num = (unsigned) flag;
3359
3360   if ((*proc)->is_generic)
3361     {
3362       gfc_tbp_generic* g;
3363
3364       mio_lparen ();
3365
3366       if (iomode == IO_OUTPUT)
3367         for (g = (*proc)->u.generic; g; g = g->next)
3368           mio_allocated_string (g->specific_st->name);
3369       else
3370         {
3371           (*proc)->u.generic = NULL;
3372           while (peek_atom () != ATOM_RPAREN)
3373             {
3374               gfc_symtree** sym_root;
3375
3376               g = gfc_get_tbp_generic ();
3377               g->specific = NULL;
3378
3379               require_atom (ATOM_STRING);
3380               sym_root = &current_f2k_derived->tb_sym_root;
3381               g->specific_st = gfc_get_tbp_symtree (sym_root, atom_string);
3382               gfc_free (atom_string);
3383
3384               g->next = (*proc)->u.generic;
3385               (*proc)->u.generic = g;
3386             }
3387         }
3388
3389       mio_rparen ();
3390     }
3391   else if (!(*proc)->ppc)
3392     mio_symtree_ref (&(*proc)->u.specific);
3393
3394   mio_rparen ();
3395 }
3396
3397 /* Walker-callback function for this purpose.  */
3398 static void
3399 mio_typebound_symtree (gfc_symtree* st)
3400 {
3401   if (iomode == IO_OUTPUT && !st->n.tb)
3402     return;
3403
3404   if (iomode == IO_OUTPUT)
3405     {
3406       mio_lparen ();
3407       mio_allocated_string (st->name);
3408     }
3409   /* For IO_INPUT, the above is done in mio_f2k_derived.  */
3410
3411   mio_typebound_proc (&st->n.tb);
3412   mio_rparen ();
3413 }
3414
3415 /* IO a full symtree (in all depth).  */
3416 static void
3417 mio_full_typebound_tree (gfc_symtree** root)
3418 {
3419   mio_lparen ();
3420
3421   if (iomode == IO_OUTPUT)
3422     gfc_traverse_symtree (*root, &mio_typebound_symtree);
3423   else
3424     {
3425       while (peek_atom () == ATOM_LPAREN)
3426         {
3427           gfc_symtree* st;
3428
3429           mio_lparen (); 
3430
3431           require_atom (ATOM_STRING);
3432           st = gfc_get_tbp_symtree (root, atom_string);
3433           gfc_free (atom_string);
3434
3435           mio_typebound_symtree (st);
3436         }
3437     }
3438
3439   mio_rparen ();
3440 }
3441
3442 static void
3443 mio_finalizer (gfc_finalizer **f)
3444 {
3445   if (iomode == IO_OUTPUT)
3446     {
3447       gcc_assert (*f);
3448       gcc_assert ((*f)->proc_tree); /* Should already be resolved.  */
3449       mio_symtree_ref (&(*f)->proc_tree);
3450     }
3451   else
3452     {
3453       *f = gfc_get_finalizer ();
3454       (*f)->where = gfc_current_locus; /* Value should not matter.  */
3455       (*f)->next = NULL;
3456
3457       mio_symtree_ref (&(*f)->proc_tree);
3458       (*f)->proc_sym = NULL;
3459     }
3460 }
3461
3462 static void
3463 mio_f2k_derived (gfc_namespace *f2k)
3464 {
3465   current_f2k_derived = f2k;
3466
3467   /* Handle the list of finalizer procedures.  */
3468   mio_lparen ();
3469   if (iomode == IO_OUTPUT)
3470     {
3471       gfc_finalizer *f;
3472       for (f = f2k->finalizers; f; f = f->next)
3473         mio_finalizer (&f);
3474     }
3475   else
3476     {
3477       f2k->finalizers = NULL;
3478       while (peek_atom () != ATOM_RPAREN)
3479         {
3480           gfc_finalizer *cur = NULL;
3481           mio_finalizer (&cur);
3482           cur->next = f2k->finalizers;
3483           f2k->finalizers = cur;
3484         }
3485     }
3486   mio_rparen ();
3487
3488   /* Handle type-bound procedures.  */
3489   mio_full_typebound_tree (&f2k->tb_sym_root);
3490
3491   /* Type-bound user operators.  */
3492   mio_full_typebound_tree (&f2k->tb_uop_root);
3493
3494   /* Type-bound intrinsic operators.  */
3495   mio_lparen ();
3496   if (iomode == IO_OUTPUT)
3497     {
3498       int op;
3499       for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; ++op)
3500         {
3501           gfc_intrinsic_op realop;
3502
3503           if (op == INTRINSIC_USER || !f2k->tb_op[op])
3504             continue;
3505
3506           mio_lparen ();
3507           realop = (gfc_intrinsic_op) op;
3508           mio_intrinsic_op (&realop);
3509           mio_typebound_proc (&f2k->tb_op[op]);
3510           mio_rparen ();
3511         }
3512     }
3513   else
3514     while (peek_atom () != ATOM_RPAREN)
3515       {
3516         gfc_intrinsic_op op = GFC_INTRINSIC_BEGIN; /* Silence GCC.  */
3517
3518         mio_lparen ();
3519         mio_intrinsic_op (&op);
3520         mio_typebound_proc (&f2k->tb_op[op]);
3521         mio_rparen ();
3522       }
3523   mio_rparen ();
3524 }
3525
3526 static void
3527 mio_full_f2k_derived (gfc_symbol *sym)
3528 {
3529   mio_lparen ();
3530   
3531   if (iomode == IO_OUTPUT)
3532     {
3533       if (sym->f2k_derived)
3534         mio_f2k_derived (sym->f2k_derived);
3535     }
3536   else
3537     {
3538       if (peek_atom () != ATOM_RPAREN)
3539         {
3540           sym->f2k_derived = gfc_get_namespace (NULL, 0);
3541           mio_f2k_derived (sym->f2k_derived);
3542         }
3543       else
3544         gcc_assert (!sym->f2k_derived);
3545     }
3546
3547   mio_rparen ();
3548 }
3549
3550
3551 /* Unlike most other routines, the address of the symbol node is already
3552    fixed on input and the name/module has already been filled in.  */
3553
3554 static void
3555 mio_symbol (gfc_symbol *sym)
3556 {
3557   int intmod = INTMOD_NONE;
3558   
3559   mio_lparen ();
3560
3561   mio_symbol_attribute (&sym->attr);
3562   mio_typespec (&sym->ts);
3563
3564   if (iomode == IO_OUTPUT)
3565     mio_namespace_ref (&sym->formal_ns);
3566   else
3567     {
3568       mio_namespace_ref (&sym->formal_ns);
3569       if (sym->formal_ns)
3570         {
3571           sym->formal_ns->proc_name = sym;
3572           sym->refs++;
3573         }
3574     }
3575
3576   /* Save/restore common block links.  */
3577   mio_symbol_ref (&sym->common_next);
3578
3579   mio_formal_arglist (&sym->formal);
3580
3581   if (sym->attr.flavor == FL_PARAMETER)
3582     mio_expr (&sym->value);
3583
3584   mio_array_spec (&sym->as);
3585
3586   mio_symbol_ref (&sym->result);
3587
3588   if (sym->attr.cray_pointee)
3589     mio_symbol_ref (&sym->cp_pointer);
3590
3591   /* Note that components are always saved, even if they are supposed
3592      to be private.  Component access is checked during searching.  */
3593
3594   mio_component_list (&sym->components);
3595
3596   if (sym->components != NULL)
3597     sym->component_access
3598       = MIO_NAME (gfc_access) (sym->component_access, access_types);
3599
3600   /* Load/save the f2k_derived namespace of a derived-type symbol.  */
3601   mio_full_f2k_derived (sym);
3602
3603   mio_namelist (sym);
3604
3605   /* Add the fields that say whether this is from an intrinsic module,
3606      and if so, what symbol it is within the module.  */
3607 /*   mio_integer (&(sym->from_intmod)); */
3608   if (iomode == IO_OUTPUT)
3609     {
3610       intmod = sym->from_intmod;
3611       mio_integer (&intmod);
3612     }
3613   else
3614     {
3615       mio_integer (&intmod);
3616       sym->from_intmod = (intmod_id) intmod;
3617     }
3618   
3619   mio_integer (&(sym->intmod_sym_id));
3620
3621   if (sym->attr.flavor == FL_DERIVED)
3622     mio_integer (&(sym->hash_value));
3623
3624   mio_rparen ();
3625 }
3626
3627
3628 /************************* Top level subroutines *************************/
3629
3630 /* Given a root symtree node and a symbol, try to find a symtree that
3631    references the symbol that is not a unique name.  */
3632
3633 static gfc_symtree *
3634 find_symtree_for_symbol (gfc_symtree *st, gfc_symbol *sym)
3635 {
3636   gfc_symtree *s = NULL;
3637
3638   if (st == NULL)
3639     return s;
3640
3641   s = find_symtree_for_symbol (st->right, sym);
3642   if (s != NULL)
3643     return s;
3644   s = find_symtree_for_symbol (st->left, sym);
3645   if (s != NULL)
3646     return s;
3647
3648   if (st->n.sym == sym && !check_unique_name (st->name))
3649     return st;
3650
3651   return s;
3652 }
3653
3654
3655 /* A recursive function to look for a specific symbol by name and by
3656    module.  Whilst several symtrees might point to one symbol, its
3657    is sufficient for the purposes here than one exist.  Note that
3658    generic interfaces are distinguished as are symbols that have been
3659    renamed in another module.  */
3660 static gfc_symtree *
3661 find_symbol (gfc_symtree *st, const char *name,
3662              const char *module, int generic)
3663 {
3664   int c;
3665   gfc_symtree *retval, *s;
3666
3667   if (st == NULL || st->n.sym == NULL)
3668     return NULL;
3669
3670   c = strcmp (name, st->n.sym->name);
3671   if (c == 0 && st->n.sym->module
3672              && strcmp (module, st->n.sym->module) == 0
3673              && !check_unique_name (st->name))
3674     {
3675       s = gfc_find_symtree (gfc_current_ns->sym_root, name);
3676
3677       /* Detect symbols that are renamed by use association in another
3678          module by the absence of a symtree and null attr.use_rename,
3679          since the latter is not transmitted in the module file.  */
3680       if (((!generic && !st->n.sym->attr.generic)
3681                 || (generic && st->n.sym->attr.generic))
3682             && !(s == NULL && !st->n.sym->attr.use_rename))
3683         return st;
3684     }
3685
3686   retval = find_symbol (st->left, name, module, generic);
3687
3688   if (retval == NULL)
3689     retval = find_symbol (st->right, name, module, generic);
3690
3691   return retval;
3692 }
3693
3694
3695 /* Skip a list between balanced left and right parens.  */
3696
3697 static void
3698 skip_list (void)
3699 {
3700   int level;
3701
3702   level = 0;
3703   do
3704     {
3705       switch (parse_atom ())
3706         {
3707         case ATOM_LPAREN:
3708           level++;
3709           break;
3710
3711         case ATOM_RPAREN:
3712           level--;
3713           break;
3714
3715         case ATOM_STRING:
3716           gfc_free (atom_string);
3717           break;
3718
3719         case ATOM_NAME:
3720         case ATOM_INTEGER:
3721           break;
3722         }
3723     }
3724   while (level > 0);
3725 }
3726
3727
3728 /* Load operator interfaces from the module.  Interfaces are unusual
3729    in that they attach themselves to existing symbols.  */
3730
3731 static void
3732 load_operator_interfaces (void)
3733 {
3734   const char *p;
3735   char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
3736   gfc_user_op *uop;
3737   pointer_info *pi = NULL;
3738   int n, i;
3739
3740   mio_lparen ();
3741
3742   while (peek_atom () != ATOM_RPAREN)
3743     {
3744       mio_lparen ();
3745
3746       mio_internal_string (name);
3747       mio_internal_string (module);
3748
3749       n = number_use_names (name, true);
3750       n = n ? n : 1;
3751
3752       for (i = 1; i <= n; i++)
3753         {
3754           /* Decide if we need to load this one or not.  */
3755           p = find_use_name_n (name, &i, true);
3756
3757           if (p == NULL)
3758             {
3759               while (parse_atom () != ATOM_RPAREN);
3760               continue;