From 87e008d2e5202f70b9b577ab88c078ea501b600d Mon Sep 17 00:00:00 2001 From: jason Date: Sun, 13 Nov 2011 05:09:36 +0000 Subject: [PATCH] PR c++/986 * call.c (set_up_extended_ref_temp): Warn about references bound to non-static reference members. * init.c (perform_member_init): Pass in the member. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181334 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/call.c | 8 ++++++++ gcc/cp/init.c | 2 +- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/warn/ref-temp1.C | 11 +++++++++++ 5 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/warn/ref-temp1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 21f64476d96..a33332cc6a9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2011-11-12 Jason Merrill + PR c++/986 + * call.c (set_up_extended_ref_temp): Warn about references + bound to non-static reference members. + * init.c (perform_member_init): Pass in the member. + PR c++/51060 * cp-gimplify.c (cp_gimplify_expr): Leave clobbers alone. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index e81950ce537..ab0654273a3 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -8607,6 +8607,14 @@ set_up_extended_ref_temp (tree decl, tree expr, VEC(tree,gc) **cleanups, if (TREE_CODE (expr) != TARGET_EXPR) expr = get_target_expr (expr); + if (TREE_CODE (decl) == FIELD_DECL + && extra_warnings && !TREE_NO_WARNING (decl)) + { + warning (OPT_Wextra, "a temporary bound to %qD only persists " + "until the constructor exits", decl); + TREE_NO_WARNING (decl) = true; + } + /* Recursively extend temps in this initializer. */ TARGET_EXPR_INITIAL (expr) = extend_ref_init_temps (decl, TARGET_EXPR_INITIAL (expr), cleanups); diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 77fe42e4dc6..5c20e32a79f 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -599,7 +599,7 @@ perform_member_init (tree member, tree init) if (init == error_mark_node) return; /* Use 'this' as the decl, as it has the lifetime we want. */ - init = extend_ref_init_temps (current_class_ptr, init, &cleanups); + init = extend_ref_init_temps (member, init, &cleanups); if (TREE_CODE (type) == ARRAY_TYPE && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (type))) init = build_vec_init_expr (type, init, tf_warning_or_error); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0582e49e0e5..4c4460310ef 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2011-11-12 Jason Merrill + PR c++/986 + * g++.dg/warn/ref-temp1.C: New. + PR c++/51060 * g++.dg/opt/stack2.C: New. diff --git a/gcc/testsuite/g++.dg/warn/ref-temp1.C b/gcc/testsuite/g++.dg/warn/ref-temp1.C new file mode 100644 index 00000000000..26f1ca5de84 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/ref-temp1.C @@ -0,0 +1,11 @@ +// PR c++/986 +// { dg-options "-Wall -Wextra" } + +struct X { X (int); }; + +struct Y { + Y (); + const X &x; // note the ampersand +}; + +Y::Y () : x(1) {} // { dg-warning "temporary" } -- 2.11.4.GIT