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