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

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.5.1/] [gcc/] [cp/] [typeck2.c] - Blame information for rev 424

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

Line No. Rev Author Line
1 283 jeremybenn
/* Report error messages, build initializers, and perform
2
   some front-end optimizations for C++ compiler.
3
   Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
4
   1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009
5
   Free Software Foundation, Inc.
6
   Hacked by Michael Tiemann (tiemann@cygnus.com)
7
 
8
This file is part of GCC.
9
 
10
GCC is free software; you can redistribute it and/or modify
11
it under the terms of the GNU General Public License as published by
12
the Free Software Foundation; either version 3, or (at your option)
13
any later version.
14
 
15
GCC is distributed in the hope that it will be useful,
16
but WITHOUT ANY WARRANTY; without even the implied warranty of
17
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
GNU General Public License for more details.
19
 
20
You should have received a copy of the GNU General Public License
21
along with GCC; see the file COPYING3.  If not see
22
<http://www.gnu.org/licenses/>.  */
23
 
24
 
25
/* This file is part of the C++ front end.
26
   It contains routines to build C++ expressions given their operands,
27
   including computing the types of the result, C and C++ specific error
28
   checks, and some optimization.  */
29
 
30
#include "config.h"
31
#include "system.h"
32
#include "coretypes.h"
33
#include "tm.h"
34
#include "tree.h"
35
#include "intl.h"
36
#include "cp-tree.h"
37
#include "flags.h"
38
#include "toplev.h"
39
#include "output.h"
40
#include "diagnostic.h"
41
#include "real.h"
42
 
43
static tree
44
process_init_constructor (tree type, tree init);
45
 
46
 
47
/* Print an error message stemming from an attempt to use
48
   BASETYPE as a base class for TYPE.  */
49
 
50
tree
51
error_not_base_type (tree basetype, tree type)
52
{
53
  if (TREE_CODE (basetype) == FUNCTION_DECL)
54
    basetype = DECL_CONTEXT (basetype);
55
  error ("type %qT is not a base type for type %qT", basetype, type);
56
  return error_mark_node;
57
}
58
 
59
tree
60
binfo_or_else (tree base, tree type)
61
{
62
  tree binfo = lookup_base (type, base, ba_unique, NULL);
63
 
64
  if (binfo == error_mark_node)
65
    return NULL_TREE;
66
  else if (!binfo)
67
    error_not_base_type (base, type);
68
  return binfo;
69
}
70
 
71
/* According to ARM $7.1.6, "A `const' object may be initialized, but its
72
   value may not be changed thereafter.  */
73
 
74
void
75
readonly_error (tree arg, readonly_error_kind errstring)
76
{
77
 
78
/* This macro is used to emit diagnostics to ensure that all format
79
   strings are complete sentences, visible to gettext and checked at
80
   compile time.  */
81
 
82
#define ERROR_FOR_ASSIGNMENT(AS, ASM, IN, DE, ARG)                      \
83
  do {                                                                  \
84
    switch (errstring)                                                  \
85
      {                                                                 \
86
      case REK_ASSIGNMENT:                                              \
87
        error(AS, ARG);                                                 \
88
        break;                                                          \
89
      case REK_ASSIGNMENT_ASM:                                          \
90
        error(ASM, ARG);                                                \
91
        break;                                                          \
92
      case REK_INCREMENT:                                               \
93
        error (IN, ARG);                                                \
94
        break;                                                          \
95
      case REK_DECREMENT:                                               \
96
        error (DE, ARG);                                                \
97
        break;                                                          \
98
      default:                                                          \
99
        gcc_unreachable ();                                             \
100
      }                                                                 \
101
  } while (0)
102
 
103
  if (TREE_CODE (arg) == COMPONENT_REF)
104
    {
105
      if (TYPE_READONLY (TREE_TYPE (TREE_OPERAND (arg, 0))))
106
        ERROR_FOR_ASSIGNMENT (G_("assignment of "
107
                                 "data-member %qD in read-only structure"),
108
                              G_("assignment (via 'asm' output) of "
109
                                 "data-member %qD in read-only structure"),
110
                              G_("increment of "
111
                                 "data-member %qD in read-only structure"),
112
                              G_("decrement of "
113
                                 "data-member %qD in read-only structure"),
114
                              TREE_OPERAND (arg, 1));
115
      else
116
        ERROR_FOR_ASSIGNMENT (G_("assignment of "
117
                                 "read-only data-member %qD"),
118
                              G_("assignment (via 'asm' output) of "
119
                                 "read-only data-member %qD"),
120
                              G_("increment of "
121
                                 "read-only data-member %qD"),
122
                              G_("decrement of "
123
                                 "read-only data-member %qD"),
124
                              TREE_OPERAND (arg, 1));
125
    }
126
  else if (TREE_CODE (arg) == VAR_DECL)
127
    {
128
      if (DECL_LANG_SPECIFIC (arg)
129
          && DECL_IN_AGGR_P (arg)
130
          && !TREE_STATIC (arg))
131
        ERROR_FOR_ASSIGNMENT (G_("assignment of "
132
                              "constant field %qD"),
133
                              G_("assignment (via 'asm' output) of "
134
                              "constant field %qD"),
135
                              G_("increment of "
136
                              "constant field %qD"),
137
                              G_("decrement of "
138
                              "constant field %qD"),
139
                              arg);
140
      else
141
        ERROR_FOR_ASSIGNMENT (G_("assignment of "
142
                              "read-only variable %qD"),
143
                              G_("assignment (via 'asm' output) of "
144
                              "read-only variable %qD"),
145
                              G_("increment of "
146
                              "read-only variable %qD"),
147
                              G_("decrement of "
148
                              "read-only variable %qD"),
149
                              arg);
150
 
151
    }
152
  else if (TREE_CODE (arg) == PARM_DECL)
153
    ERROR_FOR_ASSIGNMENT (G_("assignment of "
154
                             "read-only parameter %qD"),
155
                          G_("assignment (via 'asm' output) of "
156
                             "read-only parameter %qD"),
157
                          G_("increment of "
158
                             "read-only parameter %qD"),
159
                          G_("decrement of "
160
                             "read-only parameter %qD"),
161
                          arg);
162
  else if (TREE_CODE (arg) == INDIRECT_REF
163
           && TREE_CODE (TREE_TYPE (TREE_OPERAND (arg, 0))) == REFERENCE_TYPE
164
           && (TREE_CODE (TREE_OPERAND (arg, 0)) == VAR_DECL
165
               || TREE_CODE (TREE_OPERAND (arg, 0)) == PARM_DECL))
166
    ERROR_FOR_ASSIGNMENT (G_("assignment of "
167
                             "read-only reference %qD"),
168
                          G_("assignment (via 'asm' output) of "
169
                             "read-only reference %qD"),
170
                          G_("increment of "
171
                             "read-only reference %qD"),
172
                          G_("decrement of "
173
                             "read-only reference %qD"),
174
                          TREE_OPERAND (arg, 0));
175
  else if (TREE_CODE (arg) == RESULT_DECL)
176
    ERROR_FOR_ASSIGNMENT (G_("assignment of "
177
                             "read-only named return value %qD"),
178
                          G_("assignment (via 'asm' output) of "
179
                             "read-only named return value %qD"),
180
                          G_("increment of "
181
                             "read-only named return value %qD"),
182
                          G_("decrement of "
183
                             "read-only named return value %qD"),
184
                          arg);
185
  else if (TREE_CODE (arg) == FUNCTION_DECL)
186
    ERROR_FOR_ASSIGNMENT (G_("assignment of "
187
                             "function %qD"),
188
                          G_("assignment (via 'asm' output) of "
189
                             "function %qD"),
190
                          G_("increment of "
191
                             "function %qD"),
192
                          G_("decrement of "
193
                             "function %qD"),
194
                          arg);
195
  else
196
    ERROR_FOR_ASSIGNMENT (G_("assignment of "
197
                             "read-only location %qE"),
198
                          G_("assignment (via 'asm' output) of "
199
                             "read-only location %qE"),
200
                          G_("increment of "
201
                             "read-only location %qE"),
202
                          G_("decrement of "
203
                             "read-only location %qE"),
204
                          arg);
205
}
206
 
207
 
208
/* Structure that holds information about declarations whose type was
209
   incomplete and we could not check whether it was abstract or not.  */
210
 
211
struct GTY((chain_next ("%h.next"))) pending_abstract_type {
212
  /* Declaration which we are checking for abstractness. It is either
213
     a DECL node, or an IDENTIFIER_NODE if we do not have a full
214
     declaration available.  */
215
  tree decl;
216
 
217
  /* Type which will be checked for abstractness.  */
218
  tree type;
219
 
220
  /* Position of the declaration. This is only needed for IDENTIFIER_NODEs,
221
     because DECLs already carry locus information.  */
222
  location_t locus;
223
 
224
  /* Link to the next element in list.  */
225
  struct pending_abstract_type* next;
226
};
227
 
228
 
229
/* Compute the hash value of the node VAL. This function is used by the
230
   hash table abstract_pending_vars.  */
231
 
232
static hashval_t
233
pat_calc_hash (const void* val)
234
{
235
  const struct pending_abstract_type *pat =
236
     (const struct pending_abstract_type *) val;
237
  return (hashval_t) TYPE_UID (pat->type);
238
}
239
 
240
 
241
/* Compare node VAL1 with the type VAL2. This function is used by the
242
   hash table abstract_pending_vars.  */
243
 
244
static int
245
pat_compare (const void* val1, const void* val2)
246
{
247
  const struct pending_abstract_type *const pat1 =
248
     (const struct pending_abstract_type *) val1;
249
  const_tree const type2 = (const_tree)val2;
250
 
251
  return (pat1->type == type2);
252
}
253
 
254
/* Hash table that maintains pending_abstract_type nodes, for which we still
255
   need to check for type abstractness.  The key of the table is the type
256
   of the declaration.  */
257
static GTY ((param_is (struct pending_abstract_type)))
258
htab_t abstract_pending_vars = NULL;
259
 
260
 
261
/* This function is called after TYPE is completed, and will check if there
262
   are pending declarations for which we still need to verify the abstractness
263
   of TYPE, and emit a diagnostic (through abstract_virtuals_error) if TYPE
264
   turned out to be incomplete.  */
265
 
266
void
267
complete_type_check_abstract (tree type)
268
{
269
  void **slot;
270
  struct pending_abstract_type *pat;
271
  location_t cur_loc = input_location;
272
 
273
  gcc_assert (COMPLETE_TYPE_P (type));
274
 
275
  if (!abstract_pending_vars)
276
    return;
277
 
278
  /* Retrieve the list of pending declarations for this type.  */
279
  slot = htab_find_slot_with_hash (abstract_pending_vars, type,
280
                                   (hashval_t)TYPE_UID (type), NO_INSERT);
281
  if (!slot)
282
    return;
283
  pat = (struct pending_abstract_type*)*slot;
284
  gcc_assert (pat);
285
 
286
  /* If the type is not abstract, do not do anything.  */
287
  if (CLASSTYPE_PURE_VIRTUALS (type))
288
    {
289
      struct pending_abstract_type *prev = 0, *next;
290
 
291
      /* Reverse the list to emit the errors in top-down order.  */
292
      for (; pat; pat = next)
293
        {
294
          next = pat->next;
295
          pat->next = prev;
296
          prev = pat;
297
        }
298
      pat = prev;
299
 
300
      /* Go through the list, and call abstract_virtuals_error for each
301
        element: it will issue a diagnostic if the type is abstract.  */
302
      while (pat)
303
        {
304
          gcc_assert (type == pat->type);
305
 
306
          /* Tweak input_location so that the diagnostic appears at the correct
307
            location. Notice that this is only needed if the decl is an
308
            IDENTIFIER_NODE.  */
309
          input_location = pat->locus;
310
          abstract_virtuals_error (pat->decl, pat->type);
311
          pat = pat->next;
312
        }
313
    }
314
 
315
  htab_clear_slot (abstract_pending_vars, slot);
316
 
317
  input_location = cur_loc;
318
}
319
 
320
 
321
/* If TYPE has abstract virtual functions, issue an error about trying
322
   to create an object of that type.  DECL is the object declared, or
323
   NULL_TREE if the declaration is unavailable.  Returns 1 if an error
324
   occurred; zero if all was well.  */
325
 
326
int
327
abstract_virtuals_error (tree decl, tree type)
328
{
329
  VEC(tree,gc) *pure;
330
 
331
  /* This function applies only to classes. Any other entity can never
332
     be abstract.  */
333
  if (!CLASS_TYPE_P (type))
334
    return 0;
335
  type = TYPE_MAIN_VARIANT (type);
336
 
337
  /* If the type is incomplete, we register it within a hash table,
338
     so that we can check again once it is completed. This makes sense
339
     only for objects for which we have a declaration or at least a
340
     name.  */
341
  if (!COMPLETE_TYPE_P (type))
342
    {
343
      void **slot;
344
      struct pending_abstract_type *pat;
345
 
346
      gcc_assert (!decl || DECL_P (decl)
347
                  || TREE_CODE (decl) == IDENTIFIER_NODE);
348
 
349
      if (!abstract_pending_vars)
350
        abstract_pending_vars = htab_create_ggc (31, &pat_calc_hash,
351
                                                &pat_compare, NULL);
352
 
353
      slot = htab_find_slot_with_hash (abstract_pending_vars, type,
354
                                      (hashval_t)TYPE_UID (type), INSERT);
355
 
356
      pat = GGC_NEW (struct pending_abstract_type);
357
      pat->type = type;
358
      pat->decl = decl;
359
      pat->locus = ((decl && DECL_P (decl))
360
                    ? DECL_SOURCE_LOCATION (decl)
361
                    : input_location);
362
 
363
      pat->next = (struct pending_abstract_type *) *slot;
364
      *slot = pat;
365
 
366
      return 0;
367
    }
368
 
369
  if (!TYPE_SIZE (type))
370
    /* TYPE is being defined, and during that time
371
       CLASSTYPE_PURE_VIRTUALS holds the inline friends.  */
372
    return 0;
373
 
374
  pure = CLASSTYPE_PURE_VIRTUALS (type);
375
  if (!pure)
376
    return 0;
377
 
378
  if (decl)
379
    {
380
      if (TREE_CODE (decl) == RESULT_DECL)
381
        return 0;
382
 
383
      if (TREE_CODE (decl) == VAR_DECL)
384
        error ("cannot declare variable %q+D to be of abstract "
385
               "type %qT", decl, type);
386
      else if (TREE_CODE (decl) == PARM_DECL)
387
        error ("cannot declare parameter %q+D to be of abstract type %qT",
388
               decl, type);
389
      else if (TREE_CODE (decl) == FIELD_DECL)
390
        error ("cannot declare field %q+D to be of abstract type %qT",
391
               decl, type);
392
      else if (TREE_CODE (decl) == FUNCTION_DECL
393
               && TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
394
        error ("invalid abstract return type for member function %q+#D", decl);
395
      else if (TREE_CODE (decl) == FUNCTION_DECL)
396
        error ("invalid abstract return type for function %q+#D", decl);
397
      else if (TREE_CODE (decl) == IDENTIFIER_NODE)
398
        /* Here we do not have location information.  */
399
        error ("invalid abstract type %qT for %qE", type, decl);
400
      else
401
        error ("invalid abstract type for %q+D", decl);
402
    }
403
  else
404
    error ("cannot allocate an object of abstract type %qT", type);
405
 
406
  /* Only go through this once.  */
407
  if (VEC_length (tree, pure))
408
    {
409
      unsigned ix;
410
      tree fn;
411
 
412
      inform (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (type)),
413
              "  because the following virtual functions are pure within %qT:",
414
              type);
415
 
416
      for (ix = 0; VEC_iterate (tree, pure, ix, fn); ix++)
417
        inform (input_location, "\t%+#D", fn);
418
      /* Now truncate the vector.  This leaves it non-null, so we know
419
         there are pure virtuals, but empty so we don't list them out
420
         again.  */
421
      VEC_truncate (tree, pure, 0);
422
    }
423
  else
424
    inform (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (type)),
425
            "  since type %qT has pure virtual functions",
426
            type);
427
 
428
  return 1;
429
}
430
 
431
/* Print an error message for invalid use of an incomplete type.
432
   VALUE is the expression that was used (or 0 if that isn't known)
433
   and TYPE is the type that was invalid.  DIAG_KIND indicates the
434
   type of diagnostic (see diagnostic.def).  */
435
 
436
void
437
cxx_incomplete_type_diagnostic (const_tree value, const_tree type,
438
                                diagnostic_t diag_kind)
439
{
440
  int decl = 0;
441
 
442
  gcc_assert (diag_kind == DK_WARNING
443
              || diag_kind == DK_PEDWARN
444
              || diag_kind == DK_ERROR);
445
 
446
  /* Avoid duplicate error message.  */
447
  if (TREE_CODE (type) == ERROR_MARK)
448
    return;
449
 
450
  if (value != 0 && (TREE_CODE (value) == VAR_DECL
451
                     || TREE_CODE (value) == PARM_DECL
452
                     || TREE_CODE (value) == FIELD_DECL))
453
    {
454
      emit_diagnostic (diag_kind, input_location, 0,
455
                       "%q+D has incomplete type", value);
456
      decl = 1;
457
    }
458
 retry:
459
  /* We must print an error message.  Be clever about what it says.  */
460
 
461
  switch (TREE_CODE (type))
462
    {
463
    case RECORD_TYPE:
464
    case UNION_TYPE:
465
    case ENUMERAL_TYPE:
466
      if (!decl)
467
        emit_diagnostic (diag_kind, input_location, 0,
468
                         "invalid use of incomplete type %q#T", type);
469
      if (!TYPE_TEMPLATE_INFO (type))
470
        emit_diagnostic (diag_kind, input_location, 0,
471
                         "forward declaration of %q+#T", type);
472
      else
473
        emit_diagnostic (diag_kind, input_location, 0,
474
                         "declaration of %q+#T", type);
475
      break;
476
 
477
    case VOID_TYPE:
478
      emit_diagnostic (diag_kind, input_location, 0,
479
                       "invalid use of %qT", type);
480
      break;
481
 
482
    case ARRAY_TYPE:
483
      if (TYPE_DOMAIN (type))
484
        {
485
          type = TREE_TYPE (type);
486
          goto retry;
487
        }
488
      emit_diagnostic (diag_kind, input_location, 0,
489
                       "invalid use of array with unspecified bounds");
490
      break;
491
 
492
    case OFFSET_TYPE:
493
    bad_member:
494
      emit_diagnostic (diag_kind, input_location, 0,
495
                       "invalid use of member (did you forget the %<&%> ?)");
496
      break;
497
 
498
    case TEMPLATE_TYPE_PARM:
499
      if (is_auto (type))
500
        emit_diagnostic (diag_kind, input_location, 0,
501
                         "invalid use of %<auto%>");
502
      else
503
        emit_diagnostic (diag_kind, input_location, 0,
504
                         "invalid use of template type parameter %qT", type);
505
      break;
506
 
507
    case BOUND_TEMPLATE_TEMPLATE_PARM:
508
      emit_diagnostic (diag_kind, input_location, 0,
509
                       "invalid use of template template parameter %qT",
510
                       TYPE_NAME (type));
511
      break;
512
 
513
    case TYPENAME_TYPE:
514
      emit_diagnostic (diag_kind, input_location, 0,
515
                       "invalid use of dependent type %qT", type);
516
      break;
517
 
518
    case UNKNOWN_TYPE:
519
      if (value && TREE_CODE (value) == COMPONENT_REF)
520
        goto bad_member;
521
      else if (value && TREE_CODE (value) == ADDR_EXPR)
522
        emit_diagnostic (diag_kind, input_location, 0,
523
                         "address of overloaded function with no contextual "
524
                         "type information");
525
      else if (value && TREE_CODE (value) == OVERLOAD)
526
        emit_diagnostic (diag_kind, input_location, 0,
527
                         "overloaded function with no contextual type information");
528
      else
529
        emit_diagnostic (diag_kind, input_location, 0,
530
                         "insufficient contextual information to determine type");
531
      break;
532
 
533
    default:
534
      gcc_unreachable ();
535
    }
536
}
537
 
538
/* Backward-compatibility interface to incomplete_type_diagnostic;
539
   required by ../tree.c.  */
540
#undef cxx_incomplete_type_error
541
void
542
cxx_incomplete_type_error (const_tree value, const_tree type)
543
{
544
  cxx_incomplete_type_diagnostic (value, type, DK_ERROR);
545
}
546
 
547
 
548
/* The recursive part of split_nonconstant_init.  DEST is an lvalue
549
   expression to which INIT should be assigned.  INIT is a CONSTRUCTOR.  */
550
 
551
static void
552
split_nonconstant_init_1 (tree dest, tree init)
553
{
554
  unsigned HOST_WIDE_INT idx;
555
  tree field_index, value;
556
  tree type = TREE_TYPE (dest);
557
  tree inner_type = NULL;
558
  bool array_type_p = false;
559
 
560
  switch (TREE_CODE (type))
561
    {
562
    case ARRAY_TYPE:
563
      inner_type = TREE_TYPE (type);
564
      array_type_p = true;
565
      /* FALLTHRU */
566
 
567
    case RECORD_TYPE:
568
    case UNION_TYPE:
569
    case QUAL_UNION_TYPE:
570
      FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (init), idx,
571
                                field_index, value)
572
        {
573
          /* The current implementation of this algorithm assumes that
574
             the field was set for all the elements. This is usually done
575
             by process_init_constructor.  */
576
          gcc_assert (field_index);
577
 
578
          if (!array_type_p)
579
            inner_type = TREE_TYPE (field_index);
580
 
581
          if (TREE_CODE (value) == CONSTRUCTOR)
582
            {
583
              tree sub;
584
 
585
              if (array_type_p)
586
                sub = build4 (ARRAY_REF, inner_type, dest, field_index,
587
                              NULL_TREE, NULL_TREE);
588
              else
589
                sub = build3 (COMPONENT_REF, inner_type, dest, field_index,
590
                              NULL_TREE);
591
 
592
              split_nonconstant_init_1 (sub, value);
593
            }
594
          else if (!initializer_constant_valid_p (value, inner_type))
595
            {
596
              tree code;
597
              tree sub;
598
 
599
              /* FIXME: Ordered removal is O(1) so the whole function is
600
                 worst-case quadratic. This could be fixed using an aside
601
                 bitmap to record which elements must be removed and remove
602
                 them all at the same time. Or by merging
603
                 split_non_constant_init into process_init_constructor_array,
604
                 that is separating constants from non-constants while building
605
                 the vector.  */
606
              VEC_ordered_remove (constructor_elt, CONSTRUCTOR_ELTS (init),
607
                                  idx);
608
              --idx;
609
 
610
              if (array_type_p)
611
                sub = build4 (ARRAY_REF, inner_type, dest, field_index,
612
                              NULL_TREE, NULL_TREE);
613
              else
614
                sub = build3 (COMPONENT_REF, inner_type, dest, field_index,
615
                              NULL_TREE);
616
 
617
              code = build2 (INIT_EXPR, inner_type, sub, value);
618
              code = build_stmt (input_location, EXPR_STMT, code);
619
              add_stmt (code);
620
              continue;
621
            }
622
        }
623
      break;
624
 
625
    case VECTOR_TYPE:
626
      if (!initializer_constant_valid_p (init, type))
627
        {
628
          tree code;
629
          tree cons = copy_node (init);
630
          CONSTRUCTOR_ELTS (init) = NULL;
631
          code = build2 (MODIFY_EXPR, type, dest, cons);
632
          code = build_stmt (input_location, EXPR_STMT, code);
633
          add_stmt (code);
634
        }
635
      break;
636
 
637
    default:
638
      gcc_unreachable ();
639
    }
640
 
641
  /* The rest of the initializer is now a constant. */
642
  TREE_CONSTANT (init) = 1;
643
}
644
 
645
/* A subroutine of store_init_value.  Splits non-constant static
646
   initializer INIT into a constant part and generates code to
647
   perform the non-constant part of the initialization to DEST.
648
   Returns the code for the runtime init.  */
649
 
650
static tree
651
split_nonconstant_init (tree dest, tree init)
652
{
653
  tree code;
654
 
655
  if (TREE_CODE (init) == CONSTRUCTOR)
656
    {
657
      code = push_stmt_list ();
658
      split_nonconstant_init_1 (dest, init);
659
      code = pop_stmt_list (code);
660
      DECL_INITIAL (dest) = init;
661
      TREE_READONLY (dest) = 0;
662
    }
663
  else
664
    code = build2 (INIT_EXPR, TREE_TYPE (dest), dest, init);
665
 
666
  return code;
667
}
668
 
669
/* Perform appropriate conversions on the initial value of a variable,
670
   store it in the declaration DECL,
671
   and print any error messages that are appropriate.
672
   If the init is invalid, store an ERROR_MARK.
673
 
674
   C++: Note that INIT might be a TREE_LIST, which would mean that it is
675
   a base class initializer for some aggregate type, hopefully compatible
676
   with DECL.  If INIT is a single element, and DECL is an aggregate
677
   type, we silently convert INIT into a TREE_LIST, allowing a constructor
678
   to be called.
679
 
680
   If INIT is a TREE_LIST and there is no constructor, turn INIT
681
   into a CONSTRUCTOR and use standard initialization techniques.
682
   Perhaps a warning should be generated?
683
 
684
   Returns code to be executed if initialization could not be performed
685
   for static variable.  In that case, caller must emit the code.  */
686
 
687
tree
688
store_init_value (tree decl, tree init, int flags)
689
{
690
  tree value, type;
691
 
692
  /* If variable's type was invalidly declared, just ignore it.  */
693
 
694
  type = TREE_TYPE (decl);
695
  if (TREE_CODE (type) == ERROR_MARK)
696
    return NULL_TREE;
697
 
698
  if (MAYBE_CLASS_TYPE_P (type))
699
    {
700
      gcc_assert (TYPE_HAS_TRIVIAL_INIT_REF (type)
701
                  || TREE_CODE (init) == CONSTRUCTOR);
702
 
703
      if (TREE_CODE (init) == TREE_LIST)
704
        {
705
          error ("constructor syntax used, but no constructor declared "
706
                 "for type %qT", type);
707
          init = build_constructor_from_list (init_list_type_node, nreverse (init));
708
        }
709
    }
710
  else if (TREE_CODE (init) == TREE_LIST
711
           && TREE_TYPE (init) != unknown_type_node)
712
    {
713
      if (TREE_CODE (decl) == RESULT_DECL)
714
        init = build_x_compound_expr_from_list (init,
715
                                                "return value initializer");
716
      else if (TREE_CODE (init) == TREE_LIST
717
               && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
718
        {
719
          error ("cannot initialize arrays using this syntax");
720
          return NULL_TREE;
721
        }
722
      else
723
        /* We get here with code like `int a (2);' */
724
        init = build_x_compound_expr_from_list (init, "initializer");
725
    }
726
 
727
  /* End of special C++ code.  */
728
 
729
  /* Digest the specified initializer into an expression.  */
730
  value = digest_init_flags (type, init, flags);
731
  /* If the initializer is not a constant, fill in DECL_INITIAL with
732
     the bits that are constant, and then return an expression that
733
     will perform the dynamic initialization.  */
734
  if (value != error_mark_node
735
      && (TREE_SIDE_EFFECTS (value)
736
           || ! initializer_constant_valid_p (value, TREE_TYPE (value))))
737
    return split_nonconstant_init (decl, value);
738
  /* If the value is a constant, just put it in DECL_INITIAL.  If DECL
739
     is an automatic variable, the middle end will turn this into a
740
     dynamic initialization later.  */
741
  DECL_INITIAL (decl) = value;
742
  return NULL_TREE;
743
}
744
 
745
 
746
/* Give errors about narrowing conversions within { }.  */
747
 
748
void
749
check_narrowing (tree type, tree init)
750
{
751
  tree ftype = unlowered_expr_type (init);
752
  bool ok = true;
753
  REAL_VALUE_TYPE d;
754
 
755
  if (DECL_P (init))
756
    init = decl_constant_value (init);
757
 
758
  if (TREE_CODE (type) == INTEGER_TYPE
759
      && TREE_CODE (ftype) == REAL_TYPE)
760
    ok = false;
761
  else if (INTEGRAL_OR_ENUMERATION_TYPE_P (ftype)
762
           && CP_INTEGRAL_TYPE_P (type))
763
    {
764
      if (TYPE_PRECISION (type) < TYPE_PRECISION (ftype)
765
          && (TREE_CODE (init) != INTEGER_CST
766
              || !int_fits_type_p (init, type)))
767
        ok = false;
768
    }
769
  else if (TREE_CODE (ftype) == REAL_TYPE
770
           && TREE_CODE (type) == REAL_TYPE)
771
    {
772
      if (TYPE_PRECISION (type) < TYPE_PRECISION (ftype))
773
        {
774
          if (TREE_CODE (init) == REAL_CST)
775
            {
776
              /* Issue 703: Loss of precision is OK as long as the value is
777
                 within the representable range of the new type.  */
778
              REAL_VALUE_TYPE r;
779
              d = TREE_REAL_CST (init);
780
              real_convert (&r, TYPE_MODE (type), &d);
781
              if (real_isinf (&r))
782
                ok = false;
783
            }
784
          else
785
            ok = false;
786
        }
787
    }
788
  else if (INTEGRAL_OR_ENUMERATION_TYPE_P (ftype)
789
           && TREE_CODE (type) == REAL_TYPE)
790
    {
791
      ok = false;
792
      if (TREE_CODE (init) == INTEGER_CST)
793
        {
794
          d = real_value_from_int_cst (0, init);
795
          if (exact_real_truncate (TYPE_MODE (type), &d))
796
            ok = true;
797
        }
798
    }
799
 
800
  if (!ok)
801
    permerror (input_location, "narrowing conversion of %qE from %qT to %qT inside { }",
802
               init, ftype, type);
803
}
804
 
805
/* Process the initializer INIT for a variable of type TYPE, emitting
806
   diagnostics for invalid initializers and converting the initializer as
807
   appropriate.
808
 
809
   For aggregate types, it assumes that reshape_init has already run, thus the
810
   initializer will have the right shape (brace elision has been undone).
811
 
812
   NESTED is true iff we are being called for an element of a CONSTRUCTOR.  */
813
 
814
static tree
815
digest_init_r (tree type, tree init, bool nested, int flags)
816
{
817
  enum tree_code code = TREE_CODE (type);
818
 
819
  if (error_operand_p (init))
820
    return error_mark_node;
821
 
822
  gcc_assert (init);
823
 
824
  /* We must strip the outermost array type when completing the type,
825
     because the its bounds might be incomplete at the moment.  */
826
  if (!complete_type_or_else (TREE_CODE (type) == ARRAY_TYPE
827
                              ? TREE_TYPE (type) : type, NULL_TREE))
828
    return error_mark_node;
829
 
830
  /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue
831
     (g++.old-deja/g++.law/casts2.C).  */
832
  if (TREE_CODE (init) == NON_LVALUE_EXPR)
833
    init = TREE_OPERAND (init, 0);
834
 
835
  /* Initialization of an array of chars from a string constant. The initializer
836
     can be optionally enclosed in braces, but reshape_init has already removed
837
     them if they were present.  */
838
  if (code == ARRAY_TYPE)
839
    {
840
      tree typ1 = TYPE_MAIN_VARIANT (TREE_TYPE (type));
841
      if (char_type_p (typ1)
842
          /*&& init */
843
          && TREE_CODE (init) == STRING_CST)
844
        {
845
          tree char_type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (init)));
846
 
847
          if (TYPE_PRECISION (typ1) == BITS_PER_UNIT)
848
            {
849
              if (char_type != char_type_node)
850
                {
851
                  error ("char-array initialized from wide string");
852
                  return error_mark_node;
853
                }
854
            }
855
          else
856
            {
857
              if (char_type == char_type_node)
858
                {
859
                  error ("int-array initialized from non-wide string");
860
                  return error_mark_node;
861
                }
862
              else if (char_type != typ1)
863
                {
864
                  error ("int-array initialized from incompatible wide string");
865
                  return error_mark_node;
866
                }
867
            }
868
 
869
          TREE_TYPE (init) = type;
870
          if (TYPE_DOMAIN (type) != 0 && TREE_CONSTANT (TYPE_SIZE (type)))
871
            {
872
              int size = TREE_INT_CST_LOW (TYPE_SIZE (type));
873
              size = (size + BITS_PER_UNIT - 1) / BITS_PER_UNIT;
874
              /* In C it is ok to subtract 1 from the length of the string
875
                 because it's ok to ignore the terminating null char that is
876
                 counted in the length of the constant, but in C++ this would
877
                 be invalid.  */
878
              if (size < TREE_STRING_LENGTH (init))
879
                permerror (input_location, "initializer-string for array of chars is too long");
880
            }
881
          return init;
882
        }
883
    }
884
 
885
  /* Handle scalar types (including conversions) and references.  */
886
  if ((TREE_CODE (type) != COMPLEX_TYPE
887
       || BRACE_ENCLOSED_INITIALIZER_P (init))
888
      && (SCALAR_TYPE_P (type) || code == REFERENCE_TYPE))
889
    {
890
      tree *exp;
891
 
892
      if (cxx_dialect != cxx98 && nested)
893
        check_narrowing (type, init);
894
      init = convert_for_initialization (0, type, init, flags,
895
                                         "initialization", NULL_TREE, 0,
896
                                         tf_warning_or_error);
897
      exp = &init;
898
 
899
      /* Skip any conversions since we'll be outputting the underlying
900
         constant.  */
901
      while (CONVERT_EXPR_P (*exp)
902
             || TREE_CODE (*exp) == NON_LVALUE_EXPR)
903
        exp = &TREE_OPERAND (*exp, 0);
904
 
905
      *exp = cplus_expand_constant (*exp);
906
 
907
      return init;
908
    }
909
 
910
  /* Come here only for aggregates: records, arrays, unions, complex numbers
911
     and vectors.  */
912
  gcc_assert (TREE_CODE (type) == ARRAY_TYPE
913
              || TREE_CODE (type) == VECTOR_TYPE
914
              || TREE_CODE (type) == RECORD_TYPE
915
              || TREE_CODE (type) == UNION_TYPE
916
              || TREE_CODE (type) == COMPLEX_TYPE);
917
 
918
  if (BRACE_ENCLOSED_INITIALIZER_P (init)
919
      && !TYPE_NON_AGGREGATE_CLASS (type))
920
    return process_init_constructor (type, init);
921
  else
922
    {
923
      if (COMPOUND_LITERAL_P (init) && TREE_CODE (type) == ARRAY_TYPE)
924
        {
925
          error ("cannot initialize aggregate of type %qT with "
926
                 "a compound literal", type);
927
 
928
          return error_mark_node;
929
        }
930
 
931
      if (TREE_CODE (type) == ARRAY_TYPE
932
          && !BRACE_ENCLOSED_INITIALIZER_P (init))
933
        {
934
          /* Allow the result of build_array_copy and of
935
             build_value_init_noctor.  */
936
          if ((TREE_CODE (init) == TARGET_EXPR
937
               || TREE_CODE (init) == CONSTRUCTOR)
938
              && (same_type_ignoring_top_level_qualifiers_p
939
                  (type, TREE_TYPE (init))))
940
            return init;
941
 
942
          error ("array must be initialized with a brace-enclosed"
943
                 " initializer");
944
          return error_mark_node;
945
        }
946
 
947
      return convert_for_initialization (NULL_TREE, type, init,
948
                                         flags,
949
                                         "initialization", NULL_TREE, 0,
950
                                         tf_warning_or_error);
951
    }
952
}
953
 
954
tree
955
digest_init (tree type, tree init)
956
{
957
  return digest_init_r (type, init, false, LOOKUP_IMPLICIT);
958
}
959
 
960
tree
961
digest_init_flags (tree type, tree init, int flags)
962
{
963
  return digest_init_r (type, init, false, flags);
964
}
965
 
966
/* Set of flags used within process_init_constructor to describe the
967
   initializers.  */
968
#define PICFLAG_ERRONEOUS 1
969
#define PICFLAG_NOT_ALL_CONSTANT 2
970
#define PICFLAG_NOT_ALL_SIMPLE 4
971
 
972
/* Given an initializer INIT, return the flag (PICFLAG_*) which better
973
   describe it.  */
974
 
975
static int
976
picflag_from_initializer (tree init)
977
{
978
  if (init == error_mark_node)
979
    return PICFLAG_ERRONEOUS;
980
  else if (!TREE_CONSTANT (init))
981
    return PICFLAG_NOT_ALL_CONSTANT;
982
  else if (!initializer_constant_valid_p (init, TREE_TYPE (init)))
983
    return PICFLAG_NOT_ALL_SIMPLE;
984
  return 0;
985
}
986
 
987
/* Subroutine of process_init_constructor, which will process an initializer
988
   INIT for an array or vector of type TYPE. Returns the flags (PICFLAG_*)
989
   which describe the initializers.  */
990
 
991
static int
992
process_init_constructor_array (tree type, tree init)
993
{
994
  unsigned HOST_WIDE_INT i, len = 0;
995
  int flags = 0;
996
  bool unbounded = false;
997
  constructor_elt *ce;
998
  VEC(constructor_elt,gc) *v = CONSTRUCTOR_ELTS (init);
999
 
1000
  gcc_assert (TREE_CODE (type) == ARRAY_TYPE
1001
              || TREE_CODE (type) == VECTOR_TYPE);
1002
 
1003
  if (TREE_CODE (type) == ARRAY_TYPE)
1004
    {
1005
      tree domain = TYPE_DOMAIN (type);
1006
      if (domain)
1007
        len = (TREE_INT_CST_LOW (TYPE_MAX_VALUE (domain))
1008
              - TREE_INT_CST_LOW (TYPE_MIN_VALUE (domain))
1009
              + 1);
1010
      else
1011
        unbounded = true;  /* Take as many as there are.  */
1012
    }
1013
  else
1014
    /* Vectors are like simple fixed-size arrays.  */
1015
    len = TYPE_VECTOR_SUBPARTS (type);
1016
 
1017
  /* There must not be more initializers than needed.  */
1018
  if (!unbounded && VEC_length (constructor_elt, v)  > len)
1019
    error ("too many initializers for %qT", type);
1020
 
1021
  for (i = 0; VEC_iterate (constructor_elt, v, i, ce); ++i)
1022
    {
1023
      if (ce->index)
1024
        {
1025
          gcc_assert (TREE_CODE (ce->index) == INTEGER_CST);
1026
          if (compare_tree_int (ce->index, i) != 0)
1027
            {
1028
              ce->value = error_mark_node;
1029
              sorry ("non-trivial designated initializers not supported");
1030
            }
1031
        }
1032
      else
1033
        ce->index = size_int (i);
1034
      gcc_assert (ce->value);
1035
      ce->value = digest_init_r (TREE_TYPE (type), ce->value, true, LOOKUP_IMPLICIT);
1036
 
1037
      if (ce->value != error_mark_node)
1038
        gcc_assert (same_type_ignoring_top_level_qualifiers_p
1039
                      (TREE_TYPE (type), TREE_TYPE (ce->value)));
1040
 
1041
      flags |= picflag_from_initializer (ce->value);
1042
    }
1043
 
1044
  /* No more initializers. If the array is unbounded, we are done. Otherwise,
1045
     we must add initializers ourselves.  */
1046
  if (!unbounded)
1047
    for (; i < len; ++i)
1048
      {
1049
        tree next;
1050
 
1051
        if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (type)))
1052
          {
1053
            /* If this type needs constructors run for default-initialization,
1054
              we can't rely on the back end to do it for us, so build up
1055
              TARGET_EXPRs.  If the type in question is a class, just build
1056
              one up; if it's an array, recurse.  */
1057
            if (MAYBE_CLASS_TYPE_P (TREE_TYPE (type)))
1058
              next = build_functional_cast (TREE_TYPE (type), NULL_TREE,
1059
                                            tf_warning_or_error);
1060
            else
1061
              next = build_constructor (init_list_type_node, NULL);
1062
            next = digest_init (TREE_TYPE (type), next);
1063
          }
1064
        else if (!zero_init_p (TREE_TYPE (type)))
1065
          next = build_zero_init (TREE_TYPE (type),
1066
                                  /*nelts=*/NULL_TREE,
1067
                                  /*static_storage_p=*/false);
1068
        else
1069
          /* The default zero-initialization is fine for us; don't
1070
             add anything to the CONSTRUCTOR.  */
1071
          break;
1072
 
1073
        flags |= picflag_from_initializer (next);
1074
        CONSTRUCTOR_APPEND_ELT (v, size_int (i), next);
1075
      }
1076
 
1077
  CONSTRUCTOR_ELTS (init) = v;
1078
  return flags;
1079
}
1080
 
1081
/* Subroutine of process_init_constructor, which will process an initializer
1082
   INIT for a class of type TYPE. Returns the flags (PICFLAG_*) which describe
1083
   the initializers.  */
1084
 
1085
static int
1086
process_init_constructor_record (tree type, tree init)
1087
{
1088
  VEC(constructor_elt,gc) *v = NULL;
1089
  int flags = 0;
1090
  tree field;
1091
  unsigned HOST_WIDE_INT idx = 0;
1092
 
1093
  gcc_assert (TREE_CODE (type) == RECORD_TYPE);
1094
  gcc_assert (!CLASSTYPE_VBASECLASSES (type));
1095
  gcc_assert (!TYPE_BINFO (type)
1096
              || !BINFO_N_BASE_BINFOS (TYPE_BINFO (type)));
1097
  gcc_assert (!TYPE_POLYMORPHIC_P (type));
1098
 
1099
  /* Generally, we will always have an index for each initializer (which is
1100
     a FIELD_DECL, put by reshape_init), but compound literals don't go trough
1101
     reshape_init. So we need to handle both cases.  */
1102
  for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
1103
    {
1104
      tree next;
1105
      tree type;
1106
 
1107
      if (!DECL_NAME (field) && DECL_C_BIT_FIELD (field))
1108
        {
1109
          flags |= picflag_from_initializer (integer_zero_node);
1110
          CONSTRUCTOR_APPEND_ELT (v, field, integer_zero_node);
1111
          continue;
1112
        }
1113
 
1114
      if (TREE_CODE (field) != FIELD_DECL || DECL_ARTIFICIAL (field))
1115
        continue;
1116
 
1117
      /* If this is a bitfield, first convert to the declared type.  */
1118
      type = TREE_TYPE (field);
1119
      if (DECL_BIT_FIELD_TYPE (field))
1120
        type = DECL_BIT_FIELD_TYPE (field);
1121
 
1122
      if (idx < VEC_length (constructor_elt, CONSTRUCTOR_ELTS (init)))
1123
        {
1124
          constructor_elt *ce = VEC_index (constructor_elt,
1125
                                           CONSTRUCTOR_ELTS (init), idx);
1126
          if (ce->index)
1127
            {
1128
              /* We can have either a FIELD_DECL or an IDENTIFIER_NODE. The
1129
                 latter case can happen in templates where lookup has to be
1130
                 deferred.  */
1131
              gcc_assert (TREE_CODE (ce->index) == FIELD_DECL
1132
                          || TREE_CODE (ce->index) == IDENTIFIER_NODE);
1133
              if (ce->index != field
1134
                  && ce->index != DECL_NAME (field))
1135
                {
1136
                  ce->value = error_mark_node;
1137
                  sorry ("non-trivial designated initializers not supported");
1138
                }
1139
            }
1140
 
1141
          gcc_assert (ce->value);
1142
          next = digest_init_r (type, ce->value, true, LOOKUP_IMPLICIT);
1143
          ++idx;
1144
        }
1145
      else if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (field)))
1146
        {
1147
          /* If this type needs constructors run for
1148
             default-initialization, we can't rely on the back end to do it
1149
             for us, so build up TARGET_EXPRs.  If the type in question is
1150
             a class, just build one up; if it's an array, recurse.  */
1151
          if (MAYBE_CLASS_TYPE_P (TREE_TYPE (field)))
1152
            next = build_functional_cast (TREE_TYPE (field), NULL_TREE,
1153
                                          tf_warning_or_error);
1154
          else
1155
            next = build_constructor (init_list_type_node, NULL);
1156
 
1157
          next = digest_init_r (TREE_TYPE (field), next, true, LOOKUP_IMPLICIT);
1158
 
1159
          /* Warn when some struct elements are implicitly initialized.  */
1160
          warning (OPT_Wmissing_field_initializers,
1161
                   "missing initializer for member %qD", field);
1162
        }
1163
      else
1164
        {
1165
          if (TREE_READONLY (field))
1166
            error ("uninitialized const member %qD", field);
1167
          else if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (TREE_TYPE (field)))
1168
            error ("member %qD with uninitialized const fields", field);
1169
          else if (TREE_CODE (TREE_TYPE (field)) == REFERENCE_TYPE)
1170
            error ("member %qD is uninitialized reference", field);
1171
 
1172
          /* Warn when some struct elements are implicitly initialized
1173
             to zero.  */
1174
          warning (OPT_Wmissing_field_initializers,
1175
                   "missing initializer for member %qD", field);
1176
 
1177
          if (!zero_init_p (TREE_TYPE (field)))
1178
            next = build_zero_init (TREE_TYPE (field), /*nelts=*/NULL_TREE,
1179
                                    /*static_storage_p=*/false);
1180
          else
1181
            /* The default zero-initialization is fine for us; don't
1182
            add anything to the CONSTRUCTOR.  */
1183
            continue;
1184
        }
1185
 
1186
      /* If this is a bitfield, now convert to the lowered type.  */
1187
      if (type != TREE_TYPE (field))
1188
        next = cp_convert_and_check (TREE_TYPE (field), next);
1189
      flags |= picflag_from_initializer (next);
1190
      CONSTRUCTOR_APPEND_ELT (v, field, next);
1191
    }
1192
 
1193
  if (idx < VEC_length (constructor_elt, CONSTRUCTOR_ELTS (init)))
1194
    error ("too many initializers for %qT", type);
1195
 
1196
  CONSTRUCTOR_ELTS (init) = v;
1197
  return flags;
1198
}
1199
 
1200
/* Subroutine of process_init_constructor, which will process a single
1201
   initializer INIT for a union of type TYPE. Returns the flags (PICFLAG_*)
1202
   which describe the initializer.  */
1203
 
1204
static int
1205
process_init_constructor_union (tree type, tree init)
1206
{
1207
  constructor_elt *ce;
1208
  int len;
1209
 
1210
  /* If the initializer was empty, use default zero initialization.  */
1211
  if (VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (init)))
1212
    return 0;
1213
 
1214
  len = VEC_length (constructor_elt, CONSTRUCTOR_ELTS (init));
1215
  if (len > 1)
1216
    {
1217
      error ("too many initializers for %qT", type);
1218
      VEC_block_remove (constructor_elt, CONSTRUCTOR_ELTS (init), 1, len-1);
1219
    }
1220
 
1221
  ce = VEC_index (constructor_elt, CONSTRUCTOR_ELTS (init), 0);
1222
 
1223
  /* If this element specifies a field, initialize via that field.  */
1224
  if (ce->index)
1225
    {
1226
      if (TREE_CODE (ce->index) == FIELD_DECL)
1227
        ;
1228
      else if (TREE_CODE (ce->index) == IDENTIFIER_NODE)
1229
        {
1230
          /* This can happen within a cast, see g++.dg/opt/cse2.C.  */
1231
          tree name = ce->index;
1232
          tree field;
1233
          for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
1234
            if (DECL_NAME (field) == name)
1235
              break;
1236
          if (!field)
1237
            {
1238
              error ("no field %qD found in union being initialized", field);
1239
              ce->value = error_mark_node;
1240
            }
1241
          ce->index = field;
1242
        }
1243
      else
1244
        {
1245
          gcc_assert (TREE_CODE (ce->index) == INTEGER_CST
1246
                      || TREE_CODE (ce->index) == RANGE_EXPR);
1247
          error ("index value instead of field name in union initializer");
1248
          ce->value = error_mark_node;
1249
        }
1250
    }
1251
  else
1252
    {
1253
      /* Find the first named field.  ANSI decided in September 1990
1254
         that only named fields count here.  */
1255
      tree field = TYPE_FIELDS (type);
1256
      while (field && (!DECL_NAME (field) || TREE_CODE (field) != FIELD_DECL))
1257
        field = TREE_CHAIN (field);
1258
      if (field == NULL_TREE)
1259
        {
1260
          error ("too many initializers for %qT", type);
1261
          ce->value = error_mark_node;
1262
        }
1263
      ce->index = field;
1264
    }
1265
 
1266
  if (ce->value && ce->value != error_mark_node)
1267
    ce->value = digest_init_r (TREE_TYPE (ce->index), ce->value, true, LOOKUP_IMPLICIT);
1268
 
1269
  return picflag_from_initializer (ce->value);
1270
}
1271
 
1272
/* Process INIT, a constructor for a variable of aggregate type TYPE. The
1273
   constructor is a brace-enclosed initializer, and will be modified in-place.
1274
 
1275
   Each element is converted to the right type through digest_init, and
1276
   missing initializers are added following the language rules (zero-padding,
1277
   etc.).
1278
 
1279
   After the execution, the initializer will have TREE_CONSTANT if all elts are
1280
   constant, and TREE_STATIC set if, in addition, all elts are simple enough
1281
   constants that the assembler and linker can compute them.
1282
 
1283
   The function returns the initializer itself, or error_mark_node in case
1284
   of error.  */
1285
 
1286
static tree
1287
process_init_constructor (tree type, tree init)
1288
{
1289
  int flags;
1290
 
1291
  gcc_assert (BRACE_ENCLOSED_INITIALIZER_P (init));
1292
 
1293
  if (TREE_CODE (type) == ARRAY_TYPE || TREE_CODE (type) == VECTOR_TYPE)
1294
    flags = process_init_constructor_array (type, init);
1295
  else if (TREE_CODE (type) == RECORD_TYPE)
1296
    flags = process_init_constructor_record (type, init);
1297
  else if (TREE_CODE (type) == UNION_TYPE)
1298
    flags = process_init_constructor_union (type, init);
1299
  else
1300
    gcc_unreachable ();
1301
 
1302
  if (flags & PICFLAG_ERRONEOUS)
1303
    return error_mark_node;
1304
 
1305
  TREE_TYPE (init) = type;
1306
  if (TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type) == NULL_TREE)
1307
    cp_complete_array_type (&TREE_TYPE (init), init, /*do_default=*/0);
1308
  if (!(flags & PICFLAG_NOT_ALL_CONSTANT))
1309
    {
1310
      TREE_CONSTANT (init) = 1;
1311
      if (!(flags & PICFLAG_NOT_ALL_SIMPLE))
1312
        TREE_STATIC (init) = 1;
1313
    }
1314
  return init;
1315
}
1316
 
1317
/* Given a structure or union value DATUM, construct and return
1318
   the structure or union component which results from narrowing
1319
   that value to the base specified in BASETYPE.  For example, given the
1320
   hierarchy
1321
 
1322
   class L { int ii; };
1323
   class A : L { ... };
1324
   class B : L { ... };
1325
   class C : A, B { ... };
1326
 
1327
   and the declaration
1328
 
1329
   C x;
1330
 
1331
   then the expression
1332
 
1333
   x.A::ii refers to the ii member of the L part of
1334
   the A part of the C object named by X.  In this case,
1335
   DATUM would be x, and BASETYPE would be A.
1336
 
1337
   I used to think that this was nonconformant, that the standard specified
1338
   that first we look up ii in A, then convert x to an L& and pull out the
1339
   ii part.  But in fact, it does say that we convert x to an A&; A here
1340
   is known as the "naming class".  (jason 2000-12-19)
1341
 
1342
   BINFO_P points to a variable initialized either to NULL_TREE or to the
1343
   binfo for the specific base subobject we want to convert to.  */
1344
 
1345
tree
1346
build_scoped_ref (tree datum, tree basetype, tree* binfo_p)
1347
{
1348
  tree binfo;
1349
 
1350
  if (datum == error_mark_node)
1351
    return error_mark_node;
1352
  if (*binfo_p)
1353
    binfo = *binfo_p;
1354
  else
1355
    binfo = lookup_base (TREE_TYPE (datum), basetype, ba_check, NULL);
1356
 
1357
  if (!binfo || binfo == error_mark_node)
1358
    {
1359
      *binfo_p = NULL_TREE;
1360
      if (!binfo)
1361
        error_not_base_type (basetype, TREE_TYPE (datum));
1362
      return error_mark_node;
1363
    }
1364
 
1365
  *binfo_p = binfo;
1366
  return build_base_path (PLUS_EXPR, datum, binfo, 1);
1367
}
1368
 
1369
/* Build a reference to an object specified by the C++ `->' operator.
1370
   Usually this just involves dereferencing the object, but if the
1371
   `->' operator is overloaded, then such overloads must be
1372
   performed until an object which does not have the `->' operator
1373
   overloaded is found.  An error is reported when circular pointer
1374
   delegation is detected.  */
1375
 
1376
tree
1377
build_x_arrow (tree expr)
1378
{
1379
  tree orig_expr = expr;
1380
  tree types_memoized = NULL_TREE;
1381
  tree type = TREE_TYPE (expr);
1382
  tree last_rval = NULL_TREE;
1383
 
1384
  if (type == error_mark_node)
1385
    return error_mark_node;
1386
 
1387
  if (processing_template_decl)
1388
    {
1389
      if (type_dependent_expression_p (expr))
1390
        return build_min_nt (ARROW_EXPR, expr);
1391
      expr = build_non_dependent_expr (expr);
1392
    }
1393
 
1394
  if (MAYBE_CLASS_TYPE_P (type))
1395
    {
1396
      while ((expr = build_new_op (COMPONENT_REF, LOOKUP_NORMAL, expr,
1397
                                   NULL_TREE, NULL_TREE,
1398
                                   /*overloaded_p=*/NULL,
1399
                                   tf_warning_or_error)))
1400
        {
1401
          if (expr == error_mark_node)
1402
            return error_mark_node;
1403
 
1404
          if (value_member (TREE_TYPE (expr), types_memoized))
1405
            {
1406
              error ("circular pointer delegation detected");
1407
              return error_mark_node;
1408
            }
1409
          else
1410
            {
1411
              types_memoized = tree_cons (NULL_TREE, TREE_TYPE (expr),
1412
                                          types_memoized);
1413
            }
1414
          last_rval = expr;
1415
        }
1416
 
1417
      if (last_rval == NULL_TREE)
1418
        {
1419
          error ("base operand of %<->%> has non-pointer type %qT", type);
1420
          return error_mark_node;
1421
        }
1422
 
1423
      if (TREE_CODE (TREE_TYPE (last_rval)) == REFERENCE_TYPE)
1424
        last_rval = convert_from_reference (last_rval);
1425
    }
1426
  else
1427
    last_rval = decay_conversion (expr);
1428
 
1429
  if (TREE_CODE (TREE_TYPE (last_rval)) == POINTER_TYPE)
1430
    {
1431
      if (processing_template_decl)
1432
        {
1433
          expr = build_min_non_dep (ARROW_EXPR, last_rval, orig_expr);
1434
          /* It will be dereferenced.  */
1435
          TREE_TYPE (expr) = TREE_TYPE (TREE_TYPE (last_rval));
1436
          return expr;
1437
        }
1438
 
1439
      return cp_build_indirect_ref (last_rval, RO_NULL, tf_warning_or_error);
1440
    }
1441
 
1442
  if (types_memoized)
1443
    error ("result of %<operator->()%> yields non-pointer result");
1444
  else
1445
    error ("base operand of %<->%> is not a pointer");
1446
  return error_mark_node;
1447
}
1448
 
1449
/* Return an expression for "DATUM .* COMPONENT".  DATUM has not
1450
   already been checked out to be of aggregate type.  */
1451
 
1452
tree
1453
build_m_component_ref (tree datum, tree component)
1454
{
1455
  tree ptrmem_type;
1456
  tree objtype;
1457
  tree type;
1458
  tree binfo;
1459
  tree ctype;
1460
 
1461
  if (error_operand_p (datum) || error_operand_p (component))
1462
    return error_mark_node;
1463
 
1464
  ptrmem_type = TREE_TYPE (component);
1465
  if (!TYPE_PTR_TO_MEMBER_P (ptrmem_type))
1466
    {
1467
      error ("%qE cannot be used as a member pointer, since it is of "
1468
             "type %qT",
1469
             component, ptrmem_type);
1470
      return error_mark_node;
1471
    }
1472
 
1473
  objtype = TYPE_MAIN_VARIANT (TREE_TYPE (datum));
1474
  if (! MAYBE_CLASS_TYPE_P (objtype))
1475
    {
1476
      error ("cannot apply member pointer %qE to %qE, which is of "
1477
             "non-class type %qT",
1478
             component, datum, objtype);
1479
      return error_mark_node;
1480
    }
1481
 
1482
  type = TYPE_PTRMEM_POINTED_TO_TYPE (ptrmem_type);
1483
  ctype = complete_type (TYPE_PTRMEM_CLASS_TYPE (ptrmem_type));
1484
 
1485
  if (!COMPLETE_TYPE_P (ctype))
1486
    {
1487
      if (!same_type_p (ctype, objtype))
1488
        goto mismatch;
1489
      binfo = NULL;
1490
    }
1491
  else
1492
    {
1493
      binfo = lookup_base (objtype, ctype, ba_check, NULL);
1494
 
1495
      if (!binfo)
1496
        {
1497
        mismatch:
1498
          error ("pointer to member type %qT incompatible with object "
1499
                 "type %qT",
1500
                 type, objtype);
1501
          return error_mark_node;
1502
        }
1503
      else if (binfo == error_mark_node)
1504
        return error_mark_node;
1505
    }
1506
 
1507
  if (TYPE_PTRMEM_P (ptrmem_type))
1508
    {
1509
      tree ptype;
1510
 
1511
      /* Compute the type of the field, as described in [expr.ref].
1512
         There's no such thing as a mutable pointer-to-member, so
1513
         things are not as complex as they are for references to
1514
         non-static data members.  */
1515
      type = cp_build_qualified_type (type,
1516
                                      (cp_type_quals (type)
1517
                                       | cp_type_quals (TREE_TYPE (datum))));
1518
 
1519
      datum = build_address (datum);
1520
 
1521
      /* Convert object to the correct base.  */
1522
      if (binfo)
1523
        datum = build_base_path (PLUS_EXPR, datum, binfo, 1);
1524
 
1525
      /* Build an expression for "object + offset" where offset is the
1526
         value stored in the pointer-to-data-member.  */
1527
      ptype = build_pointer_type (type);
1528
      datum = build2 (POINTER_PLUS_EXPR, ptype,
1529
                      fold_convert (ptype, datum),
1530
                      build_nop (sizetype, component));
1531
      return cp_build_indirect_ref (datum, RO_NULL, tf_warning_or_error);
1532
    }
1533
  else
1534
    return build2 (OFFSET_REF, type, datum, component);
1535
}
1536
 
1537
/* Return a tree node for the expression TYPENAME '(' PARMS ')'.  */
1538
 
1539
tree
1540
build_functional_cast (tree exp, tree parms, tsubst_flags_t complain)
1541
{
1542
  /* This is either a call to a constructor,
1543
     or a C cast in C++'s `functional' notation.  */
1544
 
1545
  /* The type to which we are casting.  */
1546
  tree type;
1547
  VEC(tree,gc) *parmvec;
1548
 
1549
  if (exp == error_mark_node || parms == error_mark_node)
1550
    return error_mark_node;
1551
 
1552
  if (TREE_CODE (exp) == TYPE_DECL)
1553
    type = TREE_TYPE (exp);
1554
  else
1555
    type = exp;
1556
 
1557
  if (TREE_CODE (type) == REFERENCE_TYPE && !parms)
1558
    {
1559
      error ("invalid value-initialization of reference types");
1560
      return error_mark_node;
1561
    }
1562
 
1563
  if (processing_template_decl)
1564
    {
1565
      tree t = build_min (CAST_EXPR, type, parms);
1566
      /* We don't know if it will or will not have side effects.  */
1567
      TREE_SIDE_EFFECTS (t) = 1;
1568
      return t;
1569
    }
1570
 
1571
  if (! MAYBE_CLASS_TYPE_P (type))
1572
    {
1573
      if (parms == NULL_TREE)
1574
        return cp_convert (type, integer_zero_node);
1575
 
1576
      /* This must build a C cast.  */
1577
      parms = build_x_compound_expr_from_list (parms, "functional cast");
1578
      return cp_build_c_cast (type, parms, complain);
1579
    }
1580
 
1581
  /* Prepare to evaluate as a call to a constructor.  If this expression
1582
     is actually used, for example,
1583
 
1584
     return X (arg1, arg2, ...);
1585
 
1586
     then the slot being initialized will be filled in.  */
1587
 
1588
  if (!complete_type_or_else (type, NULL_TREE))
1589
    return error_mark_node;
1590
  if (abstract_virtuals_error (NULL_TREE, type))
1591
    return error_mark_node;
1592
 
1593
  /* [expr.type.conv]
1594
 
1595
     If the expression list is a single-expression, the type
1596
     conversion is equivalent (in definedness, and if defined in
1597
     meaning) to the corresponding cast expression.  */
1598
  if (parms && TREE_CHAIN (parms) == NULL_TREE)
1599
    return cp_build_c_cast (type, TREE_VALUE (parms), complain);
1600
 
1601
  /* [expr.type.conv]
1602
 
1603
     The expression T(), where T is a simple-type-specifier for a
1604
     non-array complete object type or the (possibly cv-qualified)
1605
     void type, creates an rvalue of the specified type, which is
1606
     value-initialized.  */
1607
 
1608
  if (parms == NULL_TREE
1609
      /* If there's a user-defined constructor, value-initialization is
1610
         just calling the constructor, so fall through.  */
1611
      && !TYPE_HAS_USER_CONSTRUCTOR (type))
1612
    {
1613
      exp = build_value_init (type);
1614
      return get_target_expr (exp);
1615
    }
1616
 
1617
  /* Call the constructor.  */
1618
  parmvec = make_tree_vector ();
1619
  for (; parms != NULL_TREE; parms = TREE_CHAIN (parms))
1620
    VEC_safe_push (tree, gc, parmvec, TREE_VALUE (parms));
1621
  exp = build_special_member_call (NULL_TREE, complete_ctor_identifier,
1622
                                   &parmvec, type, LOOKUP_NORMAL, complain);
1623
  release_tree_vector (parmvec);
1624
 
1625
  if (exp == error_mark_node)
1626
    return error_mark_node;
1627
 
1628
  return build_cplus_new (type, exp);
1629
}
1630
 
1631
 
1632
/* Add new exception specifier SPEC, to the LIST we currently have.
1633
   If it's already in LIST then do nothing.
1634
   Moan if it's bad and we're allowed to. COMPLAIN < 0 means we
1635
   know what we're doing.  */
1636
 
1637
tree
1638
add_exception_specifier (tree list, tree spec, int complain)
1639
{
1640
  bool ok;
1641
  tree core = spec;
1642
  bool is_ptr;
1643
  diagnostic_t diag_type = DK_UNSPECIFIED; /* none */
1644
 
1645
  if (spec == error_mark_node)
1646
    return list;
1647
 
1648
  gcc_assert (spec && (!list || TREE_VALUE (list)));
1649
 
1650
  /* [except.spec] 1, type in an exception specifier shall not be
1651
     incomplete, or pointer or ref to incomplete other than pointer
1652
     to cv void.  */
1653
  is_ptr = TREE_CODE (core) == POINTER_TYPE;
1654
  if (is_ptr || TREE_CODE (core) == REFERENCE_TYPE)
1655
    core = TREE_TYPE (core);
1656
  if (complain < 0)
1657
    ok = true;
1658
  else if (VOID_TYPE_P (core))
1659
    ok = is_ptr;
1660
  else if (TREE_CODE (core) == TEMPLATE_TYPE_PARM)
1661
    ok = true;
1662
  else if (processing_template_decl)
1663
    ok = true;
1664
  else
1665
    {
1666
      ok = true;
1667
      /* 15.4/1 says that types in an exception specifier must be complete,
1668
         but it seems more reasonable to only require this on definitions
1669
         and calls.  So just give a pedwarn at this point; we will give an
1670
         error later if we hit one of those two cases.  */
1671
      if (!COMPLETE_TYPE_P (complete_type (core)))
1672
        diag_type = DK_PEDWARN; /* pedwarn */
1673
    }
1674
 
1675
  if (ok)
1676
    {
1677
      tree probe;
1678
 
1679
      for (probe = list; probe; probe = TREE_CHAIN (probe))
1680
        if (same_type_p (TREE_VALUE (probe), spec))
1681
          break;
1682
      if (!probe)
1683
        list = tree_cons (NULL_TREE, spec, list);
1684
    }
1685
  else
1686
    diag_type = DK_ERROR; /* error */
1687
 
1688
  if (diag_type != DK_UNSPECIFIED && complain)
1689
    cxx_incomplete_type_diagnostic (NULL_TREE, core, diag_type);
1690
 
1691
  return list;
1692
}
1693
 
1694
/* Combine the two exceptions specifier lists LIST and ADD, and return
1695
   their union.  */
1696
 
1697
tree
1698
merge_exception_specifiers (tree list, tree add)
1699
{
1700
  if (!list || !add)
1701
    return NULL_TREE;
1702
  else if (!TREE_VALUE (list))
1703
    return add;
1704
  else if (!TREE_VALUE (add))
1705
    return list;
1706
  else
1707
    {
1708
      tree orig_list = list;
1709
 
1710
      for (; add; add = TREE_CHAIN (add))
1711
        {
1712
          tree spec = TREE_VALUE (add);
1713
          tree probe;
1714
 
1715
          for (probe = orig_list; probe; probe = TREE_CHAIN (probe))
1716
            if (same_type_p (TREE_VALUE (probe), spec))
1717
              break;
1718
          if (!probe)
1719
            {
1720
              spec = build_tree_list (NULL_TREE, spec);
1721
              TREE_CHAIN (spec) = list;
1722
              list = spec;
1723
            }
1724
        }
1725
    }
1726
  return list;
1727
}
1728
 
1729
/* Subroutine of build_call.  Ensure that each of the types in the
1730
   exception specification is complete.  Technically, 15.4/1 says that
1731
   they need to be complete when we see a declaration of the function,
1732
   but we should be able to get away with only requiring this when the
1733
   function is defined or called.  See also add_exception_specifier.  */
1734
 
1735
void
1736
require_complete_eh_spec_types (tree fntype, tree decl)
1737
{
1738
  tree raises;
1739
  /* Don't complain about calls to op new.  */
1740
  if (decl && DECL_ARTIFICIAL (decl))
1741
    return;
1742
  for (raises = TYPE_RAISES_EXCEPTIONS (fntype); raises;
1743
       raises = TREE_CHAIN (raises))
1744
    {
1745
      tree type = TREE_VALUE (raises);
1746
      if (type && !COMPLETE_TYPE_P (type))
1747
        {
1748
          if (decl)
1749
            error
1750
              ("call to function %qD which throws incomplete type %q#T",
1751
               decl, type);
1752
          else
1753
            error ("call to function which throws incomplete type %q#T",
1754
                   decl);
1755
        }
1756
    }
1757
}
1758
 
1759
 
1760
#include "gt-cp-typeck2.h"

powered by: WebSVN 2.1.0

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