Skip to content

Commit abd7152

Browse files
committed
php#57: Fix C++ compilation error in zend_async_API.h for ICU/intl extension
The flexible array member `data[]` in struct _zend_async_waker_trigger_s causes MSVC C4200 warning when compiling C++ files (intl_convertcpp.cpp). C++ doesn't standardize flexible arrays until C++23, treating them as nonstandard extension. Changes: - Add conditional compilation for C++ compatibility in struct definition - Adjust memory allocation logic to account for different sizeof() behavior - Preserve optimal C99 flexible array semantics for C compilation Fixes compilation error when building intl extension with MSVC /WX flag.
1 parent 2fad5a3 commit abd7152

File tree

2 files changed

+13
-1
lines changed

2 files changed

+13
-1
lines changed

Zend/zend_async_API.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,8 +479,15 @@ static zend_always_inline zend_async_waker_trigger_t *waker_trigger_create(
479479
initial_capacity = 2;
480480
}
481481

482+
#ifdef __cplusplus
483+
// Account for the [1] element already included in sizeof()
484+
size_t total_size = sizeof(zend_async_waker_trigger_t)
485+
+ (initial_capacity - 1) * sizeof(zend_async_event_callback_t *);
486+
#else
487+
// Flexible array member doesn't contribute to sizeof()
482488
size_t total_size = sizeof(zend_async_waker_trigger_t)
483489
+ initial_capacity * sizeof(zend_async_event_callback_t *);
490+
#endif
484491
zend_async_waker_trigger_t *trigger = (zend_async_waker_trigger_t *) emalloc(total_size);
485492

486493
trigger->length = 0;

Zend/zend_async_API.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,12 @@ struct _zend_async_waker_trigger_s {
430430
uint32_t length; /* current number of callbacks */
431431
uint32_t capacity; /* allocated slots in the array */
432432
zend_async_event_t *event;
433-
zend_async_event_callback_t *data[]; /* flexible array member */
433+
/* C++ compatibility fix for ICU/intl extension: flexible arrays not standard in C++ */
434+
#ifdef __cplusplus
435+
zend_async_event_callback_t *data[1]; /* C++ compatible array */
436+
#else
437+
zend_async_event_callback_t *data[]; /* C99 flexible array member */
438+
#endif
434439
};
435440

436441
/* Dynamic array of async event callbacks with single iterator protection */

0 commit comments

Comments
 (0)