aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@gcc.gnu.org>2015-06-13 16:11:15 +0000
committerPatrick Palka <ppalka@gcc.gnu.org>2015-06-13 16:11:15 +0000
commit076fecad0db4fb76524af6785b146491d4060dd4 (patch)
treee76304d58d1deaf94d7fd2dc50a09d6c2979c651 /gcc
parent313d38e359bfcd8b56c946233294061c66ae21dc (diff)
downloadgcc-076fecad0db4fb76524af6785b146491d4060dd4.zip
gcc-076fecad0db4fb76524af6785b146491d4060dd4.tar.gz
gcc-076fecad0db4fb76524af6785b146491d4060dd4.tar.bz2
Emit -Waddress warnings for comparing address of reference against NULL
gcc/c-family/ChangeLog: PR c++/65168 * c-common.c (c_common_truthvalue_conversion): Warn when converting an address of a reference to a truth value. gcc/cp/ChangeLog: PR c++/65168 * typeck.c (cp_build_binary_op): Warn when comparing an address of a reference against NULL. gcc/testsuite/ChangeLog: PR c++/65168 g++.dg/warn/Walways-true-3.C: New test. From-SVN: r224455
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c-family/ChangeLog6
-rw-r--r--gcc/c-family/c-common.c14
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/typeck.c34
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/warn/Walways-true-3.C46
6 files changed, 111 insertions, 0 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index a2324a4..80c3e48 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,9 @@
+2015-06-13 Patrick Palka <ppalka@gcc.gnu.org>
+
+ PR c++/65168
+ * c-common.c (c_common_truthvalue_conversion): Warn when
+ converting an address of a reference to a truth value.
+
2015-06-08 Andrew MacLeod <amacleod@redhat.com>
* array-notation-common.c : Adjust include files.
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index 5b76567..b1af682 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -4973,6 +4973,20 @@ c_common_truthvalue_conversion (location_t location, tree expr)
tree totype = TREE_TYPE (expr);
tree fromtype = TREE_TYPE (TREE_OPERAND (expr, 0));
+ if (POINTER_TYPE_P (totype)
+ && TREE_CODE (fromtype) == REFERENCE_TYPE)
+ {
+ tree inner = expr;
+ STRIP_NOPS (inner);
+
+ if (DECL_P (inner))
+ warning_at (location,
+ OPT_Waddress,
+ "the compiler can assume that the address of "
+ "%qD will always evaluate to %<true%>",
+ inner);
+ }
+
/* Don't cancel the effect of a CONVERT_EXPR from a REFERENCE_TYPE,
since that affects how `default_conversion' will behave. */
if (TREE_CODE (totype) == REFERENCE_TYPE
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b18a893..c091617 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2015-06-13 Patrick Palka <ppalka@gcc.gnu.org>
+
+ PR c++/65168
+ * typeck.c (cp_build_binary_op): Warn when comparing an address
+ of a reference against NULL.
+
2015-06-12 Jason Merrill <jason@redhat.com>
PR c++/65719
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index 5b09b73..7716c21 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -4430,6 +4430,23 @@ cp_build_binary_op (location_t location,
warning (OPT_Waddress, "the address of %qD will never be NULL",
TREE_OPERAND (op0, 0));
}
+
+ if (CONVERT_EXPR_P (op0)
+ && TREE_CODE (TREE_TYPE (TREE_OPERAND (op0, 0)))
+ == REFERENCE_TYPE)
+ {
+ tree inner_op0 = op0;
+ STRIP_NOPS (inner_op0);
+
+ if ((complain & tf_warning)
+ && c_inhibit_evaluation_warnings == 0
+ && !TREE_NO_WARNING (op0)
+ && DECL_P (inner_op0))
+ warning_at (location, OPT_Waddress,
+ "the compiler can assume that the address of "
+ "%qD will never be NULL",
+ inner_op0);
+ }
}
else if (((code1 == POINTER_TYPE || TYPE_PTRDATAMEM_P (type1))
&& null_ptr_cst_p (op0))
@@ -4452,6 +4469,23 @@ cp_build_binary_op (location_t location,
warning (OPT_Waddress, "the address of %qD will never be NULL",
TREE_OPERAND (op1, 0));
}
+
+ if (CONVERT_EXPR_P (op1)
+ && TREE_CODE (TREE_TYPE (TREE_OPERAND (op1, 0)))
+ == REFERENCE_TYPE)
+ {
+ tree inner_op1 = op1;
+ STRIP_NOPS (inner_op1);
+
+ if ((complain & tf_warning)
+ && c_inhibit_evaluation_warnings == 0
+ && !TREE_NO_WARNING (op1)
+ && DECL_P (inner_op1))
+ warning_at (location, OPT_Waddress,
+ "the compiler can assume that the address of "
+ "%qD will never be NULL",
+ inner_op1);
+ }
}
else if ((code0 == POINTER_TYPE && code1 == POINTER_TYPE)
|| (TYPE_PTRDATAMEM_P (type0) && TYPE_PTRDATAMEM_P (type1)))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 35822f3..b9b96e7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-06-13 Patrick Palka <ppalka@gcc.gnu.org>
+
+ PR c++/65168
+ g++.dg/warn/Walways-true-3.C: New test.
+
2015-06-13 Tom de Vries <tom@codesourcery.com>
* gcc.dg/parloops-exit-first-loop-alt-4.c: New test.
diff --git a/gcc/testsuite/g++.dg/warn/Walways-true-3.C b/gcc/testsuite/g++.dg/warn/Walways-true-3.C
new file mode 100644
index 0000000..d6e9df4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Walways-true-3.C
@@ -0,0 +1,46 @@
+// PR c++/65168
+// { dg-options "-Waddress" }
+
+void foo (void);
+
+int d;
+int &c = d;
+
+void
+bar (int &a)
+{
+ int &b = a;
+
+ if ((int *)&a) // { dg-warning "address of" }
+ foo ();
+
+ if (&b) // { dg-warning "address of" }
+ foo ();
+
+ if (!&c) // { dg-warning "address of" }
+ foo ();
+
+ if (!&(int &)(int &)a) // { dg-warning "address of" }
+ foo ();
+
+ if (&a == 0) // { dg-warning "never be NULL" }
+ foo ();
+
+ if (&b != 0) // { dg-warning "never be NULL" }
+ foo ();
+
+ if (0 == &(int &)(int &)c) // { dg-warning "never be NULL" }
+ foo ();
+
+ if (&a != (int *)0) // { dg-warning "never be NULL" }
+ foo ();
+}
+
+bool
+bar_1 (int &a)
+{
+ if (d == 5)
+ return &a; // { dg-warning "address of" }
+ else
+ return !&(int &)(int &)a; // { dg-warning "address of" }
+}