<html>
    <head>
      <base href="https://llvm.org/bugs/" />
    </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 --- - Missing error on explicit instantiation definition of undefined variable template"
   href="https://llvm.org/bugs/show_bug.cgi?id=28816">28816</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Missing error on explicit instantiation definition of undefined variable 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>normal
          </td>
        </tr>

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

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

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

        <tr>
          <th>Reporter</th>
          <td>john.brawn.123@gmail.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr></table>
      <p>
        <div>
        <pre>In the following example:

  template<int n> int var;
  template int var<0>;

We have the declaration of a variable template, then an explicit instantiation
definition of a specialization of that template.

C++14 section 14.7.2 paragraph 5 says

  For a given set of template arguments, if an explicit instantiation of a
template appears after a declaration
  of an explicit specialization for that template, the explicit instantiation
has no effect. Otherwise, for an
  explicit instantiation definition the definition of a function template, a
variable template, a member function
  template, or a member function or static data member of a class template
shall be present in every translation
  unit in which it is explicitly instantiated.

Here there is no declaration of an explicit specialization for the template, so
there must be a definition of the template. As there is not we must emit an
error. Instead clang appears to just ignore the explicit instantiation
definition. If we try to do the same thing with another kind of template, e.g.:

  template<int n> int fn();
  template int fn<0>();

then we correctly get an error:

  tmp.cpp:5:14: error: explicit instantiation of undefined function template
'fn'
  template int fn<0>();
               ^</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>