Commit d555b1c7 by Paolo Carlini Committed by Paolo Carlini

re PR c++/44969 ([C++0x] <type_traits> std::is_constructible broken for fundamental types.)

/cp
2010-07-19  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/44969
	* typeck.c (build_x_compound_expr_from_list): Add tsubst_flags_t
	parameter.
	* cp-tree.h: Adjust declaration.
	* init.c (perform_member_init): Adjust caller.
	* decl.c (grok_reference_init, cp_finish_decl): Likewise.
	* typeck2.c (store_init_value): Likewise.
	(build_functional_cast): Pass complain argument to
	build_x_compound_expr_from_list.

/testsuite
2010-07-19  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/44969
	* g++.dg/template/sfinae23.C: New.

From-SVN: r162303
parent b1d5eee8
2010-07-19 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/44969
* typeck.c (build_x_compound_expr_from_list): Add tsubst_flags_t
parameter.
* cp-tree.h: Adjust declaration.
* init.c (perform_member_init): Adjust caller.
* decl.c (grok_reference_init, cp_finish_decl): Likewise.
* typeck2.c (store_init_value): Likewise.
(build_functional_cast): Pass complain argument to
build_x_compound_expr_from_list.
2010-07-16 Jason Merrill <jason@redhat.com> 2010-07-16 Jason Merrill <jason@redhat.com>
PR c++/32505 PR c++/32505
......
...@@ -5462,7 +5462,8 @@ extern tree cp_build_unary_op (enum tree_code, tree, int, ...@@ -5462,7 +5462,8 @@ extern tree cp_build_unary_op (enum tree_code, tree, int,
extern tree unary_complex_lvalue (enum tree_code, tree); extern tree unary_complex_lvalue (enum tree_code, tree);
extern tree build_x_conditional_expr (tree, tree, tree, extern tree build_x_conditional_expr (tree, tree, tree,
tsubst_flags_t); tsubst_flags_t);
extern tree build_x_compound_expr_from_list (tree, expr_list_kind); extern tree build_x_compound_expr_from_list (tree, expr_list_kind,
tsubst_flags_t);
extern tree build_x_compound_expr_from_vec (VEC(tree,gc) *, const char *); extern tree build_x_compound_expr_from_vec (VEC(tree,gc) *, const char *);
extern tree build_x_compound_expr (tree, tree, tsubst_flags_t); extern tree build_x_compound_expr (tree, tree, tsubst_flags_t);
extern tree build_compound_expr (location_t, tree, tree); extern tree build_compound_expr (location_t, tree, tree);
......
...@@ -4462,7 +4462,8 @@ grok_reference_init (tree decl, tree type, tree init, tree *cleanup) ...@@ -4462,7 +4462,8 @@ grok_reference_init (tree decl, tree type, tree init, tree *cleanup)
} }
if (TREE_CODE (init) == TREE_LIST) if (TREE_CODE (init) == TREE_LIST)
init = build_x_compound_expr_from_list (init, ELK_INIT); init = build_x_compound_expr_from_list (init, ELK_INIT,
tf_warning_or_error);
if (TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE if (TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE
&& TREE_CODE (TREE_TYPE (init)) == ARRAY_TYPE) && TREE_CODE (TREE_TYPE (init)) == ARRAY_TYPE)
...@@ -5683,7 +5684,8 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p, ...@@ -5683,7 +5684,8 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
return; return;
} }
if (TREE_CODE (init) == TREE_LIST) if (TREE_CODE (init) == TREE_LIST)
init = build_x_compound_expr_from_list (init, ELK_INIT); init = build_x_compound_expr_from_list (init, ELK_INIT,
tf_warning_or_error);
if (describable_type (init)) if (describable_type (init))
{ {
type = TREE_TYPE (decl) = do_auto_deduction (type, init, auto_node); type = TREE_TYPE (decl) = do_auto_deduction (type, init, auto_node);
......
...@@ -525,7 +525,8 @@ perform_member_init (tree member, tree init) ...@@ -525,7 +525,8 @@ perform_member_init (tree member, tree init)
else if (TREE_CODE (init) == TREE_LIST) else if (TREE_CODE (init) == TREE_LIST)
/* There was an explicit member initialization. Do some work /* There was an explicit member initialization. Do some work
in that case. */ in that case. */
init = build_x_compound_expr_from_list (init, ELK_MEM_INIT); init = build_x_compound_expr_from_list (init, ELK_MEM_INIT,
tf_warning_or_error);
if (init) if (init)
finish_expr_stmt (cp_build_modify_expr (decl, INIT_EXPR, init, finish_expr_stmt (cp_build_modify_expr (decl, INIT_EXPR, init,
......
...@@ -5502,14 +5502,16 @@ build_x_conditional_expr (tree ifexp, tree op1, tree op2, ...@@ -5502,14 +5502,16 @@ build_x_conditional_expr (tree ifexp, tree op1, tree op2,
that performs them all and returns the value of the last of them. */ that performs them all and returns the value of the last of them. */
tree tree
build_x_compound_expr_from_list (tree list, expr_list_kind exp) build_x_compound_expr_from_list (tree list, expr_list_kind exp,
tsubst_flags_t complain)
{ {
tree expr = TREE_VALUE (list); tree expr = TREE_VALUE (list);
if (TREE_CHAIN (list)) if (TREE_CHAIN (list))
{ {
switch (exp) if (complain & tf_error)
{ switch (exp)
{
case ELK_INIT: case ELK_INIT:
permerror (input_location, "expression list treated as compound " permerror (input_location, "expression list treated as compound "
"expression in initializer"); "expression in initializer");
...@@ -5524,11 +5526,11 @@ build_x_compound_expr_from_list (tree list, expr_list_kind exp) ...@@ -5524,11 +5526,11 @@ build_x_compound_expr_from_list (tree list, expr_list_kind exp)
break; break;
default: default:
gcc_unreachable (); gcc_unreachable ();
} }
for (list = TREE_CHAIN (list); list; list = TREE_CHAIN (list)) for (list = TREE_CHAIN (list); list; list = TREE_CHAIN (list))
expr = build_x_compound_expr (expr, TREE_VALUE (list), expr = build_x_compound_expr (expr, TREE_VALUE (list),
tf_warning_or_error); complain);
} }
return expr; return expr;
......
...@@ -737,7 +737,8 @@ store_init_value (tree decl, tree init, int flags) ...@@ -737,7 +737,8 @@ store_init_value (tree decl, tree init, int flags)
} }
else else
/* We get here with code like `int a (2);' */ /* We get here with code like `int a (2);' */
init = build_x_compound_expr_from_list (init, ELK_INIT); init = build_x_compound_expr_from_list (init, ELK_INIT,
tf_warning_or_error);
} }
/* End of special C++ code. */ /* End of special C++ code. */
...@@ -1594,7 +1595,7 @@ build_functional_cast (tree exp, tree parms, tsubst_flags_t complain) ...@@ -1594,7 +1595,7 @@ build_functional_cast (tree exp, tree parms, tsubst_flags_t complain)
return cp_convert (type, integer_zero_node); return cp_convert (type, integer_zero_node);
/* This must build a C cast. */ /* This must build a C cast. */
parms = build_x_compound_expr_from_list (parms, ELK_FUNC_CAST); parms = build_x_compound_expr_from_list (parms, ELK_FUNC_CAST, complain);
return cp_build_c_cast (type, parms, complain); return cp_build_c_cast (type, parms, complain);
} }
......
2010-07-19 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/44969
* g++.dg/template/sfinae23.C: New.
2010-07-19 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> 2010-07-19 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* lib/target-supports.exp (check_sse_os_support_available): New * lib/target-supports.exp (check_sse_os_support_available): New
......
// PR c++/44969
// { dg-options "-std=c++0x" }
template<typename Tp, typename... Args>
class mini_is_constructible
{
typedef char one;
typedef struct { char arr[2]; } two;
template<typename Tp1, typename... Args1>
static decltype(Tp1(Args1()...), one())
test(int);
template<typename, typename...>
static two test(...);
public:
static const bool value = sizeof(test<Tp, Args...>(0)) == 1;
};
class A { };
int Test[mini_is_constructible<int, A, A>::value ? -1 : 1];
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment