https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92974
Bug ID: 92974 Summary: diagnostic missing source information Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: barry.revzin at gmail dot com Target Milestone: --- Here's the best reduction I was able to come up with thanks to creduce: # 1 "" 3 typedef unsigned char a; typedef unsigned b; enum { c }; class d { public: template <typename e> int f(e const &, a const *, b); }; template <typename e> d::f(e const &, a const *, b) { b g(c ?: g); } int h; unsigned char i; long j; class k { l() { m.f(h, &i, j); } d m; }; If you compile that snipped with -Wall -Wextra, you get: : In instantiation of ‘int d::f(const e&, const a*, b) [with e = int; a = unsigned char; b = unsigned int]’: :15:21: required from here cc1plus: warning: enumeral and non-enumeral type in conditional expression [-Wextra] The warning comes from cc1plus and has no source information attached to it. The comparison is on line 11, but the source printed is line 15 - which is the declaration of "class k". The kind of diagnostic I'd expect is (from a different reduction): reduction.cpp:4:21: warning: enumeral and non-enumeral type in conditional expression [-Wextra] 4 | void b() { long c(a ?: c); } | ~~^~~~ That is, actually pointing me to _where_ the comparison happens.