re PR middle-end/6196 (ICE in copy_to_mode_reg, at explow.c:711)
PR c++/6196 * pt.c (tsubst_copy_and_build): Correct handling of address-of-label extension. * semantics.c (finish_goto_stmt): The address of a label must go through the lvalue-to-rvalue conversion. PR c++/6196 * g++.dg/ext/label1.C: New test. * g++.dg/ext/label2.C: Likewise. From-SVN: r70932
This commit is contained in:
parent
d560a41c5c
commit
fc2b84778b
5 changed files with 38 additions and 7 deletions
|
@ -7972,6 +7972,8 @@ tsubst_copy_and_build (tree t,
|
|||
else
|
||||
op1 = tsubst_non_call_postfix_expression (op1, args, complain,
|
||||
in_decl);
|
||||
if (TREE_CODE (op1) == LABEL_DECL)
|
||||
return finish_label_address_expr (DECL_NAME (op1));
|
||||
return build_x_unary_op (ADDR_EXPR, op1);
|
||||
|
||||
case PLUS_EXPR:
|
||||
|
|
|
@ -378,13 +378,17 @@ finish_goto_stmt (tree destination)
|
|||
mark the used labels as used. */
|
||||
if (TREE_CODE (destination) == LABEL_DECL)
|
||||
TREE_USED (destination) = 1;
|
||||
|
||||
if (TREE_CODE (destination) != LABEL_DECL)
|
||||
/* 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
|
||||
addresses, or some such. */
|
||||
DECL_UNINLINABLE (current_function_decl) = 1;
|
||||
else
|
||||
{
|
||||
/* The DESTINATION is being used as an rvalue. */
|
||||
if (!processing_template_decl)
|
||||
destination = decay_conversion (destination);
|
||||
/* 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
|
||||
addresses, or some such. */
|
||||
DECL_UNINLINABLE (current_function_decl) = 1;
|
||||
}
|
||||
|
||||
check_goto (destination);
|
||||
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2003-08-29 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/6196
|
||||
* g++.dg/ext/label1.C: New test.
|
||||
* g++.dg/ext/label2.C: Likewise.
|
||||
|
||||
2003-08-28 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
* g++.dg/expr/cond3.C: New test.
|
||||
|
|
8
gcc/testsuite/g++.dg/ext/label1.C
Normal file
8
gcc/testsuite/g++.dg/ext/label1.C
Normal file
|
@ -0,0 +1,8 @@
|
|||
// { dg-options "" }
|
||||
|
||||
int main(void) {
|
||||
static const void* lbls[2][2] = {{&&lbl0, &&lbl0}, {&&lbl0, &&lbl0}};
|
||||
goto *lbls[0];
|
||||
lbl0:
|
||||
;
|
||||
}
|
11
gcc/testsuite/g++.dg/ext/label2.C
Normal file
11
gcc/testsuite/g++.dg/ext/label2.C
Normal file
|
@ -0,0 +1,11 @@
|
|||
// { dg-options "" }
|
||||
|
||||
template <typename T>
|
||||
void f() {
|
||||
l:
|
||||
void *p[] = { &&l };
|
||||
|
||||
goto *p;
|
||||
}
|
||||
|
||||
template void f<int>();
|
Loading…
Add table
Reference in a new issue