On 05/08/2017 11:17 AM, Andreas Schwab wrote:
g++.dg/cpp0x/defaulted34.C has the same problem.
I'd managed to flub my xcompiler build. The code path for fn-descriptor-using targets is different, and I'd missed that the shadowed outer 'fn' was expected to have been initialized in that case.
Committed the attached fix. nathan -- Nathan Sidwell
2017-05-08 Nathan Sidwell <nat...@acm.org> * class.c (build_vtbl_initializer): Don't shadow outer variable with static var. Index: cp/class.c =================================================================== --- cp/class.c (revision 247746) +++ cp/class.c (working copy) @@ -9769,18 +9769,19 @@ build_vtbl_initializer (tree binfo, /* Likewise for deleted virtuals. */ else if (DECL_DELETED_FN (fn_original)) { - static tree fn; + static tree dvirt_fn; - if (!fn) + if (!dvirt_fn) { tree name = get_identifier ("__cxa_deleted_virtual"); - fn = IDENTIFIER_GLOBAL_VALUE (name); - if (!fn) - fn = push_library_fn + dvirt_fn = IDENTIFIER_GLOBAL_VALUE (name); + if (!dvirt_fn) + dvirt_fn = push_library_fn (name, build_function_type_list (void_type_node, NULL_TREE), NULL_TREE, ECF_NORETURN); } + fn = dvirt_fn; if (!TARGET_VTABLE_USES_DESCRIPTORS) init = fold_convert (vfunc_ptr_type_node, build_fold_addr_expr (fn)); @@ -9789,7 +9790,8 @@ build_vtbl_initializer (tree binfo, { if (!integer_zerop (delta) || vcall_index) { - fn = make_thunk (fn, /*this_adjusting=*/1, delta, vcall_index); + fn = make_thunk (fn, /*this_adjusting=*/1, + delta, vcall_index); if (!DECL_NAME (fn)) finish_thunk (fn); }