From 97a170cd637fd9c1c8203c9e286833d251ca5529 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Wed, 28 Jan 2009 09:36:41 +0000 Subject: [PATCH] re PR c++/38908 (Unexplained "'' is used uninitialized in this function" warning in cc1plus -m64) 2009-01-28 Richard Guenther PR middle-end/38908 * tree-ssa.c (warn_uninitialized_var): Do not warn for seemingly uninitialized aggregate uses in call arguments. * g++.dg/warn/Wuninitialized-2.C: New testcase. From-SVN: r143722 --- gcc/ChangeLog | 6 +++ gcc/testsuite/ChangeLog | 5 ++ gcc/testsuite/g++.dg/warn/Wuninitialized-2.C | 53 ++++++++++++++++++++ gcc/tree-ssa.c | 6 ++- 4 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/warn/Wuninitialized-2.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2727cc2ff23..88de5d2c5ab 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-01-28 Richard Guenther + + PR middle-end/38908 + * tree-ssa.c (warn_uninitialized_var): Do not warn for seemingly + uninitialized aggregate uses in call arguments. + 2009-01-28 Paolo Bonzini PR tree-optimization/38984 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7721a56f2bf..2db69bee90c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-01-28 Richard Guenther + + PR middle-end/38908 + * g++.dg/warn/Wuninitialized-2.C: New testcase. + 2009-01-28 Paolo Bonzini PR tree-optimization/38984 diff --git a/gcc/testsuite/g++.dg/warn/Wuninitialized-2.C b/gcc/testsuite/g++.dg/warn/Wuninitialized-2.C new file mode 100644 index 00000000000..2b6f9253012 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wuninitialized-2.C @@ -0,0 +1,53 @@ +/* { dg-do compile } */ +/* { dg-options "-O -Wuninitialized" } */ + +struct S8 { template S8(T) { } }; + +template struct S10; +template struct S10 { typedef T S12; typedef S8 S1(); }; + +template struct S3 { }; +template struct S11 { S11(S3); }; + +struct S2 +{ + template operator S11() { return S11(S5()); } + template struct S5:public S3 + { + virtual typename S10::S12 S13() { + return 0; + } + }; +}; + +template S11 S6(S3) { return S11(S3()); } +template struct S7 { typedef S12 S15(); }; + +struct S4 +{ + template operator S11() + { + struct S14:public S3 + { + S14(S2 x):S11_(x) { } + S11::S12>::S15> S11_; + }; + return S6(S14(S11_)); + } + S2 S11_; +}; + +struct S9 +{ + template operator S11() { return S11(S14(S11_)); } + template struct S14:public S3 + { + S14(S4 x):S11_(x) { } + S11::S1> S11_; + }; + S4 S11_; +}; + +void S15(S11); +void S16() { S9 x; S15(x); } + diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index 91cbc195001..75e4685149f 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -1496,9 +1496,13 @@ warn_uninitialized_var (tree *tp, int *walk_subtrees, void *data_) || !gimple_aliases_computed_p (cfun)) return NULL_TREE; + /* If the load happens as part of a call do not warn about it. */ + if (is_gimple_call (data->stmt)) + return NULL_TREE; + vuse = SINGLE_SSA_USE_OPERAND (data->stmt, SSA_OP_VUSE); if (vuse == NULL_USE_OPERAND_P) - return NULL_TREE; + return NULL_TREE; op = USE_FROM_PTR (vuse); if (t != SSA_NAME_VAR (op) -- 2.30.2