OSDN Git Service

2007-02-11 Paul Thomas <pault@gcc.gnu.org>
[pf3gnuchains/gcc-fork.git] / gcc / fortran / module.c
1 /* Handle modules, which amounts to loading and saving symbols and
2    their attendant structures.
3    Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
4    Free Software Foundation, Inc.
5    Contributed by Andy Vaught
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 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   return fp2 (pi_root, p);
394 }
395
396
397 /* Resolve any fixups using a known pointer.  */
398 static void
399 resolve_fixups (fixup_t *f, void *gp)
400 {
401   fixup_t *next;
402
403   for (; f; f = next)
404     {
405       next = f->next;
406       *(f->pointer) = gp;
407       gfc_free (f);
408     }
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
685 /* Given a name, return the name under which to load this symbol.
686    Returns NULL if this symbol shouldn't be loaded.  */
687
688 static const char *
689 find_use_name (const char *name)
690 {
691   int i = 1;
692   return find_use_name_n (name, &i);
693 }
694
695
696 /* Given a real name, return the number of use names associated with it.  */
697
698 static int
699 number_use_names (const char *name)
700 {
701   int i = 0;
702   const char *c;
703   c = find_use_name_n (name, &i);
704   return i;
705 }
706
707
708 /* Try to find the operator in the current list.  */
709
710 static gfc_use_rename *
711 find_use_operator (gfc_intrinsic_op operator)
712 {
713   gfc_use_rename *u;
714
715   for (u = gfc_rename_list; u; u = u->next)
716     if (u->operator == operator)
717       return u;
718
719   return NULL;
720 }
721
722
723 /*****************************************************************/
724
725 /* The next couple of subroutines maintain a tree used to avoid a
726    brute-force search for a combination of true name and module name.
727    While symtree names, the name that a particular symbol is known by
728    can changed with USE statements, we still have to keep track of the
729    true names to generate the correct reference, and also avoid
730    loading the same real symbol twice in a program unit.
731
732    When we start reading, the true name tree is built and maintained
733    as symbols are read.  The tree is searched as we load new symbols
734    to see if it already exists someplace in the namespace.  */
735
736 typedef struct true_name
737 {
738   BBT_HEADER (true_name);
739   gfc_symbol *sym;
740 }
741 true_name;
742
743 static true_name *true_name_root;
744
745
746 /* Compare two true_name structures.  */
747
748 static int
749 compare_true_names (void *_t1, void *_t2)
750 {
751   true_name *t1, *t2;
752   int c;
753
754   t1 = (true_name *) _t1;
755   t2 = (true_name *) _t2;
756
757   c = ((t1->sym->module > t2->sym->module)
758        - (t1->sym->module < t2->sym->module));
759   if (c != 0)
760     return c;
761
762   return strcmp (t1->sym->name, t2->sym->name);
763 }
764
765
766 /* Given a true name, search the true name tree to see if it exists
767    within the main namespace.  */
768
769 static gfc_symbol *
770 find_true_name (const char *name, const char *module)
771 {
772   true_name t, *p;
773   gfc_symbol sym;
774   int c;
775
776   sym.name = gfc_get_string (name);
777   if (module != NULL)
778     sym.module = gfc_get_string (module);
779   else
780     sym.module = NULL;
781   t.sym = &sym;
782
783   p = true_name_root;
784   while (p != NULL)
785     {
786       c = compare_true_names ((void *) (&t), (void *) p);
787       if (c == 0)
788         return p->sym;
789
790       p = (c < 0) ? p->left : p->right;
791     }
792
793   return NULL;
794 }
795
796
797 /* Given a gfc_symbol pointer that is not in the true name tree, add 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   if (st == NULL)
818     return;
819
820   build_tnt (st->left);
821   build_tnt (st->right);
822
823   if (find_true_name (st->n.sym->name, st->n.sym->module) != NULL)
824     return;
825
826   add_true_name (st->n.sym);
827 }
828
829
830 /* Initialize the true name tree with the current namespace.  */
831
832 static void
833 init_true_name_tree (void)
834 {
835   true_name_root = NULL;
836   build_tnt (gfc_current_ns->sym_root);
837 }
838
839
840 /* Recursively free a true name tree node.  */
841
842 static void
843 free_true_name (true_name *t)
844 {
845   if (t == NULL)
846     return;
847   free_true_name (t->left);
848   free_true_name (t->right);
849
850   gfc_free (t);
851 }
852
853
854 /*****************************************************************/
855
856 /* Module reading and writing.  */
857
858 typedef enum
859 {
860   ATOM_NAME, ATOM_LPAREN, ATOM_RPAREN, ATOM_INTEGER, ATOM_STRING
861 }
862 atom_type;
863
864 static atom_type last_atom;
865
866
867 /* The name buffer must be at least as long as a symbol name.  Right
868    now it's not clear how we're going to store numeric constants--
869    probably as a hexadecimal string, since this will allow the exact
870    number to be preserved (this can't be done by a decimal
871    representation).  Worry about that later.  TODO!  */
872
873 #define MAX_ATOM_SIZE 100
874
875 static int atom_int;
876 static char *atom_string, atom_name[MAX_ATOM_SIZE];
877
878
879 /* Report problems with a module.  Error reporting is not very
880    elaborate, since this sorts of errors shouldn't really happen.
881    This subroutine never returns.  */
882
883 static void bad_module (const char *) ATTRIBUTE_NORETURN;
884
885 static void
886 bad_module (const char *msgid)
887 {
888   fclose (module_fp);
889
890   switch (iomode)
891     {
892     case IO_INPUT:
893       gfc_fatal_error ("Reading module %s at line %d column %d: %s",
894                        module_name, module_line, module_column, msgid);
895       break;
896     case IO_OUTPUT:
897       gfc_fatal_error ("Writing module %s at line %d column %d: %s",
898                        module_name, module_line, module_column, msgid);
899       break;
900     default:
901       gfc_fatal_error ("Module %s at line %d column %d: %s",
902                        module_name, module_line, module_column, msgid);
903       break;
904     }
905 }
906
907
908 /* Set the module's input pointer.  */
909
910 static void
911 set_module_locus (module_locus *m)
912 {
913   module_column = m->column;
914   module_line = m->line;
915   fsetpos (module_fp, &m->pos);
916 }
917
918
919 /* Get the module's input pointer so that we can restore it later.  */
920
921 static void
922 get_module_locus (module_locus *m)
923 {
924   m->column = module_column;
925   m->line = module_line;
926   fgetpos (module_fp, &m->pos);
927 }
928
929
930 /* Get the next character in the module, updating our reckoning of
931    where we are.  */
932
933 static int
934 module_char (void)
935 {
936   int c;
937
938   c = fgetc (module_fp);
939
940   if (c == EOF)
941     bad_module ("Unexpected EOF");
942
943   if (c == '\n')
944     {
945       module_line++;
946       module_column = 0;
947     }
948
949   module_column++;
950   return c;
951 }
952
953
954 /* Parse a string constant.  The delimiter is guaranteed to be a
955    single quote.  */
956
957 static void
958 parse_string (void)
959 {
960   module_locus start;
961   int len, c;
962   char *p;
963
964   get_module_locus (&start);
965
966   len = 0;
967
968   /* See how long the string is */
969   for ( ; ; )
970     {
971       c = module_char ();
972       if (c == EOF)
973         bad_module ("Unexpected end of module in string constant");
974
975       if (c != '\'')
976         {
977           len++;
978           continue;
979         }
980
981       c = module_char ();
982       if (c == '\'')
983         {
984           len++;
985           continue;
986         }
987
988       break;
989     }
990
991   set_module_locus (&start);
992
993   atom_string = p = gfc_getmem (len + 1);
994
995   for (; len > 0; len--)
996     {
997       c = module_char ();
998       if (c == '\'')
999         module_char ();         /* Guaranteed to be another \'  */
1000       *p++ = c;
1001     }
1002
1003   module_char ();               /* Terminating \'  */
1004   *p = '\0';                    /* C-style string for debug purposes.  */
1005 }
1006
1007
1008 /* Parse a small integer.  */
1009
1010 static void
1011 parse_integer (int c)
1012 {
1013   module_locus m;
1014
1015   atom_int = c - '0';
1016
1017   for (;;)
1018     {
1019       get_module_locus (&m);
1020
1021       c = module_char ();
1022       if (!ISDIGIT (c))
1023         break;
1024
1025       atom_int = 10 * atom_int + c - '0';
1026       if (atom_int > 99999999)
1027         bad_module ("Integer overflow");
1028     }
1029
1030   set_module_locus (&m);
1031 }
1032
1033
1034 /* Parse a name.  */
1035
1036 static void
1037 parse_name (int c)
1038 {
1039   module_locus m;
1040   char *p;
1041   int len;
1042
1043   p = atom_name;
1044
1045   *p++ = c;
1046   len = 1;
1047
1048   get_module_locus (&m);
1049
1050   for (;;)
1051     {
1052       c = module_char ();
1053       if (!ISALNUM (c) && c != '_' && c != '-')
1054         break;
1055
1056       *p++ = c;
1057       if (++len > GFC_MAX_SYMBOL_LEN)
1058         bad_module ("Name too long");
1059     }
1060
1061   *p = '\0';
1062
1063   fseek (module_fp, -1, SEEK_CUR);
1064   module_column = m.column + len - 1;
1065
1066   if (c == '\n')
1067     module_line--;
1068 }
1069
1070
1071 /* Read the next atom in the module's input stream.  */
1072
1073 static atom_type
1074 parse_atom (void)
1075 {
1076   int c;
1077
1078   do
1079     {
1080       c = module_char ();
1081     }
1082   while (c == ' ' || c == '\n');
1083
1084   switch (c)
1085     {
1086     case '(':
1087       return ATOM_LPAREN;
1088
1089     case ')':
1090       return ATOM_RPAREN;
1091
1092     case '\'':
1093       parse_string ();
1094       return ATOM_STRING;
1095
1096     case '0':
1097     case '1':
1098     case '2':
1099     case '3':
1100     case '4':
1101     case '5':
1102     case '6':
1103     case '7':
1104     case '8':
1105     case '9':
1106       parse_integer (c);
1107       return ATOM_INTEGER;
1108
1109     case 'a':
1110     case 'b':
1111     case 'c':
1112     case 'd':
1113     case 'e':
1114     case 'f':
1115     case 'g':
1116     case 'h':
1117     case 'i':
1118     case 'j':
1119     case 'k':
1120     case 'l':
1121     case 'm':
1122     case 'n':
1123     case 'o':
1124     case 'p':
1125     case 'q':
1126     case 'r':
1127     case 's':
1128     case 't':
1129     case 'u':
1130     case 'v':
1131     case 'w':
1132     case 'x':
1133     case 'y':
1134     case 'z':
1135     case 'A':
1136     case 'B':
1137     case 'C':
1138     case 'D':
1139     case 'E':
1140     case 'F':
1141     case 'G':
1142     case 'H':
1143     case 'I':
1144     case 'J':
1145     case 'K':
1146     case 'L':
1147     case 'M':
1148     case 'N':
1149     case 'O':
1150     case 'P':
1151     case 'Q':
1152     case 'R':
1153     case 'S':
1154     case 'T':
1155     case 'U':
1156     case 'V':
1157     case 'W':
1158     case 'X':
1159     case 'Y':
1160     case 'Z':
1161       parse_name (c);
1162       return ATOM_NAME;
1163
1164     default:
1165       bad_module ("Bad name");
1166     }
1167
1168   /* Not reached */
1169 }
1170
1171
1172 /* Peek at the next atom on the input.  */
1173
1174 static atom_type
1175 peek_atom (void)
1176 {
1177   module_locus m;
1178   atom_type a;
1179
1180   get_module_locus (&m);
1181
1182   a = parse_atom ();
1183   if (a == ATOM_STRING)
1184     gfc_free (atom_string);
1185
1186   set_module_locus (&m);
1187   return a;
1188 }
1189
1190
1191 /* Read the next atom from the input, requiring that it be a
1192    particular kind.  */
1193
1194 static void
1195 require_atom (atom_type type)
1196 {
1197   module_locus m;
1198   atom_type t;
1199   const char *p;
1200
1201   get_module_locus (&m);
1202
1203   t = parse_atom ();
1204   if (t != type)
1205     {
1206       switch (type)
1207         {
1208         case ATOM_NAME:
1209           p = _("Expected name");
1210           break;
1211         case ATOM_LPAREN:
1212           p = _("Expected left parenthesis");
1213           break;
1214         case ATOM_RPAREN:
1215           p = _("Expected right parenthesis");
1216           break;
1217         case ATOM_INTEGER:
1218           p = _("Expected integer");
1219           break;
1220         case ATOM_STRING:
1221           p = _("Expected string");
1222           break;
1223         default:
1224           gfc_internal_error ("require_atom(): bad atom type required");
1225         }
1226
1227       set_module_locus (&m);
1228       bad_module (p);
1229     }
1230 }
1231
1232
1233 /* Given a pointer to an mstring array, require that the current input
1234    be one of the strings in the array.  We return the enum value.  */
1235
1236 static int
1237 find_enum (const mstring *m)
1238 {
1239   int i;
1240
1241   i = gfc_string2code (m, atom_name);
1242   if (i >= 0)
1243     return i;
1244
1245   bad_module ("find_enum(): Enum not found");
1246
1247   /* Not reached */
1248 }
1249
1250
1251 /**************** Module output subroutines ***************************/
1252
1253 /* Output a character to a module file.  */
1254
1255 static void
1256 write_char (char out)
1257 {
1258   if (fputc (out, module_fp) == EOF)
1259     gfc_fatal_error ("Error writing modules file: %s", strerror (errno));
1260
1261   if (out != '\n')
1262     module_column++;
1263   else
1264     {
1265       module_column = 1;
1266       module_line++;
1267     }
1268 }
1269
1270
1271 /* Write an atom to a module.  The line wrapping isn't perfect, but it
1272    should work most of the time.  This isn't that big of a deal, since
1273    the file really isn't meant to be read by people anyway.  */
1274
1275 static void
1276 write_atom (atom_type atom, const void *v)
1277 {
1278   char buffer[20];
1279   int i, len;
1280   const char *p;
1281
1282   switch (atom)
1283     {
1284     case ATOM_STRING:
1285     case ATOM_NAME:
1286       p = v;
1287       break;
1288
1289     case ATOM_LPAREN:
1290       p = "(";
1291       break;
1292
1293     case ATOM_RPAREN:
1294       p = ")";
1295       break;
1296
1297     case ATOM_INTEGER:
1298       i = *((const int *) v);
1299       if (i < 0)
1300         gfc_internal_error ("write_atom(): Writing negative integer");
1301
1302       sprintf (buffer, "%d", i);
1303       p = buffer;
1304       break;
1305
1306     default:
1307       gfc_internal_error ("write_atom(): Trying to write dab atom");
1308
1309     }
1310
1311   len = strlen (p);
1312
1313   if (atom != ATOM_RPAREN)
1314     {
1315       if (module_column + len > 72)
1316         write_char ('\n');
1317       else
1318         {
1319
1320           if (last_atom != ATOM_LPAREN && module_column != 1)
1321             write_char (' ');
1322         }
1323     }
1324
1325   if (atom == ATOM_STRING)
1326     write_char ('\'');
1327
1328   while (*p)
1329     {
1330       if (atom == ATOM_STRING && *p == '\'')
1331         write_char ('\'');
1332       write_char (*p++);
1333     }
1334
1335   if (atom == ATOM_STRING)
1336     write_char ('\'');
1337
1338   last_atom = atom;
1339 }
1340
1341
1342
1343 /***************** Mid-level I/O subroutines *****************/
1344
1345 /* These subroutines let their caller read or write atoms without
1346    caring about which of the two is actually happening.  This lets a
1347    subroutine concentrate on the actual format of the data being
1348    written.  */
1349
1350 static void mio_expr (gfc_expr **);
1351 static void mio_symbol_ref (gfc_symbol **);
1352 static void mio_symtree_ref (gfc_symtree **);
1353
1354 /* Read or write an enumerated value.  On writing, we return the input
1355    value for the convenience of callers.  We avoid using an integer
1356    pointer because enums are sometimes inside bitfields.  */
1357
1358 static int
1359 mio_name (int t, const mstring *m)
1360 {
1361   if (iomode == IO_OUTPUT)
1362     write_atom (ATOM_NAME, gfc_code2string (m, t));
1363   else
1364     {
1365       require_atom (ATOM_NAME);
1366       t = find_enum (m);
1367     }
1368
1369   return t;
1370 }
1371
1372 /* Specialization of mio_name.  */
1373
1374 #define DECL_MIO_NAME(TYPE) \
1375  static inline TYPE \
1376  MIO_NAME(TYPE) (TYPE t, const mstring *m) \
1377  { \
1378    return (TYPE) mio_name ((int) t, m); \
1379  }
1380 #define MIO_NAME(TYPE) mio_name_##TYPE
1381
1382 static void
1383 mio_lparen (void)
1384 {
1385   if (iomode == IO_OUTPUT)
1386     write_atom (ATOM_LPAREN, NULL);
1387   else
1388     require_atom (ATOM_LPAREN);
1389 }
1390
1391
1392 static void
1393 mio_rparen (void)
1394 {
1395   if (iomode == IO_OUTPUT)
1396     write_atom (ATOM_RPAREN, NULL);
1397   else
1398     require_atom (ATOM_RPAREN);
1399 }
1400
1401
1402 static void
1403 mio_integer (int *ip)
1404 {
1405   if (iomode == IO_OUTPUT)
1406     write_atom (ATOM_INTEGER, ip);
1407   else
1408     {
1409       require_atom (ATOM_INTEGER);
1410       *ip = atom_int;
1411     }
1412 }
1413
1414
1415 /* Read or write a character pointer that points to a string on the
1416    heap.  */
1417
1418 static const char *
1419 mio_allocated_string (const char *s)
1420 {
1421   if (iomode == IO_OUTPUT)
1422     {
1423       write_atom (ATOM_STRING, s);
1424       return s;
1425     }
1426   else
1427     {
1428       require_atom (ATOM_STRING);
1429       return atom_string;
1430     }
1431 }
1432
1433
1434 /* Read or write a string that is in static memory.  */
1435
1436 static void
1437 mio_pool_string (const char **stringp)
1438 {
1439   /* TODO: one could write the string only once, and refer to it via a
1440      fixup pointer.  */
1441
1442   /* As a special case we have to deal with a NULL string.  This
1443      happens for the 'module' member of 'gfc_symbol's that are not in a
1444      module.  We read / write these as the empty string.  */
1445   if (iomode == IO_OUTPUT)
1446     {
1447       const char *p = *stringp == NULL ? "" : *stringp;
1448       write_atom (ATOM_STRING, p);
1449     }
1450   else
1451     {
1452       require_atom (ATOM_STRING);
1453       *stringp = atom_string[0] == '\0' ? NULL : gfc_get_string (atom_string);
1454       gfc_free (atom_string);
1455     }
1456 }
1457
1458
1459 /* Read or write a string that is inside of some already-allocated
1460    structure.  */
1461
1462 static void
1463 mio_internal_string (char *string)
1464 {
1465   if (iomode == IO_OUTPUT)
1466     write_atom (ATOM_STRING, string);
1467   else
1468     {
1469       require_atom (ATOM_STRING);
1470       strcpy (string, atom_string);
1471       gfc_free (atom_string);
1472     }
1473 }
1474
1475
1476
1477 typedef enum
1478 { AB_ALLOCATABLE, AB_DIMENSION, AB_EXTERNAL, AB_INTRINSIC, AB_OPTIONAL,
1479   AB_POINTER, AB_SAVE, AB_TARGET, AB_DUMMY, AB_RESULT, AB_DATA,
1480   AB_IN_NAMELIST, AB_IN_COMMON, AB_FUNCTION, AB_SUBROUTINE, AB_SEQUENCE,
1481   AB_ELEMENTAL, AB_PURE, AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT,
1482   AB_CRAY_POINTER, AB_CRAY_POINTEE, AB_THREADPRIVATE, AB_ALLOC_COMP,
1483   AB_VALUE, AB_VOLATILE, AB_PROTECTED
1484 }
1485 ab_attribute;
1486
1487 static const mstring attr_bits[] =
1488 {
1489     minit ("ALLOCATABLE", AB_ALLOCATABLE),
1490     minit ("DIMENSION", AB_DIMENSION),
1491     minit ("EXTERNAL", AB_EXTERNAL),
1492     minit ("INTRINSIC", AB_INTRINSIC),
1493     minit ("OPTIONAL", AB_OPTIONAL),
1494     minit ("POINTER", AB_POINTER),
1495     minit ("SAVE", AB_SAVE),
1496     minit ("VALUE", AB_VALUE),
1497     minit ("VOLATILE", AB_VOLATILE),
1498     minit ("TARGET", AB_TARGET),
1499     minit ("THREADPRIVATE", AB_THREADPRIVATE),
1500     minit ("DUMMY", AB_DUMMY),
1501     minit ("RESULT", AB_RESULT),
1502     minit ("DATA", AB_DATA),
1503     minit ("IN_NAMELIST", AB_IN_NAMELIST),
1504     minit ("IN_COMMON", AB_IN_COMMON),
1505     minit ("FUNCTION", AB_FUNCTION),
1506     minit ("SUBROUTINE", AB_SUBROUTINE),
1507     minit ("SEQUENCE", AB_SEQUENCE),
1508     minit ("ELEMENTAL", AB_ELEMENTAL),
1509     minit ("PURE", AB_PURE),
1510     minit ("RECURSIVE", AB_RECURSIVE),
1511     minit ("GENERIC", AB_GENERIC),
1512     minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
1513     minit ("CRAY_POINTER", AB_CRAY_POINTER),
1514     minit ("CRAY_POINTEE", AB_CRAY_POINTEE),
1515     minit ("ALLOC_COMP", AB_ALLOC_COMP),
1516     minit ("PROTECTED", AB_PROTECTED),
1517     minit (NULL, -1)
1518 };
1519
1520 /* Specialization of mio_name.  */
1521 DECL_MIO_NAME (ab_attribute)
1522 DECL_MIO_NAME (ar_type)
1523 DECL_MIO_NAME (array_type)
1524 DECL_MIO_NAME (bt)
1525 DECL_MIO_NAME (expr_t)
1526 DECL_MIO_NAME (gfc_access)
1527 DECL_MIO_NAME (gfc_intrinsic_op)
1528 DECL_MIO_NAME (ifsrc)
1529 DECL_MIO_NAME (procedure_type)
1530 DECL_MIO_NAME (ref_type)
1531 DECL_MIO_NAME (sym_flavor)
1532 DECL_MIO_NAME (sym_intent)
1533 #undef DECL_MIO_NAME
1534
1535 /* Symbol attributes are stored in list with the first three elements
1536    being the enumerated fields, while the remaining elements (if any)
1537    indicate the individual attribute bits.  The access field is not
1538    saved-- it controls what symbols are exported when a module is
1539    written.  */
1540
1541 static void
1542 mio_symbol_attribute (symbol_attribute *attr)
1543 {
1544   atom_type t;
1545
1546   mio_lparen ();
1547
1548   attr->flavor = MIO_NAME (sym_flavor) (attr->flavor, flavors);
1549   attr->intent = MIO_NAME (sym_intent) (attr->intent, intents);
1550   attr->proc = MIO_NAME (procedure_type) (attr->proc, procedures);
1551   attr->if_source = MIO_NAME (ifsrc) (attr->if_source, ifsrc_types);
1552
1553   if (iomode == IO_OUTPUT)
1554     {
1555       if (attr->allocatable)
1556         MIO_NAME (ab_attribute) (AB_ALLOCATABLE, attr_bits);
1557       if (attr->dimension)
1558         MIO_NAME (ab_attribute) (AB_DIMENSION, attr_bits);
1559       if (attr->external)
1560         MIO_NAME (ab_attribute) (AB_EXTERNAL, attr_bits);
1561       if (attr->intrinsic)
1562         MIO_NAME (ab_attribute) (AB_INTRINSIC, attr_bits);
1563       if (attr->optional)
1564         MIO_NAME (ab_attribute) (AB_OPTIONAL, attr_bits);
1565       if (attr->pointer)
1566         MIO_NAME (ab_attribute) (AB_POINTER, attr_bits);
1567       if (attr->protected)
1568         MIO_NAME (ab_attribute) (AB_PROTECTED, attr_bits);
1569       if (attr->save)
1570         MIO_NAME (ab_attribute) (AB_SAVE, attr_bits);
1571       if (attr->value)
1572         MIO_NAME (ab_attribute) (AB_VALUE, attr_bits);
1573       if (attr->volatile_)
1574         MIO_NAME (ab_attribute) (AB_VOLATILE, attr_bits);
1575       if (attr->target)
1576         MIO_NAME (ab_attribute) (AB_TARGET, attr_bits);
1577       if (attr->threadprivate)
1578         MIO_NAME (ab_attribute) (AB_THREADPRIVATE, attr_bits);
1579       if (attr->dummy)
1580         MIO_NAME (ab_attribute) (AB_DUMMY, attr_bits);
1581       if (attr->result)
1582         MIO_NAME (ab_attribute) (AB_RESULT, attr_bits);
1583       /* We deliberately don't preserve the "entry" flag.  */
1584
1585       if (attr->data)
1586         MIO_NAME (ab_attribute) (AB_DATA, attr_bits);
1587       if (attr->in_namelist)
1588         MIO_NAME (ab_attribute) (AB_IN_NAMELIST, attr_bits);
1589       if (attr->in_common)
1590         MIO_NAME (ab_attribute) (AB_IN_COMMON, attr_bits);
1591
1592       if (attr->function)
1593         MIO_NAME (ab_attribute) (AB_FUNCTION, attr_bits);
1594       if (attr->subroutine)
1595         MIO_NAME (ab_attribute) (AB_SUBROUTINE, attr_bits);
1596       if (attr->generic)
1597         MIO_NAME (ab_attribute) (AB_GENERIC, attr_bits);
1598
1599       if (attr->sequence)
1600         MIO_NAME (ab_attribute) (AB_SEQUENCE, attr_bits);
1601       if (attr->elemental)
1602         MIO_NAME (ab_attribute) (AB_ELEMENTAL, attr_bits);
1603       if (attr->pure)
1604         MIO_NAME (ab_attribute) (AB_PURE, attr_bits);
1605       if (attr->recursive)
1606         MIO_NAME (ab_attribute) (AB_RECURSIVE, attr_bits);
1607       if (attr->always_explicit)
1608         MIO_NAME (ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits);
1609       if (attr->cray_pointer)
1610         MIO_NAME (ab_attribute) (AB_CRAY_POINTER, attr_bits);
1611       if (attr->cray_pointee)
1612         MIO_NAME (ab_attribute) (AB_CRAY_POINTEE, attr_bits);
1613       if (attr->alloc_comp)
1614         MIO_NAME (ab_attribute) (AB_ALLOC_COMP, attr_bits);
1615
1616       mio_rparen ();
1617
1618     }
1619   else
1620     {
1621       for (;;)
1622         {
1623           t = parse_atom ();
1624           if (t == ATOM_RPAREN)
1625             break;
1626           if (t != ATOM_NAME)
1627             bad_module ("Expected attribute bit name");
1628
1629           switch ((ab_attribute) find_enum (attr_bits))
1630             {
1631             case AB_ALLOCATABLE:
1632               attr->allocatable = 1;
1633               break;
1634             case AB_DIMENSION:
1635               attr->dimension = 1;
1636               break;
1637             case AB_EXTERNAL:
1638               attr->external = 1;
1639               break;
1640             case AB_INTRINSIC:
1641               attr->intrinsic = 1;
1642               break;
1643             case AB_OPTIONAL:
1644               attr->optional = 1;
1645               break;
1646             case AB_POINTER:
1647               attr->pointer = 1;
1648               break;
1649             case AB_PROTECTED:
1650               attr->protected = 1;
1651               break;
1652             case AB_SAVE:
1653               attr->save = 1;
1654               break;
1655             case AB_VALUE:
1656               attr->value = 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       if (peek_atom () != ATOM_RPAREN)
1750         {
1751           cl = gfc_get_charlen ();
1752           mio_expr (&cl->length);
1753
1754           *clp = cl;
1755
1756           cl->next = gfc_current_ns->cl_list;
1757           gfc_current_ns->cl_list = cl;
1758         }
1759     }
1760
1761   mio_rparen ();
1762 }
1763
1764
1765 /* Return a symtree node with a name that is guaranteed to be unique
1766    within the namespace and corresponds to an illegal fortran name.  */
1767
1768 static gfc_symtree *
1769 get_unique_symtree (gfc_namespace *ns)
1770 {
1771   char name[GFC_MAX_SYMBOL_LEN + 1];
1772   static int serial = 0;
1773
1774   sprintf (name, "@%d", serial++);
1775   return gfc_new_symtree (&ns->sym_root, name);
1776 }
1777
1778
1779 /* See if a name is a generated name.  */
1780
1781 static int
1782 check_unique_name (const char *name)
1783 {
1784   return *name == '@';
1785 }
1786
1787
1788 static void
1789 mio_typespec (gfc_typespec *ts)
1790 {
1791   mio_lparen ();
1792
1793   ts->type = MIO_NAME (bt) (ts->type, bt_types);
1794
1795   if (ts->type != BT_DERIVED)
1796     mio_integer (&ts->kind);
1797   else
1798     mio_symbol_ref (&ts->derived);
1799
1800   mio_charlen (&ts->cl);
1801
1802   mio_rparen ();
1803 }
1804
1805
1806 static const mstring array_spec_types[] = {
1807     minit ("EXPLICIT", AS_EXPLICIT),
1808     minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE),
1809     minit ("DEFERRED", AS_DEFERRED),
1810     minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE),
1811     minit (NULL, -1)
1812 };
1813
1814
1815 static void
1816 mio_array_spec (gfc_array_spec **asp)
1817 {
1818   gfc_array_spec *as;
1819   int i;
1820
1821   mio_lparen ();
1822
1823   if (iomode == IO_OUTPUT)
1824     {
1825       if (*asp == NULL)
1826         goto done;
1827       as = *asp;
1828     }
1829   else
1830     {
1831       if (peek_atom () == ATOM_RPAREN)
1832         {
1833           *asp = NULL;
1834           goto done;
1835         }
1836
1837       *asp = as = gfc_get_array_spec ();
1838     }
1839
1840   mio_integer (&as->rank);
1841   as->type = MIO_NAME (array_type) (as->type, array_spec_types);
1842
1843   for (i = 0; i < as->rank; i++)
1844     {
1845       mio_expr (&as->lower[i]);
1846       mio_expr (&as->upper[i]);
1847     }
1848
1849 done:
1850   mio_rparen ();
1851 }
1852
1853
1854 /* Given a pointer to an array reference structure (which lives in a
1855    gfc_ref structure), find the corresponding array specification
1856    structure.  Storing the pointer in the ref structure doesn't quite
1857    work when loading from a module. Generating code for an array
1858    reference also needs more information than just the array spec.  */
1859
1860 static const mstring array_ref_types[] = {
1861     minit ("FULL", AR_FULL),
1862     minit ("ELEMENT", AR_ELEMENT),
1863     minit ("SECTION", AR_SECTION),
1864     minit (NULL, -1)
1865 };
1866
1867
1868 static void
1869 mio_array_ref (gfc_array_ref *ar)
1870 {
1871   int i;
1872
1873   mio_lparen ();
1874   ar->type = MIO_NAME (ar_type) (ar->type, array_ref_types);
1875   mio_integer (&ar->dimen);
1876
1877   switch (ar->type)
1878     {
1879     case AR_FULL:
1880       break;
1881
1882     case AR_ELEMENT:
1883       for (i = 0; i < ar->dimen; i++)
1884         mio_expr (&ar->start[i]);
1885
1886       break;
1887
1888     case AR_SECTION:
1889       for (i = 0; i < ar->dimen; i++)
1890         {
1891           mio_expr (&ar->start[i]);
1892           mio_expr (&ar->end[i]);
1893           mio_expr (&ar->stride[i]);
1894         }
1895
1896       break;
1897
1898     case AR_UNKNOWN:
1899       gfc_internal_error ("mio_array_ref(): Unknown array ref");
1900     }
1901
1902   /* Unfortunately, ar->dimen_type is an anonymous enumerated type so
1903      we can't call mio_integer directly.  Instead loop over each element
1904      and cast it to/from an integer.  */
1905   if (iomode == IO_OUTPUT)
1906     {
1907       for (i = 0; i < ar->dimen; i++)
1908         {
1909           int tmp = (int)ar->dimen_type[i];
1910           write_atom (ATOM_INTEGER, &tmp);
1911         }
1912     }
1913   else
1914     {
1915       for (i = 0; i < ar->dimen; i++)
1916         {
1917           require_atom (ATOM_INTEGER);
1918           ar->dimen_type[i] = atom_int;
1919         }
1920     }
1921
1922   if (iomode == IO_INPUT)
1923     {
1924       ar->where = gfc_current_locus;
1925
1926       for (i = 0; i < ar->dimen; i++)
1927         ar->c_where[i] = gfc_current_locus;
1928     }
1929
1930   mio_rparen ();
1931 }
1932
1933
1934 /* Saves or restores a pointer.  The pointer is converted back and
1935    forth from an integer.  We return the pointer_info pointer so that
1936    the caller can take additional action based on the pointer type.  */
1937
1938 static pointer_info *
1939 mio_pointer_ref (void *gp)
1940 {
1941   pointer_info *p;
1942
1943   if (iomode == IO_OUTPUT)
1944     {
1945       p = get_pointer (*((char **) gp));
1946       write_atom (ATOM_INTEGER, &p->integer);
1947     }
1948   else
1949     {
1950       require_atom (ATOM_INTEGER);
1951       p = add_fixup (atom_int, gp);
1952     }
1953
1954   return p;
1955 }
1956
1957
1958 /* Save and load references to components that occur within
1959    expressions.  We have to describe these references by a number and
1960    by name.  The number is necessary for forward references during
1961    reading, and the name is necessary if the symbol already exists in
1962    the namespace and is not loaded again.  */
1963
1964 static void
1965 mio_component_ref (gfc_component **cp, gfc_symbol *sym)
1966 {
1967   char name[GFC_MAX_SYMBOL_LEN + 1];
1968   gfc_component *q;
1969   pointer_info *p;
1970
1971   p = mio_pointer_ref (cp);
1972   if (p->type == P_UNKNOWN)
1973     p->type = P_COMPONENT;
1974
1975   if (iomode == IO_OUTPUT)
1976     mio_pool_string (&(*cp)->name);
1977   else
1978     {
1979       mio_internal_string (name);
1980
1981       /* It can happen that a component reference can be read before the
1982          associated derived type symbol has been loaded. Return now and
1983          wait for a later iteration of load_needed.  */
1984       if (sym == NULL)
1985         return;
1986
1987       if (sym->components != NULL && p->u.pointer == NULL)
1988         {
1989           /* Symbol already loaded, so search by name.  */
1990           for (q = sym->components; q; q = q->next)
1991             if (strcmp (q->name, name) == 0)
1992               break;
1993
1994           if (q == NULL)
1995             gfc_internal_error ("mio_component_ref(): Component not found");
1996
1997           associate_integer_pointer (p, q);
1998         }
1999
2000       /* Make sure this symbol will eventually be loaded.  */
2001       p = find_pointer2 (sym);
2002       if (p->u.rsym.state == UNUSED)
2003         p->u.rsym.state = NEEDED;
2004     }
2005 }
2006
2007
2008 static void
2009 mio_component (gfc_component *c)
2010 {
2011   pointer_info *p;
2012   int n;
2013
2014   mio_lparen ();
2015
2016   if (iomode == IO_OUTPUT)
2017     {
2018       p = get_pointer (c);
2019       mio_integer (&p->integer);
2020     }
2021   else
2022     {
2023       mio_integer (&n);
2024       p = get_integer (n);
2025       associate_integer_pointer (p, c);
2026     }
2027
2028   if (p->type == P_UNKNOWN)
2029     p->type = P_COMPONENT;
2030
2031   mio_pool_string (&c->name);
2032   mio_typespec (&c->ts);
2033   mio_array_spec (&c->as);
2034
2035   mio_integer (&c->dimension);
2036   mio_integer (&c->pointer);
2037   mio_integer (&c->allocatable);
2038
2039   mio_expr (&c->initializer);
2040   mio_rparen ();
2041 }
2042
2043
2044 static void
2045 mio_component_list (gfc_component **cp)
2046 {
2047   gfc_component *c, *tail;
2048
2049   mio_lparen ();
2050
2051   if (iomode == IO_OUTPUT)
2052     {
2053       for (c = *cp; c; c = c->next)
2054         mio_component (c);
2055     }
2056   else
2057     {
2058       *cp = NULL;
2059       tail = NULL;
2060
2061       for (;;)
2062         {
2063           if (peek_atom () == ATOM_RPAREN)
2064             break;
2065
2066           c = gfc_get_component ();
2067           mio_component (c);
2068
2069           if (tail == NULL)
2070             *cp = c;
2071           else
2072             tail->next = c;
2073
2074           tail = c;
2075         }
2076     }
2077
2078   mio_rparen ();
2079 }
2080
2081
2082 static void
2083 mio_actual_arg (gfc_actual_arglist *a)
2084 {
2085   mio_lparen ();
2086   mio_pool_string (&a->name);
2087   mio_expr (&a->expr);
2088   mio_rparen ();
2089 }
2090
2091
2092 static void
2093 mio_actual_arglist (gfc_actual_arglist **ap)
2094 {
2095   gfc_actual_arglist *a, *tail;
2096
2097   mio_lparen ();
2098
2099   if (iomode == IO_OUTPUT)
2100     {
2101       for (a = *ap; a; a = a->next)
2102         mio_actual_arg (a);
2103
2104     }
2105   else
2106     {
2107       tail = NULL;
2108
2109       for (;;)
2110         {
2111           if (peek_atom () != ATOM_LPAREN)
2112             break;
2113
2114           a = gfc_get_actual_arglist ();
2115
2116           if (tail == NULL)
2117             *ap = a;
2118           else
2119             tail->next = a;
2120
2121           tail = a;
2122           mio_actual_arg (a);
2123         }
2124     }
2125
2126   mio_rparen ();
2127 }
2128
2129
2130 /* Read and write formal argument lists.  */
2131
2132 static void
2133 mio_formal_arglist (gfc_symbol *sym)
2134 {
2135   gfc_formal_arglist *f, *tail;
2136
2137   mio_lparen ();
2138
2139   if (iomode == IO_OUTPUT)
2140     {
2141       for (f = sym->formal; f; f = f->next)
2142         mio_symbol_ref (&f->sym);
2143
2144     }
2145   else
2146     {
2147       sym->formal = tail = NULL;
2148
2149       while (peek_atom () != ATOM_RPAREN)
2150         {
2151           f = gfc_get_formal_arglist ();
2152           mio_symbol_ref (&f->sym);
2153
2154           if (sym->formal == NULL)
2155             sym->formal = f;
2156           else
2157             tail->next = f;
2158
2159           tail = f;
2160         }
2161     }
2162
2163   mio_rparen ();
2164 }
2165
2166
2167 /* Save or restore a reference to a symbol node.  */
2168
2169 void
2170 mio_symbol_ref (gfc_symbol **symp)
2171 {
2172   pointer_info *p;
2173
2174   p = mio_pointer_ref (symp);
2175   if (p->type == P_UNKNOWN)
2176     p->type = P_SYMBOL;
2177
2178   if (iomode == IO_OUTPUT)
2179     {
2180       if (p->u.wsym.state == UNREFERENCED)
2181         p->u.wsym.state = NEEDS_WRITE;
2182     }
2183   else
2184     {
2185       if (p->u.rsym.state == UNUSED)
2186         p->u.rsym.state = NEEDED;
2187     }
2188 }
2189
2190
2191 /* Save or restore a reference to a symtree node.  */
2192
2193 static void
2194 mio_symtree_ref (gfc_symtree **stp)
2195 {
2196   pointer_info *p;
2197   fixup_t *f;
2198
2199   if (iomode == IO_OUTPUT)
2200     mio_symbol_ref (&(*stp)->n.sym);
2201   else
2202     {
2203       require_atom (ATOM_INTEGER);
2204       p = get_integer (atom_int);
2205
2206       /* An unused equivalence member; bail out.  */
2207       if (in_load_equiv && p->u.rsym.symtree == NULL)
2208         return;
2209       
2210       if (p->type == P_UNKNOWN)
2211         p->type = P_SYMBOL;
2212
2213       if (p->u.rsym.state == UNUSED)
2214         p->u.rsym.state = NEEDED;
2215
2216       if (p->u.rsym.symtree != NULL)
2217         {
2218           *stp = p->u.rsym.symtree;
2219         }
2220       else
2221         {
2222           f = gfc_getmem (sizeof (fixup_t));
2223
2224           f->next = p->u.rsym.stfixup;
2225           p->u.rsym.stfixup = f;
2226
2227           f->pointer = (void **)stp;
2228         }
2229     }
2230 }
2231
2232
2233 static void
2234 mio_iterator (gfc_iterator **ip)
2235 {
2236   gfc_iterator *iter;
2237
2238   mio_lparen ();
2239
2240   if (iomode == IO_OUTPUT)
2241     {
2242       if (*ip == NULL)
2243         goto done;
2244     }
2245   else
2246     {
2247       if (peek_atom () == ATOM_RPAREN)
2248         {
2249           *ip = NULL;
2250           goto done;
2251         }
2252
2253       *ip = gfc_get_iterator ();
2254     }
2255
2256   iter = *ip;
2257
2258   mio_expr (&iter->var);
2259   mio_expr (&iter->start);
2260   mio_expr (&iter->end);
2261   mio_expr (&iter->step);
2262
2263 done:
2264   mio_rparen ();
2265 }
2266
2267
2268 static void
2269 mio_constructor (gfc_constructor **cp)
2270 {
2271   gfc_constructor *c, *tail;
2272
2273   mio_lparen ();
2274
2275   if (iomode == IO_OUTPUT)
2276     {
2277       for (c = *cp; c; c = c->next)
2278         {
2279           mio_lparen ();
2280           mio_expr (&c->expr);
2281           mio_iterator (&c->iterator);
2282           mio_rparen ();
2283         }
2284     }
2285   else
2286     {
2287       *cp = NULL;
2288       tail = NULL;
2289
2290       while (peek_atom () != ATOM_RPAREN)
2291         {
2292           c = gfc_get_constructor ();
2293
2294           if (tail == NULL)
2295             *cp = c;
2296           else
2297             tail->next = c;
2298
2299           tail = c;
2300
2301           mio_lparen ();
2302           mio_expr (&c->expr);
2303           mio_iterator (&c->iterator);
2304           mio_rparen ();
2305         }
2306     }
2307
2308   mio_rparen ();
2309 }
2310
2311
2312 static const mstring ref_types[] = {
2313     minit ("ARRAY", REF_ARRAY),
2314     minit ("COMPONENT", REF_COMPONENT),
2315     minit ("SUBSTRING", REF_SUBSTRING),
2316     minit (NULL, -1)
2317 };
2318
2319
2320 static void
2321 mio_ref (gfc_ref **rp)
2322 {
2323   gfc_ref *r;
2324
2325   mio_lparen ();
2326
2327   r = *rp;
2328   r->type = MIO_NAME (ref_type) (r->type, ref_types);
2329
2330   switch (r->type)
2331     {
2332     case REF_ARRAY:
2333       mio_array_ref (&r->u.ar);
2334       break;
2335
2336     case REF_COMPONENT:
2337       mio_symbol_ref (&r->u.c.sym);
2338       mio_component_ref (&r->u.c.component, r->u.c.sym);
2339       break;
2340
2341     case REF_SUBSTRING:
2342       mio_expr (&r->u.ss.start);
2343       mio_expr (&r->u.ss.end);
2344       mio_charlen (&r->u.ss.length);
2345       break;
2346     }
2347
2348   mio_rparen ();
2349 }
2350
2351
2352 static void
2353 mio_ref_list (gfc_ref **rp)
2354 {
2355   gfc_ref *ref, *head, *tail;
2356
2357   mio_lparen ();
2358
2359   if (iomode == IO_OUTPUT)
2360     {
2361       for (ref = *rp; ref; ref = ref->next)
2362         mio_ref (&ref);
2363     }
2364   else
2365     {
2366       head = tail = NULL;
2367
2368       while (peek_atom () != ATOM_RPAREN)
2369         {
2370           if (head == NULL)
2371             head = tail = gfc_get_ref ();
2372           else
2373             {
2374               tail->next = gfc_get_ref ();
2375               tail = tail->next;
2376             }
2377
2378           mio_ref (&tail);
2379         }
2380
2381       *rp = head;
2382     }
2383
2384   mio_rparen ();
2385 }
2386
2387
2388 /* Read and write an integer value.  */
2389
2390 static void
2391 mio_gmp_integer (mpz_t *integer)
2392 {
2393   char *p;
2394
2395   if (iomode == IO_INPUT)
2396     {
2397       if (parse_atom () != ATOM_STRING)
2398         bad_module ("Expected integer string");
2399
2400       mpz_init (*integer);
2401       if (mpz_set_str (*integer, atom_string, 10))
2402         bad_module ("Error converting integer");
2403
2404       gfc_free (atom_string);
2405     }
2406   else
2407     {
2408       p = mpz_get_str (NULL, 10, *integer);
2409       write_atom (ATOM_STRING, p);
2410       gfc_free (p);
2411     }
2412 }
2413
2414
2415 static void
2416 mio_gmp_real (mpfr_t *real)
2417 {
2418   mp_exp_t exponent;
2419   char *p;
2420
2421   if (iomode == IO_INPUT)
2422     {
2423       if (parse_atom () != ATOM_STRING)
2424         bad_module ("Expected real string");
2425
2426       mpfr_init (*real);
2427       mpfr_set_str (*real, atom_string, 16, GFC_RND_MODE);
2428       gfc_free (atom_string);
2429     }
2430   else
2431     {
2432       p = mpfr_get_str (NULL, &exponent, 16, 0, *real, GFC_RND_MODE);
2433       atom_string = gfc_getmem (strlen (p) + 20);
2434
2435       sprintf (atom_string, "0.%s@%ld", p, exponent);
2436
2437       /* Fix negative numbers.  */
2438       if (atom_string[2] == '-')
2439         {
2440           atom_string[0] = '-';
2441           atom_string[1] = '0';
2442           atom_string[2] = '.';
2443         }
2444
2445       write_atom (ATOM_STRING, atom_string);
2446
2447       gfc_free (atom_string);
2448       gfc_free (p);
2449     }
2450 }
2451
2452
2453 /* Save and restore the shape of an array constructor.  */
2454
2455 static void
2456 mio_shape (mpz_t **pshape, int rank)
2457 {
2458   mpz_t *shape;
2459   atom_type t;
2460   int n;
2461
2462   /* A NULL shape is represented by ().  */
2463   mio_lparen ();
2464
2465   if (iomode == IO_OUTPUT)
2466     {
2467       shape = *pshape;
2468       if (!shape)
2469         {
2470           mio_rparen ();
2471           return;
2472         }
2473     }
2474   else
2475     {
2476       t = peek_atom ();
2477       if (t == ATOM_RPAREN)
2478         {
2479           *pshape = NULL;
2480           mio_rparen ();
2481           return;
2482         }
2483
2484       shape = gfc_get_shape (rank);
2485       *pshape = shape;
2486     }
2487
2488   for (n = 0; n < rank; n++)
2489     mio_gmp_integer (&shape[n]);
2490
2491   mio_rparen ();
2492 }
2493
2494
2495 static const mstring expr_types[] = {
2496     minit ("OP", EXPR_OP),
2497     minit ("FUNCTION", EXPR_FUNCTION),
2498     minit ("CONSTANT", EXPR_CONSTANT),
2499     minit ("VARIABLE", EXPR_VARIABLE),
2500     minit ("SUBSTRING", EXPR_SUBSTRING),
2501     minit ("STRUCTURE", EXPR_STRUCTURE),
2502     minit ("ARRAY", EXPR_ARRAY),
2503     minit ("NULL", EXPR_NULL),
2504     minit (NULL, -1)
2505 };
2506
2507 /* INTRINSIC_ASSIGN is missing because it is used as an index for
2508    generic operators, not in expressions.  INTRINSIC_USER is also
2509    replaced by the correct function name by the time we see it.  */
2510
2511 static const mstring intrinsics[] =
2512 {
2513     minit ("UPLUS", INTRINSIC_UPLUS),
2514     minit ("UMINUS", INTRINSIC_UMINUS),
2515     minit ("PLUS", INTRINSIC_PLUS),
2516     minit ("MINUS", INTRINSIC_MINUS),
2517     minit ("TIMES", INTRINSIC_TIMES),
2518     minit ("DIVIDE", INTRINSIC_DIVIDE),
2519     minit ("POWER", INTRINSIC_POWER),
2520     minit ("CONCAT", INTRINSIC_CONCAT),
2521     minit ("AND", INTRINSIC_AND),
2522     minit ("OR", INTRINSIC_OR),
2523     minit ("EQV", INTRINSIC_EQV),
2524     minit ("NEQV", INTRINSIC_NEQV),
2525     minit ("EQ", INTRINSIC_EQ),
2526     minit ("NE", INTRINSIC_NE),
2527     minit ("GT", INTRINSIC_GT),
2528     minit ("GE", INTRINSIC_GE),
2529     minit ("LT", INTRINSIC_LT),
2530     minit ("LE", INTRINSIC_LE),
2531     minit ("NOT", INTRINSIC_NOT),
2532     minit ("PARENTHESES", INTRINSIC_PARENTHESES),
2533     minit (NULL, -1)
2534 };
2535
2536
2537 /* Remedy a couple of situations where the gfc_expr's can be defective.  */
2538  
2539 static void
2540 fix_mio_expr (gfc_expr *e)
2541 {
2542   gfc_symtree *ns_st = NULL;
2543   const char *fname;
2544
2545   if (iomode != IO_OUTPUT)
2546     return;
2547
2548   if (e->symtree)
2549     {
2550       /* If this is a symtree for a symbol that came from a contained module
2551          namespace, it has a unique name and we should look in the current
2552          namespace to see if the required, non-contained symbol is available
2553          yet. If so, the latter should be written.  */
2554       if (e->symtree->n.sym && check_unique_name(e->symtree->name))
2555         ns_st = gfc_find_symtree (gfc_current_ns->sym_root,
2556                                   e->symtree->n.sym->name);
2557
2558       /* On the other hand, if the existing symbol is the module name or the
2559          new symbol is a dummy argument, do not do the promotion.  */
2560       if (ns_st && ns_st->n.sym
2561           && ns_st->n.sym->attr.flavor != FL_MODULE
2562           && !e->symtree->n.sym->attr.dummy)
2563         e->symtree = ns_st;
2564     }
2565   else if (e->expr_type == EXPR_FUNCTION && e->value.function.name)
2566     {
2567       /* In some circumstances, a function used in an initialization
2568          expression, in one use associated module, can fail to be
2569          coupled to its symtree when used in a specification
2570          expression in another module.  */
2571       fname = e->value.function.esym ? e->value.function.esym->name
2572                                      : e->value.function.isym->name;
2573       e->symtree = gfc_find_symtree (gfc_current_ns->sym_root, fname);
2574     }
2575 }
2576
2577
2578 /* Read and write expressions.  The form "()" is allowed to indicate a
2579    NULL expression.  */
2580
2581 static void
2582 mio_expr (gfc_expr **ep)
2583 {
2584   gfc_expr *e;
2585   atom_type t;
2586   int flag;
2587
2588   mio_lparen ();
2589
2590   if (iomode == IO_OUTPUT)
2591     {
2592       if (*ep == NULL)
2593         {
2594           mio_rparen ();
2595           return;
2596         }
2597
2598       e = *ep;
2599       MIO_NAME (expr_t) (e->expr_type, expr_types);
2600     }
2601   else
2602     {
2603       t = parse_atom ();
2604       if (t == ATOM_RPAREN)
2605         {
2606           *ep = NULL;
2607           return;
2608         }
2609
2610       if (t != ATOM_NAME)
2611         bad_module ("Expected expression type");
2612
2613       e = *ep = gfc_get_expr ();
2614       e->where = gfc_current_locus;
2615       e->expr_type = (expr_t) find_enum (expr_types);
2616     }
2617
2618   mio_typespec (&e->ts);
2619   mio_integer (&e->rank);
2620
2621   fix_mio_expr (e);
2622
2623   switch (e->expr_type)
2624     {
2625     case EXPR_OP:
2626       e->value.op.operator
2627         = MIO_NAME (gfc_intrinsic_op) (e->value.op.operator, intrinsics);
2628
2629       switch (e->value.op.operator)
2630         {
2631         case INTRINSIC_UPLUS:
2632         case INTRINSIC_UMINUS:
2633         case INTRINSIC_NOT:
2634         case INTRINSIC_PARENTHESES:
2635           mio_expr (&e->value.op.op1);
2636           break;
2637
2638         case INTRINSIC_PLUS:
2639         case INTRINSIC_MINUS:
2640         case INTRINSIC_TIMES:
2641         case INTRINSIC_DIVIDE:
2642         case INTRINSIC_POWER:
2643         case INTRINSIC_CONCAT:
2644         case INTRINSIC_AND:
2645         case INTRINSIC_OR:
2646         case INTRINSIC_EQV:
2647         case INTRINSIC_NEQV:
2648         case INTRINSIC_EQ:
2649         case INTRINSIC_NE:
2650         case INTRINSIC_GT:
2651         case INTRINSIC_GE:
2652         case INTRINSIC_LT:
2653         case INTRINSIC_LE:
2654           mio_expr (&e->value.op.op1);
2655           mio_expr (&e->value.op.op2);
2656           break;
2657
2658         default:
2659           bad_module ("Bad operator");
2660         }
2661
2662       break;
2663
2664     case EXPR_FUNCTION:
2665       mio_symtree_ref (&e->symtree);
2666       mio_actual_arglist (&e->value.function.actual);
2667
2668       if (iomode == IO_OUTPUT)
2669         {
2670           e->value.function.name
2671             = mio_allocated_string (e->value.function.name);
2672           flag = e->value.function.esym != NULL;
2673           mio_integer (&flag);
2674           if (flag)
2675             mio_symbol_ref (&e->value.function.esym);
2676           else
2677             write_atom (ATOM_STRING, e->value.function.isym->name);
2678         }
2679       else
2680         {
2681           require_atom (ATOM_STRING);
2682           e->value.function.name = gfc_get_string (atom_string);
2683           gfc_free (atom_string);
2684
2685           mio_integer (&flag);
2686           if (flag)
2687             mio_symbol_ref (&e->value.function.esym);
2688           else
2689             {
2690               require_atom (ATOM_STRING);
2691               e->value.function.isym = gfc_find_function (atom_string);
2692               gfc_free (atom_string);
2693             }
2694         }
2695
2696       break;
2697
2698     case EXPR_VARIABLE:
2699       mio_symtree_ref (&e->symtree);
2700       mio_ref_list (&e->ref);
2701       break;
2702
2703     case EXPR_SUBSTRING:
2704       e->value.character.string
2705         = (char *) mio_allocated_string (e->value.character.string);
2706       mio_ref_list (&e->ref);
2707       break;
2708
2709     case EXPR_STRUCTURE:
2710     case EXPR_ARRAY:
2711       mio_constructor (&e->value.constructor);
2712       mio_shape (&e->shape, e->rank);
2713       break;
2714
2715     case EXPR_CONSTANT:
2716       switch (e->ts.type)
2717         {
2718         case BT_INTEGER:
2719           mio_gmp_integer (&e->value.integer);
2720           break;
2721
2722         case BT_REAL:
2723           gfc_set_model_kind (e->ts.kind);
2724           mio_gmp_real (&e->value.real);
2725           break;
2726
2727         case BT_COMPLEX:
2728           gfc_set_model_kind (e->ts.kind);
2729           mio_gmp_real (&e->value.complex.r);
2730           mio_gmp_real (&e->value.complex.i);
2731           break;
2732
2733         case BT_LOGICAL:
2734           mio_integer (&e->value.logical);
2735           break;
2736
2737         case BT_CHARACTER:
2738           mio_integer (&e->value.character.length);
2739           e->value.character.string
2740             = (char *) mio_allocated_string (e->value.character.string);
2741           break;
2742
2743         default:
2744           bad_module ("Bad type in constant expression");
2745         }
2746
2747       break;
2748
2749     case EXPR_NULL:
2750       break;
2751     }
2752
2753   mio_rparen ();
2754 }
2755
2756
2757 /* Read and write namelists */
2758
2759 static void
2760 mio_namelist (gfc_symbol *sym)
2761 {
2762   gfc_namelist *n, *m;
2763   const char *check_name;
2764
2765   mio_lparen ();
2766
2767   if (iomode == IO_OUTPUT)
2768     {
2769       for (n = sym->namelist; n; n = n->next)
2770         mio_symbol_ref (&n->sym);
2771     }
2772   else
2773     {
2774       /* This departure from the standard is flagged as an error.
2775          It does, in fact, work correctly. TODO: Allow it
2776          conditionally?  */
2777       if (sym->attr.flavor == FL_NAMELIST)
2778         {
2779           check_name = find_use_name (sym->name);
2780           if (check_name && strcmp (check_name, sym->name) != 0)
2781             gfc_error ("Namelist %s cannot be renamed by USE "
2782                        "association to %s", sym->name, check_name);
2783         }
2784
2785       m = NULL;
2786       while (peek_atom () != ATOM_RPAREN)
2787         {
2788           n = gfc_get_namelist ();
2789           mio_symbol_ref (&n->sym);
2790
2791           if (sym->namelist == NULL)
2792             sym->namelist = n;
2793           else
2794             m->next = n;
2795
2796           m = n;
2797         }
2798       sym->namelist_tail = m;
2799     }
2800
2801   mio_rparen ();
2802 }
2803
2804
2805 /* Save/restore lists of gfc_interface stuctures.  When loading an
2806    interface, we are really appending to the existing list of
2807    interfaces.  Checking for duplicate and ambiguous interfaces has to
2808    be done later when all symbols have been loaded.  */
2809
2810 static void
2811 mio_interface_rest (gfc_interface **ip)
2812 {
2813   gfc_interface *tail, *p;
2814
2815   if (iomode == IO_OUTPUT)
2816     {
2817       if (ip != NULL)
2818         for (p = *ip; p; p = p->next)
2819           mio_symbol_ref (&p->sym);
2820     }
2821   else
2822     {
2823       if (*ip == NULL)
2824         tail = NULL;
2825       else
2826         {
2827           tail = *ip;
2828           while (tail->next)
2829             tail = tail->next;
2830         }
2831
2832       for (;;)
2833         {
2834           if (peek_atom () == ATOM_RPAREN)
2835             break;
2836
2837           p = gfc_get_interface ();
2838           p->where = gfc_current_locus;
2839           mio_symbol_ref (&p->sym);
2840
2841           if (tail == NULL)
2842             *ip = p;
2843           else
2844             tail->next = p;
2845
2846           tail = p;
2847         }
2848     }
2849
2850   mio_rparen ();
2851 }
2852
2853
2854 /* Save/restore a nameless operator interface.  */
2855
2856 static void
2857 mio_interface (gfc_interface **ip)
2858 {
2859   mio_lparen ();
2860   mio_interface_rest (ip);
2861 }
2862
2863
2864 /* Save/restore a named operator interface.  */
2865
2866 static void
2867 mio_symbol_interface (const char **name, const char **module,
2868                       gfc_interface **ip)
2869 {
2870   mio_lparen ();
2871   mio_pool_string (name);
2872   mio_pool_string (module);
2873   mio_interface_rest (ip);
2874 }
2875
2876
2877 static void
2878 mio_namespace_ref (gfc_namespace **nsp)
2879 {
2880   gfc_namespace *ns;
2881   pointer_info *p;
2882
2883   p = mio_pointer_ref (nsp);
2884
2885   if (p->type == P_UNKNOWN)
2886     p->type = P_NAMESPACE;
2887
2888   if (iomode == IO_INPUT && p->integer != 0)
2889     {
2890       ns = (gfc_namespace *) p->u.pointer;
2891       if (ns == NULL)
2892         {
2893           ns = gfc_get_namespace (NULL, 0);
2894           associate_integer_pointer (p, ns);
2895         }
2896       else
2897         ns->refs++;
2898     }
2899 }
2900
2901
2902 /* Unlike most other routines, the address of the symbol node is already
2903    fixed on input and the name/module has already been filled in.  */
2904
2905 static void
2906 mio_symbol (gfc_symbol *sym)
2907 {
2908   gfc_formal_arglist *formal;
2909
2910   mio_lparen ();
2911
2912   mio_symbol_attribute (&sym->attr);
2913   mio_typespec (&sym->ts);
2914
2915   /* Contained procedures don't have formal namespaces.  Instead we output the
2916      procedure namespace.  The will contain the formal arguments.  */
2917   if (iomode == IO_OUTPUT)
2918     {
2919       formal = sym->formal;
2920       while (formal && !formal->sym)
2921         formal = formal->next;
2922
2923       if (formal)
2924         mio_namespace_ref (&formal->sym->ns);
2925       else
2926         mio_namespace_ref (&sym->formal_ns);
2927     }
2928   else
2929     {
2930       mio_namespace_ref (&sym->formal_ns);
2931       if (sym->formal_ns)
2932         {
2933           sym->formal_ns->proc_name = sym;
2934           sym->refs++;
2935         }
2936     }
2937
2938   /* Save/restore common block links */
2939   mio_symbol_ref (&sym->common_next);
2940
2941   mio_formal_arglist (sym);
2942
2943   if (sym->attr.flavor == FL_PARAMETER)
2944     mio_expr (&sym->value);
2945
2946   mio_array_spec (&sym->as);
2947
2948   mio_symbol_ref (&sym->result);
2949
2950   if (sym->attr.cray_pointee)
2951     mio_symbol_ref (&sym->cp_pointer);
2952
2953   /* Note that components are always saved, even if they are supposed
2954      to be private.  Component access is checked during searching.  */
2955
2956   mio_component_list (&sym->components);
2957
2958   if (sym->components != NULL)
2959     sym->component_access
2960       = MIO_NAME (gfc_access) (sym->component_access, access_types);
2961
2962   mio_namelist (sym);
2963   mio_rparen ();
2964 }
2965
2966
2967 /************************* Top level subroutines *************************/
2968
2969 /* Skip a list between balanced left and right parens.  */
2970
2971 static void
2972 skip_list (void)
2973 {
2974   int level;
2975
2976   level = 0;
2977   do
2978     {
2979       switch (parse_atom ())
2980         {
2981         case ATOM_LPAREN:
2982           level++;
2983           break;
2984
2985         case ATOM_RPAREN:
2986           level--;
2987           break;
2988
2989         case ATOM_STRING:
2990           gfc_free (atom_string);
2991           break;
2992
2993         case ATOM_NAME:
2994         case ATOM_INTEGER:
2995           break;
2996         }
2997     }
2998   while (level > 0);
2999 }
3000
3001
3002 /* Load operator interfaces from the module.  Interfaces are unusual
3003    in that they attach themselves to existing symbols.  */
3004
3005 static void
3006 load_operator_interfaces (void)
3007 {
3008   const char *p;
3009   char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
3010   gfc_user_op *uop;
3011
3012   mio_lparen ();
3013
3014   while (peek_atom () != ATOM_RPAREN)
3015     {
3016       mio_lparen ();
3017
3018       mio_internal_string (name);
3019       mio_internal_string (module);
3020
3021       /* Decide if we need to load this one or not.  */
3022       p = find_use_name (name);
3023       if (p == NULL)
3024         {
3025           while (parse_atom () != ATOM_RPAREN);
3026         }
3027       else
3028         {
3029           uop = gfc_get_uop (p);
3030           mio_interface_rest (&uop->operator);
3031         }
3032     }
3033
3034   mio_rparen ();
3035 }
3036
3037
3038 /* Load interfaces from the module.  Interfaces are unusual in that
3039    they attach themselves to existing symbols.  */
3040
3041 static void
3042 load_generic_interfaces (void)
3043 {
3044   const char *p;
3045   char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
3046   gfc_symbol *sym;
3047   gfc_interface *generic = NULL;
3048   int n, i;
3049
3050   mio_lparen ();
3051
3052   while (peek_atom () != ATOM_RPAREN)
3053     {
3054       mio_lparen ();
3055
3056       mio_internal_string (name);
3057       mio_internal_string (module);
3058
3059       n = number_use_names (name);
3060       n = n ? n : 1;
3061
3062       for (i = 1; i <= n; i++)
3063         {
3064           /* Decide if we need to load this one or not.  */
3065           p = find_use_name_n (name, &i);
3066
3067           if (p == NULL || gfc_find_symbol (p, NULL, 0, &sym))
3068             {
3069               while (parse_atom () != ATOM_RPAREN);
3070                 continue;
3071             }
3072
3073           if (sym == NULL)
3074             {
3075               gfc_get_symbol (p, NULL, &sym);
3076
3077               sym->attr.flavor = FL_PROCEDURE;
3078               sym->attr.generic = 1;
3079               sym->attr.use_assoc = 1;
3080             }
3081           else
3082             {
3083               /* Unless sym is a generic interface, this reference
3084                  is ambiguous.  */
3085               gfc_symtree *st;
3086               p = p ? p : name;
3087               st = gfc_find_symtree (gfc_current_ns->sym_root, p);
3088               if (!sym->attr.generic
3089                     && sym->module != NULL
3090                     && strcmp(module, sym->module) != 0)
3091                 st->ambiguous = 1;
3092             }
3093           if (i == 1)
3094             {
3095               mio_interface_rest (&sym->generic);
3096               generic = sym->generic;
3097             }
3098           else
3099             {
3100               sym->generic = generic;
3101               sym->attr.generic_copy = 1;
3102             }
3103         }
3104     }
3105
3106   mio_rparen ();
3107 }
3108
3109
3110 /* Load common blocks.  */
3111
3112 static void
3113 load_commons (void)
3114 {
3115   char name[GFC_MAX_SYMBOL_LEN + 1];
3116   gfc_common_head *p;
3117
3118   mio_lparen ();
3119
3120   while (peek_atom () != ATOM_RPAREN)
3121     {
3122       int flags;
3123       mio_lparen ();
3124       mio_internal_string (name);
3125
3126       p = gfc_get_common (name, 1);
3127
3128       mio_symbol_ref (&p->head);
3129       mio_integer (&flags);
3130       if (flags & 1)
3131         p->saved = 1;
3132       if (flags & 2)
3133         p->threadprivate = 1;
3134       p->use_assoc = 1;
3135
3136       mio_rparen ();
3137     }
3138
3139   mio_rparen ();
3140 }
3141
3142
3143 /* load_equiv()-- Load equivalences. The flag in_load_equiv informs
3144    mio_expr_ref of this so that unused variables are not loaded and
3145    so that the expression can be safely freed.*/
3146
3147 static void
3148 load_equiv (void)
3149 {
3150   gfc_equiv *head, *tail, *end, *eq;
3151   bool unused;
3152
3153   mio_lparen ();
3154   in_load_equiv = true;
3155
3156   end = gfc_current_ns->equiv;
3157   while (end != NULL && end->next != NULL)
3158     end = end->next;
3159
3160   while (peek_atom() != ATOM_RPAREN) {
3161     mio_lparen ();
3162     head = tail = NULL;
3163
3164     while(peek_atom () != ATOM_RPAREN)
3165       {
3166         if (head == NULL)
3167           head = tail = gfc_get_equiv ();
3168         else
3169           {
3170             tail->eq = gfc_get_equiv ();
3171             tail = tail->eq;
3172           }
3173
3174         mio_pool_string (&tail->module);
3175         mio_expr (&tail->expr);
3176       }
3177
3178     /* Unused variables have no symtree.  */
3179     unused = false;
3180     for (eq = head; eq; eq = eq->eq)
3181       {
3182         if (!eq->expr->symtree)
3183           {
3184             unused = true;
3185             break;
3186           }
3187       }
3188
3189     if (unused)
3190       {
3191         for (eq = head; eq; eq = head)
3192           {
3193             head = eq->eq;
3194             gfc_free_expr (eq->expr);
3195             gfc_free (eq);
3196           }
3197       }
3198
3199     if (end == NULL)
3200       gfc_current_ns->equiv = head;
3201     else
3202       end->next = head;
3203
3204     if (head != NULL)
3205       end = head;
3206
3207     mio_rparen ();
3208   }
3209
3210   mio_rparen ();
3211   in_load_equiv = false;
3212 }
3213
3214 /* Recursive function to traverse the pointer_info tree and load a
3215    needed symbol.  We return nonzero if we load a symbol and stop the
3216    traversal, because the act of loading can alter the tree.  */
3217
3218 static int
3219 load_needed (pointer_info *p)
3220 {
3221   gfc_namespace *ns;
3222   pointer_info *q;
3223   gfc_symbol *sym;
3224   int rv;
3225
3226   rv = 0;
3227   if (p == NULL)
3228     return rv;
3229
3230   rv |= load_needed (p->left);
3231   rv |= load_needed (p->right);
3232
3233   if (p->type != P_SYMBOL || p->u.rsym.state != NEEDED)
3234     return rv;
3235
3236   p->u.rsym.state = USED;
3237
3238   set_module_locus (&p->u.rsym.where);
3239
3240   sym = p->u.rsym.sym;
3241   if (sym == NULL)
3242     {
3243       q = get_integer (p->u.rsym.ns);
3244
3245       ns = (gfc_namespace *) q->u.pointer;
3246       if (ns == NULL)
3247         {
3248           /* Create an interface namespace if necessary.  These are
3249              the namespaces that hold the formal parameters of module
3250              procedures.  */
3251
3252           ns = gfc_get_namespace (NULL, 0);
3253           associate_integer_pointer (q, ns);
3254         }
3255
3256       sym = gfc_new_symbol (p->u.rsym.true_name, ns);
3257       sym->module = gfc_get_string (p->u.rsym.module);
3258
3259       associate_integer_pointer (p, sym);
3260     }
3261
3262   mio_symbol (sym);
3263   sym->attr.use_assoc = 1;
3264   if (only_flag)
3265     sym->attr.use_only = 1;
3266
3267   return 1;
3268 }
3269
3270
3271 /* Recursive function for cleaning up things after a module has been
3272    read.  */
3273
3274 static void
3275 read_cleanup (pointer_info *p)
3276 {
3277   gfc_symtree *st;
3278   pointer_info *q;
3279
3280   if (p == NULL)
3281     return;
3282
3283   read_cleanup (p->left);
3284   read_cleanup (p->right);
3285
3286   if (p->type == P_SYMBOL && p->u.rsym.state == USED && !p->u.rsym.referenced)
3287     {
3288       /* Add hidden symbols to the symtree.  */
3289       q = get_integer (p->u.rsym.ns);
3290       st = get_unique_symtree ((gfc_namespace *) q->u.pointer);
3291
3292       st->n.sym = p->u.rsym.sym;
3293       st->n.sym->refs++;
3294
3295       /* Fixup any symtree references.  */
3296       p->u.rsym.symtree = st;
3297       resolve_fixups (p->u.rsym.stfixup, st);
3298       p->u.rsym.stfixup = NULL;
3299     }
3300
3301   /* Free unused symbols.  */
3302   if (p->type == P_SYMBOL && p->u.rsym.state == UNUSED)
3303     gfc_free_symbol (p->u.rsym.sym);
3304 }
3305
3306
3307 /* Given a root symtree node and a symbol, try to find a symtree that
3308    references the symbol that is not a unique name.  */
3309
3310 static gfc_symtree *
3311 find_symtree_for_symbol (gfc_symtree *st, gfc_symbol *sym)
3312 {
3313   gfc_symtree *s = NULL;
3314
3315   if (st == NULL)
3316     return s;
3317
3318   s = find_symtree_for_symbol (st->right, sym);
3319   if (s != NULL)
3320     return s;
3321   s = find_symtree_for_symbol (st->left, sym);
3322   if (s != NULL)
3323     return s;
3324
3325   if (st->n.sym == sym && !check_unique_name (st->name))
3326     return st;
3327
3328   return s;
3329 }
3330
3331
3332 /* Read a module file.  */
3333
3334 static void
3335 read_module (void)
3336 {
3337   module_locus operator_interfaces, user_operators;
3338   const char *p;
3339   char name[GFC_MAX_SYMBOL_LEN + 1];
3340   gfc_intrinsic_op i;
3341   int ambiguous, j, nuse, symbol;
3342   pointer_info *info;
3343   gfc_use_rename *u;
3344   gfc_symtree *st;
3345   gfc_symbol *sym;
3346
3347   get_module_locus (&operator_interfaces);      /* Skip these for now */
3348   skip_list ();
3349
3350   get_module_locus (&user_operators);
3351   skip_list ();
3352   skip_list ();
3353
3354   /* Skip commons and equivalences for now.  */
3355   skip_list ();
3356   skip_list ();
3357
3358   mio_lparen ();
3359
3360   /* Create the fixup nodes for all the symbols.  */
3361
3362   while (peek_atom () != ATOM_RPAREN)
3363     {
3364       require_atom (ATOM_INTEGER);
3365       info = get_integer (atom_int);
3366
3367       info->type = P_SYMBOL;
3368       info->u.rsym.state = UNUSED;
3369
3370       mio_internal_string (info->u.rsym.true_name);
3371       mio_internal_string (info->u.rsym.module);
3372
3373       require_atom (ATOM_INTEGER);
3374       info->u.rsym.ns = atom_int;
3375
3376       get_module_locus (&info->u.rsym.where);
3377       skip_list ();
3378
3379       /* See if the symbol has already been loaded by a previous module.
3380          If so, we reference the existing symbol and prevent it from
3381          being loaded again.  This should not happen if the symbol being
3382          read is an index for an assumed shape dummy array (ns != 1).  */
3383
3384       sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
3385
3386       if (sym == NULL
3387           || (sym->attr.flavor == FL_VARIABLE && info->u.rsym.ns !=1))
3388         continue;
3389
3390       info->u.rsym.state = USED;
3391       info->u.rsym.sym = sym;
3392
3393       /* If possible recycle the symtree that references the symbol.
3394          If a symtree is not found and the module does not import one,
3395          a unique-name symtree is found by read_cleanup.  */
3396       st = find_symtree_for_symbol (gfc_current_ns->sym_root, sym);
3397       if (st != NULL)
3398         {
3399           info->u.rsym.symtree = st;
3400           info->u.rsym.referenced = 1;
3401         }
3402     }
3403
3404   mio_rparen ();
3405
3406   /* Parse the symtree lists.  This lets us mark which symbols need to
3407      be loaded.  Renaming is also done at this point by replacing the
3408      symtree name.  */
3409
3410   mio_lparen ();
3411
3412   while (peek_atom () != ATOM_RPAREN)
3413     {
3414       mio_internal_string (name);
3415       mio_integer (&ambiguous);
3416       mio_integer (&symbol);
3417
3418       info = get_integer (symbol);
3419
3420       /* See how many use names there are.  If none, go through the start
3421          of the loop at least once.  */
3422       nuse = number_use_names (name);
3423       if (nuse == 0)
3424         nuse = 1;
3425
3426       for (j = 1; j <= nuse; j++)
3427         {
3428           /* Get the jth local name for this symbol.  */
3429           p = find_use_name_n (name, &j);
3430
3431           /* Skip symtree nodes not in an ONLY clause, unless there
3432              is an existing symtree loaded from another USE
3433              statement.  */
3434           if (p == NULL)
3435             {
3436               st = gfc_find_symtree (gfc_current_ns->sym_root, name);
3437               if (st != NULL)
3438                 info->u.rsym.symtree = st;
3439               continue;
3440             }
3441
3442           st = gfc_find_symtree (gfc_current_ns->sym_root, p);
3443
3444           if (st != NULL)
3445             {
3446               /* Check for ambiguous symbols.  */
3447               if (st->n.sym != info->u.rsym.sym)
3448                 st->ambiguous = 1;
3449               info->u.rsym.symtree = st;
3450             }
3451           else
3452             {
3453               /* Create a symtree node in the current namespace for this
3454                  symbol.  */
3455               st = check_unique_name (p)
3456                    ? get_unique_symtree (gfc_current_ns)
3457                    : gfc_new_symtree (&gfc_current_ns->sym_root, p);
3458
3459               st->ambiguous = ambiguous;
3460
3461               sym = info->u.rsym.sym;
3462
3463               /* Create a symbol node if it doesn't already exist.  */
3464               if (sym == NULL)
3465                 {
3466                   info->u.rsym.sym = gfc_new_symbol (info->u.rsym.true_name,
3467                                                      gfc_current_ns);
3468                   sym = info->u.rsym.sym;
3469                   sym->module = gfc_get_string (info->u.rsym.module);
3470                 }
3471
3472               st->n.sym = sym;
3473               st->n.sym->refs++;
3474
3475               /* Store the symtree pointing to this symbol.  */
3476               info->u.rsym.symtree = st;
3477
3478               if (info->u.rsym.state == UNUSED)
3479                 info->u.rsym.state = NEEDED;
3480               info->u.rsym.referenced = 1;
3481             }
3482         }
3483     }
3484
3485   mio_rparen ();
3486
3487   /* Load intrinsic operator interfaces.  */
3488   set_module_locus (&operator_interfaces);
3489   mio_lparen ();
3490
3491   for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3492     {
3493       if (i == INTRINSIC_USER)
3494         continue;
3495
3496       if (only_flag)
3497         {
3498           u = find_use_operator (i);
3499
3500           if (u == NULL)
3501             {
3502               skip_list ();
3503               continue;
3504             }
3505
3506           u->found = 1;
3507         }
3508
3509       mio_interface (&gfc_current_ns->operator[i]);
3510     }
3511
3512   mio_rparen ();
3513
3514   /* Load generic and user operator interfaces.  These must follow the
3515      loading of symtree because otherwise symbols can be marked as
3516      ambiguous.  */
3517
3518   set_module_locus (&user_operators);
3519
3520   load_operator_interfaces ();
3521   load_generic_interfaces ();
3522
3523   load_commons ();
3524   load_equiv ();
3525
3526   /* At this point, we read those symbols that are needed but haven't
3527      been loaded yet.  If one symbol requires another, the other gets
3528      marked as NEEDED if its previous state was UNUSED.  */
3529
3530   while (load_needed (pi_root));
3531
3532   /* Make sure all elements of the rename-list were found in the module.  */
3533
3534   for (u = gfc_rename_list; u; u = u->next)
3535     {
3536       if (u->found)
3537         continue;
3538
3539       if (u->operator == INTRINSIC_NONE)
3540         {
3541           gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
3542                      u->use_name, &u->where, module_name);
3543           continue;
3544         }
3545
3546       if (u->operator == INTRINSIC_USER)
3547         {
3548           gfc_error ("User operator '%s' referenced at %L not found "
3549                      "in module '%s'", u->use_name, &u->where, module_name);
3550           continue;
3551         }
3552
3553       gfc_error ("Intrinsic operator '%s' referenced at %L not found "
3554                  "in module '%s'", gfc_op2string (u->operator), &u->where,
3555                  module_name);
3556     }
3557
3558   gfc_check_interfaces (gfc_current_ns);
3559
3560   /* Clean up symbol nodes that were never loaded, create references
3561      to hidden symbols.  */
3562
3563   read_cleanup (pi_root);
3564 }
3565
3566
3567 /* Given an access type that is specific to an entity and the default
3568    access, return nonzero if the entity is publicly accessible.  If the
3569    element is declared as PUBLIC, then it is public; if declared 
3570    PRIVATE, then private, and otherwise it is public unless the default
3571    access in this context has been declared PRIVATE.  */
3572
3573 bool
3574 gfc_check_access (gfc_access specific_access, gfc_access default_access)
3575 {
3576   if (specific_access == ACCESS_PUBLIC)
3577     return TRUE;
3578   if (specific_access == ACCESS_PRIVATE)
3579     return FALSE;
3580
3581   return default_access != ACCESS_PRIVATE;
3582 }
3583
3584
3585 /* Write a common block to the module */
3586
3587 static void
3588 write_common (gfc_symtree *st)
3589 {
3590   gfc_common_head *p;
3591   const char * name;
3592   int flags;
3593
3594   if (st == NULL)
3595     return;
3596
3597   write_common (st->left);
3598   write_common (st->right);
3599
3600   mio_lparen ();
3601
3602   /* Write the unmangled name.  */
3603   name = st->n.common->name;
3604
3605   mio_pool_string (&name);
3606
3607   p = st->n.common;
3608   mio_symbol_ref (&p->head);
3609   flags = p->saved ? 1 : 0;
3610   if (p->threadprivate) flags |= 2;
3611   mio_integer (&flags);
3612
3613   mio_rparen ();
3614 }
3615
3616 /* Write the blank common block to the module */
3617
3618 static void
3619 write_blank_common (void)
3620 {
3621   const char * name = BLANK_COMMON_NAME;
3622   int saved;
3623
3624   if (gfc_current_ns->blank_common.head == NULL)
3625     return;
3626
3627   mio_lparen ();
3628
3629   mio_pool_string (&name);
3630
3631   mio_symbol_ref (&gfc_current_ns->blank_common.head);
3632   saved = gfc_current_ns->blank_common.saved;
3633   mio_integer (&saved);
3634
3635   mio_rparen ();
3636 }
3637
3638
3639 /* Write equivalences to the module.  */
3640
3641 static void
3642 write_equiv (void)
3643 {
3644   gfc_equiv *eq, *e;
3645   int num;
3646
3647   num = 0;
3648   for (eq = gfc_current_ns->equiv; eq; eq = eq->next)
3649     {
3650       mio_lparen ();
3651
3652       for (e = eq; e; e = e->eq)
3653         {
3654           if (e->module == NULL)
3655             e->module = gfc_get_string ("%s.eq.%d", module_name, num);
3656           mio_allocated_string (e->module);
3657           mio_expr (&e->expr);
3658         }
3659
3660       num++;
3661       mio_rparen ();
3662     }
3663 }
3664
3665
3666 /* Write a symbol to the module.  */
3667
3668 static void
3669 write_symbol (int n, gfc_symbol *sym)
3670 {
3671
3672   if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
3673     gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym->name);
3674
3675   mio_integer (&n);
3676   mio_pool_string (&sym->name);
3677
3678   mio_pool_string (&sym->module);
3679   mio_pointer_ref (&sym->ns);
3680
3681   mio_symbol (sym);
3682   write_char ('\n');
3683 }
3684
3685
3686 /* Recursive traversal function to write the initial set of symbols to
3687    the module.  We check to see if the symbol should be written
3688    according to the access specification.  */
3689
3690 static void
3691 write_symbol0 (gfc_symtree *st)
3692 {
3693   gfc_symbol *sym;
3694   pointer_info *p;
3695
3696   if (st == NULL)
3697     return;
3698
3699   write_symbol0 (st->left);
3700   write_symbol0 (st->right);
3701
3702   sym = st->n.sym;
3703   if (sym->module == NULL)
3704     sym->module = gfc_get_string (module_name);
3705
3706   if (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3707       && !sym->attr.subroutine && !sym->attr.function)
3708     return;
3709
3710   if (!gfc_check_access (sym->attr.access, sym->ns->default_access))
3711     return;
3712
3713   p = get_pointer (sym);
3714   if (p->type == P_UNKNOWN)
3715     p->type = P_SYMBOL;
3716
3717   if (p->u.wsym.state == WRITTEN)
3718     return;
3719
3720   write_symbol (p->integer, sym);
3721   p->u.wsym.state = WRITTEN;
3722
3723   return;
3724 }
3725
3726
3727 /* Recursive traversal function to write the secondary set of symbols
3728    to the module file.  These are symbols that were not public yet are
3729    needed by the public symbols or another dependent symbol.  The act
3730    of writing a symbol can modify the pointer_info tree, so we cease
3731    traversal if we find a symbol to write.  We return nonzero if a
3732    symbol was written and pass that information upwards.  */
3733
3734 static int
3735 write_symbol1 (pointer_info *p)
3736 {
3737   if (p == NULL)
3738     return 0;
3739
3740   if (write_symbol1 (p->left))
3741     return 1;
3742   if (write_symbol1 (p->right))
3743     return 1;
3744
3745   if (p->type != P_SYMBOL || p->u.wsym.state != NEEDS_WRITE)
3746     return 0;
3747
3748   p->u.wsym.state = WRITTEN;
3749   write_symbol (p->integer, p->u.wsym.sym);
3750
3751   return 1;
3752 }
3753
3754
3755 /* Write operator interfaces associated with a symbol.  */
3756
3757 static void
3758 write_operator (gfc_user_op *uop)
3759 {
3760   static char nullstring[] = "";
3761   const char *p = nullstring;
3762
3763   if (uop->operator == NULL
3764       || !gfc_check_access (uop->access, uop->ns->default_access))
3765     return;
3766
3767   mio_symbol_interface (&uop->name, &p, &uop->operator);
3768 }
3769
3770
3771 /* Write generic interfaces associated with a symbol.  */
3772
3773 static void
3774 write_generic (gfc_symbol *sym)
3775 {
3776   if (sym->generic == NULL
3777       || !gfc_check_access (sym->attr.access, sym->ns->default_access))
3778     return;
3779
3780   if (sym->module == NULL)
3781     sym->module = gfc_get_string (module_name);
3782
3783   mio_symbol_interface (&sym->name, &sym->module, &sym->generic);
3784 }
3785
3786
3787 static void
3788 write_symtree (gfc_symtree *st)
3789 {
3790   gfc_symbol *sym;
3791   pointer_info *p;
3792
3793   sym = st->n.sym;
3794   if (!gfc_check_access (sym->attr.access, sym->ns->default_access)
3795       || (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3796           && !sym->attr.subroutine && !sym->attr.function))
3797     return;
3798
3799   if (check_unique_name (st->name))
3800     return;
3801
3802   p = find_pointer (sym);
3803   if (p == NULL)
3804     gfc_internal_error ("write_symtree(): Symbol not written");
3805
3806   mio_pool_string (&st->name);
3807   mio_integer (&st->ambiguous);
3808   mio_integer (&p->integer);
3809 }
3810
3811
3812 static void
3813 write_module (void)
3814 {
3815   gfc_intrinsic_op i;
3816
3817   /* Write the operator interfaces.  */
3818   mio_lparen ();
3819
3820   for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3821     {
3822       if (i == INTRINSIC_USER)
3823         continue;
3824
3825       mio_interface (gfc_check_access (gfc_current_ns->operator_access[i],
3826                                        gfc_current_ns->default_access)
3827                      ? &gfc_current_ns->operator[i] : NULL);
3828     }
3829
3830   mio_rparen ();
3831   write_char ('\n');
3832   write_char ('\n');
3833
3834   mio_lparen ();
3835   gfc_traverse_user_op (gfc_current_ns, write_operator);
3836   mio_rparen ();
3837   write_char ('\n');
3838   write_char ('\n');
3839
3840   mio_lparen ();
3841   gfc_traverse_ns (gfc_current_ns, write_generic);
3842   mio_rparen ();
3843   write_char ('\n');
3844   write_char ('\n');
3845
3846   mio_lparen ();
3847   write_blank_common ();
3848   write_common (gfc_current_ns->common_root);
3849   mio_rparen ();
3850   write_char ('\n');
3851   write_char ('\n');
3852
3853   mio_lparen ();
3854   write_equiv ();
3855   mio_rparen ();
3856   write_char ('\n');
3857   write_char ('\n');
3858
3859   /* Write symbol information.  First we traverse all symbols in the
3860      primary namespace, writing those that need to be written.
3861      Sometimes writing one symbol will cause another to need to be
3862      written.  A list of these symbols ends up on the write stack, and
3863      we end by popping the bottom of the stack and writing the symbol
3864      until the stack is empty.  */
3865
3866   mio_lparen ();
3867
3868   write_symbol0 (gfc_current_ns->sym_root);
3869   while (write_symbol1 (pi_root));
3870
3871   mio_rparen ();
3872
3873   write_char ('\n');
3874   write_char ('\n');
3875
3876   mio_lparen ();
3877   gfc_traverse_symtree (gfc_current_ns->sym_root, write_symtree);
3878   mio_rparen ();
3879 }
3880
3881
3882 /* Given module, dump it to disk.  If there was an error while
3883    processing the module, dump_flag will be set to zero and we delete
3884    the module file, even if it was already there.  */
3885
3886 void
3887 gfc_dump_module (const char *name, int dump_flag)
3888 {
3889   int n;
3890   char *filename, *p;
3891   time_t now;
3892
3893   n = strlen (name) + strlen (MODULE_EXTENSION) + 1;
3894   if (gfc_option.module_dir != NULL)
3895     {
3896       filename = (char *) alloca (n + strlen (gfc_option.module_dir));
3897       strcpy (filename, gfc_option.module_dir);
3898       strcat (filename, name);
3899     }
3900   else
3901     {
3902       filename = (char *) alloca (n);
3903       strcpy (filename, name);
3904     }
3905   strcat (filename, MODULE_EXTENSION);
3906
3907   if (!dump_flag)
3908     {
3909       unlink (filename);
3910       return;
3911     }
3912
3913   module_fp = fopen (filename, "w");
3914   if (module_fp == NULL)
3915     gfc_fatal_error ("Can't open module file '%s' for writing at %C: %s",
3916                      filename, strerror (errno));
3917
3918   now = time (NULL);
3919   p = ctime (&now);
3920
3921   *strchr (p, '\n') = '\0';
3922
3923   fprintf (module_fp, "GFORTRAN module created from %s on %s\n", 
3924            gfc_source_file, p);
3925   fputs ("If you edit this, you'll get what you deserve.\n\n", module_fp);
3926
3927   iomode = IO_OUTPUT;
3928   strcpy (module_name, name);
3929
3930   init_pi_tree ();
3931
3932   write_module ();
3933
3934   free_pi_tree (pi_root);
3935   pi_root = NULL;
3936
3937   write_char ('\n');
3938
3939   if (fclose (module_fp))
3940     gfc_fatal_error ("Error writing module file '%s' for writing: %s",
3941                      filename, strerror (errno));
3942 }
3943
3944
3945 /* Add an integer named constant from a given module.  */
3946 static void
3947 create_int_parameter (const char *name, int value, const char *modname)
3948 {
3949   gfc_symtree *tmp_symtree;
3950   gfc_symbol *sym;
3951
3952   tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
3953   if (tmp_symtree != NULL)
3954     {
3955       if (strcmp (modname, tmp_symtree->n.sym->module) == 0)
3956         return;
3957       else
3958         gfc_error ("Symbol '%s' already declared", name);
3959     }
3960
3961   gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree);
3962   sym = tmp_symtree->n.sym;
3963
3964   sym->module = gfc_get_string (modname);
3965   sym->attr.flavor = FL_PARAMETER;
3966   sym->ts.type = BT_INTEGER;
3967   sym->ts.kind = gfc_default_integer_kind;
3968   sym->value = gfc_int_expr (value);
3969   sym->attr.use_assoc = 1;
3970 }
3971
3972
3973 /* USE the ISO_FORTRAN_ENV intrinsic module.  */
3974
3975 static void
3976 use_iso_fortran_env_module (void)
3977 {
3978   static char mod[] = "iso_fortran_env";
3979   const char *local_name;
3980   gfc_use_rename *u;
3981   gfc_symbol *mod_sym;
3982   gfc_symtree *mod_symtree;
3983   int i;
3984
3985   mstring symbol[] = {
3986 #define NAMED_INTCST(a,b,c) minit(b,0),
3987 #include "iso-fortran-env.def"
3988 #undef NAMED_INTCST
3989     minit (NULL, -1234) };
3990
3991   i = 0;
3992 #define NAMED_INTCST(a,b,c) symbol[i++].tag = c;
3993 #include "iso-fortran-env.def"
3994 #undef NAMED_INTCST
3995
3996   /* Generate the symbol for the module itself.  */
3997   mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, mod);
3998   if (mod_symtree == NULL)
3999     {
4000       gfc_get_sym_tree (mod, gfc_current_ns, &mod_symtree);
4001       gcc_assert (mod_symtree);
4002       mod_sym = mod_symtree->n.sym;
4003
4004       mod_sym->attr.flavor = FL_MODULE;
4005       mod_sym->attr.intrinsic = 1;
4006       mod_sym->module = gfc_get_string (mod);
4007     }
4008   else
4009     if (!mod_symtree->n.sym->attr.intrinsic)
4010       gfc_error ("Use of intrinsic module '%s' at %C conflicts with "
4011                  "non-intrinsic module name used previously", mod);
4012
4013   /* Generate the symbols for the module integer named constants.  */
4014   if (only_flag)
4015     for (u = gfc_rename_list; u; u = u->next)
4016       {
4017         for (i = 0; symbol[i].string; i++)
4018           if (strcmp (symbol[i].string, u->use_name) == 0)
4019             break;
4020
4021         if (symbol[i].string == NULL)
4022           {
4023             gfc_error ("Symbol '%s' referenced at %L does not exist in "
4024                        "intrinsic module ISO_FORTRAN_ENV", u->use_name,
4025                        &u->where);
4026             continue;
4027           }
4028
4029         if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
4030             && strcmp (symbol[i].string, "numeric_storage_size") == 0)
4031           gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named constant "
4032                            "from intrinsic module ISO_FORTRAN_ENV at %L is "
4033                            "incompatible with option %s", &u->where,
4034                            gfc_option.flag_default_integer
4035                              ? "-fdefault-integer-8" : "-fdefault-real-8");
4036
4037         create_int_parameter (u->local_name[0] ? u->local_name
4038                                                : symbol[i].string,
4039                               symbol[i].tag, mod);
4040       }
4041   else
4042     {
4043       for (i = 0; symbol[i].string; i++)
4044         {
4045           local_name = NULL;
4046           for (u = gfc_rename_list; u; u = u->next)
4047             {
4048               if (strcmp (symbol[i].string, u->use_name) == 0)
4049                 {
4050                   local_name = u->local_name;
4051                   u->found = 1;
4052                   break;
4053                 }
4054             }
4055
4056           if ((gfc_option.flag_default_integer || gfc_option.flag_default_real)
4057               && strcmp (symbol[i].string, "numeric_storage_size") == 0)
4058             gfc_warning_now ("Use of the NUMERIC_STORAGE_SIZE named constant "
4059                              "from intrinsic module ISO_FORTRAN_ENV at %C is "
4060                              "incompatible with option %s",
4061                              gfc_option.flag_default_integer
4062                                 ? "-fdefault-integer-8" : "-fdefault-real-8");
4063
4064           create_int_parameter (local_name ? local_name : symbol[i].string,
4065                                 symbol[i].tag, mod);
4066         }
4067
4068       for (u = gfc_rename_list; u; u = u->next)
4069         {
4070           if (u->found)
4071             continue;
4072
4073           gfc_error ("Symbol '%s' referenced at %L not found in intrinsic "
4074                      "module ISO_FORTRAN_ENV", u->use_name, &u->where);
4075         }
4076     }
4077 }
4078
4079
4080 /* Process a USE directive.  */
4081
4082 void
4083 gfc_use_module (void)
4084 {
4085   char *filename;
4086   gfc_state_data *p;
4087   int c, line, start;
4088   gfc_symtree *mod_symtree;
4089
4090   filename = (char *) alloca (strlen (module_name) + strlen (MODULE_EXTENSION)
4091                               + 1);
4092   strcpy (filename, module_name);
4093   strcat (filename, MODULE_EXTENSION);
4094
4095   /* First, try to find an non-intrinsic module, unless the USE statement
4096      specified that the module is intrinsic.  */
4097   module_fp = NULL;
4098   if (!specified_int)
4099     module_fp = gfc_open_included_file (filename, true, true);
4100
4101   /* Then, see if it's an intrinsic one, unless the USE statement
4102      specified that the module is non-intrinsic.  */
4103   if (module_fp == NULL && !specified_nonint)
4104     {
4105       if (strcmp (module_name, "iso_fortran_env") == 0
4106           && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ISO_FORTRAN_ENV "
4107                              "intrinsic module at %C") != FAILURE)
4108        {
4109          use_iso_fortran_env_module ();
4110          return;
4111        }
4112
4113       module_fp = gfc_open_intrinsic_module (filename);
4114
4115       if (module_fp == NULL && specified_int)
4116        gfc_fatal_error ("Can't find an intrinsic module named '%s' at %C",
4117                         module_name);
4118     }
4119
4120   if (module_fp == NULL)
4121     gfc_fatal_error ("Can't open module file '%s' for reading at %C: %s",
4122                      filename, strerror (errno));
4123
4124   /* Check that we haven't already USEd an intrinsic module with the
4125      same name.  */
4126
4127   mod_symtree = gfc_find_symtree (gfc_current_ns->sym_root, module_name);
4128   if (mod_symtree && mod_symtree->n.sym->attr.intrinsic)
4129     gfc_error ("Use of non-intrinsic module '%s' at %C conflicts with "
4130                "intrinsic module name used previously", module_name);
4131
4132   iomode = IO_INPUT;
4133   module_line = 1;
4134   module_column = 1;
4135   start = 0;
4136
4137   /* Skip the first two lines of the module, after checking that this is
4138      a gfortran module file.  */
4139   line = 0;
4140   while (line < 2)
4141     {
4142       c = module_char ();
4143       if (c == EOF)
4144         bad_module ("Unexpected end of module");
4145       if (start++ < 2)
4146         parse_name (c);
4147       if ((start == 1 && strcmp (atom_name, "GFORTRAN") != 0)
4148           || (start == 2 && strcmp (atom_name, " module") != 0))
4149         gfc_fatal_error ("File '%s' opened at %C is not a GFORTRAN module "
4150                          "file", filename);
4151
4152       if (c == '\n')
4153         line++;
4154     }
4155
4156   /* Make sure we're not reading the same module that we may be building.  */
4157   for (p = gfc_state_stack; p; p = p->previous)
4158     if (p->state == COMP_MODULE && strcmp (p->sym->name, module_name) == 0)
4159       gfc_fatal_error ("Can't USE the same module we're building!");
4160
4161   init_pi_tree ();
4162   init_true_name_tree ();
4163
4164   read_module ();
4165
4166   free_true_name (true_name_root);
4167   true_name_root = NULL;
4168
4169   free_pi_tree (pi_root);
4170   pi_root = NULL;
4171
4172   fclose (module_fp);
4173 }
4174
4175
4176 void
4177 gfc_module_init_2 (void)
4178 {
4179   last_atom = ATOM_LPAREN;
4180 }
4181
4182
4183 void
4184 gfc_module_done_2 (void)
4185 {
4186   free_rename ();
4187 }