<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 - compilation of CRTP fails if the ABC is after template"
   href="https://bugs.llvm.org/show_bug.cgi?id=38301">38301</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>compilation of CRTP fails if the ABC is after template
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>clang
          </td>
        </tr>

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

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

        <tr>
          <th>OS</th>
          <td>Linux
          </td>
        </tr>

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

        <tr>
          <th>Severity</th>
          <td>enhancement
          </td>
        </tr>

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

        <tr>
          <th>Component</th>
          <td>C++
          </td>
        </tr>

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

        <tr>
          <th>Reporter</th>
          <td>zhonghao@pku.org.cn
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>dgregor@apple.com, llvm-bugs@lists.llvm.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>the compilation of a curious recuring template fails if the base class for the
instantiation of the curious recuring template pattern (CRTP) is defined after
the template but before its instantiation.

The following code demonstrates the problem. If uncommenting the outcommented
section and commenting out the latter appearance of the same code, it compiles
successfully.

#include <iostream>

using namespace std;

/*
struct Client
{
        void visit(const class A &a)
        { cout << "Client::visit(const A &)" << endl; }
};

struct MYABC
{
        virtual void runVisitor(class Client &) const = 0;
};
*/

template <class Derived, class ABC>
struct Door : public ABC
{
        Door()
        : ABC()
        { }

        void runVisitor(class Client &) const;
};

template <class Derived, class ABC>
void Door<Derived,ABC>::runVisitor(class Client &c) const
{ c.visit(static_cast<const Derived &>(*this)); }

struct Client
{
        void visit(const class A &a)
        { cout << "Client::visit(const A &)" << endl; }
};

struct MYABC
{
        virtual void runVisitor(class Client &) const = 0;
};

struct A : public Door<A,MYABC>
{
};</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>