diff mbox

[C++] PR 58080

Message ID 51FEB6BC.7000900@oracle.com
State New
Headers show

Commit Message

Paolo Carlini Aug. 4, 2013, 8:17 p.m. UTC
Hi,

another case of "Error reporting routines re-entered", due to the 
pedwarns in c-common.c:pointer_int_sum. Usual solution, propagate complain.

Note: I can't just pass the complain of type tsubst_flags_t to 
pointer_int_sum, because it can be, and it is for the testcase, 
tf_none|tf_decltype, I really have to check for tf_warning_or_error. 
Tested x86_64-linux.

Thanks,
Paolo.

/////////////////////////
/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.

Comments

Jason Merrill Aug. 5, 2013, 9:30 p.m. UTC | #1
OK.

Jason
diff mbox

Patch

Index: c-family/c-common.c
===================================================================
--- c-family/c-common.c	(revision 201473)
+++ c-family/c-common.c	(working copy)
@@ -4284,7 +4284,7 @@  shorten_compare (tree *op0_ptr, tree *op1_ptr, tre
 
 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 re
 
   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
Index: c-family/c-common.h
===================================================================
--- c-family/c-common.h	(revision 201473)
+++ c-family/c-common.h	(working copy)
@@ -790,7 +790,8 @@  extern tree shorten_binary_op (tree result_type, t
    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);
Index: cp/typeck.c
===================================================================
--- cp/typeck.c	(revision 201473)
+++ cp/typeck.c	(working copy)
@@ -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 @@  static tree
   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.
Index: testsuite/g++.dg/cpp0x/pr58080.C
===================================================================
--- testsuite/g++.dg/cpp0x/pr58080.C	(revision 0)
+++ testsuite/g++.dg/cpp0x/pr58080.C	(working copy)
@@ -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);
+}