Commit d21a8e3b by Richard Biener Committed by Richard Biener

re PR c++/2972 (-Wuninitialized could warn about uninitialized member variable…

re PR c++/2972 (-Wuninitialized could warn about uninitialized member variable usage in constructors)

2017-04-24  Richard Biener  <rguenther@suse.de>

	PR c++/2972
	* tree-ssa-uninit.c (warn_uninitialized_vars): Handle some
	pointer-based references.

	* g++.dg/warn/Wuninitialized-10.C: New testcase.

From-SVN: r247090
parent 3c5b0ca4
2017-04-24 Richard Biener <rguenther@suse.de>
PR c++/2972
* tree-ssa-uninit.c (warn_uninitialized_vars): Handle some
pointer-based references.
2017-04-24 Richard Biener <rguenther@suse.de>
PR bootstrap/79814
* pass_manager.h (pass_manager::operator new): Remove.
(pass_manager::operator delete): Likewise.
......
2017-04-24 Richard Biener <rguenther@suse.de>
PR c++/2972
* g++.dg/warn/Wuninitialized-10.C: New testcase.
2017-04-23 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/80484
......
// { dg-do compile }
// { dg-options "-Wuninitialized" }
struct A
{
int f,g;
A()
{
f = g; // { dg-warning "g. is used uninitialized" }
}
};
A a;
......@@ -279,20 +279,22 @@ warn_uninitialized_vars (bool warn_possibly_uninitialized)
ao_ref ref;
ao_ref_init (&ref, rhs);
/* Do not warn if it can be initialized outside this function. */
/* Do not warn if the base was marked so or this is a
hard register var. */
tree base = ao_ref_base (&ref);
if (!VAR_P (base)
|| DECL_HARD_REGISTER (base)
|| is_global_var (base)
if ((VAR_P (base)
&& DECL_HARD_REGISTER (base))
|| TREE_NO_WARNING (base))
continue;
/* Do not warn if the access is fully outside of the
variable. */
if (ref.size != -1
if (DECL_P (base)
&& ref.size != -1
&& ref.max_size == ref.size
&& (ref.offset + ref.size <= 0
|| (ref.offset >= 0
&& DECL_SIZE (base)
&& TREE_CODE (DECL_SIZE (base)) == INTEGER_CST
&& compare_tree_int (DECL_SIZE (base),
ref.offset) <= 0)))
......@@ -305,11 +307,12 @@ warn_uninitialized_vars (bool warn_possibly_uninitialized)
&& oracle_cnt > vdef_cnt * 2)
limit = 32;
check_defs_data data;
bool fentry_reached = false;
data.found_may_defs = false;
use = gimple_vuse (stmt);
int res = walk_aliased_vdefs (&ref, use,
check_defs, &data, NULL,
NULL, limit);
&fentry_reached, limit);
if (res == -1)
{
oracle_cnt += limit;
......@@ -318,6 +321,16 @@ warn_uninitialized_vars (bool warn_possibly_uninitialized)
oracle_cnt += res;
if (data.found_may_defs)
continue;
/* Do not warn if it can be initialized outside this function.
If we did not reach function entry then we found killing
clobbers on all paths to entry. */
if (fentry_reached
/* ??? We'd like to use ref_may_alias_global_p but that
excludes global readonly memory and thus we get bougs
warnings from p = cond ? "a" : "b" for example. */
&& (!VAR_P (base)
|| is_global_var (base)))
continue;
/* We didn't find any may-defs so on all paths either
reached function entry or a killing clobber. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment