https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47931
Martin Sebor <msebor at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |ASSIGNED
Assignee|unassigned at gcc dot gnu.org |msebor at gcc dot
gnu.org
Known to fail| |4.8.4, 4.9.3, 5.1.0, 6.0
--- Comment #4 from Martin Sebor <msebor at gcc dot gnu.org> ---
I have a simple patch for the C++ side of the problem (below). Let me add the
C bits along with the cleanup discussed in the context of the fix for bug 70194
(https://gcc.gnu.org/ml/gcc-patches/2016-03/msg01041.html) and post it for
review in stage 1 of GCC 7.
Index: gcc/cp/typeck.c
===================================================================
--- gcc/cp/typeck.c (revision 234306)
+++ gcc/cp/typeck.c (working copy)
@@ -3985,13 +3985,20 @@ warn_for_null_address (location_t locati
|| TREE_NO_WARNING (op))
return;
+ STRIP_NOPS (op);
tree cop = fold_non_dependent_expr (op);
-
- if (TREE_CODE (cop) == ADDR_EXPR
- && decl_with_nonnull_addr_p (TREE_OPERAND (cop, 0))
- && !TREE_NO_WARNING (cop))
- warning_at (location, OPT_Waddress, "the address of %qD will never "
- "be NULL", TREE_OPERAND (cop, 0));
+ if (TREE_CODE (cop) == ADDR_EXPR && !TREE_NO_WARNING (cop))
+ {
+ cop = TREE_OPERAND (cop, 0);
+ if (TREE_CODE (cop) == ARRAY_REF)
+ cop = TREE_OPERAND (cop, 0);
+ if (TREE_CODE (cop) == STRING_CST)
+ warning_at (location, OPT_Waddress,
+ "the address of a string literal will never be NULL");
+ else if (decl_with_nonnull_addr_p (cop))
+ warning_at (location, OPT_Waddress,
+ "the address of %qD will never be NULL", cop);
+ }
if (CONVERT_EXPR_P (op)
&& TREE_CODE (TREE_TYPE (TREE_OPERAND (op, 0))) == REFERENCE_TYPE)