+2010-06-28 Martin Jambor <mjambor@suse.cz>
+
+ PR c++/44535
+ * gimple-fold.c (get_first_base_binfo_with_virtuals): New function.
+ (gimple_get_relevant_ref_binfo): Use get_first_base_binfo_with_virtuals
+ instead of BINFO_BASE_BINFO.
+
2010-06-28 Michael Matz <matz@suse.de>
PR middle-end/44592
return result;
}
+/* Return the first of the base binfos of BINFO that has virtual functions. */
+
+static tree
+get_first_base_binfo_with_virtuals (tree binfo)
+{
+ int i;
+ tree base_binfo;
+
+ for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
+ if (BINFO_VIRTUALS (base_binfo))
+ return base_binfo;
+
+ return NULL_TREE;
+}
+
+
/* Search for a base binfo of BINFO that corresponds to TYPE and return it if
it is found or NULL_TREE if it is not. */
|| BINFO_N_BASE_BINFOS (binfo) == 0)
return NULL_TREE;
- base_binfo = BINFO_BASE_BINFO (binfo, 0);
- if (BINFO_TYPE (base_binfo) != TREE_TYPE (field))
+ base_binfo = get_first_base_binfo_with_virtuals (binfo);
+ if (base_binfo && BINFO_TYPE (base_binfo) != TREE_TYPE (field))
{
tree d_binfo;
--- /dev/null
+/* { dg-do run } */
+
+namespace FOO {
+
+template <typename T>
+class A
+{
+public:
+ void Enum();
+ virtual void OnProv() = 0;
+ virtual ~A() { }
+};
+typedef A<char> B;
+
+template<typename T>
+void A<T>::Enum ()
+{
+ OnProv ();
+}
+} // namespace FOO
+
+class C {};
+
+class D: public C, public FOO::B {
+public:
+ void OnProv() {}
+};
+
+int main(int argc, char *argv[])
+{
+ D x;
+ x.Enum();
+ return 0;
+}