OSDN Git Service

PR c++/38725
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 8 Jan 2009 00:23:48 +0000 (00:23 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 8 Jan 2009 00:23:48 +0000 (00:23 +0000)
* semantics.c (finish_goto_stmt): Convert destination to
void *.

* g++.dg/ext/label11.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@143177 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/label11.C [new file with mode: 0644]

index e1539c5..a0be740 100644 (file)
@@ -1,3 +1,9 @@
+2009-01-07  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/38725
+       * semantics.c (finish_goto_stmt): Convert destination to
+       void *.
+
 2009-01-06  Jason Merrill  <jason@redhat.com>
 
        PR c++/35297
index 782b1dd..c9f0641 100644 (file)
@@ -547,7 +547,12 @@ finish_goto_stmt (tree destination)
     {
       /* The DESTINATION is being used as an rvalue.  */
       if (!processing_template_decl)
-       destination = decay_conversion (destination);
+       {
+         destination = decay_conversion (destination);
+         destination = cp_convert (ptr_type_node, destination);
+         if (error_operand_p (destination))
+           return NULL_TREE;
+       }
       /* We don't inline calls to functions with computed gotos.
         Those functions are typically up to some funny business,
         and may be depending on the labels being at particular
index 196f191..6b7d3e7 100644 (file)
@@ -1,3 +1,8 @@
+2009-01-07  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/38725
+       * g++.dg/ext/label11.C: New test.
+
 2009-01-07  Joseph Myers  <joseph@codesourcery.com>
 
        * lib/target-supports.exp (check_weak_override_available): New.
diff --git a/gcc/testsuite/g++.dg/ext/label11.C b/gcc/testsuite/g++.dg/ext/label11.C
new file mode 100644 (file)
index 0000000..dd92228
--- /dev/null
@@ -0,0 +1,46 @@
+// PR c++/38725
+// { dg-do compile }
+// { dg-options "" }
+
+struct A {};
+struct B : virtual A {};
+int vi;
+void *vp;
+
+void
+f1 (int i)
+{
+  goto *i;
+}
+
+void
+f2 (B b)
+{
+  goto *b;     // { dg-error "cannot convert" }
+}
+
+template <typename T>
+void
+f3 (T i)
+{
+  goto *i;
+}
+
+void
+f3a ()
+{
+  f3 (vi);
+}
+
+template <typename T>
+void
+f4 (T i)
+{
+  goto *i;
+}
+
+void
+f4a ()
+{
+  f4 (vp);
+}