diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 15bf1a6f0c7..a18706b38c4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2003-09-19 Kriang Lerdsuwanakij + + PR c++/495 + * pt.c (tsubst_friend_class): Only use innermost template + arguments for the injected friend class template. + 2003-09-19 Nathan Sidwell PR c++/12332 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 28ed0bcd232..5e5af5b4c48 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -5001,6 +5001,8 @@ tsubst_friend_class (tree friend_tmpl, tree args) DECL_USE_TEMPLATE (tmpl) = 0; DECL_TEMPLATE_INFO (tmpl) = NULL_TREE; CLASSTYPE_USE_TEMPLATE (TREE_TYPE (tmpl)) = 0; + CLASSTYPE_TI_ARGS (TREE_TYPE (tmpl)) + = INNERMOST_TEMPLATE_ARGS (CLASSTYPE_TI_ARGS (TREE_TYPE (tmpl))); /* Inject this template into the global scope. */ friend_type = TREE_TYPE (pushdecl_top_level (tmpl)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2b1e5663464..77a2c4bd7aa 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-09-19 Kriang Lerdsuwanakij + + PR c++/495 + * g++.dg/template/friend24.C: New test. + 2003-09-19 Nathan Sidwell PR c++/12332 diff --git a/gcc/testsuite/g++.dg/template/friend24.C b/gcc/testsuite/g++.dg/template/friend24.C new file mode 100644 index 00000000000..5db4d31e721 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend24.C @@ -0,0 +1,27 @@ +// { dg-do compile } + +// Origin: Wolfgang Bangerth + +// PR c++/495: Fail to locate primary class template that is +// injected by friend declaration. + +template struct X +{ + template friend struct Y; +}; + +X<2> x; + +template struct Y +{ + void f (Y); + void g (Y); +}; + +template void Y::f (Y) +{ +} + +template void Y::g (Y) +{ +}