[libcxx] r254119 - Add static_assert to set/multiset/map/multimap/forward_list/deque that the allocator's value_type match the container's value_type. vector/unordered/list/string already do this. Add tests for all the containers to verify this.

Nico Weber via cfe-commits cfe-commits at lists.llvm.org
Thu Nov 26 13:24:20 PST 2015


This used to build and now doesn't:

  std::map<int, int, std::less<int>, std::allocator<std::pair<int, int>>> m;

Maybe the static assert text could say something slightly more friendly
that hints at the pair's first entry having to be const? This is probably
difficult to figure out unless you know this already.

(Real-life version:
https://code.google.com/p/chromium/issues/detail?id=562227)

On Wed, Nov 25, 2015 at 8:24 PM, Marshall Clow via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: marshall
> Date: Wed Nov 25 19:24:04 2015
> New Revision: 254119
>
> URL: http://llvm.org/viewvc/llvm-project?rev=254119&view=rev
> Log:
> Add static_assert to set/multiset/map/multimap/forward_list/deque that the
> allocator's value_type match the container's value_type.
> vector/unordered/list/string already do this. Add tests for all the
> containers to verify this.
>
> Added:
>
> libcxx/trunk/test/std/containers/associative/map/allocator_mismatch.fail.cpp
>
> libcxx/trunk/test/std/containers/associative/multimap/allocator_mismatch.fail.cpp
>
> libcxx/trunk/test/std/containers/associative/multiset/allocator_mismatch.fail.cpp
>
> libcxx/trunk/test/std/containers/associative/set/allocator_mismatch.fail.cpp
>
> libcxx/trunk/test/std/containers/sequences/deque/allocator_mismatch.fail.cpp
>
> libcxx/trunk/test/std/containers/sequences/forwardlist/allocator_mismatch.fail.cpp
>
> libcxx/trunk/test/std/containers/sequences/list/allocator_mismatch.fail.cpp
>
> libcxx/trunk/test/std/containers/sequences/vector/allocator_mismatch.fail.cpp
>
> libcxx/trunk/test/std/containers/unord/unord.map/allocator_mismatch.fail.cpp
>
> libcxx/trunk/test/std/containers/unord/unord.multimap/allocator_mismatch.fail.cpp
>
> libcxx/trunk/test/std/containers/unord/unord.multiset/allocator_mismatch.fail.cpp
>
> libcxx/trunk/test/std/containers/unord/unord.set/allocator_mismatch.fail.cpp
>     libcxx/trunk/test/std/strings/basic.string/allocator_mismatch.fail.cpp
> Modified:
>     libcxx/trunk/include/deque
>     libcxx/trunk/include/forward_list
>     libcxx/trunk/include/map
>     libcxx/trunk/include/set
>
> Modified: libcxx/trunk/include/deque
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/deque?rev=254119&r1=254118&r2=254119&view=diff
>
> ==============================================================================
> --- libcxx/trunk/include/deque (original)
> +++ libcxx/trunk/include/deque Wed Nov 25 19:24:04 2015
> @@ -1196,6 +1196,9 @@ public:
>      typedef _Tp value_type;
>      typedef _Allocator allocator_type;
>
> +    static_assert((is_same<typename allocator_type::value_type,
> value_type>::value),
> +                  "Allocator::value_type must be same type as
> value_type");
> +
>      typedef __deque_base<value_type, allocator_type> __base;
>
>      typedef typename __base::__alloc_traits        __alloc_traits;
>
> Modified: libcxx/trunk/include/forward_list
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/forward_list?rev=254119&r1=254118&r2=254119&view=diff
>
> ==============================================================================
> --- libcxx/trunk/include/forward_list (original)
> +++ libcxx/trunk/include/forward_list Wed Nov 25 19:24:04 2015
> @@ -537,6 +537,9 @@ public:
>      typedef _Tp    value_type;
>      typedef _Alloc allocator_type;
>
> +    static_assert((is_same<typename allocator_type::value_type,
> value_type>::value),
> +                  "Allocator::value_type must be same type as
> value_type");
> +
>      typedef value_type&
> reference;
>      typedef const value_type&
> const_reference;
>      typedef typename allocator_traits<allocator_type>::pointer
>  pointer;
>
> Modified: libcxx/trunk/include/map
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/map?rev=254119&r1=254118&r2=254119&view=diff
>
> ==============================================================================
> --- libcxx/trunk/include/map (original)
> +++ libcxx/trunk/include/map Wed Nov 25 19:24:04 2015
> @@ -840,6 +840,9 @@ public:
>      typedef value_type&                              reference;
>      typedef const value_type&                        const_reference;
>
> +    static_assert((is_same<typename allocator_type::value_type,
> value_type>::value),
> +                  "Allocator::value_type must be same type as
> value_type");
> +
>      class _LIBCPP_TYPE_VIS_ONLY value_compare
>          : public binary_function<value_type, value_type, bool>
>      {
> @@ -1696,6 +1699,9 @@ public:
>      typedef value_type&                              reference;
>      typedef const value_type&                        const_reference;
>
> +    static_assert((is_same<typename allocator_type::value_type,
> value_type>::value),
> +                  "Allocator::value_type must be same type as
> value_type");
> +
>      class _LIBCPP_TYPE_VIS_ONLY value_compare
>          : public binary_function<value_type, value_type, bool>
>      {
>
> Modified: libcxx/trunk/include/set
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/set?rev=254119&r1=254118&r2=254119&view=diff
>
> ==============================================================================
> --- libcxx/trunk/include/set (original)
> +++ libcxx/trunk/include/set Wed Nov 25 19:24:04 2015
> @@ -409,6 +409,9 @@ public:
>      typedef value_type&                              reference;
>      typedef const value_type&                        const_reference;
>
> +    static_assert((is_same<typename allocator_type::value_type,
> value_type>::value),
> +                  "Allocator::value_type must be same type as
> value_type");
> +
>  private:
>      typedef __tree<value_type, value_compare, allocator_type> __base;
>      typedef allocator_traits<allocator_type>
> __alloc_traits;
> @@ -819,6 +822,9 @@ public:
>      typedef value_type&                              reference;
>      typedef const value_type&                        const_reference;
>
> +    static_assert((is_same<typename allocator_type::value_type,
> value_type>::value),
> +                  "Allocator::value_type must be same type as
> value_type");
> +
>  private:
>      typedef __tree<value_type, value_compare, allocator_type> __base;
>      typedef allocator_traits<allocator_type>
> __alloc_traits;
>
> Added:
> libcxx/trunk/test/std/containers/associative/map/allocator_mismatch.fail.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/associative/map/allocator_mismatch.fail.cpp?rev=254119&view=auto
>
> ==============================================================================
> ---
> libcxx/trunk/test/std/containers/associative/map/allocator_mismatch.fail.cpp
> (added)
> +++
> libcxx/trunk/test/std/containers/associative/map/allocator_mismatch.fail.cpp
> Wed Nov 25 19:24:04 2015
> @@ -0,0 +1,18 @@
>
> +//===----------------------------------------------------------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is dual licensed under the MIT and the University of
> Illinois Open
> +// Source Licenses. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +// <map>
> +//   The container's value type must be the same as the allocator's value
> type
> +
> +#include <map>
> +
> +int main()
> +{
> +    std::map<int, int, std::less<int>, std::allocator<long> > m;
> +}
>
> Added:
> libcxx/trunk/test/std/containers/associative/multimap/allocator_mismatch.fail.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/associative/multimap/allocator_mismatch.fail.cpp?rev=254119&view=auto
>
> ==============================================================================
> ---
> libcxx/trunk/test/std/containers/associative/multimap/allocator_mismatch.fail.cpp
> (added)
> +++
> libcxx/trunk/test/std/containers/associative/multimap/allocator_mismatch.fail.cpp
> Wed Nov 25 19:24:04 2015
> @@ -0,0 +1,18 @@
>
> +//===----------------------------------------------------------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is dual licensed under the MIT and the University of
> Illinois Open
> +// Source Licenses. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +// <map>
> +//   The container's value type must be the same as the allocator's value
> type
> +
> +#include <map>
> +
> +int main()
> +{
> +    std::multimap<int, int, std::less<int>, std::allocator<long> > m;
> +}
>
> Added:
> libcxx/trunk/test/std/containers/associative/multiset/allocator_mismatch.fail.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/associative/multiset/allocator_mismatch.fail.cpp?rev=254119&view=auto
>
> ==============================================================================
> ---
> libcxx/trunk/test/std/containers/associative/multiset/allocator_mismatch.fail.cpp
> (added)
> +++
> libcxx/trunk/test/std/containers/associative/multiset/allocator_mismatch.fail.cpp
> Wed Nov 25 19:24:04 2015
> @@ -0,0 +1,18 @@
>
> +//===----------------------------------------------------------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is dual licensed under the MIT and the University of
> Illinois Open
> +// Source Licenses. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +// <set>
> +//   The container's value type must be the same as the allocator's value
> type
> +
> +#include <set>
> +
> +int main()
> +{
> +    std::multiset<int, std::less<int>, std::allocator<long> > ms;
> +}
>
> Added:
> libcxx/trunk/test/std/containers/associative/set/allocator_mismatch.fail.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/associative/set/allocator_mismatch.fail.cpp?rev=254119&view=auto
>
> ==============================================================================
> ---
> libcxx/trunk/test/std/containers/associative/set/allocator_mismatch.fail.cpp
> (added)
> +++
> libcxx/trunk/test/std/containers/associative/set/allocator_mismatch.fail.cpp
> Wed Nov 25 19:24:04 2015
> @@ -0,0 +1,18 @@
>
> +//===----------------------------------------------------------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is dual licensed under the MIT and the University of
> Illinois Open
> +// Source Licenses. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +// <set>
> +//   The container's value type must be the same as the allocator's value
> type
> +
> +#include <set>
> +
> +int main()
> +{
> +    std::set<int, std::less<int>, std::allocator<long> > s;
> +}
>
> Added:
> libcxx/trunk/test/std/containers/sequences/deque/allocator_mismatch.fail.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/deque/allocator_mismatch.fail.cpp?rev=254119&view=auto
>
> ==============================================================================
> ---
> libcxx/trunk/test/std/containers/sequences/deque/allocator_mismatch.fail.cpp
> (added)
> +++
> libcxx/trunk/test/std/containers/sequences/deque/allocator_mismatch.fail.cpp
> Wed Nov 25 19:24:04 2015
> @@ -0,0 +1,18 @@
>
> +//===----------------------------------------------------------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is dual licensed under the MIT and the University of
> Illinois Open
> +// Source Licenses. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +// <deque>
> +//   The container's value type must be the same as the allocator's value
> type
> +
> +#include <deque>
> +
> +int main()
> +{
> +    std::deque<int, std::allocator<long> > d;
> +}
>
> Added:
> libcxx/trunk/test/std/containers/sequences/forwardlist/allocator_mismatch.fail.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/forwardlist/allocator_mismatch.fail.cpp?rev=254119&view=auto
>
> ==============================================================================
> ---
> libcxx/trunk/test/std/containers/sequences/forwardlist/allocator_mismatch.fail.cpp
> (added)
> +++
> libcxx/trunk/test/std/containers/sequences/forwardlist/allocator_mismatch.fail.cpp
> Wed Nov 25 19:24:04 2015
> @@ -0,0 +1,18 @@
>
> +//===----------------------------------------------------------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is dual licensed under the MIT and the University of
> Illinois Open
> +// Source Licenses. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +// <forward_list>
> +//   The container's value type must be the same as the allocator's value
> type
> +
> +#include <forward_list>
> +
> +int main()
> +{
> +    std::forward_list<int, std::allocator<long> > fl;
> +}
>
> Added:
> libcxx/trunk/test/std/containers/sequences/list/allocator_mismatch.fail.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/list/allocator_mismatch.fail.cpp?rev=254119&view=auto
>
> ==============================================================================
> ---
> libcxx/trunk/test/std/containers/sequences/list/allocator_mismatch.fail.cpp
> (added)
> +++
> libcxx/trunk/test/std/containers/sequences/list/allocator_mismatch.fail.cpp
> Wed Nov 25 19:24:04 2015
> @@ -0,0 +1,18 @@
>
> +//===----------------------------------------------------------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is dual licensed under the MIT and the University of
> Illinois Open
> +// Source Licenses. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +// <list>
> +//   The container's value type must be the same as the allocator's value
> type
> +
> +#include <list>
> +
> +int main()
> +{
> +    std::list<int, std::allocator<long> > l;
> +}
>
> Added:
> libcxx/trunk/test/std/containers/sequences/vector/allocator_mismatch.fail.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/vector/allocator_mismatch.fail.cpp?rev=254119&view=auto
>
> ==============================================================================
> ---
> libcxx/trunk/test/std/containers/sequences/vector/allocator_mismatch.fail.cpp
> (added)
> +++
> libcxx/trunk/test/std/containers/sequences/vector/allocator_mismatch.fail.cpp
> Wed Nov 25 19:24:04 2015
> @@ -0,0 +1,18 @@
>
> +//===----------------------------------------------------------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is dual licensed under the MIT and the University of
> Illinois Open
> +// Source Licenses. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +// <vector>
> +//   The container's value type must be the same as the allocator's value
> type
> +
> +#include <vector>
> +
> +int main()
> +{
> +    std::vector<int, std::allocator<long> > v;
> +}
>
> Added:
> libcxx/trunk/test/std/containers/unord/unord.map/allocator_mismatch.fail.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.map/allocator_mismatch.fail.cpp?rev=254119&view=auto
>
> ==============================================================================
> ---
> libcxx/trunk/test/std/containers/unord/unord.map/allocator_mismatch.fail.cpp
> (added)
> +++
> libcxx/trunk/test/std/containers/unord/unord.map/allocator_mismatch.fail.cpp
> Wed Nov 25 19:24:04 2015
> @@ -0,0 +1,18 @@
>
> +//===----------------------------------------------------------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is dual licensed under the MIT and the University of
> Illinois Open
> +// Source Licenses. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +// <unordered_map>
> +//   The container's value type must be the same as the allocator's value
> type
> +
> +#include <unordered_map>
> +
> +int main()
> +{
> +    std::unordered_map<int, int, std::hash<int>, std::less<int>,
> std::allocator<long> > m;
> +}
>
> Added:
> libcxx/trunk/test/std/containers/unord/unord.multimap/allocator_mismatch.fail.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.multimap/allocator_mismatch.fail.cpp?rev=254119&view=auto
>
> ==============================================================================
> ---
> libcxx/trunk/test/std/containers/unord/unord.multimap/allocator_mismatch.fail.cpp
> (added)
> +++
> libcxx/trunk/test/std/containers/unord/unord.multimap/allocator_mismatch.fail.cpp
> Wed Nov 25 19:24:04 2015
> @@ -0,0 +1,18 @@
>
> +//===----------------------------------------------------------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is dual licensed under the MIT and the University of
> Illinois Open
> +// Source Licenses. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +// <unordered_map>
> +//   The container's value type must be the same as the allocator's value
> type
> +
> +#include <unordered_map>
> +
> +int main()
> +{
> +    std::unordered_multimap<int, int, std::hash<int>, std::less<int>,
> std::allocator<long> > m;
> +}
>
> Added:
> libcxx/trunk/test/std/containers/unord/unord.multiset/allocator_mismatch.fail.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.multiset/allocator_mismatch.fail.cpp?rev=254119&view=auto
>
> ==============================================================================
> ---
> libcxx/trunk/test/std/containers/unord/unord.multiset/allocator_mismatch.fail.cpp
> (added)
> +++
> libcxx/trunk/test/std/containers/unord/unord.multiset/allocator_mismatch.fail.cpp
> Wed Nov 25 19:24:04 2015
> @@ -0,0 +1,18 @@
>
> +//===----------------------------------------------------------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is dual licensed under the MIT and the University of
> Illinois Open
> +// Source Licenses. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +// <unordered_set>
> +//   The container's value type must be the same as the allocator's value
> type
> +
> +#include <unordered_set>
> +
> +int main()
> +{
> +    std::unordered_multiset<int, std::hash<int>, std::less<int>,
> std::allocator<long> > v;
> +}
>
> Added:
> libcxx/trunk/test/std/containers/unord/unord.set/allocator_mismatch.fail.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.set/allocator_mismatch.fail.cpp?rev=254119&view=auto
>
> ==============================================================================
> ---
> libcxx/trunk/test/std/containers/unord/unord.set/allocator_mismatch.fail.cpp
> (added)
> +++
> libcxx/trunk/test/std/containers/unord/unord.set/allocator_mismatch.fail.cpp
> Wed Nov 25 19:24:04 2015
> @@ -0,0 +1,18 @@
>
> +//===----------------------------------------------------------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is dual licensed under the MIT and the University of
> Illinois Open
> +// Source Licenses. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +// <unordered_set>
> +//   The container's value type must be the same as the allocator's value
> type
> +
> +#include <unordered_set>
> +
> +int main()
> +{
> +    std::unordered_set<int, std::hash<int>, std::less<int>,
> std::allocator<long> > v;
> +}
>
> Added:
> libcxx/trunk/test/std/strings/basic.string/allocator_mismatch.fail.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/strings/basic.string/allocator_mismatch.fail.cpp?rev=254119&view=auto
>
> ==============================================================================
> --- libcxx/trunk/test/std/strings/basic.string/allocator_mismatch.fail.cpp
> (added)
> +++ libcxx/trunk/test/std/strings/basic.string/allocator_mismatch.fail.cpp
> Wed Nov 25 19:24:04 2015
> @@ -0,0 +1,18 @@
>
> +//===----------------------------------------------------------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is dual licensed under the MIT and the University of
> Illinois Open
> +// Source Licenses. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +// <string>
> +//   The container's value type must be the same as the allocator's value
> type
> +
> +#include <string>
> +
> +int main()
> +{
> +    std::basic_string<char, std::char_traits<char>, std::allocator<int> >
> s;
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20151126/3e6c7212/attachment-0001.html>


More information about the cfe-commits mailing list