X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fc-convert.c;h=70e226806ca51ceaabdaee355bd4910926c815be;hb=6aa81614ec06c6ce28daa6bae3dd737c507e807e;hp=42c122ee991b80c9ad6b6f02f43d5ff0ef3bd91e;hpb=a69f4a275861df5a589db11d67b5fda74581a0da;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/c-convert.c b/gcc/c-convert.c index 42c122ee991..70e226806ca 100644 --- a/gcc/c-convert.c +++ b/gcc/c-convert.c @@ -1,5 +1,6 @@ /* Language-level data type conversion for GNU C. - Copyright (C) 1987, 1988, 1991, 1998, 2002 Free Software Foundation, Inc. + Copyright (C) 1987, 1988, 1991, 1998, 2002, 2003, 2004, 2005 + Free Software Foundation, Inc. This file is part of GCC. @@ -26,10 +27,14 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "config.h" #include "system.h" +#include "coretypes.h" +#include "tm.h" #include "tree.h" #include "flags.h" #include "convert.h" -#include "c-convert.h" +#include "c-common.h" +#include "c-tree.h" +#include "langhooks.h" #include "toplev.h" /* Change of width--truncation and extension of integers or reals-- @@ -60,8 +65,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA not permitted by the language being compiled. */ tree -convert (type, expr) - tree type, expr; +convert (tree type, tree expr) { tree e = expr; enum tree_code code = TREE_CODE (type); @@ -92,7 +96,10 @@ convert (type, expr) return fold (convert_to_integer (type, e)); if (code == BOOLEAN_TYPE) { - tree t = c_common_truthvalue_conversion (expr); + tree t = c_objc_common_truthvalue_conversion (expr); + if (TREE_CODE (t) == ERROR_MARK) + return t; + /* If it returns a NOP_EXPR, we must fold it here to avoid infinite recursion between fold () and convert (). */ if (TREE_CODE (t) == NOP_EXPR) @@ -108,6 +115,9 @@ convert (type, expr) return fold (convert_to_complex (type, e)); if (code == VECTOR_TYPE) return fold (convert_to_vector (type, e)); + if ((code == RECORD_TYPE || code == UNION_TYPE) + && lang_hooks.types_compatible_p (type, TREE_TYPE (expr))) + return e; error ("conversion to non-scalar type requested"); return error_mark_node;