aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl.c37
-rw-r--r--gcc/testsuite/ChangeLog11
-rw-r--r--gcc/testsuite/c-c++-common/uninit-D-O0.c (renamed from gcc/testsuite/gcc.dg/uninit-D-O0.c)0
-rw-r--r--gcc/testsuite/c-c++-common/uninit-D.c (renamed from gcc/testsuite/gcc.dg/uninit-D.c)0
-rw-r--r--gcc/testsuite/c-c++-common/uninit-E-O0.c (renamed from gcc/testsuite/gcc.dg/uninit-E-O0.c)0
-rw-r--r--gcc/testsuite/c-c++-common/uninit-E.c (renamed from gcc/testsuite/gcc.dg/uninit-E.c)0
-rw-r--r--gcc/testsuite/c-c++-common/uninit-F-O0.c (renamed from gcc/testsuite/gcc.dg/uninit-F-O0.c)0
-rw-r--r--gcc/testsuite/c-c++-common/uninit-F.c (renamed from gcc/testsuite/gcc.dg/uninit-F.c)0
-rw-r--r--gcc/testsuite/c-c++-common/uninit-G-O0.c (renamed from gcc/testsuite/gcc.dg/uninit-G-O0.c)0
-rw-r--r--gcc/testsuite/c-c++-common/uninit-G.c (renamed from gcc/testsuite/gcc.dg/uninit-G.c)0
11 files changed, 41 insertions, 13 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 17116e0..4c4036a 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2011-05-09 Jason Merrill <jason@redhat.com>
+
+ PR c++/34772
+ * decl.c (initialize_local_var): Use DECL_INITIAL for simple
+ initialization.
+
2011-05-08 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement final/override for member functions.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index c139f3f..c255e16 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -5689,21 +5689,32 @@ initialize_local_var (tree decl, tree init)
/* Perform the initialization. */
if (init)
{
- int saved_stmts_are_full_exprs_p;
+ if (TREE_CODE (init) == INIT_EXPR
+ && !TREE_SIDE_EFFECTS (TREE_OPERAND (init, 1)))
+ {
+ /* Stick simple initializers in DECL_INITIAL so that
+ -Wno-init-self works (c++/34772). */
+ gcc_assert (TREE_OPERAND (init, 0) == decl);
+ DECL_INITIAL (decl) = TREE_OPERAND (init, 1);
+ }
+ else
+ {
+ int saved_stmts_are_full_exprs_p;
- /* If we're only initializing a single object, guard the destructors
- of any temporaries used in its initializer with its destructor.
- This isn't right for arrays because each element initialization is
- a full-expression. */
- if (cleanup && TREE_CODE (type) != ARRAY_TYPE)
- wrap_temporary_cleanups (init, cleanup);
+ /* If we're only initializing a single object, guard the
+ destructors of any temporaries used in its initializer with
+ its destructor. This isn't right for arrays because each
+ element initialization is a full-expression. */
+ if (cleanup && TREE_CODE (type) != ARRAY_TYPE)
+ wrap_temporary_cleanups (init, cleanup);
- gcc_assert (building_stmt_tree ());
- saved_stmts_are_full_exprs_p = stmts_are_full_exprs_p ();
- current_stmt_tree ()->stmts_are_full_exprs_p = 1;
- finish_expr_stmt (init);
- current_stmt_tree ()->stmts_are_full_exprs_p =
- saved_stmts_are_full_exprs_p;
+ gcc_assert (building_stmt_tree ());
+ saved_stmts_are_full_exprs_p = stmts_are_full_exprs_p ();
+ current_stmt_tree ()->stmts_are_full_exprs_p = 1;
+ finish_expr_stmt (init);
+ current_stmt_tree ()->stmts_are_full_exprs_p =
+ saved_stmts_are_full_exprs_p;
+ }
}
/* Set this to 0 so we can tell whether an aggregate which was
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5b72fc5..b30addc 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,14 @@
+2011-05-09 Jason Merrill <jason@redhat.com>
+
+ * gcc.dg/gcc.dg/uninit-D.c: Move to c-c++-common.
+ * gcc.dg/gcc.dg/uninit-D-O0.c: Move to c-c++-common.
+ * gcc.dg/gcc.dg/uninit-E.c: Move to c-c++-common.
+ * gcc.dg/gcc.dg/uninit-E-O0.c: Move to c-c++-common.
+ * gcc.dg/gcc.dg/uninit-F.c: Move to c-c++-common.
+ * gcc.dg/gcc.dg/uninit-F-O0.c: Move to c-c++-common.
+ * gcc.dg/gcc.dg/uninit-G.c: Move to c-c++-common.
+ * gcc.dg/gcc.dg/uninit-G-O0.c: Move to c-c++-common.
+
2011-05-08 Ville Voutilainen <ville.voutilainen@gmail.com>
* g++.dg/inherit/virtual9.C: New.
diff --git a/gcc/testsuite/gcc.dg/uninit-D-O0.c b/gcc/testsuite/c-c++-common/uninit-D-O0.c
index e63cb80..e63cb80 100644
--- a/gcc/testsuite/gcc.dg/uninit-D-O0.c
+++ b/gcc/testsuite/c-c++-common/uninit-D-O0.c
diff --git a/gcc/testsuite/gcc.dg/uninit-D.c b/gcc/testsuite/c-c++-common/uninit-D.c
index ea957e4..ea957e4 100644
--- a/gcc/testsuite/gcc.dg/uninit-D.c
+++ b/gcc/testsuite/c-c++-common/uninit-D.c
diff --git a/gcc/testsuite/gcc.dg/uninit-E-O0.c b/gcc/testsuite/c-c++-common/uninit-E-O0.c
index 2cc24596..2cc24596 100644
--- a/gcc/testsuite/gcc.dg/uninit-E-O0.c
+++ b/gcc/testsuite/c-c++-common/uninit-E-O0.c
diff --git a/gcc/testsuite/gcc.dg/uninit-E.c b/gcc/testsuite/c-c++-common/uninit-E.c
index eb356c3..eb356c3 100644
--- a/gcc/testsuite/gcc.dg/uninit-E.c
+++ b/gcc/testsuite/c-c++-common/uninit-E.c
diff --git a/gcc/testsuite/gcc.dg/uninit-F-O0.c b/gcc/testsuite/c-c++-common/uninit-F-O0.c
index 737cc65..737cc65 100644
--- a/gcc/testsuite/gcc.dg/uninit-F-O0.c
+++ b/gcc/testsuite/c-c++-common/uninit-F-O0.c
diff --git a/gcc/testsuite/gcc.dg/uninit-F.c b/gcc/testsuite/c-c++-common/uninit-F.c
index 1dbb365..1dbb365 100644
--- a/gcc/testsuite/gcc.dg/uninit-F.c
+++ b/gcc/testsuite/c-c++-common/uninit-F.c
diff --git a/gcc/testsuite/gcc.dg/uninit-G-O0.c b/gcc/testsuite/c-c++-common/uninit-G-O0.c
index d6edffe..d6edffe 100644
--- a/gcc/testsuite/gcc.dg/uninit-G-O0.c
+++ b/gcc/testsuite/c-c++-common/uninit-G-O0.c
diff --git a/gcc/testsuite/gcc.dg/uninit-G.c b/gcc/testsuite/c-c++-common/uninit-G.c
index 08f5f53..08f5f53 100644
--- a/gcc/testsuite/gcc.dg/uninit-G.c
+++ b/gcc/testsuite/c-c++-common/uninit-G.c