This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[C++ PATCH] Template parameter bug fix


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;
+ }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]