[Bug c++/60679] New: class specialization not instantiated even though it is a better match than the primary template

filip.roseen at gmail dot com gcc-bugzilla@gcc.gnu.org
Thu Mar 27 01:48:00 GMT 2014


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60679

            Bug ID: 60679
           Summary: class specialization not instantiated even though it
                    is a better match than the primary template
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: filip.roseen at gmail dot com

Created attachment 32463
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=32463&action=edit
testcase.cpp

template<int...> struct A { };        // (A)

template<char X, char Y>
struct A<X, Y> { typedef int type; }; // (B)

int main () {
  (void) A<0, 0>::type { };
}

-------------------------------------------------------------------------------

testcase.cpp: In function ‘int main()’:
testcase.cpp:7:10: error: ‘type’ is not a member of ‘A<0, 0>’
   (void) A<0, 0>::type { };
          ^
-------------------------------------------------------------------------------

Note: `clang` correctly accepts `testcase.cpp`.

-------------------------------------------------------------------------------

This is how it should look, but gcc fails on step 4);

 1. first our primary template `(A)` is looked up, and our template
    arguments are deduced from those specified for this primary template

 2. we then look for specializations, `(B)` should be found

 3. `(B)` is more specialized than our primary template, proceed

 4. `(B)` should be selected if no narrowing-conversion applies to
    instantiating it, which is true; `int { 0 }` fits inside `char`

    Note: A non-narrowing conversion can be proved since `0` is a
          constant-expression and can fit inside `char`, see
          [dcl.init.list]p7

 5. `(B)` is the best candidate, instantiate it

-------------------------------------------------------------------------------


[temp.class.spec.match]p4:

  > The templates arguments of a specializaton are deduced from the arguments
  > of the primary template.


[temp.class.spec]p6 states the following:

  > Partial specializations declarations themselves are not found by name
  > lookup. Rather, when the primary template name is used, any
  > previously-declared partial specializations of the primary template
  > are also considered.

-------------------------------------------------------------------------------


More information about the Gcc-bugs mailing list