WebKit Bugzilla
New
Browse
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
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
Add attachment
proposed patch, testcase, etc.
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.
Top of Page
Format For Printing
XML
Clone This Bug