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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [fortran/] [symbol.c] - Blame information for rev 806

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

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

powered by: WebSVN 2.1.0

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