On Mar 20, 2018, Jason Merrill <ja...@redhat.com> wrote: > On Sat, Mar 17, 2018 at 8:13 AM, Alexandre Oliva <aol...@redhat.com> wrote: >> As we go through each of the template parameters, substituting it with >> corresponding template arguments, an incorrect argument list might >> cause us to index argument vectors past their length (or fail in the >> preceding tree checks). Avoid such dereferences and instead issue an >> error (if requested) if we find the argument index to be past the >> parameter vector length.
> Any time we hit this abort, it indicates a bug in earlier processing, > so that we're looking up a template parameter in an argument list for > a different template. That doesn't seem to be the case here. The argument list given for U is <T>, as in the testcase, the problem is that U is misdeclared as taking <int,int> <typename> (two template levels for a single template). Should we aim at rejecting the declaration of U? template<int,int> template<typename> using U=void; template<typename,typename> struct S1; template<typename T> struct S1<T,U<T>>{ template<typename> struct S2:S2<T>{}; }; -- Alexandre Oliva, freedom fighter http://FSFLA.org/~lxoliva/ You must be the change you wish to see in the world. -- Gandhi Be Free! -- http://FSFLA.org/ FSF Latin America board member Free Software Evangelist|Red Hat Brasil GNU Toolchain Engineer