LLVM Bugzilla is read-only and represents the historical archive of all LLVM issues filled before November 26, 2021. Use github to submit LLVM bugs

Bug 51709 - The explicitly specialized primary template class shall supress consideration of other partial specialization
Summary: The explicitly specialized primary template class shall supress consideration...
Status: CONFIRMED
Alias: None
Product: clang
Classification: Unclassified
Component: C++ (show other bugs)
Version: trunk
Hardware: PC All
: P normal
Assignee: Unassigned Clang Bugs
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2021-09-01 19:50 PDT by jim X
Modified: 2021-09-02 15:53 PDT (History)
5 users (show)

See Also:
Fixed By Commit(s):


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description jim X 2021-09-01 19:50:40 PDT
template<class T> struct A {
  template<class T2> struct B {
     static const int value = 1;
  };                               // #1
  template<class T2> struct B<T2*> {
     static const int value = 2;
  };                          // #2
};

template<> template<class T2> struct A<short>::B {
    static const int value = 3;
};            // #3
int main(){
   std::cout<< A<short>::B<int*>::value;  // shall be 3
}

Clang give `2`, as per [temp.spec.partial.member] p2.   

> If a member template of a class template is partially specialized, the member template partial specializations are member templates of the enclosing class template; if the enclosing class template is instantiated ([temp.inst], [temp.explicit]), a declaration for every member template partial specialization is also instantiated as part of creating the members of the class template specialization. If the primary member template is explicitly specialized for a given (implicit) specialization of the enclosing class template, the partial specializations of the member template are ignored for this specialization of the enclosing class template. If a partial specialization of the member template is explicitly specialized for a given (implicit) specialization of the enclosing class template, the primary member template and its other partial specializations are still considered for this specialization of the enclosing class template.  

We explicitly specialized the primary template class `B` for enclosing class template specialization A<short>, hence the other partial specialization shall not be considered anymore.