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:
Mark Mitchell 2003-08-29 23:11:14 +00:00 committed by Mark Mitchell
parent d560a41c5c
commit fc2b84778b
5 changed files with 38 additions and 7 deletions

View file

@ -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:

View file

@ -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);

View file

@ -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.

View file

@ -0,0 +1,8 @@
// { dg-options "" }
int main(void) {
static const void* lbls[2][2] = {{&&lbl0, &&lbl0}, {&&lbl0, &&lbl0}};
goto *lbls[0];
lbl0:
;
}

View file

@ -0,0 +1,11 @@
// { dg-options "" }
template <typename T>
void f() {
l:
void *p[] = { &&l };
goto *p;
}
template void f<int>();