Commit 56233bd6 by Jason Merrill Committed by Jason Merrill

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
parent 78810bd3
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
......
...@@ -6542,7 +6542,16 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, ...@@ -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;
......
...@@ -1909,11 +1909,10 @@ unlowered_expr_type (const_tree exp) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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;
} }
......
// PR c++/69257
int fn1() {
struct S *x;
__asm ( "": :"" (*x)); // { dg-error "incomplete" }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment