aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2009-01-28 09:36:41 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2009-01-28 09:36:41 +0000
commit97a170cd637fd9c1c8203c9e286833d251ca5529 (patch)
tree0ea4a6e8018d544e307c69cbc79066acedd3d492
parent89ebafc6cdbfe4f67d017844f50b3810fd9e1399 (diff)
downloadgcc-97a170cd637fd9c1c8203c9e286833d251ca5529.zip
gcc-97a170cd637fd9c1c8203c9e286833d251ca5529.tar.gz
gcc-97a170cd637fd9c1c8203c9e286833d251ca5529.tar.bz2
re PR c++/38908 (Unexplained "'<anonymous>' is used uninitialized in this function" warning in cc1plus -m64)
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. From-SVN: r143722
-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 2727cc2..88de5d2 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 7721a56..2db69be 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 0000000..2b6f925
--- /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 91cbc19..75e4685 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)