I've finished my set of patches which fix -Wc++-compat to check for enum
conversions which are valid in C++. Adding those checks forced a lot of
changes in mainline to compile cleanly with -Wc++-compat. I have merged
those changes over to the gcc-in-cxx branch. In the gcc directory
itself, excluding changes to configure and Makefile, the gcc-in-cxx
branch compared to mainline is now
113 files changed, 1558 insertions(+), 1241 deletions(-)
Some of the remaining issues:
* C permits using the ++ and -- operators with a variable of enum type.
C++ does not (unless you explicit declare the operators, which for
purposes of -Wc++-compat I think we can assume to not occur).
* C permits defining a struct/enum/union within a struct/union and then
referring to the inner struct/enum/union outside of the enclosing
struct/union. C++ does not permit this--in C++ it has to be public
and you have to use a scope qualifier.
* C permits "struct s { }; typedef int s;". That is, you may reuse a
name as both a struct/enum/union tag and as a type. C++ does not
permit this.
* The C++ frontend warns about "while (true);" when there is no
whitespace between the ')' and the ';'. The C frontend does not. I'm
not sure how to best handle this. It doesn't make much sense to warn
about this with -Wc++-compat. Should the C frontend warn about this?
Should the C++ frontend not warn about this? Any opinions?
* In C an externally visible "inline" function (i.e., not "extern", not
"static") is assumed to be accessible outside of the current
translation unit (e.g., vn_nary_op_compute_hash in
gcc/tree-ssa-sccvn.c). In C++ this is not the case. It is also not
the case in C99, so this should be addressed anyhow, somehow, although
it doesn't seem to be a good fit for -Wc++-compat.
* In C a const variable which is neither "extern" nor "static" is
visible outside of the current translation unit. In C++ it is not,
without an explicit "extern" declaration. I'm not sure how best to
handle this with -Wc++-compat, since C does not permit initializing an
"extern const" variable.
* The C++ frontend does not support __attribute__ ((unused)) on labels.
The generator programs produce a lot of unused labels. Fixing this in
the C++ frontend may be awkward because C++ syntax permits a
declaration to follow a label, so it may not be clear which one gets
the attribute.
* The C++ frontend emits some warnings on code which is known to be
never executed, which the C frontend does not. This leads to some
warnings compiling code in gcc. I think it is reasonable to fix this
in the C++ frontend.
Ian