mbox series

[RFC,v3,00/11] C++: locations for (almost) everything (PR 43486)

Message ID 1510973563-10046-1-git-send-email-dmalcolm@redhat.com
Headers show
Series C++: locations for (almost) everything (PR 43486) | expand

Message

David Malcolm Nov. 18, 2017, 2:52 a.m. UTC
Here's a follow-up patch kit to v2 which extends the C++ FE to capture
source location information for *all* constants and uses-of-decls,
not just at callsites like v2 does.

I kept the simplifying restriction of not adding wrapper nodes when
processing_template_decl.

Unfortunately it's not complete, but given that the end of stage 1
is on us, I thought I'd post what I have.

Much of the kit involves stripping away the wrapper nodes whenever
we need to look at the TREE_CODE of an expression.

Limitations:
* it doesn't bootstrap yet; with a --disable-bootstrap build the
  regression tests mostly work (332 new FAILs on x86_64-pc-linux-gnu,
  out of ~330k tests).  I've been frantically trying to fix all of
  these, but I seem to be reaching the harder issues and it's clear
  I'm not going to be done.

* only tested so far on x86_64-pc-linux-gnu; I'm fairly sure there
  are target-specific attribute handlers that would need fixing.

* no performance data yet.

* the kit doesn't *use* the locations.  There are dozens of
  diagnostics that are implicitly using input_location, which could
  be improved by using an EXPR_LOCATION, given that we'd be able to
  guarantee that we had locations for every expression, which would
  give lots of little usability wins.

...but it looks like I'm out of time for gcc8 stage1.

Does this approach look promising for gcc 9?

For gcc 8, I'd like to ensure that we have location_t values
for all arguments at C++ callsites; the v2 version of the kit would
do that, alternatively there's the:

  "[PATCH] C++: use an optional vec<location_t> for callsites"
    https://gcc.gnu.org/ml/gcc-patches/2017-08/msg01392.html

approach.

Thoughts?
Dave

David Malcolm (11):
  C++: Add location wrappers for all constants and decls
  cp_tree::maybe_add_location_wrapper: no-op for template decls
  Implement STRIP_ANY_LOCATION_WRAPPER_SAFE
  C++: add cp_expr::strip_any_location_wrapper method
  C++: finish_call_expr: strip location wrapper
  gcc: Handle location wrappers in operand_equal_p
  c-family: handle location wrappers
  C++: handle location wrappers
  objc: handle location wrappers in objc_maybe_build_component_ref
  i386: handle location wrappers in ix86_handle_cconv_attribute
  config: handle location wrappers in various attributes (untested)

 gcc/c-family/c-attribs.c       |   1 +
 gcc/c-family/c-common.c        |   9 ++++
 gcc/c-family/c-format.c        |   2 +
 gcc/c-family/c-warn.c          |  25 ++++++----
 gcc/config/arc/arc.c           |   2 +
 gcc/config/epiphany/epiphany.c |   3 ++
 gcc/config/i386/i386.c         |   1 +
 gcc/config/ia64/ia64.c         |   1 +
 gcc/config/m32r/m32r.c         |   2 +
 gcc/config/mips/mips.c         |   2 +
 gcc/config/msp430/msp430.c     |   2 +-
 gcc/config/s390/s390.c         |   2 +
 gcc/cp/call.c                  |   7 +++
 gcc/cp/class.c                 |   1 +
 gcc/cp/constexpr.c             |   1 +
 gcc/cp/cp-tree.h               |  17 +++++--
 gcc/cp/cvt.c                   |   1 +
 gcc/cp/decl.c                  |   4 ++
 gcc/cp/expr.c                  |   2 +
 gcc/cp/lambda.c                |   3 ++
 gcc/cp/name-lookup.c           |   1 +
 gcc/cp/parser.c                |  94 +++++++++++++++++++++----------------
 gcc/cp/pt.c                    |  10 +++-
 gcc/cp/semantics.c             | 102 +++++++++++++++++++++++++++++------------
 gcc/cp/tree.c                  |   8 ++++
 gcc/cp/typeck.c                |  25 ++++++++--
 gcc/cp/typeck2.c               |   4 ++
 gcc/fold-const.c               |   3 ++
 gcc/objc/objc-act.c            |   2 +
 gcc/tree.c                     |   1 +
 gcc/tree.h                     |   8 ++++
 31 files changed, 260 insertions(+), 86 deletions(-)