<html>
    <head>
      <base href="http://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 --- - Default template arguments are not used with injected-class-name of class template specialization"
   href="http://llvm.org/bugs/show_bug.cgi?id=19706">19706</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Default template arguments are not used with injected-class-name of class template specialization
          </td>
        </tr>

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

        <tr>
          <th>Version</th>
          <td>3.4
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>Other
          </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++
          </td>
        </tr>

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

        <tr>
          <th>Reporter</th>
          <td>hstong@ca.ibm.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>dgregor@apple.com, llvmbugs@cs.uiuc.edu
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr></table>
      <p>
        <div>
        <pre>When using the injected-class-name of a class template specialization as a
template-name, Clang does not pick up default arguments in the same way that it
would for a name denoting the class template itself.
Discussion on the core reflector indicates that the set of default template
arguments considered is ideally the merging of all default template arguments
from all declarations of the class template.
This difference in the ideal treatment of class templates as opposed to
functions stems from the more limited contexts where a class template may be
declared with default arguments.

GCC and ICC both accept the following.


### SOURCE:> cat defaultTmplArgsOnInjected.cc
template <typename T>  struct A {
   static void foo();
};

A<void> a; // refer to specialization before default arguments added

template <typename T = short> struct A;

template <> void A<void>::foo() { // use same specialization
   A< > *ap; // needs default argument to be transferred to the
injected-class-name
}
Return:  0x00:0


### COMPILER INVOCATION AND ACTUAL OUTPUT:> clang++ -std=c++03
defaultTmplArgsOnInjected.cc -c
defaultTmplArgsOnInjected.cc:10:4: error: too few template arguments for class
template 'A'
   A< > *ap; // needs default argument to be transferred to the
injected-class-name
   ^
defaultTmplArgsOnInjected.cc:1:31: note: template is declared here
template <typename T>  struct A {
~~~~~~~~~~~~~~~~~~~~~         ^
1 error generated.
Return:  0x01:1


### EXPECTED OUTPUT:
Clean compile.


### VERSION INFO:> clang++ -v
clang version 3.4 (tags/RELEASE_34/final)
Target: powerpc64-unknown-linux-gnu
Thread model: posix
Found candidate GCC installation: /usr/lib/gcc/ppc64-redhat-linux/4.4.4
Found candidate GCC installation: /usr/lib/gcc/ppc64-redhat-linux/4.4.6
Selected GCC installation: /usr/lib/gcc/ppc64-redhat-linux/4.4.6
Return:  0x00: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>