<html>
    <head>
      <base href="https://bugs.llvm.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - Clang does not notice default template parameters in class templates"
   href="https://bugs.llvm.org/show_bug.cgi?id=40488">40488</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Clang does not notice default template parameters in class templates
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>new-bugs
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>trunk
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>other
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>new bugs
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>andres.zhukov@gmail.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>htmldeveloper@gmail.com, llvm-bugs@lists.llvm.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>tldr: If the class template has default parameters, but they are not declared
in the first forward declaration of that class, and when declaring an instance
of that class no angle brackets are specified, clang ignores the default
parameter and raises an error "no viable constructor or deduction guide for
deduction of template arguments of ...".

First found: 2019-01-24 on Windows 10 Education ver. 1803, using LLVM + Visual
Studio as well as normal clang toolchain.
Judging by godbolt showing same results, happens on linux as well.

This bug was documented on a StackOverflow question
(<a href="https://stackoverflow.com/q/54351543/9118363">https://stackoverflow.com/q/54351543/9118363</a>), where, aside from the things I
repeat here, there are good comments and discussion.

Example:

template <class T>
class Example;

template <class T = void>
class Example {};

int main() {
    Example e; // error: no viable constructor or deduction guide for deduction
of template arguments of 'Example'
}

Same example on godbolt (trunk): <a href="https://godbolt.org/z/OwjxDl">https://godbolt.org/z/OwjxDl</a>
If you move "= void" to the forward-decl, it compiles. Also compiles if you
replace "Example e" with "Example<> e".

C++ standard says (<a href="http://eel.is/c++draft/temp.param#12">http://eel.is/c++draft/temp.param#12</a>):
    [temp.param]/12 - The set of default template-arguments available for use
is obtained by merging the default arguments from all prior declarations of the
template in the same way default function arguments are [ Example:

    template<class T1, class T2 = int> class A;
    template<class T1 = int, class T2> class A;
    is equivalent to

    template<class T1 = int, class T2 = int> class A;
    — end example ]

This would make my example code equivalent to

template <class T = void>
class Example {};

int main() {
    Example e;
}

which compiles as expected.</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>