diff options
author | Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> | 2003-01-09 13:55:46 +0000 |
---|---|---|
committer | Kriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org> | 2003-01-09 13:55:46 +0000 |
commit | 0f399e5f9b8b238932eeaba618f6baefd7bdd36c (patch) | |
tree | 61ec05e405f79cba389afca5e3e35514896a3ce6 /gcc | |
parent | c456a45a19096f2671694f3254fb4fad1dac17c7 (diff) | |
download | gcc-0f399e5f9b8b238932eeaba618f6baefd7bdd36c.zip gcc-0f399e5f9b8b238932eeaba618f6baefd7bdd36c.tar.gz gcc-0f399e5f9b8b238932eeaba618f6baefd7bdd36c.tar.bz2 |
pt.c (push_access_scope_real): Call push_to_top_level for function in namespace scope.
* 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.
* g++.dg/template/friend14.C: New test.
From-SVN: r61114
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>(); } +}; |