WebKit Bugzilla
New
Browse
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
RESOLVED FIXED
128250
HashMap can't be used with std::unique_ptr as value when it has a custom deleter
https://bugs.webkit.org/show_bug.cgi?id=128250
Summary
HashMap can't be used with std::unique_ptr as value when it has a custom deleter
Carlos Garcia Campos
Reported
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.
Attachments
Patch
(1.55 KB, patch)
2014-02-05 08:47 PST
,
Carlos Garcia Campos
no flags
Details
Formatted Diff
Diff
View All
Add attachment
proposed patch, testcase, etc.
Carlos Garcia Campos
Comment 1
2014-02-05 08:47:20 PST
Created
attachment 223242
[details]
Patch
WebKit Commit Bot
Comment 2
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
>
WebKit Commit Bot
Comment 3
2014-02-05 11:09:10 PST
All reviewed patches have been landed. Closing bug.
Note
You need to
log in
before you can comment on or make changes to this bug.
Top of Page
Format For Printing
XML
Clone This Bug