OSDN Git Service

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