OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.5.1/] [gcc/] [fortran/] [symbol.c] - Blame information for rev 309

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 285 jeremybenn
/* Maintain binary trees of symbols.
2
   Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
3
   2009, 2010
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
 
24
#include "config.h"
25
#include "system.h"
26
#include "flags.h"
27
#include "gfortran.h"
28
#include "parse.h"
29
#include "match.h"
30
 
31
 
32
/* Strings for all symbol attributes.  We use these for dumping the
33
   parse tree, in error messages, and also when reading and writing
34
   modules.  */
35
 
36
const mstring flavors[] =
37
{
38
  minit ("UNKNOWN-FL", FL_UNKNOWN), minit ("PROGRAM", FL_PROGRAM),
39
  minit ("BLOCK-DATA", FL_BLOCK_DATA), minit ("MODULE", FL_MODULE),
40
  minit ("VARIABLE", FL_VARIABLE), minit ("PARAMETER", FL_PARAMETER),
41
  minit ("LABEL", FL_LABEL), minit ("PROCEDURE", FL_PROCEDURE),
42
  minit ("DERIVED", FL_DERIVED), minit ("NAMELIST", FL_NAMELIST),
43
  minit (NULL, -1)
44
};
45
 
46
const mstring procedures[] =
47
{
48
    minit ("UNKNOWN-PROC", PROC_UNKNOWN),
49
    minit ("MODULE-PROC", PROC_MODULE),
50
    minit ("INTERNAL-PROC", PROC_INTERNAL),
51
    minit ("DUMMY-PROC", PROC_DUMMY),
52
    minit ("INTRINSIC-PROC", PROC_INTRINSIC),
53
    minit ("EXTERNAL-PROC", PROC_EXTERNAL),
54
    minit ("STATEMENT-PROC", PROC_ST_FUNCTION),
55
    minit (NULL, -1)
56
};
57
 
58
const mstring intents[] =
59
{
60
    minit ("UNKNOWN-INTENT", INTENT_UNKNOWN),
61
    minit ("IN", INTENT_IN),
62
    minit ("OUT", INTENT_OUT),
63
    minit ("INOUT", INTENT_INOUT),
64
    minit (NULL, -1)
65
};
66
 
67
const mstring access_types[] =
68
{
69
    minit ("UNKNOWN-ACCESS", ACCESS_UNKNOWN),
70
    minit ("PUBLIC", ACCESS_PUBLIC),
71
    minit ("PRIVATE", ACCESS_PRIVATE),
72
    minit (NULL, -1)
73
};
74
 
75
const mstring ifsrc_types[] =
76
{
77
    minit ("UNKNOWN", IFSRC_UNKNOWN),
78
    minit ("DECL", IFSRC_DECL),
79
    minit ("BODY", IFSRC_IFBODY)
80
};
81
 
82
const mstring save_status[] =
83
{
84
    minit ("UNKNOWN", SAVE_NONE),
85
    minit ("EXPLICIT-SAVE", SAVE_EXPLICIT),
86
    minit ("IMPLICIT-SAVE", SAVE_IMPLICIT),
87
};
88
 
89
/* This is to make sure the backend generates setup code in the correct
90
   order.  */
91
 
92
static int next_dummy_order = 1;
93
 
94
 
95
gfc_namespace *gfc_current_ns;
96
gfc_namespace *gfc_global_ns_list;
97
 
98
gfc_gsymbol *gfc_gsym_root = NULL;
99
 
100
static gfc_symbol *changed_syms = NULL;
101
 
102
gfc_dt_list *gfc_derived_types;
103
 
104
 
105
/* List of tentative typebound-procedures.  */
106
 
107
typedef struct tentative_tbp
108
{
109
  gfc_typebound_proc *proc;
110
  struct tentative_tbp *next;
111
}
112
tentative_tbp;
113
 
114
static tentative_tbp *tentative_tbp_list = NULL;
115
 
116
 
117
/*********** IMPLICIT NONE and IMPLICIT statement handlers ***********/
118
 
119
/* The following static variable indicates whether a particular element has
120
   been explicitly set or not.  */
121
 
122
static int new_flag[GFC_LETTERS];
123
 
124
 
125
/* Handle a correctly parsed IMPLICIT NONE.  */
126
 
127
void
128
gfc_set_implicit_none (void)
129
{
130
  int i;
131
 
132
  if (gfc_current_ns->seen_implicit_none)
133
    {
134
      gfc_error ("Duplicate IMPLICIT NONE statement at %C");
135
      return;
136
    }
137
 
138
  gfc_current_ns->seen_implicit_none = 1;
139
 
140
  for (i = 0; i < GFC_LETTERS; i++)
141
    {
142
      gfc_clear_ts (&gfc_current_ns->default_type[i]);
143
      gfc_current_ns->set_flag[i] = 1;
144
    }
145
}
146
 
147
 
148
/* Reset the implicit range flags.  */
149
 
150
void
151
gfc_clear_new_implicit (void)
152
{
153
  int i;
154
 
155
  for (i = 0; i < GFC_LETTERS; i++)
156
    new_flag[i] = 0;
157
}
158
 
159
 
160
/* Prepare for a new implicit range.  Sets flags in new_flag[].  */
161
 
162
gfc_try
163
gfc_add_new_implicit_range (int c1, int c2)
164
{
165
  int i;
166
 
167
  c1 -= 'a';
168
  c2 -= 'a';
169
 
170
  for (i = c1; i <= c2; i++)
171
    {
172
      if (new_flag[i])
173
        {
174
          gfc_error ("Letter '%c' already set in IMPLICIT statement at %C",
175
                     i + 'A');
176
          return FAILURE;
177
        }
178
 
179
      new_flag[i] = 1;
180
    }
181
 
182
  return SUCCESS;
183
}
184
 
185
 
186
/* Add a matched implicit range for gfc_set_implicit().  Check if merging
187
   the new implicit types back into the existing types will work.  */
188
 
189
gfc_try
190
gfc_merge_new_implicit (gfc_typespec *ts)
191
{
192
  int i;
193
 
194
  if (gfc_current_ns->seen_implicit_none)
195
    {
196
      gfc_error ("Cannot specify IMPLICIT at %C after IMPLICIT NONE");
197
      return FAILURE;
198
    }
199
 
200
  for (i = 0; i < GFC_LETTERS; i++)
201
    {
202
      if (new_flag[i])
203
        {
204
          if (gfc_current_ns->set_flag[i])
205
            {
206
              gfc_error ("Letter %c already has an IMPLICIT type at %C",
207
                         i + 'A');
208
              return FAILURE;
209
            }
210
 
211
          gfc_current_ns->default_type[i] = *ts;
212
          gfc_current_ns->implicit_loc[i] = gfc_current_locus;
213
          gfc_current_ns->set_flag[i] = 1;
214
        }
215
    }
216
  return SUCCESS;
217
}
218
 
219
 
220
/* Given a symbol, return a pointer to the typespec for its default type.  */
221
 
222
gfc_typespec *
223
gfc_get_default_type (const char *name, gfc_namespace *ns)
224
{
225
  char letter;
226
 
227
  letter = name[0];
228
 
229
  if (gfc_option.flag_allow_leading_underscore && letter == '_')
230
    gfc_internal_error ("Option -fallow-leading-underscore is for use only by "
231
                        "gfortran developers, and should not be used for "
232
                        "implicitly typed variables");
233
 
234
  if (letter < 'a' || letter > 'z')
235
    gfc_internal_error ("gfc_get_default_type(): Bad symbol '%s'", name);
236
 
237
  if (ns == NULL)
238
    ns = gfc_current_ns;
239
 
240
  return &ns->default_type[letter - 'a'];
241
}
242
 
243
 
244
/* Given a pointer to a symbol, set its type according to the first
245
   letter of its name.  Fails if the letter in question has no default
246
   type.  */
247
 
248
gfc_try
249
gfc_set_default_type (gfc_symbol *sym, int error_flag, gfc_namespace *ns)
250
{
251
  gfc_typespec *ts;
252
 
253
  if (sym->ts.type != BT_UNKNOWN)
254
    gfc_internal_error ("gfc_set_default_type(): symbol already has a type");
255
 
256
  ts = gfc_get_default_type (sym->name, ns);
257
 
258
  if (ts->type == BT_UNKNOWN)
259
    {
260
      if (error_flag && !sym->attr.untyped)
261
        {
262
          gfc_error ("Symbol '%s' at %L has no IMPLICIT type",
263
                     sym->name, &sym->declared_at);
264
          sym->attr.untyped = 1; /* Ensure we only give an error once.  */
265
        }
266
 
267
      return FAILURE;
268
    }
269
 
270
  sym->ts = *ts;
271
  sym->attr.implicit_type = 1;
272
 
273
  if (ts->type == BT_CHARACTER && ts->u.cl)
274
    sym->ts.u.cl = gfc_new_charlen (sym->ns, ts->u.cl);
275
 
276
  if (sym->attr.is_bind_c == 1)
277
    {
278
      /* BIND(C) variables should not be implicitly declared.  */
279
      gfc_warning_now ("Implicitly declared BIND(C) variable '%s' at %L may "
280
                       "not be C interoperable", sym->name, &sym->declared_at);
281
      sym->ts.f90_type = sym->ts.type;
282
    }
283
 
284
  if (sym->attr.dummy != 0)
285
    {
286
      if (sym->ns->proc_name != NULL
287
          && (sym->ns->proc_name->attr.subroutine != 0
288
              || sym->ns->proc_name->attr.function != 0)
289
          && sym->ns->proc_name->attr.is_bind_c != 0)
290
        {
291
          /* Dummy args to a BIND(C) routine may not be interoperable if
292
             they are implicitly typed.  */
293
          gfc_warning_now ("Implicitly declared variable '%s' at %L may not "
294
                           "be C interoperable but it is a dummy argument to "
295
                           "the BIND(C) procedure '%s' at %L", sym->name,
296
                           &(sym->declared_at), sym->ns->proc_name->name,
297
                           &(sym->ns->proc_name->declared_at));
298
          sym->ts.f90_type = sym->ts.type;
299
        }
300
    }
301
 
302
  return SUCCESS;
303
}
304
 
305
 
306
/* This function is called from parse.c(parse_progunit) to check the
307
   type of the function is not implicitly typed in the host namespace
308
   and to implicitly type the function result, if necessary.  */
309
 
310
void
311
gfc_check_function_type (gfc_namespace *ns)
312
{
313
  gfc_symbol *proc = ns->proc_name;
314
 
315
  if (!proc->attr.contained || proc->result->attr.implicit_type)
316
    return;
317
 
318
  if (proc->result->ts.type == BT_UNKNOWN && proc->result->ts.interface == NULL)
319
    {
320
      if (gfc_set_default_type (proc->result, 0, gfc_current_ns)
321
                == SUCCESS)
322
        {
323
          if (proc->result != proc)
324
            {
325
              proc->ts = proc->result->ts;
326
              proc->as = gfc_copy_array_spec (proc->result->as);
327
              proc->attr.dimension = proc->result->attr.dimension;
328
              proc->attr.pointer = proc->result->attr.pointer;
329
              proc->attr.allocatable = proc->result->attr.allocatable;
330
            }
331
        }
332
      else if (!proc->result->attr.proc_pointer)
333
        {
334
          gfc_error ("Function result '%s' at %L has no IMPLICIT type",
335
                     proc->result->name, &proc->result->declared_at);
336
          proc->result->attr.untyped = 1;
337
        }
338
    }
339
}
340
 
341
 
342
/******************** Symbol attribute stuff *********************/
343
 
344
/* This is a generic conflict-checker.  We do this to avoid having a
345
   single conflict in two places.  */
346
 
347
#define conf(a, b) if (attr->a && attr->b) { a1 = a; a2 = b; goto conflict; }
348
#define conf2(a) if (attr->a) { a2 = a; goto conflict; }
349
#define conf_std(a, b, std) if (attr->a && attr->b)\
350
                              {\
351
                                a1 = a;\
352
                                a2 = b;\
353
                                standard = std;\
354
                                goto conflict_std;\
355
                              }
356
 
357
static gfc_try
358
check_conflict (symbol_attribute *attr, const char *name, locus *where)
359
{
360
  static const char *dummy = "DUMMY", *save = "SAVE", *pointer = "POINTER",
361
    *target = "TARGET", *external = "EXTERNAL", *intent = "INTENT",
362
    *intent_in = "INTENT(IN)", *intrinsic = "INTRINSIC",
363
    *intent_out = "INTENT(OUT)", *intent_inout = "INTENT(INOUT)",
364
    *allocatable = "ALLOCATABLE", *elemental = "ELEMENTAL",
365
    *privat = "PRIVATE", *recursive = "RECURSIVE",
366
    *in_common = "COMMON", *result = "RESULT", *in_namelist = "NAMELIST",
367
    *publik = "PUBLIC", *optional = "OPTIONAL", *entry = "ENTRY",
368
    *function = "FUNCTION", *subroutine = "SUBROUTINE",
369
    *dimension = "DIMENSION", *in_equivalence = "EQUIVALENCE",
370
    *use_assoc = "USE ASSOCIATED", *cray_pointer = "CRAY POINTER",
371
    *cray_pointee = "CRAY POINTEE", *data = "DATA", *value = "VALUE",
372
    *volatile_ = "VOLATILE", *is_protected = "PROTECTED",
373
    *is_bind_c = "BIND(C)", *procedure = "PROCEDURE",
374
    *asynchronous = "ASYNCHRONOUS";
375
  static const char *threadprivate = "THREADPRIVATE";
376
 
377
  const char *a1, *a2;
378
  int standard;
379
 
380
  if (where == NULL)
381
    where = &gfc_current_locus;
382
 
383
  if (attr->pointer && attr->intent != INTENT_UNKNOWN)
384
    {
385
      a1 = pointer;
386
      a2 = intent;
387
      standard = GFC_STD_F2003;
388
      goto conflict_std;
389
    }
390
 
391
  /* Check for attributes not allowed in a BLOCK DATA.  */
392
  if (gfc_current_state () == COMP_BLOCK_DATA)
393
    {
394
      a1 = NULL;
395
 
396
      if (attr->in_namelist)
397
        a1 = in_namelist;
398
      if (attr->allocatable)
399
        a1 = allocatable;
400
      if (attr->external)
401
        a1 = external;
402
      if (attr->optional)
403
        a1 = optional;
404
      if (attr->access == ACCESS_PRIVATE)
405
        a1 = privat;
406
      if (attr->access == ACCESS_PUBLIC)
407
        a1 = publik;
408
      if (attr->intent != INTENT_UNKNOWN)
409
        a1 = intent;
410
 
411
      if (a1 != NULL)
412
        {
413
          gfc_error
414
            ("%s attribute not allowed in BLOCK DATA program unit at %L",
415
             a1, where);
416
          return FAILURE;
417
        }
418
    }
419
 
420
  if (attr->save == SAVE_EXPLICIT)
421
    {
422
      conf (dummy, save);
423
      conf (in_common, save);
424
      conf (result, save);
425
 
426
      switch (attr->flavor)
427
        {
428
          case FL_PROGRAM:
429
          case FL_BLOCK_DATA:
430
          case FL_MODULE:
431
          case FL_LABEL:
432
          case FL_DERIVED:
433
          case FL_PARAMETER:
434
            a1 = gfc_code2string (flavors, attr->flavor);
435
            a2 = save;
436
            goto conflict;
437
 
438
          case FL_PROCEDURE:
439
            /* Conflicts between SAVE and PROCEDURE will be checked at
440
               resolution stage, see "resolve_fl_procedure".  */
441
          case FL_VARIABLE:
442
          case FL_NAMELIST:
443
          default:
444
            break;
445
        }
446
    }
447
 
448
  conf (dummy, entry);
449
  conf (dummy, intrinsic);
450
  conf (dummy, threadprivate);
451
  conf (pointer, target);
452
  conf (pointer, intrinsic);
453
  conf (pointer, elemental);
454
  conf (allocatable, elemental);
455
 
456
  conf (target, external);
457
  conf (target, intrinsic);
458
 
459
  if (!attr->if_source)
460
    conf (external, dimension);   /* See Fortran 95's R504.  */
461
 
462
  conf (external, intrinsic);
463
  conf (entry, intrinsic);
464
 
465
  if ((attr->if_source == IFSRC_DECL && !attr->procedure) || attr->contained)
466
    conf (external, subroutine);
467
 
468
  if (attr->proc_pointer && gfc_notify_std (GFC_STD_F2003,
469
                            "Fortran 2003: Procedure pointer at %C") == FAILURE)
470
    return FAILURE;
471
 
472
  conf (allocatable, pointer);
473
  conf_std (allocatable, dummy, GFC_STD_F2003);
474
  conf_std (allocatable, function, GFC_STD_F2003);
475
  conf_std (allocatable, result, GFC_STD_F2003);
476
  conf (elemental, recursive);
477
 
478
  conf (in_common, dummy);
479
  conf (in_common, allocatable);
480
  conf (in_common, result);
481
 
482
  conf (dummy, result);
483
 
484
  conf (in_equivalence, use_assoc);
485
  conf (in_equivalence, dummy);
486
  conf (in_equivalence, target);
487
  conf (in_equivalence, pointer);
488
  conf (in_equivalence, function);
489
  conf (in_equivalence, result);
490
  conf (in_equivalence, entry);
491
  conf (in_equivalence, allocatable);
492
  conf (in_equivalence, threadprivate);
493
 
494
  conf (in_namelist, pointer);
495
  conf (in_namelist, allocatable);
496
 
497
  conf (entry, result);
498
 
499
  conf (function, subroutine);
500
 
501
  if (!function && !subroutine)
502
    conf (is_bind_c, dummy);
503
 
504
  conf (is_bind_c, cray_pointer);
505
  conf (is_bind_c, cray_pointee);
506
  conf (is_bind_c, allocatable);
507
  conf (is_bind_c, elemental);
508
 
509
  /* Need to also get volatile attr, according to 5.1 of F2003 draft.
510
     Parameter conflict caught below.  Also, value cannot be specified
511
     for a dummy procedure.  */
512
 
513
  /* Cray pointer/pointee conflicts.  */
514
  conf (cray_pointer, cray_pointee);
515
  conf (cray_pointer, dimension);
516
  conf (cray_pointer, pointer);
517
  conf (cray_pointer, target);
518
  conf (cray_pointer, allocatable);
519
  conf (cray_pointer, external);
520
  conf (cray_pointer, intrinsic);
521
  conf (cray_pointer, in_namelist);
522
  conf (cray_pointer, function);
523
  conf (cray_pointer, subroutine);
524
  conf (cray_pointer, entry);
525
 
526
  conf (cray_pointee, allocatable);
527
  conf (cray_pointee, intent);
528
  conf (cray_pointee, optional);
529
  conf (cray_pointee, dummy);
530
  conf (cray_pointee, target);
531
  conf (cray_pointee, intrinsic);
532
  conf (cray_pointee, pointer);
533
  conf (cray_pointee, entry);
534
  conf (cray_pointee, in_common);
535
  conf (cray_pointee, in_equivalence);
536
  conf (cray_pointee, threadprivate);
537
 
538
  conf (data, dummy);
539
  conf (data, function);
540
  conf (data, result);
541
  conf (data, allocatable);
542
  conf (data, use_assoc);
543
 
544
  conf (value, pointer)
545
  conf (value, allocatable)
546
  conf (value, subroutine)
547
  conf (value, function)
548
  conf (value, volatile_)
549
  conf (value, dimension)
550
  conf (value, external)
551
 
552
  if (attr->value
553
      && (attr->intent == INTENT_OUT || attr->intent == INTENT_INOUT))
554
    {
555
      a1 = value;
556
      a2 = attr->intent == INTENT_OUT ? intent_out : intent_inout;
557
      goto conflict;
558
    }
559
 
560
  conf (is_protected, intrinsic)
561
  conf (is_protected, external)
562
  conf (is_protected, in_common)
563
 
564
  conf (asynchronous, intrinsic)
565
  conf (asynchronous, external)
566
 
567
  conf (volatile_, intrinsic)
568
  conf (volatile_, external)
569
 
570
  if (attr->volatile_ && attr->intent == INTENT_IN)
571
    {
572
      a1 = volatile_;
573
      a2 = intent_in;
574
      goto conflict;
575
    }
576
 
577
  conf (procedure, allocatable)
578
  conf (procedure, dimension)
579
  conf (procedure, intrinsic)
580
  conf (procedure, is_protected)
581
  conf (procedure, target)
582
  conf (procedure, value)
583
  conf (procedure, volatile_)
584
  conf (procedure, asynchronous)
585
  conf (procedure, entry)
586
 
587
  a1 = gfc_code2string (flavors, attr->flavor);
588
 
589
  if (attr->in_namelist
590
      && attr->flavor != FL_VARIABLE
591
      && attr->flavor != FL_PROCEDURE
592
      && attr->flavor != FL_UNKNOWN)
593
    {
594
      a2 = in_namelist;
595
      goto conflict;
596
    }
597
 
598
  switch (attr->flavor)
599
    {
600
    case FL_PROGRAM:
601
    case FL_BLOCK_DATA:
602
    case FL_MODULE:
603
    case FL_LABEL:
604
      conf2 (dimension);
605
      conf2 (dummy);
606
      conf2 (volatile_);
607
      conf2 (asynchronous);
608
      conf2 (pointer);
609
      conf2 (is_protected);
610
      conf2 (target);
611
      conf2 (external);
612
      conf2 (intrinsic);
613
      conf2 (allocatable);
614
      conf2 (result);
615
      conf2 (in_namelist);
616
      conf2 (optional);
617
      conf2 (function);
618
      conf2 (subroutine);
619
      conf2 (threadprivate);
620
 
621
      if (attr->access == ACCESS_PUBLIC || attr->access == ACCESS_PRIVATE)
622
        {
623
          a2 = attr->access == ACCESS_PUBLIC ? publik : privat;
624
          gfc_error ("%s attribute applied to %s %s at %L", a2, a1,
625
            name, where);
626
          return FAILURE;
627
        }
628
 
629
      if (attr->is_bind_c)
630
        {
631
          gfc_error_now ("BIND(C) applied to %s %s at %L", a1, name, where);
632
          return FAILURE;
633
        }
634
 
635
      break;
636
 
637
    case FL_VARIABLE:
638
      break;
639
 
640
    case FL_NAMELIST:
641
      conf2 (result);
642
      break;
643
 
644
    case FL_PROCEDURE:
645
      /* Conflicts with INTENT, SAVE and RESULT will be checked
646
         at resolution stage, see "resolve_fl_procedure".  */
647
 
648
      if (attr->subroutine)
649
        {
650
          a1 = subroutine;
651
          conf2 (target);
652
          conf2 (allocatable);
653
          conf2 (volatile_);
654
          conf2 (asynchronous);
655
          conf2 (in_namelist);
656
          conf2 (dimension);
657
          conf2 (function);
658
          conf2 (threadprivate);
659
        }
660
 
661
      if (!attr->proc_pointer)
662
        conf2 (in_common);
663
 
664
      switch (attr->proc)
665
        {
666
        case PROC_ST_FUNCTION:
667
          conf2 (dummy);
668
          break;
669
 
670
        case PROC_MODULE:
671
          conf2 (dummy);
672
          break;
673
 
674
        case PROC_DUMMY:
675
          conf2 (result);
676
          conf2 (threadprivate);
677
          break;
678
 
679
        default:
680
          break;
681
        }
682
 
683
      break;
684
 
685
    case FL_DERIVED:
686
      conf2 (dummy);
687
      conf2 (pointer);
688
      conf2 (target);
689
      conf2 (external);
690
      conf2 (intrinsic);
691
      conf2 (allocatable);
692
      conf2 (optional);
693
      conf2 (entry);
694
      conf2 (function);
695
      conf2 (subroutine);
696
      conf2 (threadprivate);
697
      conf2 (result);
698
 
699
      if (attr->intent != INTENT_UNKNOWN)
700
        {
701
          a2 = intent;
702
          goto conflict;
703
        }
704
      break;
705
 
706
    case FL_PARAMETER:
707
      conf2 (external);
708
      conf2 (intrinsic);
709
      conf2 (optional);
710
      conf2 (allocatable);
711
      conf2 (function);
712
      conf2 (subroutine);
713
      conf2 (entry);
714
      conf2 (pointer);
715
      conf2 (is_protected);
716
      conf2 (target);
717
      conf2 (dummy);
718
      conf2 (in_common);
719
      conf2 (value);
720
      conf2 (volatile_);
721
      conf2 (asynchronous);
722
      conf2 (threadprivate);
723
      conf2 (value);
724
      conf2 (is_bind_c);
725
      conf2 (result);
726
      break;
727
 
728
    default:
729
      break;
730
    }
731
 
732
  return SUCCESS;
733
 
734
conflict:
735
  if (name == NULL)
736
    gfc_error ("%s attribute conflicts with %s attribute at %L",
737
               a1, a2, where);
738
  else
739
    gfc_error ("%s attribute conflicts with %s attribute in '%s' at %L",
740
               a1, a2, name, where);
741
 
742
  return FAILURE;
743
 
744
conflict_std:
745
  if (name == NULL)
746
    {
747
      return gfc_notify_std (standard, "Fortran 2003: %s attribute "
748
                             "with %s attribute at %L", a1, a2,
749
                             where);
750
    }
751
  else
752
    {
753
      return gfc_notify_std (standard, "Fortran 2003: %s attribute "
754
                             "with %s attribute in '%s' at %L",
755
                             a1, a2, name, where);
756
    }
757
}
758
 
759
#undef conf
760
#undef conf2
761
#undef conf_std
762
 
763
 
764
/* Mark a symbol as referenced.  */
765
 
766
void
767
gfc_set_sym_referenced (gfc_symbol *sym)
768
{
769
 
770
  if (sym->attr.referenced)
771
    return;
772
 
773
  sym->attr.referenced = 1;
774
 
775
  /* Remember which order dummy variables are accessed in.  */
776
  if (sym->attr.dummy)
777
    sym->dummy_order = next_dummy_order++;
778
}
779
 
780
 
781
/* Common subroutine called by attribute changing subroutines in order
782
   to prevent them from changing a symbol that has been
783
   use-associated.  Returns zero if it is OK to change the symbol,
784
   nonzero if not.  */
785
 
786
static int
787
check_used (symbol_attribute *attr, const char *name, locus *where)
788
{
789
 
790
  if (attr->use_assoc == 0)
791
    return 0;
792
 
793
  if (where == NULL)
794
    where = &gfc_current_locus;
795
 
796
  if (name == NULL)
797
    gfc_error ("Cannot change attributes of USE-associated symbol at %L",
798
               where);
799
  else
800
    gfc_error ("Cannot change attributes of USE-associated symbol %s at %L",
801
               name, where);
802
 
803
  return 1;
804
}
805
 
806
 
807
/* Generate an error because of a duplicate attribute.  */
808
 
809
static void
810
duplicate_attr (const char *attr, locus *where)
811
{
812
 
813
  if (where == NULL)
814
    where = &gfc_current_locus;
815
 
816
  gfc_error ("Duplicate %s attribute specified at %L", attr, where);
817
}
818
 
819
 
820
gfc_try
821
gfc_add_ext_attribute (symbol_attribute *attr, ext_attr_id_t ext_attr,
822
                       locus *where ATTRIBUTE_UNUSED)
823
{
824
  attr->ext_attr |= 1 << ext_attr;
825
  return SUCCESS;
826
}
827
 
828
 
829
/* Called from decl.c (attr_decl1) to check attributes, when declared
830
   separately.  */
831
 
832
gfc_try
833
gfc_add_attribute (symbol_attribute *attr, locus *where)
834
{
835
  if (check_used (attr, NULL, where))
836
    return FAILURE;
837
 
838
  return check_conflict (attr, NULL, where);
839
}
840
 
841
 
842
gfc_try
843
gfc_add_allocatable (symbol_attribute *attr, locus *where)
844
{
845
 
846
  if (check_used (attr, NULL, where))
847
    return FAILURE;
848
 
849
  if (attr->allocatable)
850
    {
851
      duplicate_attr ("ALLOCATABLE", where);
852
      return FAILURE;
853
    }
854
 
855
  if (attr->flavor == FL_PROCEDURE && attr->if_source == IFSRC_IFBODY
856
      && gfc_find_state (COMP_INTERFACE) == FAILURE)
857
    {
858
      gfc_error ("ALLOCATABLE specified outside of INTERFACE body at %L",
859
                 where);
860
      return FAILURE;
861
    }
862
 
863
  attr->allocatable = 1;
864
  return check_conflict (attr, NULL, where);
865
}
866
 
867
 
868
gfc_try
869
gfc_add_dimension (symbol_attribute *attr, const char *name, locus *where)
870
{
871
 
872
  if (check_used (attr, name, where))
873
    return FAILURE;
874
 
875
  if (attr->dimension)
876
    {
877
      duplicate_attr ("DIMENSION", where);
878
      return FAILURE;
879
    }
880
 
881
  if (attr->flavor == FL_PROCEDURE && attr->if_source == IFSRC_IFBODY
882
      && gfc_find_state (COMP_INTERFACE) == FAILURE)
883
    {
884
      gfc_error ("DIMENSION specified for '%s' outside its INTERFACE body "
885
                 "at %L", name, where);
886
      return FAILURE;
887
    }
888
 
889
  attr->dimension = 1;
890
  return check_conflict (attr, name, where);
891
}
892
 
893
 
894
gfc_try
895
gfc_add_external (symbol_attribute *attr, locus *where)
896
{
897
 
898
  if (check_used (attr, NULL, where))
899
    return FAILURE;
900
 
901
  if (attr->external)
902
    {
903
      duplicate_attr ("EXTERNAL", where);
904
      return FAILURE;
905
    }
906
 
907
  if (attr->pointer && attr->if_source != IFSRC_IFBODY)
908
    {
909
      attr->pointer = 0;
910
      attr->proc_pointer = 1;
911
    }
912
 
913
  attr->external = 1;
914
 
915
  return check_conflict (attr, NULL, where);
916
}
917
 
918
 
919
gfc_try
920
gfc_add_intrinsic (symbol_attribute *attr, locus *where)
921
{
922
 
923
  if (check_used (attr, NULL, where))
924
    return FAILURE;
925
 
926
  if (attr->intrinsic)
927
    {
928
      duplicate_attr ("INTRINSIC", where);
929
      return FAILURE;
930
    }
931
 
932
  attr->intrinsic = 1;
933
 
934
  return check_conflict (attr, NULL, where);
935
}
936
 
937
 
938
gfc_try
939
gfc_add_optional (symbol_attribute *attr, locus *where)
940
{
941
 
942
  if (check_used (attr, NULL, where))
943
    return FAILURE;
944
 
945
  if (attr->optional)
946
    {
947
      duplicate_attr ("OPTIONAL", where);
948
      return FAILURE;
949
    }
950
 
951
  attr->optional = 1;
952
  return check_conflict (attr, NULL, where);
953
}
954
 
955
 
956
gfc_try
957
gfc_add_pointer (symbol_attribute *attr, locus *where)
958
{
959
 
960
  if (check_used (attr, NULL, where))
961
    return FAILURE;
962
 
963
  if (attr->pointer && !(attr->if_source == IFSRC_IFBODY
964
      && gfc_find_state (COMP_INTERFACE) == FAILURE))
965
    {
966
      duplicate_attr ("POINTER", where);
967
      return FAILURE;
968
    }
969
 
970
  if (attr->procedure || (attr->external && attr->if_source != IFSRC_IFBODY)
971
      || (attr->if_source == IFSRC_IFBODY
972
      && gfc_find_state (COMP_INTERFACE) == FAILURE))
973
    attr->proc_pointer = 1;
974
  else
975
    attr->pointer = 1;
976
 
977
  return check_conflict (attr, NULL, where);
978
}
979
 
980
 
981
gfc_try
982
gfc_add_cray_pointer (symbol_attribute *attr, locus *where)
983
{
984
 
985
  if (check_used (attr, NULL, where))
986
    return FAILURE;
987
 
988
  attr->cray_pointer = 1;
989
  return check_conflict (attr, NULL, where);
990
}
991
 
992
 
993
gfc_try
994
gfc_add_cray_pointee (symbol_attribute *attr, locus *where)
995
{
996
 
997
  if (check_used (attr, NULL, where))
998
    return FAILURE;
999
 
1000
  if (attr->cray_pointee)
1001
    {
1002
      gfc_error ("Cray Pointee at %L appears in multiple pointer()"
1003
                 " statements", where);
1004
      return FAILURE;
1005
    }
1006
 
1007
  attr->cray_pointee = 1;
1008
  return check_conflict (attr, NULL, where);
1009
}
1010
 
1011
 
1012
gfc_try
1013
gfc_add_protected (symbol_attribute *attr, const char *name, locus *where)
1014
{
1015
  if (check_used (attr, name, where))
1016
    return FAILURE;
1017
 
1018
  if (attr->is_protected)
1019
    {
1020
        if (gfc_notify_std (GFC_STD_LEGACY,
1021
                            "Duplicate PROTECTED attribute specified at %L",
1022
                            where)
1023
            == FAILURE)
1024
          return FAILURE;
1025
    }
1026
 
1027
  attr->is_protected = 1;
1028
  return check_conflict (attr, name, where);
1029
}
1030
 
1031
 
1032
gfc_try
1033
gfc_add_result (symbol_attribute *attr, const char *name, locus *where)
1034
{
1035
 
1036
  if (check_used (attr, name, where))
1037
    return FAILURE;
1038
 
1039
  attr->result = 1;
1040
  return check_conflict (attr, name, where);
1041
}
1042
 
1043
 
1044
gfc_try
1045
gfc_add_save (symbol_attribute *attr, const char *name, locus *where)
1046
{
1047
 
1048
  if (check_used (attr, name, where))
1049
    return FAILURE;
1050
 
1051
  if (gfc_pure (NULL))
1052
    {
1053
      gfc_error
1054
        ("SAVE attribute at %L cannot be specified in a PURE procedure",
1055
         where);
1056
      return FAILURE;
1057
    }
1058
 
1059
  if (attr->save == SAVE_EXPLICIT && !attr->vtab)
1060
    {
1061
        if (gfc_notify_std (GFC_STD_LEGACY,
1062
                            "Duplicate SAVE attribute specified at %L",
1063
                            where)
1064
            == FAILURE)
1065
          return FAILURE;
1066
    }
1067
 
1068
  attr->save = SAVE_EXPLICIT;
1069
  return check_conflict (attr, name, where);
1070
}
1071
 
1072
 
1073
gfc_try
1074
gfc_add_value (symbol_attribute *attr, const char *name, locus *where)
1075
{
1076
 
1077
  if (check_used (attr, name, where))
1078
    return FAILURE;
1079
 
1080
  if (attr->value)
1081
    {
1082
        if (gfc_notify_std (GFC_STD_LEGACY,
1083
                            "Duplicate VALUE attribute specified at %L",
1084
                            where)
1085
            == FAILURE)
1086
          return FAILURE;
1087
    }
1088
 
1089
  attr->value = 1;
1090
  return check_conflict (attr, name, where);
1091
}
1092
 
1093
 
1094
gfc_try
1095
gfc_add_volatile (symbol_attribute *attr, const char *name, locus *where)
1096
{
1097
  /* No check_used needed as 11.2.1 of the F2003 standard allows
1098
     that the local identifier made accessible by a use statement can be
1099
     given a VOLATILE attribute.  */
1100
 
1101
  if (attr->volatile_ && attr->volatile_ns == gfc_current_ns)
1102
    if (gfc_notify_std (GFC_STD_LEGACY,
1103
                        "Duplicate VOLATILE attribute specified at %L", where)
1104
        == FAILURE)
1105
      return FAILURE;
1106
 
1107
  attr->volatile_ = 1;
1108
  attr->volatile_ns = gfc_current_ns;
1109
  return check_conflict (attr, name, where);
1110
}
1111
 
1112
 
1113
gfc_try
1114
gfc_add_asynchronous (symbol_attribute *attr, const char *name, locus *where)
1115
{
1116
  /* No check_used needed as 11.2.1 of the F2003 standard allows
1117
     that the local identifier made accessible by a use statement can be
1118
     given a ASYNCHRONOUS attribute.  */
1119
 
1120
  if (attr->asynchronous && attr->asynchronous_ns == gfc_current_ns)
1121
    if (gfc_notify_std (GFC_STD_LEGACY,
1122
                        "Duplicate ASYNCHRONOUS attribute specified at %L",
1123
                        where) == FAILURE)
1124
      return FAILURE;
1125
 
1126
  attr->asynchronous = 1;
1127
  attr->asynchronous_ns = gfc_current_ns;
1128
  return check_conflict (attr, name, where);
1129
}
1130
 
1131
 
1132
gfc_try
1133
gfc_add_threadprivate (symbol_attribute *attr, const char *name, locus *where)
1134
{
1135
 
1136
  if (check_used (attr, name, where))
1137
    return FAILURE;
1138
 
1139
  if (attr->threadprivate)
1140
    {
1141
      duplicate_attr ("THREADPRIVATE", where);
1142
      return FAILURE;
1143
    }
1144
 
1145
  attr->threadprivate = 1;
1146
  return check_conflict (attr, name, where);
1147
}
1148
 
1149
 
1150
gfc_try
1151
gfc_add_target (symbol_attribute *attr, locus *where)
1152
{
1153
 
1154
  if (check_used (attr, NULL, where))
1155
    return FAILURE;
1156
 
1157
  if (attr->target)
1158
    {
1159
      duplicate_attr ("TARGET", where);
1160
      return FAILURE;
1161
    }
1162
 
1163
  attr->target = 1;
1164
  return check_conflict (attr, NULL, where);
1165
}
1166
 
1167
 
1168
gfc_try
1169
gfc_add_dummy (symbol_attribute *attr, const char *name, locus *where)
1170
{
1171
 
1172
  if (check_used (attr, name, where))
1173
    return FAILURE;
1174
 
1175
  /* Duplicate dummy arguments are allowed due to ENTRY statements.  */
1176
  attr->dummy = 1;
1177
  return check_conflict (attr, name, where);
1178
}
1179
 
1180
 
1181
gfc_try
1182
gfc_add_in_common (symbol_attribute *attr, const char *name, locus *where)
1183
{
1184
 
1185
  if (check_used (attr, name, where))
1186
    return FAILURE;
1187
 
1188
  /* Duplicate attribute already checked for.  */
1189
  attr->in_common = 1;
1190
  return check_conflict (attr, name, where);
1191
}
1192
 
1193
 
1194
gfc_try
1195
gfc_add_in_equivalence (symbol_attribute *attr, const char *name, locus *where)
1196
{
1197
 
1198
  /* Duplicate attribute already checked for.  */
1199
  attr->in_equivalence = 1;
1200
  if (check_conflict (attr, name, where) == FAILURE)
1201
    return FAILURE;
1202
 
1203
  if (attr->flavor == FL_VARIABLE)
1204
    return SUCCESS;
1205
 
1206
  return gfc_add_flavor (attr, FL_VARIABLE, name, where);
1207
}
1208
 
1209
 
1210
gfc_try
1211
gfc_add_data (symbol_attribute *attr, const char *name, locus *where)
1212
{
1213
 
1214
  if (check_used (attr, name, where))
1215
    return FAILURE;
1216
 
1217
  attr->data = 1;
1218
  return check_conflict (attr, name, where);
1219
}
1220
 
1221
 
1222
gfc_try
1223
gfc_add_in_namelist (symbol_attribute *attr, const char *name, locus *where)
1224
{
1225
 
1226
  attr->in_namelist = 1;
1227
  return check_conflict (attr, name, where);
1228
}
1229
 
1230
 
1231
gfc_try
1232
gfc_add_sequence (symbol_attribute *attr, const char *name, locus *where)
1233
{
1234
 
1235
  if (check_used (attr, name, where))
1236
    return FAILURE;
1237
 
1238
  attr->sequence = 1;
1239
  return check_conflict (attr, name, where);
1240
}
1241
 
1242
 
1243
gfc_try
1244
gfc_add_elemental (symbol_attribute *attr, locus *where)
1245
{
1246
 
1247
  if (check_used (attr, NULL, where))
1248
    return FAILURE;
1249
 
1250
  if (attr->elemental)
1251
    {
1252
      duplicate_attr ("ELEMENTAL", where);
1253
      return FAILURE;
1254
    }
1255
 
1256
  attr->elemental = 1;
1257
  return check_conflict (attr, NULL, where);
1258
}
1259
 
1260
 
1261
gfc_try
1262
gfc_add_pure (symbol_attribute *attr, locus *where)
1263
{
1264
 
1265
  if (check_used (attr, NULL, where))
1266
    return FAILURE;
1267
 
1268
  if (attr->pure)
1269
    {
1270
      duplicate_attr ("PURE", where);
1271
      return FAILURE;
1272
    }
1273
 
1274
  attr->pure = 1;
1275
  return check_conflict (attr, NULL, where);
1276
}
1277
 
1278
 
1279
gfc_try
1280
gfc_add_recursive (symbol_attribute *attr, locus *where)
1281
{
1282
 
1283
  if (check_used (attr, NULL, where))
1284
    return FAILURE;
1285
 
1286
  if (attr->recursive)
1287
    {
1288
      duplicate_attr ("RECURSIVE", where);
1289
      return FAILURE;
1290
    }
1291
 
1292
  attr->recursive = 1;
1293
  return check_conflict (attr, NULL, where);
1294
}
1295
 
1296
 
1297
gfc_try
1298
gfc_add_entry (symbol_attribute *attr, const char *name, locus *where)
1299
{
1300
 
1301
  if (check_used (attr, name, where))
1302
    return FAILURE;
1303
 
1304
  if (attr->entry)
1305
    {
1306
      duplicate_attr ("ENTRY", where);
1307
      return FAILURE;
1308
    }
1309
 
1310
  attr->entry = 1;
1311
  return check_conflict (attr, name, where);
1312
}
1313
 
1314
 
1315
gfc_try
1316
gfc_add_function (symbol_attribute *attr, const char *name, locus *where)
1317
{
1318
 
1319
  if (attr->flavor != FL_PROCEDURE
1320
      && gfc_add_flavor (attr, FL_PROCEDURE, name, where) == FAILURE)
1321
    return FAILURE;
1322
 
1323
  attr->function = 1;
1324
  return check_conflict (attr, name, where);
1325
}
1326
 
1327
 
1328
gfc_try
1329
gfc_add_subroutine (symbol_attribute *attr, const char *name, locus *where)
1330
{
1331
 
1332
  if (attr->flavor != FL_PROCEDURE
1333
      && gfc_add_flavor (attr, FL_PROCEDURE, name, where) == FAILURE)
1334
    return FAILURE;
1335
 
1336
  attr->subroutine = 1;
1337
  return check_conflict (attr, name, where);
1338
}
1339
 
1340
 
1341
gfc_try
1342
gfc_add_generic (symbol_attribute *attr, const char *name, locus *where)
1343
{
1344
 
1345
  if (attr->flavor != FL_PROCEDURE
1346
      && gfc_add_flavor (attr, FL_PROCEDURE, name, where) == FAILURE)
1347
    return FAILURE;
1348
 
1349
  attr->generic = 1;
1350
  return check_conflict (attr, name, where);
1351
}
1352
 
1353
 
1354
gfc_try
1355
gfc_add_proc (symbol_attribute *attr, const char *name, locus *where)
1356
{
1357
 
1358
  if (check_used (attr, NULL, where))
1359
    return FAILURE;
1360
 
1361
  if (attr->flavor != FL_PROCEDURE
1362
      && gfc_add_flavor (attr, FL_PROCEDURE, name, where) == FAILURE)
1363
    return FAILURE;
1364
 
1365
  if (attr->procedure)
1366
    {
1367
      duplicate_attr ("PROCEDURE", where);
1368
      return FAILURE;
1369
    }
1370
 
1371
  attr->procedure = 1;
1372
 
1373
  return check_conflict (attr, NULL, where);
1374
}
1375
 
1376
 
1377
gfc_try
1378
gfc_add_abstract (symbol_attribute* attr, locus* where)
1379
{
1380
  if (attr->abstract)
1381
    {
1382
      duplicate_attr ("ABSTRACT", where);
1383
      return FAILURE;
1384
    }
1385
 
1386
  attr->abstract = 1;
1387
  return SUCCESS;
1388
}
1389
 
1390
 
1391
/* Flavors are special because some flavors are not what Fortran
1392
   considers attributes and can be reaffirmed multiple times.  */
1393
 
1394
gfc_try
1395
gfc_add_flavor (symbol_attribute *attr, sym_flavor f, const char *name,
1396
                locus *where)
1397
{
1398
 
1399
  if ((f == FL_PROGRAM || f == FL_BLOCK_DATA || f == FL_MODULE
1400
       || f == FL_PARAMETER || f == FL_LABEL || f == FL_DERIVED
1401
       || f == FL_NAMELIST) && check_used (attr, name, where))
1402
    return FAILURE;
1403
 
1404
  if (attr->flavor == f && f == FL_VARIABLE)
1405
    return SUCCESS;
1406
 
1407
  if (attr->flavor != FL_UNKNOWN)
1408
    {
1409
      if (where == NULL)
1410
        where = &gfc_current_locus;
1411
 
1412
      if (name)
1413
        gfc_error ("%s attribute of '%s' conflicts with %s attribute at %L",
1414
                   gfc_code2string (flavors, attr->flavor), name,
1415
                   gfc_code2string (flavors, f), where);
1416
      else
1417
        gfc_error ("%s attribute conflicts with %s attribute at %L",
1418
                   gfc_code2string (flavors, attr->flavor),
1419
                   gfc_code2string (flavors, f), where);
1420
 
1421
      return FAILURE;
1422
    }
1423
 
1424
  attr->flavor = f;
1425
 
1426
  return check_conflict (attr, name, where);
1427
}
1428
 
1429
 
1430
gfc_try
1431
gfc_add_procedure (symbol_attribute *attr, procedure_type t,
1432
                   const char *name, locus *where)
1433
{
1434
 
1435
  if (check_used (attr, name, where))
1436
    return FAILURE;
1437
 
1438
  if (attr->flavor != FL_PROCEDURE
1439
      && gfc_add_flavor (attr, FL_PROCEDURE, name, where) == FAILURE)
1440
    return FAILURE;
1441
 
1442
  if (where == NULL)
1443
    where = &gfc_current_locus;
1444
 
1445
  if (attr->proc != PROC_UNKNOWN)
1446
    {
1447
      gfc_error ("%s procedure at %L is already declared as %s procedure",
1448
                 gfc_code2string (procedures, t), where,
1449
                 gfc_code2string (procedures, attr->proc));
1450
 
1451
      return FAILURE;
1452
    }
1453
 
1454
  attr->proc = t;
1455
 
1456
  /* Statement functions are always scalar and functions.  */
1457
  if (t == PROC_ST_FUNCTION
1458
      && ((!attr->function && gfc_add_function (attr, name, where) == FAILURE)
1459
          || attr->dimension))
1460
    return FAILURE;
1461
 
1462
  return check_conflict (attr, name, where);
1463
}
1464
 
1465
 
1466
gfc_try
1467
gfc_add_intent (symbol_attribute *attr, sym_intent intent, locus *where)
1468
{
1469
 
1470
  if (check_used (attr, NULL, where))
1471
    return FAILURE;
1472
 
1473
  if (attr->intent == INTENT_UNKNOWN)
1474
    {
1475
      attr->intent = intent;
1476
      return check_conflict (attr, NULL, where);
1477
    }
1478
 
1479
  if (where == NULL)
1480
    where = &gfc_current_locus;
1481
 
1482
  gfc_error ("INTENT (%s) conflicts with INTENT(%s) at %L",
1483
             gfc_intent_string (attr->intent),
1484
             gfc_intent_string (intent), where);
1485
 
1486
  return FAILURE;
1487
}
1488
 
1489
 
1490
/* No checks for use-association in public and private statements.  */
1491
 
1492
gfc_try
1493
gfc_add_access (symbol_attribute *attr, gfc_access access,
1494
                const char *name, locus *where)
1495
{
1496
 
1497
  if (attr->access == ACCESS_UNKNOWN
1498
        || (attr->use_assoc && attr->access != ACCESS_PRIVATE))
1499
    {
1500
      attr->access = access;
1501
      return check_conflict (attr, name, where);
1502
    }
1503
 
1504
  if (where == NULL)
1505
    where = &gfc_current_locus;
1506
  gfc_error ("ACCESS specification at %L was already specified", where);
1507
 
1508
  return FAILURE;
1509
}
1510
 
1511
 
1512
/* Set the is_bind_c field for the given symbol_attribute.  */
1513
 
1514
gfc_try
1515
gfc_add_is_bind_c (symbol_attribute *attr, const char *name, locus *where,
1516
                   int is_proc_lang_bind_spec)
1517
{
1518
 
1519
  if (is_proc_lang_bind_spec == 0 && attr->flavor == FL_PROCEDURE)
1520
    gfc_error_now ("BIND(C) attribute at %L can only be used for "
1521
                   "variables or common blocks", where);
1522
  else if (attr->is_bind_c)
1523
    gfc_error_now ("Duplicate BIND attribute specified at %L", where);
1524
  else
1525
    attr->is_bind_c = 1;
1526
 
1527
  if (where == NULL)
1528
    where = &gfc_current_locus;
1529
 
1530
  if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: BIND(C) at %L", where)
1531
      == FAILURE)
1532
    return FAILURE;
1533
 
1534
  return check_conflict (attr, name, where);
1535
}
1536
 
1537
 
1538
/* Set the extension field for the given symbol_attribute.  */
1539
 
1540
gfc_try
1541
gfc_add_extension (symbol_attribute *attr, locus *where)
1542
{
1543
  if (where == NULL)
1544
    where = &gfc_current_locus;
1545
 
1546
  if (attr->extension)
1547
    gfc_error_now ("Duplicate EXTENDS attribute specified at %L", where);
1548
  else
1549
    attr->extension = 1;
1550
 
1551
  if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: EXTENDS at %L", where)
1552
        == FAILURE)
1553
    return FAILURE;
1554
 
1555
  return SUCCESS;
1556
}
1557
 
1558
 
1559
gfc_try
1560
gfc_add_explicit_interface (gfc_symbol *sym, ifsrc source,
1561
                            gfc_formal_arglist * formal, locus *where)
1562
{
1563
 
1564
  if (check_used (&sym->attr, sym->name, where))
1565
    return FAILURE;
1566
 
1567
  if (where == NULL)
1568
    where = &gfc_current_locus;
1569
 
1570
  if (sym->attr.if_source != IFSRC_UNKNOWN
1571
      && sym->attr.if_source != IFSRC_DECL)
1572
    {
1573
      gfc_error ("Symbol '%s' at %L already has an explicit interface",
1574
                 sym->name, where);
1575
      return FAILURE;
1576
    }
1577
 
1578
  if (source == IFSRC_IFBODY && (sym->attr.dimension || sym->attr.allocatable))
1579
    {
1580
      gfc_error ("'%s' at %L has attributes specified outside its INTERFACE "
1581
                 "body", sym->name, where);
1582
      return FAILURE;
1583
    }
1584
 
1585
  sym->formal = formal;
1586
  sym->attr.if_source = source;
1587
 
1588
  return SUCCESS;
1589
}
1590
 
1591
 
1592
/* Add a type to a symbol.  */
1593
 
1594
gfc_try
1595
gfc_add_type (gfc_symbol *sym, gfc_typespec *ts, locus *where)
1596
{
1597
  sym_flavor flavor;
1598
  bt type;
1599
 
1600
  if (where == NULL)
1601
    where = &gfc_current_locus;
1602
 
1603
  if (sym->result)
1604
    type = sym->result->ts.type;
1605
  else
1606
    type = sym->ts.type;
1607
 
1608
  if (sym->attr.result && type == BT_UNKNOWN && sym->ns->proc_name)
1609
    type = sym->ns->proc_name->ts.type;
1610
 
1611
  if (type != BT_UNKNOWN && !(sym->attr.function && sym->attr.implicit_type))
1612
    {
1613
      gfc_error ("Symbol '%s' at %L already has basic type of %s", sym->name,
1614
                 where, gfc_basic_typename (type));
1615
      return FAILURE;
1616
    }
1617
 
1618
  if (sym->attr.procedure && sym->ts.interface)
1619
    {
1620
      gfc_error ("Procedure '%s' at %L may not have basic type of %s",
1621
                 sym->name, where, gfc_basic_typename (ts->type));
1622
      return FAILURE;
1623
    }
1624
 
1625
  flavor = sym->attr.flavor;
1626
 
1627
  if (flavor == FL_PROGRAM || flavor == FL_BLOCK_DATA || flavor == FL_MODULE
1628
      || flavor == FL_LABEL
1629
      || (flavor == FL_PROCEDURE && sym->attr.subroutine)
1630
      || flavor == FL_DERIVED || flavor == FL_NAMELIST)
1631
    {
1632
      gfc_error ("Symbol '%s' at %L cannot have a type", sym->name, where);
1633
      return FAILURE;
1634
    }
1635
 
1636
  sym->ts = *ts;
1637
  return SUCCESS;
1638
}
1639
 
1640
 
1641
/* Clears all attributes.  */
1642
 
1643
void
1644
gfc_clear_attr (symbol_attribute *attr)
1645
{
1646
  memset (attr, 0, sizeof (symbol_attribute));
1647
}
1648
 
1649
 
1650
/* Check for missing attributes in the new symbol.  Currently does
1651
   nothing, but it's not clear that it is unnecessary yet.  */
1652
 
1653
gfc_try
1654
gfc_missing_attr (symbol_attribute *attr ATTRIBUTE_UNUSED,
1655
                  locus *where ATTRIBUTE_UNUSED)
1656
{
1657
 
1658
  return SUCCESS;
1659
}
1660
 
1661
 
1662
/* Copy an attribute to a symbol attribute, bit by bit.  Some
1663
   attributes have a lot of side-effects but cannot be present given
1664
   where we are called from, so we ignore some bits.  */
1665
 
1666
gfc_try
1667
gfc_copy_attr (symbol_attribute *dest, symbol_attribute *src, locus *where)
1668
{
1669
  int is_proc_lang_bind_spec;
1670
 
1671
  /* In line with the other attributes, we only add bits but do not remove
1672
     them; cf. also PR 41034.  */
1673
  dest->ext_attr |= src->ext_attr;
1674
 
1675
  if (src->allocatable && gfc_add_allocatable (dest, where) == FAILURE)
1676
    goto fail;
1677
 
1678
  if (src->dimension && gfc_add_dimension (dest, NULL, where) == FAILURE)
1679
    goto fail;
1680
  if (src->optional && gfc_add_optional (dest, where) == FAILURE)
1681
    goto fail;
1682
  if (src->pointer && gfc_add_pointer (dest, where) == FAILURE)
1683
    goto fail;
1684
  if (src->is_protected && gfc_add_protected (dest, NULL, where) == FAILURE)
1685
    goto fail;
1686
  if (src->save && gfc_add_save (dest, NULL, where) == FAILURE)
1687
    goto fail;
1688
  if (src->value && gfc_add_value (dest, NULL, where) == FAILURE)
1689
    goto fail;
1690
  if (src->volatile_ && gfc_add_volatile (dest, NULL, where) == FAILURE)
1691
    goto fail;
1692
  if (src->asynchronous && gfc_add_asynchronous (dest, NULL, where) == FAILURE)
1693
    goto fail;
1694
  if (src->threadprivate
1695
      && gfc_add_threadprivate (dest, NULL, where) == FAILURE)
1696
    goto fail;
1697
  if (src->target && gfc_add_target (dest, where) == FAILURE)
1698
    goto fail;
1699
  if (src->dummy && gfc_add_dummy (dest, NULL, where) == FAILURE)
1700
    goto fail;
1701
  if (src->result && gfc_add_result (dest, NULL, where) == FAILURE)
1702
    goto fail;
1703
  if (src->entry)
1704
    dest->entry = 1;
1705
 
1706
  if (src->in_namelist && gfc_add_in_namelist (dest, NULL, where) == FAILURE)
1707
    goto fail;
1708
 
1709
  if (src->in_common && gfc_add_in_common (dest, NULL, where) == FAILURE)
1710
    goto fail;
1711
 
1712
  if (src->generic && gfc_add_generic (dest, NULL, where) == FAILURE)
1713
    goto fail;
1714
  if (src->function && gfc_add_function (dest, NULL, where) == FAILURE)
1715
    goto fail;
1716
  if (src->subroutine && gfc_add_subroutine (dest, NULL, where) == FAILURE)
1717
    goto fail;
1718
 
1719
  if (src->sequence && gfc_add_sequence (dest, NULL, where) == FAILURE)
1720
    goto fail;
1721
  if (src->elemental && gfc_add_elemental (dest, where) == FAILURE)
1722
    goto fail;
1723
  if (src->pure && gfc_add_pure (dest, where) == FAILURE)
1724
    goto fail;
1725
  if (src->recursive && gfc_add_recursive (dest, where) == FAILURE)
1726
    goto fail;
1727
 
1728
  if (src->flavor != FL_UNKNOWN
1729
      && gfc_add_flavor (dest, src->flavor, NULL, where) == FAILURE)
1730
    goto fail;
1731
 
1732
  if (src->intent != INTENT_UNKNOWN
1733
      && gfc_add_intent (dest, src->intent, where) == FAILURE)
1734
    goto fail;
1735
 
1736
  if (src->access != ACCESS_UNKNOWN
1737
      && gfc_add_access (dest, src->access, NULL, where) == FAILURE)
1738
    goto fail;
1739
 
1740
  if (gfc_missing_attr (dest, where) == FAILURE)
1741
    goto fail;
1742
 
1743
  if (src->cray_pointer && gfc_add_cray_pointer (dest, where) == FAILURE)
1744
    goto fail;
1745
  if (src->cray_pointee && gfc_add_cray_pointee (dest, where) == FAILURE)
1746
    goto fail;
1747
 
1748
  is_proc_lang_bind_spec = (src->flavor == FL_PROCEDURE ? 1 : 0);
1749
  if (src->is_bind_c
1750
      && gfc_add_is_bind_c (dest, NULL, where, is_proc_lang_bind_spec)
1751
         != SUCCESS)
1752
    return FAILURE;
1753
 
1754
  if (src->is_c_interop)
1755
    dest->is_c_interop = 1;
1756
  if (src->is_iso_c)
1757
    dest->is_iso_c = 1;
1758
 
1759
  if (src->external && gfc_add_external (dest, where) == FAILURE)
1760
    goto fail;
1761
  if (src->intrinsic && gfc_add_intrinsic (dest, where) == FAILURE)
1762
    goto fail;
1763
  if (src->proc_pointer)
1764
    dest->proc_pointer = 1;
1765
 
1766
  return SUCCESS;
1767
 
1768
fail:
1769
  return FAILURE;
1770
}
1771
 
1772
 
1773
/************** Component name management ************/
1774
 
1775
/* Component names of a derived type form their own little namespaces
1776
   that are separate from all other spaces.  The space is composed of
1777
   a singly linked list of gfc_component structures whose head is
1778
   located in the parent symbol.  */
1779
 
1780
 
1781
/* Add a component name to a symbol.  The call fails if the name is
1782
   already present.  On success, the component pointer is modified to
1783
   point to the additional component structure.  */
1784
 
1785
gfc_try
1786
gfc_add_component (gfc_symbol *sym, const char *name,
1787
                   gfc_component **component)
1788
{
1789
  gfc_component *p, *tail;
1790
 
1791
  tail = NULL;
1792
 
1793
  for (p = sym->components; p; p = p->next)
1794
    {
1795
      if (strcmp (p->name, name) == 0)
1796
        {
1797
          gfc_error ("Component '%s' at %C already declared at %L",
1798
                     name, &p->loc);
1799
          return FAILURE;
1800
        }
1801
 
1802
      tail = p;
1803
    }
1804
 
1805
  if (sym->attr.extension
1806
        && gfc_find_component (sym->components->ts.u.derived, name, true, true))
1807
    {
1808
      gfc_error ("Component '%s' at %C already in the parent type "
1809
                 "at %L", name, &sym->components->ts.u.derived->declared_at);
1810
      return FAILURE;
1811
    }
1812
 
1813
  /* Allocate a new component.  */
1814
  p = gfc_get_component ();
1815
 
1816
  if (tail == NULL)
1817
    sym->components = p;
1818
  else
1819
    tail->next = p;
1820
 
1821
  p->name = gfc_get_string (name);
1822
  p->loc = gfc_current_locus;
1823
  p->ts.type = BT_UNKNOWN;
1824
 
1825
  *component = p;
1826
  return SUCCESS;
1827
}
1828
 
1829
 
1830
/* Recursive function to switch derived types of all symbol in a
1831
   namespace.  */
1832
 
1833
static void
1834
switch_types (gfc_symtree *st, gfc_symbol *from, gfc_symbol *to)
1835
{
1836
  gfc_symbol *sym;
1837
 
1838
  if (st == NULL)
1839
    return;
1840
 
1841
  sym = st->n.sym;
1842
  if (sym->ts.type == BT_DERIVED && sym->ts.u.derived == from)
1843
    sym->ts.u.derived = to;
1844
 
1845
  switch_types (st->left, from, to);
1846
  switch_types (st->right, from, to);
1847
}
1848
 
1849
 
1850
/* This subroutine is called when a derived type is used in order to
1851
   make the final determination about which version to use.  The
1852
   standard requires that a type be defined before it is 'used', but
1853
   such types can appear in IMPLICIT statements before the actual
1854
   definition.  'Using' in this context means declaring a variable to
1855
   be that type or using the type constructor.
1856
 
1857
   If a type is used and the components haven't been defined, then we
1858
   have to have a derived type in a parent unit.  We find the node in
1859
   the other namespace and point the symtree node in this namespace to
1860
   that node.  Further reference to this name point to the correct
1861
   node.  If we can't find the node in a parent namespace, then we have
1862
   an error.
1863
 
1864
   This subroutine takes a pointer to a symbol node and returns a
1865
   pointer to the translated node or NULL for an error.  Usually there
1866
   is no translation and we return the node we were passed.  */
1867
 
1868
gfc_symbol *
1869
gfc_use_derived (gfc_symbol *sym)
1870
{
1871
  gfc_symbol *s;
1872
  gfc_typespec *t;
1873
  gfc_symtree *st;
1874
  int i;
1875
 
1876
  if (sym->components != NULL || sym->attr.zero_comp)
1877
    return sym;               /* Already defined.  */
1878
 
1879
  if (sym->ns->parent == NULL)
1880
    goto bad;
1881
 
1882
  if (gfc_find_symbol (sym->name, sym->ns->parent, 1, &s))
1883
    {
1884
      gfc_error ("Symbol '%s' at %C is ambiguous", sym->name);
1885
      return NULL;
1886
    }
1887
 
1888
  if (s == NULL || s->attr.flavor != FL_DERIVED)
1889
    goto bad;
1890
 
1891
  /* Get rid of symbol sym, translating all references to s.  */
1892
  for (i = 0; i < GFC_LETTERS; i++)
1893
    {
1894
      t = &sym->ns->default_type[i];
1895
      if (t->u.derived == sym)
1896
        t->u.derived = s;
1897
    }
1898
 
1899
  st = gfc_find_symtree (sym->ns->sym_root, sym->name);
1900
  st->n.sym = s;
1901
 
1902
  s->refs++;
1903
 
1904
  /* Unlink from list of modified symbols.  */
1905
  gfc_commit_symbol (sym);
1906
 
1907
  switch_types (sym->ns->sym_root, sym, s);
1908
 
1909
  /* TODO: Also have to replace sym -> s in other lists like
1910
     namelists, common lists and interface lists.  */
1911
  gfc_free_symbol (sym);
1912
 
1913
  return s;
1914
 
1915
bad:
1916
  gfc_error ("Derived type '%s' at %C is being used before it is defined",
1917
             sym->name);
1918
  return NULL;
1919
}
1920
 
1921
 
1922
/* Given a derived type node and a component name, try to locate the
1923
   component structure.  Returns the NULL pointer if the component is
1924
   not found or the components are private.  If noaccess is set, no access
1925
   checks are done.  */
1926
 
1927
gfc_component *
1928
gfc_find_component (gfc_symbol *sym, const char *name,
1929
                    bool noaccess, bool silent)
1930
{
1931
  gfc_component *p;
1932
 
1933
  if (name == NULL)
1934
    return NULL;
1935
 
1936
  sym = gfc_use_derived (sym);
1937
 
1938
  if (sym == NULL)
1939
    return NULL;
1940
 
1941
  for (p = sym->components; p; p = p->next)
1942
    if (strcmp (p->name, name) == 0)
1943
      break;
1944
 
1945
  if (p == NULL
1946
        && sym->attr.extension
1947
        && sym->components->ts.type == BT_DERIVED)
1948
    {
1949
      p = gfc_find_component (sym->components->ts.u.derived, name,
1950
                              noaccess, silent);
1951
      /* Do not overwrite the error.  */
1952
      if (p == NULL)
1953
        return p;
1954
    }
1955
 
1956
  if (p == NULL && !silent)
1957
    gfc_error ("'%s' at %C is not a member of the '%s' structure",
1958
               name, sym->name);
1959
 
1960
  else if (sym->attr.use_assoc && !noaccess)
1961
    {
1962
      bool is_parent_comp = sym->attr.extension && (p == sym->components);
1963
      if (p->attr.access == ACCESS_PRIVATE ||
1964
          (p->attr.access != ACCESS_PUBLIC
1965
           && sym->component_access == ACCESS_PRIVATE
1966
           && !is_parent_comp))
1967
        {
1968
          if (!silent)
1969
            gfc_error ("Component '%s' at %C is a PRIVATE component of '%s'",
1970
                       name, sym->name);
1971
          return NULL;
1972
        }
1973
    }
1974
 
1975
  return p;
1976
}
1977
 
1978
 
1979
/* Given a symbol, free all of the component structures and everything
1980
   they point to.  */
1981
 
1982
static void
1983
free_components (gfc_component *p)
1984
{
1985
  gfc_component *q;
1986
 
1987
  for (; p; p = q)
1988
    {
1989
      q = p->next;
1990
 
1991
      gfc_free_array_spec (p->as);
1992
      gfc_free_expr (p->initializer);
1993
 
1994
      gfc_free (p);
1995
    }
1996
}
1997
 
1998
 
1999
/******************** Statement label management ********************/
2000
 
2001
/* Comparison function for statement labels, used for managing the
2002
   binary tree.  */
2003
 
2004
static int
2005
compare_st_labels (void *a1, void *b1)
2006
{
2007
  int a = ((gfc_st_label *) a1)->value;
2008
  int b = ((gfc_st_label *) b1)->value;
2009
 
2010
  return (b - a);
2011
}
2012
 
2013
 
2014
/* Free a single gfc_st_label structure, making sure the tree is not
2015
   messed up.  This function is called only when some parse error
2016
   occurs.  */
2017
 
2018
void
2019
gfc_free_st_label (gfc_st_label *label)
2020
{
2021
 
2022
  if (label == NULL)
2023
    return;
2024
 
2025
  gfc_delete_bbt (&gfc_current_ns->st_labels, label, compare_st_labels);
2026
 
2027
  if (label->format != NULL)
2028
    gfc_free_expr (label->format);
2029
 
2030
  gfc_free (label);
2031
}
2032
 
2033
 
2034
/* Free a whole tree of gfc_st_label structures.  */
2035
 
2036
static void
2037
free_st_labels (gfc_st_label *label)
2038
{
2039
 
2040
  if (label == NULL)
2041
    return;
2042
 
2043
  free_st_labels (label->left);
2044
  free_st_labels (label->right);
2045
 
2046
  if (label->format != NULL)
2047
    gfc_free_expr (label->format);
2048
  gfc_free (label);
2049
}
2050
 
2051
 
2052
/* Given a label number, search for and return a pointer to the label
2053
   structure, creating it if it does not exist.  */
2054
 
2055
gfc_st_label *
2056
gfc_get_st_label (int labelno)
2057
{
2058
  gfc_st_label *lp;
2059
  gfc_namespace *ns;
2060
 
2061
  /* Find the namespace of the scoping unit:
2062
     If we're in a BLOCK construct, jump to the parent namespace.  */
2063
  ns = gfc_current_ns;
2064
  while (ns->proc_name && ns->proc_name->attr.flavor == FL_LABEL)
2065
    ns = ns->parent;
2066
 
2067
  /* First see if the label is already in this namespace.  */
2068
  lp = ns->st_labels;
2069
  while (lp)
2070
    {
2071
      if (lp->value == labelno)
2072
        return lp;
2073
 
2074
      if (lp->value < labelno)
2075
        lp = lp->left;
2076
      else
2077
        lp = lp->right;
2078
    }
2079
 
2080
  lp = XCNEW (gfc_st_label);
2081
 
2082
  lp->value = labelno;
2083
  lp->defined = ST_LABEL_UNKNOWN;
2084
  lp->referenced = ST_LABEL_UNKNOWN;
2085
 
2086
  gfc_insert_bbt (&ns->st_labels, lp, compare_st_labels);
2087
 
2088
  return lp;
2089
}
2090
 
2091
 
2092
/* Called when a statement with a statement label is about to be
2093
   accepted.  We add the label to the list of the current namespace,
2094
   making sure it hasn't been defined previously and referenced
2095
   correctly.  */
2096
 
2097
void
2098
gfc_define_st_label (gfc_st_label *lp, gfc_sl_type type, locus *label_locus)
2099
{
2100
  int labelno;
2101
 
2102
  labelno = lp->value;
2103
 
2104
  if (lp->defined != ST_LABEL_UNKNOWN)
2105
    gfc_error ("Duplicate statement label %d at %L and %L", labelno,
2106
               &lp->where, label_locus);
2107
  else
2108
    {
2109
      lp->where = *label_locus;
2110
 
2111
      switch (type)
2112
        {
2113
        case ST_LABEL_FORMAT:
2114
          if (lp->referenced == ST_LABEL_TARGET)
2115
            gfc_error ("Label %d at %C already referenced as branch target",
2116
                       labelno);
2117
          else
2118
            lp->defined = ST_LABEL_FORMAT;
2119
 
2120
          break;
2121
 
2122
        case ST_LABEL_TARGET:
2123
          if (lp->referenced == ST_LABEL_FORMAT)
2124
            gfc_error ("Label %d at %C already referenced as a format label",
2125
                       labelno);
2126
          else
2127
            lp->defined = ST_LABEL_TARGET;
2128
 
2129
          break;
2130
 
2131
        default:
2132
          lp->defined = ST_LABEL_BAD_TARGET;
2133
          lp->referenced = ST_LABEL_BAD_TARGET;
2134
        }
2135
    }
2136
}
2137
 
2138
 
2139
/* Reference a label.  Given a label and its type, see if that
2140
   reference is consistent with what is known about that label,
2141
   updating the unknown state.  Returns FAILURE if something goes
2142
   wrong.  */
2143
 
2144
gfc_try
2145
gfc_reference_st_label (gfc_st_label *lp, gfc_sl_type type)
2146
{
2147
  gfc_sl_type label_type;
2148
  int labelno;
2149
  gfc_try rc;
2150
 
2151
  if (lp == NULL)
2152
    return SUCCESS;
2153
 
2154
  labelno = lp->value;
2155
 
2156
  if (lp->defined != ST_LABEL_UNKNOWN)
2157
    label_type = lp->defined;
2158
  else
2159
    {
2160
      label_type = lp->referenced;
2161
      lp->where = gfc_current_locus;
2162
    }
2163
 
2164
  if (label_type == ST_LABEL_FORMAT && type == ST_LABEL_TARGET)
2165
    {
2166
      gfc_error ("Label %d at %C previously used as a FORMAT label", labelno);
2167
      rc = FAILURE;
2168
      goto done;
2169
    }
2170
 
2171
  if ((label_type == ST_LABEL_TARGET || label_type == ST_LABEL_BAD_TARGET)
2172
      && type == ST_LABEL_FORMAT)
2173
    {
2174
      gfc_error ("Label %d at %C previously used as branch target", labelno);
2175
      rc = FAILURE;
2176
      goto done;
2177
    }
2178
 
2179
  lp->referenced = type;
2180
  rc = SUCCESS;
2181
 
2182
done:
2183
  return rc;
2184
}
2185
 
2186
 
2187
/*******A helper function for creating new expressions*************/
2188
 
2189
 
2190
gfc_expr *
2191
gfc_lval_expr_from_sym (gfc_symbol *sym)
2192
{
2193
  gfc_expr *lval;
2194
  lval = gfc_get_expr ();
2195
  lval->expr_type = EXPR_VARIABLE;
2196
  lval->where = sym->declared_at;
2197
  lval->ts = sym->ts;
2198
  lval->symtree = gfc_find_symtree (sym->ns->sym_root, sym->name);
2199
 
2200
  /* It will always be a full array.  */
2201
  lval->rank = sym->as ? sym->as->rank : 0;
2202
  if (lval->rank)
2203
    {
2204
      lval->ref = gfc_get_ref ();
2205
      lval->ref->type = REF_ARRAY;
2206
      lval->ref->u.ar.type = AR_FULL;
2207
      lval->ref->u.ar.dimen = lval->rank;
2208
      lval->ref->u.ar.where = sym->declared_at;
2209
      lval->ref->u.ar.as = sym->as;
2210
    }
2211
 
2212
  return lval;
2213
}
2214
 
2215
 
2216
/************** Symbol table management subroutines ****************/
2217
 
2218
/* Basic details: Fortran 95 requires a potentially unlimited number
2219
   of distinct namespaces when compiling a program unit.  This case
2220
   occurs during a compilation of internal subprograms because all of
2221
   the internal subprograms must be read before we can start
2222
   generating code for the host.
2223
 
2224
   Given the tricky nature of the Fortran grammar, we must be able to
2225
   undo changes made to a symbol table if the current interpretation
2226
   of a statement is found to be incorrect.  Whenever a symbol is
2227
   looked up, we make a copy of it and link to it.  All of these
2228
   symbols are kept in a singly linked list so that we can commit or
2229
   undo the changes at a later time.
2230
 
2231
   A symtree may point to a symbol node outside of its namespace.  In
2232
   this case, that symbol has been used as a host associated variable
2233
   at some previous time.  */
2234
 
2235
/* Allocate a new namespace structure.  Copies the implicit types from
2236
   PARENT if PARENT_TYPES is set.  */
2237
 
2238
gfc_namespace *
2239
gfc_get_namespace (gfc_namespace *parent, int parent_types)
2240
{
2241
  gfc_namespace *ns;
2242
  gfc_typespec *ts;
2243
  int in;
2244
  int i;
2245
 
2246
  ns = XCNEW (gfc_namespace);
2247
  ns->sym_root = NULL;
2248
  ns->uop_root = NULL;
2249
  ns->tb_sym_root = NULL;
2250
  ns->finalizers = NULL;
2251
  ns->default_access = ACCESS_UNKNOWN;
2252
  ns->parent = parent;
2253
 
2254
  for (in = GFC_INTRINSIC_BEGIN; in != GFC_INTRINSIC_END; in++)
2255
    {
2256
      ns->operator_access[in] = ACCESS_UNKNOWN;
2257
      ns->tb_op[in] = NULL;
2258
    }
2259
 
2260
  /* Initialize default implicit types.  */
2261
  for (i = 'a'; i <= 'z'; i++)
2262
    {
2263
      ns->set_flag[i - 'a'] = 0;
2264
      ts = &ns->default_type[i - 'a'];
2265
 
2266
      if (parent_types && ns->parent != NULL)
2267
        {
2268
          /* Copy parent settings.  */
2269
          *ts = ns->parent->default_type[i - 'a'];
2270
          continue;
2271
        }
2272
 
2273
      if (gfc_option.flag_implicit_none != 0)
2274
        {
2275
          gfc_clear_ts (ts);
2276
          continue;
2277
        }
2278
 
2279
      if ('i' <= i && i <= 'n')
2280
        {
2281
          ts->type = BT_INTEGER;
2282
          ts->kind = gfc_default_integer_kind;
2283
        }
2284
      else
2285
        {
2286
          ts->type = BT_REAL;
2287
          ts->kind = gfc_default_real_kind;
2288
        }
2289
    }
2290
 
2291
  ns->refs = 1;
2292
 
2293
  return ns;
2294
}
2295
 
2296
 
2297
/* Comparison function for symtree nodes.  */
2298
 
2299
static int
2300
compare_symtree (void *_st1, void *_st2)
2301
{
2302
  gfc_symtree *st1, *st2;
2303
 
2304
  st1 = (gfc_symtree *) _st1;
2305
  st2 = (gfc_symtree *) _st2;
2306
 
2307
  return strcmp (st1->name, st2->name);
2308
}
2309
 
2310
 
2311
/* Allocate a new symtree node and associate it with the new symbol.  */
2312
 
2313
gfc_symtree *
2314
gfc_new_symtree (gfc_symtree **root, const char *name)
2315
{
2316
  gfc_symtree *st;
2317
 
2318
  st = XCNEW (gfc_symtree);
2319
  st->name = gfc_get_string (name);
2320
 
2321
  gfc_insert_bbt (root, st, compare_symtree);
2322
  return st;
2323
}
2324
 
2325
 
2326
/* Delete a symbol from the tree.  Does not free the symbol itself!  */
2327
 
2328
void
2329
gfc_delete_symtree (gfc_symtree **root, const char *name)
2330
{
2331
  gfc_symtree st, *st0;
2332
 
2333
  st0 = gfc_find_symtree (*root, name);
2334
 
2335
  st.name = gfc_get_string (name);
2336
  gfc_delete_bbt (root, &st, compare_symtree);
2337
 
2338
  gfc_free (st0);
2339
}
2340
 
2341
 
2342
/* Given a root symtree node and a name, try to find the symbol within
2343
   the namespace.  Returns NULL if the symbol is not found.  */
2344
 
2345
gfc_symtree *
2346
gfc_find_symtree (gfc_symtree *st, const char *name)
2347
{
2348
  int c;
2349
 
2350
  while (st != NULL)
2351
    {
2352
      c = strcmp (name, st->name);
2353
      if (c == 0)
2354
        return st;
2355
 
2356
      st = (c < 0) ? st->left : st->right;
2357
    }
2358
 
2359
  return NULL;
2360
}
2361
 
2362
 
2363
/* Return a symtree node with a name that is guaranteed to be unique
2364
   within the namespace and corresponds to an illegal fortran name.  */
2365
 
2366
gfc_symtree *
2367
gfc_get_unique_symtree (gfc_namespace *ns)
2368
{
2369
  char name[GFC_MAX_SYMBOL_LEN + 1];
2370
  static int serial = 0;
2371
 
2372
  sprintf (name, "@%d", serial++);
2373
  return gfc_new_symtree (&ns->sym_root, name);
2374
}
2375
 
2376
 
2377
/* Given a name find a user operator node, creating it if it doesn't
2378
   exist.  These are much simpler than symbols because they can't be
2379
   ambiguous with one another.  */
2380
 
2381
gfc_user_op *
2382
gfc_get_uop (const char *name)
2383
{
2384
  gfc_user_op *uop;
2385
  gfc_symtree *st;
2386
 
2387
  st = gfc_find_symtree (gfc_current_ns->uop_root, name);
2388
  if (st != NULL)
2389
    return st->n.uop;
2390
 
2391
  st = gfc_new_symtree (&gfc_current_ns->uop_root, name);
2392
 
2393
  uop = st->n.uop = XCNEW (gfc_user_op);
2394
  uop->name = gfc_get_string (name);
2395
  uop->access = ACCESS_UNKNOWN;
2396
  uop->ns = gfc_current_ns;
2397
 
2398
  return uop;
2399
}
2400
 
2401
 
2402
/* Given a name find the user operator node.  Returns NULL if it does
2403
   not exist.  */
2404
 
2405
gfc_user_op *
2406
gfc_find_uop (const char *name, gfc_namespace *ns)
2407
{
2408
  gfc_symtree *st;
2409
 
2410
  if (ns == NULL)
2411
    ns = gfc_current_ns;
2412
 
2413
  st = gfc_find_symtree (ns->uop_root, name);
2414
  return (st == NULL) ? NULL : st->n.uop;
2415
}
2416
 
2417
 
2418
/* Remove a gfc_symbol structure and everything it points to.  */
2419
 
2420
void
2421
gfc_free_symbol (gfc_symbol *sym)
2422
{
2423
 
2424
  if (sym == NULL)
2425
    return;
2426
 
2427
  gfc_free_array_spec (sym->as);
2428
 
2429
  free_components (sym->components);
2430
 
2431
  gfc_free_expr (sym->value);
2432
 
2433
  gfc_free_namelist (sym->namelist);
2434
 
2435
  gfc_free_namespace (sym->formal_ns);
2436
 
2437
  if (!sym->attr.generic_copy)
2438
    gfc_free_interface (sym->generic);
2439
 
2440
  gfc_free_formal_arglist (sym->formal);
2441
 
2442
  gfc_free_namespace (sym->f2k_derived);
2443
 
2444
  gfc_free (sym);
2445
}
2446
 
2447
 
2448
/* Allocate and initialize a new symbol node.  */
2449
 
2450
gfc_symbol *
2451
gfc_new_symbol (const char *name, gfc_namespace *ns)
2452
{
2453
  gfc_symbol *p;
2454
 
2455
  p = XCNEW (gfc_symbol);
2456
 
2457
  gfc_clear_ts (&p->ts);
2458
  gfc_clear_attr (&p->attr);
2459
  p->ns = ns;
2460
 
2461
  p->declared_at = gfc_current_locus;
2462
 
2463
  if (strlen (name) > GFC_MAX_SYMBOL_LEN)
2464
    gfc_internal_error ("new_symbol(): Symbol name too long");
2465
 
2466
  p->name = gfc_get_string (name);
2467
 
2468
  /* Make sure flags for symbol being C bound are clear initially.  */
2469
  p->attr.is_bind_c = 0;
2470
  p->attr.is_iso_c = 0;
2471
  /* Make sure the binding label field has a Nul char to start.  */
2472
  p->binding_label[0] = '\0';
2473
 
2474
  /* Clear the ptrs we may need.  */
2475
  p->common_block = NULL;
2476
  p->f2k_derived = NULL;
2477
 
2478
  return p;
2479
}
2480
 
2481
 
2482
/* Generate an error if a symbol is ambiguous.  */
2483
 
2484
static void
2485
ambiguous_symbol (const char *name, gfc_symtree *st)
2486
{
2487
 
2488
  if (st->n.sym->module)
2489
    gfc_error ("Name '%s' at %C is an ambiguous reference to '%s' "
2490
               "from module '%s'", name, st->n.sym->name, st->n.sym->module);
2491
  else
2492
    gfc_error ("Name '%s' at %C is an ambiguous reference to '%s' "
2493
               "from current program unit", name, st->n.sym->name);
2494
}
2495
 
2496
 
2497
/* If we're in a SELECT TYPE block, check if the variable 'st' matches any
2498
   selector on the stack. If yes, replace it by the corresponding temporary.  */
2499
 
2500
static void
2501
select_type_insert_tmp (gfc_symtree **st)
2502
{
2503
  gfc_select_type_stack *stack = select_type_stack;
2504
  for (; stack; stack = stack->prev)
2505
    if ((*st)->n.sym == stack->selector && stack->tmp)
2506
      *st = stack->tmp;
2507
}
2508
 
2509
 
2510
/* Search for a symtree starting in the current namespace, resorting to
2511
   any parent namespaces if requested by a nonzero parent_flag.
2512
   Returns nonzero if the name is ambiguous.  */
2513
 
2514
int
2515
gfc_find_sym_tree (const char *name, gfc_namespace *ns, int parent_flag,
2516
                   gfc_symtree **result)
2517
{
2518
  gfc_symtree *st;
2519
 
2520
  if (ns == NULL)
2521
    ns = gfc_current_ns;
2522
 
2523
  do
2524
    {
2525
      st = gfc_find_symtree (ns->sym_root, name);
2526
      if (st != NULL)
2527
        {
2528
          select_type_insert_tmp (&st);
2529
 
2530
          *result = st;
2531
          /* Ambiguous generic interfaces are permitted, as long
2532
             as the specific interfaces are different.  */
2533
          if (st->ambiguous && !st->n.sym->attr.generic)
2534
            {
2535
              ambiguous_symbol (name, st);
2536
              return 1;
2537
            }
2538
 
2539
          return 0;
2540
        }
2541
 
2542
      if (!parent_flag)
2543
        break;
2544
 
2545
      ns = ns->parent;
2546
    }
2547
  while (ns != NULL);
2548
 
2549
  *result = NULL;
2550
  return 0;
2551
}
2552
 
2553
 
2554
/* Same, but returns the symbol instead.  */
2555
 
2556
int
2557
gfc_find_symbol (const char *name, gfc_namespace *ns, int parent_flag,
2558
                 gfc_symbol **result)
2559
{
2560
  gfc_symtree *st;
2561
  int i;
2562
 
2563
  i = gfc_find_sym_tree (name, ns, parent_flag, &st);
2564
 
2565
  if (st == NULL)
2566
    *result = NULL;
2567
  else
2568
    *result = st->n.sym;
2569
 
2570
  return i;
2571
}
2572
 
2573
 
2574
/* Save symbol with the information necessary to back it out.  */
2575
 
2576
static void
2577
save_symbol_data (gfc_symbol *sym)
2578
{
2579
 
2580
  if (sym->gfc_new || sym->old_symbol != NULL)
2581
    return;
2582
 
2583
  sym->old_symbol = XCNEW (gfc_symbol);
2584
  *(sym->old_symbol) = *sym;
2585
 
2586
  sym->tlink = changed_syms;
2587
  changed_syms = sym;
2588
}
2589
 
2590
 
2591
/* Given a name, find a symbol, or create it if it does not exist yet
2592
   in the current namespace.  If the symbol is found we make sure that
2593
   it's OK.
2594
 
2595
   The integer return code indicates
2596
 
2597
     1   The symbol name was ambiguous
2598
     2   The name meant to be established was already host associated.
2599
 
2600
   So if the return value is nonzero, then an error was issued.  */
2601
 
2602
int
2603
gfc_get_sym_tree (const char *name, gfc_namespace *ns, gfc_symtree **result,
2604
                  bool allow_subroutine)
2605
{
2606
  gfc_symtree *st;
2607
  gfc_symbol *p;
2608
 
2609
  /* This doesn't usually happen during resolution.  */
2610
  if (ns == NULL)
2611
    ns = gfc_current_ns;
2612
 
2613
  /* Try to find the symbol in ns.  */
2614
  st = gfc_find_symtree (ns->sym_root, name);
2615
 
2616
  if (st == NULL)
2617
    {
2618
      /* If not there, create a new symbol.  */
2619
      p = gfc_new_symbol (name, ns);
2620
 
2621
      /* Add to the list of tentative symbols.  */
2622
      p->old_symbol = NULL;
2623
      p->tlink = changed_syms;
2624
      p->mark = 1;
2625
      p->gfc_new = 1;
2626
      changed_syms = p;
2627
 
2628
      st = gfc_new_symtree (&ns->sym_root, name);
2629
      st->n.sym = p;
2630
      p->refs++;
2631
 
2632
    }
2633
  else
2634
    {
2635
      /* Make sure the existing symbol is OK.  Ambiguous
2636
         generic interfaces are permitted, as long as the
2637
         specific interfaces are different.  */
2638
      if (st->ambiguous && !st->n.sym->attr.generic)
2639
        {
2640
          ambiguous_symbol (name, st);
2641
          return 1;
2642
        }
2643
 
2644
      p = st->n.sym;
2645
      if (p->ns != ns && (!p->attr.function || ns->proc_name != p)
2646
          && !(allow_subroutine && p->attr.subroutine)
2647
          && !(ns->proc_name && ns->proc_name->attr.if_source == IFSRC_IFBODY
2648
          && (ns->has_import_set || p->attr.imported)))
2649
        {
2650
          /* Symbol is from another namespace.  */
2651
          gfc_error ("Symbol '%s' at %C has already been host associated",
2652
                     name);
2653
          return 2;
2654
        }
2655
 
2656
      p->mark = 1;
2657
 
2658
      /* Copy in case this symbol is changed.  */
2659
      save_symbol_data (p);
2660
    }
2661
 
2662
  *result = st;
2663
  return 0;
2664
}
2665
 
2666
 
2667
int
2668
gfc_get_symbol (const char *name, gfc_namespace *ns, gfc_symbol **result)
2669
{
2670
  gfc_symtree *st;
2671
  int i;
2672
 
2673
  i = gfc_get_sym_tree (name, ns, &st, false);
2674
  if (i != 0)
2675
    return i;
2676
 
2677
  if (st)
2678
    *result = st->n.sym;
2679
  else
2680
    *result = NULL;
2681
  return i;
2682
}
2683
 
2684
 
2685
/* Subroutine that searches for a symbol, creating it if it doesn't
2686
   exist, but tries to host-associate the symbol if possible.  */
2687
 
2688
int
2689
gfc_get_ha_sym_tree (const char *name, gfc_symtree **result)
2690
{
2691
  gfc_symtree *st;
2692
  int i;
2693
 
2694
  i = gfc_find_sym_tree (name, gfc_current_ns, 0, &st);
2695
 
2696
  if (st != NULL)
2697
    {
2698
      save_symbol_data (st->n.sym);
2699
      *result = st;
2700
      return i;
2701
    }
2702
 
2703
  if (gfc_current_ns->parent != NULL)
2704
    {
2705
      i = gfc_find_sym_tree (name, gfc_current_ns->parent, 1, &st);
2706
      if (i)
2707
        return i;
2708
 
2709
      if (st != NULL)
2710
        {
2711
          *result = st;
2712
          return 0;
2713
        }
2714
    }
2715
 
2716
  return gfc_get_sym_tree (name, gfc_current_ns, result, false);
2717
}
2718
 
2719
 
2720
int
2721
gfc_get_ha_symbol (const char *name, gfc_symbol **result)
2722
{
2723
  int i;
2724
  gfc_symtree *st;
2725
 
2726
  i = gfc_get_ha_sym_tree (name, &st);
2727
 
2728
  if (st)
2729
    *result = st->n.sym;
2730
  else
2731
    *result = NULL;
2732
 
2733
  return i;
2734
}
2735
 
2736
/* Return true if both symbols could refer to the same data object.  Does
2737
   not take account of aliasing due to equivalence statements.  */
2738
 
2739
int
2740
gfc_symbols_could_alias (gfc_symbol *lsym, gfc_symbol *rsym)
2741
{
2742
  /* Aliasing isn't possible if the symbols have different base types.  */
2743
  if (gfc_compare_types (&lsym->ts, &rsym->ts) == 0)
2744
    return 0;
2745
 
2746
  /* Pointers can point to other pointers, target objects and allocatable
2747
     objects.  Two allocatable objects cannot share the same storage.  */
2748
  if (lsym->attr.pointer
2749
      && (rsym->attr.pointer || rsym->attr.allocatable || rsym->attr.target))
2750
    return 1;
2751
  if (lsym->attr.target && rsym->attr.pointer)
2752
    return 1;
2753
  if (lsym->attr.allocatable && rsym->attr.pointer)
2754
    return 1;
2755
 
2756
  return 0;
2757
}
2758
 
2759
 
2760
/* Undoes all the changes made to symbols in the current statement.
2761
   This subroutine is made simpler due to the fact that attributes are
2762
   never removed once added.  */
2763
 
2764
void
2765
gfc_undo_symbols (void)
2766
{
2767
  gfc_symbol *p, *q, *old;
2768
  tentative_tbp *tbp, *tbq;
2769
 
2770
  for (p = changed_syms; p; p = q)
2771
    {
2772
      q = p->tlink;
2773
 
2774
      if (p->gfc_new)
2775
        {
2776
          /* Symbol was new.  */
2777
          if (p->attr.in_common && p->common_block && p->common_block->head)
2778
            {
2779
              /* If the symbol was added to any common block, it
2780
                 needs to be removed to stop the resolver looking
2781
                 for a (possibly) dead symbol.  */
2782
 
2783
              if (p->common_block->head == p)
2784
                p->common_block->head = p->common_next;
2785
              else
2786
                {
2787
                  gfc_symbol *cparent, *csym;
2788
 
2789
                  cparent = p->common_block->head;
2790
                  csym = cparent->common_next;
2791
 
2792
                  while (csym != p)
2793
                    {
2794
                      cparent = csym;
2795
                      csym = csym->common_next;
2796
                    }
2797
 
2798
                  gcc_assert(cparent->common_next == p);
2799
 
2800
                  cparent->common_next = csym->common_next;
2801
                }
2802
            }
2803
 
2804
          gfc_delete_symtree (&p->ns->sym_root, p->name);
2805
 
2806
          p->refs--;
2807
          if (p->refs < 0)
2808
            gfc_internal_error ("gfc_undo_symbols(): Negative refs");
2809
          if (p->refs == 0)
2810
            gfc_free_symbol (p);
2811
          continue;
2812
        }
2813
 
2814
      /* Restore previous state of symbol.  Just copy simple stuff.  */
2815
      p->mark = 0;
2816
      old = p->old_symbol;
2817
 
2818
      p->ts.type = old->ts.type;
2819
      p->ts.kind = old->ts.kind;
2820
 
2821
      p->attr = old->attr;
2822
 
2823
      if (p->value != old->value)
2824
        {
2825
          gfc_free_expr (old->value);
2826
          p->value = NULL;
2827
        }
2828
 
2829
      if (p->as != old->as)
2830
        {
2831
          if (p->as)
2832
            gfc_free_array_spec (p->as);
2833
          p->as = old->as;
2834
        }
2835
 
2836
      p->generic = old->generic;
2837
      p->component_access = old->component_access;
2838
 
2839
      if (p->namelist != NULL && old->namelist == NULL)
2840
        {
2841
          gfc_free_namelist (p->namelist);
2842
          p->namelist = NULL;
2843
        }
2844
      else
2845
        {
2846
          if (p->namelist_tail != old->namelist_tail)
2847
            {
2848
              gfc_free_namelist (old->namelist_tail);
2849
              old->namelist_tail->next = NULL;
2850
            }
2851
        }
2852
 
2853
      p->namelist_tail = old->namelist_tail;
2854
 
2855
      if (p->formal != old->formal)
2856
        {
2857
          gfc_free_formal_arglist (p->formal);
2858
          p->formal = old->formal;
2859
        }
2860
 
2861
      gfc_free (p->old_symbol);
2862
      p->old_symbol = NULL;
2863
      p->tlink = NULL;
2864
    }
2865
 
2866
  changed_syms = NULL;
2867
 
2868
  for (tbp = tentative_tbp_list; tbp; tbp = tbq)
2869
    {
2870
      tbq = tbp->next;
2871
      /* Procedure is already marked `error' by default.  */
2872
      gfc_free (tbp);
2873
    }
2874
  tentative_tbp_list = NULL;
2875
}
2876
 
2877
 
2878
/* Free sym->old_symbol. sym->old_symbol is mostly a shallow copy of sym; the
2879
   components of old_symbol that might need deallocation are the "allocatables"
2880
   that are restored in gfc_undo_symbols(), with two exceptions: namelist and
2881
   namelist_tail.  In case these differ between old_symbol and sym, it's just
2882
   because sym->namelist has gotten a few more items.  */
2883
 
2884
static void
2885
free_old_symbol (gfc_symbol *sym)
2886
{
2887
 
2888
  if (sym->old_symbol == NULL)
2889
    return;
2890
 
2891
  if (sym->old_symbol->as != sym->as)
2892
    gfc_free_array_spec (sym->old_symbol->as);
2893
 
2894
  if (sym->old_symbol->value != sym->value)
2895
    gfc_free_expr (sym->old_symbol->value);
2896
 
2897
  if (sym->old_symbol->formal != sym->formal)
2898
    gfc_free_formal_arglist (sym->old_symbol->formal);
2899
 
2900
  gfc_free (sym->old_symbol);
2901
  sym->old_symbol = NULL;
2902
}
2903
 
2904
 
2905
/* Makes the changes made in the current statement permanent-- gets
2906
   rid of undo information.  */
2907
 
2908
void
2909
gfc_commit_symbols (void)
2910
{
2911
  gfc_symbol *p, *q;
2912
  tentative_tbp *tbp, *tbq;
2913
 
2914
  for (p = changed_syms; p; p = q)
2915
    {
2916
      q = p->tlink;
2917
      p->tlink = NULL;
2918
      p->mark = 0;
2919
      p->gfc_new = 0;
2920
      free_old_symbol (p);
2921
    }
2922
  changed_syms = NULL;
2923
 
2924
  for (tbp = tentative_tbp_list; tbp; tbp = tbq)
2925
    {
2926
      tbq = tbp->next;
2927
      tbp->proc->error = 0;
2928
      gfc_free (tbp);
2929
    }
2930
  tentative_tbp_list = NULL;
2931
}
2932
 
2933
 
2934
/* Makes the changes made in one symbol permanent -- gets rid of undo
2935
   information.  */
2936
 
2937
void
2938
gfc_commit_symbol (gfc_symbol *sym)
2939
{
2940
  gfc_symbol *p;
2941
 
2942
  if (changed_syms == sym)
2943
    changed_syms = sym->tlink;
2944
  else
2945
    {
2946
      for (p = changed_syms; p; p = p->tlink)
2947
        if (p->tlink == sym)
2948
          {
2949
            p->tlink = sym->tlink;
2950
            break;
2951
          }
2952
    }
2953
 
2954
  sym->tlink = NULL;
2955
  sym->mark = 0;
2956
  sym->gfc_new = 0;
2957
 
2958
  free_old_symbol (sym);
2959
}
2960
 
2961
 
2962
/* Recursively free trees containing type-bound procedures.  */
2963
 
2964
static void
2965
free_tb_tree (gfc_symtree *t)
2966
{
2967
  if (t == NULL)
2968
    return;
2969
 
2970
  free_tb_tree (t->left);
2971
  free_tb_tree (t->right);
2972
 
2973
  /* TODO: Free type-bound procedure structs themselves; probably needs some
2974
     sort of ref-counting mechanism.  */
2975
 
2976
  gfc_free (t);
2977
}
2978
 
2979
 
2980
/* Recursive function that deletes an entire tree and all the common
2981
   head structures it points to.  */
2982
 
2983
static void
2984
free_common_tree (gfc_symtree * common_tree)
2985
{
2986
  if (common_tree == NULL)
2987
    return;
2988
 
2989
  free_common_tree (common_tree->left);
2990
  free_common_tree (common_tree->right);
2991
 
2992
  gfc_free (common_tree);
2993
}
2994
 
2995
 
2996
/* Recursive function that deletes an entire tree and all the user
2997
   operator nodes that it contains.  */
2998
 
2999
static void
3000
free_uop_tree (gfc_symtree *uop_tree)
3001
{
3002
  if (uop_tree == NULL)
3003
    return;
3004
 
3005
  free_uop_tree (uop_tree->left);
3006
  free_uop_tree (uop_tree->right);
3007
 
3008
  gfc_free_interface (uop_tree->n.uop->op);
3009
  gfc_free (uop_tree->n.uop);
3010
  gfc_free (uop_tree);
3011
}
3012
 
3013
 
3014
/* Recursive function that deletes an entire tree and all the symbols
3015
   that it contains.  */
3016
 
3017
static void
3018
free_sym_tree (gfc_symtree *sym_tree)
3019
{
3020
  gfc_namespace *ns;
3021
  gfc_symbol *sym;
3022
 
3023
  if (sym_tree == NULL)
3024
    return;
3025
 
3026
  free_sym_tree (sym_tree->left);
3027
  free_sym_tree (sym_tree->right);
3028
 
3029
  sym = sym_tree->n.sym;
3030
 
3031
  sym->refs--;
3032
  if (sym->refs < 0)
3033
    gfc_internal_error ("free_sym_tree(): Negative refs");
3034
 
3035
  if (sym->formal_ns != NULL && sym->refs == 1)
3036
    {
3037
      /* As formal_ns contains a reference to sym, delete formal_ns just
3038
         before the deletion of sym.  */
3039
      ns = sym->formal_ns;
3040
      sym->formal_ns = NULL;
3041
      gfc_free_namespace (ns);
3042
    }
3043
  else if (sym->refs == 0)
3044
    {
3045
      /* Go ahead and delete the symbol.  */
3046
      gfc_free_symbol (sym);
3047
    }
3048
 
3049
  gfc_free (sym_tree);
3050
}
3051
 
3052
 
3053
/* Free the derived type list.  */
3054
 
3055
void
3056
gfc_free_dt_list (void)
3057
{
3058
  gfc_dt_list *dt, *n;
3059
 
3060
  for (dt = gfc_derived_types; dt; dt = n)
3061
    {
3062
      n = dt->next;
3063
      gfc_free (dt);
3064
    }
3065
 
3066
  gfc_derived_types = NULL;
3067
}
3068
 
3069
 
3070
/* Free the gfc_equiv_info's.  */
3071
 
3072
static void
3073
gfc_free_equiv_infos (gfc_equiv_info *s)
3074
{
3075
  if (s == NULL)
3076
    return;
3077
  gfc_free_equiv_infos (s->next);
3078
  gfc_free (s);
3079
}
3080
 
3081
 
3082
/* Free the gfc_equiv_lists.  */
3083
 
3084
static void
3085
gfc_free_equiv_lists (gfc_equiv_list *l)
3086
{
3087
  if (l == NULL)
3088
    return;
3089
  gfc_free_equiv_lists (l->next);
3090
  gfc_free_equiv_infos (l->equiv);
3091
  gfc_free (l);
3092
}
3093
 
3094
 
3095
/* Free a finalizer procedure list.  */
3096
 
3097
void
3098
gfc_free_finalizer (gfc_finalizer* el)
3099
{
3100
  if (el)
3101
    {
3102
      if (el->proc_sym)
3103
        {
3104
          --el->proc_sym->refs;
3105
          if (!el->proc_sym->refs)
3106
            gfc_free_symbol (el->proc_sym);
3107
        }
3108
 
3109
      gfc_free (el);
3110
    }
3111
}
3112
 
3113
static void
3114
gfc_free_finalizer_list (gfc_finalizer* list)
3115
{
3116
  while (list)
3117
    {
3118
      gfc_finalizer* current = list;
3119
      list = list->next;
3120
      gfc_free_finalizer (current);
3121
    }
3122
}
3123
 
3124
 
3125
/* Create a new gfc_charlen structure and add it to a namespace.
3126
   If 'old_cl' is given, the newly created charlen will be a copy of it.  */
3127
 
3128
gfc_charlen*
3129
gfc_new_charlen (gfc_namespace *ns, gfc_charlen *old_cl)
3130
{
3131
  gfc_charlen *cl;
3132
  cl = gfc_get_charlen ();
3133
 
3134
  /* Put into namespace.  */
3135
  cl->next = ns->cl_list;
3136
  ns->cl_list = cl;
3137
 
3138
  /* Copy old_cl.  */
3139
  if (old_cl)
3140
    {
3141
      cl->length = gfc_copy_expr (old_cl->length);
3142
      cl->length_from_typespec = old_cl->length_from_typespec;
3143
      cl->backend_decl = old_cl->backend_decl;
3144
      cl->passed_length = old_cl->passed_length;
3145
      cl->resolved = old_cl->resolved;
3146
    }
3147
 
3148
  return cl;
3149
}
3150
 
3151
 
3152
/* Free the charlen list from cl to end (end is not freed).
3153
   Free the whole list if end is NULL.  */
3154
 
3155
void gfc_free_charlen (gfc_charlen *cl, gfc_charlen *end)
3156
{
3157
  gfc_charlen *cl2;
3158
 
3159
  for (; cl != end; cl = cl2)
3160
    {
3161
      gcc_assert (cl);
3162
 
3163
      cl2 = cl->next;
3164
      gfc_free_expr (cl->length);
3165
      gfc_free (cl);
3166
    }
3167
}
3168
 
3169
 
3170
/* Free a namespace structure and everything below it.  Interface
3171
   lists associated with intrinsic operators are not freed.  These are
3172
   taken care of when a specific name is freed.  */
3173
 
3174
void
3175
gfc_free_namespace (gfc_namespace *ns)
3176
{
3177
  gfc_namespace *p, *q;
3178
  int i;
3179
 
3180
  if (ns == NULL)
3181
    return;
3182
 
3183
  ns->refs--;
3184
  if (ns->refs > 0)
3185
    return;
3186
  gcc_assert (ns->refs == 0);
3187
 
3188
  gfc_free_statements (ns->code);
3189
 
3190
  free_sym_tree (ns->sym_root);
3191
  free_uop_tree (ns->uop_root);
3192
  free_common_tree (ns->common_root);
3193
  free_tb_tree (ns->tb_sym_root);
3194
  free_tb_tree (ns->tb_uop_root);
3195
  gfc_free_finalizer_list (ns->finalizers);
3196
  gfc_free_charlen (ns->cl_list, NULL);
3197
  free_st_labels (ns->st_labels);
3198
 
3199
  gfc_free_equiv (ns->equiv);
3200
  gfc_free_equiv_lists (ns->equiv_lists);
3201
  gfc_free_use_stmts (ns->use_stmts);
3202
 
3203
  for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3204
    gfc_free_interface (ns->op[i]);
3205
 
3206
  gfc_free_data (ns->data);
3207
  p = ns->contained;
3208
  gfc_free (ns);
3209
 
3210
  /* Recursively free any contained namespaces.  */
3211
  while (p != NULL)
3212
    {
3213
      q = p;
3214
      p = p->sibling;
3215
      gfc_free_namespace (q);
3216
    }
3217
}
3218
 
3219
 
3220
void
3221
gfc_symbol_init_2 (void)
3222
{
3223
 
3224
  gfc_current_ns = gfc_get_namespace (NULL, 0);
3225
}
3226
 
3227
 
3228
void
3229
gfc_symbol_done_2 (void)
3230
{
3231
 
3232
  gfc_free_namespace (gfc_current_ns);
3233
  gfc_current_ns = NULL;
3234
  gfc_free_dt_list ();
3235
}
3236
 
3237
 
3238
/* Clear mark bits from symbol nodes associated with a symtree node.  */
3239
 
3240
static void
3241
clear_sym_mark (gfc_symtree *st)
3242
{
3243
 
3244
  st->n.sym->mark = 0;
3245
}
3246
 
3247
 
3248
/* Recursively traverse the symtree nodes.  */
3249
 
3250
void
3251
gfc_traverse_symtree (gfc_symtree *st, void (*func) (gfc_symtree *))
3252
{
3253
  if (!st)
3254
    return;
3255
 
3256
  gfc_traverse_symtree (st->left, func);
3257
  (*func) (st);
3258
  gfc_traverse_symtree (st->right, func);
3259
}
3260
 
3261
 
3262
/* Recursive namespace traversal function.  */
3263
 
3264
static void
3265
traverse_ns (gfc_symtree *st, void (*func) (gfc_symbol *))
3266
{
3267
 
3268
  if (st == NULL)
3269
    return;
3270
 
3271
  traverse_ns (st->left, func);
3272
 
3273
  if (st->n.sym->mark == 0)
3274
    (*func) (st->n.sym);
3275
  st->n.sym->mark = 1;
3276
 
3277
  traverse_ns (st->right, func);
3278
}
3279
 
3280
 
3281
/* Call a given function for all symbols in the namespace.  We take
3282
   care that each gfc_symbol node is called exactly once.  */
3283
 
3284
void
3285
gfc_traverse_ns (gfc_namespace *ns, void (*func) (gfc_symbol *))
3286
{
3287
 
3288
  gfc_traverse_symtree (ns->sym_root, clear_sym_mark);
3289
 
3290
  traverse_ns (ns->sym_root, func);
3291
}
3292
 
3293
 
3294
/* Return TRUE when name is the name of an intrinsic type.  */
3295
 
3296
bool
3297
gfc_is_intrinsic_typename (const char *name)
3298
{
3299
  if (strcmp (name, "integer") == 0
3300
      || strcmp (name, "real") == 0
3301
      || strcmp (name, "character") == 0
3302
      || strcmp (name, "logical") == 0
3303
      || strcmp (name, "complex") == 0
3304
      || strcmp (name, "doubleprecision") == 0
3305
      || strcmp (name, "doublecomplex") == 0)
3306
    return true;
3307
  else
3308
    return false;
3309
}
3310
 
3311
 
3312
/* Return TRUE if the symbol is an automatic variable.  */
3313
 
3314
static bool
3315
gfc_is_var_automatic (gfc_symbol *sym)
3316
{
3317
  /* Pointer and allocatable variables are never automatic.  */
3318
  if (sym->attr.pointer || sym->attr.allocatable)
3319
    return false;
3320
  /* Check for arrays with non-constant size.  */
3321
  if (sym->attr.dimension && sym->as
3322
      && !gfc_is_compile_time_shape (sym->as))
3323
    return true;
3324
  /* Check for non-constant length character variables.  */
3325
  if (sym->ts.type == BT_CHARACTER
3326
      && sym->ts.u.cl
3327
      && !gfc_is_constant_expr (sym->ts.u.cl->length))
3328
    return true;
3329
  return false;
3330
}
3331
 
3332
/* Given a symbol, mark it as SAVEd if it is allowed.  */
3333
 
3334
static void
3335
save_symbol (gfc_symbol *sym)
3336
{
3337
 
3338
  if (sym->attr.use_assoc)
3339
    return;
3340
 
3341
  if (sym->attr.in_common
3342
      || sym->attr.dummy
3343
      || sym->attr.result
3344
      || sym->attr.flavor != FL_VARIABLE)
3345
    return;
3346
  /* Automatic objects are not saved.  */
3347
  if (gfc_is_var_automatic (sym))
3348
    return;
3349
  gfc_add_save (&sym->attr, sym->name, &sym->declared_at);
3350
}
3351
 
3352
 
3353
/* Mark those symbols which can be SAVEd as such.  */
3354
 
3355
void
3356
gfc_save_all (gfc_namespace *ns)
3357
{
3358
  gfc_traverse_ns (ns, save_symbol);
3359
}
3360
 
3361
 
3362
#ifdef GFC_DEBUG
3363
/* Make sure that no changes to symbols are pending.  */
3364
 
3365
void
3366
gfc_symbol_state(void) {
3367
 
3368
  if (changed_syms != NULL)
3369
    gfc_internal_error("Symbol changes still pending!");
3370
}
3371
#endif
3372
 
3373
 
3374
/************** Global symbol handling ************/
3375
 
3376
 
3377
/* Search a tree for the global symbol.  */
3378
 
3379
gfc_gsymbol *
3380
gfc_find_gsymbol (gfc_gsymbol *symbol, const char *name)
3381
{
3382
  int c;
3383
 
3384
  if (symbol == NULL)
3385
    return NULL;
3386
 
3387
  while (symbol)
3388
    {
3389
      c = strcmp (name, symbol->name);
3390
      if (!c)
3391
        return symbol;
3392
 
3393
      symbol = (c < 0) ? symbol->left : symbol->right;
3394
    }
3395
 
3396
  return NULL;
3397
}
3398
 
3399
 
3400
/* Compare two global symbols. Used for managing the BB tree.  */
3401
 
3402
static int
3403
gsym_compare (void *_s1, void *_s2)
3404
{
3405
  gfc_gsymbol *s1, *s2;
3406
 
3407
  s1 = (gfc_gsymbol *) _s1;
3408
  s2 = (gfc_gsymbol *) _s2;
3409
  return strcmp (s1->name, s2->name);
3410
}
3411
 
3412
 
3413
/* Get a global symbol, creating it if it doesn't exist.  */
3414
 
3415
gfc_gsymbol *
3416
gfc_get_gsymbol (const char *name)
3417
{
3418
  gfc_gsymbol *s;
3419
 
3420
  s = gfc_find_gsymbol (gfc_gsym_root, name);
3421
  if (s != NULL)
3422
    return s;
3423
 
3424
  s = XCNEW (gfc_gsymbol);
3425
  s->type = GSYM_UNKNOWN;
3426
  s->name = gfc_get_string (name);
3427
 
3428
  gfc_insert_bbt (&gfc_gsym_root, s, gsym_compare);
3429
 
3430
  return s;
3431
}
3432
 
3433
 
3434
static gfc_symbol *
3435
get_iso_c_binding_dt (int sym_id)
3436
{
3437
  gfc_dt_list *dt_list;
3438
 
3439
  dt_list = gfc_derived_types;
3440
 
3441
  /* Loop through the derived types in the name list, searching for
3442
     the desired symbol from iso_c_binding.  Search the parent namespaces
3443
     if necessary and requested to (parent_flag).  */
3444
  while (dt_list != NULL)
3445
    {
3446
      if (dt_list->derived->from_intmod != INTMOD_NONE
3447
          && dt_list->derived->intmod_sym_id == sym_id)
3448
        return dt_list->derived;
3449
 
3450
      dt_list = dt_list->next;
3451
    }
3452
 
3453
  return NULL;
3454
}
3455
 
3456
 
3457
/* Verifies that the given derived type symbol, derived_sym, is interoperable
3458
   with C.  This is necessary for any derived type that is BIND(C) and for
3459
   derived types that are parameters to functions that are BIND(C).  All
3460
   fields of the derived type are required to be interoperable, and are tested
3461
   for such.  If an error occurs, the errors are reported here, allowing for
3462
   multiple errors to be handled for a single derived type.  */
3463
 
3464
gfc_try
3465
verify_bind_c_derived_type (gfc_symbol *derived_sym)
3466
{
3467
  gfc_component *curr_comp = NULL;
3468
  gfc_try is_c_interop = FAILURE;
3469
  gfc_try retval = SUCCESS;
3470
 
3471
  if (derived_sym == NULL)
3472
    gfc_internal_error ("verify_bind_c_derived_type(): Given symbol is "
3473
                        "unexpectedly NULL");
3474
 
3475
  /* If we've already looked at this derived symbol, do not look at it again
3476
     so we don't repeat warnings/errors.  */
3477
  if (derived_sym->ts.is_c_interop)
3478
    return SUCCESS;
3479
 
3480
  /* The derived type must have the BIND attribute to be interoperable
3481
     J3/04-007, Section 15.2.3.  */
3482
  if (derived_sym->attr.is_bind_c != 1)
3483
    {
3484
      derived_sym->ts.is_c_interop = 0;
3485
      gfc_error_now ("Derived type '%s' declared at %L must have the BIND "
3486
                     "attribute to be C interoperable", derived_sym->name,
3487
                     &(derived_sym->declared_at));
3488
      retval = FAILURE;
3489
    }
3490
 
3491
  curr_comp = derived_sym->components;
3492
 
3493
  /* TODO: is this really an error?  */
3494
  if (curr_comp == NULL)
3495
    {
3496
      gfc_error ("Derived type '%s' at %L is empty",
3497
                 derived_sym->name, &(derived_sym->declared_at));
3498
      return FAILURE;
3499
    }
3500
 
3501
  /* Initialize the derived type as being C interoperable.
3502
     If we find an error in the components, this will be set false.  */
3503
  derived_sym->ts.is_c_interop = 1;
3504
 
3505
  /* Loop through the list of components to verify that the kind of
3506
     each is a C interoperable type.  */
3507
  do
3508
    {
3509
      /* The components cannot be pointers (fortran sense).
3510
         J3/04-007, Section 15.2.3, C1505.      */
3511
      if (curr_comp->attr.pointer != 0)
3512
        {
3513
          gfc_error ("Component '%s' at %L cannot have the "
3514
                     "POINTER attribute because it is a member "
3515
                     "of the BIND(C) derived type '%s' at %L",
3516
                     curr_comp->name, &(curr_comp->loc),
3517
                     derived_sym->name, &(derived_sym->declared_at));
3518
          retval = FAILURE;
3519
        }
3520
 
3521
      if (curr_comp->attr.proc_pointer != 0)
3522
        {
3523
          gfc_error ("Procedure pointer component '%s' at %L cannot be a member"
3524
                     " of the BIND(C) derived type '%s' at %L", curr_comp->name,
3525
                     &curr_comp->loc, derived_sym->name,
3526
                     &derived_sym->declared_at);
3527
          retval = FAILURE;
3528
        }
3529
 
3530
      /* The components cannot be allocatable.
3531
         J3/04-007, Section 15.2.3, C1505.      */
3532
      if (curr_comp->attr.allocatable != 0)
3533
        {
3534
          gfc_error ("Component '%s' at %L cannot have the "
3535
                     "ALLOCATABLE attribute because it is a member "
3536
                     "of the BIND(C) derived type '%s' at %L",
3537
                     curr_comp->name, &(curr_comp->loc),
3538
                     derived_sym->name, &(derived_sym->declared_at));
3539
          retval = FAILURE;
3540
        }
3541
 
3542
      /* BIND(C) derived types must have interoperable components.  */
3543
      if (curr_comp->ts.type == BT_DERIVED
3544
          && curr_comp->ts.u.derived->ts.is_iso_c != 1
3545
          && curr_comp->ts.u.derived != derived_sym)
3546
        {
3547
          /* This should be allowed; the draft says a derived-type can not
3548
             have type parameters if it is has the BIND attribute.  Type
3549
             parameters seem to be for making parameterized derived types.
3550
             There's no need to verify the type if it is c_ptr/c_funptr.  */
3551
          retval = verify_bind_c_derived_type (curr_comp->ts.u.derived);
3552
        }
3553
      else
3554
        {
3555
          /* Grab the typespec for the given component and test the kind.  */
3556
          is_c_interop = verify_c_interop (&(curr_comp->ts));
3557
 
3558
          if (is_c_interop != SUCCESS)
3559
            {
3560
              /* Report warning and continue since not fatal.  The
3561
                 draft does specify a constraint that requires all fields
3562
                 to interoperate, but if the user says real(4), etc., it
3563
                 may interoperate with *something* in C, but the compiler
3564
                 most likely won't know exactly what.  Further, it may not
3565
                 interoperate with the same data type(s) in C if the user
3566
                 recompiles with different flags (e.g., -m32 and -m64 on
3567
                 x86_64 and using integer(4) to claim interop with a
3568
                 C_LONG).  */
3569
              if (derived_sym->attr.is_bind_c == 1)
3570
                /* If the derived type is bind(c), all fields must be
3571
                   interop.  */
3572
                gfc_warning ("Component '%s' in derived type '%s' at %L "
3573
                             "may not be C interoperable, even though "
3574
                             "derived type '%s' is BIND(C)",
3575
                             curr_comp->name, derived_sym->name,
3576
                             &(curr_comp->loc), derived_sym->name);
3577
              else
3578
                /* If derived type is param to bind(c) routine, or to one
3579
                   of the iso_c_binding procs, it must be interoperable, so
3580
                   all fields must interop too.  */
3581
                gfc_warning ("Component '%s' in derived type '%s' at %L "
3582
                             "may not be C interoperable",
3583
                             curr_comp->name, derived_sym->name,
3584
                             &(curr_comp->loc));
3585
            }
3586
        }
3587
 
3588
      curr_comp = curr_comp->next;
3589
    } while (curr_comp != NULL);
3590
 
3591
 
3592
  /* Make sure we don't have conflicts with the attributes.  */
3593
  if (derived_sym->attr.access == ACCESS_PRIVATE)
3594
    {
3595
      gfc_error ("Derived type '%s' at %L cannot be declared with both "
3596
                 "PRIVATE and BIND(C) attributes", derived_sym->name,
3597
                 &(derived_sym->declared_at));
3598
      retval = FAILURE;
3599
    }
3600
 
3601
  if (derived_sym->attr.sequence != 0)
3602
    {
3603
      gfc_error ("Derived type '%s' at %L cannot have the SEQUENCE "
3604
                 "attribute because it is BIND(C)", derived_sym->name,
3605
                 &(derived_sym->declared_at));
3606
      retval = FAILURE;
3607
    }
3608
 
3609
  /* Mark the derived type as not being C interoperable if we found an
3610
     error.  If there were only warnings, proceed with the assumption
3611
     it's interoperable.  */
3612
  if (retval == FAILURE)
3613
    derived_sym->ts.is_c_interop = 0;
3614
 
3615
  return retval;
3616
}
3617
 
3618
 
3619
/* Generate symbols for the named constants c_null_ptr and c_null_funptr.  */
3620
 
3621
static gfc_try
3622
gen_special_c_interop_ptr (int ptr_id, const char *ptr_name,
3623
                           const char *module_name)
3624
{
3625
  gfc_symtree *tmp_symtree;
3626
  gfc_symbol *tmp_sym;
3627
 
3628
  tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, ptr_name);
3629
 
3630
  if (tmp_symtree != NULL)
3631
    tmp_sym = tmp_symtree->n.sym;
3632
  else
3633
    {
3634
      tmp_sym = NULL;
3635
      gfc_internal_error ("gen_special_c_interop_ptr(): Unable to "
3636
                          "create symbol for %s", ptr_name);
3637
    }
3638
 
3639
  /* Set up the symbol's important fields.  Save attr required so we can
3640
     initialize the ptr to NULL.  */
3641
  tmp_sym->attr.save = SAVE_EXPLICIT;
3642
  tmp_sym->ts.is_c_interop = 1;
3643
  tmp_sym->attr.is_c_interop = 1;
3644
  tmp_sym->ts.is_iso_c = 1;
3645
  tmp_sym->ts.type = BT_DERIVED;
3646
 
3647
  /* The c_ptr and c_funptr derived types will provide the
3648
     definition for c_null_ptr and c_null_funptr, respectively.  */
3649
  if (ptr_id == ISOCBINDING_NULL_PTR)
3650
    tmp_sym->ts.u.derived = get_iso_c_binding_dt (ISOCBINDING_PTR);
3651
  else
3652
    tmp_sym->ts.u.derived = get_iso_c_binding_dt (ISOCBINDING_FUNPTR);
3653
  if (tmp_sym->ts.u.derived == NULL)
3654
    {
3655
      /* This can occur if the user forgot to declare c_ptr or
3656
         c_funptr and they're trying to use one of the procedures
3657
         that has arg(s) of the missing type.  In this case, a
3658
         regular version of the thing should have been put in the
3659
         current ns.  */
3660
      generate_isocbinding_symbol (module_name, ptr_id == ISOCBINDING_NULL_PTR
3661
                                   ? ISOCBINDING_PTR : ISOCBINDING_FUNPTR,
3662
                                   (const char *) (ptr_id == ISOCBINDING_NULL_PTR
3663
                                   ? "_gfortran_iso_c_binding_c_ptr"
3664
                                   : "_gfortran_iso_c_binding_c_funptr"));
3665
 
3666
      tmp_sym->ts.u.derived =
3667
        get_iso_c_binding_dt (ptr_id == ISOCBINDING_NULL_PTR
3668
                              ? ISOCBINDING_PTR : ISOCBINDING_FUNPTR);
3669
    }
3670
 
3671
  /* Module name is some mangled version of iso_c_binding.  */
3672
  tmp_sym->module = gfc_get_string (module_name);
3673
 
3674
  /* Say it's from the iso_c_binding module.  */
3675
  tmp_sym->attr.is_iso_c = 1;
3676
 
3677
  tmp_sym->attr.use_assoc = 1;
3678
  tmp_sym->attr.is_bind_c = 1;
3679
  /* Set the binding_label.  */
3680
  sprintf (tmp_sym->binding_label, "%s_%s", module_name, tmp_sym->name);
3681
 
3682
  /* Set the c_address field of c_null_ptr and c_null_funptr to
3683
     the value of NULL.  */
3684
  tmp_sym->value = gfc_get_expr ();
3685
  tmp_sym->value->expr_type = EXPR_STRUCTURE;
3686
  tmp_sym->value->ts.type = BT_DERIVED;
3687
  tmp_sym->value->ts.u.derived = tmp_sym->ts.u.derived;
3688
  tmp_sym->value->value.constructor = gfc_get_constructor ();
3689
  tmp_sym->value->value.constructor->expr = gfc_get_expr ();
3690
  tmp_sym->value->value.constructor->expr->expr_type = EXPR_NULL;
3691
  tmp_sym->value->value.constructor->expr->ts.is_iso_c = 1;
3692
  /* Must declare c_null_ptr and c_null_funptr as having the
3693
     PARAMETER attribute so they can be used in init expressions.  */
3694
  tmp_sym->attr.flavor = FL_PARAMETER;
3695
 
3696
  return SUCCESS;
3697
}
3698
 
3699
 
3700
/* Add a formal argument, gfc_formal_arglist, to the
3701
   end of the given list of arguments.  Set the reference to the
3702
   provided symbol, param_sym, in the argument.  */
3703
 
3704
static void
3705
add_formal_arg (gfc_formal_arglist **head,
3706
                gfc_formal_arglist **tail,
3707
                gfc_formal_arglist *formal_arg,
3708
                gfc_symbol *param_sym)
3709
{
3710
  /* Put in list, either as first arg or at the tail (curr arg).  */
3711
  if (*head == NULL)
3712
    *head = *tail = formal_arg;
3713
  else
3714
    {
3715
      (*tail)->next = formal_arg;
3716
      (*tail) = formal_arg;
3717
    }
3718
 
3719
  (*tail)->sym = param_sym;
3720
  (*tail)->next = NULL;
3721
 
3722
  return;
3723
}
3724
 
3725
 
3726
/* Generates a symbol representing the CPTR argument to an
3727
   iso_c_binding procedure.  Also, create a gfc_formal_arglist for the
3728
   CPTR and add it to the provided argument list.  */
3729
 
3730
static void
3731
gen_cptr_param (gfc_formal_arglist **head,
3732
                gfc_formal_arglist **tail,
3733
                const char *module_name,
3734
                gfc_namespace *ns, const char *c_ptr_name,
3735
                int iso_c_sym_id)
3736
{
3737
  gfc_symbol *param_sym = NULL;
3738
  gfc_symbol *c_ptr_sym = NULL;
3739
  gfc_symtree *param_symtree = NULL;
3740
  gfc_formal_arglist *formal_arg = NULL;
3741
  const char *c_ptr_in;
3742
  const char *c_ptr_type = NULL;
3743
 
3744
  if (iso_c_sym_id == ISOCBINDING_F_PROCPOINTER)
3745
    c_ptr_type = "_gfortran_iso_c_binding_c_funptr";
3746
  else
3747
    c_ptr_type = "_gfortran_iso_c_binding_c_ptr";
3748
 
3749
  if(c_ptr_name == NULL)
3750
    c_ptr_in = "gfc_cptr__";
3751
  else
3752
    c_ptr_in = c_ptr_name;
3753
  gfc_get_sym_tree (c_ptr_in, ns, &param_symtree, false);
3754
  if (param_symtree != NULL)
3755
    param_sym = param_symtree->n.sym;
3756
  else
3757
    gfc_internal_error ("gen_cptr_param(): Unable to "
3758
                        "create symbol for %s", c_ptr_in);
3759
 
3760
  /* Set up the appropriate fields for the new c_ptr param sym.  */
3761
  param_sym->refs++;
3762
  param_sym->attr.flavor = FL_DERIVED;
3763
  param_sym->ts.type = BT_DERIVED;
3764
  param_sym->attr.intent = INTENT_IN;
3765
  param_sym->attr.dummy = 1;
3766
 
3767
  /* This will pass the ptr to the iso_c routines as a (void *).  */
3768
  param_sym->attr.value = 1;
3769
  param_sym->attr.use_assoc = 1;
3770
 
3771
  /* Get the symbol for c_ptr or c_funptr, no matter what it's name is
3772
     (user renamed).  */
3773
  if (iso_c_sym_id == ISOCBINDING_F_PROCPOINTER)
3774
    c_ptr_sym = get_iso_c_binding_dt (ISOCBINDING_FUNPTR);
3775
  else
3776
    c_ptr_sym = get_iso_c_binding_dt (ISOCBINDING_PTR);
3777
  if (c_ptr_sym == NULL)
3778
    {
3779
      /* This can happen if the user did not define c_ptr but they are
3780
         trying to use one of the iso_c_binding functions that need it.  */
3781
      if (iso_c_sym_id == ISOCBINDING_F_PROCPOINTER)
3782
        generate_isocbinding_symbol (module_name, ISOCBINDING_FUNPTR,
3783
                                     (const char *)c_ptr_type);
3784
      else
3785
        generate_isocbinding_symbol (module_name, ISOCBINDING_PTR,
3786
                                     (const char *)c_ptr_type);
3787
 
3788
      gfc_get_ha_symbol (c_ptr_type, &(c_ptr_sym));
3789
    }
3790
 
3791
  param_sym->ts.u.derived = c_ptr_sym;
3792
  param_sym->module = gfc_get_string (module_name);
3793
 
3794
  /* Make new formal arg.  */
3795
  formal_arg = gfc_get_formal_arglist ();
3796
  /* Add arg to list of formal args (the CPTR arg).  */
3797
  add_formal_arg (head, tail, formal_arg, param_sym);
3798
}
3799
 
3800
 
3801
/* Generates a symbol representing the FPTR argument to an
3802
   iso_c_binding procedure.  Also, create a gfc_formal_arglist for the
3803
   FPTR and add it to the provided argument list.  */
3804
 
3805
static void
3806
gen_fptr_param (gfc_formal_arglist **head,
3807
                gfc_formal_arglist **tail,
3808
                const char *module_name,
3809
                gfc_namespace *ns, const char *f_ptr_name, int proc)
3810
{
3811
  gfc_symbol *param_sym = NULL;
3812
  gfc_symtree *param_symtree = NULL;
3813
  gfc_formal_arglist *formal_arg = NULL;
3814
  const char *f_ptr_out = "gfc_fptr__";
3815
 
3816
  if (f_ptr_name != NULL)
3817
    f_ptr_out = f_ptr_name;
3818
 
3819
  gfc_get_sym_tree (f_ptr_out, ns, &param_symtree, false);
3820
  if (param_symtree != NULL)
3821
    param_sym = param_symtree->n.sym;
3822
  else
3823
    gfc_internal_error ("generateFPtrParam(): Unable to "
3824
                        "create symbol for %s", f_ptr_out);
3825
 
3826
  /* Set up the necessary fields for the fptr output param sym.  */
3827
  param_sym->refs++;
3828
  if (proc)
3829
    param_sym->attr.proc_pointer = 1;
3830
  else
3831
    param_sym->attr.pointer = 1;
3832
  param_sym->attr.dummy = 1;
3833
  param_sym->attr.use_assoc = 1;
3834
 
3835
  /* ISO C Binding type to allow any pointer type as actual param.  */
3836
  param_sym->ts.type = BT_VOID;
3837
  param_sym->module = gfc_get_string (module_name);
3838
 
3839
  /* Make the arg.  */
3840
  formal_arg = gfc_get_formal_arglist ();
3841
  /* Add arg to list of formal args.  */
3842
  add_formal_arg (head, tail, formal_arg, param_sym);
3843
}
3844
 
3845
 
3846
/* Generates a symbol representing the optional SHAPE argument for the
3847
   iso_c_binding c_f_pointer() procedure.  Also, create a
3848
   gfc_formal_arglist for the SHAPE and add it to the provided
3849
   argument list.  */
3850
 
3851
static void
3852
gen_shape_param (gfc_formal_arglist **head,
3853
                 gfc_formal_arglist **tail,
3854
                 const char *module_name,
3855
                 gfc_namespace *ns, const char *shape_param_name)
3856
{
3857
  gfc_symbol *param_sym = NULL;
3858
  gfc_symtree *param_symtree = NULL;
3859
  gfc_formal_arglist *formal_arg = NULL;
3860
  const char *shape_param = "gfc_shape_array__";
3861
  int i;
3862
 
3863
  if (shape_param_name != NULL)
3864
    shape_param = shape_param_name;
3865
 
3866
  gfc_get_sym_tree (shape_param, ns, &param_symtree, false);
3867
  if (param_symtree != NULL)
3868
    param_sym = param_symtree->n.sym;
3869
  else
3870
    gfc_internal_error ("generateShapeParam(): Unable to "
3871
                        "create symbol for %s", shape_param);
3872
 
3873
  /* Set up the necessary fields for the shape input param sym.  */
3874
  param_sym->refs++;
3875
  param_sym->attr.dummy = 1;
3876
  param_sym->attr.use_assoc = 1;
3877
 
3878
  /* Integer array, rank 1, describing the shape of the object.  Make it's
3879
     type BT_VOID initially so we can accept any type/kind combination of
3880
     integer.  During gfc_iso_c_sub_interface (resolve.c), we'll make it
3881
     of BT_INTEGER type.  */
3882
  param_sym->ts.type = BT_VOID;
3883
 
3884
  /* Initialize the kind to default integer.  However, it will be overridden
3885
     during resolution to match the kind of the SHAPE parameter given as
3886
     the actual argument (to allow for any valid integer kind).  */
3887
  param_sym->ts.kind = gfc_default_integer_kind;
3888
  param_sym->as = gfc_get_array_spec ();
3889
 
3890
  /* Clear out the dimension info for the array.  */
3891
  for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
3892
    {
3893
      param_sym->as->lower[i] = NULL;
3894
      param_sym->as->upper[i] = NULL;
3895
    }
3896
  param_sym->as->rank = 1;
3897
  param_sym->as->lower[0] = gfc_int_expr (1);
3898
 
3899
  /* The extent is unknown until we get it.  The length give us
3900
     the rank the incoming pointer.  */
3901
  param_sym->as->type = AS_ASSUMED_SHAPE;
3902
 
3903
  /* The arg is also optional; it is required iff the second arg
3904
     (fptr) is to an array, otherwise, it's ignored.  */
3905
  param_sym->attr.optional = 1;
3906
  param_sym->attr.intent = INTENT_IN;
3907
  param_sym->attr.dimension = 1;
3908
  param_sym->module = gfc_get_string (module_name);
3909
 
3910
  /* Make the arg.  */
3911
  formal_arg = gfc_get_formal_arglist ();
3912
  /* Add arg to list of formal args.  */
3913
  add_formal_arg (head, tail, formal_arg, param_sym);
3914
}
3915
 
3916
 
3917
/* Add a procedure interface to the given symbol (i.e., store a
3918
   reference to the list of formal arguments).  */
3919
 
3920
static void
3921
add_proc_interface (gfc_symbol *sym, ifsrc source,
3922
                    gfc_formal_arglist *formal)
3923
{
3924
 
3925
  sym->formal = formal;
3926
  sym->attr.if_source = source;
3927
}
3928
 
3929
 
3930
/* Copy the formal args from an existing symbol, src, into a new
3931
   symbol, dest.  New formal args are created, and the description of
3932
   each arg is set according to the existing ones.  This function is
3933
   used when creating procedure declaration variables from a procedure
3934
   declaration statement (see match_proc_decl()) to create the formal
3935
   args based on the args of a given named interface.  */
3936
 
3937
void
3938
gfc_copy_formal_args (gfc_symbol *dest, gfc_symbol *src)
3939
{
3940
  gfc_formal_arglist *head = NULL;
3941
  gfc_formal_arglist *tail = NULL;
3942
  gfc_formal_arglist *formal_arg = NULL;
3943
  gfc_formal_arglist *curr_arg = NULL;
3944
  gfc_formal_arglist *formal_prev = NULL;
3945
  /* Save current namespace so we can change it for formal args.  */
3946
  gfc_namespace *parent_ns = gfc_current_ns;
3947
 
3948
  /* Create a new namespace, which will be the formal ns (namespace
3949
     of the formal args).  */
3950
  gfc_current_ns = gfc_get_namespace (parent_ns, 0);
3951
  gfc_current_ns->proc_name = dest;
3952
 
3953
  for (curr_arg = src->formal; curr_arg; curr_arg = curr_arg->next)
3954
    {
3955
      formal_arg = gfc_get_formal_arglist ();
3956
      gfc_get_symbol (curr_arg->sym->name, gfc_current_ns, &(formal_arg->sym));
3957
 
3958
      /* May need to copy more info for the symbol.  */
3959
      formal_arg->sym->attr = curr_arg->sym->attr;
3960
      formal_arg->sym->ts = curr_arg->sym->ts;
3961
      formal_arg->sym->as = gfc_copy_array_spec (curr_arg->sym->as);
3962
      gfc_copy_formal_args (formal_arg->sym, curr_arg->sym);
3963
 
3964
      /* If this isn't the first arg, set up the next ptr.  For the
3965
        last arg built, the formal_arg->next will never get set to
3966
        anything other than NULL.  */
3967
      if (formal_prev != NULL)
3968
        formal_prev->next = formal_arg;
3969
      else
3970
        formal_arg->next = NULL;
3971
 
3972
      formal_prev = formal_arg;
3973
 
3974
      /* Add arg to list of formal args.  */
3975
      add_formal_arg (&head, &tail, formal_arg, formal_arg->sym);
3976
    }
3977
 
3978
  /* Add the interface to the symbol.  */
3979
  add_proc_interface (dest, IFSRC_DECL, head);
3980
 
3981
  /* Store the formal namespace information.  */
3982
  if (dest->formal != NULL)
3983
    /* The current ns should be that for the dest proc.  */
3984
    dest->formal_ns = gfc_current_ns;
3985
  /* Restore the current namespace to what it was on entry.  */
3986
  gfc_current_ns = parent_ns;
3987
}
3988
 
3989
 
3990
void
3991
gfc_copy_formal_args_intr (gfc_symbol *dest, gfc_intrinsic_sym *src)
3992
{
3993
  gfc_formal_arglist *head = NULL;
3994
  gfc_formal_arglist *tail = NULL;
3995
  gfc_formal_arglist *formal_arg = NULL;
3996
  gfc_intrinsic_arg *curr_arg = NULL;
3997
  gfc_formal_arglist *formal_prev = NULL;
3998
  /* Save current namespace so we can change it for formal args.  */
3999
  gfc_namespace *parent_ns = gfc_current_ns;
4000
 
4001
  /* Create a new namespace, which will be the formal ns (namespace
4002
     of the formal args).  */
4003
  gfc_current_ns = gfc_get_namespace (parent_ns, 0);
4004
  gfc_current_ns->proc_name = dest;
4005
 
4006
  for (curr_arg = src->formal; curr_arg; curr_arg = curr_arg->next)
4007
    {
4008
      formal_arg = gfc_get_formal_arglist ();
4009
      gfc_get_symbol (curr_arg->name, gfc_current_ns, &(formal_arg->sym));
4010
 
4011
      /* May need to copy more info for the symbol.  */
4012
      formal_arg->sym->ts = curr_arg->ts;
4013
      formal_arg->sym->attr.optional = curr_arg->optional;
4014
      formal_arg->sym->attr.intent = curr_arg->intent;
4015
      formal_arg->sym->attr.flavor = FL_VARIABLE;
4016
      formal_arg->sym->attr.dummy = 1;
4017
 
4018
      if (formal_arg->sym->ts.type == BT_CHARACTER)
4019
        formal_arg->sym->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
4020
 
4021
      /* If this isn't the first arg, set up the next ptr.  For the
4022
        last arg built, the formal_arg->next will never get set to
4023
        anything other than NULL.  */
4024
      if (formal_prev != NULL)
4025
        formal_prev->next = formal_arg;
4026
      else
4027
        formal_arg->next = NULL;
4028
 
4029
      formal_prev = formal_arg;
4030
 
4031
      /* Add arg to list of formal args.  */
4032
      add_formal_arg (&head, &tail, formal_arg, formal_arg->sym);
4033
    }
4034
 
4035
  /* Add the interface to the symbol.  */
4036
  add_proc_interface (dest, IFSRC_DECL, head);
4037
 
4038
  /* Store the formal namespace information.  */
4039
  if (dest->formal != NULL)
4040
    /* The current ns should be that for the dest proc.  */
4041
    dest->formal_ns = gfc_current_ns;
4042
  /* Restore the current namespace to what it was on entry.  */
4043
  gfc_current_ns = parent_ns;
4044
}
4045
 
4046
 
4047
void
4048
gfc_copy_formal_args_ppc (gfc_component *dest, gfc_symbol *src)
4049
{
4050
  gfc_formal_arglist *head = NULL;
4051
  gfc_formal_arglist *tail = NULL;
4052
  gfc_formal_arglist *formal_arg = NULL;
4053
  gfc_formal_arglist *curr_arg = NULL;
4054
  gfc_formal_arglist *formal_prev = NULL;
4055
  /* Save current namespace so we can change it for formal args.  */
4056
  gfc_namespace *parent_ns = gfc_current_ns;
4057
 
4058
  /* Create a new namespace, which will be the formal ns (namespace
4059
     of the formal args).  */
4060
  gfc_current_ns = gfc_get_namespace (parent_ns, 0);
4061
  /* TODO: gfc_current_ns->proc_name = dest;*/
4062
 
4063
  for (curr_arg = src->formal; curr_arg; curr_arg = curr_arg->next)
4064
    {
4065
      formal_arg = gfc_get_formal_arglist ();
4066
      gfc_get_symbol (curr_arg->sym->name, gfc_current_ns, &(formal_arg->sym));
4067
 
4068
      /* May need to copy more info for the symbol.  */
4069
      formal_arg->sym->attr = curr_arg->sym->attr;
4070
      formal_arg->sym->ts = curr_arg->sym->ts;
4071
      formal_arg->sym->as = gfc_copy_array_spec (curr_arg->sym->as);
4072
      gfc_copy_formal_args (formal_arg->sym, curr_arg->sym);
4073
 
4074
      /* If this isn't the first arg, set up the next ptr.  For the
4075
        last arg built, the formal_arg->next will never get set to
4076
        anything other than NULL.  */
4077
      if (formal_prev != NULL)
4078
        formal_prev->next = formal_arg;
4079
      else
4080
        formal_arg->next = NULL;
4081
 
4082
      formal_prev = formal_arg;
4083
 
4084
      /* Add arg to list of formal args.  */
4085
      add_formal_arg (&head, &tail, formal_arg, formal_arg->sym);
4086
    }
4087
 
4088
  /* Add the interface to the symbol.  */
4089
  dest->formal = head;
4090
  dest->attr.if_source = IFSRC_DECL;
4091
 
4092
  /* Store the formal namespace information.  */
4093
  if (dest->formal != NULL)
4094
    /* The current ns should be that for the dest proc.  */
4095
    dest->formal_ns = gfc_current_ns;
4096
  /* Restore the current namespace to what it was on entry.  */
4097
  gfc_current_ns = parent_ns;
4098
}
4099
 
4100
 
4101
/* Builds the parameter list for the iso_c_binding procedure
4102
   c_f_pointer or c_f_procpointer.  The old_sym typically refers to a
4103
   generic version of either the c_f_pointer or c_f_procpointer
4104
   functions.  The new_proc_sym represents a "resolved" version of the
4105
   symbol.  The functions are resolved to match the types of their
4106
   parameters; for example, c_f_pointer(cptr, fptr) would resolve to
4107
   something similar to c_f_pointer_i4 if the type of data object fptr
4108
   pointed to was a default integer.  The actual name of the resolved
4109
   procedure symbol is further mangled with the module name, etc., but
4110
   the idea holds true.  */
4111
 
4112
static void
4113
build_formal_args (gfc_symbol *new_proc_sym,
4114
                   gfc_symbol *old_sym, int add_optional_arg)
4115
{
4116
  gfc_formal_arglist *head = NULL, *tail = NULL;
4117
  gfc_namespace *parent_ns = NULL;
4118
 
4119
  parent_ns = gfc_current_ns;
4120
  /* Create a new namespace, which will be the formal ns (namespace
4121
     of the formal args).  */
4122
  gfc_current_ns = gfc_get_namespace(parent_ns, 0);
4123
  gfc_current_ns->proc_name = new_proc_sym;
4124
 
4125
  /* Generate the params.  */
4126
  if (old_sym->intmod_sym_id == ISOCBINDING_F_PROCPOINTER)
4127
    {
4128
      gen_cptr_param (&head, &tail, (const char *) new_proc_sym->module,
4129
                      gfc_current_ns, "cptr", old_sym->intmod_sym_id);
4130
      gen_fptr_param (&head, &tail, (const char *) new_proc_sym->module,
4131
                      gfc_current_ns, "fptr", 1);
4132
    }
4133
  else if (old_sym->intmod_sym_id == ISOCBINDING_F_POINTER)
4134
    {
4135
      gen_cptr_param (&head, &tail, (const char *) new_proc_sym->module,
4136
                      gfc_current_ns, "cptr", old_sym->intmod_sym_id);
4137
      gen_fptr_param (&head, &tail, (const char *) new_proc_sym->module,
4138
                      gfc_current_ns, "fptr", 0);
4139
      /* If we're dealing with c_f_pointer, it has an optional third arg.  */
4140
      gen_shape_param (&head, &tail,(const char *) new_proc_sym->module,
4141
                       gfc_current_ns, "shape");
4142
 
4143
    }
4144
  else if (old_sym->intmod_sym_id == ISOCBINDING_ASSOCIATED)
4145
    {
4146
      /* c_associated has one required arg and one optional; both
4147
         are c_ptrs.  */
4148
      gen_cptr_param (&head, &tail, (const char *) new_proc_sym->module,
4149
                      gfc_current_ns, "c_ptr_1", ISOCBINDING_ASSOCIATED);
4150
      if (add_optional_arg)
4151
        {
4152
          gen_cptr_param (&head, &tail, (const char *) new_proc_sym->module,
4153
                          gfc_current_ns, "c_ptr_2", ISOCBINDING_ASSOCIATED);
4154
          /* The last param is optional so mark it as such.  */
4155
          tail->sym->attr.optional = 1;
4156
        }
4157
    }
4158
 
4159
  /* Add the interface (store formal args to new_proc_sym).  */
4160
  add_proc_interface (new_proc_sym, IFSRC_DECL, head);
4161
 
4162
  /* Set up the formal_ns pointer to the one created for the
4163
     new procedure so it'll get cleaned up during gfc_free_symbol().  */
4164
  new_proc_sym->formal_ns = gfc_current_ns;
4165
 
4166
  gfc_current_ns = parent_ns;
4167
}
4168
 
4169
static int
4170
std_for_isocbinding_symbol (int id)
4171
{
4172
  switch (id)
4173
    {
4174
#define NAMED_INTCST(a,b,c,d) \
4175
      case a:\
4176
        return d;
4177
#include "iso-c-binding.def"
4178
#undef NAMED_INTCST
4179
       default:
4180
         return GFC_STD_F2003;
4181
    }
4182
}
4183
 
4184
/* Generate the given set of C interoperable kind objects, or all
4185
   interoperable kinds.  This function will only be given kind objects
4186
   for valid iso_c_binding defined types because this is verified when
4187
   the 'use' statement is parsed.  If the user gives an 'only' clause,
4188
   the specific kinds are looked up; if they don't exist, an error is
4189
   reported.  If the user does not give an 'only' clause, all
4190
   iso_c_binding symbols are generated.  If a list of specific kinds
4191
   is given, it must have a NULL in the first empty spot to mark the
4192
   end of the list.  */
4193
 
4194
 
4195
void
4196
generate_isocbinding_symbol (const char *mod_name, iso_c_binding_symbol s,
4197
                             const char *local_name)
4198
{
4199
  const char *const name = (local_name && local_name[0]) ? local_name
4200
                                             : c_interop_kinds_table[s].name;
4201
  gfc_symtree *tmp_symtree = NULL;
4202
  gfc_symbol *tmp_sym = NULL;
4203
  gfc_dt_list **dt_list_ptr = NULL;
4204
  gfc_component *tmp_comp = NULL;
4205
  char comp_name[(GFC_MAX_SYMBOL_LEN * 2) + 1];
4206
  int index;
4207
 
4208
  if (gfc_notification_std (std_for_isocbinding_symbol (s)) == ERROR)
4209
    return;
4210
  tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
4211
 
4212
  /* Already exists in this scope so don't re-add it.
4213
     TODO: we should probably check that it's really the same symbol.  */
4214
  if (tmp_symtree != NULL)
4215
    return;
4216
 
4217
  /* Create the sym tree in the current ns.  */
4218
  gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
4219
  if (tmp_symtree)
4220
    tmp_sym = tmp_symtree->n.sym;
4221
  else
4222
    gfc_internal_error ("generate_isocbinding_symbol(): Unable to "
4223
                        "create symbol");
4224
 
4225
  /* Say what module this symbol belongs to.  */
4226
  tmp_sym->module = gfc_get_string (mod_name);
4227
  tmp_sym->from_intmod = INTMOD_ISO_C_BINDING;
4228
  tmp_sym->intmod_sym_id = s;
4229
 
4230
  switch (s)
4231
    {
4232
 
4233
#define NAMED_INTCST(a,b,c,d) case a : 
4234
#define NAMED_REALCST(a,b,c) case a :
4235
#define NAMED_CMPXCST(a,b,c) case a :
4236
#define NAMED_LOGCST(a,b,c) case a :
4237
#define NAMED_CHARKNDCST(a,b,c) case a :
4238
#include "iso-c-binding.def"
4239
 
4240
        tmp_sym->value = gfc_int_expr (c_interop_kinds_table[s].value);
4241
 
4242
        /* Initialize an integer constant expression node.  */
4243
        tmp_sym->attr.flavor = FL_PARAMETER;
4244
        tmp_sym->ts.type = BT_INTEGER;
4245
        tmp_sym->ts.kind = gfc_default_integer_kind;
4246
 
4247
        /* Mark this type as a C interoperable one.  */
4248
        tmp_sym->ts.is_c_interop = 1;
4249
        tmp_sym->ts.is_iso_c = 1;
4250
        tmp_sym->value->ts.is_c_interop = 1;
4251
        tmp_sym->value->ts.is_iso_c = 1;
4252
        tmp_sym->attr.is_c_interop = 1;
4253
 
4254
        /* Tell what f90 type this c interop kind is valid.  */
4255
        tmp_sym->ts.f90_type = c_interop_kinds_table[s].f90_type;
4256
 
4257
        /* Say it's from the iso_c_binding module.  */
4258
        tmp_sym->attr.is_iso_c = 1;
4259
 
4260
        /* Make it use associated.  */
4261
        tmp_sym->attr.use_assoc = 1;
4262
        break;
4263
 
4264
 
4265
#define NAMED_CHARCST(a,b,c) case a :
4266
#include "iso-c-binding.def"
4267
 
4268
        /* Initialize an integer constant expression node for the
4269
           length of the character.  */
4270
        tmp_sym->value = gfc_get_expr ();
4271
        tmp_sym->value->expr_type = EXPR_CONSTANT;
4272
        tmp_sym->value->ts.type = BT_CHARACTER;
4273
        tmp_sym->value->ts.kind = gfc_default_character_kind;
4274
        tmp_sym->value->where = gfc_current_locus;
4275
        tmp_sym->value->ts.is_c_interop = 1;
4276
        tmp_sym->value->ts.is_iso_c = 1;
4277
        tmp_sym->value->value.character.length = 1;
4278
        tmp_sym->value->value.character.string = gfc_get_wide_string (2);
4279
        tmp_sym->value->value.character.string[0]
4280
          = (gfc_char_t) c_interop_kinds_table[s].value;
4281
        tmp_sym->value->value.character.string[1] = '\0';
4282
        tmp_sym->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
4283
        tmp_sym->ts.u.cl->length = gfc_int_expr (1);
4284
 
4285
        /* May not need this in both attr and ts, but do need in
4286
           attr for writing module file.  */
4287
        tmp_sym->attr.is_c_interop = 1;
4288
 
4289
        tmp_sym->attr.flavor = FL_PARAMETER;
4290
        tmp_sym->ts.type = BT_CHARACTER;
4291
 
4292
        /* Need to set it to the C_CHAR kind.  */
4293
        tmp_sym->ts.kind = gfc_default_character_kind;
4294
 
4295
        /* Mark this type as a C interoperable one.  */
4296
        tmp_sym->ts.is_c_interop = 1;
4297
        tmp_sym->ts.is_iso_c = 1;
4298
 
4299
        /* Tell what f90 type this c interop kind is valid.  */
4300
        tmp_sym->ts.f90_type = BT_CHARACTER;
4301
 
4302
        /* Say it's from the iso_c_binding module.  */
4303
        tmp_sym->attr.is_iso_c = 1;
4304
 
4305
        /* Make it use associated.  */
4306
        tmp_sym->attr.use_assoc = 1;
4307
        break;
4308
 
4309
      case ISOCBINDING_PTR:
4310
      case ISOCBINDING_FUNPTR:
4311
 
4312
        /* Initialize an integer constant expression node.  */
4313
        tmp_sym->attr.flavor = FL_DERIVED;
4314
        tmp_sym->ts.is_c_interop = 1;
4315
        tmp_sym->attr.is_c_interop = 1;
4316
        tmp_sym->attr.is_iso_c = 1;
4317
        tmp_sym->ts.is_iso_c = 1;
4318
        tmp_sym->ts.type = BT_DERIVED;
4319
 
4320
        /* A derived type must have the bind attribute to be
4321
           interoperable (J3/04-007, Section 15.2.3), even though
4322
           the binding label is not used.  */
4323
        tmp_sym->attr.is_bind_c = 1;
4324
 
4325
        tmp_sym->attr.referenced = 1;
4326
 
4327
        tmp_sym->ts.u.derived = tmp_sym;
4328
 
4329
        /* Add the symbol created for the derived type to the current ns.  */
4330
        dt_list_ptr = &(gfc_derived_types);
4331
        while (*dt_list_ptr != NULL && (*dt_list_ptr)->next != NULL)
4332
          dt_list_ptr = &((*dt_list_ptr)->next);
4333
 
4334
        /* There is already at least one derived type in the list, so append
4335
           the one we're currently building for c_ptr or c_funptr.  */
4336
        if (*dt_list_ptr != NULL)
4337
          dt_list_ptr = &((*dt_list_ptr)->next);
4338
        (*dt_list_ptr) = gfc_get_dt_list ();
4339
        (*dt_list_ptr)->derived = tmp_sym;
4340
        (*dt_list_ptr)->next = NULL;
4341
 
4342
        /* Set up the component of the derived type, which will be
4343
           an integer with kind equal to c_ptr_size.  Mangle the name of
4344
           the field for the c_address to prevent the curious user from
4345
           trying to access it from Fortran.  */
4346
        sprintf (comp_name, "__%s_%s", tmp_sym->name, "c_address");
4347
        gfc_add_component (tmp_sym, comp_name, &tmp_comp);
4348
        if (tmp_comp == NULL)
4349
          gfc_internal_error ("generate_isocbinding_symbol(): Unable to "
4350
                              "create component for c_address");
4351
 
4352
        tmp_comp->ts.type = BT_INTEGER;
4353
 
4354
        /* Set this because the module will need to read/write this field.  */
4355
        tmp_comp->ts.f90_type = BT_INTEGER;
4356
 
4357
        /* The kinds for c_ptr and c_funptr are the same.  */
4358
        index = get_c_kind ("c_ptr", c_interop_kinds_table);
4359
        tmp_comp->ts.kind = c_interop_kinds_table[index].value;
4360
 
4361
        tmp_comp->attr.pointer = 0;
4362
        tmp_comp->attr.dimension = 0;
4363
 
4364
        /* Mark the component as C interoperable.  */
4365
        tmp_comp->ts.is_c_interop = 1;
4366
 
4367
        /* Make it use associated (iso_c_binding module).  */
4368
        tmp_sym->attr.use_assoc = 1;
4369
        break;
4370
 
4371
      case ISOCBINDING_NULL_PTR:
4372
      case ISOCBINDING_NULL_FUNPTR:
4373
        gen_special_c_interop_ptr (s, name, mod_name);
4374
        break;
4375
 
4376
      case ISOCBINDING_F_POINTER:
4377
      case ISOCBINDING_ASSOCIATED:
4378
      case ISOCBINDING_LOC:
4379
      case ISOCBINDING_FUNLOC:
4380
      case ISOCBINDING_F_PROCPOINTER:
4381
 
4382
        tmp_sym->attr.proc = PROC_MODULE;
4383
 
4384
        /* Use the procedure's name as it is in the iso_c_binding module for
4385
           setting the binding label in case the user renamed the symbol.  */
4386
        sprintf (tmp_sym->binding_label, "%s_%s", mod_name,
4387
                 c_interop_kinds_table[s].name);
4388
        tmp_sym->attr.is_iso_c = 1;
4389
        if (s == ISOCBINDING_F_POINTER || s == ISOCBINDING_F_PROCPOINTER)
4390
          tmp_sym->attr.subroutine = 1;
4391
        else
4392
          {
4393
            /* TODO!  This needs to be finished more for the expr of the
4394
               function or something!
4395
               This may not need to be here, because trying to do c_loc
4396
               as an external.  */
4397
            if (s == ISOCBINDING_ASSOCIATED)
4398
              {
4399
                tmp_sym->attr.function = 1;
4400
                tmp_sym->ts.type = BT_LOGICAL;
4401
                tmp_sym->ts.kind = gfc_default_logical_kind;
4402
                tmp_sym->result = tmp_sym;
4403
              }
4404
            else
4405
              {
4406
               /* Here, we're taking the simple approach.  We're defining
4407
                  c_loc as an external identifier so the compiler will put
4408
                  what we expect on the stack for the address we want the
4409
                  C address of.  */
4410
                tmp_sym->ts.type = BT_DERIVED;
4411
                if (s == ISOCBINDING_LOC)
4412
                  tmp_sym->ts.u.derived =
4413
                    get_iso_c_binding_dt (ISOCBINDING_PTR);
4414
                else
4415
                  tmp_sym->ts.u.derived =
4416
                    get_iso_c_binding_dt (ISOCBINDING_FUNPTR);
4417
 
4418
                if (tmp_sym->ts.u.derived == NULL)
4419
                  {
4420
                    /* Create the necessary derived type so we can continue
4421
                       processing the file.  */
4422
                    generate_isocbinding_symbol
4423
                      (mod_name, s == ISOCBINDING_FUNLOC
4424
                                 ? ISOCBINDING_FUNPTR : ISOCBINDING_PTR,
4425
                       (const char *)(s == ISOCBINDING_FUNLOC
4426
                                ? "_gfortran_iso_c_binding_c_funptr"
4427
                                : "_gfortran_iso_c_binding_c_ptr"));
4428
                    tmp_sym->ts.u.derived =
4429
                      get_iso_c_binding_dt (s == ISOCBINDING_FUNLOC
4430
                                            ? ISOCBINDING_FUNPTR
4431
                                            : ISOCBINDING_PTR);
4432
                  }
4433
 
4434
                /* The function result is itself (no result clause).  */
4435
                tmp_sym->result = tmp_sym;
4436
                tmp_sym->attr.external = 1;
4437
                tmp_sym->attr.use_assoc = 0;
4438
                tmp_sym->attr.pure = 1;
4439
                tmp_sym->attr.if_source = IFSRC_UNKNOWN;
4440
                tmp_sym->attr.proc = PROC_UNKNOWN;
4441
              }
4442
          }
4443
 
4444
        tmp_sym->attr.flavor = FL_PROCEDURE;
4445
        tmp_sym->attr.contained = 0;
4446
 
4447
       /* Try using this builder routine, with the new and old symbols
4448
          both being the generic iso_c proc sym being created.  This
4449
          will create the formal args (and the new namespace for them).
4450
          Don't build an arg list for c_loc because we're going to treat
4451
          c_loc as an external procedure.  */
4452
        if (s != ISOCBINDING_LOC && s != ISOCBINDING_FUNLOC)
4453
          /* The 1 says to add any optional args, if applicable.  */
4454
          build_formal_args (tmp_sym, tmp_sym, 1);
4455
 
4456
        /* Set this after setting up the symbol, to prevent error messages.  */
4457
        tmp_sym->attr.use_assoc = 1;
4458
 
4459
        /* This symbol will not be referenced directly.  It will be
4460
           resolved to the implementation for the given f90 kind.  */
4461
        tmp_sym->attr.referenced = 0;
4462
 
4463
        break;
4464
 
4465
      default:
4466
        gcc_unreachable ();
4467
    }
4468
}
4469
 
4470
 
4471
/* Creates a new symbol based off of an old iso_c symbol, with a new
4472
   binding label.  This function can be used to create a new,
4473
   resolved, version of a procedure symbol for c_f_pointer or
4474
   c_f_procpointer that is based on the generic symbols.  A new
4475
   parameter list is created for the new symbol using
4476
   build_formal_args().  The add_optional_flag specifies whether the
4477
   to add the optional SHAPE argument.  The new symbol is
4478
   returned.  */
4479
 
4480
gfc_symbol *
4481
get_iso_c_sym (gfc_symbol *old_sym, char *new_name,
4482
               char *new_binding_label, int add_optional_arg)
4483
{
4484
  gfc_symtree *new_symtree = NULL;
4485
 
4486
  /* See if we have a symbol by that name already available, looking
4487
     through any parent namespaces.  */
4488
  gfc_find_sym_tree (new_name, gfc_current_ns, 1, &new_symtree);
4489
  if (new_symtree != NULL)
4490
    /* Return the existing symbol.  */
4491
    return new_symtree->n.sym;
4492
 
4493
  /* Create the symtree/symbol, with attempted host association.  */
4494
  gfc_get_ha_sym_tree (new_name, &new_symtree);
4495
  if (new_symtree == NULL)
4496
    gfc_internal_error ("get_iso_c_sym(): Unable to create "
4497
                        "symtree for '%s'", new_name);
4498
 
4499
  /* Now fill in the fields of the resolved symbol with the old sym.  */
4500
  strcpy (new_symtree->n.sym->binding_label, new_binding_label);
4501
  new_symtree->n.sym->attr = old_sym->attr;
4502
  new_symtree->n.sym->ts = old_sym->ts;
4503
  new_symtree->n.sym->module = gfc_get_string (old_sym->module);
4504
  new_symtree->n.sym->from_intmod = old_sym->from_intmod;
4505
  new_symtree->n.sym->intmod_sym_id = old_sym->intmod_sym_id;
4506
  if (old_sym->attr.function)
4507
    new_symtree->n.sym->result = new_symtree->n.sym;
4508
  /* Build the formal arg list.  */
4509
  build_formal_args (new_symtree->n.sym, old_sym, add_optional_arg);
4510
 
4511
  gfc_commit_symbol (new_symtree->n.sym);
4512
 
4513
  return new_symtree->n.sym;
4514
}
4515
 
4516
 
4517
/* Check that a symbol is already typed.  If strict is not set, an untyped
4518
   symbol is acceptable for non-standard-conforming mode.  */
4519
 
4520
gfc_try
4521
gfc_check_symbol_typed (gfc_symbol* sym, gfc_namespace* ns,
4522
                        bool strict, locus where)
4523
{
4524
  gcc_assert (sym);
4525
 
4526
  if (gfc_matching_prefix)
4527
    return SUCCESS;
4528
 
4529
  /* Check for the type and try to give it an implicit one.  */
4530
  if (sym->ts.type == BT_UNKNOWN
4531
      && gfc_set_default_type (sym, 0, ns) == FAILURE)
4532
    {
4533
      if (strict)
4534
        {
4535
          gfc_error ("Symbol '%s' is used before it is typed at %L",
4536
                     sym->name, &where);
4537
          return FAILURE;
4538
        }
4539
 
4540
      if (gfc_notify_std (GFC_STD_GNU,
4541
                          "Extension: Symbol '%s' is used before"
4542
                          " it is typed at %L", sym->name, &where) == FAILURE)
4543
        return FAILURE;
4544
    }
4545
 
4546
  /* Everything is ok.  */
4547
  return SUCCESS;
4548
}
4549
 
4550
 
4551
/* Construct a typebound-procedure structure.  Those are stored in a tentative
4552
   list and marked `error' until symbols are committed.  */
4553
 
4554
gfc_typebound_proc*
4555
gfc_get_typebound_proc (void)
4556
{
4557
  gfc_typebound_proc *result;
4558
  tentative_tbp *list_node;
4559
 
4560
  result = XCNEW (gfc_typebound_proc);
4561
  result->error = 1;
4562
 
4563
  list_node = XCNEW (tentative_tbp);
4564
  list_node->next = tentative_tbp_list;
4565
  list_node->proc = result;
4566
  tentative_tbp_list = list_node;
4567
 
4568
  return result;
4569
}
4570
 
4571
 
4572
/* Get the super-type of a given derived type.  */
4573
 
4574
gfc_symbol*
4575
gfc_get_derived_super_type (gfc_symbol* derived)
4576
{
4577
  if (!derived->attr.extension)
4578
    return NULL;
4579
 
4580
  gcc_assert (derived->components);
4581
  gcc_assert (derived->components->ts.type == BT_DERIVED);
4582
  gcc_assert (derived->components->ts.u.derived);
4583
 
4584
  return derived->components->ts.u.derived;
4585
}
4586
 
4587
 
4588
/* Get the ultimate super-type of a given derived type.  */
4589
 
4590
gfc_symbol*
4591
gfc_get_ultimate_derived_super_type (gfc_symbol* derived)
4592
{
4593
  if (!derived->attr.extension)
4594
    return NULL;
4595
 
4596
  derived = gfc_get_derived_super_type (derived);
4597
 
4598
  if (derived->attr.extension)
4599
    return gfc_get_ultimate_derived_super_type (derived);
4600
  else
4601
    return derived;
4602
}
4603
 
4604
 
4605
/* Check if a derived type t2 is an extension of (or equal to) a type t1.  */
4606
 
4607
bool
4608
gfc_type_is_extension_of (gfc_symbol *t1, gfc_symbol *t2)
4609
{
4610
  while (!gfc_compare_derived_types (t1, t2) && t2->attr.extension)
4611
    t2 = gfc_get_derived_super_type (t2);
4612
  return gfc_compare_derived_types (t1, t2);
4613
}
4614
 
4615
 
4616
/* Check if two typespecs are type compatible (F03:5.1.1.2):
4617
   If ts1 is nonpolymorphic, ts2 must be the same type.
4618
   If ts1 is polymorphic (CLASS), ts2 must be an extension of ts1.  */
4619
 
4620
bool
4621
gfc_type_compatible (gfc_typespec *ts1, gfc_typespec *ts2)
4622
{
4623
  gfc_component *cmp1, *cmp2;
4624
 
4625
  bool is_class1 = (ts1->type == BT_CLASS);
4626
  bool is_class2 = (ts2->type == BT_CLASS);
4627
  bool is_derived1 = (ts1->type == BT_DERIVED);
4628
  bool is_derived2 = (ts2->type == BT_DERIVED);
4629
 
4630
  if (!is_derived1 && !is_derived2 && !is_class1 && !is_class2)
4631
    return (ts1->type == ts2->type);
4632
 
4633
  if (is_derived1 && is_derived2)
4634
    return gfc_compare_derived_types (ts1->u.derived, ts2->u.derived);
4635
 
4636
  cmp1 = cmp2 = NULL;
4637
 
4638
  if (is_class1)
4639
    {
4640
      cmp1 = gfc_find_component (ts1->u.derived, "$data", true, false);
4641
      if (cmp1 == NULL)
4642
        return 0;
4643
    }
4644
 
4645
  if (is_class2)
4646
    {
4647
      cmp2 = gfc_find_component (ts2->u.derived, "$data", true, false);
4648
      if (cmp2 == NULL)
4649
        return 0;
4650
    }
4651
 
4652
  if (is_class1 && is_derived2)
4653
    return gfc_type_is_extension_of (cmp1->ts.u.derived, ts2->u.derived);
4654
 
4655
  else if (is_class1 && is_class2)
4656
    return gfc_type_is_extension_of (cmp1->ts.u.derived, cmp2->ts.u.derived);
4657
 
4658
  else
4659
    return 0;
4660
}
4661
 
4662
 
4663
/* Build a polymorphic CLASS entity, using the symbol that comes from
4664
   build_sym. A CLASS entity is represented by an encapsulating type,
4665
   which contains the declared type as '$data' component, plus a pointer
4666
   component '$vptr' which determines the dynamic type.  */
4667
 
4668
gfc_try
4669
gfc_build_class_symbol (gfc_typespec *ts, symbol_attribute *attr,
4670
                        gfc_array_spec **as)
4671
{
4672
  char name[GFC_MAX_SYMBOL_LEN + 5];
4673
  gfc_symbol *fclass;
4674
  gfc_symbol *vtab;
4675
  gfc_component *c;
4676
 
4677
  /* Determine the name of the encapsulating type.  */
4678
  if ((*as) && (*as)->rank && attr->allocatable)
4679
    sprintf (name, ".class.%s.%d.a", ts->u.derived->name, (*as)->rank);
4680
  else if ((*as) && (*as)->rank)
4681
    sprintf (name, ".class.%s.%d", ts->u.derived->name, (*as)->rank);
4682
  else if (attr->allocatable)
4683
    sprintf (name, ".class.%s.a", ts->u.derived->name);
4684
  else
4685
    sprintf (name, ".class.%s", ts->u.derived->name);
4686
 
4687
  gfc_find_symbol (name, ts->u.derived->ns, 0, &fclass);
4688
  if (fclass == NULL)
4689
    {
4690
      gfc_symtree *st;
4691
      /* If not there, create a new symbol.  */
4692
      fclass = gfc_new_symbol (name, ts->u.derived->ns);
4693
      st = gfc_new_symtree (&ts->u.derived->ns->sym_root, name);
4694
      st->n.sym = fclass;
4695
      gfc_set_sym_referenced (fclass);
4696
      fclass->refs++;
4697
      fclass->ts.type = BT_UNKNOWN;
4698
      fclass->attr.abstract = ts->u.derived->attr.abstract;
4699
      if (ts->u.derived->f2k_derived)
4700
        fclass->f2k_derived = gfc_get_namespace (NULL, 0);
4701
      if (gfc_add_flavor (&fclass->attr, FL_DERIVED,
4702
          NULL, &gfc_current_locus) == FAILURE)
4703
        return FAILURE;
4704
 
4705
      /* Add component '$data'.  */
4706
      if (gfc_add_component (fclass, "$data", &c) == FAILURE)
4707
        return FAILURE;
4708
      c->ts = *ts;
4709
      c->ts.type = BT_DERIVED;
4710
      c->attr.access = ACCESS_PRIVATE;
4711
      c->ts.u.derived = ts->u.derived;
4712
      c->attr.class_pointer = attr->pointer;
4713
      c->attr.pointer = attr->pointer || attr->dummy;
4714
      c->attr.allocatable = attr->allocatable;
4715
      c->attr.dimension = attr->dimension;
4716
      c->attr.abstract = ts->u.derived->attr.abstract;
4717
      c->as = (*as);
4718
      c->initializer = gfc_get_expr ();
4719
      c->initializer->expr_type = EXPR_NULL;
4720
 
4721
      /* Add component '$vptr'.  */
4722
      if (gfc_add_component (fclass, "$vptr", &c) == FAILURE)
4723
        return FAILURE;
4724
      c->ts.type = BT_DERIVED;
4725
      vtab = gfc_find_derived_vtab (ts->u.derived);
4726
      gcc_assert (vtab);
4727
      c->ts.u.derived = vtab->ts.u.derived;
4728
      c->attr.pointer = 1;
4729
      c->initializer = gfc_get_expr ();
4730
      c->initializer->expr_type = EXPR_NULL;
4731
    }
4732
 
4733
  /* Since the extension field is 8 bit wide, we can only have
4734
     up to 255 extension levels.  */
4735
  if (ts->u.derived->attr.extension == 255)
4736
    {
4737
      gfc_error ("Maximum extension level reached with type '%s' at %L",
4738
                 ts->u.derived->name, &ts->u.derived->declared_at);
4739
      return FAILURE;
4740
    }
4741
 
4742
  fclass->attr.extension = ts->u.derived->attr.extension + 1;
4743
  fclass->attr.is_class = 1;
4744
  ts->u.derived = fclass;
4745
  attr->allocatable = attr->pointer = attr->dimension = 0;
4746
  (*as) = NULL;  /* XXX */
4747
  return SUCCESS;
4748
}
4749
 
4750
 
4751
/* Find the symbol for a derived type's vtab.  */
4752
 
4753
gfc_symbol *
4754
gfc_find_derived_vtab (gfc_symbol *derived)
4755
{
4756
  gfc_namespace *ns;
4757
  gfc_symbol *vtab = NULL, *vtype = NULL;
4758
  char name[2 * GFC_MAX_SYMBOL_LEN + 8];
4759
 
4760
  ns = gfc_current_ns;
4761
 
4762
  for (; ns; ns = ns->parent)
4763
    if (!ns->parent)
4764
      break;
4765
 
4766
  if (ns)
4767
    {
4768
      sprintf (name, "vtab$%s", derived->name);
4769
      gfc_find_symbol (name, ns, 0, &vtab);
4770
 
4771
      if (vtab == NULL)
4772
        {
4773
          gfc_get_symbol (name, ns, &vtab);
4774
          vtab->ts.type = BT_DERIVED;
4775
          vtab->attr.flavor = FL_VARIABLE;
4776
          vtab->attr.target = 1;
4777
          vtab->attr.save = SAVE_EXPLICIT;
4778
          vtab->attr.vtab = 1;
4779
          vtab->attr.access = ACCESS_PRIVATE;
4780
          vtab->refs++;
4781
          gfc_set_sym_referenced (vtab);
4782
          sprintf (name, "vtype$%s", derived->name);
4783
 
4784
          gfc_find_symbol (name, ns, 0, &vtype);
4785
          if (vtype == NULL)
4786
            {
4787
              gfc_component *c;
4788
              gfc_symbol *parent = NULL, *parent_vtab = NULL;
4789
 
4790
              gfc_get_symbol (name, ns, &vtype);
4791
              if (gfc_add_flavor (&vtype->attr, FL_DERIVED,
4792
                                  NULL, &gfc_current_locus) == FAILURE)
4793
                return NULL;
4794
              vtype->refs++;
4795
              gfc_set_sym_referenced (vtype);
4796
              vtype->attr.access = ACCESS_PRIVATE;
4797
 
4798
              /* Add component '$hash'.  */
4799
              if (gfc_add_component (vtype, "$hash", &c) == FAILURE)
4800
                return NULL;
4801
              c->ts.type = BT_INTEGER;
4802
              c->ts.kind = 4;
4803
              c->attr.access = ACCESS_PRIVATE;
4804
              c->initializer = gfc_int_expr (derived->hash_value);
4805
 
4806
              /* Add component '$size'.  */
4807
              if (gfc_add_component (vtype, "$size", &c) == FAILURE)
4808
                return NULL;
4809
              c->ts.type = BT_INTEGER;
4810
              c->ts.kind = 4;
4811
              c->attr.access = ACCESS_PRIVATE;
4812
              /* Remember the derived type in ts.u.derived,
4813
                 so that the correct initializer can be set later on
4814
                 (in gfc_conv_structure).  */
4815
              c->ts.u.derived = derived;
4816
              c->initializer = gfc_int_expr (0);
4817
 
4818
              /* Add component $extends.  */
4819
              if (gfc_add_component (vtype, "$extends", &c) == FAILURE)
4820
                return NULL;
4821
              c->attr.pointer = 1;
4822
              c->attr.access = ACCESS_PRIVATE;
4823
              c->initializer = gfc_get_expr ();
4824
              parent = gfc_get_derived_super_type (derived);
4825
              if (parent)
4826
                {
4827
                  parent_vtab = gfc_find_derived_vtab (parent);
4828
                  c->ts.type = BT_DERIVED;
4829
                  c->ts.u.derived = parent_vtab->ts.u.derived;
4830
                  c->initializer->expr_type = EXPR_VARIABLE;
4831
                  gfc_find_sym_tree (parent_vtab->name, parent_vtab->ns, 0,
4832
                                     &c->initializer->symtree);
4833
                }
4834
              else
4835
                {
4836
                  c->ts.type = BT_DERIVED;
4837
                  c->ts.u.derived = vtype;
4838
                  c->initializer->expr_type = EXPR_NULL;
4839
                }
4840
            }
4841
          vtab->ts.u.derived = vtype;
4842
 
4843
          vtab->value = gfc_default_initializer (&vtab->ts);
4844
        }
4845
    }
4846
 
4847
  return vtab;
4848
}
4849
 
4850
 
4851
/* General worker function to find either a type-bound procedure or a
4852
   type-bound user operator.  */
4853
 
4854
static gfc_symtree*
4855
find_typebound_proc_uop (gfc_symbol* derived, gfc_try* t,
4856
                         const char* name, bool noaccess, bool uop,
4857
                         locus* where)
4858
{
4859
  gfc_symtree* res;
4860
  gfc_symtree* root;
4861
 
4862
  /* Set correct symbol-root.  */
4863
  gcc_assert (derived->f2k_derived);
4864
  root = (uop ? derived->f2k_derived->tb_uop_root
4865
              : derived->f2k_derived->tb_sym_root);
4866
 
4867
  /* Set default to failure.  */
4868
  if (t)
4869
    *t = FAILURE;
4870
 
4871
  /* Try to find it in the current type's namespace.  */
4872
  res = gfc_find_symtree (root, name);
4873
  if (res && res->n.tb && !res->n.tb->error)
4874
    {
4875
      /* We found one.  */
4876
      if (t)
4877
        *t = SUCCESS;
4878
 
4879
      if (!noaccess && derived->attr.use_assoc
4880
          && res->n.tb->access == ACCESS_PRIVATE)
4881
        {
4882
          if (where)
4883
            gfc_error ("'%s' of '%s' is PRIVATE at %L",
4884
                       name, derived->name, where);
4885
          if (t)
4886
            *t = FAILURE;
4887
        }
4888
 
4889
      return res;
4890
    }
4891
 
4892
  /* Otherwise, recurse on parent type if derived is an extension.  */
4893
  if (derived->attr.extension)
4894
    {
4895
      gfc_symbol* super_type;
4896
      super_type = gfc_get_derived_super_type (derived);
4897
      gcc_assert (super_type);
4898
 
4899
      return find_typebound_proc_uop (super_type, t, name,
4900
                                      noaccess, uop, where);
4901
    }
4902
 
4903
  /* Nothing found.  */
4904
  return NULL;
4905
}
4906
 
4907
 
4908
/* Find a type-bound procedure or user operator by name for a derived-type
4909
   (looking recursively through the super-types).  */
4910
 
4911
gfc_symtree*
4912
gfc_find_typebound_proc (gfc_symbol* derived, gfc_try* t,
4913
                         const char* name, bool noaccess, locus* where)
4914
{
4915
  return find_typebound_proc_uop (derived, t, name, noaccess, false, where);
4916
}
4917
 
4918
gfc_symtree*
4919
gfc_find_typebound_user_op (gfc_symbol* derived, gfc_try* t,
4920
                            const char* name, bool noaccess, locus* where)
4921
{
4922
  return find_typebound_proc_uop (derived, t, name, noaccess, true, where);
4923
}
4924
 
4925
 
4926
/* Find a type-bound intrinsic operator looking recursively through the
4927
   super-type hierarchy.  */
4928
 
4929
gfc_typebound_proc*
4930
gfc_find_typebound_intrinsic_op (gfc_symbol* derived, gfc_try* t,
4931
                                 gfc_intrinsic_op op, bool noaccess,
4932
                                 locus* where)
4933
{
4934
  gfc_typebound_proc* res;
4935
 
4936
  /* Set default to failure.  */
4937
  if (t)
4938
    *t = FAILURE;
4939
 
4940
  /* Try to find it in the current type's namespace.  */
4941
  if (derived->f2k_derived)
4942
    res = derived->f2k_derived->tb_op[op];
4943
  else
4944
    res = NULL;
4945
 
4946
  /* Check access.  */
4947
  if (res && !res->error)
4948
    {
4949
      /* We found one.  */
4950
      if (t)
4951
        *t = SUCCESS;
4952
 
4953
      if (!noaccess && derived->attr.use_assoc
4954
          && res->access == ACCESS_PRIVATE)
4955
        {
4956
          if (where)
4957
            gfc_error ("'%s' of '%s' is PRIVATE at %L",
4958
                       gfc_op2string (op), derived->name, where);
4959
          if (t)
4960
            *t = FAILURE;
4961
        }
4962
 
4963
      return res;
4964
    }
4965
 
4966
  /* Otherwise, recurse on parent type if derived is an extension.  */
4967
  if (derived->attr.extension)
4968
    {
4969
      gfc_symbol* super_type;
4970
      super_type = gfc_get_derived_super_type (derived);
4971
      gcc_assert (super_type);
4972
 
4973
      return gfc_find_typebound_intrinsic_op (super_type, t, op,
4974
                                              noaccess, where);
4975
    }
4976
 
4977
  /* Nothing found.  */
4978
  return NULL;
4979
}
4980
 
4981
 
4982
/* Get a typebound-procedure symtree or create and insert it if not yet
4983
   present.  This is like a very simplified version of gfc_get_sym_tree for
4984
   tbp-symtrees rather than regular ones.  */
4985
 
4986
gfc_symtree*
4987
gfc_get_tbp_symtree (gfc_symtree **root, const char *name)
4988
{
4989
  gfc_symtree *result;
4990
 
4991
  result = gfc_find_symtree (*root, name);
4992
  if (!result)
4993
    {
4994
      result = gfc_new_symtree (root, name);
4995
      gcc_assert (result);
4996
      result->n.tb = NULL;
4997
    }
4998
 
4999
  return result;
5000
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.