diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 189bcbe..355b8c1 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -1316,6 +1316,7 @@ build_aggr_init (tree exp, tree init, int flags, tsubst_flags_t complain)
     /* Just know that we've seen something for this node.  */
     TREE_USED (exp) = 1;
 
+  TREE_TYPE (exp) = TYPE_MAIN_VARIANT (type);
   is_global = begin_init_stmts (&stmt_expr, &compound_stmt);
   destroy_temps = stmts_are_full_exprs_p ();
   current_stmt_tree ()->stmts_are_full_exprs_p = 0;
@@ -1323,6 +1324,7 @@ build_aggr_init (tree exp, tree init, int flags, tsubst_flags_t complain)
 		      init, LOOKUP_NORMAL|flags, complain);
   stmt_expr = finish_init_stmts (is_global, stmt_expr, compound_stmt);
   current_stmt_tree ()->stmts_are_full_exprs_p = destroy_temps;
+  TREE_TYPE (exp) = type;
   TREE_READONLY (exp) = was_const;
   TREE_THIS_VOLATILE (exp) = was_volatile;
 
--- /dev/null	2010-09-09 09:16:30.485584932 -0700
+++ gcc/gcc/testsuite/g++.dg/torture/pr45709.C	2010-09-17 15:15:22.000000000 -0700
@@ -0,0 +1,17 @@
+struct Region {
+    int storage[4];
+    int count;
+};
+static inline Region subtract(int lhs)
+{
+  Region reg;
+  int* storage = reg.storage;
+  if (lhs > 0)
+    storage++;
+  reg.count = storage - reg.storage;
+  return reg;
+}
+void bar(int a)
+{
+  const Region copyBack(subtract(a));
+}
