diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/pt.c | 21 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/friend14.C | 20 |
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>(); } +}; |