OSDN Git Service

* g++.dg/parse/repo1.C: Use cleanup-repo-files.
[pf3gnuchains/gcc-fork.git] / gcc / c-convert.c
index 42c122e..70e2268 100644 (file)
@@ -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;