+2010-09-06 Dodji Seketeli <dodji@redhat.com>
+
+ PR c++/45200
+ PR c++/45293
+ PR c++/45558
+ * tree.c (strip_typedefs): Strip typedefs from the context of
+ TYPENAME_TYPEs.
+
2010-09-06 Mark Mitchell <mark@codesourcery.com>
* typeck.c (cp_build_binary_op): Call do_warn_double_promotion.
TYPE_RAISES_EXCEPTIONS (t));
}
break;
+ case TYPENAME_TYPE:
+ result = make_typename_type (strip_typedefs (TYPE_CONTEXT (t)),
+ TYPENAME_TYPE_FULLNAME (t),
+ typename_type, tf_none);
+ break;
default:
break;
}
if (!t1_typedef_variant_p || !t2_typedef_variant_p)
/* Either T1 or T2 is not a typedef so we cannot compare the
- the template parms of the typedefs of T1 and T2.
+ template parms of the typedefs of T1 and T2.
At this point, if the main variant type of T1 and T2 are equal
it means the two types can't be incompatible, from the perspective
of this function. */
+2010-09-06 Dodji Seketeli <dodji@redhat.com>
+
+ PR c++/45200
+ PR c++/45293
+ PR c++/45558
+ * g++.dg/template/typedef34.C: New test.
+ * g++.dg/template/typedef35.C: New test.
+
2010-09-06 Uros Bizjak <ubizjak@gmail.com>
PR target/22152
--- /dev/null
+// Origin PR c++/45200
+// { dg-do compile }
+
+template<typename T>
+struct remove_reference
+{
+ typedef T type;
+};
+
+template<typename TestType>
+struct forward_as_lref
+{
+};
+
+template<typename Seq, typename N>
+struct apply1
+{
+ typedef typename remove_reference<Seq>::type seq;
+ typedef forward_as_lref<typename seq::seq_type> type; //#0
+};
+
+template<typename Seq>
+struct apply
+{
+ typedef forward_as_lref<typename remove_reference<Seq>::type::seq_type> type; //#1
+};
+
+struct reverse_view
+{
+ typedef int seq_type;
+};
+
+int
+main()
+{
+ apply<reverse_view >::type a2;
+}
--- /dev/null
+// Origin c++/45558
+// { dg-do compile }
+
+template <typename S, typename T>
+struct C
+{
+ template <typename U>
+ struct B
+ {
+ template <typename W>
+ struct E
+ {
+ explicit E(const W &x) : w(x) {}
+ const W &w;
+ };
+ };
+};
+
+struct F;
+template <typename X>
+struct D
+{
+ D() {}
+};
+
+const D<F> g;
+template <typename S, typename T>
+struct A
+{
+ template <typename U>
+ struct B : C<S, T>::template B<U>
+ {
+ typedef typename C<S, T>::template B<U> V;
+ static const D<typename V::template E<D<F> > > a;
+ };
+};
+
+template <typename S, typename T>
+template <typename U>
+const D<typename C<S, T>::template B<U>::template E<D<F> > >
+A<S, T>::B<U>::a = typename C<S, T>::template B<U>::template E<D<F> >(g);