summaryrefslogtreecommitdiff
path: root/ext/ffi/tests/bug80847.phpt
diff options
context:
space:
mode:
Diffstat (limited to 'ext/ffi/tests/bug80847.phpt')
-rw-r--r--ext/ffi/tests/bug80847.phpt58
1 files changed, 58 insertions, 0 deletions
diff --git a/ext/ffi/tests/bug80847.phpt b/ext/ffi/tests/bug80847.phpt
new file mode 100644
index 0000000000..aa90082859
--- /dev/null
+++ b/ext/ffi/tests/bug80847.phpt
@@ -0,0 +1,58 @@
+--TEST--
+Bug #80847 (Nested structs)
+--SKIPIF--
+<?php
+if (!extension_loaded('ffi')) die('skip ffi extension not available');
+if (!extension_loaded('zend-test')) die('skip zend-test extension not available');
+?>
+--FILE--
+<?php
+require_once('utils.inc');
+$header = <<<HEADER
+ typedef struct bug80847_01 {
+ uint64_t b;
+ double c;
+ } bug80847_01;
+
+ typedef struct bug80847_02 {
+ bug80847_01 a;
+ } bug80847_02;
+
+ bug80847_02 ffi_bug80847(bug80847_02 s);
+HEADER;
+
+if (PHP_OS_FAMILY !== 'Windows') {
+ $ffi = FFI::cdef($header);
+} else {
+ try {
+ $ffi = FFI::cdef($header, 'php_zend_test.dll');
+ } catch (FFI\Exception $ex) {
+ $ffi = FFI::cdef($header, ffi_get_php_dll_name());
+ }
+}
+$x = $ffi->new('bug80847_02');
+$x->a->b = 42;
+$x->a->c = 42.5;
+var_dump($x);
+$y = $ffi->ffi_bug80847($x);
+var_dump($y);
+?>
+--EXPECTF--
+object(FFI\CData:struct bug80847_02)#%d (1) {
+ ["a"]=>
+ object(FFI\CData:struct bug80847_01)#%d (2) {
+ ["b"]=>
+ int(42)
+ ["c"]=>
+ float(42.5)
+ }
+}
+object(FFI\CData:struct bug80847_02)#%d (1) {
+ ["a"]=>
+ object(FFI\CData:struct bug80847_01)#%d (2) {
+ ["b"]=>
+ int(52)
+ ["c"]=>
+ float(32.5)
+ }
+}