re PR c++/63201 (Full specialization of a member variable template of a class template does not work)
PR c++/63201 * decl.c (start_decl): Handle specialization of member variable template. * pt.c (check_explicit_specialization): Adjust error. From-SVN: r215226
This commit is contained in:
parent
b6f866946b
commit
4ee28eb7ce
5 changed files with 91 additions and 13 deletions
|
@ -1,3 +1,10 @@
|
|||
2014-09-11 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/63201
|
||||
* decl.c (start_decl): Handle specialization of member variable
|
||||
template.
|
||||
* pt.c (check_explicit_specialization): Adjust error.
|
||||
|
||||
2014-09-11 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/61489
|
||||
|
|
|
@ -4659,20 +4659,24 @@ start_decl (const cp_declarator *declarator,
|
|||
if (field == NULL_TREE
|
||||
|| !(VAR_P (field) || variable_template_p (field)))
|
||||
error ("%q+#D is not a static data member of %q#T", decl, context);
|
||||
else if (variable_template_p (field) && !this_tmpl)
|
||||
{
|
||||
if (DECL_LANG_SPECIFIC (decl)
|
||||
&& DECL_TEMPLATE_SPECIALIZATION (decl))
|
||||
/* OK, specialization was already checked. */;
|
||||
else
|
||||
{
|
||||
error_at (DECL_SOURCE_LOCATION (decl),
|
||||
"non-member-template declaration of %qD", decl);
|
||||
inform (DECL_SOURCE_LOCATION (field), "does not match "
|
||||
"member template declaration here");
|
||||
return error_mark_node;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (variable_template_p (field))
|
||||
{
|
||||
if (!this_tmpl)
|
||||
{
|
||||
error_at (DECL_SOURCE_LOCATION (decl),
|
||||
"non-member-template declaration of %qD", decl);
|
||||
inform (DECL_SOURCE_LOCATION (field), "does not match "
|
||||
"member template declaration here");
|
||||
return error_mark_node;
|
||||
}
|
||||
field = DECL_TEMPLATE_RESULT (field);
|
||||
}
|
||||
field = DECL_TEMPLATE_RESULT (field);
|
||||
|
||||
if (DECL_CONTEXT (field) != context)
|
||||
{
|
||||
|
|
|
@ -2471,7 +2471,7 @@ check_explicit_specialization (tree declarator,
|
|||
template <class T> void f<int>(); */
|
||||
|
||||
if (uses_template_parms (declarator))
|
||||
error ("function template partial specialization %qD "
|
||||
error ("non-type partial specialization %qD "
|
||||
"is not allowed", declarator);
|
||||
else
|
||||
error ("template-id %qD in declaration of primary template",
|
||||
|
|
67
gcc/testsuite/g++.dg/cpp1y/var-templ11.C
Normal file
67
gcc/testsuite/g++.dg/cpp1y/var-templ11.C
Normal file
|
@ -0,0 +1,67 @@
|
|||
// PR c++/63201
|
||||
// { dg-do compile { target c++14 } }
|
||||
|
||||
template <class T>
|
||||
struct Y
|
||||
{
|
||||
template <class U> static U x;
|
||||
};
|
||||
|
||||
template <class T>
|
||||
template <class U>
|
||||
U Y<T>::x = U();
|
||||
|
||||
template <>
|
||||
template <class U>
|
||||
U Y<int>::x = 42;
|
||||
|
||||
template <>
|
||||
template <class U>
|
||||
// odd diagnostic
|
||||
U Y<float>::x<U> = 42; // { dg-error "partial specialization" }
|
||||
|
||||
template <>
|
||||
template <>
|
||||
int Y<float>::x<int> = 42; // { dg-bogus "non-member-template declaration" }
|
||||
|
||||
template <class T>
|
||||
struct Z
|
||||
{
|
||||
template <class U> struct ZZ
|
||||
{
|
||||
template <class V> static V x;
|
||||
};
|
||||
};
|
||||
|
||||
template <class T>
|
||||
template <class U>
|
||||
template <class V>
|
||||
V Z<T>::ZZ<U>::x = V();
|
||||
|
||||
template <>
|
||||
template <>
|
||||
template <class V>
|
||||
V Z<int>::ZZ<int>::x = V();
|
||||
|
||||
template <>
|
||||
template <class U>
|
||||
struct Z<float>::ZZ
|
||||
{
|
||||
template <class V> static V x;
|
||||
};
|
||||
|
||||
template <>
|
||||
template <class U>
|
||||
template <class V>
|
||||
V Z<float>::ZZ<U>::x = V();
|
||||
|
||||
template <>
|
||||
template <>
|
||||
template <>
|
||||
int Z<float>::ZZ<int>::x<int> = 42; // { dg-bogus "non-member-template declaration" }
|
||||
|
||||
int main()
|
||||
{
|
||||
int y = Y<int>::x<int>;
|
||||
int z = Z<float>::ZZ<int>::x<int>;
|
||||
}
|
|
@ -4,7 +4,7 @@
|
|||
template <int nlimb, int i>
|
||||
inline unsigned f (unsigned* ptr);
|
||||
template <int nlimb>
|
||||
inline unsigned f<nlimb,nlimb> (unsigned* ptr) // { dg-error "function template partial specialization" }
|
||||
inline unsigned f<nlimb,nlimb> (unsigned* ptr) // { dg-error "partial specialization" }
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue