[LLVMbugs] [Bug 19706] New: Default template arguments are not used with injected-class-name of class template specialization

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Sat May 10 13:33:57 PDT 2014


http://llvm.org/bugs/show_bug.cgi?id=19706

            Bug ID: 19706
           Summary: Default template arguments are not used with
                    injected-class-name of class template specialization
           Product: clang
           Version: 3.4
          Hardware: Other
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: C++
          Assignee: unassignedclangbugs at nondot.org
          Reporter: hstong at ca.ibm.com
                CC: dgregor at apple.com, llvmbugs at cs.uiuc.edu
    Classification: Unclassified

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

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20140510/98aeb163/attachment.html>


More information about the llvm-bugs mailing list