diff options
author | Jakub Jelinek <jakub@redhat.com> | 2009-01-08 01:23:48 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2009-01-08 01:23:48 +0100 |
commit | f5651df1abb64343a5e18ed6af8cde899d4b2198 (patch) | |
tree | 84049793b7433a097da58f21d3dfe6ffd94a5412 | |
parent | 78415d7d4cf0fa3bcbe939900956e7f6e9509112 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/label11.C | 46 |
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); +} |