[C++] Improve cp_truthvalue_conversion locations and more
diff mbox series

Message ID 747cd7ff-14fd-90a3-3ace-de9777ded0a0@oracle.com
State New
Headers show
Series
  • [C++] Improve cp_truthvalue_conversion locations and more
Related show

Commit Message

Paolo Carlini Nov. 12, 2019, 8:57 a.m. UTC
Hi,

a few days ago I noticed that we weren't doing the right thing 
location-wise for the first test of g++.dg/warn/Waddress-1.C: it seems 
clear that the ultimate reason is that we didn't pass an accurate 
location to build_binary_op called from cp_truthvalue_conversion. When I 
fixed that, I noticed that for testcases like warn/Walways-true-3.C we 
were issuing many duplicate warnings and I traced that to ocp_convert 
not using its tsubst_flags_t argument - which can come from 
cp_convert_and_check as tf_none - when calling cp_truthvalue_conversion. 
Thus I also added a tusbst_flags_t parameter to the latter and 
everything looks finally good for these testcases.

Tested x86_64-linux.

Thanks, Paolo.

////////////////////////
/cp
2019-11-12  Paolo Carlini  <paolo.carlini@oracle.com>

	* typeck.c (cp_truthvalue_conversion): Add tsubst_flags_t parameter
	and use it in calls; also pass the location_t of the expression to
	cp_build_binary_op and c_common_truthvalue_conversion.
	* rtti.c (build_dynamic_cast_1): Adjust call.
	* cvt.c (ocp_convert): Likewise.
	* cp-gimplify.c (cp_fold): Likewise.
	* cp-tree.h (cp_truthvalue_conversion): Update declaration.

/testsuite
2019-11-12  Paolo Carlini  <paolo.carlini@oracle.com>

	* g++.dg/warn/Walways-true-1.C: Check locations too.
	* g++.dg/warn/Walways-true-2.C: Likewise.
	* g++.dg/warn/Walways-true-3.C: Likewise.
	* g++.dg/warn/Waddress-1.C: Check additional location.

Comments

Jason Merrill Nov. 15, 2019, 9 p.m. UTC | #1
On 11/12/19 8:57 AM, Paolo Carlini wrote:
> Hi,
> 
> a few days ago I noticed that we weren't doing the right thing 
> location-wise for the first test of g++.dg/warn/Waddress-1.C: it seems 
> clear that the ultimate reason is that we didn't pass an accurate 
> location to build_binary_op called from cp_truthvalue_conversion. When I 
> fixed that, I noticed that for testcases like warn/Walways-true-3.C we 
> were issuing many duplicate warnings and I traced that to ocp_convert 
> not using its tsubst_flags_t argument - which can come from 
> cp_convert_and_check as tf_none - when calling cp_truthvalue_conversion. 
> Thus I also added a tusbst_flags_t parameter to the latter and 
> everything looks finally good for these testcases.
> 
> Tested x86_64-linux.
> 
> Thanks, Paolo.
> 
> ////////////////////////
> 
OK.

Patch
diff mbox series

Index: cp/cp-gimplify.c
===================================================================
--- cp/cp-gimplify.c	(revision 278059)
+++ cp/cp-gimplify.c	(working copy)
@@ -2573,9 +2573,9 @@  cp_fold (tree x)
 	{
 	  warning_sentinel s (warn_int_in_bool_context);
 	  if (!VOID_TYPE_P (TREE_TYPE (op1)))
-	    op1 = cp_truthvalue_conversion (op1);
+	    op1 = cp_truthvalue_conversion (op1, tf_warning_or_error);
 	  if (!VOID_TYPE_P (TREE_TYPE (op2)))
-	    op2 = cp_truthvalue_conversion (op2);
+	    op2 = cp_truthvalue_conversion (op2, tf_warning_or_error);
 	}
       else if (VOID_TYPE_P (TREE_TYPE (x)))
 	{
Index: cp/cp-tree.h
===================================================================
--- cp/cp-tree.h	(revision 278059)
+++ cp/cp-tree.h	(working copy)
@@ -7445,7 +7445,7 @@  enum compare_bounds_t { bounds_none, bounds_either
 
 extern bool cxx_mark_addressable		(tree, bool = false);
 extern int string_conv_p			(const_tree, const_tree, int);
-extern tree cp_truthvalue_conversion		(tree);
+extern tree cp_truthvalue_conversion		(tree, tsubst_flags_t);
 extern tree contextual_conv_bool		(tree, tsubst_flags_t);
 extern tree condition_conversion		(tree);
 extern tree require_complete_type		(tree);
Index: cp/cvt.c
===================================================================
--- cp/cvt.c	(revision 278059)
+++ cp/cvt.c	(working copy)
@@ -841,13 +841,13 @@  ocp_convert (tree type, tree expr, int convtype, i
 	  if (SCOPED_ENUM_P (intype) && (convtype & CONV_STATIC))
 	    e = build_nop (ENUM_UNDERLYING_TYPE (intype), e);
 	  if (complain & tf_warning)
-	    return cp_truthvalue_conversion (e);
+	    return cp_truthvalue_conversion (e, complain);
 	  else
 	    {
 	      /* Prevent bogus -Wint-in-bool-context warnings coming
 		 from c_common_truthvalue_conversion down the line.  */
 	      warning_sentinel w (warn_int_in_bool_context);
-	      return cp_truthvalue_conversion (e);
+	      return cp_truthvalue_conversion (e, complain);
 	    }
 	}
 
Index: cp/rtti.c
===================================================================
--- cp/rtti.c	(revision 278059)
+++ cp/rtti.c	(working copy)
@@ -782,7 +782,7 @@  build_dynamic_cast_1 (tree type, tree expr, tsubst
 	      tree neq;
 
 	      result = save_expr (result);
-	      neq = cp_truthvalue_conversion (result);
+	      neq = cp_truthvalue_conversion (result, complain);
 	      return cp_convert (type,
 				 build3 (COND_EXPR, TREE_TYPE (result),
 					 neq, result, bad), complain);
Index: cp/typeck.c
===================================================================
--- cp/typeck.c	(revision 278059)
+++ cp/typeck.c	(working copy)
@@ -5975,15 +5975,16 @@  cp_build_addressof (location_t loc, tree arg, tsub
    -1.  */
 
 tree
-cp_truthvalue_conversion (tree expr)
+cp_truthvalue_conversion (tree expr, tsubst_flags_t complain)
 {
   tree type = TREE_TYPE (expr);
+  location_t loc = cp_expr_loc_or_input_loc (expr);
   if (TYPE_PTR_OR_PTRMEM_P (type)
       /* Avoid ICE on invalid use of non-static member function.  */
       || TREE_CODE (expr) == FUNCTION_DECL)
-    return build_binary_op (input_location, NE_EXPR, expr, nullptr_node, true);
+    return cp_build_binary_op (loc, NE_EXPR, expr, nullptr_node, complain);
   else
-    return c_common_truthvalue_conversion (input_location, expr);
+    return c_common_truthvalue_conversion (loc, expr);
 }
 
 /* Returns EXPR contextually converted to bool.  */
Index: testsuite/g++.dg/warn/Waddress-1.C
===================================================================
--- testsuite/g++.dg/warn/Waddress-1.C	(revision 278070)
+++ testsuite/g++.dg/warn/Waddress-1.C	(working copy)
@@ -13,7 +13,7 @@  S s;
 T t;
 double d;
 
-void f()  { if (z) z(); }               // { dg-warning "address" }
+void f()  { if (z) z(); }               // { dg-warning "17:address" }
 
 void gl() { if (z != 0) z(); }          // { dg-warning "19:address" }
 void hl() { if (z != (ptrf)0) z(); }    // { dg-warning "19:address" }
Index: testsuite/g++.dg/warn/Walways-true-1.C
===================================================================
--- testsuite/g++.dg/warn/Walways-true-1.C	(revision 278070)
+++ testsuite/g++.dg/warn/Walways-true-1.C	(working copy)
@@ -12,46 +12,46 @@  void
 bar (int a)
 {
  lab:
-  if (foo)	// { dg-warning "always evaluate as|never be NULL" "correct warning" }
+  if (foo)	// { dg-warning "7:the address of .int foo\\(int\\). will never be NULL" "correct warning" }
     foo (0);
   if (foo (1))
     ;
-  if (&i)	// { dg-warning "always evaluate as|never be NULL" "correct warning" }
+  if (&i)	// { dg-warning "7:the address of .i. will never be NULL" "correct warning" }
     foo (2);
   if (i)
     foo (3);
-  if (&a)	// { dg-warning "always evaluate as|never be NULL" "correct warning" }
+  if (&a)	// { dg-warning "7:the address of .a. will never be NULL" "correct warning" }
     foo (4);
   if (a)
     foo (5);
-  if (&&lab)	// { dg-warning "always evaluate as|never be NULL" "correct warning" }
+  if (&&lab)	// { dg-warning "7:the address of .lab. will never be NULL" "correct warning" }
     foo (6);
-  if (foo == 0)	// { dg-warning "never be NULL" "correct warning" }
+  if (foo == 0)	// { dg-warning "11:the address of .int foo\\(int\\). will never be NULL" "correct warning" }
     foo (7);
   if (foo (1) == 0)
     foo (8);
-  if (&i == 0)	// { dg-warning "never be NULL" "correct warning" }
+  if (&i == 0)	// { dg-warning "10:the address of .i. will never be NULL" "correct warning" }
     foo (9);
   if (i == 0)
     foo (10);
-  if (&a == 0)	// { dg-warning "never be NULL" "correct warning" }
+  if (&a == 0)	// { dg-warning "10:the address of .a. will never be NULL" "correct warning" }
     foo (11);
   if (a == 0)
     foo (12);
-  if (&&lab == 0) // { dg-warning "never be NULL" "correct warning" }
+  if (&&lab == 0) // { dg-warning "13:the address of .lab. will never be NULL" "correct warning" }
     foo (13);
-  if (0 == foo)	// { dg-warning "never be NULL" "correct warning" }
+  if (0 == foo)	// { dg-warning "9:the address of .int foo\\(int\\). will never be NULL" "correct warning" }
     foo (14);
   if (0 == foo (1))
     foo (15);
-  if (0 == &i)	// { dg-warning "never be NULL" "correct warning" }
+  if (0 == &i)	// { dg-warning "9:the address of .i. will never be NULL" "correct warning" }
     foo (16);
   if (0 == i)
     foo (17);
-  if (0 == &a)	// { dg-warning "never be NULL" "correct warning" }
+  if (0 == &a)	// { dg-warning "9:the address of .a. will never be NULL" "correct warning" }
     foo (18);
   if (0 == a)
     foo (19);
-  if (0 == &&lab) // { dg-warning "never be NULL" "correct warning" }
+  if (0 == &&lab) // { dg-warning "9:the address of .lab. will never be NULL" "correct warning" }
     foo (20);
 }
Index: testsuite/g++.dg/warn/Walways-true-2.C
===================================================================
--- testsuite/g++.dg/warn/Walways-true-2.C	(revision 278070)
+++ testsuite/g++.dg/warn/Walways-true-2.C	(working copy)
@@ -23,11 +23,11 @@  bar (int a)
     foo (2);
   if (i)
     foo (3);
-  if (&a)	// { dg-warning "always evaluate as|never be NULL" "correct warning" }
+  if (&a)	// { dg-warning "7:the address of .a. will never be NULL" "correct warning" }
     foo (4);
   if (a)
     foo (5);
-  if (&&lab)	// { dg-warning "always evaluate as|never be NULL" "correct warning" }
+  if (&&lab)	// { dg-warning "7:the address of .lab. will never be NULL" "correct warning" }
     foo (6);
   if (foo == 0)
     foo (7);
@@ -37,11 +37,11 @@  bar (int a)
     foo (9);
   if (i == 0)
     foo (10);
-  if (&a == 0)	// { dg-warning "never be NULL" "correct warning" }
+  if (&a == 0)	// { dg-warning "10:the address of .a. will never be NULL" "correct warning" }
     foo (11);
   if (a == 0)
     foo (12);
-  if (&&lab == 0) // { dg-warning "never be NULL" "correct warning" }
+  if (&&lab == 0) // { dg-warning "13:the address of .lab. will never be NULL" "correct warning" }
     foo (13);
   if (0 == foo)
     foo (14);
@@ -51,10 +51,10 @@  bar (int a)
     foo (16);
   if (0 == i)
     foo (17);
-  if (0 == &a)	// { dg-warning "never be NULL" "correct warning" }
+  if (0 == &a)	// { dg-warning "9:the address of .a. will never be NULL" "correct warning" }
     foo (18);
   if (0 == a)
     foo (19);
-  if (0 == &&lab) // { dg-warning "never be NULL" "correct warning" }
+  if (0 == &&lab) // { dg-warning "9:the address of .lab. will never be NULL" "correct warning" }
     foo (20);
 }
Index: testsuite/g++.dg/warn/Walways-true-3.C
===================================================================
--- testsuite/g++.dg/warn/Walways-true-3.C	(revision 278070)
+++ testsuite/g++.dg/warn/Walways-true-3.C	(working copy)
@@ -11,28 +11,28 @@  bar (int &a)
 {
   int &b = a;
 
-  if ((int *)&a) // { dg-warning "address of" }
+  if ((int *)&a) // { dg-warning "7:the compiler can assume that the address of" }
     foo ();
 
-  if (&b) // { dg-warning "address of" }
+  if (&b) // { dg-warning "7:the compiler can assume that the address of" }
     foo ();
 
-  if (!&c) // { dg-warning "address of" }
+  if (!&c) // { dg-warning "8:the compiler can assume that the address of" }
     foo ();
 
-  if (!&(int &)(int &)a) // { dg-warning "address of" }
+  if (!&(int &)(int &)a) // { dg-warning "8:the compiler can assume that the address of" }
     foo ();
 
-  if (&a == 0) // { dg-warning "never be NULL" }
+  if (&a == 0) // { dg-warning "10:the compiler can assume that the address of" }
     foo ();
 
-  if (&b != 0) // { dg-warning "never be NULL" }
+  if (&b != 0) // { dg-warning "10:the compiler can assume that the address of" }
     foo ();
 
-  if (0 == &(int &)(int &)c) // { dg-warning "never be NULL" }
+  if (0 == &(int &)(int &)c) // { dg-warning "9:the compiler can assume that the address of" }
     foo ();
 
-  if (&a != (int *)0) // { dg-warning "never be NULL" }
+  if (&a != (int *)0) // { dg-warning "10:the compiler can assume that the address of" }
     foo ();
 }
 
@@ -40,7 +40,7 @@  bool
 bar_1 (int &a)
 {
   if (d == 5)
-    return &a; // { dg-warning "address of" }
+    return &a; // { dg-warning "12:the compiler can assume that the address of" }
   else
-    return !&(int &)(int &)a; // { dg-warning "address of" }
+    return !&(int &)(int &)a; // { dg-warning "13:the compiler can assume that the address of" }
 }