diff options
author | Richard Guenther <rguenther@suse.de> | 2009-04-11 10:19:55 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2009-04-11 10:19:55 +0000 |
commit | 32848948c2e18df67ac12fe9cf0e2a77e168de06 (patch) | |
tree | a2ba37c24628f5e96fa2c1e9a5dad8a571051a29 /gcc | |
parent | 568eecadba8d1e6f1bce10ce0bd27b739c469048 (diff) | |
download | gcc-32848948c2e18df67ac12fe9cf0e2a77e168de06.zip gcc-32848948c2e18df67ac12fe9cf0e2a77e168de06.tar.gz gcc-32848948c2e18df67ac12fe9cf0e2a77e168de06.tar.bz2 |
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 <rguenther@suse.de>
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr39732.C | 29 | ||||
-rw-r--r-- | gcc/tree-inline.c | 5 |
4 files changed, 44 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3d6b046..7d9e738 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2009-04-11 Richard Guenther <rguenther@suse.de> + PR middle-end/39732 + * tree-inline.c (declare_return_variable): Mark DECL_BY_REFERENCE + return variables as TREE_ADDRESSABLE. + +2009-04-11 Richard Guenther <rguenther@suse.de> + PR tree-optimization/39713 * tree-ssa-sccvn.c (vn_get_expr_for): Make sure built reference trees have SSA_NAME operands. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 108e17d..aedd017 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-04-11 Richard Guenther <rguenther@suse.de> + + PR middle-end/39732 + * g++.dg/torture/pr39732.C: New testcase. + 2009-04-11 Daniel Franke <franke.daniel@gmail.com> * 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 0000000..4184175 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr39732.C @@ -0,0 +1,29 @@ +/* { dg-do compile } */ +/* { dg-options "-fprofile-generate" } */ + +template<class _CharT> struct char_traits; +template<typename _OI> +_OI __copy_move_a2(_OI __result); +template<typename _OI> inline _OI +copy(_OI __result) +{ + return __copy_move_a2 (__result); +} +template<typename _CharT, typename _Traits> +class basic_ostream { }; +template<typename _Tp, typename _CharT = char, typename _Traits = char_traits<_CharT> > +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<char, char_traits<char> > os; + copy(ostream_iterator<const int>(os, ",")); +} diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index e1e1f11..686611d 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 |