This is the mail archive of the
mailing list for the GCC project.
[PATCH 0/3] add support for POD struct convention (PR 61339)
- From: Martin Sebor <msebor at gmail dot com>
- To: gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 8 Jul 2019 15:56:51 -0600
- Subject: [PATCH 0/3] add support for POD struct convention (PR 61339)
A couple of GCC's Coding Conventions call to
1) Use the struct keyword for plain old data (POD) types.
2) Use the class keyword for non-POD types.
The rationale for the conventions is to convey information about
some basic properties of a user-defined type such as whether it
is safely and efficiently copyable or assignable via memcpy or
whether it requires a call to a copy ctor/assignment operator
A survey of GCC code shows that the convention is only loosely
followed, making it less helpful than it would be otherwise.
In addition, inconsistencies between declarations and definitions
are wide-spread. Relying on the convention can lead to using
a non-POD class that's declared using the struct class-key in
contexts that aren't prepared for such a type (although not
a direct result, pr90904, 90923, 90959 are examples of some of
the bugs that this might lead to).
The poor consistency with which the convention is adhered to makes
it easy for authors to miss that it exists. This can then lead to
inefficiencies in code reviews both for reviewers and for authors.
In addition, Clang users who build GCC are bothered by instances
of Clang's -Wmismatched-tags warning (see pr61339 and the recent
Clang includes -Wmismatched-tags in -Wall even on Linux. Although
-Wmismatched-tags is provided for compatibility with Visual C++
(and there to help avoid a potential ABI problem), the warning
points out the same lack of consistency in the GCC coding
convention: the type being sometimes declared as a struct and
other times as a class.
To make the code base consistent with the convention and enable
relying on the struct and class keywords having the intended
meaning, to reduce the time spent in code reviews on details
that an easily be caught earlier by out tools, and to avoid
the -Wmismatched-tags warnings when using Clang, the attached
patch kit does three things:
1) Implements three new warnings:
-Wstruct-not-pod triggers for struct definitions that are not
-Wclass-is-pod triggers for class definitions that satisfy
the requirements on POD structs,
and -Wmismatched-tags that triggers for class and struct
declarations with class-key that doesn't match either their
definition or the first declaration (if no definition is
provided). All three warnings have to be explicitly enabled
to have an effect.
2) Makes changes to definitions of GCC classes and structs to
avoid instances of the three new warnings.
3) Changes declarations of GCC classes and structs to match
the class-key used in their definition.
If/when the patch kit is approved I will enable the three
warnings for GCC builds. I expect to take the same approach as
with -Wformat-diag: first prevent any remaining instances of
the warnings from triggering errors, clean up or suppress
the remaining instances, and finally enable them to cause errors