On Fri, 2022-10-21 at 12:01 -0400, David Malcolm wrote: > This patch adds gcc/make-unique.h, containing a minimal C++11 > implementation of make_unique (std::make_unique is C++14). > > The followup patch uses this in dozens of places within the analyzer. > > Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu. > > OK for trunk?
I've now realized that I sent an earlier version of this patch here: https://gcc.gnu.org/pipermail/gcc-patches/2022-July/598189.html Dave > > gcc/ChangeLog: > * make-unique.h: New file. > > Signed-off-by: David Malcolm <dmalc...@redhat.com> > --- > gcc/make-unique.h | 42 ++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 42 insertions(+) > create mode 100644 gcc/make-unique.h > > diff --git a/gcc/make-unique.h b/gcc/make-unique.h > new file mode 100644 > index 00000000000..752a1d3dd30 > --- /dev/null > +++ b/gcc/make-unique.h > @@ -0,0 +1,42 @@ > +/* Minimal implementation of make_unique for C++11 compatibility. > + Copyright (C) 2022 Free Software Foundation, Inc. > + > +This file is part of GCC. > + > +GCC is free software; you can redistribute it and/or modify it under > +the terms of the GNU General Public License as published by the Free > +Software Foundation; either version 3, or (at your option) any later > +version. > + > +GCC is distributed in the hope that it will be useful, but WITHOUT > ANY > +WARRANTY; without even the implied warranty of MERCHANTABILITY or > +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public > License > +for more details. > + > +You should have received a copy of the GNU General Public License > +along with GCC; see the file COPYING3. If not see > +<http://www.gnu.org/licenses/>. */ > + > +#ifndef GCC_MAKE_UNIQUE > +#define GCC_MAKE_UNIQUE > + > +/* This header uses std::unique_ptr, but <memory> can't be directly > + included due to issues with macros. Hence <memory> must be > included > + from system.h by defining INCLUDE_MEMORY in any source file using > + make-unique.h. */ > + > +#ifndef INCLUDE_MEMORY > +# error "You must define INCLUDE_MEMORY before including system.h to > use make-unique.h" > +#endif > + > +/* Minimal implementation of make_unique for C++11 compatibility > + (std::make_unique is C++14). */ > + > +template<typename T, typename... Args> > +inline typename std::enable_if<!std::is_array<T>::value, > std::unique_ptr<T>>::type > +make_unique(Args&&... args) > +{ > + return std::unique_ptr<T> (new T (std::forward<Args> (args)...)); > +} > + > +#endif /* ! GCC_MAKE_UNIQUE */