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