re PR c++/15096 (parse error with templates and pointer to const member)

PR c++/15096
	* decl.c (grokdeclarator): Ignore pointer-to-members when
	computing template depth.

	PR c++/14930
	* name-lookup.c (pushtag): Do not try to put class declarations in
	explicit specialization scopes.

	PR c++/15096
	* g++.dg/template/ptrmem10.C: New test.

	PR c++/14930
	* g++.dg/template/friend30.C: New test.

From-SVN: r83112
This commit is contained in:
Mark Mitchell 2004-06-14 15:58:54 +00:00 committed by Mark Mitchell
parent f3207b37d3
commit 7c82a41e7f
6 changed files with 83 additions and 19 deletions

View File

@ -1,3 +1,13 @@
2004-06-14 Mark Mitchell <mark@codesourcery.com>
PR c++/15096
* decl.c (grokdeclarator): Ignore pointer-to-members when
computing template depth.
PR c++/14930
* name-lookup.c (pushtag): Do not try to put class declarations in
explicit specialization scopes.
2004-06-11 Andrew Pinski <pinskia@physics.uc.edu>
* decl.c (grokdeclarator): Do not depend on C99's _Bool's behavior.

View File

@ -7599,27 +7599,28 @@ grokdeclarator (tree declarator,
ctype = TREE_OPERAND (declarator, 0);
t = ctype;
while (t != NULL_TREE && CLASS_TYPE_P (t))
{
/* You're supposed to have one `template <...>'
for every template class, but you don't need one
for a full specialization. For example:
if (TREE_CODE (TREE_OPERAND (declarator, 1)) != INDIRECT_REF)
while (t != NULL_TREE && CLASS_TYPE_P (t))
{
/* You're supposed to have one `template <...>'
for every template class, but you don't need one
for a full specialization. For example:
template <class T> struct S{};
template <> struct S<int> { void f(); };
void S<int>::f () {}
is correct; there shouldn't be a `template <>' for
the definition of `S<int>::f'. */
if (CLASSTYPE_TEMPLATE_INFO (t)
&& (CLASSTYPE_TEMPLATE_INSTANTIATION (t)
|| uses_template_parms (CLASSTYPE_TI_ARGS (t)))
&& PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)))
template_count += 1;
t = TYPE_MAIN_DECL (t);
t = DECL_CONTEXT (t);
}
is correct; there shouldn't be a `template <>' for
the definition of `S<int>::f'. */
if (CLASSTYPE_TEMPLATE_INFO (t)
&& (CLASSTYPE_TEMPLATE_INSTANTIATION (t)
|| uses_template_parms (CLASSTYPE_TI_ARGS (t)))
&& PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)))
template_count += 1;
t = TYPE_MAIN_DECL (t);
t = DECL_CONTEXT (t);
}
if (sname == NULL_TREE)
goto done_scoping;

View File

@ -4635,7 +4635,16 @@ pushtag (tree name, tree type, int globalize)
timevar_push (TV_NAME_LOOKUP);
b = current_binding_level;
while (b->kind == sk_cleanup
while (/* Cleanup scopes are not scopes from the point of view of
the language. */
b->kind == sk_cleanup
/* Neither are the scopes used to hold template parameters
for an explicit specialization. For an ordinary template
declaration, these scopes are not scopes from the point of
view of the language -- but we need a place to stash
things that will go in the containing namespace when the
template is instantiated. */
|| (b->kind == sk_template_parms && b->explicit_spec_p)
|| (b->kind == sk_class
&& (globalize
/* We may be defining a new type in the initializer

View File

@ -1,3 +1,11 @@
2004-06-14 Mark Mitchell <mark@codesourcery.com>
PR c++/15096
* g++.dg/template/ptrmem10.C: New test.
PR c++/14930
* g++.dg/template/friend30.C: New test.
2004-06-14 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/14928

View File

@ -0,0 +1,15 @@
// PR c++/14930
template<typename T> class Point;
template<> class Point<double> {
friend class Plane;
double v;
};
struct Plane {
double get(const Point<double>& p);
};
double Plane::get(const Point<double> &p) { return p.v; }

View File

@ -0,0 +1,21 @@
// PR c++/15096
template <typename T_>
class C1
{
public:
C1 ();
~C1 ();
const int C1<T_>::* getPtr () const;
private:
int x;
T_ y;
};
template <typename T_>
const int C1<T_>::* C1<T_>::getPtr () const
{ return &C1<T_>::x; }