This is the mail archive of the gcc@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]

A function template instantiation fix


Hi,

The patch below fix function template problems when some template
parameters does not appear in either function arguments or return type. 
They are not correctly instantiated.  Here is a simple test program that
fails during linking - f<long> and f<char> not instantiated and the f()
function calls in main() are not mangled.

#include <iostream.h>

template <class T> int f()
{
	return sizeof(T);
}

int main()
{
	cout << f<long>() << f<char>() << ' ' << f<long>() << endl;
}

*******************

Sun Oct 26 23:49:55 1997  Kriang Lerdsuwanakij <lerdsuwa@scf.usc.edu>

	* pt.c (tsubst): Instantiate template functions properly when 
	template parameter does not appear in function arguments and
	return type.
	(comp_template_args): Handle member templates required by 
	tsubst.

 
diff -u save/pt.c cp/pt.c
--- save/pt.c	Sun Oct 26 00:11:51 1997
+++ cp/pt.c	Sun Oct 26 23:49:55 1997
@@ -1157,7 +1157,13 @@
 	continue;
       if (TREE_CODE (nt) != TREE_CODE (ot))
 	return 0;
-      if (TREE_CODE_CLASS (TREE_CODE (ot)) == 't')
+      if (TREE_CODE (nt) == TREE_VEC)
+        {
+          /* For member templates */
+	  if (comp_template_args (nt, ot))
+	    continue;
+        }
+      else if (TREE_CODE_CLASS (TREE_CODE (ot)) == 't')
 	{
 	  if (comptypes (ot, nt, 1))
 	    continue;
@@ -2246,14 +2252,6 @@
 	    type = tsubst (type, args, nargs, in_decl);
 	  }
 
-	if (type == TREE_TYPE (t)
-	    && (! member || ctx == DECL_CLASS_CONTEXT (t)))
-	  {
-	    t = copy_node (t);
-	    copy_lang_decl (t);
-	    return t;
-	  }
-
 	/* Do we already have this instantiation?  */
 	if (DECL_TEMPLATE_INFO (t) != NULL_TREE)
 	  {
@@ -2262,7 +2260,8 @@
 
 	    for (; decls; decls = TREE_CHAIN (decls))
 	      if (TREE_TYPE (TREE_VALUE (decls)) == type
-		  && DECL_CLASS_CONTEXT (TREE_VALUE (decls)) == ctx)
+		  && DECL_CLASS_CONTEXT (TREE_VALUE (decls)) == ctx
+		  && comp_template_args (TREE_PURPOSE (decls), args))
 		return TREE_VALUE (decls);
 	  }


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