re PR middle-end/7651 (Define -Wextra strictly in terms of other warning flags)

2008-08-09  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>

	PR 7651
	* doc/invoke.texi (-Wextra): Move warning from here...
	(-Wuninitialized): ... to here.
cp/
	* class.c (check_bases_and_members): Warn with -Wuninitialized
	instead of -Wextra.
testsuite/
	* g++.dg/warn/Wuninitializable-member.C: New.
	* g++.dg/warn/Wuninitializable-member-no.C: New.

From-SVN: r138892
This commit is contained in:
Manuel López-Ibáñez 2008-08-08 23:32:23 +00:00
parent 63a3341a9d
commit c73d5dd948
7 changed files with 56 additions and 11 deletions

View File

@ -1,3 +1,9 @@
2008-08-09 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR 7651
* doc/invoke.texi (-Wextra): Move warning from here...
(-Wuninitialized): ... to here.
2008-08-08 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR 28875

View File

@ -1,3 +1,9 @@
2008-08-09 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR 7651
* class.c (check_bases_and_members): Warn with -Wuninitialized
instead of -Wextra.
2008-08-08 Volker Reichelt <v.reichelt@netcologne.de>
PR c++/35985

View File

@ -4306,7 +4306,7 @@ check_bases_and_members (tree t)
/* If the class has no user-declared constructor, but does have
non-static const or reference data members that can never be
initialized, issue a warning. */
if (extra_warnings
if (warn_uninitialized
/* Classes with user-declared constructors are presumed to
initialize these members. */
&& !TYPE_HAS_USER_CONSTRUCTOR (t)
@ -4325,13 +4325,13 @@ check_bases_and_members (tree t)
type = TREE_TYPE (field);
if (TREE_CODE (type) == REFERENCE_TYPE)
warning (OPT_Wextra, "non-static reference %q+#D in class "
"without a constructor", field);
warning (OPT_Wuninitialized, "non-static reference %q+#D "
"in class without a constructor", field);
else if (CP_TYPE_CONST_P (type)
&& (!CLASS_TYPE_P (type)
|| !TYPE_HAS_DEFAULT_CONSTRUCTOR (type)))
warning (OPT_Wextra, "non-static const member %q+#D in class "
"without a constructor", field);
warning (OPT_Wuninitialized, "non-static const member %q+#D "
"in class without a constructor", field);
}
}

View File

@ -2748,10 +2748,6 @@ A pointer is compared against integer zero with @samp{<}, @samp{<=},
(C++ only) An enumerator and a non-enumerator both appear in a
conditional expression.
@item
(C++ only) A non-static reference or non-static @samp{const} member
appears in a class without constructors.
@item
(C++ only) Ambiguous virtual bases.
@ -3173,8 +3169,10 @@ either specify @samp{-Wextra -Wunused} (note that @samp{-Wall} implies
@item -Wuninitialized
@opindex Wuninitialized
@opindex Wno-uninitialized
Warn if an automatic variable is used without first being initialized or
if a variable may be clobbered by a @code{setjmp} call.
Warn if an automatic variable is used without first being initialized
or if a variable may be clobbered by a @code{setjmp} call. In C++,
warn if a non-static reference or non-static @samp{const} member
appears in a class without constructors.
If you want to warn about code which uses the uninitialized value of the
variable in its own initializer, use the @option{-Winit-self} option.

View File

@ -1,3 +1,9 @@
2008-08-09 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR 7651
* g++.dg/warn/Wuninitializable-member.C: New.
* g++.dg/warn/Wuninitializable-member-no.C: New.
2008-08-08 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR 28875

View File

@ -0,0 +1,15 @@
// Test disabling
// { dg-do compile }
// { dg-options "-Wall -Wextra -Wno-uninitialized" }
class X {
int & flag;// { dg-bogus "non-static reference 'int& X::flag' in class without a constructor" }
public:
void f(){ flag++ ; }
};
class Y {
const int var;// { dg-bogus "non-static const member 'const int Y::var' in class without a constructor" }
public:
int g(){ return 2*var; }
};

View File

@ -0,0 +1,14 @@
// { dg-do compile }
// { dg-options "-Wuninitialized" }
class X {
int & flag;// { dg-warning "non-static reference 'int& X::flag' in class without a constructor" }
public:
void f(){ flag++ ; }
};
class Y {
const int var;// { dg-warning "non-static const member 'const int Y::var' in class without a constructor" }
public:
int g(){ return 2*var; }
};