xref: /PHP-7.4/ext/ffi/tests/002.phpt (revision e089d506)
1--TEST--
2FFI 002: Check C declaration parser
3--SKIPIF--
4<?php require_once('skipif.inc'); ?>
5--INI--
6ffi.enable=1
7--FILE--
8<?php
9echo "Empty declaration\n";
10$ffi = FFI::cdef(<<<EOF
11EOF
12);
13echo "  ok\n";
14
15echo "Various declarations\n";
16$ffi = FFI::cdef(<<<EOF
17	/* allowed storage classes */
18	typedef  int type1;
19//	extern   int var2;
20	static   int var3;
21	auto     int var4;
22	register int var5;
23
24	/* allowed types */
25	typedef void type6;
26	typedef char type7;                     /* sint8_t or uint8_t */
27	typedef signed char type8;              /* sint8_t  */
28	typedef unsigned char type9;            /* uint8_t  */
29	typedef short type10;                   /* sint16_t */
30	typedef signed short type11;            /* sint16_t */
31	typedef short int type12;               /* sint16_t */
32	typedef signed short int type13;        /* sint16_t */
33	typedef unsigned short type14;          /* uint16_t */
34	typedef unsigned short int type15;      /* uint16_t */
35	typedef int type16;                     /* sint32_t */
36	typedef signed type17;                  /* sint32_t */
37	typedef signed int type18;              /* sint32_t */
38	typedef unsigned type19;                /* uint32_t */
39	typedef unsigned int type20;            /* uint32_t */
40	typedef long type21;                    /* sint32_t or sint64_t */
41	typedef signed long type22;             /* sint32_t or sint64_t */
42	typedef long int type23;                /* sint32_t or sint64_t */
43	typedef signed long int type24;         /* sint32_t or sint64_t */
44	typedef unsigned long type25;           /* uint32_t or uint64_t */
45	typedef unsigned long int type25_2;     /* uint32_t or uint64_t */
46	typedef long long type26;               /* sint64_t */
47	typedef signed long long type27;        /* sint64_t */
48	typedef long long int type28;           /* sint64_t */
49	typedef signed long long int type29;    /* sint64_t */
50	typedef unsigned long long type30;      /* uint64_t */
51	typedef unsigned long long int type31;  /* uint64_t */
52	typedef float type32;
53	typedef double type33;
54	typedef long double type34;
55	typedef _Bool type35;
56//	typedef float _Complex type36;
57//	typedef double _Complex type36_2;
58//	typedef long double _Complex type36_3;
59
60	/* struct and union */
61	struct tag1;
62	union tag2;
63	typedef struct tag1 {int x; int y;} type37;
64	typedef union tag2 {int x; int y;} type38;
65	typedef struct {int x, y; int z;} type39;
66	typedef struct {unsigned int x:8, y:8;} type40;
67	typedef struct {unsigned int x:8, :8, y:8;} type41;
68
69	/* enum */
70	enum tag3;
71	typedef enum tag3 {A,B,C} type42;
72	typedef enum {D,E=10,F,} type43;
73
74	/* type qualifiers */
75	typedef void* type46;
76	typedef const void* type47;
77	typedef restrict void* type48;
78	typedef volatile void* type49;
79	typedef _Atomic void* type50;
80	typedef const volatile void* type51;
81
82	/* function specifiers */
83	static void f1();
84	static inline void f2();
85	static _Noreturn void f3();
86
87	/* align specifier */
88	typedef double _Alignas(char) type52;
89	typedef double _Alignas(1) type53;
90
91	/* pointers */
92	typedef void * type54;
93	typedef void ** type55;
94	typedef const void * const volatile * const type56;
95
96	/* arrays */
97	typedef char type57[];
98	typedef char type58[const];
99	typedef char type59[const volatile];
100	typedef char type60[10];
101	typedef char type61[const 10];
102	typedef char type62[static 10];
103	typedef char type63[static const volatile 10];
104	typedef char type64[const volatile static 10];
105	typedef char type65[];
106	typedef char type66[const volatile];
107	typedef char type67[10][10];
108
109	/* functions */
110	static void f4();
111	static void f5(void);
112	static void f6(int x);
113	static void f7(int x, int y);
114	static void f8(int x, int y, ...);
115	static void f9(int, int);
116	static void f9(int, int, ...);
117	static void f10(...);
118	static void f11(const char *name);
119	static void f12(const char *);
120	static void f13(const int a[5]);
121	static void f14(const int[5]);
122
123	/* nested */
124	typedef int *type69[4];
125	typedef int (*type70)[4];
126	typedef int (*type71[3])(int *x, int *y);
127	typedef int (*type72(int (*)(long), int))(int, ...);
128EOF
129);
130echo "  ok\n";
131?>
132--EXPECT--
133Empty declaration
134  ok
135Various declarations
136  ok
137