Commit aafdbe06 by Jason Merrill Committed by Jason Merrill

PR c++/83911 - ICE with multiversioned constructor.

	* cp-gimplify.c (cp_genericize_r): Replace versioned function with
	dispatchere here.
	* call.c (build_over_call): Not here.
	PR c++/83911 - ICE with multiversioned constructor.

From-SVN: r258592
parent a1295eec
2018-03-16 Jason Merrill <jason@redhat.com>
PR c++/83911 - ICE with multiversioned constructor.
* cp-gimplify.c (cp_genericize_r): Replace versioned function with
dispatchere here.
* call.c (build_over_call): Not here.
2018-03-16 Jakub Jelinek <jakub@redhat.com>
PR c++/84874
......
......@@ -8204,23 +8204,6 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
}
}
/* For calls to a multi-versioned function, overload resolution
returns the function with the highest target priority, that is,
the version that will checked for dispatching first. If this
version is inlinable, a direct call to this version can be made
otherwise the call should go through the dispatcher. */
if (DECL_FUNCTION_VERSIONED (fn)
&& (current_function_decl == NULL
|| !targetm.target_option.can_inline_p (current_function_decl, fn)))
{
fn = get_function_version_dispatcher (fn);
if (fn == NULL)
return NULL;
if (!already_used)
mark_versions_used (fn);
}
if (!already_used
&& !mark_used (fn, complain))
return error_mark_node;
......
......@@ -1513,6 +1513,29 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data)
== REFERENCE_TYPE))
*walk_subtrees = 0;
}
/* Fall through. */
case AGGR_INIT_EXPR:
/* For calls to a multi-versioned function, overload resolution
returns the function with the highest target priority, that is,
the version that will checked for dispatching first. If this
version is inlinable, a direct call to this version can be made
otherwise the call should go through the dispatcher. */
{
tree fn = cp_get_callee_fndecl (stmt);
if (fn && DECL_FUNCTION_VERSIONED (fn)
&& (current_function_decl == NULL
|| !targetm.target_option.can_inline_p (current_function_decl,
fn)))
if (tree dis = get_function_version_dispatcher (fn))
{
mark_versions_used (dis);
dis = build_address (dis);
if (TREE_CODE (stmt) == CALL_EXPR)
CALL_EXPR_FN (stmt) = dis;
else
AGGR_INIT_EXPR_FN (stmt) = dis;
}
}
break;
default:
......
// PR c++/83911
// { dg-do compile { target i?86-*-* x86_64-*-* } }
// { dg-require-ifunc "" }
class SimdFloat
{
public:
__attribute__ ((target ("default")))
SimdFloat(float x) {}
__attribute__ ((target ("avx2")))
SimdFloat(float x) {}
};
SimdFloat foo()
{
return 1;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment