aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2008-02-19 17:53:07 -0500
committerJason Merrill <jason@gcc.gnu.org>2008-02-19 17:53:07 -0500
commitcc85b4c564805534a69a0c23999c3e2c32d904b8 (patch)
tree8801972618be61c513de1050b18304b9abeaf700
parentdaac03177cc40f7b0bd32361ee16598f114552d9 (diff)
downloadgcc-cc85b4c564805534a69a0c23999c3e2c32d904b8.zip
gcc-cc85b4c564805534a69a0c23999c3e2c32d904b8.tar.gz
gcc-cc85b4c564805534a69a0c23999c3e2c32d904b8.tar.bz2
re PR c++/34950 (ICE in svn boost math toolkit)
PR c++/34950 * pt.c (resolve_overloaded_unification): Set processing_template_decl while we look for possible bindings. From-SVN: r132455
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c2
-rw-r--r--gcc/testsuite/g++.dg/template/explicit-args1.C21
3 files changed, 29 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 6f016fc..81a243a 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2008-02-19 Jason Merrill <jason@redhat.com>
+
+ PR c++/34950
+ * pt.c (resolve_overloaded_unification): Set processing_template_decl
+ while we look for possible bindings.
+
2008-02-19 Jakub Jelinek <jakub@redhat.com>
PR c++/35028
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 5931126..e45f6da 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -12137,6 +12137,7 @@ resolve_overloaded_unification (tree tparms,
if (TREE_CODE (fn) != TEMPLATE_DECL)
continue;
+ ++processing_template_decl;
subargs = get_bindings (fn, DECL_TEMPLATE_RESULT (fn),
expl_subargs, /*check_ret=*/false);
if (subargs)
@@ -12145,6 +12146,7 @@ resolve_overloaded_unification (tree tparms,
good += try_one_overload (tparms, targs, tempargs, parm,
elem, strict, sub_strict, addr_p);
}
+ --processing_template_decl;
}
}
else if (TREE_CODE (arg) != OVERLOAD
diff --git a/gcc/testsuite/g++.dg/template/explicit-args1.C b/gcc/testsuite/g++.dg/template/explicit-args1.C
new file mode 100644
index 0000000..10d59e1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/explicit-args1.C
@@ -0,0 +1,21 @@
+// PR c++/34950
+
+template <class T = int> struct policy {
+ typedef int unnecessary;
+};
+
+template <class Policy> struct A {
+ typedef int type;
+ typedef typename Policy::unnecessary unused;
+};
+
+template <class T> struct S {
+ typedef int type;
+ typedef typename A<T>::type unused;
+};
+
+template <class, class T> typename S<T>::type foo();
+template <class> S<policy<> >::type foo();
+
+template <typename T> int def(T);
+const int i = def(foo<int>);