From cd192ccc8ae118f2b9c126de0e1f15eee33a4709 Mon Sep 17 00:00:00 2001
From: Mike Stump <mikestump@comcast.net>
Date: Thu, 23 May 2013 21:57:39 +0000
Subject: [PATCH] c-typeck.c (convert_for_assignment): Handle references to
 memory spaces better.

	* c-typeck.c (convert_for_assignment): Handle references to memory
	spaces better.

From-SVN: r199270
---
 gcc/c/ChangeLog  |  5 +++++
 gcc/c/c-typeck.c | 23 ++++++++---------------
 2 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index 819dfeb9be98..e0fef1e164fc 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -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.
diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index 5a29f7c6a34f..79386da59add 100644
--- a/gcc/c/c-typeck.c
+++ b/gcc/c/c-typeck.c
@@ -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);
-- 
GitLab