aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2016-01-15 10:57:07 -0500
committerJason Merrill <jason@gcc.gnu.org>2016-01-15 10:57:07 -0500
commit56233bd6c9d476f3966ff8907859b2605b3b113f (patch)
tree543ffffb7f6280a18f0647e018222f3e7cf36bd5 /gcc
parent78810bd35336529a133661a5e4f801ccda57fd74 (diff)
downloadgcc-56233bd6c9d476f3966ff8907859b2605b3b113f.zip
gcc-56233bd6c9d476f3966ff8907859b2605b3b113f.tar.gz
gcc-56233bd6c9d476f3966ff8907859b2605b3b113f.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/call.c11
-rw-r--r--gcc/cp/typeck.c26
-rw-r--r--gcc/testsuite/g++.dg/ext/asm13.C6
4 files changed, 43 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 92925a3..0280884 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index f3f95ef..c05170a 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -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;
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index 94267b67..0503c6f 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -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;
}
diff --git a/gcc/testsuite/g++.dg/ext/asm13.C b/gcc/testsuite/g++.dg/ext/asm13.C
new file mode 100644
index 0000000..eece05e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/asm13.C
@@ -0,0 +1,6 @@
+// PR c++/69257
+
+int fn1() {
+ struct S *x;
+ __asm ( "": :"" (*x)); // { dg-error "incomplete" }
+}