mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-29 08:20:27 +08:00
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:
parent
f3207b37d3
commit
7c82a41e7f
@ -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.
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
15
gcc/testsuite/g++.dg/template/friend30.C
Normal file
15
gcc/testsuite/g++.dg/template/friend30.C
Normal 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; }
|
||||
|
21
gcc/testsuite/g++.dg/template/ptrmem10.C
Normal file
21
gcc/testsuite/g++.dg/template/ptrmem10.C
Normal 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; }
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user