tst-const.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /* Test <string.h> const-generic macros.
  2. Copyright (C) 2025-2026 Free Software Foundation, Inc.
  3. This file is part of the GNU C Library.
  4. The GNU C Library is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU Lesser General Public
  6. License as published by the Free Software Foundation; either
  7. version 2.1 of the License, or (at your option) any later version.
  8. The GNU C Library is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. Lesser General Public License for more details.
  12. You should have received a copy of the GNU Lesser General Public
  13. License along with the GNU C Library; if not, see
  14. <https://www.gnu.org/licenses/>. */
  15. #include <string.h>
  16. #include <libc-diag.h>
  17. void *vp;
  18. const void *cvp;
  19. int *ip;
  20. const int *cip;
  21. char *cp;
  22. const char *ccp;
  23. int c;
  24. size_t sz;
  25. #define CHECK_TYPE(EXPR, TYPE) \
  26. _Static_assert (_Generic (EXPR, TYPE: 1), "type check")
  27. static int
  28. do_test (void)
  29. {
  30. /* This is a compilation test. */
  31. CHECK_TYPE (memchr (vp, c, sz), void *);
  32. CHECK_TYPE (memchr (cvp, c, sz), const void *);
  33. CHECK_TYPE (memchr (ip, c, sz), void *);
  34. CHECK_TYPE (memchr (cip, c, sz), const void *);
  35. CHECK_TYPE (memchr (cp, c, sz), void *);
  36. CHECK_TYPE (memchr (ccp, c, sz), const void *);
  37. DIAG_PUSH_NEEDS_COMMENT;
  38. /* This deliberately tests the type of the result with a null
  39. pointer constant argument. */
  40. DIAG_IGNORE_NEEDS_COMMENT (14, "-Wnonnull");
  41. CHECK_TYPE (memchr (0, c, sz), void *);
  42. CHECK_TYPE (memchr ((void *) 0, c, sz), void *);
  43. DIAG_POP_NEEDS_COMMENT;
  44. CHECK_TYPE ((memchr) (cvp, c, sz), void *);
  45. CHECK_TYPE (strchr (vp, c), char *);
  46. CHECK_TYPE (strchr (cvp, c), const char *);
  47. CHECK_TYPE (strchr (cp, c), char *);
  48. CHECK_TYPE (strchr (ccp, c), const char *);
  49. DIAG_PUSH_NEEDS_COMMENT;
  50. DIAG_IGNORE_NEEDS_COMMENT (14, "-Wnonnull");
  51. CHECK_TYPE (strchr (0, c), char *);
  52. CHECK_TYPE (strchr ((void *) 0, c), char *);
  53. DIAG_POP_NEEDS_COMMENT;
  54. CHECK_TYPE ((strchr) (ccp, c), char *);
  55. CHECK_TYPE (strpbrk (vp, vp), char *);
  56. CHECK_TYPE (strpbrk (vp, cvp), char *);
  57. CHECK_TYPE (strpbrk (cvp, vp), const char *);
  58. CHECK_TYPE (strpbrk (cvp, cvp), const char *);
  59. CHECK_TYPE (strpbrk (cp, cp), char *);
  60. CHECK_TYPE (strpbrk (cp, ccp), char *);
  61. CHECK_TYPE (strpbrk (ccp, cp), const char *);
  62. CHECK_TYPE (strpbrk (ccp, ccp), const char *);
  63. DIAG_PUSH_NEEDS_COMMENT;
  64. DIAG_IGNORE_NEEDS_COMMENT (14, "-Wnonnull");
  65. CHECK_TYPE (strpbrk (0, cp), char *);
  66. CHECK_TYPE (strpbrk (0, ccp), char *);
  67. CHECK_TYPE (strpbrk ((void *) 0, cp), char *);
  68. CHECK_TYPE (strpbrk ((void *) 0, ccp), char *);
  69. DIAG_POP_NEEDS_COMMENT;
  70. CHECK_TYPE ((strpbrk) (ccp, ccp), char *);
  71. CHECK_TYPE (strrchr (vp, c), char *);
  72. CHECK_TYPE (strrchr (cvp, c), const char *);
  73. CHECK_TYPE (strrchr (cp, c), char *);
  74. CHECK_TYPE (strrchr (ccp, c), const char *);
  75. DIAG_PUSH_NEEDS_COMMENT;
  76. DIAG_IGNORE_NEEDS_COMMENT (14, "-Wnonnull");
  77. CHECK_TYPE (strrchr (0, c), char *);
  78. CHECK_TYPE (strrchr ((void *) 0, c), char *);
  79. DIAG_POP_NEEDS_COMMENT;
  80. CHECK_TYPE ((strrchr) (ccp, c), char *);
  81. CHECK_TYPE (strstr (vp, vp), char *);
  82. CHECK_TYPE (strstr (vp, cvp), char *);
  83. CHECK_TYPE (strstr (cvp, vp), const char *);
  84. CHECK_TYPE (strstr (cvp, cvp), const char *);
  85. CHECK_TYPE (strstr (cp, cp), char *);
  86. CHECK_TYPE (strstr (cp, ccp), char *);
  87. CHECK_TYPE (strstr (ccp, cp), const char *);
  88. CHECK_TYPE (strstr (ccp, ccp), const char *);
  89. DIAG_PUSH_NEEDS_COMMENT;
  90. DIAG_IGNORE_NEEDS_COMMENT (14, "-Wnonnull");
  91. CHECK_TYPE (strstr (0, cp), char *);
  92. CHECK_TYPE (strstr (0, ccp), char *);
  93. CHECK_TYPE (strstr ((void *) 0, cp), char *);
  94. CHECK_TYPE (strstr ((void *) 0, ccp), char *);
  95. DIAG_POP_NEEDS_COMMENT;
  96. CHECK_TYPE ((strstr) (ccp, ccp), char *);
  97. return 0;
  98. }
  99. #include <support/test-driver.c>