OSDN Git Service

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