]> granicus.if.org Git - php/commitdiff
Don't allow leading \ in group use decl list
authorNikita Popov <nikic@php.net>
Thu, 20 Aug 2015 09:47:43 +0000 (11:47 +0200)
committerNikita Popov <nikic@php.net>
Thu, 20 Aug 2015 09:47:43 +0000 (11:47 +0200)
We recently added support for "use \Foo\{Bar}". This commit drops
support for the reverse "use Foo\{\Bar}". Those two got mixed up
in the initial implementation.

Zend/tests/ns_094.phpt
Zend/tests/ns_096.phpt [new file with mode: 0644]
Zend/zend_language_parser.y

index ef9ca75bb3f37d4f407eb52935df39b65c109dcd..16001da67e30ebd9a2aac8fac91a91af44c02995 100644 (file)
@@ -12,5 +12,4 @@ use const Foo\Bar\{
 };
 
 --EXPECTF--
-
-Parse error: syntax error, unexpected 'const' (T_CONST), expecting identifier (T_STRING) or \\ (T_NS_SEPARATOR) in %s on line 7
+Parse error: syntax error, unexpected 'const' (T_CONST), expecting identifier (T_STRING) in %s on line 7
diff --git a/Zend/tests/ns_096.phpt b/Zend/tests/ns_096.phpt
new file mode 100644 (file)
index 0000000..31eb1d1
--- /dev/null
@@ -0,0 +1,10 @@
+--TEST--
+Group use declaration list should not contain leading separator
+--FILE--
+<?php
+
+use Foo\Bar\{\Baz};
+
+?>
+--EXPECTF--
+Parse error: syntax error, unexpected '\' (T_NS_SEPARATOR), expecting identifier (T_STRING) or function (T_FUNCTION) or const (T_CONST) in /home/nikic/php-src/Zend/tests/ns_096.php on line 3
index 8d0965003653bfcfec319963e5b7794e35158831..87365a145e68f8f8c4aecb409c695121d89277b2 100644 (file)
@@ -229,7 +229,8 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
 %type <ast> class_declaration_statement trait_declaration_statement
 %type <ast> interface_declaration_statement interface_extends_list
 %type <ast> group_use_declaration inline_use_declarations inline_use_declaration
-%type <ast> mixed_group_use_declaration use_declaration const_decl inner_statement
+%type <ast> mixed_group_use_declaration use_declaration unprefixed_use_declaration
+%type <ast> unprefixed_use_declarations const_decl inner_statement
 %type <ast> expr optional_expr while_statement for_statement foreach_variable
 %type <ast> foreach_statement declare_statement finally_statement unset_variable variable
 %type <ast> extends_from parameter optional_type argument expr_without_variable global_var
@@ -335,9 +336,9 @@ use_type:
 ;
 
 group_use_declaration:
-               namespace_name T_NS_SEPARATOR '{' use_declarations '}'
+               namespace_name T_NS_SEPARATOR '{' unprefixed_use_declarations '}'
                        { $$ = zend_ast_create(ZEND_AST_GROUP_USE, $1, $4); }
-       |       T_NS_SEPARATOR namespace_name T_NS_SEPARATOR '{' use_declarations '}'
+       |       T_NS_SEPARATOR namespace_name T_NS_SEPARATOR '{' unprefixed_use_declarations '}'
                        { $$ = zend_ast_create(ZEND_AST_GROUP_USE, $2, $5); }
 ;
 
@@ -355,9 +356,11 @@ inline_use_declarations:
                        { $$ = zend_ast_create_list(1, ZEND_AST_USE, $1); }
 ;
 
-inline_use_declaration:
-               use_declaration { $$ = $1; $$->attr = T_CLASS; }
-       |       use_type use_declaration { $$ = $2; $$->attr = $1; }
+unprefixed_use_declarations:
+               unprefixed_use_declarations ',' unprefixed_use_declaration
+                       { $$ = zend_ast_list_add($1, $3); }
+       |       unprefixed_use_declaration
+                       { $$ = zend_ast_create_list(1, ZEND_AST_USE, $1); }
 ;
 
 use_declarations:
@@ -367,15 +370,21 @@ use_declarations:
                        { $$ = zend_ast_create_list(1, ZEND_AST_USE, $1); }
 ;
 
-use_declaration:
+inline_use_declaration:
+               unprefixed_use_declaration { $$ = $1; $$->attr = T_CLASS; }
+       |       use_type unprefixed_use_declaration { $$ = $2; $$->attr = $1; }
+;
+
+unprefixed_use_declaration:
                namespace_name
                        { $$ = zend_ast_create(ZEND_AST_USE_ELEM, $1, NULL); }
        |       namespace_name T_AS T_STRING
                        { $$ = zend_ast_create(ZEND_AST_USE_ELEM, $1, $3); }
-       |       T_NS_SEPARATOR namespace_name
-                       { $$ = zend_ast_create(ZEND_AST_USE_ELEM, $2, NULL); }
-       |       T_NS_SEPARATOR namespace_name T_AS T_STRING
-                       { $$ = zend_ast_create(ZEND_AST_USE_ELEM, $2, $4); }
+;
+
+use_declaration:
+               unprefixed_use_declaration                { $$ = $1; }
+       |       T_NS_SEPARATOR unprefixed_use_declaration { $$ = $2; }
 ;
 
 const_list: