On 11/05/2012 09:38 PM, Sriraman Tallam wrote:
+      /* For multi-versioned functions, more than one match is just fine.
+        Call decls_match to make sure they are different because they are
+        versioned.  */
+      if (DECL_FUNCTION_VERSIONED (fn))
+       {
+          for (match = TREE_CHAIN (matches); match; match = TREE_CHAIN (match))
+           if (!DECL_FUNCTION_VERSIONED (TREE_PURPOSE (match))
+               || decls_match (fn, TREE_PURPOSE (match)))
+             break;
+       }

I still don't understand what this code is supposed to be doing. Please remove it and instead modify the other loop to allow mismatches that are versions of the same function.

+  /* If the olddecl is a version, so is the newdecl.  */
+  if (TREE_CODE (newdecl) == FUNCTION_DECL
+      && DECL_FUNCTION_VERSIONED (olddecl))
+    {
+      DECL_FUNCTION_VERSIONED (newdecl) = 1;
+      /* newdecl will be purged and is no longer a version.  */
+      delete_function_version (newdecl);
+    }

Please make the comment clearer that the reason we're setting the flag on the newdecl is so that it'll be copied back into the olddecl; otherwise it seems odd to say it's a version and then it isn't a version.

+  /* If a pointer to a function that is multi-versioned is requested, the
+     pointer to the dispatcher function is returned instead.  This works
+     well because indirectly calling the function will dispatch the right
+     function version at run-time.  */
+  if (DECL_FUNCTION_VERSIONED (fn))
+    {
+      tree dispatcher_decl = NULL;
+      gcc_assert (targetm.get_function_versions_dispatcher);
+      dispatcher_decl = targetm.get_function_versions_dispatcher (fn);
+      if (!dispatcher_decl)
+       {
+         error_at (input_location, "Pointer to a multiversioned function"
+                   " without a default is not allowed");
+         return error_mark_node;
+       }
+      retrofit_lang_decl (dispatcher_decl);
+      fn = dispatcher_decl;

This code should use the get_function_version_dispatcher function in cp/call.c.

Jason

Reply via email to