--- /dev/null
+#include <typeinfo>
+
+template <class T>
+struct allocator {
+ typedef T* pointer;
+
+ template <class U> struct rebind {
+ typedef allocator<U> other;
+ };
+};
+
+template <class T, class Allocator>
+struct alloc_traits
+{
+ typedef typename Allocator::template rebind<T>::other allocator_type;
+};
+
+main ()
+{
+ typedef alloc_traits<int, allocator<void> >::allocator_type at;
+
+ return typeid (at) != typeid (allocator <int>);
+}
--- /dev/null
+template <class T> struct A {
+ template <class U> struct B {
+ template <class V> static void f () { }
+ void g () { }
+ };
+};
+
+template <class T, class U>
+void f ()
+{
+ A<T>::template B<U>::template f<T> ();
+ typename A<T>::B<U> b;
+ typename A<T>::template B<U> b2;
+ b.A<T>::template B<U>::~B();
+}
+
+main ()
+{
+ f<int, char>();
+}