[Bug c++/84692] New: Class template argument deduction ICE for template's member template

columbo@gmx-topmail.de gcc-bugzilla@gcc.gnu.org
Sat Mar 3 16:23:00 GMT 2018


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

            Bug ID: 84692
           Summary: Class template argument deduction ICE for template's
                    member template
           Product: gcc
           Version: 8.0.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: columbo@gmx-topmail.de
  Target Milestone: ---

template <typename... Ts>
struct X {
    template <typename U>
    struct Y {
        Y(U, Ts const&... );
    };

    friend void begin(X) {
      Y{0, Ts{}...};
    }
};

int main() {
  begin(X<int>{});
}

---------------

prog.cc: In substitution of 'template<class Iter> iterator(Iter, const Ts&
...)-> incrementing_range<Ts ...>::iterator<Iter> [with Iter = 128]':
prog.cc:9:7:   required from 'void begin(incrementing_range<int>)'
prog.cc:14:34:   required from here
prog.cc:9:7: internal compiler error: in tsubst, at cp/pt.c:13992
       iterator{0, Ts{}...};
       ^~~~~~~~

---------------

I can't reduce this any further. 

Oddly, Clang claims this is ill-formed, while I reckon this should compile,
although I haven't delved into the wording to see what it mandates regarding
template members. Perhaps iterator is treated as the qualified-id X::Y, and the
compilers attempt to deduce Ts, which fails?


More information about the Gcc-bugs mailing list