aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-05-25 12:44:55 -0400
committerJason Merrill <jason@gcc.gnu.org>2018-05-25 12:44:55 -0400
commitf22ed1ed2ae240124d5a5a0b8fa2cb1fc7d62e00 (patch)
tree23b278356ded4c1eec38a302893f8c0101afb26b /gcc
parent18b119378a5e2fef657670441dabd98c827709a1 (diff)
downloadgcc-f22ed1ed2ae240124d5a5a0b8fa2cb1fc7d62e00.zip
gcc-f22ed1ed2ae240124d5a5a0b8fa2cb1fc7d62e00.tar.gz
gcc-f22ed1ed2ae240124d5a5a0b8fa2cb1fc7d62e00.tar.bz2
PR c++/80485 - inline function non-zero address.
* symtab.c (nonzero_address): Check DECL_COMDAT. From-SVN: r260762
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/symtab.c8
-rw-r--r--gcc/testsuite/g++.dg/expr/pmf-3.C15
3 files changed, 24 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 04b94ff..a1ef11e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2018-05-25 Jason Merrill <jason@redhat.com>
+
+ PR c++/80485 - inline function non-zero address.
+ * symtab.c (nonzero_address): Check DECL_COMDAT.
+
2018-05-25 Uros Bizjak <ubizjak@gmail.com>
PR target/83628
diff --git a/gcc/symtab.c b/gcc/symtab.c
index 954920b..67e14d7 100644
--- a/gcc/symtab.c
+++ b/gcc/symtab.c
@@ -1959,11 +1959,11 @@ symtab_node::nonzero_address ()
return true;
}
- /* If target is defined and not extern, we know it will be output and thus
- it will bind to non-NULL.
- Play safe for flag_delete_null_pointer_checks where weak definition maye
+ /* If target is defined and either comdat or not extern, we know it will be
+ output and thus it will bind to non-NULL.
+ Play safe for flag_delete_null_pointer_checks where weak definition may
be re-defined by NULL. */
- if (definition && !DECL_EXTERNAL (decl)
+ if (definition && (!DECL_EXTERNAL (decl) || DECL_COMDAT (decl))
&& (flag_delete_null_pointer_checks || !DECL_WEAK (decl)))
{
if (!DECL_WEAK (decl))
diff --git a/gcc/testsuite/g++.dg/expr/pmf-3.C b/gcc/testsuite/g++.dg/expr/pmf-3.C
new file mode 100644
index 0000000..fac42fc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/expr/pmf-3.C
@@ -0,0 +1,15 @@
+// PR c++/80485
+// { dg-do compile { target c++11 } }
+
+struct dummy {
+ void nonnull() {};
+ void nonnull2();
+};
+
+typedef void (dummy::*safe_bool)();
+
+constexpr safe_bool a = &dummy::nonnull;
+constexpr safe_bool b = &dummy::nonnull2;
+
+static_assert( static_cast<bool>( a ), "" );
+static_assert( static_cast<bool>( b ), "" );