namespace NS
{
    typedef int X;

    template<typename T> void f(X f, T t) { }
}

template void f(X, int);     // (1)

template void f(int, char);  // (2)


The code is invalid, the explicit instantiations should be inside NS or should
be qualified e.g.
template void NS::func(X, int);

But the diagnostic for instantiation (1) is unhelpful:

bug.cc:8:17: error: variable or field 'f' declared void
bug.cc:8:16: error: expected ';' before '(' token

This is closely related to Bug 16663 but the diagnostic for (2) implies it
might be possible to improve things without fixing bug 16663, as this is much
better:

bug.cc:10:26: error: 'f' is not a template function

Is it possible to give the same "is not a template function" diagnostic for
(1)?

Comeau does significantly better, reporting:
   identifier "X" is undefined
and 
   "f" is not a class or function template name in the current scope



If the invalid instantiation is for a class template the diagnostic is fine:

namespace NS
{
    template<typename T> struct S;
}

template struct S<X>;

bug2.cc:6:17: error: 'S' is not a template
bug2.cc:6:19: error: 'X' was not declared in this scope
bug2.cc:6:17: error: explicit instantiation of non-template type 'S'

The only improvement I would make would be to add something like "in this
scope" to the first error.


Here's another bad diagnostic for instantiating a template function, which
doesn't have any undeclared type:

namespace NS
{
    template<int N> void g() { }
}

template void g<0>();

bug3.cc:6:15: error: variable or field 'g' declared void
bug3.cc:6:16: error: expected ';' before '<' token

Surely it's possible to say "g is not a template function" when the compiler
sees "template ... g<...>" ?

Comeau is much better again:

"ComeauTest.c", line 6: error: g is not a template,
        Should it be XX::g?, where XX is some namespace?
        Did you #include the right header?
  template void g<0>();
                ^

"ComeauTest.c", line 6: error: invalid explicit instantiation declaration
  template void g<0>();
           ^


-- 
           Summary: bad error recovery for explicit template instantiation
                    in wrong namespace
           Product: gcc
           Version: 4.5.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: jwakely dot gcc at gmail dot com


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

Reply via email to