]> granicus.if.org Git - php/commitdiff
Fixed incorrect error message
authorDmitry Stogov <dmitry@zend.com>
Tue, 19 Mar 2019 23:41:08 +0000 (02:41 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 19 Mar 2019 23:41:08 +0000 (02:41 +0300)
ext/ffi/ffi.g
ext/ffi/ffi_parser.c
ext/ffi/tests/043.phpt [new file with mode: 0644]

index 80b41fddc3c06a9300afc4938c2b85010a2a1395..9ffe3c5fa646cd4012c5dba67c5c57a18098bc4e 100644 (file)
@@ -92,7 +92,7 @@ declarations:
 ;
 
 declaration_specifiers(zend_ffi_dcl *dcl):
-       (       ?{sym != YY_ID || zend_ffi_is_typedef_name((const char*)yy_text, yy_pos - yy_text)}
+       (       ?{sym != YY_ID || !(dcl->flags & ZEND_FFI_DCL_TYPE_SPECIFIERS)}
                (       {if (dcl->flags & ZEND_FFI_DCL_STORAGE_CLASS) yy_error_sym("unexpected", sym);}
                        "typedef"
                        {dcl->flags |= ZEND_FFI_DCL_TYPEDEF;}
index 1606bef16f038f684deb1ce2ce668f97354a0dcd..31caef6bf56dc82ffda4eb116c195fda89bf2a1e 100644 (file)
@@ -3588,7 +3588,7 @@ static int parse_declaration_specifiers(int sym, zend_ffi_dcl *dcl) {
                        default:
                                yy_error_sym("unexpected", sym);
                }
-       } while ((YY_IN_SET(sym, (YY_TYPEDEF,YY_EXTERN,YY_STATIC,YY_AUTO,YY_REGISTER,YY_INLINE,YY___INLINE,YY___INLINE__,YY__NORETURN,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY__ALIGNAS,YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY_CONST,YY___CONST,YY___CONST__,YY_RESTRICT,YY___RESTICT,YY___RESTRICT__,YY_VOLATILE,YY___VOLATILE,YY___VOLATILE__,YY__ATOMIC,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), "\370\377\371\377\377\037\301\001\000\000\040\000")) && (sym != YY_ID || zend_ffi_is_typedef_name((const char*)yy_text, yy_pos - yy_text)));
+       } while ((YY_IN_SET(sym, (YY_TYPEDEF,YY_EXTERN,YY_STATIC,YY_AUTO,YY_REGISTER,YY_INLINE,YY___INLINE,YY___INLINE__,YY__NORETURN,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY__ALIGNAS,YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY_CONST,YY___CONST,YY___CONST__,YY_RESTRICT,YY___RESTICT,YY___RESTRICT__,YY_VOLATILE,YY___VOLATILE,YY___VOLATILE__,YY__ATOMIC,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), "\370\377\371\377\377\037\301\001\000\000\040\000")) && (sym != YY_ID || !(dcl->flags & ZEND_FFI_DCL_TYPE_SPECIFIERS)));
        return sym;
 }
 
diff --git a/ext/ffi/tests/043.phpt b/ext/ffi/tests/043.phpt
new file mode 100644 (file)
index 0000000..f4400a9
--- /dev/null
@@ -0,0 +1,19 @@
+--TEST--
+FFI 043: Type redeclaration
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--INI--
+ffi.enable=1
+--FILE--
+<?php
+FFI::cdef("
+typedef int a;
+typedef unsigned int a;
+");
+?>
+--EXPECTF--
+Fatal error: Uncaught FFI\ParserException: redeclaration of 'a' at line 3 in %s043.php:2
+Stack trace:
+#0 %s043.php(2): FFI::cdef('%s')
+#1 {main}
+  thrown in %s043.php on line 2