aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2010-05-06 08:52:30 +0200
committerDodji Seketeli <dodji@gcc.gnu.org>2010-05-06 08:52:30 +0200
commit03a904b5a683713f848ef028aef63e0cfd16c4eb (patch)
tree98529df86d4f96b7809a5e235901996abf394d3f /gcc/cp
parent7d8930a046c5d5c80f990eef73c278b4c124b6f4 (diff)
downloadgcc-03a904b5a683713f848ef028aef63e0cfd16c4eb.zip
gcc-03a904b5a683713f848ef028aef63e0cfd16c4eb.tar.gz
gcc-03a904b5a683713f848ef028aef63e0cfd16c4eb.tar.bz2
C++ support for -Wunused-but-set-variable
gcc/cp/ChangeLog: PR 18624 * cp-tree.h (mark_exp_read, mark_rvalue_use, mark_lvalue_use, mark_type_use): Declare ... * expr.c (mark_exp_read, mark_rvalue_use, mark_lvalue_use, mark_type_use): ... new fns. * typeck.c (cxx_sizeof_expr, cxx_alignof_expr): Call mark_type_use. (perform_integral_promotions): Call mark_rvalue_use. (cp_build_unary_op): Call mark_lvalue_use. (decay_conversion): Update comment. Call mark_lvalue. * decl.c (unused_but_set_errorcount): New variable. (poplevel): Issue -Wunused-but-set-variable diagnostics. (duplicate_decls): Merge DECL_READ_P flags. (start_cleanup_fn): Set DECL_READ_P flag. (finish_function): Issue -Wunused-but-set-parameter diagnostics. * tree.c (rvalue): Call mark_rvalue_use. * pt.c (convert_nontype_argument): Likewise. * semantics.c (finish_typeof, finish_decltype_type): Call mark_type_use. (finish_asm_stmt): Call mark_lvalue_use. (finish_expr_stmt): Call mark_exp_read. * call.c (convert_like_real) <ck_identity, ck_user>: Call mark_rvalue_use. (build_x_va_arg): Call mark_lvalue_use. (build_over_call): Call mark_type_use. * init.c (build_new, build_delete): Call mark_value_use. * rtti.c (build_typeid): Call mark_lvalue_use or mark_type_use. (build_dynamic_cast_1): call mark_lvalue_use or mark_rvalue_use. gcc/testsuite/ChangeLog: PR 18624 * g++.dg/warn/Wunused-7.C: Add dg-warning. * g++.dg/template/sfinae16.C: Likewise. * gcc.dg/Wunused-var-1.c: Moved to... * c-c++-common/Wunused-var-1.c: ...here. New test. * gcc.dg/Wunused-var-2.c: Moved to... * c-c++-common/Wunused-var-2.c: ...here. New test. * gcc.dg/Wunused-var-3.c: Moved to... * c-c++-common/Wunused-var-3.c: ...here. New test. * gcc.dg/Wunused-var-4.c: Moved to... * gcc.dg/Wunused-var-1.c: ... here. * gcc.dg/Wunused-var-5.c: Moved to... * c-c++-common/Wunused-var-4.c: ...here. New test. * gcc.dg/Wunused-var-7.c: Moved to... * c-c++-common/Wunused-var-5.c: ...here. New test. * gcc.dg/Wunused-var-6.c: Moved to... * gcc.dg/Wunused-var-2.c: ... here. * c-c++-common/Wunused-var-1.c: New test. * c-c++-common/Wunused-var-2.c: New test. * c-c++-common/Wunused-var-3.c: New test. * c-c++-common/Wunused-var-4.c: New test. * c-c++-common/Wunused-var-5.c: New test. * g++.dg/warn/Wunused-var-1.C: New test. * g++.dg/warn/Wunused-var-2.C: New test. * g++.dg/warn/Wunused-var-3.C: New test. * g++.dg/warn/Wunused-var-4.C: New test. * g++.dg/warn/Wunused-var-5.C: New test. * g++.dg/warn/Wunused-var-6.C: New test. * g++.dg/warn/Wunused-var-7.C: New test. * g++.dg/warn/Wunused-var-8.C: New test. * g++.dg/warn/Wunused-parm-1.C: New test. * g++.dg/warn/Wunused-parm-2.C: New test. * g++.dg/warn/Wunused-parm-3.C: New test. Co-Authored-By: Dodji Seketeli <dodji@redhat.com> From-SVN: r159096
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog25
-rw-r--r--gcc/cp/call.c8
-rw-r--r--gcc/cp/cp-tree.h4
-rw-r--r--gcc/cp/decl.c59
-rw-r--r--gcc/cp/except.c1
-rw-r--r--gcc/cp/expr.c68
-rw-r--r--gcc/cp/init.c3
-rw-r--r--gcc/cp/pt.c1
-rw-r--r--gcc/cp/rtti.c11
-rw-r--r--gcc/cp/semantics.c13
-rw-r--r--gcc/cp/tree.c2
-rw-r--r--gcc/cp/typeck.c17
12 files changed, 206 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 4e9a2d0..b9c0f8a 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,28 @@
+2010-04-22 Jakub Jelinek <jakub@redhat.com>
+ Dodji Seketeli <dodji@redhat.com>
+
+ PR c/18624
+ * cp-tree.h (mark_exp_read, rvalue_use, lvalue_use, type_use):
+ Declare ...
+ * expr.c (mark_exp_read, rvalue_use, lvalue_use, type_use): ... new fns.
+ * typeck.c (cxx_sizeof_expr, cxx_alignof_expr): Call type_use.
+ (decay_conversion, perform_integral_promotions): Call rvalue_use.
+ (cp_build_unary_op): Call lvalue_use.
+ * decl.c (unused_but_set_errorcount): New variable.
+ (poplevel): Issue -Wunused-but-set-variable diagnostics.
+ (duplicate_decls): Merge DECL_READ_P flags.
+ (start_cleanup_fn): Set DECL_READ_P flag.
+ (finish_function): Issue -Wunused-but-set-parameter diagnostics.
+ * tree.c (rvalue): Call rvalue_use.
+ * pt.c (convert_nontype_argument): Likewise.
+ * semantics.c (finish_expr_stmt, finish_asm_stmt, finish_typeof,
+ finish_decltype_type): Likewise.
+ * call.c (convert_like_real) <ck_identity, ck_user>: Call rvalue use.
+ (build_x_va_arg, build_new_method_call, build_over_call): Call lvalue_use
+ or rvalue_use depending on the expr.
+ * init.c (build_new, build_delete): Likewise.
+ * rtti.c (build_typeid, build_dynamic_cast_1): Likewise.
+
2010-05-05 Jason Merrill <jason@redhat.com>
PR c++/43787
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 0ba0994..e8fcc94 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -4888,6 +4888,8 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
tree convfn = cand->fn;
unsigned i;
+ expr = mark_rvalue_use (expr);
+
/* When converting from an init list we consider explicit
constructors, but actually trying to call one is an error. */
if (DECL_NONCONVERTING_P (convfn) && DECL_CONSTRUCTOR_P (convfn))
@@ -4920,6 +4922,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
return expr;
}
case ck_identity:
+ expr = mark_rvalue_use (expr);
if (BRACE_ENCLOSED_INITIALIZER_P (expr))
{
int nelts = CONSTRUCTOR_NELTS (expr);
@@ -5230,6 +5233,8 @@ build_x_va_arg (tree expr, tree type)
if (expr == error_mark_node || !type)
return error_mark_node;
+ expr = mark_lvalue_use (expr);
+
if (type_has_nontrivial_copy_init (type)
|| TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
|| TREE_CODE (type) == REFERENCE_TYPE)
@@ -5698,7 +5703,8 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
{
tree a = VEC_index (tree, args, arg_index);
if (magic_varargs_p (fn))
- /* Do no conversions for magic varargs. */;
+ /* Do no conversions for magic varargs. */
+ a = mark_type_use (a);
else
a = convert_arg_to_ellipsis (a);
argarray[j++] = a;
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 055df47..4fca633 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -4815,6 +4815,10 @@ extern tree build_eh_type_type (tree);
/* in expr.c */
extern tree cplus_expand_constant (tree);
+extern tree mark_rvalue_use (tree);
+extern tree mark_lvalue_use (tree);
+extern tree mark_type_use (tree);
+extern void mark_exp_read (tree);
/* friend.c */
extern int is_friend (tree, tree);
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 5636282..f9114a9 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -498,6 +498,10 @@ poplevel_named_label_1 (void **slot, void *data)
return 1;
}
+/* Saved errorcount to avoid -Wunused-but-set-{parameter,variable} warnings
+ when errors were reported, except for -Werror-unused-but-set-*. */
+static int unused_but_set_errorcount;
+
/* Exit a binding level.
Pop the level off, and restore the state of the identifier-decl mappings
that were in effect when this level was entered.
@@ -589,14 +593,28 @@ poplevel (int keep, int reverse, int functionbody)
= current_binding_level->kind == sk_for && flag_new_for_scope == 1;
/* Before we remove the declarations first check for unused variables. */
- if (warn_unused_variable
+ if ((warn_unused_variable || warn_unused_but_set_variable)
&& !processing_template_decl)
for (decl = getdecls (); decl; decl = TREE_CHAIN (decl))
if (TREE_CODE (decl) == VAR_DECL
- && ! TREE_USED (decl)
+ && (! TREE_USED (decl) || !DECL_READ_P (decl))
&& ! DECL_IN_SYSTEM_HEADER (decl)
&& DECL_NAME (decl) && ! DECL_ARTIFICIAL (decl))
- warning (OPT_Wunused_variable, "unused variable %q+D", decl);
+ {
+ if (! TREE_USED (decl))
+ warning (OPT_Wunused_variable, "unused variable %q+D", decl);
+ else if (DECL_CONTEXT (decl) == current_function_decl
+ && TREE_TYPE (decl) != error_mark_node
+ && TREE_CODE (TREE_TYPE (decl)) != REFERENCE_TYPE
+ && errorcount == unused_but_set_errorcount
+ && (!CLASS_TYPE_P (TREE_TYPE (decl))
+ || !TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (decl))))
+ {
+ warning (OPT_Wunused_but_set_variable,
+ "variable %q+D set but not used", decl);
+ unused_but_set_errorcount = errorcount;
+ }
+ }
/* Remove declarations for all the DECLs in this level. */
for (link = decls; link; link = TREE_CHAIN (link))
@@ -2096,6 +2114,13 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend)
TREE_USED (newdecl) = 1;
else if (TREE_USED (newdecl))
TREE_USED (olddecl) = 1;
+ if (TREE_CODE (newdecl) == VAR_DECL)
+ {
+ if (DECL_READ_P (olddecl))
+ DECL_READ_P (newdecl) = 1;
+ else if (DECL_READ_P (newdecl))
+ DECL_READ_P (olddecl) = 1;
+ }
if (DECL_PRESERVE_P (olddecl))
DECL_PRESERVE_P (newdecl) = 1;
else if (DECL_PRESERVE_P (newdecl))
@@ -6181,6 +6206,7 @@ start_cleanup_fn (void)
parmdecl = cp_build_parm_decl (NULL_TREE, ptr_type_node);
DECL_CONTEXT (parmdecl) = fndecl;
TREE_USED (parmdecl) = 1;
+ DECL_READ_P (parmdecl) = 1;
DECL_ARGUMENTS (fndecl) = parmdecl;
}
@@ -12596,6 +12622,33 @@ finish_function (int flags)
info for the epilogue. */
cfun->function_end_locus = input_location;
+ /* Complain about parameters that are only set, but never otherwise used. */
+ if (warn_unused_but_set_parameter
+ && !processing_template_decl
+ && errorcount == unused_but_set_errorcount
+ && !DECL_CLONED_FUNCTION_P (fndecl))
+ {
+ tree decl;
+
+ for (decl = DECL_ARGUMENTS (fndecl);
+ decl;
+ decl = TREE_CHAIN (decl))
+ if (TREE_USED (decl)
+ && TREE_CODE (decl) == PARM_DECL
+ && !DECL_READ_P (decl)
+ && DECL_NAME (decl)
+ && !DECL_ARTIFICIAL (decl)
+ && !TREE_NO_WARNING (decl)
+ && !DECL_IN_SYSTEM_HEADER (decl)
+ && TREE_TYPE (decl) != error_mark_node
+ && TREE_CODE (TREE_TYPE (decl)) != REFERENCE_TYPE
+ && (!CLASS_TYPE_P (TREE_TYPE (decl))
+ || !TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (decl))))
+ warning (OPT_Wunused_but_set_parameter,
+ "parameter %q+D set but not used", decl);
+ unused_but_set_errorcount = errorcount;
+ }
+
/* Genericize before inlining. */
if (!processing_template_decl)
{
diff --git a/gcc/cp/except.c b/gcc/cp/except.c
index 4f4f85b..86acc93 100644
--- a/gcc/cp/except.c
+++ b/gcc/cp/except.c
@@ -369,6 +369,7 @@ initialize_handler_parm (tree decl, tree exp)
/* Make sure we mark the catch param as used, otherwise we'll get a
warning about an unused ((anonymous)). */
TREE_USED (decl) = 1;
+ DECL_READ_P (decl) = 1;
/* Figure out the type that the initializer is. Pointers are returned
adjusted by value from __cxa_begin_catch. Others are returned by
diff --git a/gcc/cp/expr.c b/gcc/cp/expr.c
index feafd70..a42e06b 100644
--- a/gcc/cp/expr.c
+++ b/gcc/cp/expr.c
@@ -82,3 +82,71 @@ cplus_expand_constant (tree cst)
return cst;
}
+
+/* Called whenever an expression is used
+ in a rvalue context. */
+
+tree
+mark_rvalue_use (tree expr)
+{
+ mark_exp_read (expr);
+ return expr;
+}
+
+/* Called whenever an expression is used
+ in a lvalue context. */
+
+tree
+mark_lvalue_use (tree expr)
+{
+ mark_exp_read (expr);
+ return expr;
+}
+
+/* Called whenever an expression is used in a type use context. */
+
+tree
+mark_type_use (tree expr)
+{
+ mark_exp_read (expr);
+ return expr;
+}
+
+/* Mark EXP as read, not just set, for set but not used -Wunused
+ warning purposes. */
+
+void
+mark_exp_read (tree exp)
+{
+ if (exp == NULL)
+ return;
+
+ switch (TREE_CODE (exp))
+ {
+ case VAR_DECL:
+ case PARM_DECL:
+ DECL_READ_P (exp) = 1;
+ break;
+ case ARRAY_REF:
+ case COMPONENT_REF:
+ case MODIFY_EXPR:
+ case REALPART_EXPR:
+ case IMAGPART_EXPR:
+ CASE_CONVERT:
+ case ADDR_EXPR:
+ mark_exp_read (TREE_OPERAND (exp, 0));
+ break;
+ case COMPOUND_EXPR:
+ mark_exp_read (TREE_OPERAND (exp, 1));
+ break;
+ case COND_EXPR:
+ if (TREE_OPERAND (exp, 1))
+ mark_exp_read (TREE_OPERAND (exp, 1));
+ if (TREE_OPERAND (exp, 2))
+ mark_exp_read (TREE_OPERAND (exp, 2));
+ break;
+ default:
+ break;
+ }
+}
+
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 4fc90e6..a2d9837 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -2465,6 +2465,7 @@ build_new (VEC(tree,gc) **placement, tree type, tree nelts,
else
return error_mark_node;
}
+ nelts = mark_rvalue_use (nelts);
nelts = cp_save_expr (cp_convert (sizetype, nelts));
}
@@ -3120,6 +3121,8 @@ build_delete (tree type, tree addr, special_function_kind auto_delete,
type = TYPE_MAIN_VARIANT (type);
+ addr = mark_rvalue_use (addr);
+
if (TREE_CODE (type) == POINTER_TYPE)
{
bool complete_p = true;
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 7561d3f..06f5d9f 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -4930,6 +4930,7 @@ convert_nontype_argument (tree type, tree expr)
if (error_operand_p (expr))
return error_mark_node;
expr_type = TREE_TYPE (expr);
+ expr = mark_rvalue_use (expr);
/* HACK: Due to double coercion, we can get a
NOP_EXPR<REFERENCE_TYPE>(ADDR_EXPR<POINTER_TYPE> (arg)) here,
diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c
index 0f7225f..6f40653 100644
--- a/gcc/cp/rtti.c
+++ b/gcc/cp/rtti.c
@@ -318,7 +318,7 @@ typeid_ok_p (void)
tree
build_typeid (tree exp)
{
- tree cond = NULL_TREE;
+ tree cond = NULL_TREE, initial_expr = exp;
int nonnull = 0;
if (exp == error_mark_node || !typeid_ok_p ())
@@ -333,6 +333,9 @@ build_typeid (tree exp)
&& ! resolves_to_fixed_type_p (exp, &nonnull)
&& ! nonnull)
{
+ /* So we need to look into the vtable of the type of exp.
+ This is an lvalue use of expr then. */
+ exp = mark_lvalue_use (exp);
exp = stabilize_reference (exp);
cond = cp_convert (boolean_type_node, TREE_OPERAND (exp, 0));
}
@@ -348,6 +351,8 @@ build_typeid (tree exp)
exp = build3 (COND_EXPR, TREE_TYPE (exp), cond, exp, bad);
}
+ else
+ mark_type_use (initial_expr);
return exp;
}
@@ -546,6 +551,8 @@ build_dynamic_cast_1 (tree type, tree expr, tsubst_flags_t complain)
/* If T is a pointer type, v shall be an rvalue of a pointer to
complete class type, and the result is an rvalue of type T. */
+ expr = mark_rvalue_use (expr);
+
if (TREE_CODE (exprtype) != POINTER_TYPE)
{
errstr = _("source is not a pointer");
@@ -564,6 +571,8 @@ build_dynamic_cast_1 (tree type, tree expr, tsubst_flags_t complain)
}
else
{
+ expr = mark_lvalue_use (expr);
+
exprtype = build_reference_type (exprtype);
/* T is a reference type, v shall be an lvalue of a complete class
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index d4ce014..f47a758 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -610,6 +610,13 @@ finish_expr_stmt (tree expr)
{
if (warn_sequence_point)
verify_sequence_points (expr);
+ if (TREE_CODE (expr) != MODIFY_EXPR)
+ /* Expr is not being 'used' here, otherwise we whould have
+ called mark_{rl}value_use use here, which would have in turn
+ called mark_exp_read. Rather, we call mark_exp_read directly
+ to avoid some warnings when
+ -Wunused-but-set-{variable,parameter} is in effect. */
+ mark_exp_read (expr);
expr = convert_to_void (expr, "statement", tf_warning_or_error);
}
else if (!type_dependent_expression_p (expr))
@@ -1238,6 +1245,8 @@ finish_asm_stmt (int volatile_p, tree string, tree output_operands,
otherwise we'll get an error. Gross, but ... */
STRIP_NOPS (operand);
+ operand = mark_lvalue_use (operand);
+
if (!lvalue_or_else (operand, lv_asm, tf_warning_or_error))
operand = error_mark_node;
@@ -3182,6 +3191,8 @@ finish_typeof (tree expr)
return type;
}
+ expr = mark_type_use (expr);
+
type = unlowered_expr_type (expr);
if (!type || type == unknown_type_node)
@@ -4859,6 +4870,7 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
case PARM_DECL:
case RESULT_DECL:
case TEMPLATE_PARM_INDEX:
+ expr = mark_type_use (expr);
type = TREE_TYPE (expr);
break;
@@ -4867,6 +4879,7 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
break;
case COMPONENT_REF:
+ mark_type_use (expr);
type = is_bitfield_expr_with_lowered_type (expr);
if (!type)
type = TREE_TYPE (TREE_OPERAND (expr, 1));
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index 4d25cac..67bbd60 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -551,6 +551,8 @@ rvalue (tree expr)
if (error_operand_p (expr))
return expr;
+ expr = mark_rvalue_use (expr);
+
/* [basic.lval]
Non-class rvalues always have cv-unqualified types. */
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index e92175f..c601539 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -1631,6 +1631,8 @@ cxx_sizeof_expr (tree e, tsubst_flags_t complain)
&& DECL_TEMPLATE_INSTANTIATION (e))
instantiate_decl (e, /*defer_ok*/true, /*expl_inst_mem*/false);
+ e = mark_type_use (e);
+
if (TREE_CODE (e) == COMPONENT_REF
&& TREE_CODE (TREE_OPERAND (e, 1)) == FIELD_DECL
&& DECL_C_BIT_FIELD (TREE_OPERAND (e, 1)))
@@ -1686,6 +1688,8 @@ cxx_alignof_expr (tree e, tsubst_flags_t complain)
return e;
}
+ e = mark_type_use (e);
+
if (TREE_CODE (e) == VAR_DECL)
t = size_int (DECL_ALIGN_UNIT (e));
else if (TREE_CODE (e) == COMPONENT_REF
@@ -1835,7 +1839,9 @@ unlowered_expr_type (const_tree exp)
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.
+ 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.
Although the returned value is being used as an rvalue, this
function does not wrap the returned expression in a
@@ -1852,6 +1858,8 @@ decay_conversion (tree exp)
if (type == error_mark_node)
return error_mark_node;
+ exp = mark_rvalue_use (exp);
+
exp = resolve_nondeduced_context (exp);
if (type_unknown_p (exp))
{
@@ -1976,6 +1984,8 @@ perform_integral_promotions (tree expr)
tree type;
tree promoted_type;
+ expr = mark_rvalue_use (expr);
+
/* [conv.prom]
If the bitfield has an enumerated type, it is treated as any
@@ -4807,6 +4817,8 @@ cp_build_unary_op (enum tree_code code, tree xarg, int noconvert,
if (val != 0)
return val;
+ arg = mark_lvalue_use (arg);
+
/* Increment or decrement the real part of the value,
and don't change the imaginary part. */
if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
@@ -4940,6 +4952,8 @@ cp_build_unary_op (enum tree_code code, tree xarg, int noconvert,
argtype = lvalue_type (arg);
+ arg = mark_lvalue_use (arg);
+
if (TREE_CODE (arg) == OFFSET_REF)
goto offset_ref;
@@ -8042,3 +8056,4 @@ lvalue_or_else (tree ref, enum lvalue_use use, tsubst_flags_t complain)
return win;
}
+