X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fc-convert.c;h=3067137c372c5f739b3ff7bdc71ccf61426a7775;hb=56826b58158ef6eb7bbcea03dfd15dbed65b9199;hp=3634bbe44eaf73b849e50069b2a906b3287bb634;hpb=a23487e420e229555b0ec122fd4b8409e2426cce;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/c-convert.c b/gcc/c-convert.c index 3634bbe44ea..3067137c372 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 + Free Software Foundation, Inc. This file is part of GCC. @@ -26,10 +27,13 @@ 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-common.h" +#include "langhooks.h" #include "toplev.h" /* Change of width--truncation and extension of integers or reals-- @@ -60,8 +64,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 +95,10 @@ convert (type, expr) return fold (convert_to_integer (type, e)); if (code == BOOLEAN_TYPE) { - tree t = c_common_truthvalue_conversion (expr); + tree t = lang_hooks.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 +114,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;