summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2003-06-20 05:52:43 +0000
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2003-06-20 05:52:43 +0000
commitf11469dec8b6dbe31f010d4d67471e2ae198cff5 (patch)
tree7b1a1427ec2e377d2ea72a73a148655cd4165f8a
parent6d0a3bf24fcf7c38e4624ed2d2f2377a94828770 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/cp/pt.c15
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/template/func1.C13
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);
+}