diff --git a/Zend/tests/heredoc_nowdoc/heredoc_print.phpt b/Zend/tests/heredoc_nowdoc/heredoc_print.phpt new file mode 100644 index 0000000000000..b88b0d56a8d6e --- /dev/null +++ b/Zend/tests/heredoc_nowdoc/heredoc_print.phpt @@ -0,0 +1,21 @@ +--TEST-- +Dump heredoc tags +--INI-- +zend.assertions=1 +--FILE-- +getMessage(); +} + +?> +--EXPECT-- +assert(false && <<attr & ZEND_NAME_HEREDOC) { + smart_str_appends(str, "<<kind) { /* special nodes */ case ZEND_AST_ZVAL: - zend_ast_export_zval(str, zend_ast_get_zval(ast), priority, indent); + zend_ast_export_zval(str, ast, priority, indent); break; case ZEND_AST_CONSTANT: { zend_string *name = zend_ast_get_constant_name(ast); diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 62d0fbcded2ee..b83202eca2b48 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -1044,6 +1044,7 @@ ZEND_API zend_string *zend_type_to_string(zend_type type); #define ZEND_NAME_FQ 0 #define ZEND_NAME_NOT_FQ 1 #define ZEND_NAME_RELATIVE 2 +#define ZEND_NAME_HEREDOC 3 /* ZEND_FETCH_ flags in class name AST of new const expression must not clash with ZEND_NAME_ flags */ #define ZEND_CONST_EXPR_NEW_FETCH_TYPE_SHIFT 2 diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index 4c883b81c5f7d..469f0f7eba08e 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -3136,6 +3136,10 @@ emit_token_with_val: if (PARSER_MODE()) { ZEND_ASSERT(Z_TYPE_P(zendlval) != IS_UNDEF); elem->ast = zend_ast_create_zval_with_lineno(zendlval, start_line); + zend_ptr_stack *stack = &SCNG(heredoc_label_stack); + if (stack->elements) { + elem->ast->attr |= ZEND_NAME_HEREDOC; + } } emit_token: