diff options
author | Richard Biener <rguenth@gcc.gnu.org> | 2010-07-05 09:04:44 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2010-07-05 09:04:44 +0000 |
commit | e3061843d8b708c29d4194afa970a56b3a987457 (patch) | |
tree | 59850848c5abef9945446e189f590380583debc0 /gcc/tree-cfg.c | |
parent | 5bb120900a7cdb113b00ccfac46714c553d8f4fc (diff) | |
download | gcc-e3061843d8b708c29d4194afa970a56b3a987457.zip gcc-e3061843d8b708c29d4194afa970a56b3a987457.tar.gz gcc-e3061843d8b708c29d4194afa970a56b3a987457.tar.bz2 |
tree-cfg.c (verify_gimple_return): Handle DECL_BY_REFERENCE RESULT_DECLs properly.
2010-07-05 Richard Guenther <rguenther@suse.de>
* tree-cfg.c (verify_gimple_return): Handle DECL_BY_REFERENCE
RESULT_DECLs properly.
From-SVN: r161821
Diffstat (limited to 'gcc/tree-cfg.c')
-rw-r--r-- | gcc/tree-cfg.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 99b8f2a..448e275 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -3826,12 +3826,14 @@ verify_gimple_return (gimple stmt) return true; } - if (!useless_type_conversion_p (restype, TREE_TYPE (op)) - /* ??? With C++ we can have the situation that the result - decl is a reference type while the return type is an aggregate. */ - && !(TREE_CODE (op) == RESULT_DECL - && TREE_CODE (TREE_TYPE (op)) == REFERENCE_TYPE - && useless_type_conversion_p (restype, TREE_TYPE (TREE_TYPE (op))))) + if ((TREE_CODE (op) == RESULT_DECL + && DECL_BY_REFERENCE (op)) + || (TREE_CODE (op) == SSA_NAME + && TREE_CODE (SSA_NAME_VAR (op)) == RESULT_DECL + && DECL_BY_REFERENCE (SSA_NAME_VAR (op)))) + op = TREE_TYPE (op); + + if (!useless_type_conversion_p (restype, TREE_TYPE (op))) { error ("invalid conversion in return statement"); debug_generic_stmt (restype); |