+2015-09-22 Nathan Sidwell <nathan@codesourcery.com>
+
+ * doc/invoke.texi (-Wmultiple-inheritance, -Wvirtual-inheritance,
+ -Wtemplates, -Wnamespaces): Document.
+
2015-09-22 Tom de Vries <tom@codesourcery.com>
PR tree-optimization/67671
+2015-09-22 Nathan Sidwell <nathan@codesourcery.com>
+
+ * c.opt (Wmultiple-inheritance, Wvirtual-inheritance, Wtemplates,
+ Wnamespaces): New C++ warnings.
+
2015-09-22 Jason Merrill <jason@redhat.com>
* c-common.h (abi_compat_version_crosses): New.
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) Warning
+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
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)
;
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
+2015-09-22 Nathan Sidwell <nathan@codesourcery.com>
+
+ * 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.
+
2015-09-22 Jason Merrill <jason@redhat.com>
* mangle.c (abi_warn_or_compat_version_crosses): New.
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. */
{
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;
error ("Java class %qT cannot have multiple bases", ref);
return false;
}
+ else
+ warning (OPT_Wmultiple_inheritance,
+ "%qT defined with multiple direct bases", ref);
}
if (max_vbases)
error ("Java class %qT cannot have virtual bases", ref);
return false;
}
+ else if (max_dvbases)
+ warning (OPT_Wvirtual_inheritance,
+ "%qT defined with direct virtual base", ref);
}
for (igo_prev = binfo; base_list; base_list = TREE_CHAIN (base_list))
has_visibility = handle_namespace_attrs (current_namespace, attribs);
+ warning (OPT_Wnamespaces, "namepace %qD entered", current_namespace);
+
/* Parse the body of the namespace. */
cp_parser_namespace_body (parser);
if (is_primary)
{
+ warning (OPT_Wtemplates, "template %qD declared", decl);
+
if (DECL_CLASS_SCOPE_P (decl))
member_template_p = true;
if (TREE_CODE (decl) == TYPE_DECL
-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
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
+2015-09-22 Nathan Sidwell <nathan@codesourcery.com>
+
+ * g++.dg/diagostic/disable.C: New.
+
2015-09-22 Tom de Vries <tom@codesourcery.com>
PR tree-optimization/67671
--- /dev/null
+// { 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);
+}
+
+