From aafdbe06af7127972c483fb2c9bf07b542b49d23 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 16 Mar 2018 08:38:42 -0400 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/call.c | 17 ----------------- gcc/cp/cp-gimplify.c | 23 +++++++++++++++++++++++ gcc/testsuite/g++.dg/ext/mv27.C | 18 ++++++++++++++++++ 4 files changed, 48 insertions(+), 17 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ext/mv27.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7322a76bd86..a5808604b9a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2018-03-16 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. + 2018-03-16 Jakub Jelinek PR c++/84874 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 45c22aaa312..67438ff2e94 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -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; diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index 0ddd435454c..653d1dcee26 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -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: diff --git a/gcc/testsuite/g++.dg/ext/mv27.C b/gcc/testsuite/g++.dg/ext/mv27.C new file mode 100644 index 00000000000..443a54be765 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/mv27.C @@ -0,0 +1,18 @@ +// 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; +} -- 2.30.2