typeck.c (cp_truthvalue_conversion): Add tsubst_flags_t parameter and use it in calls...
authorPaolo Carlini <paolo.carlini@oracle.com>
Fri, 15 Nov 2019 22:56:33 +0000 (22:56 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Fri, 15 Nov 2019 22:56:33 +0000 (22:56 +0000)
/cp
2019-11-15  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-15  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.

From-SVN: r278320

gcc/cp/ChangeLog
gcc/cp/cp-gimplify.c
gcc/cp/cp-tree.h
gcc/cp/cvt.c
gcc/cp/rtti.c
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/Waddress-1.C
gcc/testsuite/g++.dg/warn/Walways-true-1.C
gcc/testsuite/g++.dg/warn/Walways-true-2.C
gcc/testsuite/g++.dg/warn/Walways-true-3.C

index 0129731503bbbb854effeb233aa6d97f4be882b3..429ffd69e474521f0031f1683372aa787fa24ef9 100644 (file)
@@ -1,3 +1,13 @@
+2019-11-15  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.
+
 2019-11-14  Jason Merrill  <jason@redhat.com>
 
        Implement P1816R0, class template argument deduction for aggregates.
index 744707e792d9f748e9904458bdf05270c688f041..60766978c71858d8ce3105ed12eeae2a5d7d71d6 100644 (file)
@@ -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 56b75ca51f586c6075a0c2ffab2069c3658c4caf..d6e9357385af8a2205a0c589cc35fed3a47c4bf6 100644 (file)
@@ -7450,7 +7450,7 @@ enum compare_bounds_t { bounds_none, bounds_either, bounds_first };
 
 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 23facb77634f2f49854560ab26ddf9131636089b..bca687fd33b58a4d80f82f16bc5bd1a67488b891 100644 (file)
@@ -841,13 +841,13 @@ ocp_convert (tree type, tree expr, int convtype, int flags,
          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 1ba4a46c5cca2545ab01198ae305a67016a37e62..d987f8b4d8350ba419bda7c631562537a8b96581 100644 (file)
@@ -782,7 +782,7 @@ build_dynamic_cast_1 (tree type, tree expr, tsubst_flags_t complain)
              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 3144b7ef292d86695715a798558ec34c6970f8db..747ae42f9120f600e41651fcfa2415c38babe23a 100644 (file)
@@ -5981,15 +5981,16 @@ cp_build_addressof (location_t loc, tree arg, tsubst_flags_t complain)
    -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 8473e7a219e9c601b890f38a53a56d1f9a61e0da..997096cf1d67b1fdeae6d217b06a02cd3c4fa6e3 100644 (file)
@@ -1,3 +1,10 @@
+2019-11-15  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.
+
 2019-11-15  Joseph Myers  <joseph@codesourcery.com>
 
        * gcc.dg/c2x-attr-maybe_unused-1.c,
index 43a2a7035d5df6f550a989a591fa3138d87159cb..1783622230b9fb1805595366e1522b000beeb32b 100644 (file)
@@ -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 48b9f728bfdc0df2d650d158d04888c98a59bb4b..e74114d8f1f1c6b426a9c6f7a49b595d07f53309 100644 (file)
@@ -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 e4b5713c88fdd419657bd7bab613556dceb98915..29a80e5c1132e26cb020a9d044391ace4ec8b900 100644 (file)
@@ -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 d6e9df4a6b976fbbfa9a20b12514020dbfe6772c..0291328d415eccbaace32265daf31fde57bb404c 100644 (file)
@@ -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" }
 }