RESOLVED FIXED 22325
MSVC gives bogus error about template argument specialization?
https://bugs.webkit.org/show_bug.cgi?id=22325
Summary MSVC gives bogus error about template argument specialization?
Eric Seidel (no email)
Reported 2008-11-17 14:26:26 PST
This seems to be a bogus error from MSVC. When I last chatted with mjs about this, he seemed to agree it looked bogus. I would like to upstream our change to this file, however I'm not sure if our use of pragma's is 100% the way WebKit likes this done, but I'll make up a patch to do that first. :) Here is how we fixed it: --- chrome/src/webkit/third_party/WebKit/JavaScriptCore/wtf/RefPtrHashMap.h (WebKit@37604) +++ chrome/src/webkit/third_party/WebKit/JavaScriptCore/wtf/RefPtrHashMap.h (Chromium) @@ -18,6 +18,9 @@ * */ +// Temporarily disable warning about using explicit template arguments +#pragma warning(disable:4344) + namespace WTF { // This specialization is a direct copy of HashMap, with overloaded functions @@ -334,3 +337,6 @@ } } // namespace WTF + +// Re-enable warning disabled at top of file +#pragma warning(default:4344) This is the original error: c:\projects\webkit\javascriptcore\wtf\RefPtrHashMap.h(176) : warning C4344: behavior change: use of explicit template arguments results in call to 'WTF::HashTableIterator<Key,Value,Extractor,HashFunctions,Traits,KeyTraits> WTF::HashTable<Key,Value,Extractor,HashFunctions,Traits,KeyTraits>::find<JSC::UString::Rep*,WTF::RefPtrHashMapRawKeyTranslator<RawKeyType,ValueType,ValueTraits,HashFunctions>>(const T &)' with [ Key=WTF::RefPtr<JSC::UString::Rep>, Value=std::pair<WTF::RefPtr<JSC::UString::Rep>,JSC::OffsetLocation>, Extractor=WTF::PairFirstExtractor<std::pair<WTF::RefPtr<JSC::UString::Rep>,JSC::OffsetLocation>>, HashFunctions=WTF::StrHash<WTF::RefPtr<JSC::UString::Rep>>, Traits=WTF::PairHashTraits<WTF::HashTraits<WTF::RefPtr<JSC::UString::Rep>>,WTF::HashTraits<JSC::OffsetLocation>>, KeyTraits=WTF::HashTraits<WTF::RefPtr<JSC::UString::Rep>>, RawKeyType=JSC::UString::Rep *, ValueType=std::pair<WTF::RefPtr<JSC::UString::Rep>,JSC::OffsetLocation>, ValueTraits=WTF::PairHashTraits<WTF::HashTraits<WTF::RefPtr<JSC::UString::Rep>>,WTF::HashTraits<JSC::OffsetLocation>>, T=JSC::UString::Rep * ] but the regular function 'WTF::HashTableIterator<Key,Value,Extractor,HashFunctions,Traits,KeyTraits> WTF::HashTable<Key,Value,Extractor,HashFunctions,Traits,KeyTraits>::find(const WTF::RefPtr<T> &)' is a better match with [ Key=WTF::RefPtr<JSC::UString::Rep>, Value=std::pair<WTF::RefPtr<JSC::UString::Rep>,JSC::OffsetLocation>, Extractor=WTF::PairFirstExtractor<std::pair<WTF::RefPtr<JSC::UString::Rep>,JSC::OffsetLocation>>, HashFunctions=WTF::StrHash<WTF::RefPtr<JSC::UString::Rep>>, Traits=WTF::PairHashTraits<WTF::HashTraits<WTF::RefPtr<JSC::UString::Rep>>,WTF::HashTraits<JSC::OffsetLocation>>, KeyTraits=WTF::HashTraits<WTF::RefPtr<JSC::UString::Rep>>, T=JSC::UString::Rep ] if you expect 'WTF::HashTableIterator<Key,Value,Extractor,HashFunctions,Traits,KeyTraits> WTF::HashTable<Key,Value,Extractor,HashFunctions,Traits,KeyTraits>::find(const WTF::RefPtr<T> &)' to be called then you need to make it an explicit specialization with [ Key=WTF::RefPtr<JSC::UString::Rep>, Value=std::pair<WTF::RefPtr<JSC::UString::Rep>,JSC::OffsetLocation>, Extractor=WTF::PairFirstExtractor<std::pair<WTF::RefPtr<JSC::UString::Rep>,JSC::OffsetLocation>>, HashFunctions=WTF::StrHash<WTF::RefPtr<JSC::UString::Rep>>, Traits=WTF::PairHashTraits<WTF::HashTraits<WTF::RefPtr<JSC::UString::Rep>>,WTF::HashTraits<JSC::OffsetLocation>>, KeyTraits=WTF::HashTraits<WTF::RefPtr<JSC::UString::Rep>>, T=JSC::UString::Rep ] c:\projects\webkit\javascriptcore\wtf\RefPtrHashMap.h(175) : while compiling class template member function 'WTF::HashTableIteratorAdapter<HashTableType,ValueType> WTF::HashMap<KeyArg,MappedArg>::find(JSC::UString::Rep *)' with [ HashTableType=WTF::HashTable<WTF::RefPtr<JSC::UString::Rep>,std::pair<WTF::RefPtr<JSC::UString::Rep>,JSC::OffsetLocation>,WTF::PairFirstExtractor<std::pair<WTF::RefPtr<JSC::UString::Rep>,JSC::OffsetLocation>>,WTF::StrHash<WTF::RefPtr<JSC::UString::Rep>>,WTF::PairHashTraits<WTF::HashTraits<WTF::RefPtr<JSC::UString::Rep>>,WTF::HashTraits<JSC::OffsetLocation>>,WTF::HashTraits<WTF::RefPtr<JSC::UString::Rep>>>, ValueType=std::pair<WTF::RefPtr<JSC::UString::Rep>,JSC::OffsetLocation>, KeyArg=WTF::RefPtr<JSC::UString::Rep>, MappedArg=JSC::OffsetLocation ] VM\CodeBlock.h(161) : see reference to class template instantiation 'WTF::HashMap<KeyArg,MappedArg>' being compiled with [ KeyArg=WTF::RefPtr<JSC::UString::Rep>, MappedArg=JSC::OffsetLocation ] c:\projects\webkit\javascriptcore\wtf\RefPtrHashMap.h(270) : warning C4344: behavior change: use of explicit template arguments results in call to 'Value *WTF::HashTable<Key,Value,Extractor,HashFunctions,Traits,KeyTraits>::lookup<JSC::UString::Rep*,WTF::RefPtrHashMapRawKeyTranslator<RawKeyType,ValueType,ValueTraits,HashFunctions>>(const T &)' with [ Value=std::pair<WTF::RefPtr<JSC::UString::Rep>,WTF::RefPtr<JSC::EvalNode>>, Key=WTF::RefPtr<JSC::UString::Rep>, Extractor=WTF::PairFirstExtractor<std::pair<WTF::RefPtr<JSC::UString::Rep>,WTF::RefPtr<JSC::EvalNode>>>, HashFunctions=WTF::StrHash<WTF::RefPtr<JSC::UString::Rep>>, Traits=WTF::PairHashTraits<WTF::HashTraits<WTF::RefPtr<JSC::UString::Rep>>,WTF::HashTraits<WTF::RefPtr<JSC::EvalNode>>>, KeyTraits=WTF::HashTraits<WTF::RefPtr<JSC::UString::Rep>>, RawKeyType=JSC::UString::Rep *, ValueType=std::pair<WTF::RefPtr<JSC::UString::Rep>,WTF::RefPtr<JSC::EvalNode>>, ValueTraits=WTF::PairHashTraits<WTF::HashTraits<WTF::RefPtr<JSC::UString::Rep>>,WTF::HashTraits<WTF::RefPtr<JSC::EvalNode>>>, T=JSC::UString::Rep * ] but the regular function 'std::pair<_Ty1,_Ty2> *WTF::HashTable<Key,Value,Extractor,HashFunctions,Traits,KeyTraits>::lookup(const Key &)' is a better match with [ _Ty1=WTF::RefPtr<JSC::UString::Rep>, _Ty2=WTF::RefPtr<JSC::EvalNode>, Key=WTF::RefPtr<JSC::UString::Rep>, Value=std::pair<WTF::RefPtr<JSC::UString::Rep>,WTF::RefPtr<JSC::EvalNode>>, Extractor=WTF::PairFirstExtractor<std::pair<WTF::RefPtr<JSC::UString::Rep>,WTF::RefPtr<JSC::EvalNode>>>, HashFunctions=WTF::StrHash<WTF::RefPtr<JSC::UString::Rep>>, Traits=WTF::PairHashTraits<WTF::HashTraits<WTF::RefPtr<JSC::UString::Rep>>,WTF::HashTraits<WTF::RefPtr<JSC::EvalNode>>>, KeyTraits=WTF::HashTraits<WTF::RefPtr<JSC::UString::Rep>> ] if you expect 'std::pair<_Ty1,_Ty2> *WTF::HashTable<Key,Value,Extractor,HashFunctions,Traits,KeyTraits>::lookup(const Key &)' to be called then you need to make it an explicit specialization with [ _Ty1=WTF::RefPtr<JSC::UString::Rep>, _Ty2=WTF::RefPtr<JSC::EvalNode>, Key=WTF::RefPtr<JSC::UString::Rep>, Value=std::pair<WTF::RefPtr<JSC::UString::Rep>,WTF::RefPtr<JSC::EvalNode>>, Extractor=WTF::PairFirstExtractor<std::pair<WTF::RefPtr<JSC::UString::Rep>,WTF::RefPtr<JSC::EvalNode>>>, HashFunctions=WTF::StrHash<WTF::RefPtr<JSC::UString::Rep>>, Traits=WTF::PairHashTraits<WTF::HashTraits<WTF::RefPtr<JSC::UString::Rep>>,WTF::HashTraits<WTF::RefPtr<JSC::EvalNode>>>, KeyTraits=WTF::HashTraits<WTF::RefPtr<JSC::UString::Rep>> ] c:\projects\webkit\javascriptcore\wtf\RefPtrHashMap.h(269) : while compiling class template member function 'WTF::RefPtr<T> WTF::HashMap<KeyArg,MappedArg>::inlineGet(JSC::UString::Rep *) const' with [ T=JSC::EvalNode, KeyArg=WTF::RefPtr<JSC::UString::Rep>, MappedArg=WTF::RefPtr<JSC::EvalNode> ] c:\projects\webkit\javascriptcore\wtf\RefPtrHashMap.h(127) : while compiling class template member function 'int WTF::HashMap<KeyArg,MappedArg>::size(void) const' with [ KeyArg=WTF::RefPtr<JSC::UString::Rep>, MappedArg=WTF::RefPtr<JSC::EvalNode> ] c:\projects\webkit\javascriptcore\vm\EvalCodeCache.h(73) : see reference to class template instantiation 'WTF::HashMap<KeyArg,MappedArg>' being compiled with [ KeyArg=WTF::RefPtr<JSC::UString::Rep>, MappedArg=WTF::RefPtr<JSC::EvalNode> ]
Attachments
Nathan Howell
Comment 1 2008-11-18 22:37:31 PST
One of the MSVC devs would like a repro case if this is a VC9 regression. <quote> This warning is emitted when f<T>(args) calls something different than f(args). The warning dates back to VC7.1 at least, so I'm not sure what changed here. Generally, explicit template arguments are unnecessary; you should let template argument deduction do the work for you. So, you should carefully think about why you're calling f<T>(args), and whether f(args) would be better. I can't really say more (especially about the "then you need to make it an explicit specialization" part) without seeing a self-contained test case. As your code appears to be very complicated (with many template arguments), a simplified self-contained test case would be much appreciated. </quote>
Fujii Hironori
Comment 2 2021-09-09 00:11:04 PDT
r174268 removed RefPtrHashMap.
Note You need to log in before you can comment on or make changes to this bug.