From d3e1e89e50a64005a622759d5b2c4a8d1a77393f Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 31 Jul 2009 22:26:13 -0400 Subject: [PATCH] typeck.c (build_address): Do fold away ADDR_EXPR of INDIRECT_REF. * typeck.c (build_address): Do fold away ADDR_EXPR of INDIRECT_REF. * tree.c (rvalue): Use cp_build_qualified_type, not TYPE_MAIN_VARIANT. From-SVN: r150324 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/tree.c | 2 +- gcc/cp/typeck.c | 15 ++++++--------- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c52c6da89e1d..1f5725140ef4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2009-07-31 Jason Merrill + + * typeck.c (build_address): Do fold away ADDR_EXPR of INDIRECT_REF. + * tree.c (rvalue): Use cp_build_qualified_type, not TYPE_MAIN_VARIANT. + 2009-07-29 Jason Merrill PR c++/14912 diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 83869c17a1b5..cbadf0438b66 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -530,7 +530,7 @@ rvalue (tree expr) Non-class rvalues always have cv-unqualified types. */ type = TREE_TYPE (expr); if (!CLASS_TYPE_P (type) && cp_type_quals (type)) - type = TYPE_MAIN_VARIANT (type); + type = cp_build_qualified_type (type, TYPE_UNQUALIFIED); /* We need to do this for rvalue refs as well to get the right answer from decltype; see c++/36628. */ diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 8b684dd795e4..35c82d637a7b 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -4276,21 +4276,18 @@ condition_conversion (tree expr) return t; } -/* Return an ADDR_EXPR giving the address of T. This function - attempts no optimizations or simplifications; it is a low-level - primitive. */ +/* Returns the address of T. This function will fold away + ADDR_EXPR of INDIRECT_REF. */ tree build_address (tree t) { - tree addr; - if (error_operand_p (t) || !cxx_mark_addressable (t)) return error_mark_node; - - addr = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (t)), t); - - return addr; + t = build_fold_addr_expr (t); + if (TREE_CODE (t) != ADDR_EXPR) + t = rvalue (t); + return t; } /* Return a NOP_EXPR converting EXPR to TYPE. */ -- 2.47.2