summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2009-01-28 09:36:41 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2009-01-28 09:36:41 +0000
commita98de126cfd13cabfca02b8238374bb2cd8b6f0f (patch)
tree0ea4a6e8018d544e307c69cbc79066acedd3d492
parent7f70ef195ca477c04bab61f98b141cb00f8313d1 (diff)
downloadppe42-gcc-a98de126cfd13cabfca02b8238374bb2cd8b6f0f.tar.gz
ppe42-gcc-a98de126cfd13cabfca02b8238374bb2cd8b6f0f.zip
2009-01-28 Richard Guenther <rguenther@suse.de>
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@143722 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/warn/Wuninitialized-2.C53
-rw-r--r--gcc/tree-ssa.c6
4 files changed, 69 insertions, 1 deletions
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 <rguenther@suse.de>
+
+ 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 <bonzini@gnu.org>
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 <rguenther@suse.de>
+
+ PR middle-end/38908
+ * g++.dg/warn/Wuninitialized-2.C: New testcase.
+
2009-01-28 Paolo Bonzini <bonzini@gnu.org>
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<typename T> S8(T) { } };
+
+template<typename T> struct S10;
+template<typename T> struct S10<T()> { typedef T S12; typedef S8 S1(); };
+
+template<typename T> struct S3 { };
+template<typename T> struct S11 { S11(S3<T>); };
+
+struct S2
+{
+ template<typename T> operator S11<T>() { return S11<T>(S5<T>()); }
+ template<typename T> struct S5:public S3<T>
+ {
+ virtual typename S10<T>::S12 S13() {
+ return 0;
+ }
+ };
+};
+
+template<typename T> S11<T> S6(S3<T>) { return S11<T>(S3<T>()); }
+template<typename S12> struct S7 { typedef S12 S15(); };
+
+struct S4
+{
+ template<typename T> operator S11<T>()
+ {
+ struct S14:public S3<T>
+ {
+ S14(S2 x):S11_(x) { }
+ S11<typename S7<typename S10<T>::S12>::S15> S11_;
+ };
+ return S6(S14(S11_));
+ }
+ S2 S11_;
+};
+
+struct S9
+{
+ template<typename F> operator S11<F>() { return S11<F>(S14<F>(S11_)); }
+ template<typename F> struct S14:public S3<F>
+ {
+ S14(S4 x):S11_(x) { }
+ S11<typename S10<F>::S1> S11_;
+ };
+ S4 S11_;
+};
+
+void S15(S11<void()>);
+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)
OpenPOWER on IntegriCloud