Тестирую парсер Си компилятора. А конкретно одно правило грамматики, называется type_name. Попросил ИИ сгенерить набор тестов, чтобы перебрать как можно больше вариантов. Вот такой список получился. Ничего важного не пропущено?
1. Simple Types
These test the "type_name : specifier_qualifier_list" branch with basic type specifiers.- 1. void
- 2. char
- 3. int
- 4. short
- 5. long
- 6. float
- 7. double
- 8. signed
- 9. unsigned
- 10. bool
- 11. _Complex
- 12. _Imaginary
2. Modified Basic Types
Combinations of type specifiers for integer and floating-point types.- 13. unsigned int
- 14. signed char
- 15. long int
- 16. long long
- 17. unsigned short
- 18. signed long
- 19. long double
- 20. unsigned long long
3. Qualified Types
Adding type qualifiers to basic and modified types.- 21. const int
- 22. volatile char
- 23. restrict double
- 24. _Atomic float
- 25. const unsigned int
- 26. volatile long long
- 27. const restrict int
- 28. const volatile unsigned char
4. Struct, Union, Enum, and Typedef Types
Testing complex type specifiers.- 29. struct S
- 30. union U
- 31. enum E
- 32. MyType
- 33. const struct S
- 34. volatile union U
- 35. _Atomic enum E
5. Atomic Type Specifier
Testing "_Atomic" with a type name.- 36. _Atomic(int)
- 37. _Atomic(struct S)
- 38. _Atomic(const char)
6. Pointer Types
Testing "type_name : specifier_qualifier_list abstract_declarator" with "abstract_declarator : pointer".- 39. int *
- 40. char *
- 41. void *
- 42. const int *
- 43. int * const
- 44. volatile char *
- 45. int * volatile
- 46. const restrict int *
- 47. int **
- 48. struct S *
- 49. unsigned long *
- 50. int * const volatile
7. Array Types
Testing "abstract_declarator : direct_abstract_declarator" with array declarators.- 51. int []
- 52. char [5]
- 53. double [10]
- 54. const int []
- 55. int [const 5]
- 56. int [static 10]
- 57. int [const static 5]
- 58. struct S [3]
- 59. int [*]
- 60. const int [N]
8. Function Types
Testing "direct_abstract_declarator : '(' parameter_type_list ')'" or "()".- 61. int ()
- 62. void (int)
- 63. char (char *, int)
- 64. struct S (void)
- 65. const int (double, char)
- 66. int (*)(int)
- 67. void (*)(char *)
9. Nested Combinations
Testing complex combinations of pointers, arrays, and functions.- 68. int *[]
- 69. int [][5]
- 70. char * [3]
- 71. int (*)[5]
- 72. void (*[]) (int)
- 73. int (*[3])(char)
- 74. int **[5]
- 75. struct S *[10]
- 76. int (*(*)[5])(int)
- 77. const int * const [3]
10. Parenthesized and Complex Declarators
Testing "direct_abstract_declarator : '(' abstract_declarator ')'" and nested constructs.- 78. int (*)
- 79. const char (* const)
- 80. struct S (*[3])
- 81. void (*(*)(int))
- 82. unsigned int (*(*)[5])
- 83. const struct S (*(int))

no subject
Date: 2025-05-13 12:11 (UTC)ну и unsigned long long int
и некотороые компиляторы поддерживают long long long, где-то я такое видел (в каком-то проекте тест на поддерживаемость этого типа. Что это такое - не знаю.)
__int128 в GCC/Clang
no subject
Date: 2025-05-13 22:01 (UTC)no subject
Date: 2025-05-14 06:37 (UTC)no subject
Date: 2025-05-14 07:32 (UTC)no subject
Date: 2025-05-14 08:13 (UTC)команду поиска, помог сделать чат гпт:
find . -xdev \( -name "*.cpp" -o -name "*.h" -o -name "*.hpp" -o -name "*.c" -o -name "*.cxx" \) -print0 | xargs -0 grep -P '\blong\s+long\s+long\b'
Недостаток команды - в тексте она тоже найдет, поэтому вываливает много строк. Ну и ладно. Одна строка нашлась:
./src/qnx/3rd-qnx/src/samba/samba-2.2.7a/source/tests/crypttest.c:#define long64 long long long
а есть еще файлик gcc-14.2.0/gcc/testsuite/gcc.dg/typespec-1.c (и другие имеющие в названии слово typespec)
в котором перечислены комбинации, которые можно, и которые нельзя. Например unsigned long int long - можно.
судя по этому файлику, long long long - нельзя, судя по нему же.
Тип "unsigned long int long" это то же самое, что и "unsigned long long int" - по крайней мере в плюсах. Это потому, что компилятор не дается определить отдельные специализации шаблона. То есть, для него это как 1 тип.