diff options
author | Jason Merrill <jason@redhat.com> | 2013-03-14 09:08:36 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2013-03-14 09:08:36 -0400 |
commit | e9d5a271e53986d30bb738747a3dc590c1d9629c (patch) | |
tree | 97e9d2da7bcf940d8dbccd82c90b8f91198954ae | |
parent | d803a4912e3cb9ffcfa57a790d26073bff5086ee (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 13 |
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; |