]> gcc.gnu.org Git - gcc.git/blame - gcc/cp/cvt.c
Add support for r4650, and permit HI/LO to be allocated
[gcc.git] / gcc / cp / cvt.c
CommitLineData
8d08fdba
MS
1/* Language-level data type conversion for GNU C++.
2 Copyright (C) 1987, 1988, 1992, 1993 Free Software Foundation, Inc.
3 Hacked by Michael Tiemann (tiemann@cygnus.com)
4
5This file is part of GNU CC.
6
7GNU CC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
12GNU CC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GNU CC; see the file COPYING. If not, write to
19the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
20
21
22/* This file contains the functions for converting C expressions
23 to different data types. The only entry point is `convert'.
24 Every language front end must have a `convert' function
25 but what kind of conversions it does will depend on the language. */
26
27#include "config.h"
28#include "tree.h"
29#include "flags.h"
30#include "cp-tree.h"
31#include "class.h"
32#include "convert.h"
33
34#undef NULL
35#define NULL (char *)0
36
37/* Change of width--truncation and extension of integers or reals--
38 is represented with NOP_EXPR. Proper functioning of many things
39 assumes that no other conversions can be NOP_EXPRs.
40
41 Conversion between integer and pointer is represented with CONVERT_EXPR.
42 Converting integer to real uses FLOAT_EXPR
43 and real to integer uses FIX_TRUNC_EXPR.
44
45 Here is a list of all the functions that assume that widening and
46 narrowing is always done with a NOP_EXPR:
47 In convert.c, convert_to_integer.
48 In c-typeck.c, build_binary_op_nodefault (boolean ops),
49 and truthvalue_conversion.
50 In expr.c: expand_expr, for operands of a MULT_EXPR.
51 In fold-const.c: fold.
52 In tree.c: get_narrower and get_unwidened.
53
54 C++: in multiple-inheritance, converting between pointers may involve
55 adjusting them by a delta stored within the class definition. */
56\f
57/* Subroutines of `convert'. */
58
59/* Build a thunk. What it is, is an entry point that when called will
60 adjust the this pointer (the first argument) by offset, and then
61 goto the real address of the function given by REAL_ADDR that we
62 would like called. What we return is the address of the thunk. */
63static tree
64build_thunk (offset, real_addr)
65 tree offset, real_addr;
66{
67 if (TREE_CODE (real_addr) != ADDR_EXPR
68 || TREE_CODE (TREE_OPERAND (real_addr, 0)) != FUNCTION_DECL)
69 {
70 sorry ("MI pointer to member conversion too complex");
71 return error_mark_node;
72 }
73 sorry ("MI pointer to member conversion too complex");
74 return error_mark_node;
75}
76
77/* Convert a `pointer to member' (POINTER_TYPE to METHOD_TYPE) into
78 another `pointer to method'. This may involved the creation of
79 a thunk to handle the this offset calculation. */
80static tree
81convert_fn_ptr (type, expr)
82 tree type, expr;
83{
84 tree binfo = get_binfo (TYPE_METHOD_BASETYPE (TREE_TYPE (TREE_TYPE (expr))),
85 TYPE_METHOD_BASETYPE (TREE_TYPE (type)),
86 1);
87 if (binfo == error_mark_node)
88 {
89 error (" in pointer to member conversion");
90 return error_mark_node;
91 }
92 if (binfo == NULL_TREE)
93 {
94 /* ARM 4.8 restriction. */
95 error ("invalid pointer to member conversion");
96 return error_mark_node;
97 }
98 if (BINFO_OFFSET_ZEROP (binfo))
99 return build1 (NOP_EXPR, type, expr);
100 return build1 (NOP_EXPR, type, build_thunk (BINFO_OFFSET (binfo), expr));
101}
102
103/* if converting pointer to pointer
104 if dealing with classes, check for derived->base or vice versa
105 else if dealing with method pointers, delegate
106 else convert blindly
107 else if converting class, pass off to build_type_conversion
108 else try C-style pointer conversion */
109static tree
110cp_convert_to_pointer (type, expr)
111 tree type, expr;
112{
113 register tree intype = TREE_TYPE (expr);
114 register enum tree_code form = TREE_CODE (intype);
115
116 if (form == POINTER_TYPE)
117 {
118 intype = TYPE_MAIN_VARIANT (intype);
119
120 if (TYPE_MAIN_VARIANT (type) != intype
121 && TREE_CODE (TREE_TYPE (type)) == RECORD_TYPE
122 && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE)
123 {
124 enum tree_code code = PLUS_EXPR;
125 tree binfo = get_binfo (TREE_TYPE (type), TREE_TYPE (intype), 1);
126 if (binfo == error_mark_node)
127 return error_mark_node;
128 if (binfo == NULL_TREE)
129 {
130 binfo = get_binfo (TREE_TYPE (intype), TREE_TYPE (type), 1);
131 if (binfo == error_mark_node)
132 return error_mark_node;
133 code = MINUS_EXPR;
134 }
135 if (binfo)
136 {
137 if (TYPE_USES_VIRTUAL_BASECLASSES (TREE_TYPE (type))
138 || TYPE_USES_VIRTUAL_BASECLASSES (TREE_TYPE (intype))
139 || ! BINFO_OFFSET_ZEROP (binfo))
140 {
141 /* Need to get the path we took. */
142 tree path;
143
144 if (code == PLUS_EXPR)
145 get_base_distance (TREE_TYPE (type), TREE_TYPE (intype), 0, &path);
146 else
147 get_base_distance (TREE_TYPE (intype), TREE_TYPE (type), 0, &path);
148 return build_vbase_path (code, type, expr, path, 0);
149 }
150 }
151 }
152 if (TYPE_MAIN_VARIANT (type) != intype
153 && TREE_CODE (TREE_TYPE (type)) == METHOD_TYPE
154 && TREE_CODE (type) == POINTER_TYPE
155 && TREE_CODE (TREE_TYPE (intype)) == METHOD_TYPE)
156 return convert_fn_ptr (type, expr);
157
158 return build1 (NOP_EXPR, type, expr);
159 }
160
161 my_friendly_assert (form != OFFSET_TYPE, 186);
162
163 if (TYPE_LANG_SPECIFIC (intype)
164 && (IS_SIGNATURE_POINTER (intype) || IS_SIGNATURE_REFERENCE (intype)))
165 return convert_to_pointer (type, build_optr_ref (expr));
166
167 if (IS_AGGR_TYPE (intype))
168 {
169 tree rval;
170 rval = build_type_conversion (CONVERT_EXPR, type, expr, 1);
171 if (rval)
172 {
173 if (rval == error_mark_node)
174 cp_error ("conversion of `%E' from `%T' to `%T' is ambiguous",
175 expr, intype, type);
176 return rval;
177 }
178 }
179
180 if (integer_zerop (expr))
181 {
182 if (type == TREE_TYPE (null_pointer_node))
183 return null_pointer_node;
184 expr = build_int_2 (0, 0);
185 TREE_TYPE (expr) = type;
186 return expr;
187 }
188
2986ae00 189 if (INTEGRAL_CODE_P (form))
8d08fdba
MS
190 {
191 if (type_precision (intype) == POINTER_SIZE)
192 return build1 (CONVERT_EXPR, type, expr);
193 expr = convert (type_for_size (POINTER_SIZE, 0), expr);
194 /* Modes may be different but sizes should be the same. */
195 if (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (expr)))
196 != GET_MODE_SIZE (TYPE_MODE (type)))
197 /* There is supposed to be some integral type
198 that is the same width as a pointer. */
199 abort ();
200 return convert_to_pointer (type, expr);
201 }
202
203 cp_error ("cannot convert `%E' from type `%T' to type `%T'",
204 expr, intype, type);
205 return error_mark_node;
206}
207
208/* Like convert, except permit conversions to take place which
209 are not normally allowed due to access restrictions
210 (such as conversion from sub-type to private super-type). */
211static tree
212convert_to_pointer_force (type, expr)
213 tree type, expr;
214{
215 register tree intype = TREE_TYPE (expr);
216 register enum tree_code form = TREE_CODE (intype);
217
218 if (integer_zerop (expr))
219 {
220 if (type == TREE_TYPE (null_pointer_node))
221 return null_pointer_node;
222 expr = build_int_2 (0, 0);
223 TREE_TYPE (expr) = type;
224 return expr;
225 }
226
227 /* Convert signature pointer/reference to `void *' first. */
228 if (form == RECORD_TYPE
229 && (IS_SIGNATURE_POINTER (intype) || IS_SIGNATURE_REFERENCE (intype)))
230 {
231 expr = build_optr_ref (expr);
232 intype = TREE_TYPE (expr);
233 form = TREE_CODE (intype);
234 }
235
236 if (form == POINTER_TYPE)
237 {
238 intype = TYPE_MAIN_VARIANT (intype);
239
240 if (TYPE_MAIN_VARIANT (type) != intype
241 && TREE_CODE (TREE_TYPE (type)) == RECORD_TYPE
242 && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE)
243 {
244 enum tree_code code = PLUS_EXPR;
245 tree path;
246 int distance = get_base_distance (TREE_TYPE (type),
247 TREE_TYPE (intype), 0, &path);
248 if (distance == -2)
249 {
250 ambig:
251 cp_error ("type `%T' is ambiguous baseclass of `%s'", TREE_TYPE (type),
252 TYPE_NAME_STRING (TREE_TYPE (intype)));
253 return error_mark_node;
254 }
255 if (distance == -1)
256 {
257 distance = get_base_distance (TREE_TYPE (intype),
258 TREE_TYPE (type), 0, &path);
259 if (distance == -2)
260 goto ambig;
261 if (distance < 0)
262 /* Doesn't need any special help from us. */
263 return build1 (NOP_EXPR, type, expr);
264
265 code = MINUS_EXPR;
266 }
267 return build_vbase_path (code, type, expr, path, 0);
268 }
269 return build1 (NOP_EXPR, type, expr);
270 }
271
272 return cp_convert_to_pointer (type, expr);
273}
274
275/* We are passing something to a function which requires a reference.
276 The type we are interested in is in TYPE. The initial
277 value we have to begin with is in ARG.
278
279 FLAGS controls how we manage access checking.
280 CHECKCONST controls if we report error messages on const subversion. */
281static tree
282build_up_reference (type, arg, flags, checkconst)
283 tree type, arg;
284 int flags, checkconst;
285{
286 tree rval, targ;
287 int literal_flag = 0;
8926095f 288 tree argtype = TREE_TYPE (arg);
8d08fdba
MS
289 tree target_type = TREE_TYPE (type);
290 tree binfo = NULL_TREE;
291
292 my_friendly_assert (TREE_CODE (type) == REFERENCE_TYPE, 187);
8926095f 293 if ((flags & LOOKUP_PROTECT)
8d08fdba
MS
294 && TYPE_MAIN_VARIANT (argtype) != TYPE_MAIN_VARIANT (target_type)
295 && IS_AGGR_TYPE (argtype)
296 && IS_AGGR_TYPE (target_type))
297 {
298 binfo = get_binfo (target_type, argtype, 1);
8926095f 299 if (binfo == error_mark_node)
8d08fdba
MS
300 return error_mark_node;
301 if (binfo == NULL_TREE)
302 return error_not_base_type (target_type, argtype);
8d08fdba
MS
303 }
304
305 /* Pass along const and volatile down into the type. */
306 if (TYPE_READONLY (type) || TYPE_VOLATILE (type))
f376e137 307 target_type = cp_build_type_variant (target_type, TYPE_READONLY (type),
21474714 308 TYPE_VOLATILE (type));
8d08fdba
MS
309 targ = arg;
310 if (TREE_CODE (targ) == SAVE_EXPR)
311 targ = TREE_OPERAND (targ, 0);
6060a796
MS
312 while (TREE_CODE (targ) == NOP_EXPR
313 && (TYPE_MAIN_VARIANT (argtype)
314 == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (targ, 0)))))
315 targ = TREE_OPERAND (targ, 0);
8d08fdba
MS
316
317 switch (TREE_CODE (targ))
318 {
319 case INDIRECT_REF:
320 /* This is a call to a constructor which did not know what it was
321 initializing until now: it needs to initialize a temporary. */
322 if (TREE_HAS_CONSTRUCTOR (targ))
323 {
324 tree temp = build_cplus_new (argtype, TREE_OPERAND (targ, 0), 1);
325 TREE_HAS_CONSTRUCTOR (targ) = 0;
326 return build_up_reference (type, temp, flags, 1);
327 }
328 /* Let &* cancel out to simplify resulting code.
329 Also, throw away intervening NOP_EXPRs. */
330 arg = TREE_OPERAND (targ, 0);
331 if (TREE_CODE (arg) == NOP_EXPR || TREE_CODE (arg) == NON_LVALUE_EXPR
332 || (TREE_CODE (arg) == CONVERT_EXPR && TREE_REFERENCE_EXPR (arg)))
333 arg = TREE_OPERAND (arg, 0);
334
335 /* in doing a &*, we have to get rid of the const'ness on the pointer
336 value. Haven't thought about volatile here. Pointers come to mind
337 here. */
338 if (TREE_READONLY (arg))
339 {
340 arg = copy_node (arg);
341 TREE_READONLY (arg) = 0;
342 }
343
344 rval = build1 (CONVERT_EXPR, type, arg);
345 TREE_REFERENCE_EXPR (rval) = 1;
346
347 /* propagate the const flag on something like:
348
349 class Base {
350 public:
351 int foo;
352 };
353
354 class Derived : public Base {
355 public:
356 int bar;
357 };
358
359 void func(Base&);
360
361 void func2(const Derived& d) {
362 func(d);
363 }
364
365 on the d parameter. The below could have been avoided, if the flags
366 were down in the tree, not sure why they are not. (mrs) */
367 /* The below code may have to be propagated to other parts of this
368 switch. */
369 if (TREE_READONLY (targ) && !TREE_READONLY (arg)
370 && (TREE_CODE (arg) == PARM_DECL || TREE_CODE (arg) == VAR_DECL)
371 && TREE_CODE (TREE_TYPE (arg)) == REFERENCE_TYPE
372 && (TYPE_READONLY (target_type) && checkconst))
373 {
374 arg = copy_node (arg);
375 TREE_READONLY (arg) = TREE_READONLY (targ);
376 }
377 literal_flag = TREE_CONSTANT (arg);
378
a3203465 379 goto done;
8d08fdba
MS
380
381 /* Get this out of a register if we happened to be in one by accident.
382 Also, build up references to non-lvalues it we must. */
383 /* For &x[y], return (&) x+y */
384 case ARRAY_REF:
385 if (mark_addressable (TREE_OPERAND (targ, 0)) == 0)
386 return error_mark_node;
387 rval = build_binary_op (PLUS_EXPR, TREE_OPERAND (targ, 0),
388 TREE_OPERAND (targ, 1), 1);
389 TREE_TYPE (rval) = type;
390 if (TREE_CONSTANT (TREE_OPERAND (targ, 1))
391 && staticp (TREE_OPERAND (targ, 0)))
392 TREE_CONSTANT (rval) = 1;
393 goto done;
394
395 case SCOPE_REF:
396 /* Could be a reference to a static member. */
397 {
398 tree field = TREE_OPERAND (targ, 1);
399 if (TREE_STATIC (field))
400 {
401 rval = build1 (ADDR_EXPR, type, field);
402 literal_flag = 1;
403 goto done;
404 }
405 }
406
407 /* We should have farmed out member pointers above. */
408 my_friendly_abort (188);
409
410 case COMPONENT_REF:
411 rval = build_component_addr (targ, build_pointer_type (argtype),
412 "attempt to make a reference to bit-field structure member `%s'");
413 TREE_TYPE (rval) = type;
414 literal_flag = staticp (TREE_OPERAND (targ, 0));
415
a3203465 416 goto done;
8d08fdba
MS
417
418 /* Anything not already handled and not a true memory reference
419 needs to have a reference built up. Do so silently for
420 things like integers and return values from function,
421 but complain if we need a reference to something declared
422 as `register'. */
423
424 case RESULT_DECL:
425 if (staticp (targ))
426 literal_flag = 1;
427 TREE_ADDRESSABLE (targ) = 1;
428 put_var_into_stack (targ);
429 break;
430
431 case PARM_DECL:
a292b002 432#if 0
8d08fdba
MS
433 if (targ == current_class_decl)
434 {
435 error ("address of `this' not available");
a292b002 436/* #if 0 */
8d08fdba
MS
437 /* This code makes the following core dump the compiler on a sun4,
438 if the code below is used.
439
440 class e_decl;
441 class a_decl;
442 typedef a_decl* a_ref;
443
444 class a_s {
445 public:
446 a_s();
447 void* append(a_ref& item);
448 };
449 class a_decl {
450 public:
451 a_decl (e_decl *parent);
452 a_s generic_s;
453 a_s decls;
454 e_decl* parent;
455 };
456
457 class e_decl {
458 public:
459 e_decl();
460 a_s implementations;
461 };
462
463 void foobar(void *);
464
465 a_decl::a_decl(e_decl *parent) {
466 parent->implementations.append(this);
467 }
468 */
469
470 TREE_ADDRESSABLE (targ) = 1; /* so compiler doesn't die later */
471 put_var_into_stack (targ);
472 break;
a292b002 473/* #else */
8d08fdba 474 return error_mark_node;
a292b002 475/* #endif */
8d08fdba 476 }
a292b002 477#endif
8d08fdba
MS
478 /* Fall through. */
479 case VAR_DECL:
480 case CONST_DECL:
a292b002
MS
481 if (DECL_REGISTER (targ) && !TREE_ADDRESSABLE (targ)
482 && !DECL_ARTIFICIAL (targ))
483 cp_warning ("address needed to build reference for `%D', which is declared `register'",
484 targ);
8d08fdba
MS
485 else if (staticp (targ))
486 literal_flag = 1;
487
488 TREE_ADDRESSABLE (targ) = 1;
489 put_var_into_stack (targ);
490 break;
491
492 case COMPOUND_EXPR:
493 {
494 tree real_reference = build_up_reference (type, TREE_OPERAND (targ, 1),
495 LOOKUP_PROTECT, checkconst);
496 rval = build (COMPOUND_EXPR, type, TREE_OPERAND (targ, 0), real_reference);
497 TREE_CONSTANT (rval) = staticp (TREE_OPERAND (targ, 1));
498 return rval;
499 }
500
f376e137
MS
501 case PREINCREMENT_EXPR:
502 case PREDECREMENT_EXPR:
8d08fdba
MS
503 case MODIFY_EXPR:
504 case INIT_EXPR:
505 {
506 tree real_reference = build_up_reference (type, TREE_OPERAND (targ, 0),
507 LOOKUP_PROTECT, checkconst);
508 rval = build (COMPOUND_EXPR, type, arg, real_reference);
509 TREE_CONSTANT (rval) = staticp (TREE_OPERAND (targ, 0));
510 return rval;
511 }
512
513 case COND_EXPR:
514 return build (COND_EXPR, type,
515 TREE_OPERAND (targ, 0),
516 build_up_reference (type, TREE_OPERAND (targ, 1),
517 LOOKUP_PROTECT, checkconst),
518 build_up_reference (type, TREE_OPERAND (targ, 2),
519 LOOKUP_PROTECT, checkconst));
520
521 case WITH_CLEANUP_EXPR:
522 return build (WITH_CLEANUP_EXPR, type,
523 build_up_reference (type, TREE_OPERAND (targ, 0),
524 LOOKUP_PROTECT, checkconst),
525 0, TREE_OPERAND (targ, 2));
526
527 case BIND_EXPR:
528 arg = TREE_OPERAND (targ, 1);
529 if (arg == NULL_TREE)
530 {
531 compiler_error ("({ ... }) expression not expanded when needed for reference");
532 return error_mark_node;
533 }
534 rval = build1 (ADDR_EXPR, type, arg);
535 TREE_REFERENCE_EXPR (rval) = 1;
536 return rval;
537
538 default:
539 break;
540 }
541
542 if (TREE_ADDRESSABLE (targ) == 0)
543 {
544 tree temp;
545
546 if (TREE_CODE (targ) == CALL_EXPR && IS_AGGR_TYPE (argtype))
547 {
548 temp = build_cplus_new (argtype, targ, 1);
a3203465
MS
549 if (TREE_CODE (temp) == WITH_CLEANUP_EXPR)
550 rval = build (WITH_CLEANUP_EXPR, type,
551 build1 (ADDR_EXPR, type, TREE_OPERAND (temp, 0)),
552 0, TREE_OPERAND (temp, 2));
553 else
554 rval = build1 (ADDR_EXPR, type, temp);
8d08fdba
MS
555 goto done;
556 }
557 else
558 {
559 temp = get_temp_name (argtype, 0);
560 if (global_bindings_p ())
561 {
562 /* Give this new temp some rtl and initialize it. */
563 DECL_INITIAL (temp) = targ;
564 TREE_STATIC (temp) = 1;
6060a796 565 finish_decl (temp, targ, NULL_TREE, 0, LOOKUP_ONLYCONVERTING);
8d08fdba
MS
566 /* Do this after declaring it static. */
567 rval = build_unary_op (ADDR_EXPR, temp, 0);
568 TREE_TYPE (rval) = type;
569 literal_flag = TREE_CONSTANT (rval);
570 goto done;
571 }
572 else
573 {
574 rval = build_unary_op (ADDR_EXPR, temp, 0);
575 if (binfo && !BINFO_OFFSET_ZEROP (binfo))
576 rval = convert_pointer_to (target_type, rval);
577 else
578 TREE_TYPE (rval) = type;
579
580 temp = build (MODIFY_EXPR, argtype, temp, arg);
581 TREE_SIDE_EFFECTS (temp) = 1;
582 return build (COMPOUND_EXPR, type, temp, rval);
583 }
584 }
585 }
586 else
587 rval = build1 (ADDR_EXPR, type, arg);
588
8d08fdba 589 done:
21474714
MS
590 if (TYPE_USES_COMPLEX_INHERITANCE (argtype)
591 || TYPE_USES_COMPLEX_INHERITANCE (target_type))
8d08fdba 592 {
39211cd5 593 TREE_TYPE (rval) = build_pointer_type (argtype);
51c184be
MS
594 if (flags & LOOKUP_PROTECT)
595 rval = convert_pointer_to (target_type, rval);
596 else
597 rval
598 = convert_to_pointer_force (build_pointer_type (target_type), rval);
8d08fdba
MS
599 TREE_TYPE (rval) = type;
600 }
601 TREE_CONSTANT (rval) = literal_flag;
602 return rval;
603}
604
605/* For C++: Only need to do one-level references, but cannot
606 get tripped up on signed/unsigned differences.
607
a4443a08
MS
608 DECL is either NULL_TREE or the _DECL node for a reference that is being
609 initialized. It can be error_mark_node if we don't know the _DECL but
610 we know it's an initialization. */
8d08fdba 611
8d08fdba 612tree
a4443a08 613convert_to_reference (reftype, expr, convtype, flags, decl)
8d08fdba 614 tree reftype, expr;
a4443a08
MS
615 int convtype, flags;
616 tree decl;
8d08fdba
MS
617{
618 register tree type = TYPE_MAIN_VARIANT (TREE_TYPE (reftype));
619 register tree intype = TREE_TYPE (expr);
620 register enum tree_code form = TREE_CODE (intype);
621 tree rval = NULL_TREE;
622
8d08fdba
MS
623 if (form == REFERENCE_TYPE)
624 intype = TREE_TYPE (intype);
625 intype = TYPE_MAIN_VARIANT (intype);
626
a4443a08
MS
627 if (((convtype & CONV_STATIC) && comptypes (type, intype, -1))
628 || ((convtype & CONV_IMPLICIT) && comptypes (type, intype, 0)))
8d08fdba 629 {
8d08fdba
MS
630 if (flags & LOOKUP_COMPLAIN)
631 {
39211cd5
MS
632 tree ttl = TREE_TYPE (reftype);
633 tree ttr;
634
8926095f 635 if (form == REFERENCE_TYPE)
39211cd5
MS
636 ttr = TREE_TYPE (TREE_TYPE (expr));
637 else
a3203465
MS
638 {
639 int r = TREE_READONLY (expr);
640 int v = TREE_THIS_VOLATILE (expr);
f376e137 641 ttr = cp_build_type_variant (TREE_TYPE (expr), r, v);
a3203465 642 }
8d08fdba 643
a4443a08
MS
644 if (! lvalue_p (expr) &&
645 (decl == NULL_TREE || ! TYPE_READONLY (ttl)))
39211cd5 646 {
a4443a08
MS
647 if (decl)
648 /* Ensure semantics of [dcl.init.ref] */
649 cp_pedwarn ("initialization of non-const `%T' from rvalue `%T'",
650 reftype, intype);
651 else
652 cp_pedwarn ("conversion to `%T' from rvalue `%T'",
653 reftype, intype);
39211cd5 654 }
a4443a08 655 else if (! (convtype & CONV_CONST))
8d08fdba 656 {
a4443a08
MS
657 if (! TYPE_READONLY (ttl) && TYPE_READONLY (ttr))
658 cp_pedwarn ("conversion from `%T' to `%T' discards const",
a3203465 659 ttr, reftype);
a4443a08
MS
660 else if (! TYPE_VOLATILE (ttl) && TYPE_VOLATILE (ttr))
661 cp_pedwarn ("conversion from `%T' to `%T' discards volatile",
a3203465 662 ttr, reftype);
8d08fdba 663 }
8926095f
MS
664 }
665
a3203465 666 if (form == REFERENCE_TYPE)
8926095f 667 {
db5ae43f
MS
668 tree type = TREE_TYPE (expr);
669 tree tmp = copy_node (expr);
670 TREE_TYPE (tmp) = build_pointer_type (TREE_TYPE (TREE_TYPE (expr)));
671 rval = cp_convert (build_pointer_type (TREE_TYPE (reftype)), tmp,
a4443a08 672 convtype, flags);
db5ae43f 673 TREE_TYPE (tmp) = type;
a3203465 674 TREE_TYPE (rval) = reftype;
8926095f 675 return rval;
8d08fdba 676 }
8926095f 677
a4443a08
MS
678 return build_up_reference (reftype, expr, flags,
679 ! (convtype & CONV_CONST));
8d08fdba
MS
680 }
681
21474714
MS
682 if ((convtype & CONV_IMPLICIT)
683 && IS_AGGR_TYPE (intype)
684 && ! (flags & LOOKUP_NO_CONVERSION)
685 && (rval = build_type_conversion (CONVERT_EXPR, reftype, expr, 1)))
686 {
687 if (rval == error_mark_node)
688 cp_error ("conversion from `%T' to `%T' is ambiguous",
689 intype, reftype);
690 return rval;
691 }
692 else if ((convtype & CONV_REINTERPRET) && lvalue_p (expr))
8926095f
MS
693 {
694 /* When casting an lvalue to a reference type, just convert into
695 a pointer to the new type and deference it. This is allowed
a28e3c7f 696 by San Diego WP section 5.2.9 paragraph 12, though perhaps it
8926095f 697 should be done directly (jason). (int &)ri ---> *(int*)&ri */
a28e3c7f
MS
698
699 /* B* bp; A& ar = (A&)bp; is legal, but it's probably not what they
700 meant. */
701 if (form == POINTER_TYPE
a4443a08 702 && (comptypes (TREE_TYPE (intype), type, -1)))
a28e3c7f
MS
703 cp_warning ("casting `%T' to `%T' does not dereference pointer",
704 intype, reftype);
705
8926095f
MS
706 rval = build_unary_op (ADDR_EXPR, expr, 0);
707 if (rval != error_mark_node)
6060a796 708 rval = convert_force (build_pointer_type (TREE_TYPE (reftype)), rval, 0);
8926095f 709 if (rval != error_mark_node)
7177d104 710 rval = build1 (NOP_EXPR, reftype, rval);
8926095f 711 }
a4443a08 712 else if (decl)
8d08fdba
MS
713 {
714 tree rval_as_conversion = NULL_TREE;
715 tree rval_as_ctor = NULL_TREE;
716
717 if (IS_AGGR_TYPE (intype)
718 && (rval = build_type_conversion (CONVERT_EXPR, type, expr, 1)))
719 {
720 if (rval == error_mark_node)
721 return rval;
722
723 rval_as_conversion = build_up_reference (reftype, rval, flags, 1);
724 }
725
726 /* Definitely need to go through a constructor here. */
727 if (TYPE_HAS_CONSTRUCTOR (type)
a28e3c7f 728 && ! CLASSTYPE_ABSTRACT_VIRTUALS (type)
8d08fdba
MS
729 && (rval = build_method_call
730 (NULL_TREE, constructor_name_full (type),
731 build_tree_list (NULL_TREE, expr), TYPE_BINFO (type),
db5ae43f
MS
732 LOOKUP_NO_CONVERSION|LOOKUP_SPECULATIVELY
733 | LOOKUP_ONLYCONVERTING)))
8d08fdba
MS
734 {
735 tree init;
736
737 if (global_bindings_p ())
738 {
739 extern tree static_aggregates;
a4443a08
MS
740 tree t = get_temp_name (type, global_bindings_p ());
741 init = build_method_call (t, constructor_name_full (type),
8d08fdba 742 build_tree_list (NULL_TREE, expr),
a4443a08 743 TYPE_BINFO (type),
db5ae43f
MS
744 LOOKUP_NORMAL|LOOKUP_NO_CONVERSION
745 | LOOKUP_ONLYCONVERTING);
8d08fdba
MS
746
747 if (init == error_mark_node)
748 return error_mark_node;
749
a4443a08
MS
750 make_decl_rtl (t, NULL_PTR, 1);
751 static_aggregates = perm_tree_cons (expr, t, static_aggregates);
752 rval = build_unary_op (ADDR_EXPR, t, 0);
8d08fdba
MS
753 }
754 else
755 {
756 init = build_method_call (NULL_TREE, constructor_name_full (type),
757 build_tree_list (NULL_TREE, expr),
a4443a08 758 TYPE_BINFO (type),
db5ae43f
MS
759 LOOKUP_NORMAL|LOOKUP_NO_CONVERSION
760 |LOOKUP_ONLYCONVERTING);
8d08fdba
MS
761
762 if (init == error_mark_node)
763 return error_mark_node;
764
765 rval = build_cplus_new (type, init, 1);
766 rval = build_up_reference (reftype, rval, flags, 1);
767 }
768 rval_as_ctor = rval;
769 }
770
771 if (rval_as_ctor && rval_as_conversion)
772 {
773 cp_error ("ambiguous conversion from `%T' to `%T'; both user-defined conversion and constructor apply",
774 intype, reftype);
775 return error_mark_node;
776 }
777 else if (rval_as_ctor)
778 rval = rval_as_ctor;
779 else if (rval_as_conversion)
780 rval = rval_as_conversion;
781 else if (! IS_AGGR_TYPE (type) && ! IS_AGGR_TYPE (intype))
782 {
783 rval = convert (type, expr);
784 if (rval == error_mark_node)
785 return error_mark_node;
786
787 rval = build_up_reference (reftype, rval, flags, 1);
788 }
789
790 if (rval && ! TYPE_READONLY (TREE_TYPE (reftype)))
a4443a08
MS
791 cp_pedwarn ("initializing non-const `%T' with `%T' will use a temporary",
792 reftype, intype);
8d08fdba
MS
793 }
794
795 if (rval)
796 {
797 /* If we found a way to convert earlier, then use it. */
798 return rval;
799 }
800
801 my_friendly_assert (form != OFFSET_TYPE, 189);
802
8d08fdba
MS
803 if (flags & LOOKUP_SPECULATIVELY)
804 return NULL_TREE;
805
8926095f
MS
806 else if (flags & LOOKUP_COMPLAIN)
807 cp_error ("cannot convert type `%T' to type `%T'", intype, reftype);
808
8d08fdba
MS
809 return error_mark_node;
810}
811
812/* We are using a reference VAL for its value. Bash that reference all the
813 way down to its lowest form. */
814tree
815convert_from_reference (val)
816 tree val;
817{
818 tree type = TREE_TYPE (val);
819
820 if (TREE_CODE (type) == OFFSET_TYPE)
821 type = TREE_TYPE (type);
822 if (TREE_CODE (type) == REFERENCE_TYPE)
823 {
824 tree target_type = TREE_TYPE (type);
825 tree nval;
826
827 /* This can happen if we cast to a reference type. */
828 if (TREE_CODE (val) == ADDR_EXPR)
829 {
830 nval = build1 (NOP_EXPR, build_pointer_type (target_type), val);
831 nval = build_indirect_ref (nval, NULL_PTR);
832 /* The below was missing, are other important flags missing too? */
833 TREE_SIDE_EFFECTS (nval) = TREE_SIDE_EFFECTS (val);
834 return nval;
835 }
836
39211cd5 837 nval = build1 (INDIRECT_REF, target_type, val);
8d08fdba
MS
838
839 TREE_THIS_VOLATILE (nval) = TYPE_VOLATILE (target_type);
840 TREE_SIDE_EFFECTS (nval) = TYPE_VOLATILE (target_type);
841 TREE_READONLY (nval) = TYPE_READONLY (target_type);
842 /* The below was missing, are other important flags missing too? */
843 TREE_SIDE_EFFECTS (nval) |= TREE_SIDE_EFFECTS (val);
844 return nval;
845 }
846 return val;
847}
848\f
849/* See if there is a constructor of type TYPE which will convert
850 EXPR. The reference manual seems to suggest (8.5.6) that we need
851 not worry about finding constructors for base classes, then converting
852 to the derived class.
853
854 MSGP is a pointer to a message that would be an appropriate error
855 string. If MSGP is NULL, then we are not interested in reporting
856 errors. */
857tree
858convert_to_aggr (type, expr, msgp, protect)
859 tree type, expr;
860 char **msgp;
861 int protect;
862{
863 tree basetype = type;
864 tree name = TYPE_IDENTIFIER (basetype);
865 tree function, fndecl, fntype, parmtypes, parmlist, result;
866 tree method_name;
867 enum access_type access;
868 int can_be_private, can_be_protected;
869
870 if (! TYPE_HAS_CONSTRUCTOR (basetype))
871 {
872 if (msgp)
873 *msgp = "type `%s' does not have a constructor";
874 return error_mark_node;
875 }
876
877 access = access_public;
878 can_be_private = 0;
879 can_be_protected = IDENTIFIER_CLASS_VALUE (name) || name == current_class_name;
880
881 parmlist = build_tree_list (NULL_TREE, expr);
882 parmtypes = tree_cons (NULL_TREE, TREE_TYPE (expr), void_list_node);
883
884 if (TYPE_USES_VIRTUAL_BASECLASSES (basetype))
885 {
886 parmtypes = tree_cons (NULL_TREE, integer_type_node, parmtypes);
887 parmlist = tree_cons (NULL_TREE, integer_one_node, parmlist);
888 }
889
890 /* The type of the first argument will be filled in inside the loop. */
891 parmlist = tree_cons (NULL_TREE, integer_zero_node, parmlist);
892 parmtypes = tree_cons (NULL_TREE, TYPE_POINTER_TO (basetype), parmtypes);
893
894 method_name = build_decl_overload (name, parmtypes, 1);
895
896 /* constructors are up front. */
897 fndecl = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (basetype), 0);
898 if (TYPE_HAS_DESTRUCTOR (basetype))
899 fndecl = DECL_CHAIN (fndecl);
900
901 while (fndecl)
902 {
903 if (DECL_ASSEMBLER_NAME (fndecl) == method_name)
904 {
905 function = fndecl;
906 if (protect)
907 {
908 if (TREE_PRIVATE (fndecl))
909 {
910 can_be_private =
911 (basetype == current_class_type
912 || is_friend (basetype, current_function_decl)
913 || purpose_member (basetype, DECL_ACCESS (fndecl)));
914 if (! can_be_private)
915 goto found;
916 }
917 else if (TREE_PROTECTED (fndecl))
918 {
919 if (! can_be_protected)
920 goto found;
921 }
922 }
923 goto found_and_ok;
924 }
925 fndecl = DECL_CHAIN (fndecl);
926 }
927
928 /* No exact conversion was found. See if an approximate
929 one will do. */
930 fndecl = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (basetype), 0);
931 if (TYPE_HAS_DESTRUCTOR (basetype))
932 fndecl = DECL_CHAIN (fndecl);
933
934 {
935 int saw_private = 0;
936 int saw_protected = 0;
937 struct candidate *candidates =
938 (struct candidate *) alloca ((decl_list_length (fndecl)+1) * sizeof (struct candidate));
939 struct candidate *cp = candidates;
940
941 while (fndecl)
942 {
943 function = fndecl;
944 cp->h_len = 2;
2986ae00
MS
945 cp->harshness = (struct harshness_code *)
946 alloca (3 * sizeof (struct harshness_code));
8d08fdba
MS
947
948 compute_conversion_costs (fndecl, parmlist, cp, 2);
2986ae00 949 if ((cp->h.code & EVIL_CODE) == 0)
8d08fdba
MS
950 {
951 cp->u.field = fndecl;
952 if (protect)
953 {
954 if (TREE_PRIVATE (fndecl))
955 access = access_private;
956 else if (TREE_PROTECTED (fndecl))
957 access = access_protected;
958 else
959 access = access_public;
960 }
961 else
962 access = access_public;
963
964 if (access == access_private
965 ? (basetype == current_class_type
966 || is_friend (basetype, cp->function)
967 || purpose_member (basetype, DECL_ACCESS (fndecl)))
968 : access == access_protected
969 ? (can_be_protected
970 || purpose_member (basetype, DECL_ACCESS (fndecl)))
971 : 1)
972 {
2986ae00 973 if (cp->h.code <= TRIVIAL_CODE)
8d08fdba
MS
974 goto found_and_ok;
975 cp++;
976 }
977 else
978 {
979 if (access == access_private)
980 saw_private = 1;
981 else
982 saw_protected = 1;
983 }
984 }
985 fndecl = DECL_CHAIN (fndecl);
986 }
987 if (cp - candidates)
988 {
989 /* Rank from worst to best. Then cp will point to best one.
990 Private fields have their bits flipped. For unsigned
991 numbers, this should make them look very large.
992 If the best alternate has a (signed) negative value,
993 then all we ever saw were private members. */
994 if (cp - candidates > 1)
995 qsort (candidates, /* char *base */
996 cp - candidates, /* int nel */
997 sizeof (struct candidate), /* int width */
998 rank_for_overload); /* int (*compar)() */
999
1000 --cp;
2986ae00 1001 if (cp->h.code & EVIL_CODE)
8d08fdba
MS
1002 {
1003 if (msgp)
1004 *msgp = "ambiguous type conversion possible for `%s'";
1005 return error_mark_node;
1006 }
1007
1008 function = cp->function;
1009 fndecl = cp->u.field;
1010 goto found_and_ok;
1011 }
1012 else if (msgp)
1013 {
1014 if (saw_private)
1015 if (saw_protected)
1016 *msgp = "only private and protected conversions apply";
1017 else
1018 *msgp = "only private conversions apply";
1019 else if (saw_protected)
1020 *msgp = "only protected conversions apply";
8926095f
MS
1021 else
1022 *msgp = "no appropriate conversion to type `%s'";
8d08fdba
MS
1023 }
1024 return error_mark_node;
1025 }
1026 /* NOTREACHED */
1027
8d08fdba
MS
1028 found:
1029 if (access == access_private)
1030 if (! can_be_private)
1031 {
1032 if (msgp)
1033 *msgp = TREE_PRIVATE (fndecl)
1034 ? "conversion to type `%s' is private"
1035 : "conversion to type `%s' is from private base class";
1036 return error_mark_node;
1037 }
1038 if (access == access_protected)
1039 if (! can_be_protected)
1040 {
1041 if (msgp)
1042 *msgp = TREE_PRIVATE (fndecl)
1043 ? "conversion to type `%s' is protected"
1044 : "conversion to type `%s' is from protected base class";
1045 return error_mark_node;
1046 }
1047 function = fndecl;
1048 found_and_ok:
1049
1050 /* It will convert, but we don't do anything about it yet. */
1051 if (msgp == 0)
1052 return NULL_TREE;
1053
1054 fntype = TREE_TYPE (function);
1055 if (DECL_INLINE (function) && TREE_CODE (function) == FUNCTION_DECL)
1056 function = build1 (ADDR_EXPR, build_pointer_type (fntype), function);
1057 else
1058 function = default_conversion (function);
1059
1060 result = build_nt (CALL_EXPR, function,
1061 convert_arguments (NULL_TREE, TYPE_ARG_TYPES (fntype),
1062 parmlist, NULL_TREE, LOOKUP_NORMAL),
1063 NULL_TREE);
1064 TREE_TYPE (result) = TREE_TYPE (fntype);
1065 TREE_SIDE_EFFECTS (result) = 1;
8d08fdba
MS
1066 return result;
1067}
1068
1069/* Call this when we know (for any reason) that expr is not, in fact,
1070 zero. This routine is like convert_pointer_to, but it pays
1071 attention to which specific instance of what type we want to
1072 convert to. This routine should eventually become
1073 convert_to_pointer after all references to convert_to_pointer
1074 are removed. */
1075tree
1076convert_pointer_to_real (binfo, expr)
1077 tree binfo, expr;
1078{
1079 register tree intype = TREE_TYPE (expr);
1080 tree ptr_type;
1081 tree type, rval;
1082
1083 if (TREE_CODE (binfo) == TREE_VEC)
1084 type = BINFO_TYPE (binfo);
1085 else if (IS_AGGR_TYPE (binfo))
1086 {
1087 type = binfo;
1088 }
1089 else
1090 {
1091 type = binfo;
1092 binfo = NULL_TREE;
1093 }
1094
1095 ptr_type = build_pointer_type (type);
1096 if (ptr_type == TYPE_MAIN_VARIANT (intype))
1097 return expr;
1098
1099 if (intype == error_mark_node)
1100 return error_mark_node;
1101
1102 my_friendly_assert (!integer_zerop (expr), 191);
1103
1104 if (TREE_CODE (type) == RECORD_TYPE
1105 && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE
1106 && type != TYPE_MAIN_VARIANT (TREE_TYPE (intype)))
1107 {
1108 tree path;
1109 int distance
1110 = get_base_distance (binfo, TYPE_MAIN_VARIANT (TREE_TYPE (intype)),
1111 0, &path);
1112
1113 /* This function shouldn't be called with unqualified arguments
1114 but if it is, give them an error message that they can read. */
1115 if (distance < 0)
1116 {
7177d104
MS
1117 cp_error ("cannot convert a pointer of type `%T' to a pointer of type `%T'",
1118 TREE_TYPE (intype), type);
8d08fdba
MS
1119
1120 if (distance == -2)
1121 cp_error ("because `%T' is an ambiguous base class", type);
1122 return error_mark_node;
1123 }
1124
1125 return build_vbase_path (PLUS_EXPR, ptr_type, expr, path, 1);
1126 }
1127 rval = build1 (NOP_EXPR, ptr_type,
1128 TREE_CODE (expr) == NOP_EXPR ? TREE_OPERAND (expr, 0) : expr);
1129 TREE_CONSTANT (rval) = TREE_CONSTANT (expr);
1130 return rval;
1131}
1132
1133/* Call this when we know (for any reason) that expr is
1134 not, in fact, zero. This routine gets a type out of the first
1135 argument and uses it to search for the type to convert to. If there
1136 is more than one instance of that type in the expr, the conversion is
1137 ambiguous. This routine should eventually go away, and all
1138 callers should use convert_to_pointer_real. */
1139tree
1140convert_pointer_to (binfo, expr)
1141 tree binfo, expr;
1142{
1143 tree type;
1144
1145 if (TREE_CODE (binfo) == TREE_VEC)
1146 type = BINFO_TYPE (binfo);
1147 else if (IS_AGGR_TYPE (binfo))
1148 type = binfo;
1149 else
1150 type = binfo;
1151 return convert_pointer_to_real (type, expr);
1152}
1153
1154/* Same as above, but don't abort if we get an "ambiguous" baseclass.
1155 There's only one virtual baseclass we are looking for, and once
1156 we find one such virtual baseclass, we have found them all. */
1157
1158tree
1159convert_pointer_to_vbase (binfo, expr)
1160 tree binfo;
1161 tree expr;
1162{
1163 tree intype = TREE_TYPE (TREE_TYPE (expr));
1164 tree binfos = TYPE_BINFO_BASETYPES (intype);
1165 int i;
1166
1167 for (i = TREE_VEC_LENGTH (binfos)-1; i >= 0; i--)
1168 {
1169 tree basetype = BINFO_TYPE (TREE_VEC_ELT (binfos, i));
1170 if (BINFO_TYPE (binfo) == basetype)
1171 return convert_pointer_to (binfo, expr);
1172 if (binfo_member (BINFO_TYPE (binfo), CLASSTYPE_VBASECLASSES (basetype)))
1173 return convert_pointer_to_vbase (binfo, convert_pointer_to (basetype, expr));
1174 }
1175 my_friendly_abort (6);
1176 /* NOTREACHED */
1177 return NULL_TREE;
1178}
1179\f
8d08fdba 1180tree
a4443a08 1181cp_convert (type, expr, convtype, flags)
8d08fdba 1182 tree type, expr;
a4443a08 1183 int convtype, flags;
8d08fdba
MS
1184{
1185 register tree e = expr;
1186 register enum tree_code code = TREE_CODE (type);
1187
6060a796
MS
1188 if (TREE_CODE (e) == ERROR_MARK
1189 || TREE_CODE (TREE_TYPE (e)) == ERROR_MARK)
8d08fdba 1190 return error_mark_node;
a4443a08
MS
1191
1192 /* Trivial conversion: cv-qualifiers do not matter on rvalues. */
f0e01782
MS
1193 if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (TREE_TYPE (e)))
1194 return fold (build1 (NOP_EXPR, type, e));
a4443a08
MS
1195
1196 if (code == VOID_TYPE && (convtype & CONV_STATIC))
1197 return build1 (CONVERT_EXPR, type, e);
1198
8d08fdba
MS
1199#if 0
1200 /* This is incorrect. A truncation can't be stripped this way.
1201 Extensions will be stripped by the use of get_unwidened. */
f0e01782
MS
1202 if (TREE_CODE (e) == NOP_EXPR)
1203 return convert (type, TREE_OPERAND (e, 0));
8d08fdba
MS
1204#endif
1205
1206 /* Just convert to the type of the member. */
1207 if (code == OFFSET_TYPE)
1208 {
1209 type = TREE_TYPE (type);
1210 code = TREE_CODE (type);
1211 }
1212
8d08fdba 1213 if (code == REFERENCE_TYPE)
a4443a08 1214 return fold (convert_to_reference (type, e, convtype, flags, NULL_TREE));
8d08fdba
MS
1215 else if (TREE_CODE (TREE_TYPE (e)) == REFERENCE_TYPE)
1216 e = convert_from_reference (e);
1217
a292b002
MS
1218 if (TREE_CODE (e) == OFFSET_REF)
1219 e = resolve_offset_ref (e);
1220
a0a33927
MS
1221 if (TREE_READONLY_DECL_P (e))
1222 e = decl_constant_value (e);
1223
2986ae00 1224 if (INTEGRAL_CODE_P (code))
8d08fdba 1225 {
f0e01782 1226 tree intype = TREE_TYPE (e);
8d08fdba
MS
1227 enum tree_code form = TREE_CODE (intype);
1228 /* enum = enum, enum = int, enum = float are all errors. */
1229 if (flag_int_enum_equivalence == 0
1230 && TREE_CODE (type) == ENUMERAL_TYPE
6060a796
MS
1231 && ARITHMETIC_TYPE_P (intype)
1232 && ! (convtype & CONV_STATIC))
8d08fdba
MS
1233 {
1234 cp_pedwarn ("conversion from `%#T' to `%#T'", intype, type);
1235
1236 if (flag_pedantic_errors)
1237 return error_mark_node;
1238 }
a292b002 1239 if (IS_AGGR_TYPE (intype))
8d08fdba
MS
1240 {
1241 tree rval;
f0e01782 1242 rval = build_type_conversion (CONVERT_EXPR, type, e, 1);
00595019
MS
1243 if (rval)
1244 return rval;
1245 cp_error ("`%#T' used where a `%T' was expected", intype, type);
8d08fdba
MS
1246 return error_mark_node;
1247 }
2986ae00
MS
1248 if (code == BOOLEAN_TYPE)
1249 {
1250 tree newe = truthvalue_conversion (e);
1251 /* Avoid stupid (infinite) recursion from backend. */
1252 if (TREE_CODE (newe) != NOP_EXPR || e != TREE_OPERAND (newe, 0))
1253 e = newe;
1254 if (TREE_TYPE (e) == bool_type_node)
1255 return e;
f0e01782
MS
1256 else if (TREE_CODE (e) == INTEGER_CST)
1257 {
1258 if (e == integer_zero_node)
1259 e = false_node;
1260 else
1261 e = true_node;
1262 }
2986ae00
MS
1263 else
1264 return build1 (NOP_EXPR, bool_type_node, e);
1265 }
8d08fdba
MS
1266 return fold (convert_to_integer (type, e));
1267 }
1268 if (code == POINTER_TYPE)
1269 return fold (cp_convert_to_pointer (type, e));
1270 if (code == REAL_TYPE)
1271 {
1272 if (IS_AGGR_TYPE (TREE_TYPE (e)))
1273 {
1274 tree rval;
1275 rval = build_type_conversion (CONVERT_EXPR, type, e, 1);
1276 if (rval)
1277 return rval;
1278 else
1279 cp_error ("`%#T' used where a floating point value was expected",
1280 TREE_TYPE (e));
1281 }
1282 return fold (convert_to_real (type, e));
1283 }
1284
1285 /* New C++ semantics: since assignment is now based on
1286 memberwise copying, if the rhs type is derived from the
1287 lhs type, then we may still do a conversion. */
1288 if (IS_AGGR_TYPE_CODE (code))
1289 {
1290 tree dtype = TREE_TYPE (e);
db5ae43f
MS
1291 tree ctor = NULL_TREE;
1292 tree conversion = NULL_TREE;
8d08fdba 1293
8d08fdba
MS
1294 dtype = TYPE_MAIN_VARIANT (dtype);
1295
1296 /* Conversion of object pointers or signature pointers/references
1297 to signature pointers/references. */
1298
1299 if (TYPE_LANG_SPECIFIC (type)
1300 && (IS_SIGNATURE_POINTER (type) || IS_SIGNATURE_REFERENCE (type)))
1301 {
1302 tree constructor = build_signature_pointer_constructor (type, expr);
1303 tree sig_ty = SIGNATURE_TYPE (type);
1304 tree sig_ptr;
1305
1306 if (constructor == error_mark_node)
1307 return error_mark_node;
1308
1309 sig_ptr = get_temp_name (type, 1);
1310 DECL_INITIAL (sig_ptr) = constructor;
1311 CLEAR_SIGNATURE (sig_ty);
6060a796 1312 finish_decl (sig_ptr, constructor, NULL_TREE, 0, 0);
8d08fdba
MS
1313 SET_SIGNATURE (sig_ty);
1314 TREE_READONLY (sig_ptr) = 1;
1315
1316 return sig_ptr;
1317 }
1318
1319 /* Conversion between aggregate types. New C++ semantics allow
1320 objects of derived type to be cast to objects of base type.
1321 Old semantics only allowed this between pointers.
1322
1323 There may be some ambiguity between using a constructor
1324 vs. using a type conversion operator when both apply. */
1325
db5ae43f
MS
1326 if (IS_AGGR_TYPE (dtype) && ! DERIVED_FROM_P (type, dtype)
1327 && TYPE_HAS_CONVERSION (dtype))
1328 conversion = build_type_conversion (CONVERT_EXPR, type, e, 1);
8d08fdba 1329
db5ae43f
MS
1330 if (conversion == error_mark_node)
1331 {
1332 error ("ambiguous pointer conversion");
1333 return conversion;
1334 }
8d08fdba 1335
db5ae43f
MS
1336 if (TYPE_HAS_CONSTRUCTOR (type))
1337 ctor = build_method_call (NULL_TREE, constructor_name_full (type),
1338 build_tree_list (NULL_TREE, e),
1339 TYPE_BINFO (type),
1340 LOOKUP_NORMAL | LOOKUP_SPECULATIVELY
6060a796 1341 | (convtype&CONV_NONCONVERTING ? 0 : LOOKUP_ONLYCONVERTING)
db5ae43f 1342 | (conversion ? LOOKUP_NO_CONVERSION : 0));
8d08fdba 1343
db5ae43f
MS
1344 if (ctor == error_mark_node)
1345 {
1346 cp_error ("in conversion to type `%T'", type);
8d08fdba
MS
1347 return error_mark_node;
1348 }
db5ae43f
MS
1349
1350 if (conversion && ctor)
8d08fdba 1351 {
db5ae43f
MS
1352 error ("both constructor and type conversion operator apply");
1353 return error_mark_node;
1354 }
1355 else if (conversion)
1356 return conversion;
1357 else if (ctor)
1358 {
1359 if (current_function_decl)
1360 /* We can't pass 1 to the with_cleanup_p arg here, because that
1361 screws up passing classes by value. */
1362 ctor = build_cplus_new (type, ctor, 0);
1363 else
8d08fdba 1364 {
db5ae43f
MS
1365 register tree parm = TREE_OPERAND (ctor, 1);
1366
1367 /* Initializers for static variables and parameters
1368 have to handle doing the initialization and
1369 cleanup themselves. */
1370 my_friendly_assert (TREE_CODE (ctor) == CALL_EXPR, 322);
1371#if 0
1372 /* The following assertion fails in cases where we
1373 are initializing a static member variable of a
1374 particular instance of a template class with a
1375 call to a constructor of the given instance, as
1376 in:
1377
1378 TMPL<int> object = TMPL<int>();
1379
1380 Curiously, the assertion does not fail if we do
1381 the same thing for a static member of a
1382 non-template class, as in:
1383
1384 T object = T();
1385
1386 I can't see why we should care here whether or not
1387 the initializer expression involves a call to
1388 `new', so for the time being, it seems best to
1389 just avoid doing this assertion. */
1390 my_friendly_assert (TREE_CALLS_NEW (TREE_VALUE (parm)),
1391 323);
1392#endif
1393 TREE_VALUE (parm) = NULL_TREE;
1394 ctor = build_indirect_ref (ctor, NULL_PTR);
1395 TREE_HAS_CONSTRUCTOR (ctor) = 1;
8d08fdba 1396 }
db5ae43f 1397 return ctor;
8d08fdba
MS
1398 }
1399 }
1400
f0e01782 1401 /* If TYPE or TREE_TYPE (E) is not on the permanent_obstack,
8d08fdba
MS
1402 then the it won't be hashed and hence compare as not equal,
1403 even when it is. */
1404 if (code == ARRAY_TYPE
f0e01782
MS
1405 && TREE_TYPE (TREE_TYPE (e)) == TREE_TYPE (type)
1406 && index_type_equal (TYPE_DOMAIN (TREE_TYPE (e)), TYPE_DOMAIN (type)))
1407 return e;
8d08fdba
MS
1408
1409 cp_error ("conversion from `%T' to non-scalar type `%T' requested",
1410 TREE_TYPE (expr), type);
1411 return error_mark_node;
1412}
1413
a4443a08
MS
1414/* Create an expression whose value is that of EXPR,
1415 converted to type TYPE. The TREE_TYPE of the value
1416 is always TYPE. This function implements all reasonable
1417 conversions; callers should filter out those that are
1418 not permitted by the language being compiled. */
1419
1420tree
1421convert (type, expr)
1422 tree type, expr;
1423{
1424 return cp_convert (type, expr, CONV_OLD_CONVERT, 0);
1425}
1426
8d08fdba
MS
1427/* Like convert, except permit conversions to take place which
1428 are not normally allowed due to access restrictions
1429 (such as conversion from sub-type to private super-type). */
1430tree
6060a796 1431convert_force (type, expr, convtype)
8d08fdba
MS
1432 tree type;
1433 tree expr;
6060a796 1434 int convtype;
8d08fdba
MS
1435{
1436 register tree e = expr;
1437 register enum tree_code code = TREE_CODE (type);
1438
1439 if (code == REFERENCE_TYPE)
a4443a08
MS
1440 return fold (convert_to_reference (type, e, CONV_C_CAST, LOOKUP_COMPLAIN,
1441 NULL_TREE));
8d08fdba
MS
1442 else if (TREE_CODE (TREE_TYPE (e)) == REFERENCE_TYPE)
1443 e = convert_from_reference (e);
1444
1445 if (code == POINTER_TYPE)
1446 return fold (convert_to_pointer_force (type, e));
1447
51c184be 1448 /* From typeck.c convert_for_assignment */
8d08fdba
MS
1449 if (((TREE_CODE (TREE_TYPE (e)) == POINTER_TYPE && TREE_CODE (e) == ADDR_EXPR
1450 && TREE_CODE (TREE_TYPE (e)) == POINTER_TYPE
1451 && TREE_CODE (TREE_TYPE (TREE_TYPE (e))) == METHOD_TYPE)
51c184be
MS
1452 || integer_zerop (e)
1453 || TYPE_PTRMEMFUNC_P (TREE_TYPE (e)))
8d08fdba
MS
1454 && TYPE_PTRMEMFUNC_P (type))
1455 {
1456 /* compatible pointer to member functions. */
51c184be 1457 return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), e, 1);
8d08fdba 1458 }
6060a796
MS
1459
1460 return cp_convert (type, e, CONV_OLD_CONVERT|convtype, 0);
8d08fdba
MS
1461}
1462
1463/* Subroutine of build_type_conversion. */
1464static tree
1465build_type_conversion_1 (xtype, basetype, expr, typename, for_sure)
1466 tree xtype, basetype;
1467 tree expr;
1468 tree typename;
1469 int for_sure;
1470{
8d08fdba
MS
1471 tree rval;
1472 int flags;
1473
1474 if (for_sure == 0)
db5ae43f 1475 flags = LOOKUP_PROTECT|LOOKUP_ONLYCONVERTING;
8d08fdba 1476 else
db5ae43f 1477 flags = LOOKUP_NORMAL|LOOKUP_ONLYCONVERTING;
8d08fdba 1478
21474714 1479 rval = build_method_call (expr, typename, NULL_TREE, NULL_TREE, flags);
8d08fdba
MS
1480 if (rval == error_mark_node)
1481 {
1482 if (for_sure == 0)
1483 return NULL_TREE;
1484 return error_mark_node;
1485 }
8d08fdba
MS
1486 if (TREE_CODE (TREE_TYPE (rval)) == REFERENCE_TYPE
1487 && TREE_CODE (xtype) != REFERENCE_TYPE)
1488 rval = default_conversion (rval);
1489
1490 if (warn_cast_qual
1491 && TREE_TYPE (xtype)
1492 && (TREE_READONLY (TREE_TYPE (TREE_TYPE (rval)))
1493 > TREE_READONLY (TREE_TYPE (xtype))))
1494 warning ("user-defined conversion casting away `const'");
a4443a08 1495 return convert (xtype, rval);
8d08fdba
MS
1496}
1497
1498/* Convert an aggregate EXPR to type XTYPE. If a conversion
1499 exists, return the attempted conversion. This may
1500 return ERROR_MARK_NODE if the conversion is not
1501 allowed (references private members, etc).
1502 If no conversion exists, NULL_TREE is returned.
1503
1504 If (FOR_SURE & 1) is non-zero, then we allow this type conversion
1505 to take place immediately. Otherwise, we build a SAVE_EXPR
1506 which can be evaluated if the results are ever needed.
1507
1508 If FOR_SURE >= 2, then we only look for exact conversions.
1509
1510 TYPE may be a reference type, in which case we first look
1511 for something that will convert to a reference type. If
1512 that fails, we will try to look for something of the
1513 reference's target type, and then return a reference to that. */
1514tree
1515build_type_conversion (code, xtype, expr, for_sure)
1516 enum tree_code code;
1517 tree xtype, expr;
1518 int for_sure;
1519{
1520 /* C++: check to see if we can convert this aggregate type
1521 into the required scalar type. */
1522 tree type, type_default;
1523 tree typename = build_typename_overload (xtype), *typenames;
1524 int n_variants = 0;
1525 tree basetype, save_basetype;
1526 tree rval;
1527 int exact_conversion = for_sure >= 2;
1528 for_sure &= 1;
1529
1530 if (expr == error_mark_node)
1531 return error_mark_node;
1532
1533 basetype = TREE_TYPE (expr);
1534 if (TREE_CODE (basetype) == REFERENCE_TYPE)
1535 basetype = TREE_TYPE (basetype);
1536
2986ae00
MS
1537 if (TYPE_PTRMEMFUNC_P (basetype) && TREE_CODE (xtype) == BOOLEAN_TYPE)
1538 {
1539 /* We convert a pointer to member function into a boolean,
1540 by just checking the index value, for == 0, we want false, for
1541 != 0, we want true. */
1542 return convert (xtype, build_component_ref (expr, index_identifier, 0, 0));
1543 }
1544
8d08fdba
MS
1545 basetype = TYPE_MAIN_VARIANT (basetype);
1546 if (! TYPE_LANG_SPECIFIC (basetype) || ! TYPE_HAS_CONVERSION (basetype))
1547 return NULL_TREE;
1548
1549 if (TREE_CODE (xtype) == POINTER_TYPE
1550 || TREE_CODE (xtype) == REFERENCE_TYPE)
1551 {
1552 /* Prepare to match a variant of this type. */
1553 type = TYPE_MAIN_VARIANT (TREE_TYPE (xtype));
1554 for (n_variants = 0; type; type = TYPE_NEXT_VARIANT (type))
1555 n_variants++;
1556 typenames = (tree *)alloca (n_variants * sizeof (tree));
1557 for (n_variants = 0, type = TYPE_MAIN_VARIANT (TREE_TYPE (xtype));
1558 type; n_variants++, type = TYPE_NEXT_VARIANT (type))
1559 {
1560 if (type == TREE_TYPE (xtype))
1561 typenames[n_variants] = typename;
1562 else if (TREE_CODE (xtype) == POINTER_TYPE)
1563 typenames[n_variants] = build_typename_overload (build_pointer_type (type));
1564 else
1565 typenames[n_variants] = build_typename_overload (build_reference_type (type));
1566 }
1567 }
1568
1569 save_basetype = basetype;
1570 type = xtype;
1571
1572 while (TYPE_HAS_CONVERSION (basetype))
1573 {
1574 int i;
1575 if (lookup_fnfields (TYPE_BINFO (basetype), typename, 0))
1576 return build_type_conversion_1 (xtype, basetype, expr, typename, for_sure);
1577 for (i = 0; i < n_variants; i++)
1578 if (typenames[i] != typename
1579 && lookup_fnfields (TYPE_BINFO (basetype), typenames[i], 0))
1580 return build_type_conversion_1 (xtype, basetype, expr, typenames[i], for_sure);
1581
1582 if (TYPE_BINFO_BASETYPES (basetype))
1583 basetype = TYPE_BINFO_BASETYPE (basetype, 0);
1584 else
1585 break;
1586 }
1587
1588 if (TREE_CODE (type) == REFERENCE_TYPE)
1589 {
21474714
MS
1590#if 0
1591 /* Only reference variable initializations can use a temporary; this
1592 must be handled elsewhere (like convert_to_reference and
1593 compute_conversion_costs). */
1594
8d08fdba 1595 type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
21474714 1596 typename = build_typename_overload (type);
8d08fdba
MS
1597 basetype = save_basetype;
1598
1599 /* May need to build a temporary for this. */
1600 while (TYPE_HAS_CONVERSION (basetype))
1601 {
1602 if (lookup_fnfields (TYPE_BINFO (basetype), typename, 0))
1603 {
1604 int flags;
1605
1606 if (for_sure == 0)
db5ae43f 1607 flags = LOOKUP_PROTECT|LOOKUP_ONLYCONVERTING;
8d08fdba 1608 else
db5ae43f 1609 flags = LOOKUP_NORMAL|LOOKUP_ONLYCONVERTING;
21474714
MS
1610 rval = build_method_call (expr,
1611 constructor_name_full (typename),
8d08fdba
MS
1612 NULL_TREE, NULL_TREE, flags);
1613 if (rval == error_mark_node)
1614 {
1615 if (for_sure == 0)
1616 return NULL_TREE;
1617 return error_mark_node;
1618 }
8d08fdba 1619
8d08fdba
MS
1620 return convert (xtype, rval);
1621 }
1622 if (TYPE_BINFO_BASETYPES (basetype))
1623 basetype = TYPE_BINFO_BASETYPE (basetype, 0);
1624 else
1625 break;
1626 }
21474714 1627#endif
8d08fdba
MS
1628 /* No free conversions for reference types, right?. */
1629 return NULL_TREE;
1630 }
1631
1632 if (exact_conversion)
1633 return NULL_TREE;
1634
2986ae00
MS
1635 if (TREE_CODE (type) == BOOLEAN_TYPE)
1636 {
1637 tree as_int = build_type_conversion (code, long_long_unsigned_type_node, expr, 0);
1638 tree as_ptr = build_type_conversion (code, ptr_type_node, expr, 0);
1639 /* We are missing the conversion to pointer to member type. */
1640 /* We are missing the conversion to floating type. */
1641 if (as_int && as_ptr && for_sure)
1642 {
1643 cp_error ("ambiguous conversion from `%T' to `bool', can convert to integral type or pointer", TREE_TYPE (expr));
1644 return error_mark_node;
1645 }
1646 if (as_int)
1647 {
1648 as_int = build_type_conversion (code, long_long_unsigned_type_node, expr, for_sure+exact_conversion*2);
1649 return convert (xtype, as_int);
1650 }
1651 if (as_ptr)
1652 {
1653 as_ptr = build_type_conversion (code, ptr_type_node, expr, for_sure+exact_conversion*2);
1654 return convert (xtype, as_ptr);
1655 }
1656 return NULL_TREE;
1657 }
1658
8d08fdba
MS
1659 /* No perfect match found, try default. */
1660#if 0 /* This is wrong; there is no standard conversion from void* to
1661 anything. -jason */
1662 if (code == CONVERT_EXPR && TREE_CODE (type) == POINTER_TYPE)
1663 type_default = ptr_type_node;
1664 else
1665#endif
1666 if (type == void_type_node)
1667 return NULL_TREE;
1668 else
1669 {
1670 tree tmp = default_conversion (build1 (NOP_EXPR, type, integer_zero_node));
1671 if (tmp == error_mark_node)
1672 return NULL_TREE;
1673 type_default = TREE_TYPE (tmp);
1674 }
1675
1676 basetype = save_basetype;
1677
1678 if (type_default != type)
1679 {
1680 type = type_default;
1681 typename = build_typename_overload (type);
1682
1683 while (TYPE_HAS_CONVERSION (basetype))
1684 {
1685 if (lookup_fnfields (TYPE_BINFO (basetype), typename, 0))
1686 return build_type_conversion_1 (xtype, basetype, expr, typename, for_sure);
1687 if (TYPE_BINFO_BASETYPES (basetype))
1688 basetype = TYPE_BINFO_BASETYPE (basetype, 0);
1689 else
1690 break;
1691 }
1692 }
1693
39211cd5 1694 if (TREE_CODE (type) == POINTER_TYPE && TYPE_READONLY (TREE_TYPE (type)))
8d08fdba 1695 {
39211cd5
MS
1696 /* Try converting to some other const pointer type and then using
1697 standard conversions. */
8d08fdba
MS
1698
1699 while (TYPE_HAS_CONVERSION (basetype))
1700 {
39211cd5 1701 if (CLASSTYPE_CONVERSION (basetype, constptr_conv) != 0)
8d08fdba 1702 {
39211cd5 1703 if (CLASSTYPE_CONVERSION (basetype, constptr_conv) == error_mark_node)
8d08fdba 1704 return error_mark_node;
39211cd5 1705 typename = DECL_NAME (CLASSTYPE_CONVERSION (basetype, constptr_conv));
8d08fdba
MS
1706 return build_type_conversion_1 (xtype, basetype, expr, typename, for_sure);
1707 }
1708 if (TYPE_BINFO_BASETYPES (basetype))
1709 basetype = TYPE_BINFO_BASETYPE (basetype, 0);
1710 else
1711 break;
1712 }
1713 }
39211cd5 1714 if (TREE_CODE (type) == POINTER_TYPE)
8d08fdba 1715 {
39211cd5
MS
1716 /* Try converting to some other pointer type and then using standard
1717 conversions. */
8d08fdba
MS
1718
1719 while (TYPE_HAS_CONVERSION (basetype))
1720 {
39211cd5 1721 if (CLASSTYPE_CONVERSION (basetype, ptr_conv) != 0)
8d08fdba 1722 {
39211cd5 1723 if (CLASSTYPE_CONVERSION (basetype, ptr_conv) == error_mark_node)
8d08fdba 1724 return error_mark_node;
39211cd5 1725 typename = DECL_NAME (CLASSTYPE_CONVERSION (basetype, ptr_conv));
8d08fdba
MS
1726 return build_type_conversion_1 (xtype, basetype, expr, typename, for_sure);
1727 }
1728 if (TYPE_BINFO_BASETYPES (basetype))
1729 basetype = TYPE_BINFO_BASETYPE (basetype, 0);
1730 else
1731 break;
1732 }
1733 }
39211cd5 1734
8d08fdba
MS
1735 /* Use the longer or shorter conversion that is appropriate. Have
1736 to check against 0 because the conversion may come from a baseclass. */
1737 if (TREE_CODE (type) == INTEGER_TYPE
1738 && TYPE_HAS_INT_CONVERSION (basetype)
1739 && CLASSTYPE_CONVERSION (basetype, int_conv) != 0
1740 && CLASSTYPE_CONVERSION (basetype, int_conv) != error_mark_node)
1741 {
1742 typename = DECL_NAME (CLASSTYPE_CONVERSION (basetype, int_conv));
1743 return build_type_conversion_1 (xtype, basetype, expr, typename, for_sure);
1744 }
1745
1746 if (TREE_CODE (type) == REAL_TYPE
1747 && TYPE_HAS_REAL_CONVERSION (basetype)
1748 && CLASSTYPE_CONVERSION (basetype, real_conv) != 0
1749 && CLASSTYPE_CONVERSION (basetype, real_conv) != error_mark_node)
1750 {
1751 /* Only accept using an operator double() if there isn't a conflicting
1752 operator int(). */
2986ae00 1753 if (TYPE_HAS_INT_CONVERSION (basetype))
8d08fdba 1754 {
f0e01782
MS
1755 if (for_sure)
1756 {
1757 cp_error ("two possible conversions for type `%T'", type);
1758 return error_mark_node;
1759 }
1760 else
1761 return NULL_TREE;
8d08fdba
MS
1762 }
1763
1764 typename = DECL_NAME (CLASSTYPE_CONVERSION (basetype, real_conv));
1765 return build_type_conversion_1 (xtype, basetype, expr, typename, for_sure);
1766 }
1767
8d08fdba
MS
1768 /* THESE ARE TOTAL KLUDGES. */
1769 /* Default promotion yields no new alternatives, try
1770 conversions which are anti-default, such as
1771
1772 double -> float or int -> unsigned or unsigned -> long
1773
1774 */
1775 if (type_default == type
2986ae00 1776 && (INTEGRAL_TYPE_P (type) || TREE_CODE (type) == REAL_TYPE))
8d08fdba
MS
1777 {
1778 int not_again = 0;
1779
1780 if (type == double_type_node)
1781 typename = build_typename_overload (float_type_node);
1782 else if (type == integer_type_node)
1783 typename = build_typename_overload (unsigned_type_node);
1784 else if (type == unsigned_type_node)
1785 typename = build_typename_overload (long_integer_type_node);
1786
1787 again:
1788 basetype = save_basetype;
1789 while (TYPE_HAS_CONVERSION (basetype))
1790 {
1791 if (lookup_fnfields (TYPE_BINFO (basetype), typename, 0))
1792 return build_type_conversion_1 (xtype, basetype, expr, typename, for_sure);
1793 if (TYPE_BINFO_BASETYPES (basetype))
1794 basetype = TYPE_BINFO_BASETYPE (basetype, 0);
1795 else
1796 break;
1797 }
1798 if (! not_again)
1799 {
1800 if (type == integer_type_node)
1801 {
1802 typename = build_typename_overload (long_integer_type_node);
1803 not_again = 1;
1804 goto again;
1805 }
1806 else
1807 {
1808 typename = build_typename_overload (integer_type_node);
1809 not_again = 1;
1810 goto again;
1811 }
1812 }
1813 }
1814
1815 /* Now, try C promotions...
1816
1817 float -> int
2986ae00 1818 int -> float */
8d08fdba
MS
1819
1820 basetype = save_basetype;
2986ae00 1821 if (TREE_CODE (type) == REAL_TYPE)
8d08fdba
MS
1822 type = integer_type_node;
1823 else if (TREE_CODE (type) == INTEGER_TYPE)
1824 if (TYPE_HAS_REAL_CONVERSION (basetype))
1825 type = double_type_node;
1826 else
1827 return NULL_TREE;
1828 else
1829 return NULL_TREE;
1830
1831 typename = build_typename_overload (type);
1832 while (TYPE_HAS_CONVERSION (basetype))
1833 {
1834 if (lookup_fnfields (TYPE_BINFO (basetype), typename, 0))
1835 {
1836 rval = build_type_conversion_1 (xtype, basetype, expr, typename, for_sure);
1837 return rval;
1838 }
1839 if (TYPE_BINFO_BASETYPES (basetype))
1840 basetype = TYPE_BINFO_BASETYPE (basetype, 0);
1841 else
1842 break;
1843 }
1844
1845 return NULL_TREE;
1846}
1847
1848/* Must convert two aggregate types to non-aggregate type.
1849 Attempts to find a non-ambiguous, "best" type conversion.
1850
1851 Return 1 on success, 0 on failure.
1852
1853 @@ What are the real semantics of this supposed to be??? */
1854int
1855build_default_binary_type_conversion (code, arg1, arg2)
1856 enum tree_code code;
1857 tree *arg1, *arg2;
1858{
1859 tree type1 = TREE_TYPE (*arg1);
1860 tree type2 = TREE_TYPE (*arg2);
1861
1862 if (TREE_CODE (type1) == REFERENCE_TYPE
1863 || TREE_CODE (type1) == POINTER_TYPE)
1864 type1 = TREE_TYPE (type1);
1865 if (TREE_CODE (type2) == REFERENCE_TYPE
1866 || TREE_CODE (type2) == POINTER_TYPE)
1867 type2 = TREE_TYPE (type2);
1868
1869 if (TREE_CODE (TYPE_NAME (type1)) != TYPE_DECL)
1870 {
1871 tree decl = typedecl_for_tag (type1);
1872 if (decl)
1873 error ("type conversion nonexistent for type `%s'",
1874 IDENTIFIER_POINTER (DECL_NAME (decl)));
1875 else
1876 error ("type conversion nonexistent for non-C++ type");
1877 return 0;
1878 }
1879 if (TREE_CODE (TYPE_NAME (type2)) != TYPE_DECL)
1880 {
1881 tree decl = typedecl_for_tag (type2);
1882 if (decl)
1883 error ("type conversion nonexistent for type `%s'",
1884 IDENTIFIER_POINTER (decl));
1885 else
1886 error ("type conversion nonexistent for non-C++ type");
1887 return 0;
1888 }
1889
1890 if (!IS_AGGR_TYPE (type1) || !TYPE_HAS_CONVERSION (type1))
1891 {
1892 if (!IS_AGGR_TYPE (type2) || !TYPE_HAS_CONVERSION (type2))
1893 cp_error ("no conversion from `%T' and `%T' to types with default `%O' ",
1894 type1, type2, code);
1895 else
1896 cp_error ("no conversion from `%T' to type with default `%O'",
1897 type1, code);
1898 return 0;
1899 }
1900 else if (!IS_AGGR_TYPE (type2) || !TYPE_HAS_CONVERSION (type2))
1901 {
1902 cp_error ("no conversion from `%T' to type with default `%O'",
1903 type2, code);
1904 return 0;
1905 }
1906
2986ae00
MS
1907 if (code == TRUTH_ANDIF_EXPR
1908 || code == TRUTH_ORIF_EXPR)
8d08fdba 1909 {
2986ae00
MS
1910 *arg1 = convert (bool_type_node, *arg1);
1911 *arg2 = convert (bool_type_node, *arg2);
1912 }
1913 else if (TYPE_HAS_INT_CONVERSION (type1))
1914 {
1915 if (TYPE_HAS_REAL_CONVERSION (type1))
1916 cp_pedwarn ("ambiguous type conversion for type `%T', defaulting to int",
1917 type1);
8d08fdba
MS
1918 *arg1 = build_type_conversion (code, integer_type_node, *arg1, 1);
1919 *arg2 = build_type_conversion (code, integer_type_node, *arg2, 1);
1920 }
1921 else if (TYPE_HAS_REAL_CONVERSION (type1))
1922 {
1923 *arg1 = build_type_conversion (code, double_type_node, *arg1, 1);
1924 *arg2 = build_type_conversion (code, double_type_node, *arg2, 1);
1925 }
1926 else
1927 {
1928 *arg1 = build_type_conversion (code, ptr_type_node, *arg1, 1);
1929 if (*arg1 == error_mark_node)
1930 error ("ambiguous pointer conversion");
1931 *arg2 = build_type_conversion (code, ptr_type_node, *arg2, 1);
1932 if (*arg1 != error_mark_node && *arg2 == error_mark_node)
1933 error ("ambiguous pointer conversion");
1934 }
1935 if (*arg1 == 0)
1936 {
1937 if (*arg2 == 0 && type1 != type2)
1938 cp_error ("default type conversion for types `%T' and `%T' failed",
1939 type1, type2);
1940 else
1941 cp_error ("default type conversion for type `%T' failed", type1);
1942 return 0;
1943 }
1944 else if (*arg2 == 0)
1945 {
1946 cp_error ("default type conversion for type `%T' failed", type2);
1947 return 0;
1948 }
1949 return 1;
1950}
1951
2986ae00 1952/* Must convert an aggregate type to non-aggregate type.
8d08fdba
MS
1953 Attempts to find a non-ambiguous, "best" type conversion.
1954
1955 Return 1 on success, 0 on failure.
1956
1957 The type of the argument is expected to be of aggregate type here.
1958
1959 @@ What are the real semantics of this supposed to be??? */
1960int
1961build_default_unary_type_conversion (code, arg)
1962 enum tree_code code;
1963 tree *arg;
1964{
1965 tree type = TREE_TYPE (*arg);
8d08fdba
MS
1966
1967 if (! TYPE_HAS_CONVERSION (type))
1968 {
2986ae00 1969 cp_error ("type conversion required for type `%T'", type);
8d08fdba
MS
1970 return 0;
1971 }
1972
2986ae00
MS
1973 if (code == TRUTH_NOT_EXPR)
1974 *arg = convert (bool_type_node, *arg);
1975 else if (TYPE_HAS_INT_CONVERSION (type))
1976 {
1977 if (TYPE_HAS_REAL_CONVERSION (type))
1978 cp_pedwarn ("ambiguous type conversion for type `%T', defaulting to int",
1979 type);
1980 *arg = build_type_conversion (code, integer_type_node, *arg, 1);
1981 }
8d08fdba
MS
1982 else if (TYPE_HAS_REAL_CONVERSION (type))
1983 *arg = build_type_conversion (code, double_type_node, *arg, 1);
1984 else
1985 {
1986 *arg = build_type_conversion (code, ptr_type_node, *arg, 1);
1987 if (*arg == error_mark_node)
1988 error ("ambiguous pointer conversion");
1989 }
1990 if (*arg == NULL_TREE)
1991 {
2986ae00 1992 cp_error ("default type conversion for type `%T' failed", type);
8d08fdba
MS
1993 return 0;
1994 }
1995 return 1;
1996}
39211cd5
MS
1997
1998/* Implements integral promotion (4.1) and float->double promotion. */
1999tree
2000type_promotes_to (type)
2001 tree type;
2002{
2003 int constp = TYPE_READONLY (type);
2004 int volatilep = TYPE_VOLATILE (type);
2005 type = TYPE_MAIN_VARIANT (type);
2986ae00
MS
2006
2007 /* bool always promotes to int (not unsigned), even if it's the same
2008 size. */
2009 if (type == bool_type_node)
2010 type = integer_type_node;
2011
2012 /* Normally convert enums to int, but convert wide enums to something
2013 wider. */
2014 else if (TREE_CODE (type) == ENUMERAL_TYPE
2015 || type == wchar_type_node)
cf2ac46f
JM
2016 {
2017 int precision = MAX (TYPE_PRECISION (type),
2018 TYPE_PRECISION (integer_type_node));
2019 tree totype = type_for_size (precision, 0);
2020 if (TREE_UNSIGNED (type)
2021 && ! int_fits_type_p (TYPE_MAX_VALUE (type), totype))
2022 type = type_for_size (precision, 1);
2023 else
2024 type = totype;
2025 }
39211cd5
MS
2026 else if (C_PROMOTING_INTEGER_TYPE_P (type))
2027 {
2028 /* Traditionally, unsignedness is preserved in default promotions.
2029 Otherwise, retain unsignedness if really not getting bigger. */
2030 if (TREE_UNSIGNED (type)
2031 && (flag_traditional
2032 || TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node)))
2033 type = unsigned_type_node;
2034 else
2035 type = integer_type_node;
2036 }
2037 else if (type == float_type_node)
2038 type = double_type_node;
2039
f376e137 2040 return cp_build_type_variant (type, constp, volatilep);
39211cd5 2041}
This page took 0.299321 seconds and 5 git commands to generate.