Bug 22325 - MSVC gives bogus error about template argument specialization?
Summary: MSVC gives bogus error about template argument specialization?
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: New Bugs (show other bugs)
Version: 528+ (Nightly build)
Hardware: Mac OS X 10.5
: P2 Normal
Assignee: Nobody
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2008-11-17 14:26 PST by Eric Seidel (no email)
Modified: 2021-09-09 00:11 PDT (History)
5 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Eric Seidel (no email) 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>
        ]
Comment 1 Nathan Howell 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>
Comment 2 Fujii Hironori 2021-09-09 00:11:04 PDT
r174268 removed RefPtrHashMap.