mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Fixed bug #79576 ("TYPE *" shows unhelpful message when type is not defined)
This commit is contained in:
parent
b053192a03
commit
0badc7de96
4 changed files with 41 additions and 2 deletions
4
NEWS
4
NEWS
|
@ -6,6 +6,10 @@ PHP NEWS
|
|||
. Fixed bug #81433 (DOMElement::setIdAttribute() called twice may remove ID).
|
||||
(Viktor Volkov)
|
||||
|
||||
- FFI:
|
||||
. Fixed bug #79576 ("TYPE *" shows unhelpful message when type is not
|
||||
defined). (Dmitry)
|
||||
|
||||
- PCRE:
|
||||
. Fixed bug #81424 (PCRE2 10.35 JIT performance regression). (cmb)
|
||||
|
||||
|
|
|
@ -147,7 +147,7 @@ declaration_specifiers(zend_ffi_dcl *dcl):
|
|||
|
||||
specifier_qualifier_list(zend_ffi_dcl *dcl):
|
||||
"__extension__"?
|
||||
( ?{sym != YY_ID || zend_ffi_is_typedef_name((const char*)yy_text, yy_pos - yy_text)}
|
||||
( ?{sym != YY_ID || zend_ffi_is_typedef_name((const char*)yy_text, yy_pos - yy_text) || (dcl->flags & ZEND_FFI_DCL_TYPE_SPECIFIERS) == 0}
|
||||
( type_specifier(dcl)
|
||||
| type_qualifier(dcl)
|
||||
| attributes(dcl)
|
||||
|
|
|
@ -2190,7 +2190,7 @@ static int parse_specifier_qualifier_list(int sym, zend_ffi_dcl *dcl) {
|
|||
} else {
|
||||
yy_error_sym("unexpected", sym);
|
||||
}
|
||||
} while ((YY_IN_SET(sym, (YY_VOID,YY_CHAR,YY_SHORT,YY_INT,YY_LONG,YY_FLOAT,YY_DOUBLE,YY_SIGNED,YY_UNSIGNED,YY__BOOL,YY__COMPLEX,YY_COMPLEX,YY___COMPLEX,YY___COMPLEX__,YY_STRUCT,YY_UNION,YY_ENUM,YY_ID,YY_CONST,YY___CONST,YY___CONST__,YY_RESTRICT,YY___RESTRICT,YY___RESTRICT__,YY_VOLATILE,YY___VOLATILE,YY___VOLATILE__,YY__ATOMIC,YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\376\377\377\107\360\017\000\000\000\002\000")) && (sym != YY_ID || zend_ffi_is_typedef_name((const char*)yy_text, yy_pos - yy_text)));
|
||||
} while ((YY_IN_SET(sym, (YY_VOID,YY_CHAR,YY_SHORT,YY_INT,YY_LONG,YY_FLOAT,YY_DOUBLE,YY_SIGNED,YY_UNSIGNED,YY__BOOL,YY__COMPLEX,YY_COMPLEX,YY___COMPLEX,YY___COMPLEX__,YY_STRUCT,YY_UNION,YY_ENUM,YY_ID,YY_CONST,YY___CONST,YY___CONST__,YY_RESTRICT,YY___RESTRICT,YY___RESTRICT__,YY_VOLATILE,YY___VOLATILE,YY___VOLATILE__,YY__ATOMIC,YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\376\377\377\107\360\017\000\000\000\002\000")) && (sym != YY_ID || zend_ffi_is_typedef_name((const char*)yy_text, yy_pos - yy_text) || (dcl->flags & ZEND_FFI_DCL_TYPE_SPECIFIERS) == 0));
|
||||
return sym;
|
||||
}
|
||||
|
||||
|
|
35
ext/ffi/tests/bug79576.phpt
Normal file
35
ext/ffi/tests/bug79576.phpt
Normal file
|
@ -0,0 +1,35 @@
|
|||
--TEST--
|
||||
Bug #79576 ("TYPE *" shows unhelpful message when type is not defined)
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('ffi')) die('skip ffi extension not available');
|
||||
if (PHP_DEBUG || getenv('SKIP_ASAN')) echo "xfail: FFI cleanup after parser error is nor implemented";
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
try {
|
||||
FFI::cdef('struct tree *get_tree(const oid *, size_t, struct tree *);');
|
||||
} catch (Throwable $e) {
|
||||
echo get_class($e) . ": " . $e->getMessage()."\n";
|
||||
}
|
||||
try {
|
||||
FFI::cdef('struct tree *get_tree(oid, size_t, struct tree *);');
|
||||
} catch (Throwable $e) {
|
||||
echo get_class($e) . ": " . $e->getMessage()."\n";
|
||||
}
|
||||
try {
|
||||
FFI::cdef('
|
||||
typedef struct _simple_struct {
|
||||
const some_not_declared_type **property;
|
||||
} simple_struct;
|
||||
');
|
||||
} catch (Throwable $e) {
|
||||
echo get_class($e) . ": " . $e->getMessage()."\n";
|
||||
}
|
||||
?>
|
||||
DONE
|
||||
--EXPECT--
|
||||
FFI\ParserException: undefined C type 'oid' at line 1
|
||||
FFI\ParserException: undefined C type 'oid' at line 1
|
||||
FFI\ParserException: undefined C type 'some_not_declared_type' at line 3
|
||||
DONE
|
Loading…
Add table
Add a link
Reference in a new issue