diff options
author | Richard Guenther <rguenther@suse.de> | 2012-01-13 12:05:27 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2012-01-13 12:05:27 +0000 |
commit | aabb90e5ad703efbfc7a6c69c08817c2e2ccfb13 (patch) | |
tree | 3d05814c131d0a75d48d9673832203b3d531b7e4 /gcc/gimplify.c | |
parent | b9b16ad4092d4939889ea8a6aa2484cb92f0ab13 (diff) | |
download | gcc-aabb90e5ad703efbfc7a6c69c08817c2e2ccfb13.zip gcc-aabb90e5ad703efbfc7a6c69c08817c2e2ccfb13.tar.gz gcc-aabb90e5ad703efbfc7a6c69c08817c2e2ccfb13.tar.bz2 |
re PR c/8081 (ICE with variably sized types returned from nested functions)
2012-01-13 Richard Guenther <rguenther@suse.de>
PR middle-end/8081
* gimplify.c (gimplify_modify_expr_rhs): For calls with a
variable-sized result always use RSO.
* gcc.dg/torture/pr8081.c: New testcase.
From-SVN: r183153
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r-- | gcc/gimplify.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 94b99a1..99ae5ee 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -4417,6 +4417,11 @@ gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p, /* It's OK to use the target directly if it's being initialized. */ use_target = true; + else if (variably_modified_type_p (TREE_TYPE (*to_p), NULL_TREE)) + /* Always use the target and thus RSO for variable-sized types. + GIMPLE cannot deal with a variable-sized assignment + embedded in a call statement. */ + use_target = true; else if (TREE_CODE (*to_p) != SSA_NAME && (!is_gimple_variable (*to_p) || needs_to_live_in_memory (*to_p))) |