Commit fd9b0f32 by Paolo Carlini Committed by Paolo Carlini

re PR c++/58080 (internal compiler error, decltype in function declaration (for SFINAE purposes))

/c-family
2013-08-05  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/58080
	* c-common.c (pointer_int_sum): Add bool parameter.
	* c-common.h (pointer_int_sum): Adjust declaration.

/cp
2013-08-05  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/58080
	* typeck.c (cp_pointer_int_sum): Add tsubst_flags_t parameter.
	(cp_build_binary_op): Adjust.

/testsuite
2013-08-05  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/58080
	* g++.dg/cpp0x/pr58080.C: New.

From-SVN: r201512
parent 8ac69a6c
2013-08-05 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/58080
* c-common.c (pointer_int_sum): Add bool parameter.
* c-common.h (pointer_int_sum): Adjust declaration.
2013-08-05 Gabriel Dos Reis <gdr@integrable-solutions.net> 2013-08-05 Gabriel Dos Reis <gdr@integrable-solutions.net>
* c-pretty-print.c (print_c_tree): Simplify. Use non-static local * c-pretty-print.c (print_c_tree): Simplify. Use non-static local
......
...@@ -4284,7 +4284,7 @@ shorten_compare (tree *op0_ptr, tree *op1_ptr, tree *restype_ptr, ...@@ -4284,7 +4284,7 @@ shorten_compare (tree *op0_ptr, tree *op1_ptr, tree *restype_ptr,
tree tree
pointer_int_sum (location_t loc, enum tree_code resultcode, pointer_int_sum (location_t loc, enum tree_code resultcode,
tree ptrop, tree intop) tree ptrop, tree intop, bool complain)
{ {
tree size_exp, ret; tree size_exp, ret;
...@@ -4293,14 +4293,20 @@ pointer_int_sum (location_t loc, enum tree_code resultcode, ...@@ -4293,14 +4293,20 @@ pointer_int_sum (location_t loc, enum tree_code resultcode,
if (TREE_CODE (TREE_TYPE (result_type)) == VOID_TYPE) if (TREE_CODE (TREE_TYPE (result_type)) == VOID_TYPE)
{ {
pedwarn (loc, OPT_Wpointer_arith, if (complain && warn_pointer_arith)
"pointer of type %<void *%> used in arithmetic"); pedwarn (loc, OPT_Wpointer_arith,
"pointer of type %<void *%> used in arithmetic");
else if (!complain)
return error_mark_node;
size_exp = integer_one_node; size_exp = integer_one_node;
} }
else if (TREE_CODE (TREE_TYPE (result_type)) == FUNCTION_TYPE) else if (TREE_CODE (TREE_TYPE (result_type)) == FUNCTION_TYPE)
{ {
pedwarn (loc, OPT_Wpointer_arith, if (complain && warn_pointer_arith)
"pointer to a function used in arithmetic"); pedwarn (loc, OPT_Wpointer_arith,
"pointer to a function used in arithmetic");
else if (!complain)
return error_mark_node;
size_exp = integer_one_node; size_exp = integer_one_node;
} }
else else
......
...@@ -790,7 +790,8 @@ extern tree shorten_binary_op (tree result_type, tree op0, tree op1, bool bitwis ...@@ -790,7 +790,8 @@ extern tree shorten_binary_op (tree result_type, tree op0, tree op1, bool bitwis
and, if so, perhaps change them both back to their original type. */ and, if so, perhaps change them both back to their original type. */
extern tree shorten_compare (tree *, tree *, tree *, enum tree_code *); extern tree shorten_compare (tree *, tree *, tree *, enum tree_code *);
extern tree pointer_int_sum (location_t, enum tree_code, tree, tree); extern tree pointer_int_sum (location_t, enum tree_code, tree, tree,
bool = true);
/* Add qualifiers to a type, in the fashion for C. */ /* Add qualifiers to a type, in the fashion for C. */
extern tree c_build_qualified_type (tree, int); extern tree c_build_qualified_type (tree, int);
......
2013-08-05 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/58080
* typeck.c (cp_pointer_int_sum): Add tsubst_flags_t parameter.
(cp_build_binary_op): Adjust.
2013-08-04 Gabriel Dos Reis <gdr@integrable-solutions.net> 2013-08-04 Gabriel Dos Reis <gdr@integrable-solutions.net>
* cxx-pretty-print.h (pp_c_base): Remove. * cxx-pretty-print.h (pp_c_base): Remove.
......
...@@ -43,7 +43,7 @@ static tree pfn_from_ptrmemfunc (tree); ...@@ -43,7 +43,7 @@ static tree pfn_from_ptrmemfunc (tree);
static tree delta_from_ptrmemfunc (tree); static tree delta_from_ptrmemfunc (tree);
static tree convert_for_assignment (tree, tree, impl_conv_rhs, tree, int, static tree convert_for_assignment (tree, tree, impl_conv_rhs, tree, int,
tsubst_flags_t, int); tsubst_flags_t, int);
static tree cp_pointer_int_sum (enum tree_code, tree, tree); static tree cp_pointer_int_sum (enum tree_code, tree, tree, tsubst_flags_t);
static tree rationalize_conditional_expr (enum tree_code, tree, static tree rationalize_conditional_expr (enum tree_code, tree,
tsubst_flags_t); tsubst_flags_t);
static int comp_ptr_ttypes_real (tree, tree, int); static int comp_ptr_ttypes_real (tree, tree, int);
...@@ -4064,7 +4064,8 @@ cp_build_binary_op (location_t location, ...@@ -4064,7 +4064,8 @@ cp_build_binary_op (location_t location,
} }
return cp_pointer_int_sum (code, return cp_pointer_int_sum (code,
ptr_operand, ptr_operand,
int_operand); int_operand,
complain);
} }
common = 1; common = 1;
break; break;
...@@ -4894,7 +4895,8 @@ build_x_vec_perm_expr (location_t loc, ...@@ -4894,7 +4895,8 @@ build_x_vec_perm_expr (location_t loc,
of pointer PTROP and integer INTOP. */ of pointer PTROP and integer INTOP. */
static tree static tree
cp_pointer_int_sum (enum tree_code resultcode, tree ptrop, tree intop) cp_pointer_int_sum (enum tree_code resultcode, tree ptrop, tree intop,
tsubst_flags_t complain)
{ {
tree res_type = TREE_TYPE (ptrop); tree res_type = TREE_TYPE (ptrop);
...@@ -4906,7 +4908,8 @@ cp_pointer_int_sum (enum tree_code resultcode, tree ptrop, tree intop) ...@@ -4906,7 +4908,8 @@ cp_pointer_int_sum (enum tree_code resultcode, tree ptrop, tree intop)
complete_type (TREE_TYPE (res_type)); complete_type (TREE_TYPE (res_type));
return pointer_int_sum (input_location, resultcode, ptrop, return pointer_int_sum (input_location, resultcode, ptrop,
fold_if_not_in_template (intop)); fold_if_not_in_template (intop),
complain & tf_warning_or_error);
} }
/* Return a tree for the difference of pointers OP0 and OP1. /* Return a tree for the difference of pointers OP0 and OP1.
......
2013-08-05 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/58080
* g++.dg/cpp0x/pr58080.C: New.
2013-08-05 David Malcolm <dmalcolm@redhat.com> 2013-08-05 David Malcolm <dmalcolm@redhat.com>
* lib/plugin-support.exp (plugin-test-execute): Add -fno-rtti * lib/plugin-support.exp (plugin-test-execute): Add -fno-rtti
......
// PR c++/58080
// { dg-do compile { target c++11 } }
template<class A, class B>
struct Eval
{
void foo(A a, B b) { bar(a,b, 0); }
auto bar(A a, B b, decltype(a+b)* _) -> decltype(a+b) { return a+b; } // { dg-error "pointer" }
};
int main()
{
Eval<int,void*> eiv; eiv.foo(0,0);
}
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