aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2013-03-14 09:08:36 -0400
committerJason Merrill <jason@gcc.gnu.org>2013-03-14 09:08:36 -0400
commite9d5a271e53986d30bb738747a3dc590c1d9629c (patch)
tree97e9d2da7bcf940d8dbccd82c90b8f91198954ae
parentd803a4912e3cb9ffcfa57a790d26073bff5086ee (diff)
downloadgcc-e9d5a271e53986d30bb738747a3dc590c1d9629c.zip
gcc-e9d5a271e53986d30bb738747a3dc590c1d9629c.tar.gz
gcc-e9d5a271e53986d30bb738747a3dc590c1d9629c.tar.bz2
re PR c++/56346 (FAIL: g++.dg/tls/thread_local3.C -std=gnu++11 (test for excess errors))
PR c++/56346 * decl.c (register_dtor_fn): Pass null to __cxa_thread_atexit dso_handle parm on targets without __cxa_atexit. From-SVN: r196657
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl.c13
2 files changed, 14 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index c728c50..ccdb401 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2013-03-14 Jason Merrill <jason@redhat.com>
+
+ PR c++/56346
+ * decl.c (register_dtor_fn): Pass null to __cxa_thread_atexit
+ dso_handle parm on targets without __cxa_atexit.
+
2013-03-11 Jason Merrill <jason@redhat.com>
PR c++/56567
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 150e866..92114ff 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -6758,10 +6758,9 @@ register_dtor_fn (tree decl)
"__aeabi_atexit"), and DECL is a class object, we can just pass the
destructor to "__cxa_atexit"; we don't have to build a temporary
function to do the cleanup. */
- ob_parm = (DECL_THREAD_LOCAL_P (decl)
- || (flag_use_cxa_atexit
- && !targetm.cxx.use_atexit_for_cxa_atexit ()));
- dso_parm = ob_parm;
+ dso_parm = (flag_use_cxa_atexit
+ && !targetm.cxx.use_atexit_for_cxa_atexit ());
+ ob_parm = (DECL_THREAD_LOCAL_P (decl) || dso_parm);
use_dtor = ob_parm && CLASS_TYPE_P (type);
if (use_dtor)
{
@@ -6825,7 +6824,7 @@ register_dtor_fn (tree decl)
before passing it in, to avoid spurious errors. */
addr = build_nop (ptr_type_node, addr);
}
- else if (ob_parm)
+ else
/* Since the cleanup functions we build ignore the address
they're given, there's no reason to pass the actual address
in, and, in general, it's cheaper to pass NULL than any
@@ -6835,6 +6834,10 @@ register_dtor_fn (tree decl)
if (dso_parm)
arg2 = cp_build_addr_expr (get_dso_handle_node (),
tf_warning_or_error);
+ else if (ob_parm)
+ /* Just pass NULL to the dso handle parm if we don't actually
+ have a DSO handle on this target. */
+ arg2 = null_pointer_node;
else
arg2 = NULL_TREE;