From: Mark Mitchell Date: Fri, 20 Jun 2003 05:52:43 +0000 (+0000) Subject: re PR c++/10939 (ICE with templated code) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=00cf3e31fd7934e7876c096e85b39e38c05275fc;p=gcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ba7bc03346a..32532d886cc 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2003-06-19 Mark Mitchell + 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. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index b5ac7b20b4e..1a43d020c59 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2b4942c8102..1e4cafa9446 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2003-06-19 Mark Mitchell + 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. diff --git a/gcc/testsuite/g++.dg/template/func1.C b/gcc/testsuite/g++.dg/template/func1.C new file mode 100644 index 00000000000..0d1677060c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/func1.C @@ -0,0 +1,13 @@ +template +inline void f(const T1&,const T2&) { } + +template +struct A { + template void g(T& i) { } +}; + +int main() { + int i; + A a; + a.g(i); +}