This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
A function template instantiation fix
- To: egcs at cygnus dot com
- Subject: A function template instantiation fix
- From: Kriang Lerdsuwanakij <lerdsuwa at scf-fs dot usc dot edu>
- Date: Mon, 27 Oct 1997 19:26:54 -0800
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);
}