summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2009-11-26 10:59:52 -0500
committerJason Merrill <jason@gcc.gnu.org>2009-11-26 10:59:52 -0500
commit6780e186fc7a4ebf334f4b140cfd103e15deca3c (patch)
tree52df8039e2b5341626f2d8c5bcc3f09e1c50bc6d /gcc
parent87cd42599c846abbaf7a4ea063e594e68a175a5a (diff)
downloadgcc-6780e186fc7a4ebf334f4b140cfd103e15deca3c.tar.gz
re PR c++/10690 ([DR 115] Even when used within typeid(), a template-id generating an overload set with only one function should silently decay to a pointer to function)
PR c++/10690 * rtti.c (get_tinfo_decl_dynamic): Call resolve_nondeduced_context. From-SVN: r154675
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/rtti.c2
-rw-r--r--gcc/testsuite/g++.dg/template/explicit-args2.C6
3 files changed, 13 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 72d7832f9c6..5fd5f26d99a 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2009-11-25 Jason Merrill <jason@redhat.com>
+
+ PR c++/10690
+ * rtti.c (get_tinfo_decl_dynamic): Call resolve_nondeduced_context.
+
2009-11-24 Jason Merrill <jason@redhat.com>
PR c++/42137
diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c
index e96abcb0c0d..383c96c7949 100644
--- a/gcc/cp/rtti.c
+++ b/gcc/cp/rtti.c
@@ -245,6 +245,8 @@ get_tinfo_decl_dynamic (tree exp)
if (error_operand_p (exp))
return error_mark_node;
+ exp = resolve_nondeduced_context (exp);
+
/* peel back references, so they match. */
type = non_reference (TREE_TYPE (exp));
diff --git a/gcc/testsuite/g++.dg/template/explicit-args2.C b/gcc/testsuite/g++.dg/template/explicit-args2.C
index cd53b456dcc..d37b734202d 100644
--- a/gcc/testsuite/g++.dg/template/explicit-args2.C
+++ b/gcc/testsuite/g++.dg/template/explicit-args2.C
@@ -1,6 +1,8 @@
// PR c++/37177
// { dg-options -std=c++0x }
+#include <typeinfo>
+
namespace N1
{
template<class T> bool foo();
@@ -21,18 +23,22 @@ int main()
{
(void)(&S::bar<int>);
decltype(&S::bar<int>) a;
+ typeid(&S::bar<int>);
(void*)(&S::foo<int>);
(void)(&S::foo<int>);
decltype(&S::foo<int>) b;
+ typeid(&S::foo<int>);
(void*)(&N1::foo<int>);
(void)(&N1::foo<int>);
decltype(&N1::foo<int>) c;
+ typeid(&N1::foo<int>);
(void*)(&foo<int>);
(void)(&foo<int>);
decltype(&foo<int>) d;
+ typeid(&foo<int>);
&foo<int> == 0;
}