PR c++/80485 - inline function non-zero address.
authorJason Merrill <jason@redhat.com>
Fri, 25 May 2018 16:44:55 +0000 (12:44 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 25 May 2018 16:44:55 +0000 (12:44 -0400)
* symtab.c (nonzero_address): Check DECL_COMDAT.

From-SVN: r260762

gcc/ChangeLog
gcc/symtab.c
gcc/testsuite/g++.dg/expr/pmf-3.C [new file with mode: 0644]

index 04b94ff9ad69e3ece9a179b65c5cf63565e86351..a1ef11eecac7b212bead94ebad3f9c7e0374823e 100644 (file)
@@ -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
index 954920b6dff4f51facf02bbab75fd26649f488b1..67e14d76b116b547751fb9dba0075de650d6a6f1 100644 (file)
@@ -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 (file)
index 0000000..fac42fc
--- /dev/null
@@ -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 ), "" );