https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68699
Bug ID: 68699 Summary: Wrong location_t due to template instance canonicalization when setting location_t values on expressions Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: dmalcolm at gcc dot gnu.org Target Milestone: --- As discussed in the thread starting at https://gcc.gnu.org/ml/gcc-patches/2015-12/msg00449.html Testcase g++.dg/template/ref3.C: 1 // PR c++/28341 2 3 template<const int&> struct A {}; 4 5 template<typename T> struct B 6 { 7 A<(T)0> b; // { dg-error "constant|not a valid" } 8 A<T(0)> a; // { dg-error "constant|not a valid" } 9 }; 10 11 B<const int&> b; With c++98, with trunk (e.g. r231208), we get this output g++.dg/template/ref3.C: In instantiation of 'struct B<const int&>': g++.dg/template/ref3.C:11:15: required from here g++.dg/template/ref3.C:7:11: error: a cast to a type other than an integral or enumeration type cannot appear in a constant-expression g++.dg/template/ref3.C:8:11: error: a cast to a type other than an integral or enumeration type cannot appear in a constant-expression (locations 7:11 and 8:11 are at the closing semicolon for fields b and a) Upon updating the C++ FE to set up location_t values for expressions, in particular the bogus cast expressions (T)0 and T(0): A<(T)0> b; ^~~~ and: A<T(0)> a; ^~~~ both instantiations are reported at line 7, rather than at lines 7 and 8: g++.dg/template/ref3.C:7:5: error: a cast to a type other than an integral or enumeration type cannot appear in a constant-expression g++.dg/template/ref3.C:7:5: error: a cast to a type other than an integral or enumeration type cannot appear in a constant-expression This is because both instantiations are using a single RECORD_TYPE for the type A<(T)(0)>. We get a hit the 2nd time through this code in pt.c: 8282 entry = type_specializations->find_with_hash (&elt, hash); Hence when issuing both errors it uses the TREE_VEC of args for the first one, rather than the most pertinent location.