aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2004-06-14 15:58:54 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2004-06-14 15:58:54 +0000
commit7c82a41e7f18796040b3e6effbf6c483b7beb915 (patch)
tree3899c5cea0f22109ff80c76fd4ccd139aedf8dd4 /gcc
parentf3207b37d34107210fda3f7b3bc999ac7537d7c0 (diff)
downloadgcc-7c82a41e7f18796040b3e6effbf6c483b7beb915.zip
gcc-7c82a41e7f18796040b3e6effbf6c483b7beb915.tar.gz
gcc-7c82a41e7f18796040b3e6effbf6c483b7beb915.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog10
-rw-r--r--gcc/cp/decl.c37
-rw-r--r--gcc/cp/name-lookup.c11
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/g++.dg/template/friend30.C15
-rw-r--r--gcc/testsuite/g++.dg/template/ptrmem10.C21
6 files changed, 83 insertions, 19 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index cb18209..d99aef0 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 950bac1..417171e 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -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;
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index d470251..3e42f3b 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 02da20e..0bff3ab 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/g++.dg/template/friend30.C b/gcc/testsuite/g++.dg/template/friend30.C
new file mode 100644
index 0000000..055fc8d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/friend30.C
@@ -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; }
+
diff --git a/gcc/testsuite/g++.dg/template/ptrmem10.C b/gcc/testsuite/g++.dg/template/ptrmem10.C
new file mode 100644
index 0000000..b76d5e8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/ptrmem10.C
@@ -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; }
+
+