+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
}
}
- /* 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;
== 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:
--- /dev/null
+// 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;
+}