vak: (бэсм-6)
[personal profile] vak
Тестирую парсер Си компилятора. А конкретно одно правило грамматики, называется 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))

Date: 2025-05-13 12:11 (UTC)
From: [personal profile] chabapok
long long int еще есть
ну и unsigned long long int

и некотороые компиляторы поддерживают long long long, где-то я такое видел (в каком-то проекте тест на поддерживаемость этого типа. Что это такое - не знаю.)


__int128 в GCC/Clang
Edited Date: 2025-05-13 12:15 (UTC)

Date: 2025-05-14 06:37 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
81 и 82 понравились. 67 - это типичный вопрос на интервью.

Date: 2025-05-14 08:13 (UTC)
From: [personal profile] chabapok
насколько понимаю, типа long long long в стандарте нет. Но меня не покидало чувство, что это у меня выдуманное воспоминание. Я конечно не помню, где я это видел. Это было очень давно. Решил грепнуть по папке с разными исходниками.

команду поиска, помог сделать чат гпт:

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 тип.

Edited Date: 2025-05-14 08:16 (UTC)