diff options
author | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-06-20 05:52:43 +0000 |
---|---|---|
committer | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-06-20 05:52:43 +0000 |
commit | f11469dec8b6dbe31f010d4d67471e2ae198cff5 (patch) | |
tree | 7b1a1427ec2e377d2ea72a73a148655cd4165f8a | |
parent | 6d0a3bf24fcf7c38e4624ed2d2f2377a94828770 (diff) | |
download | gcc-f11469dec8b6dbe31f010d4d67471e2ae198cff5.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@68244 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/pt.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/func1.C | 13 |
4 files changed, 34 insertions, 2 deletions
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 <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. 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 <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. 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 <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); +} |