re PR c++/48535 ([C++0x][SFINAE] Hard errors during list-value-initialization)
PR c++/48535 * semantics.c (finish_compound_literal): Take complain parm. (build_lambda_object): Adjust. * cp-tree.h: Adjust. * call.c (convert_like_real): Adjust. * decl.c (check_initializer): Adjust. * parser.c (cp_parser_postfix_expression): Adjust. (cp_parser_functional_cast): Adjust. * pt.c (tsubst_copy_and_build): Adjust. * typeck2.c (process_init_constructor_record): Adjust. From-SVN: r172285
This commit is contained in:
parent
55b13820b4
commit
834aa42659
|
@ -1,5 +1,16 @@
|
|||
2011-04-11 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/48535
|
||||
* semantics.c (finish_compound_literal): Take complain parm.
|
||||
(build_lambda_object): Adjust.
|
||||
* cp-tree.h: Adjust.
|
||||
* call.c (convert_like_real): Adjust.
|
||||
* decl.c (check_initializer): Adjust.
|
||||
* parser.c (cp_parser_postfix_expression): Adjust.
|
||||
(cp_parser_functional_cast): Adjust.
|
||||
* pt.c (tsubst_copy_and_build): Adjust.
|
||||
* typeck2.c (process_init_constructor_record): Adjust.
|
||||
|
||||
PR c++/48534
|
||||
* cvt.c (ocp_convert): Use build_nop to convert to underlying type
|
||||
of scoped enum.
|
||||
|
|
|
@ -5495,7 +5495,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
|
|||
elttype = cp_build_qualified_type
|
||||
(elttype, cp_type_quals (elttype) | TYPE_QUAL_CONST);
|
||||
array = build_array_of_n_type (elttype, len);
|
||||
array = finish_compound_literal (array, new_ctor);
|
||||
array = finish_compound_literal (array, new_ctor, complain);
|
||||
|
||||
/* Build up the initializer_list object. */
|
||||
totype = complete_type (totype);
|
||||
|
|
|
@ -5297,7 +5297,7 @@ extern tree finish_increment_expr (tree, enum tree_code);
|
|||
extern tree finish_this_expr (void);
|
||||
extern tree finish_pseudo_destructor_expr (tree, tree, tree);
|
||||
extern tree finish_unary_op_expr (enum tree_code, tree);
|
||||
extern tree finish_compound_literal (tree, tree);
|
||||
extern tree finish_compound_literal (tree, tree, tsubst_flags_t);
|
||||
extern tree finish_fname (tree);
|
||||
extern void finish_translation_unit (void);
|
||||
extern tree finish_template_type_parm (tree, tree);
|
||||
|
|
|
@ -5397,7 +5397,8 @@ check_initializer (tree decl, tree init, int flags, tree *cleanup)
|
|||
init appropriately so we can pass it into store_init_value
|
||||
for the error. */
|
||||
if (init && BRACE_ENCLOSED_INITIALIZER_P (init))
|
||||
init = finish_compound_literal (type, init);
|
||||
init = finish_compound_literal (type, init,
|
||||
tf_warning_or_error);
|
||||
else if (CLASS_TYPE_P (type)
|
||||
&& (!init || TREE_CODE (init) == TREE_LIST))
|
||||
{
|
||||
|
|
|
@ -4897,7 +4897,8 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
|
|||
postfix_expression
|
||||
= (finish_compound_literal
|
||||
(type, build_constructor (init_list_type_node,
|
||||
initializer_list)));
|
||||
initializer_list),
|
||||
tf_warning_or_error));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -19936,7 +19937,8 @@ cp_parser_functional_cast (cp_parser* parser, tree type)
|
|||
CONSTRUCTOR_IS_DIRECT_INIT (expression_list) = 1;
|
||||
if (TREE_CODE (type) == TYPE_DECL)
|
||||
type = TREE_TYPE (type);
|
||||
return finish_compound_literal (type, expression_list);
|
||||
return finish_compound_literal (type, expression_list,
|
||||
tf_warning_or_error);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -13262,7 +13262,7 @@ tsubst_copy_and_build (tree t,
|
|||
CONSTRUCTOR_IS_DIRECT_INIT (r) = CONSTRUCTOR_IS_DIRECT_INIT (t);
|
||||
|
||||
if (TREE_HAS_CONSTRUCTOR (t))
|
||||
return finish_compound_literal (type, r);
|
||||
return finish_compound_literal (type, r, complain);
|
||||
|
||||
TREE_TYPE (r) = type;
|
||||
return r;
|
||||
|
|
|
@ -2309,14 +2309,16 @@ finish_unary_op_expr (enum tree_code code, tree expr)
|
|||
the CONSTRUCTOR in COMPOUND_LITERAL is being cast. */
|
||||
|
||||
tree
|
||||
finish_compound_literal (tree type, tree compound_literal)
|
||||
finish_compound_literal (tree type, tree compound_literal,
|
||||
tsubst_flags_t complain)
|
||||
{
|
||||
if (type == error_mark_node)
|
||||
return error_mark_node;
|
||||
|
||||
if (!TYPE_OBJ_P (type))
|
||||
{
|
||||
error ("compound literal of non-object type %qT", type);
|
||||
if (complain & tf_error)
|
||||
error ("compound literal of non-object type %qT", type);
|
||||
return error_mark_node;
|
||||
}
|
||||
|
||||
|
@ -2338,7 +2340,7 @@ finish_compound_literal (tree type, tree compound_literal)
|
|||
that it came from T{} rather than T({}). */
|
||||
CONSTRUCTOR_IS_DIRECT_INIT (compound_literal) = 1;
|
||||
compound_literal = build_tree_list (NULL_TREE, compound_literal);
|
||||
return build_functional_cast (type, compound_literal, tf_error);
|
||||
return build_functional_cast (type, compound_literal, complain);
|
||||
}
|
||||
|
||||
if (TREE_CODE (type) == ARRAY_TYPE
|
||||
|
@ -7928,7 +7930,7 @@ build_lambda_object (tree lambda_expr)
|
|||
But we briefly treat it as an aggregate to make this simpler. */
|
||||
type = TREE_TYPE (lambda_expr);
|
||||
CLASSTYPE_NON_AGGREGATE (type) = 0;
|
||||
expr = finish_compound_literal (type, expr);
|
||||
expr = finish_compound_literal (type, expr, tf_warning_or_error);
|
||||
CLASSTYPE_NON_AGGREGATE (type) = 1;
|
||||
|
||||
out:
|
||||
|
|
|
@ -1126,7 +1126,8 @@ process_init_constructor_record (tree type, tree init)
|
|||
next = build_constructor (init_list_type_node, NULL);
|
||||
if (MAYBE_CLASS_TYPE_P (TREE_TYPE (field)))
|
||||
{
|
||||
next = finish_compound_literal (TREE_TYPE (field), next);
|
||||
next = finish_compound_literal (TREE_TYPE (field), next,
|
||||
tf_warning_or_error);
|
||||
/* direct-initialize the target. No temporary is going
|
||||
to be involved. */
|
||||
if (TREE_CODE (next) == TARGET_EXPR)
|
||||
|
|
Loading…
Reference in New Issue