Define PRINTFLIKE_FUNCPTR() exactly for XL C. [skip appveyor]

XL C full version consists of 4 numbers.  Introduce an additional macro
for testing the two least significant numbers.  Using the fix lists
published by IBM, tell XL C 16.1 that has the bug interpreting the
__format__ attribute of a function pointer from XL C 16.1 that has not.
Rejig the #if block to make it easier to follow.

(cherry picked from commit 66e1377aa133bf83ecf92679a53f7d0c54efc445)
diff --git a/compiler-tests.h b/compiler-tests.h
index d9cf81f..78fca01 100644
--- a/compiler-tests.h
+++ b/compiler-tests.h
@@ -141,14 +141,21 @@
 #if ! defined(__xlC__)
 #if ! defined(__ibmxl__)
 #define ND_IS_AT_LEAST_XL_C_VERSION(major,minor) 0
+#define ND_IS_AT_LEAST_XL_C_MODFIX(modification, fixlevel) 0
 #else
 #define ND_IS_AT_LEAST_XL_C_VERSION(major, minor) \
 	(__ibmxl_version__ > (major) || \
 	 (__ibmxl_version__ == (major) && __ibmxl_release__ >= (minor)))
+#define ND_IS_AT_LEAST_XL_C_MODFIX(modification, fixlevel) \
+  (__ibmxl_modification__ > (modification) || \
+   (__ibmxl_modification__ == (modification) && \
+    __ibmxl_ptf_fix_level__ >= (fixlevel)))
 #endif /* ! __ibmxl__ */
 #else /* ! __xlC__ */
 #define ND_IS_AT_LEAST_XL_C_VERSION(major, minor) \
 	(__xlC__ >= (((major) << 8) | (minor)))
+#define ND_IS_AT_LEAST_XL_C_MODFIX(modification, fixlevel) \
+  ((((modification) << 8) | (fixlevel)) >= __xlC_ver__)
 #endif
 
 /*
diff --git a/funcattrs.h b/funcattrs.h
index 00efad7..dfe3662 100644
--- a/funcattrs.h
+++ b/funcattrs.h
@@ -125,18 +125,29 @@
    * However, GCC didn't support that for function *pointers* until GCC
    * 4.1.0; see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3481.
    * XL C 16.1 (and possibly some earlier versions, but not 12.1 or 13.1) has
-   * a similar bug, a bugfix for which should be available later:
-   * https://www.ibm.com/support/pages/apar/LI81402
+   * a similar bug, the bugfix for which was made in:
+   * * version 16.1.1.8 for Linux (25 June 2020), which fixes
+   *   https://www.ibm.com/support/pages/apar/LI81402
+   * * version 16.1.0.5 for AIX (5 May 2020), which fixes
+   *   https://www.ibm.com/support/pages/apar/IJ24678
+   *
+   * When testing versions, keep in mind that XL C 16.1 pretends to be both
+   * GCC 4.2 and Clang 4.0 at once.
    */
-  #if (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) < 401)) || \
-      (ND_IS_AT_LEAST_XL_C_VERSION(16,1) && !ND_IS_AT_LEAST_XL_C_VERSION(16,2))
-    #define PRINTFLIKE_FUNCPTR(x,y)
-  #else
+  #if (ND_IS_AT_LEAST_GNUC_VERSION(4,1) \
+       && !ND_IS_AT_LEAST_XL_C_VERSION(10,1)) \
+      || (ND_IS_AT_LEAST_XL_C_VERSION(16,1) \
+          && (ND_IS_AT_LEAST_XL_C_MODFIX(1, 8) && defined(__linux__)) \
+              || (ND_IS_AT_LEAST_XL_C_MODFIX(0, 5) && defined(_AIX)))
     #define PRINTFLIKE_FUNCPTR(x,y) __attribute__((__format__(__printf__,x,y)))
   #endif
-#else
-  #define PRINTFLIKE(x,y)
-  #define PRINTFLIKE_FUNCPTR(x,y)
+#endif
+
+#if !defined(PRINTFLIKE)
+#define PRINTFLIKE(x,y)
+#endif
+#if !defined(PRINTFLIKE_FUNCPTR)
+#define PRINTFLIKE_FUNCPTR(x,y)
 #endif
 
 /*