middle-end/110055 - avoid CLOBBERing static variables
The gimplifier can elide initialized constant automatic variables to static storage in which case TARGET_EXPR gimplification needs to avoid emitting a CLOBBER for them since their lifetime is no longer limited. Failing to do so causes spurious dangling-pointer diagnostics on the added testcase for some targets. PR middle-end/110055 * gimplify.cc (gimplify_target_expr): Do not emit CLOBBERs for variables which have static storage duration after gimplifying their initializers. * g++.dg/warn/Wdangling-pointer-pr110055.C: New testcase. (cherry picked from commit 84eec2916fa68cd2e2b3a2cf764f2ba595cce843)
This commit is contained in:
+3
-1
@@ -7154,8 +7154,10 @@ gimplify_target_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
|
||||
gimplify_and_add (init, &init_pre_p);
|
||||
|
||||
/* Add a clobber for the temporary going out of scope, like
|
||||
gimplify_bind_expr. */
|
||||
gimplify_bind_expr. But only if we did not promote the
|
||||
temporary to static storage. */
|
||||
if (gimplify_ctxp->in_cleanup_point_expr
|
||||
&& !TREE_STATIC (temp)
|
||||
&& needs_to_live_in_memory (temp))
|
||||
{
|
||||
if (flag_stack_reuse == SR_ALL)
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
// { dg-do compile }
|
||||
// { dg-require-effective-target c++11 }
|
||||
// { dg-options "-O3 -fno-exceptions -Wdangling-pointer" }
|
||||
|
||||
#include <cstdint>
|
||||
#include <vector>
|
||||
|
||||
struct Data {
|
||||
std::vector<uint16_t> v = {1, 1};
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
Data a;
|
||||
Data b;
|
||||
}
|
||||
Reference in New Issue
Block a user