aboutsummaryrefslogtreecommitdiff
path: root/winsup/cygwin/cxx.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/cxx.cc')
-rw-r--r--winsup/cygwin/cxx.cc120
1 files changed, 115 insertions, 5 deletions
diff --git a/winsup/cygwin/cxx.cc b/winsup/cygwin/cxx.cc
index b69524a..a14aab8 100644
--- a/winsup/cygwin/cxx.cc
+++ b/winsup/cygwin/cxx.cc
@@ -28,27 +28,75 @@ operator delete (void *p)
free (p);
}
+void *
+operator new[] (std::size_t s)
+{
+ return ::operator new (s);
+}
+
+void
+operator delete[] (void *p)
+{
+ ::operator delete (p);
+}
+
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wc++14-compat"
void
operator delete (void *p, size_t)
{
- ::operator delete(p);
+ ::operator delete (p);
+}
+
+void
+operator delete[] (void *p, size_t)
+{
+ ::operator delete (p);
}
#pragma GCC diagnostic pop
+/* Aligned versions, provided only for completeness in the fallback array. */
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-compat"
void *
-operator new[] (std::size_t s)
+operator new (std::size_t sz, std::align_val_t al)
{
- return ::operator new (s);
+ void *ret;
+ /* is memset needed here, since the non-aligned version uses calloc? */
+ if (!posix_memalign (&ret, static_cast <std::size_t> (al), sz))
+ return ret;
+ return NULL;
+}
+
+void *
+operator new[] (std::size_t sz, std::align_val_t al)
+{
+ return ::operator new (sz, al);
}
void
-operator delete[] (void *p)
+operator delete (void *p, std::align_val_t)
{
- ::operator delete (p);
+ free (p);
+}
+void
+operator delete[] (void *p, std::align_val_t al)
+{
+ ::operator delete (p, al);
}
+void
+operator delete (void *p, std::size_t, std::align_val_t al)
+{
+ ::operator delete (p, al);
+}
+
+void operator delete[] (void *p, std::size_t, std::align_val_t al)
+{
+ ::operator delete (p, al);
+}
+#pragma GCC diagnostic pop
+
/* Nothrow versions, provided only for completeness in the fallback array. */
void *
@@ -76,6 +124,51 @@ operator delete[] (void *p, const std::nothrow_t &nt)
::operator delete (p, nt);
}
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++14-compat"
+void
+operator delete (void *p, size_t, const std::nothrow_t &nt)
+{
+ ::operator delete (p, nt);
+}
+
+void
+operator delete[] (void *p, size_t, const std::nothrow_t &nt)
+{
+ ::operator delete (p, nt);
+}
+#pragma GCC diagnostic pop
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-compat"
+void *
+operator new (std::size_t sz, std::align_val_t al, const std::nothrow_t &)
+{
+
+ void *ret;
+ /* is memset needed here, since the non-aligned version uses calloc? */
+ if (!posix_memalign (&ret, static_cast <std::size_t> (al), sz))
+ return ret;
+ return NULL;
+}
+
+void *
+operator new[] (std::size_t sz, std::align_val_t al, const std::nothrow_t &nt)
+{
+ return ::operator new (sz, al, nt);
+}
+
+void
+operator delete (void *p, std::align_val_t, const std::nothrow_t &nt)
+{
+ ::operator delete (p, nt);
+}
+
+void operator delete[] (void *p, std::align_val_t, const std::nothrow_t &nt)
+{
+ ::operator delete (p, nt);
+}
+#pragma GCC diagnostic pop
extern "C" void
__cxa_pure_virtual (void)
@@ -95,10 +188,27 @@ struct per_process_cxx_malloc default_cygwin_cxx_malloc =
&(operator new[]),
&(operator delete),
&(operator delete[]),
+ /* nothrow new/delete */
+ &(operator new),
+ &(operator new[]),
+ &(operator delete),
+ &(operator delete[]),
+ /* C++14 sized delete */
+ &(operator delete),
+ &(operator delete[]),
+ /* C++17 aligned new/delete */
&(operator new),
&(operator new[]),
&(operator delete),
&(operator delete[]),
+ /* aligned + sized delete */
+ &(operator delete),
+ &(operator delete[]),
+ /* aligned + nothrow new/delete */
+ &(operator new),
+ &(operator new[]),
+ &(operator delete),
+ &(operator delete[])
};