elf32-arc.c: Don't cast between function pointer and void pointer

Alan Modra amodra@gmail.com
Fri Oct 16 00:04:47 GMT 2020


Casts should be avoided if at all possible, and in particular the C
standard doesn't promise that function pointers can be cast to void*
or vice-versa.  It is only mentioned under J.5 Common extensions,
saying "The following extensions are widely used in many systems, but
are not portable to all implementations."

Also triggers an ICE on gcc at the moment.

	* elf32-arc.c (replace_func): Correct return type.
	(get_replace_function): Use a replace_func function pointer rather
	than void*.  Update associated ARC_RELOC_HOWTO define.

diff --git a/bfd/elf32-arc.c b/bfd/elf32-arc.c
index 7d282f39ac..a05f697b65 100644
--- a/bfd/elf32-arc.c
+++ b/bfd/elf32-arc.c
@@ -391,17 +391,17 @@ static const struct arc_reloc_map arc_reloc_map[] =
 
 #undef ARC_RELOC_HOWTO
 
-typedef ATTRIBUTE_UNUSED bfd_vma (*replace_func) (unsigned, int ATTRIBUTE_UNUSED);
+typedef ATTRIBUTE_UNUSED unsigned (*replace_func) (unsigned, int ATTRIBUTE_UNUSED);
 
 #define ARC_RELOC_HOWTO(TYPE, VALUE, SIZE, BITSIZE, RELOC_FUNCTION, OVERFLOW, FORMULA) \
   case TYPE: \
-    func = (void *) RELOC_FUNCTION; \
+    func = RELOC_FUNCTION; \
     break;
 
 static replace_func
 get_replace_function (bfd *abfd, unsigned int r_type)
 {
-  void *func = NULL;
+  replace_func func = NULL;
 
   switch (r_type)
     {
@@ -411,7 +411,7 @@ get_replace_function (bfd *abfd, unsigned int r_type)
   if (func == replace_bits24 && bfd_big_endian (abfd))
     func = replace_bits24_be;
 
-  return (replace_func) func;
+  return func;
 }
 #undef ARC_RELOC_HOWTO
 

-- 
Alan Modra
Australia Development Lab, IBM


More information about the Binutils mailing list