<div dir="ltr"><div dir="ltr"><div>Hello everyone,</div><div>I'm writing to report what I think is an issue related to Class Template Argument Deduction (CTAD for short). Compiling this short snippet:</div><div><br></div><div><font size="1"><span style="font-family:monospace,monospace">#include <cstdio><br>#include <vector><br><br>template<typename T><br>void printV(const std::vector<T>& v)<br>{<br>    if (v.size() == 1) {<br>        printf("%d ", v[0]);<br>        return;<br>    }<br>    int middle = v.size()/2;<br>    printV(std::vector{v.begin(), v.end()+middle});<br>}<br><br>int main()<br>{<br>    std::vector<int> v = {10,1};<br>    printV(v);<br>    return 0;<br>}</span></font></div><div><font size="1"><span style="font-family:monospace,monospace"><br></span></font></div><div><font size="1"><span style="font-family:monospace,monospace"><font size="2"><font face="arial,helvetica,sans-serif">will
 result in clang generating an infinite error report (at least, I left it running for several hours, then I stopped the process...), due to (I guess) 
wrongly deducted template arguments. If the "printf" line is removed, no
 error is generated but clang will compile for what it looks like 
forever (the process is constantly at 100% and does not stop after 
several hours).</font></font></span></font></div><div><font size="1"><span style="font-family:monospace,monospace"><font size="2"><font face="arial,helvetica,sans-serif">This has been tested also with the following versions of clang: "Apple LLVM version 10.0.0 (clang-1000.10.44.4)", "clang version 7.0.1 (Fedora 7.0.1-6.fc29)". I also tested clang 8.0 and clang-HEAD on <a href="http://wandbox.org">wandbox.org</a> , with the same results (on <a href="http://wandbox.org">wandbox.org</a> the process gets killed after a while).</font></font></span></font></div><div><font size="1"><span style="font-family:monospace,monospace"><font size="2"><font face="arial,helvetica,sans-serif">Obviously this only happens when compiling with "--std=c++17" or "--std=c++2a".</font></font></span></font></div><div><font size="1"><span style="font-family:monospace,monospace"><font size="2"><font face="arial,helvetica,sans-serif">Strangely enough, I got more or less the same results with gcc (7, 8.3 and HEAD), so my guess is that this might be related to some ambiguity either on the standard or in its interpretation. Given that as far as I know, clang and gcc are using two completely unrelated parsers and frontends.<br></font></font></span></font></div><div><font size="1"><span style="font-family:monospace,monospace"><font size="2"><font face="arial,helvetica,sans-serif"><br></font></font></span></font></div><div><font size="1"><span style="font-family:monospace,monospace"><font size="2"><font face="arial,helvetica,sans-serif">Using () instead of {} will properly give a syntax error. So my guess is that this is related to both CTAD and uniform initialization because of std::vector having an std::initializer_list constructor. At least form what I could understand from the huge error output, it looks like the compiler is recursively instantiating std::vector<T> with T = std::initializer_list<some iterator type>, but this may be wrong.</font></font></span></font></div><div><font size="1"><span style="font-family:monospace,monospace"><font size="2"><font face="arial,helvetica,sans-serif"><br></font></font></span></font></div><div><font size="1"><span style="font-family:monospace,monospace"><font size="2"><font face="arial,helvetica,sans-serif">If required I can provide part of the huge error output, but it can be generated by compiling the provided snippet on wandbox. <br></font></font></span></font></div><div><font size="1"><span style="font-family:monospace,monospace"><font size="2"><font face="arial,helvetica,sans-serif"><br></font></font></span></font></div><div><font size="1"><span style="font-family:monospace,monospace"><font size="2"><font face="arial,helvetica,sans-serif">Thanks to anyone who can sort this out!</font></font></span></font></div><div><font size="1"><span style="font-family:monospace,monospace"><font size="2"><font face="arial,helvetica,sans-serif"><br></font></font></span></font></div><div><font size="1"><span style="font-family:monospace,monospace"><font size="2"><font face="arial,helvetica,sans-serif">Best regards,</font></font></span></font></div><div><font size="1"><span style="font-family:monospace,monospace"><font size="2"><font face="arial,helvetica,sans-serif"><br></font></font></span></font></div><div><font size="1"><span style="font-family:monospace,monospace"><font size="2"><font face="arial,helvetica,sans-serif">Lorenzo<br></font></font></span></font></div></div></div>