re PR c++/69257 (g++ ICE in "create_tmp_var" on invalid inline-asm)

PR c++/69257
	* typeck.c (decay_conversion): Don't call mark_rvalue_use for
	array/function-to-pointer conversion.  Call
	complete_type_or_maybe_complain for lvalue-to-rvalue conversion.
	* call.c (convert_like_real): Print call context if
	decay_conversion errors.

From-SVN: r232436
This commit is contained in:
Jason Merrill 2016-01-15 10:57:07 -05:00 committed by Jason Merrill
parent 78810bd353
commit 56233bd6c9
4 changed files with 43 additions and 9 deletions

View File

@ -1,3 +1,12 @@
2016-01-15 Jason Merrill <jason@redhat.com>
PR c++/69257
* typeck.c (decay_conversion): Don't call mark_rvalue_use for
array/function-to-pointer conversion. Call
complete_type_or_maybe_complain for lvalue-to-rvalue conversion.
* call.c (convert_like_real): Print call context if
decay_conversion errors.
2016-01-14 Tom de Vries <tom@codesourcery.com> 2016-01-14 Tom de Vries <tom@codesourcery.com>
PR tree-optimization/68773 PR tree-optimization/68773

View File

@ -6542,7 +6542,16 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
case ck_rvalue: case ck_rvalue:
expr = decay_conversion (expr, complain); expr = decay_conversion (expr, complain);
if (expr == error_mark_node) if (expr == error_mark_node)
return error_mark_node; {
if (complain)
{
maybe_print_user_conv_context (convs);
if (fn)
inform (DECL_SOURCE_LOCATION (fn),
" initializing argument %P of %qD", argnum, fn);
}
return error_mark_node;
}
if (! MAYBE_CLASS_TYPE_P (totype)) if (! MAYBE_CLASS_TYPE_P (totype))
return expr; return expr;

View File

@ -1909,11 +1909,10 @@ unlowered_expr_type (const_tree exp)
/* Perform the conversions in [expr] that apply when an lvalue appears /* Perform the conversions in [expr] that apply when an lvalue appears
in an rvalue context: the lvalue-to-rvalue, array-to-pointer, and in an rvalue context: the lvalue-to-rvalue, array-to-pointer, and
function-to-pointer conversions. In addition, manifest constants function-to-pointer conversions. In addition, bitfield references are
are replaced by their values, and bitfield references are converted converted to their declared types. Note that this function does not perform
to their declared types. Note that this function does not perform the the lvalue-to-rvalue conversion for class types. If you need that conversion
lvalue-to-rvalue conversion for class types. If you need that conversion for class types, then you probably need to use force_rvalue.
to for class types, then you probably need to use force_rvalue.
Although the returned value is being used as an rvalue, this Although the returned value is being used as an rvalue, this
function does not wrap the returned expression in a function does not wrap the returned expression in a
@ -1933,8 +1932,6 @@ decay_conversion (tree exp,
if (type == error_mark_node) if (type == error_mark_node)
return error_mark_node; return error_mark_node;
exp = mark_rvalue_use (exp, loc, reject_builtin);
exp = resolve_nondeduced_context (exp); exp = resolve_nondeduced_context (exp);
if (type_unknown_p (exp)) if (type_unknown_p (exp))
{ {
@ -1962,12 +1959,19 @@ decay_conversion (tree exp,
if (invalid_nonstatic_memfn_p (loc, exp, complain)) if (invalid_nonstatic_memfn_p (loc, exp, complain))
return error_mark_node; return error_mark_node;
if (code == FUNCTION_TYPE || is_overloaded_fn (exp)) if (code == FUNCTION_TYPE || is_overloaded_fn (exp))
return cp_build_addr_expr (exp, complain); {
exp = mark_lvalue_use (exp);
if (reject_builtin && reject_gcc_builtin (exp, loc))
return error_mark_node;
return cp_build_addr_expr (exp, complain);
}
if (code == ARRAY_TYPE) if (code == ARRAY_TYPE)
{ {
tree adr; tree adr;
tree ptrtype; tree ptrtype;
exp = mark_lvalue_use (exp);
if (INDIRECT_REF_P (exp)) if (INDIRECT_REF_P (exp))
return build_nop (build_pointer_type (TREE_TYPE (type)), return build_nop (build_pointer_type (TREE_TYPE (type)),
TREE_OPERAND (exp, 0)); TREE_OPERAND (exp, 0));
@ -2013,6 +2017,9 @@ decay_conversion (tree exp,
return cp_convert (ptrtype, adr, complain); return cp_convert (ptrtype, adr, complain);
} }
/* Otherwise, it's the lvalue-to-rvalue conversion. */
exp = mark_rvalue_use (exp, loc, reject_builtin);
/* If a bitfield is used in a context where integral promotion /* If a bitfield is used in a context where integral promotion
applies, then the caller is expected to have used applies, then the caller is expected to have used
default_conversion. That function promotes bitfields correctly default_conversion. That function promotes bitfields correctly
@ -2032,6 +2039,9 @@ decay_conversion (tree exp,
if (!CLASS_TYPE_P (type) && cv_qualified_p (type)) if (!CLASS_TYPE_P (type) && cv_qualified_p (type))
exp = build_nop (cv_unqualified (type), exp); exp = build_nop (cv_unqualified (type), exp);
if (!complete_type_or_maybe_complain (type, exp, complain))
return error_mark_node;
return exp; return exp;
} }

View File

@ -0,0 +1,6 @@
// PR c++/69257
int fn1() {
struct S *x;
__asm ( "": :"" (*x)); // { dg-error "incomplete" }
}