]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Reject std::make_shared<T[]> [PR 99006]
authorJonathan Wakely <jwakely@redhat.com>
Thu, 22 Apr 2021 14:46:51 +0000 (15:46 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Tue, 11 May 2021 19:50:06 +0000 (20:50 +0100)
Prior to C++20 it should be ill-formed to use std::make_shared with an
array type (and we don't support the C++20 feature to make it valid yet
anyway).

libstdc++-v3/ChangeLog:

PR libstdc++/99006
* include/bits/shared_ptr.h (allocate_shared): Assert that _Tp
is not an array type.
* include/bits/shared_ptr_base.h (__allocate_shared): Likewise.
* testsuite/20_util/shared_ptr/creation/99006.cc: New test.

(cherry picked from commit 55650236cd97d81f42f9fdb4f6bcb12babafe51f)

libstdc++-v3/include/bits/shared_ptr.h
libstdc++-v3/include/bits/shared_ptr_base.h
libstdc++-v3/testsuite/20_util/shared_ptr/creation/99006.cc [new file with mode: 0644]

index ac4aa20b7943d8c751c0d81b5cd43110039a9a81..d5386ad535faffa285fbec013e230c76e9606df2 100644 (file)
@@ -857,6 +857,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     inline shared_ptr<_Tp>
     allocate_shared(const _Alloc& __a, _Args&&... __args)
     {
+      static_assert(!is_array<_Tp>::value, "make_shared<T[]> not supported");
+
       return shared_ptr<_Tp>(_Sp_alloc_shared_tag<_Alloc>{__a},
                             std::forward<_Args>(__args)...);
     }
index 8766b61fd8156e510ab15b5c69f66e17ef2b8776..71099afbf7a4ea07d55591075a6e6819b424348c 100644 (file)
@@ -1831,6 +1831,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     inline __shared_ptr<_Tp, _Lp>
     __allocate_shared(const _Alloc& __a, _Args&&... __args)
     {
+      static_assert(!is_array<_Tp>::value, "make_shared<T[]> not supported");
+
       return __shared_ptr<_Tp, _Lp>(_Sp_alloc_shared_tag<_Alloc>{__a},
                                    std::forward<_Args>(__args)...);
     }
diff --git a/libstdc++-v3/testsuite/20_util/shared_ptr/creation/99006.cc b/libstdc++-v3/testsuite/20_util/shared_ptr/creation/99006.cc
new file mode 100644 (file)
index 0000000..d5f7a5d
--- /dev/null
@@ -0,0 +1,9 @@
+// FIXME: This should use { target { ! c++20 } }
+// { dg-do compile }
+
+#include <memory>
+
+auto p = std::make_shared<int[]>(2); // { dg-error "here" }
+auto q = std::make_shared<int[2]>(1, 2); // { dg-error "here" }
+
+// { dg-prune-output "static assertion failed" }