+2008-03-27 Douglas Gregor <doug.gregor@gmail.com>
+
+ PR obj-c++/35704
+ * typeck.c (build_x_compound_expr): Use cp_build_compound_expr.
+ (build_compound_expr): New, for compatibility with C
+ build_compound_expr.
+ (cp_build_compound_expr): Renamed from build_compound_expr.
+ (build_c_cast): New, for compatibility with C build_c_cast.
+ (cp_build_c_cast): Renamed from build_c_cast.
+ * init.c (build_vec_delete_1): Fix calls to build_compound_expr.
+ * decl.c (cxx_maybe_build_cleanup): Ditto.
+ * cp-tree.h (build_compound_expr): Add C-compatibile prototype.
+ (cp_build_compound_expr): Renamed from build_compound_expr.
+ (build_c_cast): Add C-compatible prototype.
+ (cp_build_c_cast): Renamed from build_c_cast.
+ * typeck2.c (build_functional_cast): Use cp_build_c_cast.
+ * parser.c (cp_parser_cast_expression): Fix call to build_c_cast.
+
2008-03-27 Douglas Gregor <doug.gregor@gmail.com>
* pt.c (tsubst_copy) <case SIZEOF_EXPR>: Cope with
tsubst_flags_t);
extern tree build_x_compound_expr_from_list (tree, const char *);
extern tree build_x_compound_expr (tree, tree, tsubst_flags_t);
-extern tree build_compound_expr (tree, tree, tsubst_flags_t);
+extern tree build_compound_expr (tree, tree);
+extern tree cp_build_compound_expr (tree, tree, tsubst_flags_t);
extern tree build_static_cast (tree, tree, tsubst_flags_t);
extern tree build_reinterpret_cast (tree, tree, tsubst_flags_t);
extern tree build_const_cast (tree, tree, tsubst_flags_t);
-extern tree build_c_cast (tree, tree, tsubst_flags_t);
+extern tree build_c_cast (tree, tree);
+extern tree cp_build_c_cast (tree, tree, tsubst_flags_t);
extern tree build_x_modify_expr (tree, enum tree_code, tree,
tsubst_flags_t);
extern tree cp_build_modify_expr (tree, enum tree_code, tree,
call = build_delete (TREE_TYPE (addr), addr,
sfk_complete_destructor, flags, 0);
if (cleanup)
- cleanup = build_compound_expr (cleanup, call, tf_warning_or_error);
+ cleanup = build_compound_expr (cleanup, call);
else
cleanup = call;
}
body = build_compound_expr
(body, cp_build_modify_expr (tbase, NOP_EXPR,
build2 (POINTER_PLUS_EXPR, ptype, tbase, tmp),
- tf_warning_or_error),
- tf_warning_or_error);
+ tf_warning_or_error));
body = build_compound_expr
(body, build_delete (ptype, tbase, sfk_complete_destructor,
- LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1),
- tf_warning_or_error);
+ LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1));
loop = build1 (LOOP_EXPR, void_type_node, body);
- loop = build_compound_expr (tbase_init, loop, tf_warning_or_error);
+ loop = build_compound_expr (tbase_init, loop);
no_destructor:
/* If the delete flag is one, or anything else with the low bit set,
else if (!body)
body = deallocate_expr;
else
- body = build_compound_expr (body, deallocate_expr, tf_warning_or_error);
+ body = build_compound_expr (body, deallocate_expr);
if (!body)
body = integer_zero_node;
return error_mark_node;
/* Perform the cast. */
- expr = build_c_cast (type, expr, tf_warning_or_error);
+ expr = build_c_cast (type, expr);
return expr;
}
}
result = build_new_op (COMPOUND_EXPR, LOOKUP_NORMAL, op1, op2, NULL_TREE,
/*overloaded_p=*/NULL, complain);
if (!result)
- result = build_compound_expr (op1, op2, complain);
+ result = cp_build_compound_expr (op1, op2, complain);
if (processing_template_decl && result != error_mark_node)
return build_min_non_dep (COMPOUND_EXPR, result, orig_op1, orig_op2);
return result;
}
+/* Like cp_build_compound_expr, but for the c-common bits. */
+
+tree
+build_compound_expr (tree lhs, tree rhs)
+{
+ return cp_build_compound_expr (lhs, rhs, tf_warning_or_error);
+}
+
/* Build a compound expression. */
tree
-build_compound_expr (tree lhs, tree rhs, tsubst_flags_t complain)
+cp_build_compound_expr (tree lhs, tree rhs, tsubst_flags_t complain)
{
lhs = convert_to_void (lhs, "left-hand operand of comma", complain);
/*valid_p=*/NULL);
}
+/* Like cp_build_c_cast, but for the c-common bits. */
+
+tree
+build_c_cast (tree type, tree expr)
+{
+ return cp_build_c_cast (type, expr, tf_warning_or_error);
+}
+
/* Build an expression representing an explicit C-style cast to type
TYPE of expression EXPR. */
tree
-build_c_cast (tree type, tree expr, tsubst_flags_t complain)
+cp_build_c_cast (tree type, tree expr, tsubst_flags_t complain)
{
tree value = expr;
tree result;
/* Handle null pointer to member function conversions. */
if (integer_zerop (pfn))
{
- pfn = build_c_cast (type, integer_zero_node, tf_warning_or_error);
+ pfn = build_c_cast (type, integer_zero_node);
return build_ptrmemfunc1 (to_type,
integer_zero_node,
pfn);
/* This must build a C cast. */
parms = build_x_compound_expr_from_list (parms, "functional cast");
- return build_c_cast (type, parms, complain);
+ return cp_build_c_cast (type, parms, complain);
}
/* Prepare to evaluate as a call to a constructor. If this expression
conversion is equivalent (in definedness, and if defined in
meaning) to the corresponding cast expression. */
if (parms && TREE_CHAIN (parms) == NULL_TREE)
- return build_c_cast (type, TREE_VALUE (parms), complain);
+ return cp_build_c_cast (type, TREE_VALUE (parms), complain);
/* [expr.type.conv]
+2008-03-27 Douglas Gregor <doug.gregor@gmail.com>
+
+ PR obj-c++/35704
+ * objc-act.c (objc_build_component_ref): Fix call to
+ finish_class_member_access_expr.
+ (objc_generate_cxx_ctor_or_dtor): Fix call to
+ build_special_member_call.
+
2008-03-25 Andrew Pinski <pinskia@gmail.com>
PR objc/29197
front-end, but 'finish_class_member_access_expr' seems to be
a worthy substitute. */
#ifdef OBJCPLUS
- return finish_class_member_access_expr (datum, component, false);
+ return finish_class_member_access_expr (datum, component, false,
+ tf_warning_or_error);
#else
return build_component_ref (datum, component);
#endif
(build_special_member_call
(build_ivar_reference (DECL_NAME (ivar)),
dtor ? complete_dtor_identifier : complete_ctor_identifier,
- NULL_TREE, type, LOOKUP_NORMAL));
+ NULL_TREE, type, LOOKUP_NORMAL, tf_warning_or_error));
}
}