|
|
1.1 root 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 ([email protected])
4:
5: This file is part of GNU CC.
6:
7: GNU CC is free software; you can redistribute it and/or modify
8: it under the terms of the GNU General Public License as published by
9: the Free Software Foundation; either version 2, or (at your option)
10: any later version.
11:
12: GNU CC is distributed in the hope that it will be useful,
13: but WITHOUT ANY WARRANTY; without even the implied warranty of
14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: GNU General Public License for more details.
16:
17: You should have received a copy of the GNU General Public License
18: along with GNU CC; see the file COPYING. If not, write to
19: the 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:
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. */
63: static tree
64: build_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. */
80: static tree
81: convert_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 */
109: static tree
110: cp_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:
189: if (INTEGRAL_CODE_P (form))
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). */
211: static tree
212: convert_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. */
281: static tree
282: build_up_reference (type, arg, flags, checkconst)
283: tree type, arg;
284: int flags, checkconst;
285: {
286: tree rval, targ;
287: int literal_flag = 0;
288: tree argtype = TREE_TYPE (arg);
289: tree target_type = TREE_TYPE (type);
290: tree binfo = NULL_TREE;
291:
292: my_friendly_assert (TREE_CODE (type) == REFERENCE_TYPE, 187);
293: if ((flags & LOOKUP_PROTECT)
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);
299: if (binfo == error_mark_node)
300: return error_mark_node;
301: if (binfo == NULL_TREE)
302: return error_not_base_type (target_type, argtype);
303: }
304:
305: /* Pass along const and volatile down into the type. */
306: if (TYPE_READONLY (type) || TYPE_VOLATILE (type))
307: target_type = cp_build_type_variant (target_type, TYPE_READONLY (type),
308: TYPE_VOLATILE (type));
309: targ = arg;
310: if (TREE_CODE (targ) == SAVE_EXPR)
311: targ = TREE_OPERAND (targ, 0);
312:
313: switch (TREE_CODE (targ))
314: {
315: case INDIRECT_REF:
316: /* This is a call to a constructor which did not know what it was
317: initializing until now: it needs to initialize a temporary. */
318: if (TREE_HAS_CONSTRUCTOR (targ))
319: {
320: tree temp = build_cplus_new (argtype, TREE_OPERAND (targ, 0), 1);
321: TREE_HAS_CONSTRUCTOR (targ) = 0;
322: return build_up_reference (type, temp, flags, 1);
323: }
324: /* Let &* cancel out to simplify resulting code.
325: Also, throw away intervening NOP_EXPRs. */
326: arg = TREE_OPERAND (targ, 0);
327: if (TREE_CODE (arg) == NOP_EXPR || TREE_CODE (arg) == NON_LVALUE_EXPR
328: || (TREE_CODE (arg) == CONVERT_EXPR && TREE_REFERENCE_EXPR (arg)))
329: arg = TREE_OPERAND (arg, 0);
330:
331: /* in doing a &*, we have to get rid of the const'ness on the pointer
332: value. Haven't thought about volatile here. Pointers come to mind
333: here. */
334: if (TREE_READONLY (arg))
335: {
336: arg = copy_node (arg);
337: TREE_READONLY (arg) = 0;
338: }
339:
340: rval = build1 (CONVERT_EXPR, type, arg);
341: TREE_REFERENCE_EXPR (rval) = 1;
342:
343: /* propagate the const flag on something like:
344:
345: class Base {
346: public:
347: int foo;
348: };
349:
350: class Derived : public Base {
351: public:
352: int bar;
353: };
354:
355: void func(Base&);
356:
357: void func2(const Derived& d) {
358: func(d);
359: }
360:
361: on the d parameter. The below could have been avoided, if the flags
362: were down in the tree, not sure why they are not. (mrs) */
363: /* The below code may have to be propagated to other parts of this
364: switch. */
365: if (TREE_READONLY (targ) && !TREE_READONLY (arg)
366: && (TREE_CODE (arg) == PARM_DECL || TREE_CODE (arg) == VAR_DECL)
367: && TREE_CODE (TREE_TYPE (arg)) == REFERENCE_TYPE
368: && (TYPE_READONLY (target_type) && checkconst))
369: {
370: arg = copy_node (arg);
371: TREE_READONLY (arg) = TREE_READONLY (targ);
372: }
373: literal_flag = TREE_CONSTANT (arg);
374:
375: goto done;
376:
377: /* Get this out of a register if we happened to be in one by accident.
378: Also, build up references to non-lvalues it we must. */
379: /* For &x[y], return (&) x+y */
380: case ARRAY_REF:
381: if (mark_addressable (TREE_OPERAND (targ, 0)) == 0)
382: return error_mark_node;
383: rval = build_binary_op (PLUS_EXPR, TREE_OPERAND (targ, 0),
384: TREE_OPERAND (targ, 1), 1);
385: TREE_TYPE (rval) = type;
386: if (TREE_CONSTANT (TREE_OPERAND (targ, 1))
387: && staticp (TREE_OPERAND (targ, 0)))
388: TREE_CONSTANT (rval) = 1;
389: goto done;
390:
391: case SCOPE_REF:
392: /* Could be a reference to a static member. */
393: {
394: tree field = TREE_OPERAND (targ, 1);
395: if (TREE_STATIC (field))
396: {
397: rval = build1 (ADDR_EXPR, type, field);
398: literal_flag = 1;
399: goto done;
400: }
401: }
402:
403: /* We should have farmed out member pointers above. */
404: my_friendly_abort (188);
405:
406: case COMPONENT_REF:
407: rval = build_component_addr (targ, build_pointer_type (argtype),
408: "attempt to make a reference to bit-field structure member `%s'");
409: TREE_TYPE (rval) = type;
410: literal_flag = staticp (TREE_OPERAND (targ, 0));
411:
412: goto done;
413:
414: /* Anything not already handled and not a true memory reference
415: needs to have a reference built up. Do so silently for
416: things like integers and return values from function,
417: but complain if we need a reference to something declared
418: as `register'. */
419:
420: case RESULT_DECL:
421: if (staticp (targ))
422: literal_flag = 1;
423: TREE_ADDRESSABLE (targ) = 1;
424: put_var_into_stack (targ);
425: break;
426:
427: case PARM_DECL:
428: #if 0
429: if (targ == current_class_decl)
430: {
431: error ("address of `this' not available");
432: /* #if 0 */
433: /* This code makes the following core dump the compiler on a sun4,
434: if the code below is used.
435:
436: class e_decl;
437: class a_decl;
438: typedef a_decl* a_ref;
439:
440: class a_s {
441: public:
442: a_s();
443: void* append(a_ref& item);
444: };
445: class a_decl {
446: public:
447: a_decl (e_decl *parent);
448: a_s generic_s;
449: a_s decls;
450: e_decl* parent;
451: };
452:
453: class e_decl {
454: public:
455: e_decl();
456: a_s implementations;
457: };
458:
459: void foobar(void *);
460:
461: a_decl::a_decl(e_decl *parent) {
462: parent->implementations.append(this);
463: }
464: */
465:
466: TREE_ADDRESSABLE (targ) = 1; /* so compiler doesn't die later */
467: put_var_into_stack (targ);
468: break;
469: /* #else */
470: return error_mark_node;
471: /* #endif */
472: }
473: #endif
474: /* Fall through. */
475: case VAR_DECL:
476: case CONST_DECL:
477: if (DECL_REGISTER (targ) && !TREE_ADDRESSABLE (targ)
478: && !DECL_ARTIFICIAL (targ))
479: cp_warning ("address needed to build reference for `%D', which is declared `register'",
480: targ);
481: else if (staticp (targ))
482: literal_flag = 1;
483:
484: TREE_ADDRESSABLE (targ) = 1;
485: put_var_into_stack (targ);
486: break;
487:
488: case COMPOUND_EXPR:
489: {
490: tree real_reference = build_up_reference (type, TREE_OPERAND (targ, 1),
491: LOOKUP_PROTECT, checkconst);
492: rval = build (COMPOUND_EXPR, type, TREE_OPERAND (targ, 0), real_reference);
493: TREE_CONSTANT (rval) = staticp (TREE_OPERAND (targ, 1));
494: return rval;
495: }
496:
497: case PREINCREMENT_EXPR:
498: case PREDECREMENT_EXPR:
499: case MODIFY_EXPR:
500: case INIT_EXPR:
501: {
502: tree real_reference = build_up_reference (type, TREE_OPERAND (targ, 0),
503: LOOKUP_PROTECT, checkconst);
504: rval = build (COMPOUND_EXPR, type, arg, real_reference);
505: TREE_CONSTANT (rval) = staticp (TREE_OPERAND (targ, 0));
506: return rval;
507: }
508:
509: case COND_EXPR:
510: return build (COND_EXPR, type,
511: TREE_OPERAND (targ, 0),
512: build_up_reference (type, TREE_OPERAND (targ, 1),
513: LOOKUP_PROTECT, checkconst),
514: build_up_reference (type, TREE_OPERAND (targ, 2),
515: LOOKUP_PROTECT, checkconst));
516:
517: case WITH_CLEANUP_EXPR:
518: return build (WITH_CLEANUP_EXPR, type,
519: build_up_reference (type, TREE_OPERAND (targ, 0),
520: LOOKUP_PROTECT, checkconst),
521: 0, TREE_OPERAND (targ, 2));
522:
523: case BIND_EXPR:
524: arg = TREE_OPERAND (targ, 1);
525: if (arg == NULL_TREE)
526: {
527: compiler_error ("({ ... }) expression not expanded when needed for reference");
528: return error_mark_node;
529: }
530: rval = build1 (ADDR_EXPR, type, arg);
531: TREE_REFERENCE_EXPR (rval) = 1;
532: return rval;
533:
534: default:
535: break;
536: }
537:
538: if (TREE_ADDRESSABLE (targ) == 0)
539: {
540: tree temp;
541:
542: if (TREE_CODE (targ) == CALL_EXPR && IS_AGGR_TYPE (argtype))
543: {
544: temp = build_cplus_new (argtype, targ, 1);
545: if (TREE_CODE (temp) == WITH_CLEANUP_EXPR)
546: rval = build (WITH_CLEANUP_EXPR, type,
547: build1 (ADDR_EXPR, type, TREE_OPERAND (temp, 0)),
548: 0, TREE_OPERAND (temp, 2));
549: else
550: rval = build1 (ADDR_EXPR, type, temp);
551: goto done;
552: }
553: else
554: {
555: temp = get_temp_name (argtype, 0);
556: if (global_bindings_p ())
557: {
558: /* Give this new temp some rtl and initialize it. */
559: DECL_INITIAL (temp) = targ;
560: TREE_STATIC (temp) = 1;
561: finish_decl (temp, targ, NULL_TREE, 0);
562: /* Do this after declaring it static. */
563: rval = build_unary_op (ADDR_EXPR, temp, 0);
564: TREE_TYPE (rval) = type;
565: literal_flag = TREE_CONSTANT (rval);
566: goto done;
567: }
568: else
569: {
570: rval = build_unary_op (ADDR_EXPR, temp, 0);
571: if (binfo && !BINFO_OFFSET_ZEROP (binfo))
572: rval = convert_pointer_to (target_type, rval);
573: else
574: TREE_TYPE (rval) = type;
575:
576: temp = build (MODIFY_EXPR, argtype, temp, arg);
577: TREE_SIDE_EFFECTS (temp) = 1;
578: return build (COMPOUND_EXPR, type, temp, rval);
579: }
580: }
581: }
582: else
583: rval = build1 (ADDR_EXPR, type, arg);
584:
585: done:
586: if (TYPE_USES_COMPLEX_INHERITANCE (argtype)
587: || TYPE_USES_COMPLEX_INHERITANCE (target_type))
588: {
589: TREE_TYPE (rval) = build_pointer_type (argtype);
590: if (flags & LOOKUP_PROTECT)
591: rval = convert_pointer_to (target_type, rval);
592: else
593: rval
594: = convert_to_pointer_force (build_pointer_type (target_type), rval);
595: TREE_TYPE (rval) = type;
596: }
597: TREE_CONSTANT (rval) = literal_flag;
598: return rval;
599: }
600:
601: /* For C++: Only need to do one-level references, but cannot
602: get tripped up on signed/unsigned differences.
603:
604: DECL is either NULL_TREE or the _DECL node for a reference that is being
605: initialized. It can be error_mark_node if we don't know the _DECL but
606: we know it's an initialization. */
607:
608: tree cp_convert PROTO((tree, tree, int, int));
609:
610: tree
611: convert_to_reference (reftype, expr, convtype, flags, decl)
612: tree reftype, expr;
613: int convtype, flags;
614: tree decl;
615: {
616: register tree type = TYPE_MAIN_VARIANT (TREE_TYPE (reftype));
617: register tree intype = TREE_TYPE (expr);
618: register enum tree_code form = TREE_CODE (intype);
619: tree rval = NULL_TREE;
620:
621: if (form == REFERENCE_TYPE)
622: intype = TREE_TYPE (intype);
623: intype = TYPE_MAIN_VARIANT (intype);
624:
625: if (((convtype & CONV_STATIC) && comptypes (type, intype, -1))
626: || ((convtype & CONV_IMPLICIT) && comptypes (type, intype, 0)))
627: {
628: if (flags & LOOKUP_COMPLAIN)
629: {
630: tree ttl = TREE_TYPE (reftype);
631: tree ttr;
632:
633: if (form == REFERENCE_TYPE)
634: ttr = TREE_TYPE (TREE_TYPE (expr));
635: else
636: {
637: int r = TREE_READONLY (expr);
638: int v = TREE_THIS_VOLATILE (expr);
639: ttr = cp_build_type_variant (TREE_TYPE (expr), r, v);
640: }
641:
642: if (! lvalue_p (expr) &&
643: (decl == NULL_TREE || ! TYPE_READONLY (ttl)))
644: {
645: if (decl)
646: /* Ensure semantics of [dcl.init.ref] */
647: cp_pedwarn ("initialization of non-const `%T' from rvalue `%T'",
648: reftype, intype);
649: else
650: cp_pedwarn ("conversion to `%T' from rvalue `%T'",
651: reftype, intype);
652: }
653: else if (! (convtype & CONV_CONST))
654: {
655: if (! TYPE_READONLY (ttl) && TYPE_READONLY (ttr))
656: cp_pedwarn ("conversion from `%T' to `%T' discards const",
657: ttr, reftype);
658: else if (! TYPE_VOLATILE (ttl) && TYPE_VOLATILE (ttr))
659: cp_pedwarn ("conversion from `%T' to `%T' discards volatile",
660: ttr, reftype);
661: }
662: }
663:
664: if (form == REFERENCE_TYPE)
665: {
666: tree type = TREE_TYPE (expr);
667: tree tmp = copy_node (expr);
668: TREE_TYPE (tmp) = build_pointer_type (TREE_TYPE (TREE_TYPE (expr)));
669: rval = cp_convert (build_pointer_type (TREE_TYPE (reftype)), tmp,
670: convtype, flags);
671: TREE_TYPE (tmp) = type;
672: TREE_TYPE (rval) = reftype;
673: return rval;
674: }
675:
676: return build_up_reference (reftype, expr, flags,
677: ! (convtype & CONV_CONST));
678: }
679:
680: if ((convtype & CONV_IMPLICIT)
681: && IS_AGGR_TYPE (intype)
682: && ! (flags & LOOKUP_NO_CONVERSION)
683: && (rval = build_type_conversion (CONVERT_EXPR, reftype, expr, 1)))
684: {
685: if (rval == error_mark_node)
686: cp_error ("conversion from `%T' to `%T' is ambiguous",
687: intype, reftype);
688: return rval;
689: }
690: else if ((convtype & CONV_REINTERPRET) && lvalue_p (expr))
691: {
692: /* When casting an lvalue to a reference type, just convert into
693: a pointer to the new type and deference it. This is allowed
694: by San Diego WP section 5.2.9 paragraph 12, though perhaps it
695: should be done directly (jason). (int &)ri ---> *(int*)&ri */
696:
697: /* B* bp; A& ar = (A&)bp; is legal, but it's probably not what they
698: meant. */
699: if (form == POINTER_TYPE
700: && (comptypes (TREE_TYPE (intype), type, -1)))
701: cp_warning ("casting `%T' to `%T' does not dereference pointer",
702: intype, reftype);
703:
704: rval = build_unary_op (ADDR_EXPR, expr, 0);
705: if (rval != error_mark_node)
706: rval = convert_force (build_pointer_type (TREE_TYPE (reftype)), rval);
707: if (rval != error_mark_node)
708: rval = build1 (NOP_EXPR, reftype, rval);
709: }
710: else if (decl)
711: {
712: tree rval_as_conversion = NULL_TREE;
713: tree rval_as_ctor = NULL_TREE;
714:
715: if (IS_AGGR_TYPE (intype)
716: && (rval = build_type_conversion (CONVERT_EXPR, type, expr, 1)))
717: {
718: if (rval == error_mark_node)
719: return rval;
720:
721: rval_as_conversion = build_up_reference (reftype, rval, flags, 1);
722: }
723:
724: /* Definitely need to go through a constructor here. */
725: if (TYPE_HAS_CONSTRUCTOR (type)
726: && ! CLASSTYPE_ABSTRACT_VIRTUALS (type)
727: && (rval = build_method_call
728: (NULL_TREE, constructor_name_full (type),
729: build_tree_list (NULL_TREE, expr), TYPE_BINFO (type),
730: LOOKUP_NO_CONVERSION|LOOKUP_SPECULATIVELY)))
731: {
732: tree init;
733:
734: if (global_bindings_p ())
735: {
736: extern tree static_aggregates;
737: tree t = get_temp_name (type, global_bindings_p ());
738: init = build_method_call (t, constructor_name_full (type),
739: build_tree_list (NULL_TREE, expr),
740: TYPE_BINFO (type),
741: LOOKUP_NORMAL|LOOKUP_NO_CONVERSION);
742:
743: if (init == error_mark_node)
744: return error_mark_node;
745:
746: make_decl_rtl (t, NULL_PTR, 1);
747: static_aggregates = perm_tree_cons (expr, t, static_aggregates);
748: rval = build_unary_op (ADDR_EXPR, t, 0);
749: }
750: else
751: {
752: init = build_method_call (NULL_TREE, constructor_name_full (type),
753: build_tree_list (NULL_TREE, expr),
754: TYPE_BINFO (type),
755: LOOKUP_NORMAL|LOOKUP_NO_CONVERSION);
756:
757: if (init == error_mark_node)
758: return error_mark_node;
759:
760: rval = build_cplus_new (type, init, 1);
761: rval = build_up_reference (reftype, rval, flags, 1);
762: }
763: rval_as_ctor = rval;
764: }
765:
766: if (rval_as_ctor && rval_as_conversion)
767: {
768: cp_error ("ambiguous conversion from `%T' to `%T'; both user-defined conversion and constructor apply",
769: intype, reftype);
770: return error_mark_node;
771: }
772: else if (rval_as_ctor)
773: rval = rval_as_ctor;
774: else if (rval_as_conversion)
775: rval = rval_as_conversion;
776: else if (! IS_AGGR_TYPE (type) && ! IS_AGGR_TYPE (intype))
777: {
778: rval = convert (type, expr);
779: if (rval == error_mark_node)
780: return error_mark_node;
781:
782: rval = build_up_reference (reftype, rval, flags, 1);
783: }
784:
785: if (rval && ! TYPE_READONLY (TREE_TYPE (reftype)))
786: cp_pedwarn ("initializing non-const `%T' with `%T' will use a temporary",
787: reftype, intype);
788: }
789:
790: if (rval)
791: {
792: /* If we found a way to convert earlier, then use it. */
793: return rval;
794: }
795:
796: my_friendly_assert (form != OFFSET_TYPE, 189);
797:
798: if (flags & LOOKUP_SPECULATIVELY)
799: return NULL_TREE;
800:
801: else if (flags & LOOKUP_COMPLAIN)
802: cp_error ("cannot convert type `%T' to type `%T'", intype, reftype);
803:
804: return error_mark_node;
805: }
806:
807: /* We are using a reference VAL for its value. Bash that reference all the
808: way down to its lowest form. */
809: tree
810: convert_from_reference (val)
811: tree val;
812: {
813: tree type = TREE_TYPE (val);
814:
815: if (TREE_CODE (type) == OFFSET_TYPE)
816: type = TREE_TYPE (type);
817: if (TREE_CODE (type) == REFERENCE_TYPE)
818: {
819: tree target_type = TREE_TYPE (type);
820: tree nval;
821:
822: /* This can happen if we cast to a reference type. */
823: if (TREE_CODE (val) == ADDR_EXPR)
824: {
825: nval = build1 (NOP_EXPR, build_pointer_type (target_type), val);
826: nval = build_indirect_ref (nval, NULL_PTR);
827: /* The below was missing, are other important flags missing too? */
828: TREE_SIDE_EFFECTS (nval) = TREE_SIDE_EFFECTS (val);
829: return nval;
830: }
831:
832: nval = build1 (INDIRECT_REF, target_type, val);
833:
834: TREE_THIS_VOLATILE (nval) = TYPE_VOLATILE (target_type);
835: TREE_SIDE_EFFECTS (nval) = TYPE_VOLATILE (target_type);
836: TREE_READONLY (nval) = TYPE_READONLY (target_type);
837: /* The below was missing, are other important flags missing too? */
838: TREE_SIDE_EFFECTS (nval) |= TREE_SIDE_EFFECTS (val);
839: return nval;
840: }
841: return val;
842: }
843:
844: /* See if there is a constructor of type TYPE which will convert
845: EXPR. The reference manual seems to suggest (8.5.6) that we need
846: not worry about finding constructors for base classes, then converting
847: to the derived class.
848:
849: MSGP is a pointer to a message that would be an appropriate error
850: string. If MSGP is NULL, then we are not interested in reporting
851: errors. */
852: tree
853: convert_to_aggr (type, expr, msgp, protect)
854: tree type, expr;
855: char **msgp;
856: int protect;
857: {
858: tree basetype = type;
859: tree name = TYPE_IDENTIFIER (basetype);
860: tree function, fndecl, fntype, parmtypes, parmlist, result;
861: tree method_name;
862: enum access_type access;
863: int can_be_private, can_be_protected;
864:
865: if (! TYPE_HAS_CONSTRUCTOR (basetype))
866: {
867: if (msgp)
868: *msgp = "type `%s' does not have a constructor";
869: return error_mark_node;
870: }
871:
872: access = access_public;
873: can_be_private = 0;
874: can_be_protected = IDENTIFIER_CLASS_VALUE (name) || name == current_class_name;
875:
876: parmlist = build_tree_list (NULL_TREE, expr);
877: parmtypes = tree_cons (NULL_TREE, TREE_TYPE (expr), void_list_node);
878:
879: if (TYPE_USES_VIRTUAL_BASECLASSES (basetype))
880: {
881: parmtypes = tree_cons (NULL_TREE, integer_type_node, parmtypes);
882: parmlist = tree_cons (NULL_TREE, integer_one_node, parmlist);
883: }
884:
885: /* The type of the first argument will be filled in inside the loop. */
886: parmlist = tree_cons (NULL_TREE, integer_zero_node, parmlist);
887: parmtypes = tree_cons (NULL_TREE, TYPE_POINTER_TO (basetype), parmtypes);
888:
889: method_name = build_decl_overload (name, parmtypes, 1);
890:
891: /* constructors are up front. */
892: fndecl = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (basetype), 0);
893: if (TYPE_HAS_DESTRUCTOR (basetype))
894: fndecl = DECL_CHAIN (fndecl);
895:
896: while (fndecl)
897: {
898: if (DECL_ASSEMBLER_NAME (fndecl) == method_name)
899: {
900: function = fndecl;
901: if (protect)
902: {
903: if (TREE_PRIVATE (fndecl))
904: {
905: can_be_private =
906: (basetype == current_class_type
907: || is_friend (basetype, current_function_decl)
908: || purpose_member (basetype, DECL_ACCESS (fndecl)));
909: if (! can_be_private)
910: goto found;
911: }
912: else if (TREE_PROTECTED (fndecl))
913: {
914: if (! can_be_protected)
915: goto found;
916: }
917: }
918: goto found_and_ok;
919: }
920: fndecl = DECL_CHAIN (fndecl);
921: }
922:
923: /* No exact conversion was found. See if an approximate
924: one will do. */
925: fndecl = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (basetype), 0);
926: if (TYPE_HAS_DESTRUCTOR (basetype))
927: fndecl = DECL_CHAIN (fndecl);
928:
929: {
930: int saw_private = 0;
931: int saw_protected = 0;
932: struct candidate *candidates =
933: (struct candidate *) alloca ((decl_list_length (fndecl)+1) * sizeof (struct candidate));
934: struct candidate *cp = candidates;
935:
936: while (fndecl)
937: {
938: function = fndecl;
939: cp->h_len = 2;
940: cp->harshness = (struct harshness_code *)
941: alloca (3 * sizeof (struct harshness_code));
942:
943: compute_conversion_costs (fndecl, parmlist, cp, 2);
944: if ((cp->h.code & EVIL_CODE) == 0)
945: {
946: cp->u.field = fndecl;
947: if (protect)
948: {
949: if (TREE_PRIVATE (fndecl))
950: access = access_private;
951: else if (TREE_PROTECTED (fndecl))
952: access = access_protected;
953: else
954: access = access_public;
955: }
956: else
957: access = access_public;
958:
959: if (access == access_private
960: ? (basetype == current_class_type
961: || is_friend (basetype, cp->function)
962: || purpose_member (basetype, DECL_ACCESS (fndecl)))
963: : access == access_protected
964: ? (can_be_protected
965: || purpose_member (basetype, DECL_ACCESS (fndecl)))
966: : 1)
967: {
968: if (cp->h.code <= TRIVIAL_CODE)
969: goto found_and_ok;
970: cp++;
971: }
972: else
973: {
974: if (access == access_private)
975: saw_private = 1;
976: else
977: saw_protected = 1;
978: }
979: }
980: fndecl = DECL_CHAIN (fndecl);
981: }
982: if (cp - candidates)
983: {
984: /* Rank from worst to best. Then cp will point to best one.
985: Private fields have their bits flipped. For unsigned
986: numbers, this should make them look very large.
987: If the best alternate has a (signed) negative value,
988: then all we ever saw were private members. */
989: if (cp - candidates > 1)
990: qsort (candidates, /* char *base */
991: cp - candidates, /* int nel */
992: sizeof (struct candidate), /* int width */
993: rank_for_overload); /* int (*compar)() */
994:
995: --cp;
996: if (cp->h.code & EVIL_CODE)
997: {
998: if (msgp)
999: *msgp = "ambiguous type conversion possible for `%s'";
1000: return error_mark_node;
1001: }
1002:
1003: function = cp->function;
1004: fndecl = cp->u.field;
1005: goto found_and_ok;
1006: }
1007: else if (msgp)
1008: {
1009: if (saw_private)
1010: if (saw_protected)
1011: *msgp = "only private and protected conversions apply";
1012: else
1013: *msgp = "only private conversions apply";
1014: else if (saw_protected)
1015: *msgp = "only protected conversions apply";
1016: else
1017: *msgp = "no appropriate conversion to type `%s'";
1018: }
1019: return error_mark_node;
1020: }
1021: /* NOTREACHED */
1022:
1023: found:
1024: if (access == access_private)
1025: if (! can_be_private)
1026: {
1027: if (msgp)
1028: *msgp = TREE_PRIVATE (fndecl)
1029: ? "conversion to type `%s' is private"
1030: : "conversion to type `%s' is from private base class";
1031: return error_mark_node;
1032: }
1033: if (access == access_protected)
1034: if (! can_be_protected)
1035: {
1036: if (msgp)
1037: *msgp = TREE_PRIVATE (fndecl)
1038: ? "conversion to type `%s' is protected"
1039: : "conversion to type `%s' is from protected base class";
1040: return error_mark_node;
1041: }
1042: function = fndecl;
1043: found_and_ok:
1044:
1045: /* It will convert, but we don't do anything about it yet. */
1046: if (msgp == 0)
1047: return NULL_TREE;
1048:
1049: fntype = TREE_TYPE (function);
1050: if (DECL_INLINE (function) && TREE_CODE (function) == FUNCTION_DECL)
1051: function = build1 (ADDR_EXPR, build_pointer_type (fntype), function);
1052: else
1053: function = default_conversion (function);
1054:
1055: result = build_nt (CALL_EXPR, function,
1056: convert_arguments (NULL_TREE, TYPE_ARG_TYPES (fntype),
1057: parmlist, NULL_TREE, LOOKUP_NORMAL),
1058: NULL_TREE);
1059: TREE_TYPE (result) = TREE_TYPE (fntype);
1060: TREE_SIDE_EFFECTS (result) = 1;
1061: TREE_RAISES (result) = !! TYPE_RAISES_EXCEPTIONS (fntype);
1062: return result;
1063: }
1064:
1065: /* Call this when we know (for any reason) that expr is not, in fact,
1066: zero. This routine is like convert_pointer_to, but it pays
1067: attention to which specific instance of what type we want to
1068: convert to. This routine should eventually become
1069: convert_to_pointer after all references to convert_to_pointer
1070: are removed. */
1071: tree
1072: convert_pointer_to_real (binfo, expr)
1073: tree binfo, expr;
1074: {
1075: register tree intype = TREE_TYPE (expr);
1076: tree ptr_type;
1077: tree type, rval;
1078:
1079: if (TREE_CODE (binfo) == TREE_VEC)
1080: type = BINFO_TYPE (binfo);
1081: else if (IS_AGGR_TYPE (binfo))
1082: {
1083: type = binfo;
1084: }
1085: else
1086: {
1087: type = binfo;
1088: binfo = NULL_TREE;
1089: }
1090:
1091: ptr_type = build_pointer_type (type);
1092: if (ptr_type == TYPE_MAIN_VARIANT (intype))
1093: return expr;
1094:
1095: if (intype == error_mark_node)
1096: return error_mark_node;
1097:
1098: my_friendly_assert (!integer_zerop (expr), 191);
1099:
1100: if (TREE_CODE (type) == RECORD_TYPE
1101: && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE
1102: && type != TYPE_MAIN_VARIANT (TREE_TYPE (intype)))
1103: {
1104: tree path;
1105: int distance
1106: = get_base_distance (binfo, TYPE_MAIN_VARIANT (TREE_TYPE (intype)),
1107: 0, &path);
1108:
1109: /* This function shouldn't be called with unqualified arguments
1110: but if it is, give them an error message that they can read. */
1111: if (distance < 0)
1112: {
1113: cp_error ("cannot convert a pointer of type `%T' to a pointer of type `%T'",
1114: TREE_TYPE (intype), type);
1115:
1116: if (distance == -2)
1117: cp_error ("because `%T' is an ambiguous base class", type);
1118: return error_mark_node;
1119: }
1120:
1121: return build_vbase_path (PLUS_EXPR, ptr_type, expr, path, 1);
1122: }
1123: rval = build1 (NOP_EXPR, ptr_type,
1124: TREE_CODE (expr) == NOP_EXPR ? TREE_OPERAND (expr, 0) : expr);
1125: TREE_CONSTANT (rval) = TREE_CONSTANT (expr);
1126: return rval;
1127: }
1128:
1129: /* Call this when we know (for any reason) that expr is
1130: not, in fact, zero. This routine gets a type out of the first
1131: argument and uses it to search for the type to convert to. If there
1132: is more than one instance of that type in the expr, the conversion is
1133: ambiguous. This routine should eventually go away, and all
1134: callers should use convert_to_pointer_real. */
1135: tree
1136: convert_pointer_to (binfo, expr)
1137: tree binfo, expr;
1138: {
1139: tree type;
1140:
1141: if (TREE_CODE (binfo) == TREE_VEC)
1142: type = BINFO_TYPE (binfo);
1143: else if (IS_AGGR_TYPE (binfo))
1144: type = binfo;
1145: else
1146: type = binfo;
1147: return convert_pointer_to_real (type, expr);
1148: }
1149:
1150: /* Same as above, but don't abort if we get an "ambiguous" baseclass.
1151: There's only one virtual baseclass we are looking for, and once
1152: we find one such virtual baseclass, we have found them all. */
1153:
1154: tree
1155: convert_pointer_to_vbase (binfo, expr)
1156: tree binfo;
1157: tree expr;
1158: {
1159: tree intype = TREE_TYPE (TREE_TYPE (expr));
1160: tree binfos = TYPE_BINFO_BASETYPES (intype);
1161: int i;
1162:
1163: for (i = TREE_VEC_LENGTH (binfos)-1; i >= 0; i--)
1164: {
1165: tree basetype = BINFO_TYPE (TREE_VEC_ELT (binfos, i));
1166: if (BINFO_TYPE (binfo) == basetype)
1167: return convert_pointer_to (binfo, expr);
1168: if (binfo_member (BINFO_TYPE (binfo), CLASSTYPE_VBASECLASSES (basetype)))
1169: return convert_pointer_to_vbase (binfo, convert_pointer_to (basetype, expr));
1170: }
1171: my_friendly_abort (6);
1172: /* NOTREACHED */
1173: return NULL_TREE;
1174: }
1175:
1176: tree
1177: cp_convert (type, expr, convtype, flags)
1178: tree type, expr;
1179: int convtype, flags;
1180: {
1181: register tree e = expr;
1182: register enum tree_code code = TREE_CODE (type);
1183:
1184: if (type == TREE_TYPE (e)
1185: || TREE_CODE (e) == ERROR_MARK)
1186: return e;
1187: if (TREE_CODE (TREE_TYPE (e)) == ERROR_MARK)
1188: return error_mark_node;
1189:
1190: /* Trivial conversion: cv-qualifiers do not matter on rvalues. */
1191: if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (TREE_TYPE (e)))
1192: return fold (build1 (NOP_EXPR, type, e));
1193:
1194: if (code == VOID_TYPE && (convtype & CONV_STATIC))
1195: return build1 (CONVERT_EXPR, type, e);
1196:
1197: #if 0
1198: /* This is incorrect. A truncation can't be stripped this way.
1199: Extensions will be stripped by the use of get_unwidened. */
1200: if (TREE_CODE (e) == NOP_EXPR)
1201: return convert (type, TREE_OPERAND (e, 0));
1202: #endif
1203:
1204: /* Just convert to the type of the member. */
1205: if (code == OFFSET_TYPE)
1206: {
1207: type = TREE_TYPE (type);
1208: code = TREE_CODE (type);
1209: }
1210:
1211: if (code == REFERENCE_TYPE)
1212: return fold (convert_to_reference (type, e, convtype, flags, NULL_TREE));
1213: else if (TREE_CODE (TREE_TYPE (e)) == REFERENCE_TYPE)
1214: e = convert_from_reference (e);
1215:
1216: if (TREE_CODE (e) == OFFSET_REF)
1217: e = resolve_offset_ref (e);
1218:
1219: if (TREE_READONLY_DECL_P (e))
1220: e = decl_constant_value (e);
1221:
1222: if (INTEGRAL_CODE_P (code))
1223: {
1224: tree intype = TREE_TYPE (e);
1225: enum tree_code form = TREE_CODE (intype);
1226: /* enum = enum, enum = int, enum = float are all errors. */
1227: if (flag_int_enum_equivalence == 0
1228: && TREE_CODE (type) == ENUMERAL_TYPE
1229: && ARITHMETIC_TYPE_P (intype))
1230: {
1231: cp_pedwarn ("conversion from `%#T' to `%#T'", intype, type);
1232:
1233: if (flag_pedantic_errors)
1234: return error_mark_node;
1235: }
1236: if (IS_AGGR_TYPE (intype))
1237: {
1238: tree rval;
1239: rval = build_type_conversion (CONVERT_EXPR, type, e, 1);
1240: if (rval)
1241: return rval;
1242: cp_error ("`%#T' used where a `%T' was expected", intype, type);
1243: return error_mark_node;
1244: }
1245: if (code == BOOLEAN_TYPE)
1246: {
1247: tree newe = truthvalue_conversion (e);
1248: /* Avoid stupid (infinite) recursion from backend. */
1249: if (TREE_CODE (newe) != NOP_EXPR || e != TREE_OPERAND (newe, 0))
1250: e = newe;
1251: if (TREE_TYPE (e) == bool_type_node)
1252: return e;
1253: else if (TREE_CODE (e) == INTEGER_CST)
1254: {
1255: if (e == integer_zero_node)
1256: e = false_node;
1257: else
1258: e = true_node;
1259: }
1260: else
1261: return build1 (NOP_EXPR, bool_type_node, e);
1262: }
1263: return fold (convert_to_integer (type, e));
1264: }
1265: if (code == POINTER_TYPE)
1266: return fold (cp_convert_to_pointer (type, e));
1267: if (code == REAL_TYPE)
1268: {
1269: if (IS_AGGR_TYPE (TREE_TYPE (e)))
1270: {
1271: tree rval;
1272: rval = build_type_conversion (CONVERT_EXPR, type, e, 1);
1273: if (rval)
1274: return rval;
1275: else
1276: cp_error ("`%#T' used where a floating point value was expected",
1277: TREE_TYPE (e));
1278: }
1279: return fold (convert_to_real (type, e));
1280: }
1281:
1282: /* New C++ semantics: since assignment is now based on
1283: memberwise copying, if the rhs type is derived from the
1284: lhs type, then we may still do a conversion. */
1285: if (IS_AGGR_TYPE_CODE (code))
1286: {
1287: tree dtype = TREE_TYPE (e);
1288: tree ctor = NULL_TREE;
1289: tree conversion = NULL_TREE;
1290:
1291: dtype = TYPE_MAIN_VARIANT (dtype);
1292:
1293: /* Conversion of object pointers or signature pointers/references
1294: to signature pointers/references. */
1295:
1296: if (TYPE_LANG_SPECIFIC (type)
1297: && (IS_SIGNATURE_POINTER (type) || IS_SIGNATURE_REFERENCE (type)))
1298: {
1299: tree constructor = build_signature_pointer_constructor (type, expr);
1300: tree sig_ty = SIGNATURE_TYPE (type);
1301: tree sig_ptr;
1302:
1303: if (constructor == error_mark_node)
1304: return error_mark_node;
1305:
1306: sig_ptr = get_temp_name (type, 1);
1307: DECL_INITIAL (sig_ptr) = constructor;
1308: CLEAR_SIGNATURE (sig_ty);
1309: finish_decl (sig_ptr, constructor, 0, 0);
1310: SET_SIGNATURE (sig_ty);
1311: TREE_READONLY (sig_ptr) = 1;
1312:
1313: return sig_ptr;
1314: }
1315:
1316: /* Conversion between aggregate types. New C++ semantics allow
1317: objects of derived type to be cast to objects of base type.
1318: Old semantics only allowed this between pointers.
1319:
1320: There may be some ambiguity between using a constructor
1321: vs. using a type conversion operator when both apply. */
1322:
1323: if (IS_AGGR_TYPE (dtype) && ! DERIVED_FROM_P (type, dtype)
1324: && TYPE_HAS_CONVERSION (dtype))
1325: conversion = build_type_conversion (CONVERT_EXPR, type, e, 1);
1326:
1327: if (conversion == error_mark_node)
1328: {
1329: error ("ambiguous pointer conversion");
1330: return conversion;
1331: }
1332:
1333: if (TYPE_HAS_CONSTRUCTOR (type))
1334: ctor = build_method_call (NULL_TREE, constructor_name_full (type),
1335: build_tree_list (NULL_TREE, e),
1336: TYPE_BINFO (type),
1337: LOOKUP_NORMAL | LOOKUP_SPECULATIVELY
1338: | (conversion ? LOOKUP_NO_CONVERSION : 0));
1339:
1340: if (ctor == error_mark_node)
1341: {
1342: cp_error ("in conversion to type `%T'", type);
1343: return error_mark_node;
1344: }
1345:
1346: if (conversion && ctor)
1347: {
1348: error ("both constructor and type conversion operator apply");
1349: return error_mark_node;
1350: }
1351: else if (conversion)
1352: return conversion;
1353: else if (ctor)
1354: {
1355: if (current_function_decl)
1356: /* We can't pass 1 to the with_cleanup_p arg here, because that
1357: screws up passing classes by value. */
1358: ctor = build_cplus_new (type, ctor, 0);
1359: else
1360: {
1361: register tree parm = TREE_OPERAND (ctor, 1);
1362:
1363: /* Initializers for static variables and parameters
1364: have to handle doing the initialization and
1365: cleanup themselves. */
1366: my_friendly_assert (TREE_CODE (ctor) == CALL_EXPR, 322);
1367: #if 0
1368: /* The following assertion fails in cases where we
1369: are initializing a static member variable of a
1370: particular instance of a template class with a
1371: call to a constructor of the given instance, as
1372: in:
1373:
1374: TMPL<int> object = TMPL<int>();
1375:
1376: Curiously, the assertion does not fail if we do
1377: the same thing for a static member of a
1378: non-template class, as in:
1379:
1380: T object = T();
1381:
1382: I can't see why we should care here whether or not
1383: the initializer expression involves a call to
1384: `new', so for the time being, it seems best to
1385: just avoid doing this assertion. */
1386: my_friendly_assert (TREE_CALLS_NEW (TREE_VALUE (parm)),
1387: 323);
1388: #endif
1389: TREE_VALUE (parm) = NULL_TREE;
1390: ctor = build_indirect_ref (ctor, NULL_PTR);
1391: TREE_HAS_CONSTRUCTOR (ctor) = 1;
1392: }
1393: return ctor;
1394: }
1395: }
1396:
1397: /* If TYPE or TREE_TYPE (E) is not on the permanent_obstack,
1398: then the it won't be hashed and hence compare as not equal,
1399: even when it is. */
1400: if (code == ARRAY_TYPE
1401: && TREE_TYPE (TREE_TYPE (e)) == TREE_TYPE (type)
1402: && index_type_equal (TYPE_DOMAIN (TREE_TYPE (e)), TYPE_DOMAIN (type)))
1403: return e;
1404:
1405: cp_error ("conversion from `%T' to non-scalar type `%T' requested",
1406: TREE_TYPE (expr), type);
1407: return error_mark_node;
1408: }
1409:
1410: /* Create an expression whose value is that of EXPR,
1411: converted to type TYPE. The TREE_TYPE of the value
1412: is always TYPE. This function implements all reasonable
1413: conversions; callers should filter out those that are
1414: not permitted by the language being compiled. */
1415:
1416: tree
1417: convert (type, expr)
1418: tree type, expr;
1419: {
1420: return cp_convert (type, expr, CONV_OLD_CONVERT, 0);
1421: }
1422:
1423: /* Like convert, except permit conversions to take place which
1424: are not normally allowed due to access restrictions
1425: (such as conversion from sub-type to private super-type). */
1426: tree
1427: convert_force (type, expr)
1428: tree type;
1429: tree expr;
1430: {
1431: register tree e = expr;
1432: register enum tree_code code = TREE_CODE (type);
1433:
1434: if (code == REFERENCE_TYPE)
1435: return fold (convert_to_reference (type, e, CONV_C_CAST, LOOKUP_COMPLAIN,
1436: NULL_TREE));
1437: else if (TREE_CODE (TREE_TYPE (e)) == REFERENCE_TYPE)
1438: e = convert_from_reference (e);
1439:
1440: if (code == POINTER_TYPE)
1441: return fold (convert_to_pointer_force (type, e));
1442:
1443: /* From typeck.c convert_for_assignment */
1444: if (((TREE_CODE (TREE_TYPE (e)) == POINTER_TYPE && TREE_CODE (e) == ADDR_EXPR
1445: && TREE_CODE (TREE_TYPE (e)) == POINTER_TYPE
1446: && TREE_CODE (TREE_TYPE (TREE_TYPE (e))) == METHOD_TYPE)
1447: || integer_zerop (e)
1448: || TYPE_PTRMEMFUNC_P (TREE_TYPE (e)))
1449: && TYPE_PTRMEMFUNC_P (type))
1450: {
1451: /* compatible pointer to member functions. */
1452: return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), e, 1);
1453: }
1454: {
1455: int old_equiv = flag_int_enum_equivalence;
1456: flag_int_enum_equivalence = 1;
1457: e = convert (type, e);
1458: flag_int_enum_equivalence = old_equiv;
1459: }
1460: return e;
1461: }
1462:
1463: /* Subroutine of build_type_conversion. */
1464: static tree
1465: build_type_conversion_1 (xtype, basetype, expr, typename, for_sure)
1466: tree xtype, basetype;
1467: tree expr;
1468: tree typename;
1469: int for_sure;
1470: {
1471: tree rval;
1472: int flags;
1473:
1474: if (for_sure == 0)
1475: flags = LOOKUP_PROTECT;
1476: else
1477: flags = LOOKUP_NORMAL;
1478:
1479: rval = build_method_call (expr, typename, NULL_TREE, NULL_TREE, flags);
1480: if (rval == error_mark_node)
1481: {
1482: if (for_sure == 0)
1483: return NULL_TREE;
1484: return error_mark_node;
1485: }
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'");
1495: return convert (xtype, rval);
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. */
1514: tree
1515: build_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:
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:
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: {
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:
1595: type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
1596: typename = build_typename_overload (type);
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)
1607: flags = LOOKUP_PROTECT;
1608: else
1609: flags = LOOKUP_NORMAL;
1610: rval = build_method_call (expr,
1611: constructor_name_full (typename),
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: }
1619:
1620: return convert (xtype, rval);
1621: }
1622: if (TYPE_BINFO_BASETYPES (basetype))
1623: basetype = TYPE_BINFO_BASETYPE (basetype, 0);
1624: else
1625: break;
1626: }
1627: #endif
1628: /* No free conversions for reference types, right?. */
1629: return NULL_TREE;
1630: }
1631:
1632: if (exact_conversion)
1633: return NULL_TREE;
1634:
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:
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:
1694: if (TREE_CODE (type) == POINTER_TYPE && TYPE_READONLY (TREE_TYPE (type)))
1695: {
1696: /* Try converting to some other const pointer type and then using
1697: standard conversions. */
1698:
1699: while (TYPE_HAS_CONVERSION (basetype))
1700: {
1701: if (CLASSTYPE_CONVERSION (basetype, constptr_conv) != 0)
1702: {
1703: if (CLASSTYPE_CONVERSION (basetype, constptr_conv) == error_mark_node)
1704: return error_mark_node;
1705: typename = DECL_NAME (CLASSTYPE_CONVERSION (basetype, constptr_conv));
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: }
1714: if (TREE_CODE (type) == POINTER_TYPE)
1715: {
1716: /* Try converting to some other pointer type and then using standard
1717: conversions. */
1718:
1719: while (TYPE_HAS_CONVERSION (basetype))
1720: {
1721: if (CLASSTYPE_CONVERSION (basetype, ptr_conv) != 0)
1722: {
1723: if (CLASSTYPE_CONVERSION (basetype, ptr_conv) == error_mark_node)
1724: return error_mark_node;
1725: typename = DECL_NAME (CLASSTYPE_CONVERSION (basetype, ptr_conv));
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: }
1734:
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(). */
1753: if (TYPE_HAS_INT_CONVERSION (basetype))
1754: {
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;
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:
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
1776: && (INTEGRAL_TYPE_P (type) || TREE_CODE (type) == REAL_TYPE))
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
1818: int -> float */
1819:
1820: basetype = save_basetype;
1821: if (TREE_CODE (type) == REAL_TYPE)
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??? */
1854: int
1855: build_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:
1907: if (code == TRUTH_ANDIF_EXPR
1908: || code == TRUTH_ORIF_EXPR)
1909: {
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);
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:
1952: /* Must convert an aggregate type to non-aggregate type.
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??? */
1960: int
1961: build_default_unary_type_conversion (code, arg)
1962: enum tree_code code;
1963: tree *arg;
1964: {
1965: tree type = TREE_TYPE (*arg);
1966:
1967: if (! TYPE_HAS_CONVERSION (type))
1968: {
1969: cp_error ("type conversion required for type `%T'", type);
1970: return 0;
1971: }
1972:
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: }
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: {
1992: cp_error ("default type conversion for type `%T' failed", type);
1993: return 0;
1994: }
1995: return 1;
1996: }
1997:
1998: /* Implements integral promotion (4.1) and float->double promotion. */
1999: tree
2000: type_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);
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)
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: }
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:
2040: return cp_build_type_variant (type, constp, volatilep);
2041: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.