[petsc-dev] #define FORTRANNULLFUNCTION(a)	(((void(*)(void))(PETSC_UINTPTR_T)a) == PETSC_NULL_FUNCTION_Fortran)
    Barry Smith 
    bsmith at mcs.anl.gov
       
    Thu Nov 21 22:26:28 CST 2013
    
    
  
  Jed,
    It seems this PETSC_UINTPTR_T here is allowing one to cast a void * to a function pointer without generating a warning/error? Is this correct code? Why does it even work?
    I’m trying to get rid of the last of the "casting object pointer to function pointer" warning messages out of PETSc but still get a truck load with 
#define CHKFORTRANNULLFUNCTION(a)  \
  if (FORTRANNULLSCALAR(a) || FORTRANNULLDOUBLE(a) || FORTRANNULLREAL(a) || FORTRANNULLINTEGER(a) || FORTRANNULLOBJECT(a)) { \
    PetscError(PETSC_COMM_SELF,__LINE__,"fortran_interface_unknown_file",__FILE__,PETSC_ERR_ARG_WRONG,PETSC_ERROR_INITIAL, \
    "Use PETSC_NULL_FUNCTION"); *ierr = 1; return; } \
  else if (FORTRANNULLFUNCTION(a)) { a = NULL; }
because each of the FORTRANNULLXXX() tests  cast the function pointer a to an object pointer. Can I instead use the PETSC_UINTPTR_T  trick to cast the object pointers
 like PETSC_NULL_INTEGER_Fortran to function pointers and compare them to eliminate all the warnings?
    Thanks
   Barry
    
    
More information about the petsc-dev
mailing list