summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2013-08-05 22:03:52 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2013-08-05 22:03:52 +0000
commit42f9a786da7981833d1b44455c4ef61085431af6 (patch)
tree972828ab28f5fc63eb5a27940150211bbef325be
parentbde4aa78dfcd70b4cef5ac2829bfa97bdc56672c (diff)
downloadgcc-42f9a786da7981833d1b44455c4ef61085431af6.tar.gz
/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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@201512 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/c-family/ChangeLog6
-rw-r--r--gcc/c-family/c-common.c16
-rw-r--r--gcc/c-family/c-common.h3
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/typeck.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/pr58080.C14
7 files changed, 51 insertions, 10 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index b83c5363637..823c0f79b5a 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,9 @@
+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>
* c-pretty-print.c (print_c_tree): Simplify. Use non-static local
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index 2c806abe470..5d1a1c6c2ce 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -4284,7 +4284,7 @@ shorten_compare (tree *op0_ptr, tree *op1_ptr, tree *restype_ptr,
tree
pointer_int_sum (location_t loc, enum tree_code resultcode,
- tree ptrop, tree intop)
+ tree ptrop, tree intop, bool complain)
{
tree size_exp, ret;
@@ -4293,14 +4293,20 @@ pointer_int_sum (location_t loc, enum tree_code resultcode,
if (TREE_CODE (TREE_TYPE (result_type)) == VOID_TYPE)
{
- pedwarn (loc, OPT_Wpointer_arith,
- "pointer of type %<void *%> used in arithmetic");
+ if (complain && warn_pointer_arith)
+ pedwarn (loc, OPT_Wpointer_arith,
+ "pointer of type %<void *%> used in arithmetic");
+ else if (!complain)
+ return error_mark_node;
size_exp = integer_one_node;
}
else if (TREE_CODE (TREE_TYPE (result_type)) == FUNCTION_TYPE)
{
- pedwarn (loc, OPT_Wpointer_arith,
- "pointer to a function used in arithmetic");
+ if (complain && warn_pointer_arith)
+ pedwarn (loc, OPT_Wpointer_arith,
+ "pointer to a function used in arithmetic");
+ else if (!complain)
+ return error_mark_node;
size_exp = integer_one_node;
}
else
diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h
index dc430c3859c..cc09dbc008f 100644
--- a/gcc/c-family/c-common.h
+++ b/gcc/c-family/c-common.h
@@ -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. */
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. */
extern tree c_build_qualified_type (tree, int);
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index a52cbc9c9a9..f85fd3f1b32 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+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>
* cxx-pretty-print.h (pp_c_base): Remove.
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index 6f330559adf..e09c325d51b 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -43,7 +43,7 @@ static tree pfn_from_ptrmemfunc (tree);
static tree delta_from_ptrmemfunc (tree);
static tree convert_for_assignment (tree, tree, impl_conv_rhs, tree, 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,
tsubst_flags_t);
static int comp_ptr_ttypes_real (tree, tree, int);
@@ -4064,7 +4064,8 @@ cp_build_binary_op (location_t location,
}
return cp_pointer_int_sum (code,
ptr_operand,
- int_operand);
+ int_operand,
+ complain);
}
common = 1;
break;
@@ -4894,7 +4895,8 @@ build_x_vec_perm_expr (location_t loc,
of pointer PTROP and integer INTOP. */
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);
@@ -4906,7 +4908,8 @@ cp_pointer_int_sum (enum tree_code resultcode, tree ptrop, tree intop)
complete_type (TREE_TYPE (res_type));
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.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 403a2685cf5..92aff7a9f51 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+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>
* lib/plugin-support.exp (plugin-test-execute): Add -fno-rtti
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr58080.C b/gcc/testsuite/g++.dg/cpp0x/pr58080.C
new file mode 100644
index 00000000000..82f200df044
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/pr58080.C
@@ -0,0 +1,14 @@
+// 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);
+}