c-typeck.c (convert_for_assignment): Handle references to memory spaces better.
authorMike Stump <mikestump@comcast.net>
Thu, 23 May 2013 21:57:39 +0000 (21:57 +0000)
committerMike Stump <mrs@gcc.gnu.org>
Thu, 23 May 2013 21:57:39 +0000 (21:57 +0000)
* c-typeck.c (convert_for_assignment): Handle references to memory
spaces better.

From-SVN: r199270

gcc/c/ChangeLog
gcc/c/c-typeck.c

index 819dfeb9be98cfa0b978a2d31f23fe12013ea9ee..e0fef1e164fcaec34498f28b25ddc9b39b921fb6 100644 (file)
@@ -1,3 +1,8 @@
+2013-05-23  Mike Stump  <mikestump@comcast.net>
+
+       * c-typeck.c (convert_for_assignment): Handle references to memory
+       spaces better.
+
 2013-05-16  Jason Merrill  <jason@redhat.com>
 
        * Make-lang.in (cc1$(exeext)): Use link mutex.
index 5a29f7c6a34f560ced87d9b1e6a9ece1224016ec..79386da59add45c1186d910b2d19b857e5c98c72 100644 (file)
@@ -5245,11 +5245,9 @@ convert_for_assignment (location_t location, tree type, tree rhs,
   rhs = require_complete_type (rhs);
   if (rhs == error_mark_node)
     return error_mark_node;
-  /* A type converts to a reference to it.
-     This code doesn't fully support references, it's just for the
-     special case of va_start and va_copy.  */
-  if (codel == REFERENCE_TYPE
-      && comptypes (TREE_TYPE (type), TREE_TYPE (rhs)) == 1)
+  /* A non-reference type can convert to a reference.  This handles
+     va_start, va_copy and possibly port built-ins.  */
+  if (codel == REFERENCE_TYPE && coder != REFERENCE_TYPE)
     {
       if (!lvalue_p (rhs))
        {
@@ -5261,16 +5259,11 @@ convert_for_assignment (location_t location, tree type, tree rhs,
       rhs = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (rhs)), rhs);
       SET_EXPR_LOCATION (rhs, location);
 
-      /* We already know that these two types are compatible, but they
-        may not be exactly identical.  In fact, `TREE_TYPE (type)' is
-        likely to be __builtin_va_list and `TREE_TYPE (rhs)' is
-        likely to be va_list, a typedef to __builtin_va_list, which
-        is different enough that it will cause problems later.  */
-      if (TREE_TYPE (TREE_TYPE (rhs)) != TREE_TYPE (type))
-       {
-         rhs = build1 (NOP_EXPR, build_pointer_type (TREE_TYPE (type)), rhs);
-         SET_EXPR_LOCATION (rhs, location);
-       }
+      rhs = convert_for_assignment (location, build_pointer_type (TREE_TYPE (type)),
+                                   rhs, origtype, errtype, null_pointer_constant,
+                                   fundecl, function, parmnum);
+      if (rhs == error_mark_node)
+       return error_mark_node;
 
       rhs = build1 (NOP_EXPR, type, rhs);
       SET_EXPR_LOCATION (rhs, location);