OSDN Git Service

PR fortran/36162
[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    Free Software Foundation, Inc.
5    Contributed by Andy Vaught
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
12 version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3.  If not see
21 <http://www.gnu.org/licenses/>.  */
22
23 /* The syntax of gfortran modules resembles that of lisp lists, ie a
24    sequence of atoms, which can be left or right parenthesis, names,
25    integers or strings.  Parenthesis are always matched which allows
26    us to skip over sections at high speed without having to know
27    anything about the internal structure of the lists.  A "name" is
28    usually a fortran 95 identifier, but can also start with '@' in
29    order to reference a hidden symbol.
30
31    The first line of a module is an informational message about what
32    created the module, the file it came from and when it was created.
33    The second line is a warning for people not to edit the module.
34    The rest of the module looks like:
35
36    ( ( <Interface info for UPLUS> )
37      ( <Interface info for UMINUS> )
38      ...
39    )
40    ( ( <name of operator interface> <module of op interface> <i/f1> ... )
41      ...
42    )
43    ( ( <name of generic interface> <module of generic interface> <i/f1> ... )
44      ...
45    )
46    ( ( <common name> <symbol> <saved flag>)
47      ...
48    )
49
50    ( equivalence list )
51
52    ( <Symbol Number (in no particular order)>
53      <True name of symbol>
54      <Module name of symbol>
55      ( <symbol information> )
56      ...
57    )
58    ( <Symtree name>
59      <Ambiguous flag>
60      <Symbol number>
61      ...
62    )
63
64    In general, symbols refer to other symbols by their symbol number,
65    which are zero based.  Symbols are written to the module in no
66    particular order.  */
67
68 #include "config.h"
69 #include "system.h"
70 #include "gfortran.h"
71 #include "arith.h"
72 #include "match.h"
73 #include "parse.h" /* FIXME */
74 #include "md5.h"
75
76 #define MODULE_EXTENSION ".mod"
77
78
79 /* Structure that describes a position within a module file.  */
80
81 typedef struct
82 {
83   int column, line;
84   fpos_t pos;
85 }
86 module_locus;
87
88 /* Structure for list of symbols of intrinsic modules.  */
89 typedef struct
90 {
91   int id;
92   const char *name;
93   int value;
94 }
95 intmod_sym;
96
97
98 typedef enum
99 {
100   P_UNKNOWN = 0, P_OTHER, P_NAMESPACE, P_COMPONENT, P_SYMBOL
101 }
102 pointer_t;
103
104 /* The fixup structure lists pointers to pointers that have to
105    be updated when a pointer value becomes known.  */
106
107 typedef struct fixup_t
108 {
109   void **pointer;
110   struct fixup_t *next;
111 }
112 fixup_t;
113
114
115 /* Structure for holding extra info needed for pointers being read.  */
116
117 typedef struct pointer_info
118 {
119   BBT_HEADER (pointer_info);
120   int integer;
121   pointer_t type;
122
123   /* The first component of each member of the union is the pointer
124      being stored.  */
125
126   fixup_t *fixup;
127
128   union
129   {
130     void *pointer;      /* Member for doing pointer searches.  */
131
132     struct
133     {
134       gfc_symbol *sym;
135       char true_name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
136       enum
137       { UNUSED, NEEDED, USED }
138       state;
139       int ns, referenced, renamed;
140       module_locus where;
141       fixup_t *stfixup;
142       gfc_symtree *symtree;
143       char binding_label[GFC_MAX_SYMBOL_LEN + 1];
144     }
145     rsym;
146
147     struct
148     {
149       gfc_symbol *sym;
150       enum
151       { UNREFERENCED = 0, NEEDS_WRITE, WRITTEN }
152       state;
153     }
154     wsym;
155   }
156   u;
157
158 }
159 pointer_info;
160
161 #define gfc_get_pointer_info() gfc_getmem(sizeof(pointer_info))
162
163
164 /* Lists of rename info for the USE statement.  */
165
166 typedef struct gfc_use_rename
167 {
168   char local_name[GFC_MAX_SYMBOL_LEN + 1], use_name[GFC_MAX_SYMBOL_LEN + 1];
169   struct gfc_use_rename *next;
170   int found;
171   gfc_intrinsic_op operator;
172   locus where;
173 }
174 gfc_use_rename;
175
176 #define gfc_get_use_rename() gfc_getmem(sizeof(gfc_use_rename))
177
178 /* Local variables */
179
180 /* The FILE for the module we're reading or writing.  */
181 static FILE *module_fp;
182
183 /* MD5 context structure.  */
184 static struct md5_ctx ctx;
185
186 /* The name of the module we're reading (USE'ing) or writing.  */
187 static char module_name[GFC_MAX_SYMBOL_LEN + 1];
188
189 /* The way the module we're reading was specified.  */
190 static bool specified_nonint, specified_int;
191
192 static int module_line, module_column, only_flag;
193 static enum
194 { IO_INPUT, IO_OUTPUT }
195 iomode;
196
197 static gfc_use_rename *gfc_rename_list;
198 static pointer_info *pi_root;
199 static int symbol_number;       /* Counter for assigning symbol numbers */
200
201 /* Tells mio_expr_ref to make symbols for unused equivalence members.  */
202 static bool in_load_equiv;
203
204
205
206 /*****************************************************************/
207
208 /* Pointer/integer conversion.  Pointers between structures are stored
209    as integers in the module file.  The next couple of subroutines
210    handle this translation for reading and writing.  */
211
212 /* Recursively free the tree of pointer structures.  */
213
214 static void
215 free_pi_tree (pointer_info *p)
216 {
217   if (p == NULL)
218     return;
219
220   if (p->fixup != NULL)
221     gfc_internal_error ("free_pi_tree(): Unresolved fixup");
222
223   free_pi_tree (p->left);
224   free_pi_tree (p->right);
225
226   gfc_free (p);
227 }
228
229
230 /* Compare pointers when searching by pointer.  Used when writing a
231    module.  */
232
233 static int
234 compare_pointers (void *_sn1, void *_sn2)
235 {
236   pointer_info *sn1, *sn2;
237
238   sn1 = (pointer_info *) _sn1;
239   sn2 = (pointer_info *) _sn2;
240
241   if (sn1->u.pointer < sn2->u.pointer)
242     return -1;
243   if (sn1->u.pointer > sn2->u.pointer)
244     return 1;
245
246   return 0;
247 }
248
249
250 /* Compare integers when searching by integer.  Used when reading a
251    module.  */
252
253 static int
254 compare_integers (void *_sn1, void *_sn2)
255 {
256   pointer_info *sn1, *sn2;
257
258   sn1 = (pointer_info *) _sn1;
259   sn2 = (pointer_info *) _sn2;
260
261   if (sn1->integer < sn2->integer)
262     return -1;
263   if (sn1->integer > sn2->integer)
264     return 1;
265
266   return 0;
267 }
268
269
270 /* Initialize the pointer_info tree.  */
271
272 static void
273 init_pi_tree (void)
274 {
275   compare_fn compare;
276   pointer_info *p;
277
278   pi_root = NULL;
279   compare = (iomode == IO_INPUT) ? compare_integers : compare_pointers;
280
281   /* Pointer 0 is the NULL pointer.  */
282   p = gfc_get_pointer_info ();
283   p->u.pointer = NULL;
284   p->integer = 0;
285   p->type = P_OTHER;
286
287   gfc_insert_bbt (&pi_root, p, compare);
288
289   /* Pointer 1 is the current namespace.  */
290   p = gfc_get_pointer_info ();
291   p->u.pointer = gfc_current_ns;
292   p->integer = 1;
293   p->type = P_NAMESPACE;
294
295   gfc_insert_bbt (&pi_root, p, compare);
296
297   symbol_number = 2;
298 }
299
300
301 /* During module writing, call here with a pointer to something,
302    returning the pointer_info node.  */
303
304 static pointer_info *
305 find_pointer (void *gp)
306 {
307   pointer_info *p;
308
309   p = pi_root;
310   while (p != NULL)
311     {
312       if (p->u.pointer == gp)
313         break;
314       p = (gp < p->u.pointer) ? p->left : p->right;
315     }
316
317   return p;
318 }
319
320
321 /* Given a pointer while writing, returns the pointer_info tree node,
322    creating it if it doesn't exist.  */
323
324 static pointer_info *
325 get_pointer (void *gp)
326 {
327   pointer_info *p;
328
329   p = find_pointer (gp);
330   if (p != NULL)
331     return p;
332
333   /* Pointer doesn't have an integer.  Give it one.  */
334   p = gfc_get_pointer_info ();
335
336   p->u.pointer = gp;
337   p->integer = symbol_number++;
338
339   gfc_insert_bbt (&pi_root, p, compare_pointers);
340
341   return p;
342 }
343
344
345 /* Given an integer during reading, find it in the pointer_info tree,
346    creating the node if not found.  */
347
348 static pointer_info *
349 get_integer (int integer)
350 {
351   pointer_info *p, t;
352   int c;
353
354   t.integer = integer;
355
356   p = pi_root;
357   while (p != NULL)
358     {
359       c = compare_integers (&t, p);
360       if (c == 0)
361         break;
362
363       p = (c < 0) ? p->left : p->right;
364     }
365
366   if (p != NULL)
367     return p;
368
369   p = gfc_get_pointer_info ();
370   p->integer = integer;
371   p->u.pointer = NULL;
372
373   gfc_insert_bbt (&pi_root, p, compare_integers);
374
375   return p;
376 }
377
378
379 /* Recursive function to find a pointer within a tree by brute force.  */
380
381 static pointer_info *
382 fp2 (pointer_info *p, const void *target)
383 {
384   pointer_info *q;
385
386   if (p == NULL)
387     return NULL;
388
389   if (p->u.pointer == target)
390     return p;
391
392   q = fp2 (p->left, target);
393   if (q != NULL)
394     return q;
395
396   return fp2 (p->right, target);
397 }
398
399
400 /* During reading, find a pointer_info node from the pointer value.
401    This amounts to a brute-force search.  */
402
403 static pointer_info *
404 find_pointer2 (void *p)
405 {
406   return fp2 (pi_root, p);
407 }
408
409
410 /* Resolve any fixups using a known pointer.  */
411
412 static void
413 resolve_fixups (fixup_t *f, void *gp)
414 {
415   fixup_t *next;
416
417   for (; f; f = next)
418     {
419       next = f->next;
420       *(f->pointer) = gp;
421       gfc_free (f);
422     }
423 }
424
425
426 /* Call here during module reading when we know what pointer to
427    associate with an integer.  Any fixups that exist are resolved at
428    this time.  */
429
430 static void
431 associate_integer_pointer (pointer_info *p, void *gp)
432 {
433   if (p->u.pointer != NULL)
434     gfc_internal_error ("associate_integer_pointer(): Already associated");
435
436   p->u.pointer = gp;
437
438   resolve_fixups (p->fixup, gp);
439
440   p->fixup = NULL;
441 }
442
443
444 /* During module reading, given an integer and a pointer to a pointer,
445    either store the pointer from an already-known value or create a
446    fixup structure in order to store things later.  Returns zero if
447    the reference has been actually stored, or nonzero if the reference
448    must be fixed later (ie associate_integer_pointer must be called
449    sometime later.  Returns the pointer_info structure.  */
450
451 static pointer_info *
452 add_fixup (int integer, void *gp)
453 {
454   pointer_info *p;
455   fixup_t *f;
456   char **cp;
457
458   p = get_integer (integer);
459
460   if (p->integer == 0 || p->u.pointer != NULL)
461     {
462       cp = gp;
463       *cp = p->u.pointer;
464     }
465   else
466     {
467       f = gfc_getmem (sizeof (fixup_t));
468
469       f->next = p->fixup;
470       p->fixup = f;
471
472       f->pointer = gp;
473     }
474
475   return p;
476 }
477
478
479 /*****************************************************************/
480
481 /* Parser related subroutines */
482
483 /* Free the rename list left behind by a USE statement.  */
484
485 static void
486 free_rename (void)
487 {
488   gfc_use_rename *next;
489
490   for (; gfc_rename_list; gfc_rename_list = next)
491     {
492       next = gfc_rename_list->next;
493       gfc_free (gfc_rename_list);
494     }
495 }
496
497
498 /* Match a USE statement.  */
499
500 match
501 gfc_match_use (void)
502 {
503   char name[GFC_MAX_SYMBOL_LEN + 1], module_nature[GFC_MAX_SYMBOL_LEN + 1];
504   gfc_use_rename *tail = NULL, *new;
505   interface_type type, type2;
506   gfc_intrinsic_op operator;
507   match m;
508
509   specified_int = false;
510   specified_nonint = false;
511
512   if (gfc_match (" , ") == MATCH_YES)
513     {
514       if ((m = gfc_match (" %n ::", module_nature)) == MATCH_YES)
515         {
516           if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: module "
517                               "nature in USE statement at %C") == FAILURE)
518             return MATCH_ERROR;
519
520           if (strcmp (module_nature, "intrinsic") == 0)
521             specified_int = true;
522           else
523             {
524               if (strcmp (module_nature, "non_intrinsic") == 0)
525                 specified_nonint = true;
526               else
527                 {
528                   gfc_error ("Module nature in USE statement at %C shall "
529                              "be either INTRINSIC or NON_INTRINSIC");
530                   return MATCH_ERROR;
531                 }
532             }
533         }
534       else
535         {
536           /* Help output a better error message than "Unclassifiable
537              statement".  */
538           gfc_match (" %n", module_nature);
539           if (strcmp (module_nature, "intrinsic") == 0
540               || strcmp (module_nature, "non_intrinsic") == 0)
541             gfc_error ("\"::\" was expected after module nature at %C "
542                        "but was not found");
543           return m;
544         }
545     }
546   else
547     {
548       m = gfc_match (" ::");
549       if (m == MATCH_YES &&
550           gfc_notify_std (GFC_STD_F2003, "Fortran 2003: "
551                           "\"USE :: module\" at %C") == FAILURE)
552         return MATCH_ERROR;
553
554       if (m != MATCH_YES)
555         {
556           m = gfc_match ("% ");
557           if (m != MATCH_YES)
558             return m;
559         }
560     }
561
562   m = gfc_match_name (module_name);
563   if (m != MATCH_YES)
564     return m;
565
566   free_rename ();
567   only_flag = 0;
568
569   if (gfc_match_eos () == MATCH_YES)
570     return MATCH_YES;
571   if (gfc_match_char (',') != MATCH_YES)
572     goto syntax;
573
574   if (gfc_match (" only :") == MATCH_YES)
575     only_flag = 1;
576
577   if (gfc_match_eos () == MATCH_YES)
578     return MATCH_YES;
579
580   for (;;)
581     {
582       /* Get a new rename struct and add it to the rename list.  */
583       new = gfc_get_use_rename ();
584       new->where = gfc_current_locus;
585       new->found = 0;
586
587       if (gfc_rename_list == NULL)
588         gfc_rename_list = new;
589       else
590         tail->next = new;
591       tail = new;
592
593       /* See what kind of interface we're dealing with.  Assume it is
594          not an operator.  */
595       new->operator = INTRINSIC_NONE;
596       if (gfc_match_generic_spec (&type, name, &operator) == MATCH_ERROR)
597         goto cleanup;
598
599       switch (type)
600         {
601         case INTERFACE_NAMELESS:
602           gfc_error ("Missing generic specification in USE statement at %C");
603           goto cleanup;
604
605         case INTERFACE_USER_OP:
606         case INTERFACE_GENERIC:
607           m = gfc_match (" =>");
608
609           if (type == INTERFACE_USER_OP && m == MATCH_YES
610               && (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Renaming "
611                                   "operators in USE statements at %C")
612                  == FAILURE))
613             goto cleanup;
614
615           if (type == INTERFACE_USER_OP)
616             new->operator = INTRINSIC_USER;
617
618           if (only_flag)
619             {
620               if (m != MATCH_YES)
621                 strcpy (new->use_name, name);
622               else
623                 {
624                   strcpy (new->local_name, name);
625                   m = gfc_match_generic_spec (&type2, new->use_name, &operator);
626                   if (type != type2)
627                     goto syntax;
628                   if (m == MATCH_NO)
629                     goto syntax;
630                   if (m == MATCH_ERROR)
631                     goto cleanup;
632                 }
633             }
634           else
635             {
636               if (m != MATCH_YES)
637                 goto syntax;
638               strcpy (new->local_name, name);
639
640               m = gfc_match_generic_spec (&type2, new->use_name, &operator);
641               if (type != type2)
642                 goto syntax;
643               if (m == MATCH_NO)
644                 goto syntax;
645               if (m == MATCH_ERROR)
646                 goto cleanup;
647             }
648
649           if (strcmp (new->use_name, module_name) == 0
650               || strcmp (new->local_name, module_name) == 0)
651             {
652               gfc_error ("The name '%s' at %C has already been used as "
653                          "an external module name.", module_name);
654               goto cleanup;
655             }
656           break;
657
658         case INTERFACE_INTRINSIC_OP:
659           new->operator = operator;
660           break;
661
662         default:
663           gcc_unreachable ();
664         }
665
666       if (gfc_match_eos () == MATCH_YES)
667         break;
668       if (gfc_match_char (',') != MATCH_YES)
669         goto syntax;
670     }
671
672   return MATCH_YES;
673
674 syntax:
675   gfc_syntax_error (ST_USE);
676
677 cleanup:
678   free_rename ();
679   return MATCH_ERROR;
680  }
681
682
683 /* Given a name and a number, inst, return the inst name
684    under which to load this symbol. Returns NULL if this
685    symbol shouldn't be loaded. If inst is zero, returns
686    the number of instances of this name. If interface is
687    true, a user-defined operator is sought, otherwise only
688    non-operators are sought.  */
689
690 static const char *
691 find_use_name_n (const char *name, int *inst, bool interface)
692 {
693   gfc_use_rename *u;
694   int i;
695
696   i = 0;
697   for (u = gfc_rename_list; u; u = u->next)
698     {
699       if (strcmp (u->use_name, name) != 0
700           || (u->operator == INTRINSIC_USER && !interface)
701           || (u->operator != INTRINSIC_USER &&  interface))
702         continue;
703       if (++i == *inst)
704         break;
705     }
706
707   if (!*inst)
708     {
709       *inst = i;
710       return NULL;
711     }
712
713   if (u == NULL)
714     return only_flag ? NULL : name;
715
716   u->found = 1;
717
718   return (u->local_name[0] != '\0') ? u->local_name : name;
719 }
720
721
722 /* Given a name, return the name under which to load this symbol.
723    Returns NULL if this symbol shouldn't be loaded.  */
724
725 static const char *
726 find_use_name (const char *name, bool interface)
727 {
728   int i = 1;
729   return find_use_name_n (name, &i, interface);
730 }
731
732
733 /* Given a real name, return the number of use names associated with it.  */
734
735 static int
736 number_use_names (const char *name, bool interface)
737 {
738   int i = 0;
739   const char *c;
740   c = find_use_name_n (name, &i, interface);
741   return i;
742 }
743
744
745 /* Try to find the operator in the current list.  */
746
747 static gfc_use_rename *
748 find_use_operator (gfc_intrinsic_op operator)
749 {
750   gfc_use_rename *u;
751
752   for (u = gfc_rename_list; u; u = u->next)
753     if (u->operator == operator)
754       return u;
755
756   return NULL;
757 }
758
759
760 /*****************************************************************/
761
762 /* The next couple of subroutines maintain a tree used to avoid a
763    brute-force search for a combination of true name and module name.
764    While symtree names, the name that a particular symbol is known by
765    can changed with USE statements, we still have to keep track of the
766    true names to generate the correct reference, and also avoid
767    loading the same real symbol twice in a program unit.
768
769    When we start reading, the true name tree is built and maintained
770    as symbols are read.  The tree is searched as we load new symbols
771    to see if it already exists someplace in the namespace.  */
772
773 typedef struct true_name
774 {
775   BBT_HEADER (true_name);
776   gfc_symbol *sym;
777 }
778 true_name;
779
780 static true_name *true_name_root;
781
782
783 /* Compare two true_name structures.  */
784
785 static int
786 compare_true_names (void *_t1, void *_t2)
787 {
788   true_name *t1, *t2;
789   int c;
790
791   t1 = (true_name *) _t1;
792   t2 = (true_name *) _t2;
793
794   c = ((t1->sym->module > t2->sym->module)
795        - (t1->sym->module < t2->sym->module));
796   if (c != 0)
797     return c;
798
799   return strcmp (t1->sym->name, t2->sym->name);
800 }
801
802
803 /* Given a true name, search the true name tree to see if it exists
804    within the main namespace.  */
805
806 static gfc_symbol *
807 find_true_name (const char *name, const char *module)
808 {
809   true_name t, *p;
810   gfc_symbol sym;
811   int c;
812
813   sym.name = gfc_get_string (name);
814   if (module != NULL)
815     sym.module = gfc_get_string (module);
816   else
817     sym.module = NULL;
818   t.sym = &sym;
819
820   p = true_name_root;
821   while (p != NULL)
822     {
823       c = compare_true_names ((void *) (&t), (void *) p);
824       if (c == 0)
825         return p->sym;
826
827       p = (c < 0) ? p->left : p->right;
828     }
829
830   return NULL;
831 }
832
833
834 /* Given a gfc_symbol pointer that is not in the true name tree, add it.  */
835
836 static void
837 add_true_name (gfc_symbol *sym)
838 {
839   true_name *t;
840
841   t = gfc_getmem (sizeof (true_name));
842   t->sym = sym;
843
844   gfc_insert_bbt (&true_name_root, t, compare_true_names);
845 }
846
847
848 /* Recursive function to build the initial true name tree by
849    recursively traversing the current namespace.  */
850
851 static void
852 build_tnt (gfc_symtree *st)
853 {
854   if (st == NULL)
855     return;
856
857   build_tnt (st->left);
858   build_tnt (st->right);
859
860   if (find_true_name (st->n.sym->name, st->n.sym->module) != NULL)
861     return;
862
863   add_true_name (st->n.sym);
864 }
865
866
867 /* Initialize the true name tree with the current namespace.  */
868
869 static void
870 init_true_name_tree (void)
871 {
872   true_name_root = NULL;
873   build_tnt (gfc_current_ns->sym_root);
874 }
875
876
877 /* Recursively free a true name tree node.  */
878
879 static void
880 free_true_name (true_name *t)
881 {
882   if (t == NULL)
883     return;
884   free_true_name (t->left);
885   free_true_name (t->right);
886
887   gfc_free (t);
888 }
889
890
891 /*****************************************************************/
892
893 /* Module reading and writing.  */
894
895 typedef enum
896 {
897   ATOM_NAME, ATOM_LPAREN, ATOM_RPAREN, ATOM_INTEGER, ATOM_STRING
898 }
899 atom_type;
900
901 static atom_type last_atom;
902
903
904 /* The name buffer must be at least as long as a symbol name.  Right
905    now it's not clear how we're going to store numeric constants--
906    probably as a hexadecimal string, since this will allow the exact
907    number to be preserved (this can't be done by a decimal
908    representation).  Worry about that later.  TODO!  */
909
910 #define MAX_ATOM_SIZE 100
911
912 static int atom_int;
913 static char *atom_string, atom_name[MAX_ATOM_SIZE];
914
915
916 /* Report problems with a module.  Error reporting is not very
917    elaborate, since this sorts of errors shouldn't really happen.
918    This subroutine never returns.  */
919
920 static void bad_module (const char *) ATTRIBUTE_NORETURN;
921
922 static void
923 bad_module (const char *msgid)
924 {
925   fclose (module_fp);
926
927   switch (iomode)
928     {
929     case IO_INPUT:
930       gfc_fatal_error ("Reading module %s at line %d column %d: %s",
931                        module_name, module_line, module_column, msgid);
932       break;
933     case IO_OUTPUT:
934       gfc_fatal_error ("Writing module %s at line %d column %d: %s",
935                        module_name, module_line, module_column, msgid);
936       break;
937     default:
938       gfc_fatal_error ("Module %s at line %d column %d: %s",
939                        module_name, module_line, module_column, msgid);
940       break;
941     }
942 }
943
944
945 /* Set the module's input pointer.  */
946
947 static void
948 set_module_locus (module_locus *m)
949 {
950   module_column = m->column;
951   module_line = m->line;
952   fsetpos (module_fp, &m->pos);
953 }
954
955
956 /* Get the module's input pointer so that we can restore it later.  */
957
958 static void
959 get_module_locus (module_locus *m)
960 {
961   m->column = module_column;
962   m->line = module_line;
963   fgetpos (module_fp, &m->pos);
964 }
965
966
967 /* Get the next character in the module, updating our reckoning of
968    where we are.  */
969
970 static int
971 module_char (void)
972 {
973   int c;
974
975   c = getc (module_fp);
976
977   if (c == EOF)
978     bad_module ("Unexpected EOF");
979
980   if (c == '\n')
981     {
982       module_line++;
983       module_column = 0;
984     }
985
986   module_column++;
987   return c;
988 }
989
990
991 /* Parse a string constant.  The delimiter is guaranteed to be a
992    single quote.  */
993
994 static void
995 parse_string (void)
996 {
997   module_locus start;
998   int len, c;
999   char *p;
1000
1001   get_module_locus (&start);
1002
1003   len = 0;
1004
1005   /* See how long the string is.  */
1006   for ( ; ; )
1007     {
1008       c = module_char ();
1009       if (c == EOF)
1010         bad_module ("Unexpected end of module in string constant");
1011
1012       if (c != '\'')
1013         {
1014           len++;
1015           continue;
1016         }
1017
1018       c = module_char ();
1019       if (c == '\'')
1020         {
1021           len++;
1022           continue;
1023         }
1024
1025       break;
1026     }
1027
1028   set_module_locus (&start);
1029
1030   atom_string = p = gfc_getmem (len + 1);
1031
1032   for (; len > 0; len--)
1033     {
1034       c = module_char ();
1035       if (c == '\'')
1036         module_char ();         /* Guaranteed to be another \'.  */
1037       *p++ = c;
1038     }
1039
1040   module_char ();               /* Terminating \'.  */
1041   *p = '\0';                    /* C-style string for debug purposes.  */
1042 }
1043
1044
1045 /* Parse a small integer.  */
1046
1047 static void
1048 parse_integer (int c)
1049 {
1050   module_locus m;
1051
1052   atom_int = c - '0';
1053
1054   for (;;)
1055     {
1056       get_module_locus (&m);
1057
1058       c = module_char ();
1059       if (!ISDIGIT (c))
1060         break;
1061
1062       atom_int = 10 * atom_int + c - '0';
1063       if (atom_int > 99999999)
1064         bad_module ("Integer overflow");
1065     }
1066
1067   set_module_locus (&m);
1068 }
1069
1070
1071 /* Parse a name.  */
1072
1073 static void
1074 parse_name (int c)
1075 {
1076   module_locus m;
1077   char *p;
1078   int len;
1079
1080   p = atom_name;
1081
1082   *p++ = c;
1083   len = 1;
1084
1085   get_module_locus (&m);
1086
1087   for (;;)
1088     {
1089       c = module_char ();
1090       if (!ISALNUM (c) && c != '_' && c != '-')
1091         break;
1092
1093       *p++ = c;
1094       if (++len > GFC_MAX_SYMBOL_LEN)
1095         bad_module ("Name too long");
1096     }
1097
1098   *p = '\0';
1099
1100   fseek (module_fp, -1, SEEK_CUR);
1101   module_column = m.column + len - 1;
1102
1103   if (c == '\n')
1104     module_line--;
1105 }
1106
1107
1108 /* Read the next atom in the module's input stream.  */
1109
1110 static atom_type
1111 parse_atom (void)
1112 {
1113   int c;
1114
1115   do
1116     {
1117       c = module_char ();
1118     }
1119   while (c == ' ' || c == '\r' || c == '\n');
1120
1121   switch (c)
1122     {
1123     case '(':
1124       return ATOM_LPAREN;
1125
1126     case ')':
1127       return ATOM_RPAREN;
1128
1129     case '\'':
1130       parse_string ();
1131       return ATOM_STRING;
1132
1133     case '0':
1134     case '1':
1135     case '2':
1136     case '3':
1137     case '4':
1138     case '5':
1139     case '6':
1140     case '7':
1141     case '8':
1142     case '9':
1143       parse_integer (c);
1144       return ATOM_INTEGER;
1145
1146     case 'a':
1147     case 'b':
1148     case 'c':
1149     case 'd':
1150     case 'e':
1151     case 'f':
1152     case 'g':
1153     case 'h':
1154     case 'i':
1155     case 'j':
1156     case 'k':
1157     case 'l':
1158     case 'm':
1159     case 'n':
1160     case 'o':
1161     case 'p':
1162     case 'q':
1163     case 'r':
1164     case 's':
1165     case 't':
1166     case 'u':
1167     case 'v':
1168     case 'w':
1169     case 'x':
1170     case 'y':
1171     case 'z':
1172     case 'A':
1173     case 'B':
1174     case 'C':
1175     case 'D':
1176     case 'E':
1177     case 'F':
1178     case 'G':
1179     case 'H':
1180     case 'I':
1181     case 'J':
1182     case 'K':
1183     case 'L':
1184     case 'M':
1185     case 'N':
1186     case 'O':
1187     case 'P':
1188     case 'Q':
1189     case 'R':
1190     case 'S':
1191     case 'T':
1192     case 'U':
1193     case 'V':
1194     case 'W':
1195     case 'X':
1196     case 'Y':
1197     case 'Z':
1198       parse_name (c);
1199       return ATOM_NAME;
1200
1201     default:
1202       bad_module ("Bad name");
1203     }
1204
1205   /* Not reached.  */
1206 }
1207
1208
1209 /* Peek at the next atom on the input.  */
1210
1211 static atom_type
1212 peek_atom (void)
1213 {
1214   module_locus m;
1215   atom_type a;
1216
1217   get_module_locus (&m);
1218
1219   a = parse_atom ();
1220   if (a == ATOM_STRING)
1221     gfc_free (atom_string);
1222
1223   set_module_locus (&m);
1224   return a;
1225 }
1226
1227
1228 /* Read the next atom from the input, requiring that it be a
1229    particular kind.  */
1230
1231 static void
1232 require_atom (atom_type type)
1233 {
1234   module_locus m;
1235   atom_type t;
1236   const char *p;
1237
1238   get_module_locus (&m);
1239
1240   t = parse_atom ();
1241   if (t != type)
1242     {
1243       switch (type)
1244         {
1245         case ATOM_NAME:
1246           p = _("Expected name");
1247           break;
1248         case ATOM_LPAREN:
1249           p = _("Expected left parenthesis");
1250           break;
1251         case ATOM_RPAREN:
1252           p = _("Expected right parenthesis");
1253           break;
1254         case ATOM_INTEGER:
1255           p = _("Expected integer");
1256           break;
1257         case ATOM_STRING:
1258           p = _("Expected string");
1259           break;
1260         default:
1261           gfc_internal_error ("require_atom(): bad atom type required");
1262         }
1263
1264       set_module_locus (&m);
1265       bad_module (p);
1266     }
1267 }
1268
1269
1270 /* Given a pointer to an mstring array, require that the current input
1271    be one of the strings in the array.  We return the enum value.  */
1272
1273 static int
1274 find_enum (const mstring *m)
1275 {
1276   int i;
1277
1278   i = gfc_string2code (m, atom_name);
1279   if (i >= 0)
1280     return i;
1281
1282   bad_module ("find_enum(): Enum not found");
1283
1284   /* Not reached.  */
1285 }
1286
1287
1288 /**************** Module output subroutines ***************************/
1289
1290 /* Output a character to a module file.  */
1291
1292 static void
1293 write_char (char out)
1294 {
1295   if (putc (out, module_fp) == EOF)
1296     gfc_fatal_error ("Error writing modules file: %s", strerror (errno));
1297
1298   /* Add this to our MD5.  */
1299   md5_process_bytes (&out, sizeof (out), &ctx);
1300   
1301   if (out != '\n')
1302     module_column++;
1303   else
1304     {
1305       module_column = 1;
1306       module_line++;
1307     }
1308 }
1309
1310
1311 /* Write an atom to a module.  The line wrapping isn't perfect, but it
1312    should work most of the time.  This isn't that big of a deal, since
1313    the file really isn't meant to be read by people anyway.  */
1314
1315 static void
1316 write_atom (atom_type atom, const void *v)
1317 {
1318   char buffer[20];
1319   int i, len;
1320   const char *p;
1321
1322   switch (atom)
1323     {
1324     case ATOM_STRING:
1325     case ATOM_NAME:
1326       p = v;
1327       break;
1328
1329     case ATOM_LPAREN:
1330       p = "(";
1331       break;
1332
1333     case ATOM_RPAREN:
1334       p = ")";
1335       break;
1336
1337     case ATOM_INTEGER:
1338       i = *((const int *) v);
1339       if (i < 0)
1340         gfc_internal_error ("write_atom(): Writing negative integer");
1341
1342       sprintf (buffer, "%d", i);
1343       p = buffer;
1344       break;
1345
1346     default:
1347       gfc_internal_error ("write_atom(): Trying to write dab atom");
1348
1349     }
1350
1351   if(p == NULL || *p == '\0') 
1352      len = 0;
1353   else
1354   len = strlen (p);
1355
1356   if (atom != ATOM_RPAREN)
1357     {
1358       if (module_column + len > 72)
1359         write_char ('\n');
1360       else
1361         {
1362
1363           if (last_atom != ATOM_LPAREN && module_column != 1)
1364             write_char (' ');
1365         }
1366     }
1367
1368   if (atom == ATOM_STRING)
1369     write_char ('\'');
1370
1371   while (p != NULL && *p)
1372     {
1373       if (atom == ATOM_STRING && *p == '\'')
1374         write_char ('\'');
1375       write_char (*p++);
1376     }
1377
1378   if (atom == ATOM_STRING)
1379     write_char ('\'');
1380
1381   last_atom = atom;
1382 }
1383
1384
1385
1386 /***************** Mid-level I/O subroutines *****************/
1387
1388 /* These subroutines let their caller read or write atoms without
1389    caring about which of the two is actually happening.  This lets a
1390    subroutine concentrate on the actual format of the data being
1391    written.  */
1392
1393 static void mio_expr (gfc_expr **);
1394 pointer_info *mio_symbol_ref (gfc_symbol **);
1395 pointer_info *mio_interface_rest (gfc_interface **);
1396 static void mio_symtree_ref (gfc_symtree **);
1397
1398 /* Read or write an enumerated value.  On writing, we return the input
1399    value for the convenience of callers.  We avoid using an integer
1400    pointer because enums are sometimes inside bitfields.  */
1401
1402 static int
1403 mio_name (int t, const mstring *m)
1404 {
1405   if (iomode == IO_OUTPUT)
1406     write_atom (ATOM_NAME, gfc_code2string (m, t));
1407   else
1408     {
1409       require_atom (ATOM_NAME);
1410       t = find_enum (m);
1411     }
1412
1413   return t;
1414 }
1415
1416 /* Specialization of mio_name.  */
1417
1418 #define DECL_MIO_NAME(TYPE) \
1419  static inline TYPE \
1420  MIO_NAME(TYPE) (TYPE t, const mstring *m) \
1421  { \
1422    return (TYPE) mio_name ((int) t, m); \
1423  }
1424 #define MIO_NAME(TYPE) mio_name_##TYPE
1425
1426 static void
1427 mio_lparen (void)
1428 {
1429   if (iomode == IO_OUTPUT)
1430     write_atom (ATOM_LPAREN, NULL);
1431   else
1432     require_atom (ATOM_LPAREN);
1433 }
1434
1435
1436 static void
1437 mio_rparen (void)
1438 {
1439   if (iomode == IO_OUTPUT)
1440     write_atom (ATOM_RPAREN, NULL);
1441   else
1442     require_atom (ATOM_RPAREN);
1443 }
1444
1445
1446 static void
1447 mio_integer (int *ip)
1448 {
1449   if (iomode == IO_OUTPUT)
1450     write_atom (ATOM_INTEGER, ip);
1451   else
1452     {
1453       require_atom (ATOM_INTEGER);
1454       *ip = atom_int;
1455     }
1456 }
1457
1458
1459 /* Read or write a character pointer that points to a string on the heap.  */
1460
1461 static const char *
1462 mio_allocated_string (const char *s)
1463 {
1464   if (iomode == IO_OUTPUT)
1465     {
1466       write_atom (ATOM_STRING, s);
1467       return s;
1468     }
1469   else
1470     {
1471       require_atom (ATOM_STRING);
1472       return atom_string;
1473     }
1474 }
1475
1476
1477 /* Functions for quoting and unquoting strings.  */
1478
1479 static char *
1480 quote_string (const gfc_char_t *s, const size_t slength)
1481 {
1482   const gfc_char_t *p;
1483   char *res, *q;
1484   size_t len = 0, i;
1485
1486   /* Calculate the length we'll need: a backslash takes two ("\\"),
1487      non-printable characters take 10 ("\Uxxxxxxxx") and others take 1.  */
1488   for (p = s, i = 0; i < slength; p++, i++)
1489     {
1490       if (*p == '\\')
1491         len += 2;
1492       else if (!gfc_wide_is_printable (*p))
1493         len += 10;
1494       else
1495         len++;
1496     }
1497
1498   q = res = gfc_getmem (len + 1);
1499   for (p = s, i = 0; i < slength; p++, i++)
1500     {
1501       if (*p == '\\')
1502         *q++ = '\\', *q++ = '\\';
1503       else if (!gfc_wide_is_printable (*p))
1504         {
1505           sprintf (q, "\\U%08" HOST_WIDE_INT_PRINT "ux",
1506                    (unsigned HOST_WIDE_INT) *p);
1507           q += 10;
1508         }
1509       else
1510         *q++ = (unsigned char) *p;
1511     }
1512
1513   res[len] = '\0';
1514   return res;
1515 }
1516
1517 static gfc_char_t *
1518 unquote_string (const char *s)
1519 {
1520   size_t len, i;
1521   const char *p;
1522   gfc_char_t *res;
1523
1524   for (p = s, len = 0; *p; p++, len++)
1525     {
1526       if (*p != '\\')
1527         continue;
1528         
1529       if (p[1] == '\\')
1530         p++;
1531       else if (p[1] == 'U')
1532         p += 9; /* That is a "\U????????". */
1533       else
1534         gfc_internal_error ("unquote_string(): got bad string");
1535     }
1536
1537   res = gfc_get_wide_string (len + 1);
1538   for (i = 0, p = s; i < len; i++, p++)
1539     {
1540       gcc_assert (*p);
1541
1542       if (*p != '\\')
1543         res[i] = (unsigned char) *p;
1544       else if (p[1] == '\\')
1545         {
1546           res[i] = (unsigned char) '\\';
1547           p++;
1548         }
1549       else
1550         {
1551           /* We read the 8-digits hexadecimal constant that follows.  */
1552           int j;
1553           unsigned n;
1554           gfc_char_t c = 0;
1555
1556           gcc_assert (p[1] == 'U');
1557           for (j = 0; j < 8; j++)
1558             {
1559               c = c << 4;
1560               gcc_assert (sscanf (&p[j+2], "%01x", &n) == 1);
1561               c += n;
1562             }
1563
1564           res[i] = c;
1565           p += 9;
1566         }
1567     }
1568
1569   res[len] = '\0';
1570   return res;
1571 }
1572
1573
1574 /* Read or write a character pointer that points to a wide string on the
1575    heap, performing quoting/unquoting of nonprintable characters using the
1576    form \U???????? (where each ? is a hexadecimal digit).
1577    Length is the length of the string, only known and used in output mode.  */
1578
1579 static const gfc_char_t *
1580 mio_allocated_wide_string (const gfc_char_t *s, const size_t length)
1581 {
1582   if (iomode == IO_OUTPUT)
1583     {
1584       char *quoted = quote_string (s, length);
1585       write_atom (ATOM_STRING, quoted);
1586       gfc_free (quoted);
1587       return s;
1588     }
1589   else
1590     {
1591       gfc_char_t *unquoted;
1592
1593       require_atom (ATOM_STRING);
1594       unquoted = unquote_string (atom_string);
1595       gfc_free (atom_string);
1596       return unquoted;
1597     }
1598 }
1599
1600
1601 /* Read or write a string that is in static memory.  */
1602
1603 static void
1604 mio_pool_string (const char **stringp)
1605 {
1606   /* TODO: one could write the string only once, and refer to it via a
1607      fixup pointer.  */
1608
1609   /* As a special case we have to deal with a NULL string.  This
1610      happens for the 'module' member of 'gfc_symbol's that are not in a
1611      module.  We read / write these as the empty string.  */
1612   if (iomode == IO_OUTPUT)
1613     {
1614       const char *p = *stringp == NULL ? "" : *stringp;
1615       write_atom (ATOM_STRING, p);
1616     }
1617   else
1618     {
1619       require_atom (ATOM_STRING);
1620       *stringp = atom_string[0] == '\0' ? NULL : gfc_get_string (atom_string);
1621       gfc_free (atom_string);
1622     }
1623 }
1624
1625
1626 /* Read or write a string that is inside of some already-allocated
1627    structure.  */
1628
1629 static void
1630 mio_internal_string (char *string)
1631 {
1632   if (iomode == IO_OUTPUT)
1633     write_atom (ATOM_STRING, string);
1634   else
1635     {
1636       require_atom (ATOM_STRING);
1637       strcpy (string, atom_string);
1638       gfc_free (atom_string);
1639     }
1640 }
1641
1642
1643 typedef enum
1644 { AB_ALLOCATABLE, AB_DIMENSION, AB_EXTERNAL, AB_INTRINSIC, AB_OPTIONAL,
1645   AB_POINTER, AB_TARGET, AB_DUMMY, AB_RESULT, AB_DATA,
1646   AB_IN_NAMELIST, AB_IN_COMMON, AB_FUNCTION, AB_SUBROUTINE, AB_SEQUENCE,
1647   AB_ELEMENTAL, AB_PURE, AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT,
1648   AB_CRAY_POINTER, AB_CRAY_POINTEE, AB_THREADPRIVATE, AB_ALLOC_COMP,
1649   AB_POINTER_COMP, AB_PRIVATE_COMP, AB_VALUE, AB_VOLATILE, AB_PROTECTED,
1650   AB_IS_BIND_C, AB_IS_C_INTEROP, AB_IS_ISO_C, AB_ABSTRACT, AB_ZERO_COMP
1651 }
1652 ab_attribute;
1653
1654 static const mstring attr_bits[] =
1655 {
1656     minit ("ALLOCATABLE", AB_ALLOCATABLE),
1657     minit ("DIMENSION", AB_DIMENSION),
1658     minit ("EXTERNAL", AB_EXTERNAL),
1659     minit ("INTRINSIC", AB_INTRINSIC),
1660     minit ("OPTIONAL", AB_OPTIONAL),
1661     minit ("POINTER", AB_POINTER),
1662     minit ("VOLATILE", AB_VOLATILE),
1663     minit ("TARGET", AB_TARGET),
1664     minit ("THREADPRIVATE", AB_THREADPRIVATE),
1665     minit ("DUMMY", AB_DUMMY),
1666     minit ("RESULT", AB_RESULT),
1667     minit ("DATA", AB_DATA),
1668     minit ("IN_NAMELIST", AB_IN_NAMELIST),
1669     minit ("IN_COMMON", AB_IN_COMMON),
1670     minit ("FUNCTION", AB_FUNCTION),
1671     minit ("SUBROUTINE", AB_SUBROUTINE),
1672     minit ("SEQUENCE", AB_SEQUENCE),
1673     minit ("ELEMENTAL", AB_ELEMENTAL),
1674     minit ("PURE", AB_PURE),
1675     minit ("RECURSIVE", AB_RECURSIVE),
1676     minit ("GENERIC", AB_GENERIC),
1677     minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
1678     minit ("CRAY_POINTER", AB_CRAY_POINTER),
1679     minit ("CRAY_POINTEE", AB_CRAY_POINTEE),
1680     minit ("IS_BIND_C", AB_IS_BIND_C),
1681     minit ("IS_C_INTEROP", AB_IS_C_INTEROP),
1682     minit ("IS_ISO_C", AB_IS_ISO_C),
1683     minit ("VALUE", AB_VALUE),
1684     minit ("ALLOC_COMP", AB_ALLOC_COMP),
1685     minit ("POINTER_COMP", AB_POINTER_COMP),
1686     minit ("PRIVATE_COMP", AB_PRIVATE_COMP),
1687     minit ("ZERO_COMP", AB_ZERO_COMP),
1688     minit ("PROTECTED", AB_PROTECTED),
1689     minit ("ABSTRACT", AB_ABSTRACT),
1690     minit (NULL, -1)
1691 };
1692
1693
1694 /* Specialization of mio_name.  */
1695 DECL_MIO_NAME (ab_attribute)
1696 DECL_MIO_NAME (ar_type)
1697 DECL_MIO_NAME (array_type)
1698 DECL_MIO_NAME (bt)
1699 DECL_MIO_NAME (expr_t)
1700 DECL_MIO_NAME (gfc_access)
1701 DECL_MIO_NAME (gfc_intrinsic_op)
1702 DECL_MIO_NAME (ifsrc)
1703 DECL_MIO_NAME (save_state)
1704 DECL_MIO_NAME (procedure_type)
1705 DECL_MIO_NAME (ref_type)
1706 DECL_MIO_NAME (sym_flavor)
1707 DECL_MIO_NAME (sym_intent)
1708 #undef DECL_MIO_NAME
1709
1710 /* Symbol attributes are stored in list with the first three elements
1711    being the enumerated fields, while the remaining elements (if any)
1712    indicate the individual attribute bits.  The access field is not
1713    saved-- it controls what symbols are exported when a module is
1714    written.  */
1715
1716 static void
1717 mio_symbol_attribute (symbol_attribute *attr)
1718 {
1719   atom_type t;
1720
1721   mio_lparen ();
1722
1723   attr->flavor = MIO_NAME (sym_flavor) (attr->flavor, flavors);
1724   attr->intent = MIO_NAME (sym_intent) (attr->intent, intents);
1725   attr->proc = MIO_NAME (procedure_type) (attr->proc, procedures);
1726   attr->if_source = MIO_NAME (ifsrc) (attr->if_source, ifsrc_types);
1727   attr->save = MIO_NAME (save_state) (attr->save, save_status);
1728
1729   if (iomode == IO_OUTPUT)
1730     {
1731       if (attr->allocatable)
1732         MIO_NAME (ab_attribute) (AB_ALLOCATABLE, attr_bits);
1733       if (attr->dimension)
1734         MIO_NAME (ab_attribute) (AB_DIMENSION, attr_bits);
1735       if (attr->external)
1736         MIO_NAME (ab_attribute) (AB_EXTERNAL, attr_bits);
1737       if (attr->intrinsic)
1738         MIO_NAME (ab_attribute) (AB_INTRINSIC, attr_bits);
1739       if (attr->optional)
1740         MIO_NAME (ab_attribute) (AB_OPTIONAL, attr_bits);
1741       if (attr->pointer)
1742         MIO_NAME (ab_attribute) (AB_POINTER, attr_bits);
1743       if (attr->protected)
1744         MIO_NAME (ab_attribute) (AB_PROTECTED, attr_bits);
1745       if (attr->value)
1746         MIO_NAME (ab_attribute) (AB_VALUE, attr_bits);
1747       if (attr->volatile_)
1748         MIO_NAME (ab_attribute) (AB_VOLATILE, attr_bits);
1749       if (attr->target)
1750         MIO_NAME (ab_attribute) (AB_TARGET, attr_bits);
1751       if (attr->threadprivate)
1752         MIO_NAME (ab_attribute) (AB_THREADPRIVATE, attr_bits);
1753       if (attr->dummy)
1754         MIO_NAME (ab_attribute) (AB_DUMMY, attr_bits);
1755       if (attr->result)
1756         MIO_NAME (ab_attribute) (AB_RESULT, attr_bits);
1757       /* We deliberately don't preserve the "entry" flag.  */
1758
1759       if (attr->data)
1760         MIO_NAME (ab_attribute) (AB_DATA, attr_bits);
1761       if (attr->in_namelist)
1762         MIO_NAME (ab_attribute) (AB_IN_NAMELIST, attr_bits);
1763       if (attr->in_common)
1764         MIO_NAME (ab_attribute) (AB_IN_COMMON, attr_bits);
1765
1766       if (attr->function)
1767         MIO_NAME (ab_attribute) (AB_FUNCTION, attr_bits);
1768       if (attr->subroutine)
1769         MIO_NAME (ab_attribute) (AB_SUBROUTINE, attr_bits);
1770       if (attr->generic)
1771         MIO_NAME (ab_attribute) (AB_GENERIC, attr_bits);
1772       if (attr->abstract)
1773         MIO_NAME (ab_attribute) (AB_ABSTRACT, attr_bits);
1774
1775       if (attr->sequence)
1776         MIO_NAME (ab_attribute) (AB_SEQUENCE, attr_bits);
1777       if (attr->elemental)
1778         MIO_NAME (ab_attribute) (AB_ELEMENTAL, attr_bits);
1779       if (attr->pure)
1780         MIO_NAME (ab_attribute) (AB_PURE, attr_bits);
1781       if (attr->recursive)
1782         MIO_NAME (ab_attribute) (AB_RECURSIVE, attr_bits);
1783       if (attr->always_explicit)
1784         MIO_NAME (ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits);
1785       if (attr->cray_pointer)
1786         MIO_NAME (ab_attribute) (AB_CRAY_POINTER, attr_bits);
1787       if (attr->cray_pointee)
1788         MIO_NAME (ab_attribute) (AB_CRAY_POINTEE, attr_bits);
1789       if (attr->is_bind_c)
1790         MIO_NAME(ab_attribute) (AB_IS_BIND_C, attr_bits);
1791       if (attr->is_c_interop)
1792         MIO_NAME(ab_attribute) (AB_IS_C_INTEROP, attr_bits);
1793       if (attr->is_iso_c)
1794         MIO_NAME(ab_attribute) (AB_IS_ISO_C, attr_bits);
1795       if (attr->alloc_comp)
1796         MIO_NAME (ab_attribute) (AB_ALLOC_COMP, attr_bits);
1797       if (attr->pointer_comp)
1798         MIO_NAME (ab_attribute) (AB_POINTER_COMP, attr_bits);
1799       if (attr->private_comp)
1800         MIO_NAME (ab_attribute) (AB_PRIVATE_COMP, attr_bits);
1801       if (attr->zero_comp)
1802         MIO_NAME (ab_attribute) (AB_ZERO_COMP, attr_bits);
1803
1804       mio_rparen ();
1805
1806     }
1807   else
1808     {
1809       for (;;)
1810         {
1811           t = parse_atom ();
1812           if (t == ATOM_RPAREN)
1813             break;
1814           if (t != ATOM_NAME)
1815             bad_module ("Expected attribute bit name");
1816
1817           switch ((ab_attribute) find_enum (attr_bits))
1818             {
1819             case AB_ALLOCATABLE:
1820               attr->allocatable = 1;
1821               break;
1822             case AB_DIMENSION:
1823               attr->dimension = 1;
1824               break;
1825             case AB_EXTERNAL:
1826               attr->external = 1;
1827               break;
1828             case AB_INTRINSIC:
1829               attr->intrinsic = 1;
1830               break;
1831             case AB_OPTIONAL:
1832               attr->optional = 1;
1833               break;
1834             case AB_POINTER:
1835               attr->pointer = 1;
1836               break;
1837             case AB_PROTECTED:
1838               attr->protected = 1;
1839               break;
1840             case AB_VALUE:
1841               attr->value = 1;
1842               break;
1843             case AB_VOLATILE:
1844               attr->volatile_ = 1;
1845               break;
1846             case AB_TARGET:
1847               attr->target = 1;
1848               break;
1849             case AB_THREADPRIVATE:
1850               attr->threadprivate = 1;
1851               break;
1852             case AB_DUMMY:
1853               attr->dummy = 1;
1854               break;
1855             case AB_RESULT:
1856               attr->result = 1;
1857               break;
1858             case AB_DATA:
1859               attr->data = 1;
1860               break;
1861             case AB_IN_NAMELIST:
1862               attr->in_namelist = 1;
1863               break;
1864             case AB_IN_COMMON:
1865               attr->in_common = 1;
1866               break;
1867             case AB_FUNCTION:
1868               attr->function = 1;
1869               break;
1870             case AB_SUBROUTINE:
1871               attr->subroutine = 1;
1872               break;
1873             case AB_GENERIC:
1874               attr->generic = 1;
1875               break;
1876             case AB_ABSTRACT:
1877               attr->abstract = 1;
1878               break;
1879             case AB_SEQUENCE:
1880               attr->sequence = 1;
1881               break;
1882             case AB_ELEMENTAL:
1883               attr->elemental = 1;
1884               break;
1885             case AB_PURE:
1886               attr->pure = 1;
1887               break;
1888             case AB_RECURSIVE:
1889               attr->recursive = 1;
1890               break;
1891             case AB_ALWAYS_EXPLICIT:
1892               attr->always_explicit = 1;
1893               break;
1894             case AB_CRAY_POINTER:
1895               attr->cray_pointer = 1;
1896               break;
1897             case AB_CRAY_POINTEE:
1898               attr->cray_pointee = 1;
1899               break;
1900             case AB_IS_BIND_C:
1901               attr->is_bind_c = 1;
1902               break;
1903             case AB_IS_C_INTEROP:
1904               attr->is_c_interop = 1;
1905               break;
1906             case AB_IS_ISO_C:
1907               attr->is_iso_c = 1;
1908               break;
1909             case AB_ALLOC_COMP:
1910               attr->alloc_comp = 1;
1911               break;
1912             case AB_POINTER_COMP:
1913               attr->pointer_comp = 1;
1914               break;
1915             case AB_PRIVATE_COMP:
1916               attr->private_comp = 1;
1917               break;
1918             case AB_ZERO_COMP:
1919               attr->zero_comp = 1;
1920               break;
1921             }
1922         }
1923     }
1924 }
1925
1926
1927 static const mstring bt_types[] = {
1928     minit ("INTEGER", BT_INTEGER),
1929     minit ("REAL", BT_REAL),
1930     minit ("COMPLEX", BT_COMPLEX),
1931     minit ("LOGICAL", BT_LOGICAL),
1932     minit ("CHARACTER", BT_CHARACTER),
1933     minit ("DERIVED", BT_DERIVED),
1934     minit ("PROCEDURE", BT_PROCEDURE),
1935     minit ("UNKNOWN", BT_UNKNOWN),
1936     minit ("VOID", BT_VOID),
1937     minit (NULL, -1)
1938 };
1939
1940
1941 static void
1942 mio_charlen (gfc_charlen **clp)
1943 {
1944   gfc_charlen *cl;
1945
1946   mio_lparen ();
1947
1948   if (iomode == IO_OUTPUT)
1949     {
1950       cl = *clp;
1951       if (cl != NULL)
1952         mio_expr (&cl->length);
1953     }
1954   else
1955     {
1956       if (peek_atom () != ATOM_RPAREN)
1957         {
1958           cl = gfc_get_charlen ();
1959           mio_expr (&cl->length);
1960
1961           *clp = cl;
1962
1963           cl->next = gfc_current_ns->cl_list;
1964           gfc_current_ns->cl_list = cl;
1965         }
1966     }
1967
1968   mio_rparen ();
1969 }
1970
1971
1972 /* See if a name is a generated name.  */
1973
1974 static int
1975 check_unique_name (const char *name)
1976 {
1977   return *name == '@';
1978 }
1979
1980
1981 static void
1982 mio_typespec (gfc_typespec *ts)
1983 {
1984   mio_lparen ();
1985
1986   ts->type = MIO_NAME (bt) (ts->type, bt_types);
1987
1988   if (ts->type != BT_DERIVED)
1989     mio_integer (&ts->kind);
1990   else
1991     mio_symbol_ref (&ts->derived);
1992
1993   /* Add info for C interop and is_iso_c.  */
1994   mio_integer (&ts->is_c_interop);
1995   mio_integer (&ts->is_iso_c);
1996   
1997   /* If the typespec is for an identifier either from iso_c_binding, or
1998      a constant that was initialized to an identifier from it, use the
1999      f90_type.  Otherwise, use the ts->type, since it shouldn't matter.  */
2000   if (ts->is_iso_c)
2001     ts->f90_type = MIO_NAME (bt) (ts->f90_type, bt_types);
2002   else
2003     ts->f90_type = MIO_NAME (bt) (ts->type, bt_types);
2004
2005   if (ts->type != BT_CHARACTER)
2006     {
2007       /* ts->cl is only valid for BT_CHARACTER.  */
2008       mio_lparen ();
2009       mio_rparen ();
2010     }
2011   else
2012     mio_charlen (&ts->cl);
2013
2014   mio_rparen ();
2015 }
2016
2017
2018 static const mstring array_spec_types[] = {
2019     minit ("EXPLICIT", AS_EXPLICIT),
2020     minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE),
2021     minit ("DEFERRED", AS_DEFERRED),
2022     minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE),
2023     minit (NULL, -1)
2024 };
2025
2026
2027 static void
2028 mio_array_spec (gfc_array_spec **asp)
2029 {
2030   gfc_array_spec *as;
2031   int i;
2032
2033   mio_lparen ();
2034
2035   if (iomode == IO_OUTPUT)
2036     {
2037       if (*asp == NULL)
2038         goto done;
2039       as = *asp;
2040     }
2041   else
2042     {
2043       if (peek_atom () == ATOM_RPAREN)
2044         {
2045           *asp = NULL;
2046           goto done;
2047         }
2048
2049       *asp = as = gfc_get_array_spec ();
2050     }
2051
2052   mio_integer (&as->rank);
2053   as->type = MIO_NAME (array_type) (as->type, array_spec_types);
2054
2055   for (i = 0; i < as->rank; i++)
2056     {
2057       mio_expr (&as->lower[i]);
2058       mio_expr (&as->upper[i]);
2059     }
2060
2061 done:
2062   mio_rparen ();
2063 }
2064
2065
2066 /* Given a pointer to an array reference structure (which lives in a
2067    gfc_ref structure), find the corresponding array specification
2068    structure.  Storing the pointer in the ref structure doesn't quite
2069    work when loading from a module. Generating code for an array
2070    reference also needs more information than just the array spec.  */
2071
2072 static const mstring array_ref_types[] = {
2073     minit ("FULL", AR_FULL),
2074     minit ("ELEMENT", AR_ELEMENT),
2075     minit ("SECTION", AR_SECTION),
2076     minit (NULL, -1)
2077 };
2078
2079
2080 static void
2081 mio_array_ref (gfc_array_ref *ar)
2082 {
2083   int i;
2084
2085   mio_lparen ();
2086   ar->type = MIO_NAME (ar_type) (ar->type, array_ref_types);
2087   mio_integer (&ar->dimen);
2088
2089   switch (ar->type)
2090     {
2091     case AR_FULL:
2092       break;
2093
2094     case AR_ELEMENT:
2095       for (i = 0; i < ar->dimen; i++)
2096         mio_expr (&ar->start[i]);
2097
2098       break;
2099
2100     case AR_SECTION:
2101       for (i = 0; i < ar->dimen; i++)
2102         {
2103           mio_expr (&ar->start[i]);
2104           mio_expr (&ar->end[i]);
2105           mio_expr (&ar->stride[i]);
2106         }
2107
2108       break;
2109
2110     case AR_UNKNOWN:
2111       gfc_internal_error ("mio_array_ref(): Unknown array ref");
2112     }
2113
2114   /* Unfortunately, ar->dimen_type is an anonymous enumerated type so
2115      we can't call mio_integer directly.  Instead loop over each element
2116      and cast it to/from an integer.  */
2117   if (iomode == IO_OUTPUT)
2118     {
2119       for (i = 0; i < ar->dimen; i++)
2120         {
2121           int tmp = (int)ar->dimen_type[i];
2122           write_atom (ATOM_INTEGER, &tmp);
2123         }
2124     }
2125   else
2126     {
2127       for (i = 0; i < ar->dimen; i++)
2128         {
2129           require_atom (ATOM_INTEGER);
2130           ar->dimen_type[i] = atom_int;
2131         }
2132     }
2133
2134   if (iomode == IO_INPUT)
2135     {
2136       ar->where = gfc_current_locus;
2137
2138       for (i = 0; i < ar->dimen; i++)
2139         ar->c_where[i] = gfc_current_locus;
2140     }
2141
2142   mio_rparen ();
2143 }
2144
2145
2146 /* Saves or restores a pointer.  The pointer is converted back and
2147    forth from an integer.  We return the pointer_info pointer so that
2148    the caller can take additional action based on the pointer type.  */
2149
2150 static pointer_info *
2151 mio_pointer_ref (void *gp)
2152 {
2153   pointer_info *p;
2154
2155   if (iomode == IO_OUTPUT)
2156     {
2157       p = get_pointer (*((char **) gp));
2158       write_atom (ATOM_INTEGER, &p->integer);
2159     }
2160   else
2161     {
2162       require_atom (ATOM_INTEGER);
2163       p = add_fixup (atom_int, gp);
2164     }
2165
2166   return p;
2167 }
2168
2169
2170 /* Save and load references to components that occur within
2171    expressions.  We have to describe these references by a number and
2172    by name.  The number is necessary for forward references during
2173    reading, and the name is necessary if the symbol already exists in
2174    the namespace and is not loaded again.  */
2175
2176 static void
2177 mio_component_ref (gfc_component **cp, gfc_symbol *sym)
2178 {
2179   char name[GFC_MAX_SYMBOL_LEN + 1];
2180   gfc_component *q;
2181   pointer_info *p;
2182
2183   p = mio_pointer_ref (cp);
2184   if (p->type == P_UNKNOWN)
2185     p->type = P_COMPONENT;
2186
2187   if (iomode == IO_OUTPUT)
2188     mio_pool_string (&(*cp)->name);
2189   else
2190     {
2191       mio_internal_string (name);
2192
2193       /* It can happen that a component reference can be read before the
2194          associated derived type symbol has been loaded. Return now and
2195          wait for a later iteration of load_needed.  */
2196       if (sym == NULL)
2197         return;
2198
2199       if (sym->components != NULL && p->u.pointer == NULL)
2200         {
2201           /* Symbol already loaded, so search by name.  */
2202           for (q = sym->components; q; q = q->next)
2203             if (strcmp (q->name, name) == 0)
2204               break;
2205
2206           if (q == NULL)
2207             gfc_internal_error ("mio_component_ref(): Component not found");
2208
2209           associate_integer_pointer (p, q);
2210         }
2211
2212       /* Make sure this symbol will eventually be loaded.  */
2213       p = find_pointer2 (sym);
2214       if (p->u.rsym.state == UNUSED)
2215         p->u.rsym.state = NEEDED;
2216     }
2217 }
2218
2219
2220 static void
2221 mio_component (gfc_component *c)
2222 {
2223   pointer_info *p;
2224   int n;
2225
2226   mio_lparen ();
2227
2228   if (iomode == IO_OUTPUT)
2229     {
2230       p = get_pointer (c);
2231       mio_integer (&p->integer);
2232     }
2233   else
2234     {
2235       mio_integer (&n);
2236       p = get_integer (n);
2237       associate_integer_pointer (p, c);
2238     }
2239
2240   if (p->type == P_UNKNOWN)
2241     p->type = P_COMPONENT;
2242
2243   mio_pool_string (&c->name);
2244   mio_typespec (&c->ts);
2245   mio_array_spec (&c->as);
2246
2247   mio_integer (&c->dimension);
2248   mio_integer (&c->pointer);
2249   mio_integer (&c->allocatable);
2250   c->access = MIO_NAME (gfc_access) (c->access, access_types); 
2251
2252   mio_expr (&c->initializer);
2253   mio_rparen ();
2254 }
2255
2256
2257 static void
2258 mio_component_list (gfc_component **cp)
2259 {
2260   gfc_component *c, *tail;
2261
2262   mio_lparen ();
2263
2264   if (iomode == IO_OUTPUT)
2265     {
2266       for (c = *cp; c; c = c->next)
2267         mio_component (c);
2268     }
2269   else
2270     {
2271       *cp = NULL;
2272       tail = NULL;
2273
2274       for (;;)
2275         {
2276           if (peek_atom () == ATOM_RPAREN)
2277             break;
2278
2279           c = gfc_get_component ();
2280           mio_component (c);
2281
2282           if (tail == NULL)
2283             *cp = c;
2284           else
2285             tail->next = c;
2286
2287           tail = c;
2288         }
2289     }
2290
2291   mio_rparen ();
2292 }
2293
2294
2295 static void
2296 mio_actual_arg (gfc_actual_arglist *a)
2297 {
2298   mio_lparen ();
2299   mio_pool_string (&a->name);
2300   mio_expr (&a->expr);
2301   mio_rparen ();
2302 }
2303
2304
2305 static void
2306 mio_actual_arglist (gfc_actual_arglist **ap)
2307 {
2308   gfc_actual_arglist *a, *tail;
2309
2310   mio_lparen ();
2311
2312   if (iomode == IO_OUTPUT)
2313     {
2314       for (a = *ap; a; a = a->next)
2315         mio_actual_arg (a);
2316
2317     }
2318   else
2319     {
2320       tail = NULL;
2321
2322       for (;;)
2323         {
2324           if (peek_atom () != ATOM_LPAREN)
2325             break;
2326
2327           a = gfc_get_actual_arglist ();
2328
2329           if (tail == NULL)
2330             *ap = a;
2331           else
2332             tail->next = a;
2333
2334           tail = a;
2335           mio_actual_arg (a);
2336         }
2337     }
2338
2339   mio_rparen ();
2340 }
2341
2342
2343 /* Read and write formal argument lists.  */
2344
2345 static void
2346 mio_formal_arglist (gfc_symbol *sym)
2347 {
2348   gfc_formal_arglist *f, *tail;
2349
2350   mio_lparen ();
2351
2352   if (iomode == IO_OUTPUT)
2353     {
2354       for (f = sym->formal; f; f = f->next)
2355         mio_symbol_ref (&f->sym);
2356     }
2357   else
2358     {
2359       sym->formal = tail = NULL;
2360
2361       while (peek_atom () != ATOM_RPAREN)
2362         {
2363           f = gfc_get_formal_arglist ();
2364           mio_symbol_ref (&f->sym);
2365
2366           if (sym->formal == NULL)
2367             sym->formal = f;
2368           else
2369             tail->next = f;
2370
2371           tail = f;
2372         }
2373     }
2374
2375   mio_rparen ();
2376 }
2377
2378
2379 /* Save or restore a reference to a symbol node.  */
2380
2381 pointer_info *
2382 mio_symbol_ref (gfc_symbol **symp)
2383 {
2384   pointer_info *p;
2385
2386   p = mio_pointer_ref (symp);
2387   if (p->type == P_UNKNOWN)
2388     p->type = P_SYMBOL;
2389
2390   if (iomode == IO_OUTPUT)
2391     {
2392       if (p->u.wsym.state == UNREFERENCED)
2393         p->u.wsym.state = NEEDS_WRITE;
2394     }
2395   else
2396     {
2397       if (p->u.rsym.state == UNUSED)
2398         p->u.rsym.state = NEEDED;
2399     }
2400   return p;
2401 }
2402
2403
2404 /* Save or restore a reference to a symtree node.  */
2405
2406 static void
2407 mio_symtree_ref (gfc_symtree **stp)
2408 {
2409   pointer_info *p;
2410   fixup_t *f;
2411
2412   if (iomode == IO_OUTPUT)
2413     mio_symbol_ref (&(*stp)->n.sym);
2414   else
2415     {
2416       require_atom (ATOM_INTEGER);
2417       p = get_integer (atom_int);
2418
2419       /* An unused equivalence member; make a symbol and a symtree
2420          for it.  */
2421       if (in_load_equiv && p->u.rsym.symtree == NULL)
2422         {
2423           /* Since this is not used, it must have a unique name.  */
2424           p->u.rsym.symtree = gfc_get_unique_symtree (gfc_current_ns);
2425
2426           /* Make the symbol.  */
2427           if (p->u.rsym.sym == NULL)
2428             {
2429               p->u.rsym.sym = gfc_new_symbol (p->u.rsym.true_name,
2430                                               gfc_current_ns);
2431               p->u.rsym.sym->module = gfc_get_string (p->u.rsym.module);
2432             }
2433
2434           p->u.rsym.symtree->n.sym = p->u.rsym.sym;
2435           p->u.rsym.symtree->n.sym->refs++;
2436           p->u.rsym.referenced = 1;
2437
2438           /* If the symbol is PRIVATE and in COMMON, load_commons will
2439              generate a fixup symbol, which must be associated.  */
2440           if (p->fixup)
2441             resolve_fixups (p->fixup, p->u.rsym.sym);
2442           p->fixup = NULL;
2443         }
2444       
2445       if (p->type == P_UNKNOWN)
2446         p->type = P_SYMBOL;
2447
2448       if (p->u.rsym.state == UNUSED)
2449         p->u.rsym.state = NEEDED;
2450
2451       if (p->u.rsym.symtree != NULL)
2452         {
2453           *stp = p->u.rsym.symtree;
2454         }
2455       else
2456         {
2457           f = gfc_getmem (sizeof (fixup_t));
2458
2459           f->next = p->u.rsym.stfixup;
2460           p->u.rsym.stfixup = f;
2461
2462           f->pointer = (void **) stp;
2463         }
2464     }
2465 }
2466
2467
2468 static void
2469 mio_iterator (gfc_iterator **ip)
2470 {
2471   gfc_iterator *iter;
2472
2473   mio_lparen ();
2474
2475   if (iomode == IO_OUTPUT)
2476     {
2477       if (*ip == NULL)
2478         goto done;
2479     }
2480   else
2481     {
2482       if (peek_atom () == ATOM_RPAREN)
2483         {
2484           *ip = NULL;
2485           goto done;
2486         }
2487
2488       *ip = gfc_get_iterator ();
2489     }
2490
2491   iter = *ip;
2492
2493   mio_expr (&iter->var);
2494   mio_expr (&iter->start);
2495   mio_expr (&iter->end);
2496   mio_expr (&iter->step);
2497
2498 done:
2499   mio_rparen ();
2500 }
2501
2502
2503 static void
2504 mio_constructor (gfc_constructor **cp)
2505 {
2506   gfc_constructor *c, *tail;
2507
2508   mio_lparen ();
2509
2510   if (iomode == IO_OUTPUT)
2511     {
2512       for (c = *cp; c; c = c->next)
2513         {
2514           mio_lparen ();
2515           mio_expr (&c->expr);
2516           mio_iterator (&c->iterator);
2517           mio_rparen ();
2518         }
2519     }
2520   else
2521     {
2522       *cp = NULL;
2523       tail = NULL;
2524
2525       while (peek_atom () != ATOM_RPAREN)
2526         {
2527           c = gfc_get_constructor ();
2528
2529           if (tail == NULL)
2530             *cp = c;
2531           else
2532             tail->next = c;
2533
2534           tail = c;
2535
2536           mio_lparen ();
2537           mio_expr (&c->expr);
2538           mio_iterator (&c->iterator);
2539           mio_rparen ();
2540         }
2541     }
2542
2543   mio_rparen ();
2544 }
2545
2546
2547 static const mstring ref_types[] = {
2548     minit ("ARRAY", REF_ARRAY),
2549     minit ("COMPONENT", REF_COMPONENT),
2550     minit ("SUBSTRING", REF_SUBSTRING),
2551     minit (NULL, -1)
2552 };
2553
2554
2555 static void
2556 mio_ref (gfc_ref **rp)
2557 {
2558   gfc_ref *r;
2559
2560   mio_lparen ();
2561
2562   r = *rp;
2563   r->type = MIO_NAME (ref_type) (r->type, ref_types);
2564
2565   switch (r->type)
2566     {
2567     case REF_ARRAY:
2568       mio_array_ref (&r->u.ar);
2569       break;
2570
2571     case REF_COMPONENT:
2572       mio_symbol_ref (&r->u.c.sym);
2573       mio_component_ref (&r->u.c.component, r->u.c.sym);
2574       break;
2575
2576     case REF_SUBSTRING:
2577       mio_expr (&r->u.ss.start);
2578       mio_expr (&r->u.ss.end);
2579       mio_charlen (&r->u.ss.length);
2580       break;
2581     }
2582
2583   mio_rparen ();
2584 }
2585
2586
2587 static void
2588 mio_ref_list (gfc_ref **rp)
2589 {
2590   gfc_ref *ref, *head, *tail;
2591
2592   mio_lparen ();
2593
2594   if (iomode == IO_OUTPUT)
2595     {
2596       for (ref = *rp; ref; ref = ref->next)
2597         mio_ref (&ref);
2598     }
2599   else
2600     {
2601       head = tail = NULL;
2602
2603       while (peek_atom () != ATOM_RPAREN)
2604         {
2605           if (head == NULL)
2606             head = tail = gfc_get_ref ();
2607           else
2608             {
2609               tail->next = gfc_get_ref ();
2610               tail = tail->next;
2611             }
2612
2613           mio_ref (&tail);
2614         }
2615
2616       *rp = head;
2617     }
2618
2619   mio_rparen ();
2620 }
2621
2622
2623 /* Read and write an integer value.  */
2624
2625 static void
2626 mio_gmp_integer (mpz_t *integer)
2627 {
2628   char *p;
2629
2630   if (iomode == IO_INPUT)
2631     {
2632       if (parse_atom () != ATOM_STRING)
2633         bad_module ("Expected integer string");
2634
2635       mpz_init (*integer);
2636       if (mpz_set_str (*integer, atom_string, 10))
2637         bad_module ("Error converting integer");
2638
2639       gfc_free (atom_string);
2640     }
2641   else
2642     {
2643       p = mpz_get_str (NULL, 10, *integer);
2644       write_atom (ATOM_STRING, p);
2645       gfc_free (p);
2646     }
2647 }
2648
2649
2650 static void
2651 mio_gmp_real (mpfr_t *real)
2652 {
2653   mp_exp_t exponent;
2654   char *p;
2655
2656   if (iomode == IO_INPUT)
2657     {
2658       if (parse_atom () != ATOM_STRING)
2659         bad_module ("Expected real string");
2660
2661       mpfr_init (*real);
2662       mpfr_set_str (*real, atom_string, 16, GFC_RND_MODE);
2663       gfc_free (atom_string);
2664     }
2665   else
2666     {
2667       p = mpfr_get_str (NULL, &exponent, 16, 0, *real, GFC_RND_MODE);
2668
2669       if (mpfr_nan_p (*real) || mpfr_inf_p (*real))
2670         {
2671           write_atom (ATOM_STRING, p);
2672           gfc_free (p);
2673           return;
2674         }
2675
2676       atom_string = gfc_getmem (strlen (p) + 20);
2677
2678       sprintf (atom_string, "0.%s@%ld", p, exponent);
2679
2680       /* Fix negative numbers.  */
2681       if (atom_string[2] == '-')
2682         {
2683           atom_string[0] = '-';
2684           atom_string[1] = '0';
2685           atom_string[2] = '.';
2686         }
2687
2688       write_atom (ATOM_STRING, atom_string);
2689
2690       gfc_free (atom_string);
2691       gfc_free (p);
2692     }
2693 }
2694
2695
2696 /* Save and restore the shape of an array constructor.  */
2697
2698 static void
2699 mio_shape (mpz_t **pshape, int rank)
2700 {
2701   mpz_t *shape;
2702   atom_type t;
2703   int n;
2704
2705   /* A NULL shape is represented by ().  */
2706   mio_lparen ();
2707
2708   if (iomode == IO_OUTPUT)
2709     {
2710       shape = *pshape;
2711       if (!shape)
2712         {
2713           mio_rparen ();
2714           return;
2715         }
2716     }
2717   else
2718     {
2719       t = peek_atom ();
2720       if (t == ATOM_RPAREN)
2721         {
2722           *pshape = NULL;
2723           mio_rparen ();
2724           return;
2725         }
2726
2727       shape = gfc_get_shape (rank);
2728       *pshape = shape;
2729     }
2730
2731   for (n = 0; n < rank; n++)
2732     mio_gmp_integer (&shape[n]);
2733
2734   mio_rparen ();
2735 }
2736
2737
2738 static const mstring expr_types[] = {
2739     minit ("OP", EXPR_OP),
2740     minit ("FUNCTION", EXPR_FUNCTION),
2741     minit ("CONSTANT", EXPR_CONSTANT),
2742     minit ("VARIABLE", EXPR_VARIABLE),
2743     minit ("SUBSTRING", EXPR_SUBSTRING),
2744     minit ("STRUCTURE", EXPR_STRUCTURE),
2745     minit ("ARRAY", EXPR_ARRAY),
2746     minit ("NULL", EXPR_NULL),
2747     minit (NULL, -1)
2748 };
2749
2750 /* INTRINSIC_ASSIGN is missing because it is used as an index for
2751    generic operators, not in expressions.  INTRINSIC_USER is also
2752    replaced by the correct function name by the time we see it.  */
2753
2754 static const mstring intrinsics[] =
2755 {
2756     minit ("UPLUS", INTRINSIC_UPLUS),
2757     minit ("UMINUS", INTRINSIC_UMINUS),
2758     minit ("PLUS", INTRINSIC_PLUS),
2759     minit ("MINUS", INTRINSIC_MINUS),
2760     minit ("TIMES", INTRINSIC_TIMES),
2761     minit ("DIVIDE", INTRINSIC_DIVIDE),
2762     minit ("POWER", INTRINSIC_POWER),
2763     minit ("CONCAT", INTRINSIC_CONCAT),
2764     minit ("AND", INTRINSIC_AND),
2765     minit ("OR", INTRINSIC_OR),
2766     minit ("EQV", INTRINSIC_EQV),
2767     minit ("NEQV", INTRINSIC_NEQV),
2768     minit ("EQ_SIGN", INTRINSIC_EQ),
2769     minit ("EQ", INTRINSIC_EQ_OS),
2770     minit ("NE_SIGN", INTRINSIC_NE),
2771     minit ("NE", INTRINSIC_NE_OS),
2772     minit ("GT_SIGN", INTRINSIC_GT),
2773     minit ("GT", INTRINSIC_GT_OS),
2774     minit ("GE_SIGN", INTRINSIC_GE),
2775     minit ("GE", INTRINSIC_GE_OS),
2776     minit ("LT_SIGN", INTRINSIC_LT),
2777     minit ("LT", INTRINSIC_LT_OS),
2778     minit ("LE_SIGN", INTRINSIC_LE),
2779     minit ("LE", INTRINSIC_LE_OS),
2780     minit ("NOT", INTRINSIC_NOT),
2781     minit ("PARENTHESES", INTRINSIC_PARENTHESES),
2782     minit (NULL, -1)
2783 };
2784
2785
2786 /* Remedy a couple of situations where the gfc_expr's can be defective.  */
2787  
2788 static void
2789 fix_mio_expr (gfc_expr *e)
2790 {
2791   gfc_symtree *ns_st = NULL;
2792   const char *fname;
2793
2794   if (iomode != IO_OUTPUT)
2795     return;
2796
2797   if (e->symtree)
2798     {
2799       /* If this is a symtree for a symbol that came from a contained module
2800          namespace, it has a unique name and we should look in the current
2801          namespace to see if the required, non-contained symbol is available
2802          yet. If so, the latter should be written.  */
2803       if (e->symtree->n.sym && check_unique_name (e->symtree->name))
2804         ns_st = gfc_find_symtree (gfc_current_ns->sym_root,
2805                                   e->symtree->n.sym->name);
2806
2807       /* On the other hand, if the existing symbol is the module name or the
2808          new symbol is a dummy argument, do not do the promotion.  */
2809       if (ns_st && ns_st->n.sym
2810           && ns_st->n.sym->attr.flavor != FL_MODULE
2811           && !e->symtree->n.sym->attr.dummy)
2812         e->symtree = ns_st;
2813     }
2814   else if (e->expr_type == EXPR_FUNCTION && e->value.function.name)
2815     {
2816       /* In some circumstances, a function used in an initialization
2817          expression, in one use associated module, can fail to be
2818          coupled to its symtree when used in a specification
2819          expression in another module.  */
2820       fname = e->value.function.esym ? e->value.function.esym->name
2821                                      : e->value.function.isym->name;
2822       e->symtree = gfc_find_symtree (gfc_current_ns->sym_root, fname);
2823     }
2824 }
2825
2826
2827 /* Read and write expressions.  The form "()" is allowed to indicate a
2828    NULL expression.  */
2829
2830 static void
2831 mio_expr (gfc_expr **ep)
2832 {
2833   gfc_expr *e;
2834   atom_type t;
2835   int flag;
2836
2837   mio_lparen ();
2838
2839   if (iomode == IO_OUTPUT)
2840     {
2841       if (*ep == NULL)
2842         {
2843           mio_rparen ();
2844           return;
2845         }
2846
2847       e = *ep;
2848       MIO_NAME (expr_t) (e->expr_type, expr_types);
2849     }
2850   else
2851     {
2852       t = parse_atom ();
2853       if (t == ATOM_RPAREN)
2854         {
2855           *ep = NULL;
2856           return;
2857         }
2858
2859       if (t != ATOM_NAME)
2860         bad_module ("Expected expression type");
2861
2862       e = *ep = gfc_get_expr ();
2863       e->where = gfc_current_locus;
2864       e->expr_type = (expr_t) find_enum (expr_types);
2865     }
2866
2867   mio_typespec (&e->ts);
2868   mio_integer (&e->rank);
2869
2870   fix_mio_expr (e);
2871
2872   switch (e->expr_type)
2873     {
2874     case EXPR_OP:
2875       e->value.op.operator
2876         = MIO_NAME (gfc_intrinsic_op) (e->value.op.operator, intrinsics);
2877
2878       switch (e->value.op.operator)
2879         {
2880         case INTRINSIC_UPLUS:
2881         case INTRINSIC_UMINUS:
2882         case INTRINSIC_NOT:
2883         case INTRINSIC_PARENTHESES:
2884           mio_expr (&e->value.op.op1);
2885           break;
2886
2887         case INTRINSIC_PLUS:
2888         case INTRINSIC_MINUS:
2889         case INTRINSIC_TIMES:
2890         case INTRINSIC_DIVIDE:
2891         case INTRINSIC_POWER:
2892         case INTRINSIC_CONCAT:
2893         case INTRINSIC_AND:
2894         case INTRINSIC_OR:
2895         case INTRINSIC_EQV:
2896         case INTRINSIC_NEQV:
2897         case INTRINSIC_EQ:
2898         case INTRINSIC_EQ_OS:
2899         case INTRINSIC_NE:
2900         case INTRINSIC_NE_OS:
2901         case INTRINSIC_GT:
2902         case INTRINSIC_GT_OS:
2903         case INTRINSIC_GE:
2904         case INTRINSIC_GE_OS:
2905         case INTRINSIC_LT:
2906         case INTRINSIC_LT_OS:
2907         case INTRINSIC_LE:
2908         case INTRINSIC_LE_OS:
2909           mio_expr (&e->value.op.op1);
2910           mio_expr (&e->value.op.op2);
2911           break;
2912
2913         default:
2914           bad_module ("Bad operator");
2915         }
2916
2917       break;
2918
2919     case EXPR_FUNCTION:
2920       mio_symtree_ref (&e->symtree);
2921       mio_actual_arglist (&e->value.function.actual);
2922
2923       if (iomode == IO_OUTPUT)
2924         {
2925           e->value.function.name
2926             = mio_allocated_string (e->value.function.name);
2927           flag = e->value.function.esym != NULL;
2928           mio_integer (&flag);
2929           if (flag)
2930             mio_symbol_ref (&e->value.function.esym);
2931           else
2932             write_atom (ATOM_STRING, e->value.function.isym->name);
2933         }
2934       else
2935         {
2936           require_atom (ATOM_STRING);
2937           e->value.function.name = gfc_get_string (atom_string);
2938           gfc_free (atom_string);
2939
2940           mio_integer (&flag);
2941           if (flag)
2942             mio_symbol_ref (&e->value.function.esym);
2943           else
2944             {
2945               require_atom (ATOM_STRING);
2946               e->value.function.isym = gfc_find_function (atom_string);
2947               gfc_free (atom_string);
2948             }
2949         }
2950
2951       break;
2952
2953     case EXPR_VARIABLE:
2954       mio_symtree_ref (&e->symtree);
2955       mio_ref_list (&e->ref);
2956       break;
2957
2958     case EXPR_SUBSTRING:
2959       e->value.character.string
2960         = CONST_CAST (gfc_char_t *,
2961                       mio_allocated_wide_string (e->value.character.string,
2962                                                  e->value.character.length));
2963       mio_ref_list (&e->ref);
2964       break;
2965
2966     case EXPR_STRUCTURE:
2967     case EXPR_ARRAY:
2968       mio_constructor (&e->value.constructor);
2969       mio_shape (&e->shape, e->rank);
2970       break;
2971
2972     case EXPR_CONSTANT:
2973       switch (e->ts.type)
2974         {
2975         case BT_INTEGER:
2976           mio_gmp_integer (&e->value.integer);
2977           break;
2978
2979         case BT_REAL:
2980           gfc_set_model_kind (e->ts.kind);
2981           mio_gmp_real (&e->value.real);
2982           break;
2983
2984         case BT_COMPLEX:
2985           gfc_set_model_kind (e->ts.kind);
2986           mio_gmp_real (&e->value.complex.r);
2987           mio_gmp_real (&e->value.complex.i);
2988           break;
2989
2990         case BT_LOGICAL:
2991           mio_integer (&e->value.logical);
2992           break;
2993
2994         case BT_CHARACTER:
2995           mio_integer (&e->value.character.length);
2996           e->value.character.string
2997             = CONST_CAST (gfc_char_t *,
2998                           mio_allocated_wide_string (e->value.character.string,
2999                                                      e->value.character.length));
3000           break;
3001
3002         default:
3003           bad_module ("Bad type in constant expression");
3004         }
3005
3006       break;
3007
3008     case EXPR_NULL:
3009       break;
3010     }
3011
3012   mio_rparen ();
3013 }
3014
3015
3016 /* Read and write namelists.  */
3017
3018 static void
3019 mio_namelist (gfc_symbol *sym)
3020 {
3021   gfc_namelist *n, *m;
3022   const char *check_name;
3023
3024   mio_lparen ();
3025
3026   if (iomode == IO_OUTPUT)
3027     {
3028       for (n = sym->namelist; n; n = n->next)
3029         mio_symbol_ref (&n->sym);
3030     }
3031   else
3032     {
3033       /* This departure from the standard is flagged as an error.
3034          It does, in fact, work correctly. TODO: Allow it
3035          conditionally?  */
3036       if (sym->attr.flavor == FL_NAMELIST)
3037         {
3038           check_name = find_use_name (sym->name, false);
3039           if (check_name && strcmp (check_name, sym->name) != 0)
3040             gfc_error ("Namelist %s cannot be renamed by USE "
3041                        "association to %s", sym->name, check_name);
3042         }
3043
3044       m = NULL;
3045       while (peek_atom () != ATOM_RPAREN)
3046         {
3047           n = gfc_get_namelist ();
3048           mio_symbol_ref (&n->sym);
3049
3050           if (sym->namelist == NULL)
3051             sym->namelist = n;
3052           else
3053             m->next = n;
3054
3055           m = n;
3056         }
3057       sym->namelist_tail = m;
3058     }
3059
3060   mio_rparen ();
3061 }
3062
3063
3064 /* Save/restore lists of gfc_interface stuctures.  When loading an
3065    interface, we are really appending to the existing list of
3066    interfaces.  Checking for duplicate and ambiguous interfaces has to
3067    be done later when all symbols have been loaded.  */
3068
3069 pointer_info *
3070 mio_interface_rest (gfc_interface **ip)
3071 {
3072   gfc_interface *tail, *p;
3073   pointer_info *pi = NULL;
3074
3075   if (iomode == IO_OUTPUT)
3076     {
3077       if (ip != NULL)
3078         for (p = *ip; p; p = p->next)
3079           mio_symbol_ref (&p->sym);
3080     }
3081   else
3082     {
3083       if (*ip == NULL)
3084         tail = NULL;
3085       else
3086         {
3087           tail = *ip;
3088           while (tail->next)
3089             tail = tail->next;
3090         }
3091
3092       for (;;)
3093         {
3094           if (peek_atom () == ATOM_RPAREN)
3095             break;
3096
3097           p = gfc_get_interface ();
3098           p->where = gfc_current_locus;
3099           pi = mio_symbol_ref (&p->sym);
3100
3101           if (tail == NULL)
3102             *ip = p;
3103           else
3104             tail->next = p;
3105
3106           tail = p;
3107         }
3108     }
3109
3110   mio_rparen ();
3111   return pi;
3112 }
3113
3114
3115 /* Save/restore a nameless operator interface.  */
3116
3117 static void
3118 mio_interface (gfc_interface **ip)
3119 {
3120   mio_lparen ();
3121   mio_interface_rest (ip);
3122 }
3123
3124
3125 /* Save/restore a named operator interface.  */
3126
3127 static void
3128 mio_symbol_interface (const char **name, const char **module,
3129                       gfc_interface **ip)
3130 {
3131   mio_lparen ();
3132   mio_pool_string (name);
3133   mio_pool_string (module);
3134   mio_interface_rest (ip);
3135 }
3136
3137
3138 static void
3139 mio_namespace_ref (gfc_namespace **nsp)
3140 {
3141   gfc_namespace *ns;
3142   pointer_info *p;
3143
3144   p = mio_pointer_ref (nsp);
3145
3146   if (p->type == P_UNKNOWN)
3147     p->type = P_NAMESPACE;
3148
3149   if (iomode == IO_INPUT && p->integer != 0)
3150     {
3151       ns = (gfc_namespace *) p->u.pointer;
3152       if (ns == NULL)
3153         {
3154           ns = gfc_get_namespace (NULL, 0);
3155           associate_integer_pointer (p, ns);
3156         }
3157       else
3158         ns->refs++;
3159     }
3160 }
3161
3162
3163 /* Unlike most other routines, the address of the symbol node is already
3164    fixed on input and the name/module has already been filled in.  */
3165
3166 static void
3167 mio_symbol (gfc_symbol *sym)
3168 {
3169   int intmod = INTMOD_NONE;
3170   
3171   gfc_formal_arglist *formal;
3172
3173   mio_lparen ();
3174
3175   mio_symbol_attribute (&sym->attr);
3176   mio_typespec (&sym->ts);
3177
3178   /* Contained procedures don't have formal namespaces.  Instead we output the
3179      procedure namespace.  The will contain the formal arguments.  */
3180   if (iomode == IO_OUTPUT)
3181     {
3182       formal = sym->formal;
3183       while (formal && !formal->sym)
3184         formal = formal->next;
3185
3186       if (formal)
3187         mio_namespace_ref (&formal->sym->ns);
3188       else
3189         mio_namespace_ref (&sym->formal_ns);
3190     }
3191   else
3192     {
3193       mio_namespace_ref (&sym->formal_ns);
3194       if (sym->formal_ns)
3195         {
3196           sym->formal_ns->proc_name = sym;
3197           sym->refs++;
3198         }
3199     }
3200
3201   /* Save/restore common block links.  */
3202   mio_symbol_ref (&sym->common_next);
3203
3204   mio_formal_arglist (sym);
3205
3206   if (sym->attr.flavor == FL_PARAMETER)
3207     mio_expr (&sym->value);
3208
3209   mio_array_spec (&sym->as);
3210
3211   mio_symbol_ref (&sym->result);
3212
3213   if (sym->attr.cray_pointee)
3214     mio_symbol_ref (&sym->cp_pointer);
3215
3216   /* Note that components are always saved, even if they are supposed
3217      to be private.  Component access is checked during searching.  */
3218
3219   mio_component_list (&sym->components);
3220
3221   if (sym->components != NULL)
3222     sym->component_access
3223       = MIO_NAME (gfc_access) (sym->component_access, access_types);
3224
3225   mio_namelist (sym);
3226
3227   /* Add the fields that say whether this is from an intrinsic module,
3228      and if so, what symbol it is within the module.  */
3229 /*   mio_integer (&(sym->from_intmod)); */
3230   if (iomode == IO_OUTPUT)
3231     {
3232       intmod = sym->from_intmod;
3233       mio_integer (&intmod);
3234     }
3235   else
3236     {
3237       mio_integer (&intmod);
3238       sym->from_intmod = intmod;
3239     }
3240   
3241   mio_integer (&(sym->intmod_sym_id));
3242   
3243   mio_rparen ();
3244 }
3245
3246
3247 /************************* Top level subroutines *************************/
3248
3249 /* Given a root symtree node and a symbol, try to find a symtree that
3250    references the symbol that is not a unique name.  */
3251
3252 static gfc_symtree *
3253 find_symtree_for_symbol (gfc_symtree *st, gfc_symbol *sym)
3254 {
3255   gfc_symtree *s = NULL;
3256
3257   if (st == NULL)
3258     return s;
3259
3260   s = find_symtree_for_symbol (st->right, sym);
3261   if (s != NULL)
3262     return s;
3263   s = find_symtree_for_symbol (st->left, sym);
3264   if (s != NULL)
3265     return s;
3266
3267   if (st->n.sym == sym && !check_unique_name (st->name))
3268     return st;
3269
3270   return s;
3271 }
3272
3273
3274 /* A recursive function to look for a speficic symbol by name and by
3275    module.  Whilst several symtrees might point to one symbol, its
3276    is sufficient for the purposes here than one exist.  Note that
3277    generic interfaces are distinguished as are symbols that have been
3278    renamed in another module.  */
3279 static gfc_symtree *
3280 find_symbol (gfc_symtree *st, const char *name,
3281              const char *module, int generic)
3282 {
3283   int c;
3284   gfc_symtree *retval, *s;
3285
3286   if (st == NULL || st->n.sym == NULL)
3287     return NULL;
3288
3289   c = strcmp (name, st->n.sym->name);
3290   if (c == 0 && st->n.sym->module
3291              && strcmp (module, st->n.sym->module) == 0
3292              && !check_unique_name (st->name))
3293     {
3294       s = gfc_find_symtree (gfc_current_ns->sym_root, name);
3295
3296       /* Detect symbols that are renamed by use association in another
3297          module by the absence of a symtree and null attr.use_rename,
3298          since the latter is not transmitted in the module file.  */
3299       if (((!generic && !st->n.sym->attr.generic)
3300                 || (generic && st->n.sym->attr.generic))
3301             && !(s == NULL && !st->n.sym->attr.use_rename))
3302         return st;
3303     }
3304
3305   retval = find_symbol (st->left, name, module, generic);
3306
3307   if (retval == NULL)
3308     retval = find_symbol (st->right, name, module, generic);
3309
3310   return retval;
3311 }
3312
3313
3314 /* Skip a list between balanced left and right parens.  */
3315
3316 static void
3317 skip_list (void)
3318 {
3319   int level;
3320
3321   level = 0;
3322   do
3323     {
3324       switch (parse_atom ())
3325         {
3326         case ATOM_LPAREN:
3327           level++;
3328           break;
3329
3330         case ATOM_RPAREN:
3331           level--;
3332           break;
3333
3334         case ATOM_STRING:
3335           gfc_free (atom_string);
3336           break;
3337
3338         case ATOM_NAME:
3339         case ATOM_INTEGER:
3340           break;
3341         }
3342     }
3343   while (level > 0);
3344 }
3345
3346
3347 /* Load operator interfaces from the module.  Interfaces are unusual
3348    in that they attach themselves to existing symbols.  */
3349
3350 static void
3351 load_operator_interfaces (void)
3352 {
3353   const char *p;
3354   char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
3355   gfc_user_op *uop;
3356   pointer_info *pi = NULL;
3357   int n, i;
3358
3359   mio_lparen ();
3360
3361   while (peek_atom () != ATOM_RPAREN)
3362     {
3363       mio_lparen ();
3364
3365       mio_internal_string (name);
3366       mio_internal_string (module);
3367
3368       n = number_use_names (name, true);
3369       n = n ? n : 1;
3370
3371       for (i = 1; i <= n; i++)
3372         {
3373           /* Decide if we need to load this one or not.  */
3374           p = find_use_name_n (name, &i, true);
3375
3376           if (p == NULL)
3377             {
3378               while (parse_atom () != ATOM_RPAREN);
3379               continue;
3380             }
3381
3382           if (i == 1)
3383             {
3384               uop = gfc_get_uop (p);
3385               pi = mio_interface_rest (&uop->operator);
3386             }
3387           else
3388             {
3389               if (gfc_find_uop (p, NULL))
3390                 continue;
3391               uop = gfc_get_uop (p);
3392               uop->operator = gfc_get_interface ();
3393               uop->operator->where = gfc_current_locus;
3394               add_fixup (pi->integer, &uop->operator->sym);
3395             }
3396         }
3397     }
3398
3399   mio_rparen ();
3400 }
3401
3402
3403 /* Load interfaces from the module.  Interfaces are unusual in that
3404    they attach themselves to existing symbols.  */
3405
3406 static void
3407 load_generic_interfaces (void)
3408 {
3409   const char *p;
3410   char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
3411   gfc_symbol *sym;
3412   gfc_interface *generic = NULL;
3413   int n, i, renamed;
3414
3415   mio_lparen ();
3416
3417   while (peek_atom () != ATOM_RPAREN)
3418     {
3419       mio_lparen ();
3420
3421       mio_internal_string (name);
3422       mio_internal_string (module);
3423
3424       n = number_use_names (name, false);
3425       renamed = n ? 1 : 0;
3426       n = n ? n : 1;
3427
3428       for (i = 1; i <= n; i++)
3429         {
3430           gfc_symtree *st;
3431           /* Decide if we need to load this one or not.  */
3432           p = find_use_name_n (name, &i, false);
3433
3434           st = find_symbol (gfc_current_ns->sym_root,
3435                             name, module_name, 1);
3436
3437           if (!p || gfc_find_symbol (p, NULL, 0, &sym))
3438             {
3439               /* Skip the specific names for these cases.  */
3440               while (i == 1 && parse_atom () != ATOM_RPAREN);
3441
3442               continue;
3443             }
3444
3445           /* If the symbol exists already and is being USEd without being
3446              in an ONLY clause, do not load a new symtree(11.3.2).  */
3447           if (!only_flag && st)
3448             sym = st->n.sym;
3449
3450           if (!sym)
3451             {
3452               /* Make the symbol inaccessible if it has been added by a USE
3453                  statement without an ONLY(11.3.2).  */
3454               if (st && only_flag
3455                      && !st->n.sym->attr.use_only
3456                      && !st->n.sym->attr.use_rename
3457                      && strcmp (st->n.sym->module, module_name) == 0)
3458                 {
3459                   sym = st->n.sym;
3460                   gfc_delete_symtree (&gfc_current_ns->sym_root, name);
3461                   st = gfc_get_unique_symtree (gfc_current_ns);
3462                   st->n.sym = sym;
3463                   sym = NULL;
3464                 }
3465               else if (st)
3466                 {
3467                   sym = st->n.sym;
3468                   if (strcmp (st->name, p) != 0)
3469                     {
3470                       st = gfc_new_symtree (&gfc_current_ns->sym_root, p);
3471                       st->n.sym = sym;
3472                       sym->refs++;
3473                     }
3474                 }
3475
3476               /* Since we haven't found a valid generic interface, we had
3477                  better make one.  */
3478               if (!sym)
3479                 {
3480                   gfc_get_symbol (p, NULL, &sym);
3481                   sym->name = gfc_get_string (name);
3482                   sym->module = gfc_get_string (module_name);
3483                   sym->attr.flavor = FL_PROCEDURE;
3484                   sym->attr.generic = 1;
3485                   sym->attr.use_assoc = 1;
3486                 }
3487             }
3488           else
3489             {
3490               /* Unless sym is a generic interface, this reference
3491                  is ambiguous.  */
3492               if (st == NULL)
3493                 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
3494
3495               sym = st->n.sym;
3496
3497               if (st && !sym->attr.generic
3498                      && sym->module
3499                      && strcmp(module, sym->module))
3500                 st->ambiguous = 1;
3501             }
3502
3503           sym->attr.use_only = only_flag;
3504           sym->attr.use_rename = renamed;
3505
3506           if (i == 1)
3507             {
3508               mio_interface_rest (&sym->generic);
3509               generic = sym->generic;
3510             }
3511           else if (!sym->generic)
3512             {
3513               sym->generic = generic;
3514               sym->attr.generic_copy = 1;
3515             }
3516         }
3517     }
3518
3519   mio_rparen ();
3520 }
3521
3522
3523 /* Load common blocks.  */
3524
3525 static void
3526 load_commons (void)
3527 {
3528   char name[GFC_MAX_SYMBOL_LEN + 1];
3529   gfc_common_head *p;
3530
3531   mio_lparen ();
3532
3533   while (peek_atom () != ATOM_RPAREN)
3534     {
3535       int flags;
3536       mio_lparen ();
3537       mio_internal_string (name);
3538
3539       p = gfc_get_common (name, 1);
3540
3541       mio_symbol_ref (&p->head);
3542       mio_integer (&flags);
3543       if (flags & 1)
3544         p->saved = 1;
3545       if (flags & 2)
3546         p->threadprivate = 1;
3547       p->use_assoc = 1;
3548
3549       /* Get whether this was a bind(c) common or not.  */
3550       mio_integer (&p->is_bind_c);
3551       /* Get the binding label.  */
3552       mio_internal_string (p->binding_label);
3553       
3554       mio_rparen ();
3555     }
3556
3557   mio_rparen ();
3558 }
3559
3560
3561 /* Load equivalences.  The flag in_load_equiv informs mio_expr_ref of this
3562    so that unused variables are not loaded and so that the expression can
3563    be safely freed.  */
3564
3565 static void
3566 load_equiv (void)
3567 {
3568   gfc_equiv *head, *tail, *end, *eq;
3569   bool unused;
3570
3571   mio_lparen ();
3572   in_load_equiv = true;
3573
3574   end = gfc_current_ns->equiv;
3575   while (end != NULL && end->next != NULL)
3576     end = end->next;
3577
3578   while (peek_atom () != ATOM_RPAREN) {
3579     mio_lparen ();
3580     head = tail = NULL;
3581
3582     while(peek_atom () != ATOM_RPAREN)
3583       {
3584         if (head == NULL)
3585           head = tail = gfc_get_equiv ();
3586         else
3587           {
3588             tail->eq = gfc_get_equiv ();
3589             tail = tail->eq;
3590           }
3591
3592         mio_pool_string (&tail->module);
3593         mio_expr (&tail->expr);
3594       }
3595
3596     /* Unused equivalence members have a unique name.  */
3597     unused = true;
3598     for (eq = head; eq; eq = eq->eq)
3599       {
3600         if (!check_unique_name (eq->expr->symtree->name))
3601           {
3602             unused = false;
3603             break;
3604           }
3605       }
3606
3607     if (unused)
3608       {
3609         for (eq = head; eq; eq = head)
3610           {
3611             head = eq->eq;
3612             gfc_free_expr (eq->expr);
3613             gfc_free (eq);
3614           }
3615       }
3616
3617     if (end == NULL)
3618       gfc_current_ns->equiv = head;
3619     else
3620       end->next = head;
3621
3622     if (head != NULL)
3623       end = head;
3624
3625     mio_rparen ();
3626   }
3627
3628   mio_rparen ();
3629   in_load_equiv = false;
3630 }
3631
3632
3633 /* Recursive function to traverse the pointer_info tree and load a
3634    needed symbol.  We return nonzero if we load a symbol and stop the
3635    traversal, because the act of loading can alter the tree.  */
3636
3637 static int
3638 load_needed (pointer_info *p)
3639 {
3640   gfc_namespace *ns;
3641   pointer_info *q;
3642   gfc_symbol *sym;
3643   int rv;
3644
3645   rv = 0;
3646   if (p == NULL)
3647     return rv;
3648
3649   rv |= load_needed (p->left);
3650   rv |= load_needed (p->right);
3651
3652   if (p->type != P_SYMBOL || p->u.rsym.state != NEEDED)
3653     return rv;
3654
3655   p->u.rsym.state = USED;
3656
3657   set_module_locus (&p->u.rsym.where);
3658
3659   sym = p->u.rsym.sym;
3660   if (sym == NULL)
3661     {
3662       q = get_integer (p->u.rsym.ns);
3663
3664       ns = (gfc_namespace *) q->u.pointer;
3665       if (ns == NULL)
3666         {
3667           /* Create an interface namespace if necessary.  These are
3668              the namespaces that hold the formal parameters of module
3669              procedures.  */
3670
3671           ns = gfc_get_namespace (NULL, 0);
3672           associate_integer_pointer (q, ns);
3673         }
3674
3675       /* Use the module sym as 'proc_name' so that gfc_get_symbol_decl
3676          doesn't go pear-shaped if the symbol is used.  */
3677       if (!ns->proc_name)
3678         gfc_find_symbol (p->u.rsym.module, gfc_current_ns,
3679                                  1, &ns->proc_name);
3680
3681       sym = gfc_new_symbol (p->u.rsym.true_name, ns);
3682       sym->module = gfc_get_string (p->u.rsym.module);
3683       strcpy (sym->binding_label, p->u.rsym.binding_label);
3684
3685       associate_integer_pointer (p, sym);
3686     }
3687
3688   mio_symbol (sym);
3689   sym->attr.use_assoc = 1;
3690   if (only_flag)
3691     sym->attr.use_only = 1;
3692   if (p->u.rsym.renamed)
3693     sym->attr.use_rename = 1;
3694
3695   return 1;
3696 }
3697
3698
3699 /* Recursive function for cleaning up things after a module has been read.  */
3700
3701 static void
3702 read_cleanup (pointer_info *p)
3703 {
3704   gfc_symtree *st;
3705   pointer_info *q;
3706
3707   if (p == NULL)
3708     return;
3709
3710   read_cleanup (p->left);
3711   read_cleanup (p->right);
3712
3713   if (p->type == P_SYMBOL && p->u.rsym.state == USED && !p->u.rsym.referenced)
3714     {
3715       /* Add hidden symbols to the symtree.  */
3716       q = get_integer (p->u.rsym.ns);
3717       st = gfc_get_unique_symtree ((gfc_namespace *) q->u.pointer);
3718
3719       st->n.sym = p->u.rsym.sym;
3720       st->n.sym->refs++;
3721
3722       /* Fixup any symtree references.  */
3723       p->u.rsym.symtree = st;
3724       resolve_fixups (p->u.rsym.stfixup, st);
3725       p->u.rsym.stfixup = NULL;
3726     }
3727
3728   /* Free unused symbols.  */
3729   if (p->type == P_SYMBOL && p->u.rsym.state == UNUSED)
3730     gfc_free_symbol (p->u.rsym.sym);
3731 }
3732
3733
3734 /* Read a module file.  */
3735
3736 static void
3737 read_module (void)
3738 {
3739   module_locus operator_interfaces, user_operators;
3740   const char *p;
3741   char name[GFC_MAX_SYMBOL_LEN + 1];
3742   gfc_intrinsic_op i;
3743   int ambiguous, j, nuse, symbol;
3744   pointer_info *info, *q;
3745   gfc_use_rename *u;
3746   gfc_symtree *st;
3747   gfc_symbol *sym;
3748
3749   get_module_locus (&operator_interfaces);      /* Skip these for now.  */
3750   skip_list ();
3751
3752   get_module_locus (&user_operators);
3753   skip_list ();
3754   skip_list ();
3755
3756   /* Skip commons and equivalences for now.  */
3757   skip_list ();
3758   skip_list ();
3759
3760   mio_lparen ();
3761
3762   /* Create the fixup nodes for all the symbols.  */
3763
3764   while (peek_atom () != ATOM_RPAREN)
3765     {
3766       require_atom (ATOM_INTEGER);
3767       info = get_integer (atom_int);
3768
3769       info->type = P_SYMBOL;
3770       info->u.rsym.state = UNUSED;
3771
3772       mio_internal_string (info->u.rsym.true_name);
3773       mio_internal_string (info->u.rsym.module);
3774       mio_internal_string (info->u.rsym.binding_label);
3775
3776       
3777       require_atom (ATOM_INTEGER);
3778       info->u.rsym.ns = atom_int;
3779
3780       get_module_locus (&info->u.rsym.where);
3781       skip_list ();
3782
3783       /* See if the symbol has already been loaded by a previous module.
3784          If so, we reference the existing symbol and prevent it from
3785          being loaded again.  This should not happen if the symbol being
3786          read is an index for an assumed shape dummy array (ns != 1).  */
3787
3788       sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
3789
3790       if (sym == NULL
3791           || (sym->attr.flavor == FL_VARIABLE && info->u.rsym.ns !=1))
3792         continue;
3793
3794       info->u.rsym.state = USED;
3795       info->u.rsym.sym = sym;
3796
3797       /* Some symbols do not have a namespace (eg. formal arguments),
3798          so the automatic "unique symtree" mechanism must be suppressed
3799          by marking them as referenced.  */
3800       q = get_integer (info->u.rsym.ns);
3801       if (q->u.pointer == NULL)
3802         {
3803           info->u.rsym.referenced = 1;
3804           continue;
3805         }
3806
3807       /* If possible recycle the symtree that references the symbol.
3808          If a symtree is not found and the module does not import one,
3809          a unique-name symtree is found by read_cleanup.  */
3810       st = find_symtree_for_symbol (gfc_current_ns->sym_root, sym);
3811       if (st != NULL)
3812         {
3813           info->u.rsym.symtree = st;
3814           info->u.rsym.referenced = 1;
3815         }
3816     }
3817
3818   mio_rparen ();
3819
3820   /* Parse the symtree lists.  This lets us mark which symbols need to
3821      be loaded.  Renaming is also done at this point by replacing the
3822      symtree name.  */
3823
3824   mio_lparen ();
3825
3826   while (peek_atom () != ATOM_RPAREN)
3827     {
3828       mio_internal_string (name);
3829       mio_integer (&ambiguous);
3830       mio_integer (&symbol);
3831
3832       info = get_integer (symbol);
3833
3834       /* See how many use names there are.  If none, go through the start
3835          of the loop at least once.  */
3836       nuse = number_use_names (name, false);
3837       info->u.rsym.renamed = nuse ? 1 : 0;
3838
3839       if (nuse == 0)
3840         nuse = 1;
3841
3842       for (j = 1; j <= nuse; j++)
3843         {
3844           /* Get the jth local name for this symbol.  */
3845           p = find_use_name_n (name, &j, false);
3846
3847           if (p == NULL && strcmp (name, module_name) == 0)
3848             p = name;
3849
3850           /* Skip symtree nodes not in an ONLY clause, unless there
3851              is an existing symtree loaded from another USE statement.  */
3852           if (p == NULL)
3853             {
3854               st = gfc_find_symtree (gfc_current_ns->sym_root, name);
3855               if (st != NULL)
3856                 info->u.rsym.symtree = st;
3857               continue;
3858             }
3859
3860           /* If a symbol of the same name and module exists already,
3861              this symbol, which is not in an ONLY clause, must not be
3862              added to the namespace(11.3.2).  Note that find_symbol
3863              only returns the first occurrence that it finds.  */
3864           if (!only_flag && !info->u.rsym.renamed
3865                 && strcmp (name, module_name) != 0
3866                 && find_symbol (gfc_current_ns->sym_root, name,
3867                                 module_name, 0))
3868             continue;
3869
3870           st = gfc_find_symtree (gfc_current_ns->sym_root, p);
3871
3872           if (st != NULL)
3873             {
3874               /* Check for ambiguous symbols.  */
3875               if (st->n.sym != info->u.rsym.sym)
3876                 st->ambiguous = 1;
3877               info->u.rsym.symtree = st;
3878             }
3879           else
3880             {
3881               st = gfc_find_symtree (gfc_current_ns->sym_root, name);
3882
3883               /* Delete the symtree if the symbol has been added by a USE
3884                  statement without an ONLY(11.3.2). Remember that the rsym
3885                  will be the same as the symbol found in the symtree, for
3886                  this case.*/
3887               if (st && (only_flag || info->u.rsym.renamed)
3888                      && !st->n.sym->attr.use_only
3889                      && !st->n.sym->attr.use_rename
3890                      && info->u.rsym.sym == st->n.sym)
3891                 gfc_delete_symtree (&gfc_current_ns->sym_root, name);
3892
3893               /* Create a symtree node in the current namespace for this
3894                  symbol.  */
3895               st = check_unique_name (p)
3896                    ? gfc_get_unique_symtree (gfc_current_ns)
3897                    : gfc_new_symtree (&gfc_current_ns->sym_root, p);
3898               st->ambiguous = ambiguous;
3899
3900               sym = info->u.rsym.sym;
3901
3902               /* Create a symbol node if it doesn't already exist.  */
3903               if (sym == NULL)
3904                 {
3905                   info->u.rsym.sym = gfc_new_symbol (info->u.rsym.true_name,
3906                                                      gfc_current_ns);
3907                   sym = info->u.rsym.sym;
3908                   sym->module = gfc_get_string (info->u.rsym.module);
3909
3910                   /* TODO: hmm, can we test this?  Do we know it will be
3911                      initialized to zeros?  */
3912                   if (info->u.rsym.binding_label[0] != '\0')
3913                     strcpy (sym->binding_label, info->u.rsym.binding_label);
3914                 }
3915
3916               st->n.sym = sym;
3917               st->n.sym->refs++;
3918
3919               if (strcmp (name, p) != 0)
3920                 sym->attr.use_rename = 1;
3921
3922               /* Store the symtree pointing to this symbol.  */
3923               info->u.rsym.symtree = st;
3924
3925               if (info->u.rsym.state == UNUSED)
3926                 info->u.rsym.state = NEEDED;
3927               info->u.rsym.referenced = 1;
3928             }
3929         }
3930     }
3931
3932   mio_rparen ();
3933
3934   /* Load intrinsic operator interfaces.  */
3935   set_module_locus (&operator_interfaces);
3936   mio_lparen ();
3937
3938   for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3939     {
3940       if (i == INTRINSIC_USER)
3941         continue;
3942
3943       if (only_flag)
3944         {
3945           u = find_use_operator (i);
3946
3947           if (u == NULL)
3948             {
3949               skip_list ();
3950               continue;
3951             }
3952
3953           u->found = 1;
3954         }
3955
3956       mio_interface (&gfc_current_ns->operator[i]);
3957     }
3958
3959   mio_rparen ();
3960
3961   /* Load generic and user operator interfaces.  These must follow the
3962      loading of symtree because otherwise symbols can be marked as
3963      ambiguous.  */
3964
3965   set_module_locus (&user_operators);
3966
3967   load_operator_interfaces ();
3968   load_generic_interfaces ();
3969
3970   load_commons ();
3971   load_equiv ();
3972
3973   /* At this point, we read those symbols that are needed but haven't
3974      been loaded yet.  If one symbol requires another, the other gets
3975      marked as NEEDED if its previous state was UNUSED.  */
3976
3977   while (load_needed (pi_root));
3978
3979   /* Make sure all elements of the rename-list were found in the module.  */
3980
3981   for (u = gfc_rename_list; u; u = u->next)
3982     {
3983       if (u->found)
3984         continue;
3985
3986       if (u->operator == INTRINSIC_NONE)
3987         {
3988           gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
3989                      u->use_name, &u->where, module_name);
3990           continue;
3991         }
3992
3993       if (u->operator == INTRINSIC_USER)
3994         {
3995           gfc_error ("User operator '%s' referenced at %L not found "
3996                      "in module '%s'", u->use_name, &u->where, module_name);
3997           continue;
3998         }
3999
4000       gfc_error ("Intrinsic operator '%s' referenced at %L not found "
4001                  "in module '%s'", gfc_op2string (u->operator), &u->where,
4002                  module_name);
4003     }
4004
4005   gfc_check_interfaces (gfc_current_ns);
4006
4007   /* Clean up symbol nodes that were never loaded, create references
4008      to hidden symbols.  */
4009
4010   read_cleanup (pi_root);
4011 }
4012
4013
4014 /* Given an access type that is specific to an entity and the default
4015    access, return nonzero if the entity is publicly accessible.  If the
4016    element is declared as PUBLIC, then it is public; if declared 
4017    PRIVATE, then private, and otherwise it is public unless the default
4018    access in this context has been declared PRIVATE.  */
4019
4020 bool
4021 gfc_check_access (gfc_access specific_access, gfc_access default_access)
4022 {
4023   if (specific_access == ACCESS_PUBLIC)
4024     return TRUE;
4025   if (specific_access == ACCESS_PRIVATE)
4026     return FALSE;
4027
4028   if (gfc_option.flag_module_private)
4029     return default_access == ACCESS_PUBLIC;
4030   else
4031     return default_access != ACCESS_PRIVATE;
4032 }
4033
4034
4035 /* A structure to remember which commons we've already written.  */
4036
4037 struct written_common
4038 {
4039   BBT_HEADER(written_common);
4040   const char *name, *label;
4041 };
4042
4043 static struct written_common *written_commons = NULL;
4044
4045 /* Comparison function used for balancing the binary tree.  */
4046
4047 static int
4048 compare_written_commons (void *a1, void *b1)
4049 {
4050   const char *aname = ((struct written_common *) a1)->name;
4051   const char *alabel = ((struct written_common *) a1)->label;
4052   const char *bname = ((struct written_common *) b1)->name;
4053   const char *blabel = ((struct written_common *) b1)->label;
4054   int c = strcmp (aname, bname);
4055
4056   return (c != 0 ? c : strcmp (alabel, blabel));
4057 }
4058
4059 /* Free a list of written commons.  */
4060
4061 static void
4062 free_written_common (struct written_common *w)
4063 {
4064   if (!w)
4065     return;
4066
4067   if (w->left)
4068     free_written_common (w->left);
4069   if (w->right)
4070     free_written_common (w->right);
4071
4072   gfc_free (w);
4073 }
4074
4075 /* Write a common block to the module -- recursive helper function.  */
4076
4077 static void
4078 write_common_0 (gfc_symtree *st)
4079 {
4080   gfc_common_head *p;
4081   const char * name;
4082   int flags;
4083   const char *label;
4084   struct written_common *w;
4085   bool write_me = true;
4086               
4087   if (st == NULL)
4088     return;
4089
4090   write_common_0 (st->left);
4091
4092   /* We will write out the binding label, or the name if no label given.  */
4093   name = st->n.common->name;
4094   p = st->n.common;
4095   label = p->is_bind_c ? p->binding_label : p->name;
4096
4097   /* Check if we've already output this common.  */
4098   w = written_commons;
4099   while (w)
4100     {
4101       int c = strcmp (name, w->name);
4102       c = (c != 0 ? c : strcmp (label, w->label));
4103       if (c == 0)
4104         write_me = false;
4105
4106       w = (c < 0) ? w->left : w->right;
4107     }
4108
4109   if (write_me)
4110     {
4111       /* Write the common to the module.  */
4112       mio_lparen ();
4113       mio_pool_string (&name);
4114
4115       mio_symbol_ref (&p->head);
4116       flags = p->saved ? 1 : 0;
4117       if (p->threadprivate)
4118         flags |= 2;
4119       mio_integer (&flags);
4120
4121       /* Write out whether the common block is bind(c) or not.  */
4122       mio_integer (&(p->is_bind_c));
4123
4124       mio_pool_string (&label);
4125       mio_rparen ();
4126
4127       /* Record that we have written this common.  */
4128       w = gfc_getmem (sizeof (struct written_common));
4129       w->name = p->name;
4130       w->label = label;
4131       gfc_insert_bbt (&written_commons, w, compare_written_commons);
4132     }
4133
4134   write_common_0 (st->right);
4135 }
4136
4137
4138 /* Write a common, by initializing the list of written commons, calling
4139    the recursive function write_common_0() and cleaning up afterwards.  */
4140
4141 static void
4142 write_common (gfc_symtree *st)
4143 {
4144   written_commons = NULL;
4145   write_common_0 (st);
4146   free_written_common (written_commons);
4147   written_commons = NULL;
4148 }
4149
4150
4151 /* Write the blank common block to the module.  */
4152
4153 static void
4154 write_blank_common (void)
4155 {
4156   const char * name = BLANK_COMMON_NAME;
4157   int saved;
4158   /* TODO: Blank commons are not bind(c).  The F2003 standard probably says
4159      this, but it hasn't been checked.  Just making it so for now.  */  
4160   int is_bind_c = 0;  
4161
4162   if (gfc_current_ns->blank_common.head == NULL)
4163     return;
4164
4165   mio_lparen ();
4166
4167   mio_pool_string (&name);
4168
4169   mio_symbol_ref (&gfc_current_ns->blank_common.head);
4170   saved = gfc_current_ns->blank_common.saved;
4171   mio_integer (&saved);
4172
4173   /* Write out whether the common block is bind(c) or not.  */
4174   mio_integer (&is_bind_c);
4175
4176   /* Write out the binding label, which is BLANK_COMMON_NAME, though
4177      it doesn't matter because the label isn't used.  */
4178   mio_pool_string (&name);
4179
4180   mio_rparen ();
4181 }
4182
4183
4184 /* Write equivalences to the module.  */
4185
4186 static void
4187 write_equiv (void)
4188 {
4189   gfc_equiv *eq, *e;
4190   int num;
4191
4192   num = 0;
4193   for (eq = gfc_current_ns->equiv; eq; eq = eq->next)
4194     {
4195       mio_lparen ();
4196
4197       for (e = eq; e; e = e->eq)
4198         {
4199           if (e->module == NULL)
4200             e->module = gfc_get_string ("%s.eq.%d", module_name, num);
4201           mio_allocated_string (e->module);
4202           mio_expr (&e->expr);
4203         }
4204
4205       num++;
4206       mio_rparen ();
4207     }
4208 }
4209
4210
4211 /* Write a symbol to the module.  */
4212
4213 static void
4214 write_symbol (int n, gfc_symbol *sym)
4215 {
4216   const char *label;
4217
4218   if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
4219     gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym->name);
4220
4221   mio_integer (&n);
4222   mio_pool_string (&sym->name);
4223
4224   mio_pool_string (&sym->module);
4225   if (sym->attr.is_bind_c || sym->attr.is_iso_c)
4226     {
4227       label = sym->binding_label;
4228       mio_pool_string (&label);
4229     }
4230   else
4231     mio_pool_string (&sym->name);
4232
4233   mio_pointer_ref (&sym->ns);
4234
4235   mio_symbol (sym);
4236   write_char ('\n');
4237 }
4238
4239
4240 /* Recursive traversal function to write the initial set of symbols to
4241    the module.  We check to see if the symbol should be written
4242    according to the access specification.  */
4243
4244 static void
4245 write_symbol0 (gfc_symtree *st)
4246 {
4247   gfc_symbol *sym;
4248   pointer_info *p;
4249   bool dont_write = false;
4250
4251   if (st == NULL)
4252     return;
4253
4254   write_symbol0 (st->left);
4255
4256   sym = st->n.sym;
4257   if (sym->module == NULL)
4258     sym->module = gfc_get_string (module_name);
4259
4260   if (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
4261       && !sym->attr.subroutine && !sym->attr.function)
4262     dont_write = true;
4263
4264   if (!gfc_check_access (sym->attr.access, sym->ns->default_access))
4265     dont_write = true;
4266
4267   if (!dont_write)
4268     {
4269       p = get_pointer (sym);
4270       if (p->type == P_UNKNOWN)
4271         p->type = P_SYMBOL;
4272
4273       if (p->u.wsym.state != WRITTEN)
4274         {
4275           write_symbol (p->integer, sym);
4276           p->u.wsym.state = WRITTEN;
4277         }
4278     }
4279
4280   write_symbol0 (st->right);
4281 }
4282
4283
4284 /* Recursive traversal function to write the secondary set of symbols
4285    to the module file.  These are symbols that were not public yet are
4286    needed by the public symbols or another dependent symbol.  The act
4287    of writing a symbol can modify the pointer_info tree, so we cease
4288    traversal if we find a symbol to write.  We return nonzero if a
4289    symbol was written and pass that information upwards.  */
4290
4291 static int
4292 write_symbol1 (pointer_info *p)
4293 {
4294   int result;
4295
4296   if (!p)
4297     return 0;
4298
4299   result = write_symbol1 (p->left);
4300
4301   if (!(p->type != P_SYMBOL || p->u.wsym.state != NEEDS_WRITE))
4302     {
4303       p->u.wsym.state = WRITTEN;
4304       write_symbol (p->integer, p->u.wsym.sym);
4305       result = 1;
4306     }
4307
4308   result |= write_symbol1 (p->right);
4309   return result;
4310 }
4311
4312
4313 /* Write operator interfaces associated with a symbol.  */
4314
4315 static void
4316 write_operator (gfc_user_op *uop)
4317 {
4318   static char nullstring[] = "";
4319   const char *p = nullstring;
4320
4321   if (uop->operator == NULL
4322       || !gfc_check_access (uop->access, uop->ns->default_access))
4323     return;
4324
4325   mio_symbol_interface (&uop->name, &p, &uop->operator);
4326 }
4327
4328
4329 /* Write generic interfaces from the namespace sym_root.  */
4330
4331 static void
4332 write_generic (gfc_symtree *st)
4333 {
4334   gfc_symbol *sym;
4335
4336   if (st == NULL)
4337     return;
4338
4339   write_generic (st->left);
4340   write_generic (st->right);
4341
4342   sym = st->n.sym;
4343   if (!sym || check_unique_name (st->name))
4344     return;
4345
4346   if (sym->generic == NULL
4347       || !gfc_check_access (sym->attr.access, sym->ns->default_access))
4348     return;
4349
4350   if (sym->module == NULL)
4351     sym->module = gfc_get_string (module_name);
4352
4353   mio_symbol_interface (&st->name, &sym->module, &sym->generic);
4354 }
4355
4356
4357 static void
4358 write_symtree (gfc_symtree *st)
4359 {
4360   gfc_symbol *sym;
4361   pointer_info *p;
4362
4363   sym = st->n.sym;
4364   if (!gfc_check_access (sym->attr.access, sym->ns->default_access)
4365       || (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
4366           && !sym->attr.subroutine && !sym->attr.function))
4367     return;
4368
4369   if (check_unique_name (st->name))
4370     return;
4371
4372   p = find_pointer (sym);
4373   if (p == NULL)
4374     gfc_internal_error ("write_symtree(): Symbol not written");
4375
4376   mio_pool_string (&st->name);
4377   mio_integer (&st->ambiguous);
4378   mio_integer (&p->integer);
4379 }
4380
4381
4382 static void
4383 write_module (void)
4384 {
4385   gfc_intrinsic_op i;
4386
4387   /* Write the operator interfaces.  */
4388   mio_lparen ();
4389
4390   for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
4391     {
4392       if (i == INTRINSIC_USER)
4393         continue;
4394
4395       mio_interface (gfc_check_access (gfc_current_ns->operator_access[i],
4396                                        gfc_current_ns->default_access)
4397                      ? &gfc_current_ns->operator[i] : NULL);
4398     }
4399
4400   mio_rparen ();
4401   write_char ('\n');
4402   write_char ('\n');
4403
4404   mio_lparen ();
4405   gfc_traverse_user_op (gfc_current_ns, write_operator);
4406   mio_rparen ();
4407   write_char ('\n');
4408   write_char ('\n');
4409
4410   mio_lparen ();
4411   write_generic (gfc_current_ns->sym_root);
4412   mio_rparen ();
4413   write_char ('\n');
4414   write_char ('\n');
4415
4416   mio_lparen ();
4417   write_blank_common ();
4418   write_common (gfc_current_ns->common_root);
4419   mio_rparen ();
4420   write_char ('\n');
4421   write_char ('\n');
4422
4423   mio_lparen ();
4424   write_equiv ();
4425   mio_rparen ();
4426   write_char ('\n');
4427   write_char ('\n');
4428
4429   /* Write symbol information.  First we traverse all symbols in the
4430      primary namespace, writing those that need to be written.
4431      Sometimes writing one symbol will cause another to need to be
4432      written.  A list of these symbols ends up on the write stack, and
4433      we end by popping the bottom of the stack and writing the symbol
4434      until the stack is empty.  */
4435
4436   mio_lparen ();
4437
4438   write_symbol0 (gfc_current_ns->sym_root);
4439   while (write_symbol1 (pi_root))
4440     /* Nothing.  */;
4441
4442   mio_rparen ();
4443
4444   write_char ('\n');
4445   write_char ('\n');
4446
4447   mio_lparen ();
4448   gfc_traverse_symtree (gfc_current_ns->sym_root, write_symtree);
4449   mio_rparen ();
4450 }
4451
4452
4453 /* Read a MD5 sum from the header of a module file.  If the file cannot
4454    be opened, or we have any other error, we return -1.  */
4455
4456 static int
4457 read_md5_from_module_file (const char * filename, unsigned char md5[16])
4458 {
4459   FILE *file;
4460   char buf[1024];
4461   int n;
4462
4463   /* Open the file.  */
4464   if ((file = fopen (filename, "r")) == NULL)
4465     return -1;
4466
4467   /* Read two lines.  */
4468   if (fgets (buf, sizeof (buf) - 1, file) == NULL
4469       || fgets (buf, sizeof (buf) - 1, file) == NULL)
4470     {
4471       fclose (file);
4472       return -1;
4473     }
4474
4475   /* Close the file.  */
4476   fclose (file);
4477
4478   /* If the header is not what we expect, or is too short, bail out.  */
4479   if (strncmp (buf, "MD5:", 4) != 0 || strlen (buf) < 4 + 16)
4480     return -1;
4481
4482   /* Now, we have a real MD5, read it into the array.  */
4483   for (n = 0; n < 16; n++)
4484     {
4485       unsigned int x;
4486
4487       if (sscanf (&(buf[4+2*n]), "%02x", &x) != 1)
4488        return -1;
4489
4490       md5[n] = x;
4491     }
4492
4493   return 0;
4494 }
4495
4496
4497 /* Given module, dump it to disk.  If there was an error while
4498    processing the module, dump_flag will be set to zero and we delete
4499    the module file, even if it was already there.  */
4500
4501 void
4502 gfc_dump_module (const char *name, int dump_flag)
4503 {
4504   int n;
4505   char *filename, *filename_tmp, *p;
4506   time_t now;
4507   fpos_t md5_pos;
4508   unsigned char md5_new[16], md5_old[16];
4509
4510   n = strlen (name) + strlen (MODULE_EXTENSION) + 1;
4511   if (gfc_option.module_dir != NULL)
4512     {
4513       n += strlen (gfc_option.module_dir);
4514       filename = (char *) alloca (n);
4515       strcpy (filename, gfc_option.module_dir);
4516       strcat (filename, name);
4517     }
4518   else
4519     {
4520       filename = (char *) alloca (n);
4521       strcpy (filename, name);
4522     }
4523   strcat (filename, MODULE_EXTENSION);
4524
4525   /* Name of the temporary file used to write the module.  */
4526   filename_tmp = (char *) alloca (n + 1);
4527   strcpy (filename_tmp, filename);
4528   strcat (filename_tmp, "0");
4529
4530   /* There was an error while processing the module.  We delete the
4531      module file, even if it was already there.  */
4532   if (!dump_flag)
4533     {
4534       unlink (filename);
4535       return;
4536     }
4537
4538   /* Write the module to the temporary file.  */
4539   module_fp = fopen (filename_tmp, "w");
4540   if (module_fp == NULL)
4541     gfc_fatal_error ("Can't open module file '%s' for writing at %C: %s",
4542                      filename_tmp, strerror (errno));
4543
4544   /* Write the header, including space reserved for the MD5 sum.  */
4545   now = time (NULL);
4546   p = ctime (&now);
4547
4548   *strchr (p, '\n') = '\0';
4549
4550   fprintf (module_fp, "GFORTRAN module created from %s on %s\nMD5:", 
4551            gfc_source_file, p);
4552   fgetpos (module_fp, &md5_pos);
4553   fputs ("00000000000000000000000000000000 -- "
4554         "If you edit this, you'll get what you deserve.\n\n", module_fp);
4555
4556   /* Initialize the MD5 context that will be used for output.  */
4557   md5_init_ctx (&ctx);
4558
4559   /* Write the module itself.  */
4560   iomode = IO_OUTPUT;
4561   strcpy (module_name, name);
4562
4563   init_pi_tree ();
4564
4565   write_module ();
4566
4567   free_pi_tree (pi_root);
4568   pi_root = NULL;
4569
4570   write_char ('\n');
4571
4572   /* Write the MD5 sum to the header of the module file.  */
4573   md5_finish_ctx (&ctx, md5_new);
4574   fsetpos (module_fp, &md5_pos);
4575   for (n = 0; n < 16; n++)
4576     fprintf (module_fp, "%02x", md5_new[n]);
4577
4578   if (fclose (module_fp))
4579     gfc_fatal_error ("Error writing module file '%s' for writing: %s",
4580                      filename_tmp, strerror (errno));
4581
4582   /* Read the MD5 from the header of the old module file and compare.  */
4583   if (read_md5_from_module_file (filename, md5_old) != 0
4584       || memcmp (md5_old, md5_new, sizeof (md5_old)) != 0)
4585     {
4586       /* Module file have changed, replace the old one.  */
4587       unlink (filename);
4588       rename (filename_tmp, filename);
4589     }
4590   else
4591     unlink (filename_tmp);
4592 }
4593
4594
4595 static void
4596 sort_iso_c_rename_list (void)
4597 {
4598   gfc_use_rename *tmp_list = NULL;
4599   gfc_use_rename *curr;
4600   gfc_use_rename *kinds_used[ISOCBINDING_NUMBER] = {NULL};
4601   int c_kind;
4602   int i;
4603
4604   for (curr = gfc_rename_list; curr; curr = curr->next)
4605     {
4606       c_kind = get_c_kind (curr->use_name, c_interop_kinds_table);
4607       if (c_kind == ISOCBINDING_INVALID || c_kind == ISOCBINDING_LAST)
4608         {
4609           gfc_error ("Symbol '%s' referenced at %L does not exist in "
4610                      "intrinsic module ISO_C_BINDING.", curr->use_name,
4611                      &curr->where);
4612         }
4613       else
4614         /* Put it in the list.  */
4615         kinds_used[c_kind] = curr;
4616     }
4617
4618   /* Make a new (sorted) rename list.  */
4619   i = 0;
4620   while (i < ISOCBINDING_NUMBER && kinds_used[i] == NULL)
4621     i++;
4622
4623   if (i < ISOCBINDING_NUMBER)
4624     {
4625       tmp_list = kinds_used[i];
4626
4627       i++;
4628       curr = tmp_list;
4629       for (; i < ISOCBINDING_NUMBER; i++)
4630         if (kinds_used[i] != NULL)
4631           {
4632             curr->next = kinds_used[i];
4633             curr = curr->next;
4634             curr->next = NULL;
4635           }
4636     }
4637
4638   gfc_rename_list = tmp_list;
4639 }
4640
4641
4642 /* Import the intrinsic ISO_C_BINDING module, generating symbols in
4643    the current namespace for all named constants, pointer types, and
4644    procedures in the module unless the only clause was used or a rename
4645    list was provided.  */
4646
4647 static void
4648 import_iso_c_binding_module (void)
4649 {
4650   gfc_symbol *mod_sym = NULL;
4651   gfc_symtree *mod_symtree = NULL;
4652   const char *iso_c_module_name = "__iso_c_binding";
4653   gfc_use_rename *u;
4654   int i;
4655   char *local_name;
4656
4657   /* Look only in the current namespace.  */
4658   mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, iso_c_module_name);
4659
4660   if (mod_symtree == NULL)
4661     {
4662       /* symtree doesn't already exist in current namespace.  */
4663       gfc_get_sym_tree (iso_c_module_name, gfc_current_ns, &mod_symtree);
4664       
4665       if (mod_symtree != NULL)
4666         mod_sym = mod_symtree->n.sym;
4667       else
4668         gfc_internal_error ("import_iso_c_binding_module(): Unable to "
4669                             "create symbol for %s", iso_c_module_name);
4670
4671       mod_sym->attr.flavor = FL_MODULE;
4672       mod_sym->attr.intrinsic = 1;
4673       mod_sym->module = gfc_get_string (iso_c_module_name);
4674       mod_sym->from_intmod = INTMOD_ISO_C_BINDING;
4675     }
4676
4677   /* Generate the symbols for the named constants representing
4678      the kinds for intrinsic data types.  */
4679   if (only_flag)
4680     {
4681       /* Sort the rename list because there are dependencies between types
4682          and procedures (e.g., c_loc needs c_ptr).  */
4683       sort_iso_c_rename_list ();
4684       
4685       for (u = gfc_rename_list; u; u = u->next)
4686         {
4687           i = get_c_kind (u->use_name, c_interop_kinds_table);
4688
4689           if (i == ISOCBINDING_INVALID || i == ISOCBINDING_LAST)
4690             {
4691               gfc_error ("Symbol '%s' referenced at %L does not exist in "
4692                          "intrinsic module ISO_C_BINDING.", u->use_name,
4693                          &u->where);
4694               continue;
4695             }
4696           
4697           generate_isocbinding_symbol (iso_c_module_name, i, u->local_name);
4698         }
4699     }
4700   else
4701     {
4702       for (i = 0; i < ISOCBINDING_NUMBER; i++)
4703         {
4704           local_name = NULL;
4705           for (u = gfc_rename_list; u; u = u->next)
4706             {
4707               if (strcmp (c_interop_kinds_table[i].name, u->use_name) == 0)
4708                 {
4709                   local_name = u->local_name;
4710                   u->found = 1;
4711                   break;
4712                 }
4713             }
4714           generate_isocbinding_symbol (iso_c_module_name, i, local_name);
4715         }
4716
4717       for (u = gfc_rename_list; u; u = u->next)
4718         {
4719           if (u->found)
4720             continue;
4721
4722           gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
4723                      "module ISO_C_BINDING", u->use_name, &u->where);
4724         }
4725     }
4726 }
4727
4728
4729 /* Add an integer named constant from a given module.  */
4730
4731 static void
4732 create_int_parameter (const char *name, int value, const char *modname,
4733                       intmod_id module, int id)
4734 {
4735   gfc_symtree *tmp_symtree;
4736   gfc_symbol *sym;
4737
4738   tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
4739   if (tmp_symtree != NULL)
4740     {
4741       if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
4742         return;
4743       else
4744         gfc_error ("Symbol '%s' already declared", name);
4745     }
4746
4747   gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree);
4748   sym = tmp_symtree->n.sym;
4749
4750   sym->module = gfc_get_string (modname);
4751   sym->attr.flavor = FL_PARAMETER;
4752   sym->ts.type = BT_INTEGER;
4753   sym->ts.kind = gfc_default_integer_kind;
4754   sym->value = gfc_int_expr (value);
4755   sym->attr.use_assoc = 1;
4756   sym->from_intmod = module;
4757   sym->intmod_sym_id = id;
4758 }
4759
4760
4761 /* USE the ISO_FORTRAN_ENV intrinsic module.  */
4762
4763 static void
4764 use_iso_fortran_env_module (void)
4765 {
4766   static char mod[] = "iso_fortran_env";
4767   const char *local_name;
4768   gfc_use_rename *u;
4769   gfc_symbol *mod_sym;
4770   gfc_symtree *mod_symtree;
4771   int i;
4772
4773   intmod_sym symbol[] = {
4774 #define NAMED_INTCST(a,b,c) { a, b, 0 },
4775 #include "iso-fortran-env.def"
4776 #undef NAMED_INTCST
4777     { ISOFORTRANENV_INVALID, NULL, -1234 } };
4778
4779   i = 0;
4780 #define NAMED_INTCST(a,b,c) symbol[i++].value = c;
4781 #include "iso-fortran-env.def"
4782 #undef NAMED_INTCST
4783
4784   /* Generate the symbol for the module itself.  */
4785   mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, mod);
4786   if (mod_symtree == NULL)
4787     {
4788       gfc_get_sym_tree (mod, gfc_current_ns, &mod_symtree);
4789       gcc_assert (mod_symtree);
4790       mod_sym = mod_symtree->n.sym;
4791
4792       mod_sym->attr.flavor = FL_MODULE;
4793       mod_sym->attr.intrinsic = 1;
4794       mod_sym->module = gfc_get_string (mod);
4795       mod_sym->from_intmod = INTMOD_ISO_FORTRAN_ENV;
4796     }
4797   else
4798     if (!mod_symtree->n.sym->attr.intrinsic)
4799       gfc_error ("Use of intrinsic module '%s' at %C conflicts with "
4800                  "non-intrinsic module name used previously", mod);
4801
4802   /* Generate the symbols for the module integer named constants.  */
4803   if (only_flag)
4804     for (u = gfc_rename_list; u; u = u->next)
4805       {
4806         for (i = 0; symbol[i].name; i++)
4807           if (strcmp (symbol[i].name, u->use_name) == 0)
4808             break;
4809
4810         if (symbol[i].name == NULL)
4811           {
4812             gfc_error ("Symbol '%s' referenced at %L does not exist in "
4813                        "intrinsic module ISO_FORTRAN_ENV", u->use_name,
4814                        &u->where);
4815             continue;
4816           }
4817
4818         if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
4819             && symbol[i].id == ISOFORTRANENV_NUMERIC_STORAGE_SIZE)
4820           gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named constant "
4821                            "from intrinsic module ISO_FORTRAN_ENV at %L is "
4822                            "incompatible with option %s", &u->where,
4823                            gfc_option.flag_default_integer
4824                              ? "-fdefault-integer-8" : "-fdefault-real-8");
4825
4826         create_int_parameter (u->local_name[0] ? u->local_name
4827                                                : symbol[i].name,
4828                               symbol[i].value, mod, INTMOD_ISO_FORTRAN_ENV,
4829                               symbol[i].id);
4830       }
4831   else
4832     {
4833       for (i = 0; symbol[i].name; i++)
4834         {
4835           local_name = NULL;
4836           for (u = gfc_rename_list; u; u = u->next)
4837             {
4838               if (strcmp (symbol[i].name, u->use_name) == 0)
4839                 {
4840                   local_name = u->local_name;
4841                   u->found = 1;
4842                   break;
4843                 }
4844             }
4845
4846           if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
4847               && symbol[i].id == ISOFORTRANENV_NUMERIC_STORAGE_SIZE)
4848             gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named constant "
4849                              "from intrinsic module ISO_FORTRAN_ENV at %C is "
4850                              "incompatible with option %s",
4851                              gfc_option.flag_default_integer
4852                                 ? "-fdefault-integer-8" : "-fdefault-real-8");
4853
4854           create_int_parameter (local_name ? local_name : symbol[i].name,
4855                                 symbol[i].value, mod, INTMOD_ISO_FORTRAN_ENV,
4856                                 symbol[i].id);
4857         }
4858
4859       for (u = gfc_rename_list; u; u = u->next)
4860         {
4861           if (u->found)
4862             continue;
4863
4864           gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
4865                      "module ISO_FORTRAN_ENV", u->use_name, &u->where);
4866         }
4867     }
4868 }
4869
4870
4871 /* Process a USE directive.  */
4872
4873 void
4874 gfc_use_module (void)
4875 {
4876   char *filename;
4877   gfc_state_data *p;
4878   int c, line, start;
4879   gfc_symtree *mod_symtree;
4880
4881   filename = (char *) alloca (strlen (module_name) + strlen (MODULE_EXTENSION)
4882                               + 1);
4883   strcpy (filename, module_name);
4884   strcat (filename, MODULE_EXTENSION);
4885
4886   /* First, try to find an non-intrinsic module, unless the USE statement
4887      specified that the module is intrinsic.  */
4888   module_fp = NULL;
4889   if (!specified_int)
4890     module_fp = gfc_open_included_file (filename, true, true);
4891
4892   /* Then, see if it's an intrinsic one, unless the USE statement
4893      specified that the module is non-intrinsic.  */
4894   if (module_fp == NULL && !specified_nonint)
4895     {
4896       if (strcmp (module_name, "iso_fortran_env") == 0
4897           && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ISO_FORTRAN_ENV "
4898                              "intrinsic module at %C") != FAILURE)
4899        {
4900          use_iso_fortran_env_module ();
4901          return;
4902        }
4903
4904       if (strcmp (module_name, "iso_c_binding") == 0
4905           && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: "
4906                              "ISO_C_BINDING module at %C") != FAILURE)
4907         {
4908           import_iso_c_binding_module();
4909           return;
4910         }
4911
4912       module_fp = gfc_open_intrinsic_module (filename);
4913
4914       if (module_fp == NULL && specified_int)
4915         gfc_fatal_error ("Can't find an intrinsic module named '%s' at %C",
4916                          module_name);
4917     }
4918
4919   if (module_fp == NULL)
4920     gfc_fatal_error ("Can't open module file '%s' for reading at %C: %s",
4921                      filename, strerror (errno));
4922
4923   /* Check that we haven't already USEd an intrinsic module with the
4924      same name.  */
4925
4926   mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, module_name);
4927   if (mod_symtree && mod_symtree->n.sym->attr.intrinsic)
4928     gfc_error ("Use of non-intrinsic module '%s' at %C conflicts with "
4929                "intrinsic module name used previously", module_name);
4930
4931   iomode = IO_INPUT;
4932   module_line = 1;
4933   module_column = 1;
4934   start = 0;
4935
4936   /* Skip the first two lines of the module, after checking that this is
4937      a gfortran module file.  */
4938   line = 0;
4939   while (line < 2)
4940     {
4941       c = module_char ();
4942       if (c == EOF)
4943         bad_module ("Unexpected end of module");
4944       if (start++ < 2)
4945         parse_name (c);
4946       if ((start == 1 && strcmp (atom_name, "GFORTRAN") != 0)
4947           || (start == 2 && strcmp (atom_name, " module") != 0))
4948         gfc_fatal_error ("File '%s' opened at %C is not a GFORTRAN module "
4949                          "file", filename);
4950
4951       if (c == '\n')
4952         line++;
4953     }
4954
4955   /* Make sure we're not reading the same module that we may be building.  */
4956   for (p = gfc_state_stack; p; p = p->previous)
4957     if (p->state == COMP_MODULE && strcmp (p->sym->name, module_name) == 0)
4958       gfc_fatal_error ("Can't USE the same module we're building!");
4959
4960   init_pi_tree ();
4961   init_true_name_tree ();
4962
4963   read_module ();
4964
4965   free_true_name (true_name_root);
4966   true_name_root = NULL;
4967
4968   free_pi_tree (pi_root);
4969   pi_root = NULL;
4970
4971   fclose (module_fp);
4972 }
4973
4974
4975 void
4976 gfc_module_init_2 (void)
4977 {
4978   last_atom = ATOM_LPAREN;
4979 }
4980
4981
4982 void
4983 gfc_module_done_2 (void)
4984 {
4985   free_rename ();
4986 }