OSDN Git Service

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