aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/pt.c21
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/template/friend14.C20
4 files changed, 45 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 17626a9..cb9c612 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2003-01-09 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+ * pt.c (push_access_scope_real): Call push_to_top_level for
+ function in namespace scope.
+ (pop_access_scope): Call pop_from_top_level for function in
+ namespace scope.
+
2003-01-09 Jakub Jelinek <jakub@redhat.com>
* decl.c (start_decl): Don't set DECL_COMMON for __thread variables.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index b63443b..7802e25 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -209,16 +209,21 @@ push_access_scope_real (t, args, context)
if (spec)
t = spec;
}
-
- saved_access_scope = tree_cons
- (NULL_TREE, current_function_decl, saved_access_scope);
- current_function_decl = t;
}
if (!context)
context = DECL_CONTEXT (t);
if (context && TYPE_P (context))
push_nested_class (context, 2);
+ else
+ push_to_top_level ();
+
+ if (TREE_CODE (t) == FUNCTION_DECL || DECL_FUNCTION_TEMPLATE_P (t))
+ {
+ saved_access_scope = tree_cons
+ (NULL_TREE, current_function_decl, saved_access_scope);
+ current_function_decl = t;
+ }
}
/* Like push_access_scope_real, but always uses DECL_CONTEXT. */
@@ -237,14 +242,16 @@ void
pop_access_scope (t)
tree t;
{
- if (DECL_CLASS_SCOPE_P (t))
- pop_nested_class ();
-
if (TREE_CODE (t) == FUNCTION_DECL || DECL_FUNCTION_TEMPLATE_P (t))
{
current_function_decl = TREE_VALUE (saved_access_scope);
saved_access_scope = TREE_CHAIN (saved_access_scope);
}
+
+ if (DECL_CLASS_SCOPE_P (t))
+ pop_nested_class ();
+ else
+ pop_from_top_level ();
}
/* Do any processing required when DECL (a member template
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 413a12e..8168b98 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2003-01-09 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+ * g++.dg/template/friend14.C: New test.
+
2003-01-09 Eric Botcazou <ebotcazou@libertysurf.fr>
* gcc.dg/old-style-asm-1.c: New test.
diff --git a/gcc/testsuite/g++.dg/template/friend14.C b/gcc/testsuite/g++.dg/template/friend14.C
new file mode 100644
index 0000000..6e07b98
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/friend14.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// Perform access checking to parameter and return type of
+// function template correctly when the template is friend.
+
+template <class T> class O {
+ struct I { I (int); };
+
+ template <class T_>
+ friend typename O<T_>::I f ();
+};
+
+template <class T_>
+typename O<T_>::I f () { return 1; }
+
+struct X {
+ void g() { f<int>(); }
+};