| 1 | In the 2.3.2 release of gcc/g++, how the compiler handles resolving |
| 2 | multiple inheritance lattices was reworked to properly discover |
| 3 | ambiguities. We recently found an example which causes this new |
| 4 | algorithm to fail in a very subtle way. For the time being, this |
| 5 | patch will make the compiler use the old algorithm, which works for |
| 6 | the failing case we've found. Note it will revert the compiler's |
| 7 | ability to properly deduce MI ambiguities in many cases (to its state |
| 8 | in 2.2.2 and 2.3.1). This bug will be fixed in the next gcc/g++ |
| 9 | release. |
| 10 | |
| 11 | Brendan Kehoe (brendan@cygnus.com) |
| 12 | |
| 13 | *** cp-search.c.~1~ Thu Feb 18 18:03:24 1993 |
| 14 | --- cp-search.c Thu Feb 18 18:03:27 1993 |
| 15 | *************** |
| 16 | *** 2389,2392 **** |
| 17 | --- 2389,2393 ---- |
| 18 | if ((*qfn)(base_binfo)) |
| 19 | { |
| 20 | + #if 0 |
| 21 | if (fn == dfs_init_vbase_pointers) |
| 22 | { |
| 23 | *************** |
| 24 | *** 2464,2467 **** |
| 25 | --- 2465,2469 ---- |
| 26 | saw_first_vbase = save_saw_first_vbase; |
| 27 | } else |
| 28 | + #endif |
| 29 | dfs_walk (base_binfo, fn, qfn); |
| 30 | } |
| 31 | *************** dfs_init_vbase_pointers (binfo) |
| 32 | *** 2658,2661 **** |
| 33 | --- 2660,2664 ---- |
| 34 | return; |
| 35 | |
| 36 | + #if 0 |
| 37 | this_vbase_ptr = vbase_decl_ptr_intermediate; |
| 38 | |
| 39 | *************** dfs_init_vbase_pointers (binfo) |
| 40 | *** 2662,2668 **** |
| 41 | if (TYPE_POINTER_TO (type) != TREE_TYPE (this_vbase_ptr)) |
| 42 | my_friendly_abort (125); |
| 43 | |
| 44 | - #if 0 |
| 45 | distance = get_base_distance (type, TREE_TYPE (vbase_decl), 0, &path); |
| 46 | if (distance == -2) |
| 47 | { |
| 48 | --- 2665,2672 ---- |
| 49 | if (TYPE_POINTER_TO (type) != TREE_TYPE (this_vbase_ptr)) |
| 50 | my_friendly_abort (125); |
| 51 | + #endif |
| 52 | |
| 53 | distance = get_base_distance (type, TREE_TYPE (vbase_decl), 0, &path); |
| 54 | + #if 0 |
| 55 | if (distance == -2) |
| 56 | { |
| 57 | *************** dfs_init_vbase_pointers (binfo) |
| 58 | *** 2669,2672 **** |
| 59 | --- 2673,2677 ---- |
| 60 | error ("inheritance lattice too complex below"); |
| 61 | } |
| 62 | + #endif |
| 63 | while (path) |
| 64 | { |
| 65 | *************** dfs_init_vbase_pointers (binfo) |
| 66 | *** 2682,2685 **** |
| 67 | --- 2687,2691 ---- |
| 68 | this_vbase_ptr = convert_pointer_to (type, vbase_decl_ptr); |
| 69 | |
| 70 | + #if 0 |
| 71 | /* This happens when it is ambiguous. */ |
| 72 | if (this_vbase_ptr == error_mark_node) |