Commit 4d0839ff by Mark Mitchell Committed by Mark Mitchell

re PR c++/22139 (Segfault with templates and friend functions)

	PR c++/22139
	* cp-tree.h (DECL_TEMPLATE_INFO): Improve documentation.
	* decl.c (duplicate_decls): Re-register template specializations
	for functions that have DECL_TEMLPLATE_INFO, even if they do not
	have DECL_TEMPLATE_INSTANTIATION set.

	PR c++/22139
	* g++.dg/template/friend36.C: New test.

From-SVN: r102118
parent 17c999e8
2005-07-17 Mark Mitchell <mark@codesourcery.com>
PR c++/22139
* cp-tree.h (DECL_TEMPLATE_INFO): Improve documentation.
* decl.c (duplicate_decls): Re-register template specializations
for functions that have DECL_TEMLPLATE_INFO, even if they do not
have DECL_TEMPLATE_INSTANTIATION set.
2005-07-16 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 2005-07-16 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* call.c (diagnostic_fn_t): New. * call.c (diagnostic_fn_t): New.
......
...@@ -2056,8 +2056,24 @@ extern void decl_shadowed_for_var_insert (tree, tree); ...@@ -2056,8 +2056,24 @@ extern void decl_shadowed_for_var_insert (tree, tree);
#define DECL_DEFERRED_FN(DECL) \ #define DECL_DEFERRED_FN(DECL) \
(DECL_LANG_SPECIFIC (DECL)->decl_flags.deferred) (DECL_LANG_SPECIFIC (DECL)->decl_flags.deferred)
/* For a VAR_DECL, FUNCTION_DECL, TYPE_DECL or TEMPLATE_DECL: /* If non-NULL for a VAR_DECL, FUNCTION_DECL, TYPE_DECL or
template-specific information. */ TEMPLATE_DECL, the entity is a template specialization. In that
case, DECL_TEMPLATE_INFO is a TREE_LIST, whose TREE_PURPOSE is the
TEMPLATE_DECL of which this entity is a specialization. The TREE_
TREE_VALUE is the template arguments used to specialize the
template.
In general, DECL_TEMPLATE_INFO is non-NULL only if
DECL_USE_TEMPLATE is non-zero. However, for friends, we sometimes
have DECL_TEMPLATE_INFO even when DECL_USE_TEMPLATE is zero.
Consider:
template <typename T> struct S { friend void f(T) {} };
In this case, S<int>::f is, from the point of view of the compiler,
an instantiation of a template -- but, from the point of view of
the language, each instantiation of S results in a wholly unrelated
global function f. */
#define DECL_TEMPLATE_INFO(NODE) \ #define DECL_TEMPLATE_INFO(NODE) \
(DECL_LANG_SPECIFIC (VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK (NODE)) \ (DECL_LANG_SPECIFIC (VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK (NODE)) \
->decl_flags.u.template_info) ->decl_flags.u.template_info)
......
...@@ -1838,7 +1838,7 @@ duplicate_decls (tree newdecl, tree olddecl) ...@@ -1838,7 +1838,7 @@ duplicate_decls (tree newdecl, tree olddecl)
memcpy ((char *) olddecl + sizeof (struct tree_decl_common), memcpy ((char *) olddecl + sizeof (struct tree_decl_common),
(char *) newdecl + sizeof (struct tree_decl_common), (char *) newdecl + sizeof (struct tree_decl_common),
sizeof (struct tree_function_decl) - sizeof (struct tree_decl_common)); sizeof (struct tree_function_decl) - sizeof (struct tree_decl_common));
if (DECL_TEMPLATE_INSTANTIATION (newdecl)) if (DECL_TEMPLATE_INFO (newdecl))
/* If newdecl is a template instantiation, it is possible that /* If newdecl is a template instantiation, it is possible that
the following sequence of events has occurred: the following sequence of events has occurred:
......
2005-07-17 Mark Mitchell <mark@codesourcery.com>
PR c++/22139
* g++.dg/template/friend36.C: New test.
2005-07-16 David Edelsohn <edelsohn@gnu.org> 2005-07-16 David Edelsohn <edelsohn@gnu.org>
PR fortran/21730 PR fortran/21730
......
// PR c++/22139
// { dg-options "--param ggc-min-expand=0 --param ggc-min-heapsize=0" }
template <int rank, int dim> class Tensor;
template <int rank, int dim> struct SymmetricTensor {
SymmetricTensor (const Tensor<2,dim> &t);
friend void foo();
};
template <> SymmetricTensor<2,2>::SymmetricTensor (const Tensor<2,2> &t) {}
template <> SymmetricTensor<2,3>::SymmetricTensor (const Tensor<2,3> &t) {}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment