if (FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) {
// Implicit instantiation of function templates and member functions of
// class templates.
- if (!Function->getBody()) {
- // FIXME: distinguish between implicit instantiations of function
- // templates and explicit specializations (the latter don't get
- // instantiated, naturally).
- if (Function->getInstantiatedFromMemberFunction() ||
- Function->getPrimaryTemplate())
- PendingImplicitInstantiations.push_back(std::make_pair(Function, Loc));
- }
-
+ if (!Function->getBody() &&
+ Function->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
+ PendingImplicitInstantiations.push_back(std::make_pair(Function, Loc));
// FIXME: keep track of references to static functions
Function->setUsed(true);
namespace N0 {
template<> void X0<volatile void>::f1(void *) { } // expected-error{{no function template matches}}
+
+ template<> void X0<const volatile void*>::f1(const volatile void*);
+}
+
+void test_x0_cvvoid(N0::X0<const volatile void*> x0, const volatile void *cvp) {
+ x0.f1(cvp); // okay: we've explicitly specialized
}
#if 0