[Webkit-unassigned] [Bug 128250] New: HashMap can't be used with std::unique_ptr as value when it has a custom deleter

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Wed Feb 5 08:47:26 PST 2014


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
           Product: WebKit
           Version: 528+ (Nightly build)
          Platform: Unspecified
        OS/Version: Unspecified
            Status: NEW
          Severity: Normal
          Priority: P2
         Component: Web Template Framework
        AssignedTo: webkit-unassigned at lists.webkit.org
        ReportedBy: cgarcia at igalia.com
                CC: carlosg at gnome.org


/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.

-- 
Configure bugmail: https://bugs.webkit.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.



More information about the webkit-unassigned mailing list