diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-04-08 18:16:15 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-04-08 18:16:15 +0000 |
commit | c53d0d762010217d02da5aa14be171817d63e3fe (patch) | |
tree | b130fd413ab98eed898a865f33be060800fc3bdb /test/SemaCXX/libstdcxx_map_base_hack.cpp | |
parent | 6f46c2653c1545cc3fef0c0df996d18160160ce8 (diff) |
Introduce an egregious hack to work around a bug in libstdc++ 4.2.x's
<tr1/hashtable> header, where a friend class template
std::tr1::__detail::_Map_base is declared with the wrong template
parameters. GCC doesn't catch the problem, so Clang does a little
back-flip to avoid diagnosing just this one instance of the problem.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@100790 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/SemaCXX/libstdcxx_map_base_hack.cpp')
-rw-r--r-- | test/SemaCXX/libstdcxx_map_base_hack.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/test/SemaCXX/libstdcxx_map_base_hack.cpp b/test/SemaCXX/libstdcxx_map_base_hack.cpp new file mode 100644 index 0000000000..a556281fc0 --- /dev/null +++ b/test/SemaCXX/libstdcxx_map_base_hack.cpp @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 -fsyntax-only %s + +// libstdc++ 4.2.x contains a bug where a friend struct template +// declaration for std::tr1::__detail::_Map base has different +// template arguments than the real declaration. Clang has an +// egregious hack to work around this problem, since we can't modify +// all of the world's libstdc++'s. + +namespace std { namespace tr1 { namespace __detail { + template<typename _Key, typename _Value, typename _Ex, bool __unique, + typename _Hashtable> + struct _Map_base { }; + +} } } + +namespace std { namespace tr1 { + template<typename T> + struct X1 { + template<typename _Key2, typename _Pair, typename _Hashtable> + friend struct __detail::_Map_base; + }; + +} } + +std::tr1::X1<int> x1i; |