From 32848948c2e18df67ac12fe9cf0e2a77e168de06 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Sat, 11 Apr 2009 10:19:55 +0000 Subject: [PATCH] re PR middle-end/39732 (-fprofile-generate -O1: ICE: verify_stmts failed, ADDRESSABLE bit not set on pointers passed to std::copy) 2009-04-11 Richard Guenther PR middle-end/39732 * tree-inline.c (declare_return_variable): Mark DECL_BY_REFERENCE return variables as TREE_ADDRESSABLE. * g++.dg/torture/pr39732.C: New testcase. From-SVN: r145954 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/torture/pr39732.C | 29 ++++++++++++++++++++++++++ gcc/tree-inline.c | 5 ++++- 4 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr39732.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3d6b046edc5d..7d9e7384ff37 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-04-11 Richard Guenther + + PR middle-end/39732 + * tree-inline.c (declare_return_variable): Mark DECL_BY_REFERENCE + return variables as TREE_ADDRESSABLE. + 2009-04-11 Richard Guenther PR tree-optimization/39713 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 108e17d07f1a..aedd017f189a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-04-11 Richard Guenther + + PR middle-end/39732 + * g++.dg/torture/pr39732.C: New testcase. + 2009-04-11 Daniel Franke * gfortran.dg/whole_file_5.f90: New. diff --git a/gcc/testsuite/g++.dg/torture/pr39732.C b/gcc/testsuite/g++.dg/torture/pr39732.C new file mode 100644 index 000000000000..41841758727b --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr39732.C @@ -0,0 +1,29 @@ +/* { dg-do compile } */ +/* { dg-options "-fprofile-generate" } */ + +template struct char_traits; +template +_OI __copy_move_a2(_OI __result); +template inline _OI +copy(_OI __result) +{ + return __copy_move_a2 (__result); +} +template +class basic_ostream { }; +template > +class ostream_iterator { + typedef basic_ostream<_CharT, _Traits> ostream_type; + ostream_type* _M_stream; + const _CharT* _M_string; +public: + ostream_iterator(ostream_type& __s, const _CharT* __c) + : _M_stream(&__s), _M_string(__c) { } + ostream_iterator(const ostream_iterator& __obj) + : _M_stream(__obj._M_stream), _M_string(__obj._M_string) { } +}; +int f(void) +{ + basic_ostream > os; + copy(ostream_iterator(os, ",")); +} diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index e1e1f1154d1b..686611d7c562 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -2386,7 +2386,10 @@ declare_return_variable (copy_body_data *id, tree return_slot, tree modify_dest, STRIP_USELESS_TYPE_CONVERSION (use); if (DECL_BY_REFERENCE (result)) - var = build_fold_addr_expr (var); + { + TREE_ADDRESSABLE (var) = 1; + var = build_fold_addr_expr (var); + } done: /* Register the VAR_DECL as the equivalent for the RESULT_DECL; that -- 2.43.5