diff options
author | Jakub Jelinek <jakub@redhat.com> | 2008-07-31 20:07:20 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2008-07-31 20:07:20 +0200 |
commit | 41b059f3d869b456bec3eee7e3eb0ed5ba0a9300 (patch) | |
tree | e96cff0fa7f70ec9300fe146fccee8aa0703f96b /gcc | |
parent | 10ee5386adadefebd247c7e4870c666f2c9b359d (diff) | |
download | gcc-41b059f3d869b456bec3eee7e3eb0ed5ba0a9300.zip gcc-41b059f3d869b456bec3eee7e3eb0ed5ba0a9300.tar.gz gcc-41b059f3d869b456bec3eee7e3eb0ed5ba0a9300.tar.bz2 |
re PR c++/36405 (ICE with typeid of member function)
PR c++/36405
* rtti.c (get_tinfo_decl_dynamic, get_typeid): Call
complete_type_or_else even for UNKNOWN_TYPE to get diagnostics.
* g++.dg/rtti/typeid8.C: New test.
From-SVN: r138426
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/rtti.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/rtti/typeid8.C | 26 |
4 files changed, 41 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index db536e4..c865326 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2008-07-31 Jakub Jelinek <jakub@redhat.com> + + PR c++/36405 + * rtti.c (get_tinfo_decl_dynamic, get_typeid): Call + complete_type_or_else even for UNKNOWN_TYPE to get diagnostics. + 2008-07-31 Jason Merrill <jason@redhat.com> PR c++/36633 diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c index d2e544b..e3e5349 100644 --- a/gcc/cp/rtti.c +++ b/gcc/cp/rtti.c @@ -252,7 +252,8 @@ get_tinfo_decl_dynamic (tree exp) /* Peel off cv qualifiers. */ type = TYPE_MAIN_VARIANT (type); - if (CLASS_TYPE_P (type)) + /* For UNKNOWN_TYPEs call complete_type_or_else to get diagnostics. */ + if (CLASS_TYPE_P (type) || TREE_CODE (type) == UNKNOWN_TYPE) type = complete_type_or_else (type, exp); if (!type) @@ -459,7 +460,8 @@ get_typeid (tree type) that is the operand of typeid are always ignored. */ type = TYPE_MAIN_VARIANT (type); - if (CLASS_TYPE_P (type)) + /* For UNKNOWN_TYPEs call complete_type_or_else to get diagnostics. */ + if (CLASS_TYPE_P (type) || TREE_CODE (type) == UNKNOWN_TYPE) type = complete_type_or_else (type, NULL_TREE); if (!type) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f6e855a..f05f627 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-07-31 Jakub Jelinek <jakub@redhat.com> + + PR c++/36405 + * g++.dg/rtti/typeid8.C: New test. + 2008-07-31 Richard Guenther <rguenther@suse.de> PR tree-optimization/36978 diff --git a/gcc/testsuite/g++.dg/rtti/typeid8.C b/gcc/testsuite/g++.dg/rtti/typeid8.C new file mode 100644 index 0000000..2b13be5 --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/typeid8.C @@ -0,0 +1,26 @@ +// PR c++/36405 +// { dg-do compile } + +#include <typeinfo> + +struct A +{ + void foo () + { + typeid (foo).name (); // { dg-error "invalid use of member" } + typeid (A::foo).name (); // { dg-error "invalid use of member" } + } + void bar () + { + typeid (foo).name (); // { dg-error "invalid use of member" } + typeid (A::foo).name (); // { dg-error "invalid use of member" } + } + static void baz () + { + typeid (baz).name (); + typeid (A::baz).name (); + } +}; + +const char *p1 = typeid (A::foo).name (); // { dg-error "invalid use of non-static member" } +const char *p2 = typeid (A::baz).name (); |