https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88375

--- Comment #2 from David Malcolm <dmalcolm at gcc dot gnu.org> ---
Author: dmalcolm
Date: Wed Dec 19 15:22:27 2018
New Revision: 267276

URL: https://gcc.gnu.org/viewcvs?rev=267276&root=gcc&view=rev
Log:
C++: better locations for bogus initializations (PR c++/88375)

PR c++/88375 reports that errors relating to invalid conversions in
initializations are reported at unhelpfully vague locations, as in
e.g.:

enum struct a : int {
  one, two
};

struct foo {
  int e1, e2;
  a e3;
} arr[] = {
  { 1, 2, a::one },
  { 3, a::two },
  { 4, 5, a::two }
};

for which g++ trunk emits the vague:

pr88375.cc:12:1: error: cannot convert 'a' to 'int' in initialization
   12 | };
      | ^

with the error at the final closing brace.

This patch uses location information for the initializers, converting the
above to:

pr88375.cc:10:11: error: cannot convert 'a' to 'int' in initialization
   10 |   { 3, a::two },
      |        ~~~^~~
      |           |
      |           a

highlighting which subexpression is problematic, and its type.

Ideally we'd also issue a note showing the field decl being initialized,
but that turned out to be more invasive.

gcc/cp/ChangeLog:
        PR c++/88375
        * typeck.c (convert_for_assignment): Capture location of rhs
        before stripping, and if available.  Use the location when
        complaining about bad conversions, labelling it with the
        rhstype if the location was present.
        * typeck2.c (digest_init_r): Capture location of init before
        stripping.

gcc/testsuite/ChangeLog:
        PR c++/88375
        * g++.dg/init/pr88375-2.C: New test.
        * g++.dg/init/pr88375.C: New test.


Added:
    trunk/gcc/testsuite/g++.dg/init/pr88375-2.C
    trunk/gcc/testsuite/g++.dg/init/pr88375.C
Modified:
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/typeck.c
    trunk/gcc/cp/typeck2.c
    trunk/gcc/testsuite/ChangeLog

Reply via email to