--- /dev/null
+--TEST--
+<?= cannot be used as an identifier
+--FILE--
+<?php
+trait T {
+ public function x() {}
+}
+class C {
+ use T {
+ x as y?><?= as my_echo;
+ }
+}
+?>
+--EXPECTF--
+Parse error: Cannot use "<?=" as an identifier in %s on line %d
T_STRING { $$ = $1; }
| semi_reserved {
zval zv;
- zend_lex_tstring(&zv, $1);
+ if (zend_lex_tstring(&zv, $1) == FAILURE) { YYABORT; }
$$ = zend_ast_create_zval(&zv);
}
;
trait_method_reference T_AS T_STRING
{ $$ = zend_ast_create(ZEND_AST_TRAIT_ALIAS, $1, $3); }
| trait_method_reference T_AS reserved_non_modifiers
- { zval zv; zend_lex_tstring(&zv, $3);
+ { zval zv;
+ if (zend_lex_tstring(&zv, $3) == FAILURE) { YYABORT; }
$$ = zend_ast_create(ZEND_AST_TRAIT_ALIAS, $1, zend_ast_create_zval(&zv)); }
| trait_method_reference T_AS member_modifier identifier
{ $$ = zend_ast_create_ex(ZEND_AST_TRAIT_ALIAS, $3, $1, $4); }
ZEND_API int zend_prepare_string_for_scanning(zval *str, const char *filename);
ZEND_API void zend_multibyte_yyinput_again(zend_encoding_filter old_input_filter, const zend_encoding *old_encoding);
ZEND_API int zend_multibyte_set_filter(const zend_encoding *onetime_encoding);
-ZEND_API void zend_lex_tstring(zval *zv, zend_lexer_ident_ref ident_ref);
+ZEND_API int zend_lex_tstring(zval *zv, zend_lexer_ident_ref ident_ref);
END_EXTERN_C()
}
}
-ZEND_API void zend_lex_tstring(zval *zv, zend_lexer_ident_ref ident_ref)
+ZEND_API int zend_lex_tstring(zval *zv, zend_lexer_ident_ref ident_ref)
{
char *ident = (char *) SCNG(yy_start) + ident_ref.offset;
size_t length = ident_ref.len;
+ if (length == sizeof("<?=")-1 && memcmp(ident, "<?=", sizeof("<?=")-1) == 0) {
+ zend_throw_exception(zend_ce_parse_error, "Cannot use \"<?=\" as an identifier", 0);
+ return FAILURE;
+ }
+
if (SCNG(on_event)) {
SCNG(on_event)(ON_FEEDBACK, T_STRING, 0, ident, length, SCNG(on_event_context));
}
ZVAL_STRINGL(zv, ident, length);
+ return SUCCESS;
}
#define BOM_UTF32_BE "\x00\x00\xfe\xff"
<INITIAL>"<?=" {
BEGIN(ST_IN_SCRIPTING);
if (PARSER_MODE()) {
- RETURN_TOKEN(T_ECHO);
+ /* We'll reject this as an identifier in zend_lex_tstring. */
+ RETURN_TOKEN_WITH_IDENT(T_ECHO);
}
RETURN_TOKEN(T_OPEN_TAG_WITH_ECHO);
}