diff options
author | Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> | 2003-09-19 14:08:00 +0000 |
---|---|---|
committer | Kriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org> | 2003-09-19 14:08:00 +0000 |
commit | 68c788471ba4f3a2aa4e79c6fc2bf99218621bc3 (patch) | |
tree | d12f6f7ece81be97d1ded812e91f6979f2fe7b6e /gcc | |
parent | 472b0fbcf737e5a4211b70d65ea9e386c9d9eeef (diff) | |
download | gcc-68c788471ba4f3a2aa4e79c6fc2bf99218621bc3.zip gcc-68c788471ba4f3a2aa4e79c6fc2bf99218621bc3.tar.gz gcc-68c788471ba4f3a2aa4e79c6fc2bf99218621bc3.tar.bz2 |
re PR c++/495 (ICE in in lookup_template_class, at cp/pt.c:3961)
PR c++/495
* pt.c (tsubst_friend_class): Only use innermost template
arguments for the injected friend class template.
* g++.dg/template/friend24.C: New test.
From-SVN: r71574
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/friend24.C | 27 |
4 files changed, 40 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 15bf1a6f..a18706b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2003-09-19 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/495 + * pt.c (tsubst_friend_class): Only use innermost template + arguments for the injected friend class template. + 2003-09-19 Nathan Sidwell <nathan@codesourcery.com> PR c++/12332 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 28ed0bc..5e5af5b 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 2b1e566..77a2c4b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-09-19 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/495 + * g++.dg/template/friend24.C: New test. + 2003-09-19 Nathan Sidwell <nathan@codesourcery.com> 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 0000000..5db4d31 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend24.C @@ -0,0 +1,27 @@ +// { dg-do compile } + +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// PR c++/495: Fail to locate primary class template that is +// injected by friend declaration. + +template <int N> struct X +{ + template <int dim> friend struct Y; +}; + +X<2> x; + +template <int dim> struct Y +{ + void f (Y); + void g (Y); +}; + +template <int dim> void Y<dim>::f (Y) +{ +} + +template <int dim> void Y<dim>::g (Y<dim>) +{ +} |