OSDN Git Service

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