Commit 00cf3e31 by Mark Mitchell Committed by Mark Mitchell

re PR c++/10939 (ICE with templated code)

	PR c++/10939
	* pt.c (tsubst_decl): Do not try to substitute into non-dependent
	functions.
	(value_dependent_expression_p): Correct logic for FUNCTION_DECLs.

	PR c++/10939
	* g++.dg/template/func1.C: New test.

From-SVN: r68244
parent e2b9853b
2003-06-19 Mark Mitchell <mark@codesourcery.com>
PR c++/10939
* pt.c (tsubst_decl): Do not try to substitute into non-dependent
functions.
(value_dependent_expression_p): Correct logic for FUNCTION_DECLs.
PR c++/9649
* cp-tree.h (pushdecl_class_level): Change prototype.
(push_class_level_binding): Likewise.
......
......@@ -5909,6 +5909,17 @@ tsubst_decl (tree t, tree args, tree type, tsubst_flags_t complain)
if (TREE_CODE (DECL_TI_TEMPLATE (t)) == TEMPLATE_DECL)
{
tree spec;
bool dependent_p;
/* If T is not dependent, just return it. We have to
increment PROCESSING_TEMPLATE_DECL because
value_dependent_expression_p assumes that nothing is
dependent when PROCESSING_TEMPLATE_DECL is zero. */
++processing_template_decl;
dependent_p = value_dependent_expression_p (t);
--processing_template_decl;
if (!dependent_p)
return t;
/* Calculate the most general template of which R is a
specialization, and the complete set of arguments used to
......@@ -11368,8 +11379,8 @@ value_dependent_expression_p (tree expression)
/* A name declared with a dependent type. */
if (TREE_CODE (expression) == LOOKUP_EXPR
|| (DECL_P (expression)
&& dependent_type_p (TREE_TYPE (expression))))
|| (DECL_P (expression)
&& type_dependent_expression_p (expression)))
return true;
/* A non-type template parameter. */
if ((TREE_CODE (expression) == CONST_DECL
......
2003-06-19 Mark Mitchell <mark@codesourcery.com>
PR c++/10939
* g++.dg/template/func1.C: New test.
PR c++/9649
* g++.dg/template/static4.C: New test.
* g++.old-deja/g++.other/anon7.C: Remove spurious error messages.
......
template <typename T1,typename T2>
inline void f(const T1&,const T2&) { }
template <typename T1,typename T2,void F(const T1&,const T2&)>
struct A {
template <typename T> void g(T& i) { }
};
int main() {
int i;
A<int,int,f> a;
a.g(i);
}
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