On 09/15/15 09:33, Jason Merrill wrote:
On 09/15/2015 09:26 AM, Richard Biener wrote:
Wouldn't warning flags be better so you can decide whether it's an error
or a warning via -Werror=virtual-inheritance vs. -Wvirtual-inheritance?
Yep. That also handles the system header exemption (unless -Wsystem-headers).
This version implements Richard's suggestion of warning flags.
nathan
2015-09-16 Nathan Sidwell <nat...@codesourcery.com>
c-family/
* c.opt (Wmultiple-inheritance, Wvirtual-inheritance, Wtemplates,
Wnamespaces): New C++ warnings.
cp/
* decl.c (xref_basetypes): Check virtual and/or multiple
inheritance warning.
* parser.c (cp_parser_namespace_definition): Check namespaces
warning.
* pt.c (push_template_decl_real): Check templates warning.
* doc/invoke.texi (-Wmultiple-inheritance, -Wvirtual-inheritance,
-Wtemplates, -Wnamespaces): Document.
testsuite/
* g++.dg/diagostic/disable.C: New.
Index: gcc/c-family/c.opt
===================================================================
--- gcc/c-family/c.opt (revision 227761)
+++ gcc/c-family/c.opt (working copy)
@@ -573,6 +573,14 @@ Wmissing-field-initializers
C ObjC C++ ObjC++ Var(warn_missing_field_initializers) Warning EnabledBy(Wextra)
Warn about missing fields in struct initializers
+Wmultiple-inheritance
+C++ ObjC++ Var(warn_multiple_inheritance) Warninng
+Warn on direct multiple inheritance
+
+Wnamespaces
+C++ ObjC++ Var(warn_namespaces) Warning
+Warn on namespace definition
+
Wsized-deallocation
C++ ObjC++ Var(warn_sized_deallocation) Warning EnabledBy(Wextra)
Warn about missing sized deallocation functions
@@ -610,6 +618,10 @@ Wswitch-bool
C ObjC C++ ObjC++ Var(warn_switch_bool) Warning Init(1)
Warn about switches with boolean controlling expression
+Wtemplates
+C++ ObjC++ Var(warn_templates) Warning
+Warn on primary template declaration
+
Wmissing-format-attribute
C ObjC C++ ObjC++ Alias(Wsuggest-attribute=format)
;
@@ -936,6 +948,10 @@ Wvolatile-register-var
C ObjC C++ ObjC++ Var(warn_volatile_register_var) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall)
Warn when a register variable is declared volatile
+Wvirtual-inheritance
+C++ ObjC++ Var(warn_virtual_inheritance) Warning
+Warn on direct virtual inheritance
+
Wvirtual-move-assign
C++ ObjC++ Var(warn_virtual_move_assign) Warning Init(1)
Warn if a virtual base has a non-trivial move assignment operator
Index: gcc/cp/decl.c
===================================================================
--- gcc/cp/decl.c (revision 227761)
+++ gcc/cp/decl.c (working copy)
@@ -12729,6 +12729,7 @@ xref_basetypes (tree ref, tree base_list
tree binfo, base_binfo;
unsigned max_vbases = 0; /* Maximum direct & indirect virtual bases. */
unsigned max_bases = 0; /* Maximum direct bases. */
+ unsigned max_dvbases = 0; /* Maximum direct virtual bases. */
int i;
tree default_access;
tree igo_prev; /* Track Inheritance Graph Order. */
@@ -12766,12 +12767,13 @@ xref_basetypes (tree ref, tree base_list
{
max_bases++;
if (TREE_TYPE (*basep))
- max_vbases++;
+ max_dvbases++;
if (CLASS_TYPE_P (basetype))
max_vbases += vec_safe_length (CLASSTYPE_VBASECLASSES (basetype));
basep = &TREE_CHAIN (*basep);
}
}
+ max_vbases += max_dvbases;
TYPE_MARKED_P (ref) = 1;
@@ -12814,6 +12816,9 @@ xref_basetypes (tree ref, tree base_list
error ("Java class %qT cannot have multiple bases", ref);
return false;
}
+ else if (warn_multiple_inheritance)
+ warning (OPT_Wmultiple_inheritance,
+ "%qT defined with multiple direct bases", ref);
}
if (max_vbases)
@@ -12825,6 +12830,9 @@ xref_basetypes (tree ref, tree base_list
error ("Java class %qT cannot have virtual bases", ref);
return false;
}
+ else if (max_dvbases && warn_virtual_inheritance)
+ warning (OPT_Wvirtual_inheritance,
+ "%qT defined with direct virtual base", ref);
}
for (igo_prev = binfo; base_list; base_list = TREE_CHAIN (base_list))
Index: gcc/cp/parser.c
===================================================================
--- gcc/cp/parser.c (revision 227761)
+++ gcc/cp/parser.c (working copy)
@@ -16798,6 +16798,9 @@ cp_parser_namespace_definition (cp_parse
has_visibility = handle_namespace_attrs (current_namespace, attribs);
+ if (warn_namespaces)
+ warning (OPT_Wnamespaces, "namepace %qD entered", current_namespace);
+
/* Parse the body of the namespace. */
cp_parser_namespace_body (parser);
Index: gcc/cp/pt.c
===================================================================
--- gcc/cp/pt.c (revision 227761)
+++ gcc/cp/pt.c (working copy)
@@ -5088,6 +5088,9 @@ push_template_decl_real (tree decl, bool
if (is_primary)
{
+ if (warn_templates)
+ warning (OPT_Wtemplates, "template %qD declared", decl);
+
if (DECL_CLASS_SCOPE_P (decl))
member_template_p = true;
if (TREE_CODE (decl) == TYPE_DECL
Index: gcc/doc/invoke.texi
===================================================================
--- gcc/doc/invoke.texi (revision 227761)
+++ gcc/doc/invoke.texi (working copy)
@@ -198,12 +198,13 @@ in the following sections.
-fvisibility-ms-compat @gol
-fext-numeric-literals @gol
-Wabi=@var{n} -Wabi-tag -Wconversion-null -Wctor-dtor-privacy @gol
--Wdelete-non-virtual-dtor -Wliteral-suffix -Wnarrowing @gol
+-Wdelete-non-virtual-dtor -Wliteral-suffix -Wmultiple-inheritance @gol
+-Wnamespaces -Wnarrowing @gol
-Wnoexcept -Wnon-virtual-dtor -Wreorder @gol
--Weffc++ -Wstrict-null-sentinel @gol
+-Weffc++ -Wstrict-null-sentinel -Wtemplates @gol
-Wno-non-template-friend -Wold-style-cast @gol
-Woverloaded-virtual -Wno-pmf-conversions @gol
--Wsign-promo}
+-Wsign-promo -Wvirtual-inheritance}
@item Objective-C and Objective-C++ Language Options
@xref{Objective-C and Objective-C++ Dialect Options,,Options Controlling
@@ -2903,6 +2904,37 @@ enumerated type to a signed type, over a
the same size. Previous versions of G++ tried to preserve
unsignedness, but the standard mandates the current behavior.
+@item -Wtemplates @r{(C++ and Objective-C++ only)}
+@opindex Wtemplates
+Warn when a primary template declaration is encountered. Some coding
+rules disallow templates, and this may be used to enforce that rule.
+The warning is inactive inside a system header file, such as the STL, so
+one can still use the STL. One may also instantiate or specialize
+templates.
+
+@item -Wmultiple-inheritance @r{(C++ and Objective-C++ only)}
+@opindex Wmultiple-inheritance
+Warn when a class is defined with multiple direct base classes. Some
+coding rules disallow multiple inheritance, and this may be used to
+enforce that rule. The warning is inactive inside a system header file,
+such as the STL, so one can still use the STL. One may also define
+classes that indirectly use multiple inheritance.
+
+@item -Wvirtual-inheritance
+@opindex Wvirtual-inheritance
+Warn when a class is defined with a virtual direct base classe. Some
+coding rules disallow multiple inheritance, and this may be used to
+enforce that rule. The warning is inactive inside a system header file,
+such as the STL, so one can still use the STL. One may also define
+classes that indirectly use virtual inheritance.
+
+@item -Wnamespaces
+@opindex Wnamespaces
+Warn when a namespace definition is opened. Some coding rules disallow
+namespaces, and this may be used to enforce that rule. The warning is
+inactive inside a system header file, such as the STL, so one can still
+use the STL. One may also use using directives and qualified names.
+
@item -Wno-terminate @r{(C++ and Objective-C++ only)}
@opindex Wterminate
@opindex Wno-terminate
Index: gcc/testsuite/g++.dg/diagnostic/disable.C
===================================================================
--- gcc/testsuite/g++.dg/diagnostic/disable.C (revision 0)
+++ gcc/testsuite/g++.dg/diagnostic/disable.C (working copy)
@@ -0,0 +1,27 @@
+// { dg-options "-Wtemplates -Wmultiple-inheritance -Wvirtual-inheritance -Wnamespaces" }
+
+#include <iostream>
+#include <algorithm>
+
+namespace foo { } // { dg-warning "namepace" }
+
+template <typename X> X Foo (); // { dg-warning "template" }
+
+struct B1 {};
+struct B2 {};
+struct V {};
+
+struct D : B1, B2 {}; // { dg-warning "multiple" }
+
+struct E : virtual V {}; // { dg-warning "virtual" }
+
+struct F1 : E {};
+
+struct F2 : D {};
+
+void Baz (int a, int b)
+{
+ std::swap (a, b);
+}
+
+