diff options
author | Jason Merrill <jason@redhat.com> | 2009-11-26 10:59:52 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2009-11-26 10:59:52 -0500 |
commit | 6780e186fc7a4ebf334f4b140cfd103e15deca3c (patch) | |
tree | 52df8039e2b5341626f2d8c5bcc3f09e1c50bc6d /gcc | |
parent | 87cd42599c846abbaf7a4ea063e594e68a175a5a (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/rtti.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/explicit-args2.C | 6 |
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; } |