From 7f032bbedf3e66f6695d4df0d149c2e8033224da Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 26 Feb 2024 10:19:07 -0700 Subject: Require trivial destructor in allocate_on_obstack This patch makes allocate_on_obstack a little bit safer, by enforcing the rule that objects allocated on an obstack must have a trivial destructor. The static assert is done in a method -- doing it inside the class itself won't work because the class is incomplete at that point. --- gdbsupport/gdb_obstack.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'gdbsupport') diff --git a/gdbsupport/gdb_obstack.h b/gdbsupport/gdb_obstack.h index 20f8886..7b3bb05 100644 --- a/gdbsupport/gdb_obstack.h +++ b/gdbsupport/gdb_obstack.h @@ -133,14 +133,18 @@ struct auto_obstack : obstack { obstack_free (this, obstack_base (this)); } }; -/* Objects are allocated on obstack instead of heap. */ +/* Objects are allocated on obstack instead of heap. This is a mixin + that uses CRTP to ensure that the type in question is trivially + destructible. */ +template struct allocate_on_obstack { allocate_on_obstack () = default; void* operator new (size_t size, struct obstack *obstack) { + static_assert (IsFreeable::value); return obstack_alloc (obstack, size); } -- cgit v1.1