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.carl...@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.carl...@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.
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" }
}