From 2c1c8a2caa05beda763245d970852ac2bd646a5b Mon Sep 17 00:00:00 2001 From: mrs Date: Thu, 23 May 2013 21:57:39 +0000 Subject: * c-typeck.c (convert_for_assignment): Handle references to memory spaces better. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@199270 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/c/ChangeLog | 5 +++++ gcc/c/c-typeck.c | 23 ++++++++--------------- 2 files changed, 13 insertions(+), 15 deletions(-) (limited to 'gcc/c') diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 819dfeb9be9..e0fef1e164f 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,8 @@ +2013-05-23 Mike Stump + + * c-typeck.c (convert_for_assignment): Handle references to memory + spaces better. + 2013-05-16 Jason Merrill * Make-lang.in (cc1$(exeext)): Use link mutex. diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index 5a29f7c6a34..79386da59ad 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); -- cgit v1.2.1