]> granicus.if.org Git - php/commitdiff
allow non mixed use declarations, CC @nikic #1005
authorMárcio Almada <marcio3w@gmail.com>
Thu, 29 Jan 2015 05:16:53 +0000 (02:16 -0300)
committerMárcio Almada <marcio3w@gmail.com>
Sat, 7 Mar 2015 20:59:48 +0000 (17:59 -0300)
```
use function N\S { foo, bar, etc };
use const N\S { FOO, BAR, ETC };
```

Related tests:

```
make test -j4 TESTS="-m Zend/tests/ns_0{88..92}*.phpt"
```

All namespace tests:

```
make test -j4 TESTS="Zend/tests/ns_*.phpt"
```

Zend/zend_compile.c
Zend/zend_language_parser.y

index 28c7ea3d426438df75c2d712c8ddf5c749d873e2..c32e7cb1938c0f37224ebbdc4a1e1f281ae16985 100644 (file)
@@ -4949,7 +4949,7 @@ void zend_compile_batch_use(zend_ast *ast) /* {{{ */
                zend_string_release(name);
                ZVAL_STR(name_zval, compound_ns);
                zend_ast_list *inline_use = zend_ast_create_list(1, ZEND_AST_USE, use);
-               inline_use->attr = use->attr;
+               inline_use->attr = ast->attr ? ast->attr : use->attr;
                zend_compile_use(inline_use);
        }
 }
index 1bded228ab552bb4e810d494e1d570e1dc83c220..88d9e2fa975baefa7b16a4e6660ceae4cc24941d 100644 (file)
@@ -230,7 +230,7 @@ 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> batch_use_declarations inline_use_declarations inline_use_declaration
-%type <ast> use_declaration const_decl inner_statement
+%type <ast> mixed_batch_use_declarations use_declaration 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
@@ -298,14 +298,21 @@ top_statement:
        |       T_NAMESPACE { RESET_DOC_COMMENT(); }
                '{' top_statement_list '}'
                        { $$ = zend_ast_create(ZEND_AST_NAMESPACE, NULL, $4); }
-       |       T_USE batch_use_declarations ';'                { $$ = $2; }
-       |       T_USE use_declarations ';'                              { $$ = $2; $$->attr = T_CLASS; }
-       |       T_USE T_FUNCTION use_declarations ';'   { $$ = $3; $$->attr = T_FUNCTION; }
-       |       T_USE T_CONST use_declarations ';'              { $$ = $3; $$->attr = T_CONST; }
-       |       T_CONST const_list ';'                                  { $$ = $2; }
+       |       T_USE mixed_batch_use_declarations ';'          { $$ = $2; }
+       |       T_USE T_FUNCTION batch_use_declarations ';'     { $$ = $3; $3->attr = T_FUNCTION; }
+       |       T_USE T_CONST batch_use_declarations ';'        { $$ = $3; $3->attr = T_CONST; }
+       |       T_USE use_declarations ';'                                      { $$ = $2; $$->attr = T_CLASS; }
+       |       T_USE T_FUNCTION use_declarations ';'           { $$ = $3; $$->attr = T_FUNCTION; }
+       |       T_USE T_CONST use_declarations ';'                      { $$ = $3; $$->attr = T_CONST; }
+       |       T_CONST const_list ';'                                          { $$ = $2; }
 ;
 
 batch_use_declarations:
+       namespace_name '{' use_declarations '}'
+               {$$ = zend_ast_create(ZEND_AST_BATCH_USE, $1, $3); }
+;
+
+mixed_batch_use_declarations:
        namespace_name '{' inline_use_declarations '}'
                {$$ = zend_ast_create(ZEND_AST_BATCH_USE, $1, $3);}
 ;