Bug 128250 - HashMap can't be used with std::unique_ptr as value when it has a custom deleter
Summary: HashMap can't be used with std::unique_ptr as value when it has a custom deleter
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: Web Template Framework (show other bugs)
Version: 528+ (Nightly build)
Hardware: Unspecified Unspecified
: P2 Normal
Assignee: Nobody
URL:
Keywords:
Depends on:
Blocks: 98931
  Show dependency treegraph
 
Reported: 2014-02-05 08:44 PST by Carlos Garcia Campos
Modified: 2014-02-05 11:09 PST (History)
6 users (show)

See Also:


Attachments
Patch (1.55 KB, patch)
2014-02-05 08:47 PST, Carlos Garcia Campos
no flags Details | Formatted Diff | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Carlos Garcia Campos 2014-02-05 08:44:46 PST
/usr/include/c++/4.8/bits/unique_ptr.h: In instantiation of 'typename std::enable_if<std::__and_<std::is_convertible<typename std::unique_ptr<_Up, _Ep>::pointer, typename std::unique_ptr<_Tp, _Dp>::_Pointer::type>, std::__not_<std::is_array<_Up> > >::value, std::unique_ptr<_Tp, _Dp>&>::type std::unique_ptr<_Tp, _Dp>::operator=(std::unique_ptr<_Up, _Ep>&&) [with _Up = _GdkEvent; _Ep = WTF::GPtrDeleter<_GdkEvent>; _Tp = _GdkEvent; _Dp = std::default_delete<_GdkEvent>; typename std::enable_if<std::__and_<std::is_convertible<typename std::unique_ptr<_Up, _Ep>::pointer, typename std::unique_ptr<_Tp, _Dp>::_Pointer::type>, std::__not_<std::is_array<_Up> > >::value, std::unique_ptr<_Tp, _Dp>&>::type = std::unique_ptr<_GdkEvent, std::default_delete<_GdkEvent> >&]':
../../Source/WTF/wtf/HashMap.h:162:24:   required from 'static void WTF::HashMapTranslator<ValueTraits, HashFunctions>::translate(T&, U&&, V&&) [with T = WTF::KeyValuePair<unsigned int, std::unique_ptr<_GdkEvent, std::default_delete<_GdkEvent> > >; U = const unsigned int&; V = std::unique_ptr<_GdkEvent, WTF::GPtrDeleter<_GdkEvent> >; ValueTraits = WTF::HashMap<unsigned int, std::unique_ptr<_GdkEvent, WTF::GPtrDeleter<_GdkEvent> > >::KeyValuePairTraits; HashFunctions = WTF::IntHash<unsigned int>]'
../../Source/WTF/wtf/HashTable.h:858:91:   required from 'WTF::HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyTraits>::AddResult WTF::HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyTraits>::add(T&&, Extra&&) [with HashTranslator = WTF::HashMapTranslator<WTF::HashMap<unsigned int, std::unique_ptr<_GdkEvent, WTF::GPtrDeleter<_GdkEvent> > >::KeyValuePairTraits, WTF::IntHash<unsigned int> >; T = const unsigned int&; Extra = std::unique_ptr<_GdkEvent, WTF::GPtrDeleter<_GdkEvent> >; Key = unsigned int; Value = WTF::KeyValuePair<unsigned int, std::unique_ptr<_GdkEvent, std::default_delete<_GdkEvent> > >; Extractor = WTF::KeyValuePairKeyExtractor<WTF::KeyValuePair<unsigned int, std::unique_ptr<_GdkEvent, std::default_delete<_GdkEvent> > > >; HashFunctions = WTF::IntHash<unsigned int>; Traits = WTF::HashMap<unsigned int, std::unique_ptr<_GdkEvent, WTF::GPtrDeleter<_GdkEvent> > >::KeyValuePairTraits; KeyTraits = WTF::HashTraits<unsigned int>; WTF::HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyTraits>::AddResult = WTF::HashTableAddResult<WTF::HashTableIterator<unsigned int, WTF::KeyValuePair<unsigned int, std::unique_ptr<_GdkEvent, std::default_delete<_GdkEvent> > >, WTF::KeyValuePairKeyExtractor<WTF::KeyValuePair<unsigned int, std::unique_ptr<_GdkEvent, std::default_delete<_GdkEvent> > > >, WTF::IntHash<unsigned int>, WTF::HashMap<unsigned int, std::unique_ptr<_GdkEvent, WTF::GPtrDeleter<_GdkEvent> > >::KeyValuePairTraits, WTF::HashTraits<unsigned int> > >]'
../../Source/WTF/wtf/HashMap.h:282:130:   required from 'WTF::HashMap<KeyArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg>::AddResult WTF::HashMap<KeyArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg>::inlineAdd(K&&, V&&) [with K = const unsigned int&; V = std::unique_ptr<_GdkEvent, WTF::GPtrDeleter<_GdkEvent> >; KeyArg = unsigned int; MappedArg = std::unique_ptr<_GdkEvent, WTF::GPtrDeleter<_GdkEvent> >; HashArg = WTF::IntHash<unsigned int>; KeyTraitsArg = WTF::HashTraits<unsigned int>; MappedTraitsArg = WTF::HashTraits<std::unique_ptr<_GdkEvent, WTF::GPtrDeleter<_GdkEvent> > >; WTF::HashMap<KeyArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg>::AddResult = WTF::HashTableAddResult<WTF::HashTableIterator<unsigned int, WTF::KeyValuePair<unsigned int, std::unique_ptr<_GdkEvent, std::default_delete<_GdkEvent> > >, WTF::KeyValuePairKeyExtractor<WTF::KeyValuePair<unsigned int, std::unique_ptr<_GdkEvent, std::default_delete<_GdkEvent> > > >, WTF::IntHash<unsigned int>, WTF::HashMap<unsigned int, std::unique_ptr<_GdkEvent, WTF::GPtrDeleter<_GdkEvent> > >::KeyValuePairTraits, WTF::HashTraits<unsigned int> > >]'
../../Source/WTF/wtf/HashMap.h:310:50:   required from 'WTF::HashMap<KeyArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg>::AddResult WTF::HashMap<KeyArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg>::add(const KeyType&, T&&) [with V = std::unique_ptr<_GdkEvent, WTF::GPtrDeleter<_GdkEvent> >; KeyArg = unsigned int; MappedArg = std::unique_ptr<_GdkEvent, WTF::GPtrDeleter<_GdkEvent> >; HashArg = WTF::IntHash<unsigned int>; KeyTraitsArg = WTF::HashTraits<unsigned int>; MappedTraitsArg = WTF::HashTraits<std::unique_ptr<_GdkEvent, WTF::GPtrDeleter<_GdkEvent> > >; WTF::HashMap<KeyArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg>::AddResult = WTF::HashTableAddResult<WTF::HashTableIterator<unsigned int, WTF::KeyValuePair<unsigned int, std::unique_ptr<_GdkEvent, std::default_delete<_GdkEvent> > >, WTF::KeyValuePairKeyExtractor<WTF::KeyValuePair<unsigned int, std::unique_ptr<_GdkEvent, std::default_delete<_GdkEvent> > > >, WTF::IntHash<unsigned int>, WTF::HashMap<unsigned int, std::unique_ptr<_GdkEvent, WTF::GPtrDeleter<_GdkEvent> > >::KeyValuePairTraits, WTF::HashTraits<unsigned int> > >; WTF::HashMap<KeyArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg>::KeyType = unsigned int]'
../../Source/WebCore/platform/gtk/GtkTouchContextHelper.cpp:42:53:   required from here
/usr/include/c++/4.8/bits/unique_ptr.h:206:18: error: no match for 'operator=' (operand types are 'std::unique_ptr<_GdkEvent, std::default_delete<_GdkEvent> >::deleter_type {aka std::default_delete<_GdkEvent>}' and 'WTF::GPtrDeleter<_GdkEvent>')
    get_deleter() = std::forward<_Ep>(__u.get_deleter());
                  ^
/usr/include/c++/4.8/bits/unique_ptr.h:206:18: note: candidates are:
/usr/include/c++/4.8/bits/unique_ptr.h:54:12: note: std::default_delete<_GdkEvent>& std::default_delete<_GdkEvent>::operator=(const std::default_delete<_GdkEvent>&)
     struct default_delete
            ^
/usr/include/c++/4.8/bits/unique_ptr.h:54:12: note:   no known conversion for argument 1 from 'WTF::GPtrDeleter<_GdkEvent>' to 'const std::default_delete<_GdkEvent>&'
/usr/include/c++/4.8/bits/unique_ptr.h:54:12: note: std::default_delete<_GdkEvent>& std::default_delete<_GdkEvent>::operator=(std::default_delete<_GdkEvent>&&)
/usr/include/c++/4.8/bits/unique_ptr.h:54:12: note:   no known conversion for argument 1 from 'WTF::GPtrDeleter<_GdkEvent>' to 'std::default_delete<_GdkEvent>&&'


The problem is that the HashMap is using a unique_ptr with the default deleter, so that when trying to move the unique_ptr the deleters don't match.
Comment 1 Carlos Garcia Campos 2014-02-05 08:47:20 PST
Created attachment 223242 [details]
Patch
Comment 2 WebKit Commit Bot 2014-02-05 11:09:06 PST
Comment on attachment 223242 [details]
Patch

Clearing flags on attachment: 223242

Committed r163460: <http://trac.webkit.org/changeset/163460>
Comment 3 WebKit Commit Bot 2014-02-05 11:09:10 PST
All reviewed patches have been landed.  Closing bug.