]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/36405 (ICE with typeid of member function)
authorJakub Jelinek <jakub@redhat.com>
Thu, 31 Jul 2008 18:07:20 +0000 (20:07 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 31 Jul 2008 18:07:20 +0000 (20:07 +0200)
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

gcc/cp/ChangeLog
gcc/cp/rtti.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/rtti/typeid8.C [new file with mode: 0644]

index db536e4d9d3097b9d23b92f55b74b2ff77028fe0..c865326d0bc19e0e418dbf0740b3c5a4aff0b1da 100644 (file)
@@ -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
index d2e544b0f9e63dd21e7416bbffd51f699cf46656..e3e5349f5ca99f5f1e459ea3e51b5d1085092623 100644 (file)
@@ -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)
index f6e855abd083d7676a9f95d678007e6397395eca..f05f6276b1f0b94d25836e73048b8a2dd4ce9b52 100644 (file)
@@ -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 (file)
index 0000000..2b13be5
--- /dev/null
@@ -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 ();