With this patch we can build the C++ frontend and libraries with an instrumented build1 that checks ADDR_EXPR types to match as far as sharing the same TYPE_MAIN_VARIANT.
Comments? Richard. 2005-05-18 Richard Guenther <[EMAIL PROTECTED]> * class.c (dfs_accumulate_vtbl_inits): Create ADDR_EXPR with correct types. (build_vtbl_initializer): Likewise. * except.c (build_throw): Likewise. * tree.c (build1_stat): Instrument for incorrectly typed ADDR_EXPRs. Index: cp/class.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/cp/class.c,v retrieving revision 1.717 diff -c -3 -p -r1.717 class.c *** cp/class.c 8 May 2005 02:17:54 -0000 1.717 --- cp/class.c 18 May 2005 12:03:12 -0000 *************** dfs_accumulate_vtbl_inits (tree binfo, *** 7069,7075 **** /* Figure out the position to which the VPTR should point. */ vtbl = TREE_PURPOSE (l); ! vtbl = build1 (ADDR_EXPR, vtbl_ptr_type_node, vtbl); index = size_binop (PLUS_EXPR, size_int (non_fn_entries), size_int (list_length (TREE_VALUE (l)))); --- 7069,7075 ---- /* Figure out the position to which the VPTR should point. */ vtbl = TREE_PURPOSE (l); ! vtbl = build_fold_addr_expr (vtbl); index = size_binop (PLUS_EXPR, size_int (non_fn_entries), size_int (list_length (TREE_VALUE (l)))); *************** build_vtbl_initializer (tree binfo, *** 7247,7253 **** { fn = abort_fndecl; if (abort_fndecl_addr == NULL) ! abort_fndecl_addr = build1 (ADDR_EXPR, vfunc_ptr_type_node, fn); init = abort_fndecl_addr; } else --- 7247,7254 ---- { fn = abort_fndecl; if (abort_fndecl_addr == NULL) ! abort_fndecl_addr = convert (vfunc_ptr_type_node, ! build_fold_addr_expr (fn)); init = abort_fndecl_addr; } else *************** build_vtbl_initializer (tree binfo, *** 7260,7266 **** } /* Take the address of the function, considering it to be of an appropriate generic type. */ ! init = build1 (ADDR_EXPR, vfunc_ptr_type_node, fn); } } --- 7261,7268 ---- } /* Take the address of the function, considering it to be of an appropriate generic type. */ ! init = convert (vfunc_ptr_type_node, ! build_fold_addr_expr (fn)); } } Index: cp/except.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/cp/except.c,v retrieving revision 1.182 diff -c -3 -p -r1.182 except.c *** cp/except.c 23 Apr 2005 21:28:53 -0000 1.182 --- cp/except.c 18 May 2005 12:03:21 -0000 *************** build_throw (tree exp) *** 744,750 **** mark_used (cleanup); cxx_mark_addressable (cleanup); /* Pretend it's a normal function. */ ! cleanup = build1 (ADDR_EXPR, cleanup_type, cleanup); } else cleanup = build_int_cst (cleanup_type, 0); --- 744,751 ---- mark_used (cleanup); cxx_mark_addressable (cleanup); /* Pretend it's a normal function. */ ! cleanup = convert (cleanup_type, ! build_fold_addr_expr (cleanup)); } else cleanup = build_int_cst (cleanup_type, 0); Index: tree.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/tree.c,v retrieving revision 1.479 diff -c -3 -p -r1.479 tree.c *** tree.c 11 May 2005 16:25:29 -0000 1.479 --- tree.c 18 May 2005 12:05:56 -0000 *************** build1_stat (enum tree_code code, tree t *** 2560,2565 **** --- 2560,2569 ---- case ADDR_EXPR: if (node) recompute_tree_invarant_for_addr_expr (t); + if (TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) != ARRAY_TYPE + && TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (t))) + != TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (t, 0)))) + gcc_unreachable (); break; default: