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:
parent
78810bd353
commit
56233bd6c9
@ -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>
|
||||
|
||||
PR tree-optimization/68773
|
||||
|
@ -6542,7 +6542,16 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
|
||||
case ck_rvalue:
|
||||
expr = decay_conversion (expr, complain);
|
||||
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))
|
||||
return expr;
|
||||
|
@ -1909,11 +1909,10 @@ unlowered_expr_type (const_tree exp)
|
||||
|
||||
/* Perform the conversions in [expr] that apply when an lvalue appears
|
||||
in an rvalue context: the lvalue-to-rvalue, array-to-pointer, and
|
||||
function-to-pointer conversions. In addition, manifest constants
|
||||
are replaced by their values, and bitfield references are converted
|
||||
to their declared types. Note that this function does not perform the
|
||||
lvalue-to-rvalue conversion for class types. If you need that conversion
|
||||
to for class types, then you probably need to use force_rvalue.
|
||||
function-to-pointer conversions. In addition, bitfield references are
|
||||
converted to their declared types. Note that this function does not perform
|
||||
the lvalue-to-rvalue conversion for class types. If you need that conversion
|
||||
for class types, then you probably need to use force_rvalue.
|
||||
|
||||
Although the returned value is being used as an rvalue, this
|
||||
function does not wrap the returned expression in a
|
||||
@ -1933,8 +1932,6 @@ decay_conversion (tree exp,
|
||||
if (type == error_mark_node)
|
||||
return error_mark_node;
|
||||
|
||||
exp = mark_rvalue_use (exp, loc, reject_builtin);
|
||||
|
||||
exp = resolve_nondeduced_context (exp);
|
||||
if (type_unknown_p (exp))
|
||||
{
|
||||
@ -1962,12 +1959,19 @@ decay_conversion (tree exp,
|
||||
if (invalid_nonstatic_memfn_p (loc, exp, complain))
|
||||
return error_mark_node;
|
||||
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)
|
||||
{
|
||||
tree adr;
|
||||
tree ptrtype;
|
||||
|
||||
exp = mark_lvalue_use (exp);
|
||||
|
||||
if (INDIRECT_REF_P (exp))
|
||||
return build_nop (build_pointer_type (TREE_TYPE (type)),
|
||||
TREE_OPERAND (exp, 0));
|
||||
@ -2013,6 +2017,9 @@ decay_conversion (tree exp,
|
||||
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
|
||||
applies, then the caller is expected to have used
|
||||
default_conversion. That function promotes bitfields correctly
|
||||
@ -2032,6 +2039,9 @@ decay_conversion (tree exp,
|
||||
if (!CLASS_TYPE_P (type) && cv_qualified_p (type))
|
||||
exp = build_nop (cv_unqualified (type), exp);
|
||||
|
||||
if (!complete_type_or_maybe_complain (type, exp, complain))
|
||||
return error_mark_node;
|
||||
|
||||
return exp;
|
||||
}
|
||||
|
||||
|
6
gcc/testsuite/g++.dg/ext/asm13.C
Normal file
6
gcc/testsuite/g++.dg/ext/asm13.C
Normal file
@ -0,0 +1,6 @@
|
||||
// PR c++/69257
|
||||
|
||||
int fn1() {
|
||||
struct S *x;
|
||||
__asm ( "": :"" (*x)); // { dg-error "incomplete" }
|
||||
}
|
Loading…
Reference in New Issue
Block a user