https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70267
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Perhaps --- gcc/cp/init.c.jj 2016-03-05 07:46:50.000000000 +0100 +++ gcc/cp/init.c 2016-03-17 17:18:21.326917746 +0100 @@ -2872,6 +2872,14 @@ build_new_1 (vec<tree, va_gc> **placemen return error_mark_node; } alloc_fn = OVL_CURRENT (alloc_fn); + if (TREE_CODE (alloc_fn) != FUNCTION_DECL + || TREE_CODE (TREE_TYPE (alloc_fn)) != FUNCTION_TYPE + || !POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (alloc_fn)))) + { + if (complain & tf_error) + error ("%qD is not a function returning a pointer", alloc_fn); + return error_mark_node; + } class_addr = build1 (ADDR_EXPR, jclass_node, class_decl); alloc_call = cp_build_function_call_nary (alloc_fn, complain, class_addr, NULL_TREE); ? Though, there are many other calls to get_global_value_if_present in the C++ FE, which probably also need some sanity checking, whether declaring those functions with weirdo return or argument types can't cause ICEs.