This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[C++ PATCH] Template parameter bug fix
- To: gcc-patches at gcc dot gnu dot org
- Subject: [C++ PATCH] Template parameter bug fix
- From: Kriang Lerdsuwanakij <lerdsuwa at scf dot usc dot edu>
- Date: Thu, 21 Sep 2000 00:52:21 -0700 (PDT)
Hi
The following patch fixes a bug reported yesterday (archived at
http://gcc.gnu.org/ml/gcc-bugs/2000-09/msg00519.html).
When we reduce the level of template parameters, we forget to
set DECL_ARTIFICIAL and DECL_TEMPLATE_PARM_P for the
new set of template parameters. This can cause compilation errors
in certain cases involving member templates.
--Kriang
ChangeLog:
2000-09-21 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
* pt.c (reduce_template_parm_level): Set DECL_ARTIFICIAL and
DECL_TEMPLATE_PARM_P.
diff -cprN gcc-old/cp/pt.c gcc/cp/pt.c
*** gcc-old/cp/pt.c Thu Sep 21 00:39:37 2000
--- gcc/cp/pt.c Thu Sep 21 00:39:05 2000
*************** reduce_template_parm_level (index, type,
*** 1765,1770 ****
--- 1765,1773 ----
decl, type);
TEMPLATE_PARM_DESCENDANTS (index) = t;
+ DECL_ARTIFICIAL (decl) = 1;
+ SET_DECL_TEMPLATE_PARM_P (decl);
+
/* Template template parameters need this. */
DECL_TEMPLATE_PARMS (decl)
= DECL_TEMPLATE_PARMS (TEMPLATE_PARM_DECL (index));
diff -cprN gcc-old/testsuite/g++.old-deja/g++.pt/ttp64.C gcc/testsuite/g++.old-deja/g++.pt/ttp64.C
*** gcc-old/testsuite/g++.old-deja/g++.pt/ttp64.C Wed Dec 31 16:00:00 1969
--- gcc/testsuite/g++.old-deja/g++.pt/ttp64.C Thu Sep 21 00:40:23 2000
***************
*** 0 ****
--- 1,58 ----
+ // Build don't link:
+
+ // Origin: David Margery <David.Margery@irisa.fr>
+
+ // Bug: We fail to set DECL_TEMPLATE_PARM_P when reducing template
+ // parameter level.
+
+ template <class T> class A2 {
+ public:
+ A2() {};
+ virtual ~A2() {};
+ template <class other> A2 & operator=(const A2<other> o) {
+ i=o.i;
+ return *this;
+ };
+ T i;
+ T j;
+ };
+
+ template <class T> class A1 {
+ public:
+ A1() {};
+ virtual ~A1() {};
+ template <class other> A1 & operator=(const A1<other> o) {
+ i=o.i;
+ return *this;
+ };
+ template <class other> A1 & operator=(const A2<other> o) {
+ i=o.i;
+ return *this;
+ };
+ T i;
+ };
+
+ template <template <class U> class T> class B {
+ public:
+ B(){};
+ virtual ~B(){};
+ template <template <class U2> class O> struct rebind { typedef B<O> other ;};
+ template <template <class U2> class O> B & operator=(const B<O> o) {
+ i=o.i;
+ return *this;
+ };
+ T<int> i;
+ };
+
+ int main(int argc, char *argv[]) {
+
+ A1<int> a1;
+ A1<long> a2;
+ a1=a2;
+
+ B<A1 > b1;
+ B<A2 > b2;
+ b1=b2;
+
+ return 0;
+ }