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
This commit is contained in:
Mark Mitchell 2003-06-20 05:52:43 +00:00 committed by Mark Mitchell
parent e2b9853b29
commit 00cf3e31fd
4 changed files with 34 additions and 2 deletions

View file

@ -1,5 +1,10 @@
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.

View file

@ -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

View file

@ -1,5 +1,8 @@
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.

View file

@ -0,0 +1,13 @@
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);
}