In the 2.3.2 release of gcc/g++, how the compiler handles resolving multiple inheritance lattices was reworked to properly discover ambiguities. We recently found an example which causes this new algorithm to fail in a very subtle way. For the time being, this patch will make the compiler use the old algorithm, which works for the failing case we've found. Note it will revert the compiler's ability to properly deduce MI ambiguities in many cases (to its state in 2.2.2 and 2.3.1). This bug will be fixed in the next gcc/g++ release. Brendan Kehoe (brendan@cygnus.com) *** cp-search.c.~1~ Thu Feb 18 18:03:24 1993 --- cp-search.c Thu Feb 18 18:03:27 1993 *************** *** 2389,2392 **** --- 2389,2393 ---- if ((*qfn)(base_binfo)) { + #if 0 if (fn == dfs_init_vbase_pointers) { *************** *** 2464,2467 **** --- 2465,2469 ---- saw_first_vbase = save_saw_first_vbase; } else + #endif dfs_walk (base_binfo, fn, qfn); } *************** dfs_init_vbase_pointers (binfo) *** 2658,2661 **** --- 2660,2664 ---- return; + #if 0 this_vbase_ptr = vbase_decl_ptr_intermediate; *************** dfs_init_vbase_pointers (binfo) *** 2662,2668 **** if (TYPE_POINTER_TO (type) != TREE_TYPE (this_vbase_ptr)) my_friendly_abort (125); - #if 0 distance = get_base_distance (type, TREE_TYPE (vbase_decl), 0, &path); if (distance == -2) { --- 2665,2672 ---- if (TYPE_POINTER_TO (type) != TREE_TYPE (this_vbase_ptr)) my_friendly_abort (125); + #endif distance = get_base_distance (type, TREE_TYPE (vbase_decl), 0, &path); + #if 0 if (distance == -2) { *************** dfs_init_vbase_pointers (binfo) *** 2669,2672 **** --- 2673,2677 ---- error ("inheritance lattice too complex below"); } + #endif while (path) { *************** dfs_init_vbase_pointers (binfo) *** 2682,2685 **** --- 2687,2691 ---- this_vbase_ptr = convert_pointer_to (type, vbase_decl_ptr); + #if 0 /* This happens when it is ambiguous. */ if (this_vbase_ptr == error_mark_node)