--- /dev/null
+--TEST--
+Bug #69092-2 (Declare Encoding Compile Check Wrong) - multibyte off
+--INI--
+zend.multibyte=0
+--FILE--
+<?php
+echo "Hi";
+
+function foo() {
+ declare(encoding="UTF-8");
+}
+
+echo "Bye"
+?>
+--EXPECTF--
+Warning: declare(encoding=...) ignored because Zend multibyte feature is turned off by settings in %s on line %d
+
+Fatal error: Encoding declaration pragma must be the very first statement in the script in %s on line %d
\ No newline at end of file
--- /dev/null
+--TEST--
+Bug #69092 (Declare Encoding Compile Check Wrong)
+--SKIPIF--
+<?php
+if (!extension_loaded("mbstring")) {
+ die("skip Requires mbstring extension");
+}
+?>
+--INI--
+zend.multibyte=On
+--FILE--
+<?php
+echo "Hi";
+
+function foo() {
+ declare(encoding="utf-8");
+}
+
+echo "Bye"
+?>
+--EXPECTF--
+Fatal error: Encoding declaration pragma must be the very first statement in the script in %s on line %d
\ No newline at end of file
} else if (zend_string_equals_literal_ci(name, "encoding")) {
/* Encoding declaration was already handled during parsing. Here we
* only check that it is the first statement in the file. */
- uint32_t num = CG(active_op_array)->last;
- while (num > 0 &&
- (CG(active_op_array)->opcodes[num-1].opcode == ZEND_EXT_STMT ||
- CG(active_op_array)->opcodes[num-1].opcode == ZEND_TICKS)) {
- --num;
+ zend_ast_list *file_ast = zend_ast_get_list(CG(ast));
+
+ size_t i = 0;
+ signed char valid = 0;
+
+ /* Check to see if this declare is preceeded only by declare statements */
+ while (valid == 0 && i < file_ast->children) {
+ if (file_ast->child[i] == ast) {
+ valid = 1;
+ } else if (file_ast->child[i] == NULL) {
+ valid = -1;
+ } else if (file_ast->child[i]->kind != ZEND_AST_DECLARE) {
+ /* declares can only be preceeded by other declares */
+ valid = -1;
+ }
+ i++;
}
-
- if (num > 0) {
+ if (valid != 1) {
zend_error_noreturn(E_COMPILE_ERROR, "Encoding declaration pragma must be "
"the very first statement in the script");
}
--- /dev/null
+--TEST--
+zend multibyte (15)
+--INI--
+zend.multibyte=1
+--FILE--
+<?php
+declare(encoding="ISO-8859-15") {
+ echo "ok\n";
+}
+declare(encoding="UTF-8") {
+ echo "ok\n";
+}
+?>
+--EXPECTF--
+ok
+ok
\ No newline at end of file