source: trunk/src/gcc/gcc/c-convert.c@ 1392

Last change on this file since 1392 was 1392, checked in by bird, 21 years ago

This commit was generated by cvs2svn to compensate for changes in r1391,
which included commits to RCS files with non-trunk default branches.

  • Property cvs2svn:cvs-rev set to 1.1.1.2
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 4.0 KB
Line 
1/* Language-level data type conversion for GNU C.
2 Copyright (C) 1987, 1988, 1991, 1998, 2002 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8Software Foundation; either version 2, or (at your option) any later
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING. If not, write to the Free
18Software Foundation, 59 Temple Place - Suite 330, Boston, MA
1902111-1307, 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 "system.h"
29#include "tree.h"
30#include "flags.h"
31#include "convert.h"
32#include "c-common.h"
33#include "toplev.h"
34
35/* Change of width--truncation and extension of integers or reals--
36 is represented with NOP_EXPR. Proper functioning of many things
37 assumes that no other conversions can be NOP_EXPRs.
38
39 Conversion between integer and pointer is represented with CONVERT_EXPR.
40 Converting integer to real uses FLOAT_EXPR
41 and real to integer uses FIX_TRUNC_EXPR.
42
43 Here is a list of all the functions that assume that widening and
44 narrowing is always done with a NOP_EXPR:
45 In convert.c, convert_to_integer.
46 In c-typeck.c, build_binary_op (boolean ops), and
47 c_common_truthvalue_conversion.
48 In expr.c: expand_expr, for operands of a MULT_EXPR.
49 In fold-const.c: fold.
50 In tree.c: get_narrower and get_unwidened. */
51
52
53/* Subroutines of `convert'. */
54
55
56
57
58/* Create an expression whose value is that of EXPR,
59 converted to type TYPE. The TREE_TYPE of the value
60 is always TYPE. This function implements all reasonable
61 conversions; callers should filter out those that are
62 not permitted by the language being compiled. */
63
64tree
65convert (type, expr)
66 tree type, expr;
67{
68 tree e = expr;
69 enum tree_code code = TREE_CODE (type);
70
71 if (type == TREE_TYPE (expr)
72 || TREE_CODE (expr) == ERROR_MARK
73 || code == ERROR_MARK || TREE_CODE (TREE_TYPE (expr)) == ERROR_MARK)
74 return expr;
75
76 if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (TREE_TYPE (expr)))
77 return fold (build1 (NOP_EXPR, type, expr));
78 if (TREE_CODE (TREE_TYPE (expr)) == ERROR_MARK)
79 return error_mark_node;
80 if (TREE_CODE (TREE_TYPE (expr)) == VOID_TYPE)
81 {
82 error ("void value not ignored as it ought to be");
83 return error_mark_node;
84 }
85 if (code == VOID_TYPE)
86 return build1 (CONVERT_EXPR, type, e);
87#if 0
88 /* This is incorrect. A truncation can't be stripped this way.
89 Extensions will be stripped by the use of get_unwidened. */
90 if (TREE_CODE (expr) == NOP_EXPR)
91 return convert (type, TREE_OPERAND (expr, 0));
92#endif
93 if (code == INTEGER_TYPE || code == ENUMERAL_TYPE)
94 return fold (convert_to_integer (type, e));
95 if (code == BOOLEAN_TYPE)
96 {
97 tree t = c_common_truthvalue_conversion (expr);
98 /* If it returns a NOP_EXPR, we must fold it here to avoid
99 infinite recursion between fold () and convert (). */
100 if (TREE_CODE (t) == NOP_EXPR)
101 return fold (build1 (NOP_EXPR, type, TREE_OPERAND (t, 0)));
102 else
103 return fold (build1 (NOP_EXPR, type, t));
104 }
105 if (code == POINTER_TYPE || code == REFERENCE_TYPE)
106 return fold (convert_to_pointer (type, e));
107 if (code == REAL_TYPE)
108 return fold (convert_to_real (type, e));
109 if (code == COMPLEX_TYPE)
110 return fold (convert_to_complex (type, e));
111 if (code == VECTOR_TYPE)
112 return fold (convert_to_vector (type, e));
113
114 error ("conversion to non-scalar type requested");
115 return error_mark_node;
116}
Note: See TracBrowser for help on using the repository browser.