aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2009-01-08 01:23:48 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2009-01-08 01:23:48 +0100
commitf5651df1abb64343a5e18ed6af8cde899d4b2198 (patch)
tree84049793b7433a097da58f21d3dfe6ffd94a5412
parent78415d7d4cf0fa3bcbe939900956e7f6e9509112 (diff)
downloadgcc-f5651df1abb64343a5e18ed6af8cde899d4b2198.zip
gcc-f5651df1abb64343a5e18ed6af8cde899d4b2198.tar.gz
gcc-f5651df1abb64343a5e18ed6af8cde899d4b2198.tar.bz2
re PR c++/38725 (ICE with goto)
PR c++/38725 * semantics.c (finish_goto_stmt): Convert destination to void *. * g++.dg/ext/label11.C: New test. From-SVN: r143177
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/semantics.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ext/label11.C46
4 files changed, 63 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e1539c5..a0be740 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 782b1dd..c9f0641 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 196f191..6b7d3e7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..dd92228
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/label11.C
@@ -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);
+}