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
This commit is contained in:
Richard Guenther 2009-04-11 10:19:55 +00:00 committed by Richard Biener
parent 568eecadba
commit 32848948c2
4 changed files with 44 additions and 1 deletions

View File

@ -1,3 +1,9 @@
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

View File

@ -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.

View File

@ -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, ","));
}

View File

@ -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