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

Reply via email to