diff --git a/std/d/ast.d b/std/d/ast.d index 04a5c71..2e83d7e 100644 --- a/std/d/ast.d +++ b/std/d/ast.d @@ -1176,6 +1176,8 @@ public: } /** */ Token name; /** */ Initializer initializer; + /** */ TypeSuffix[] cstyle; + mixin OpEquals; } @@ -2152,6 +2154,8 @@ public: /** */ Token name; /** */ bool vararg; /** */ AssignExpression default_; + /** */ TypeSuffix[] cstyle; + mixin OpEquals; } diff --git a/std/d/parser.d b/std/d/parser.d index c23811f..9a1a390 100644 --- a/std/d/parser.d +++ b/std/d/parser.d @@ -1910,10 +1910,19 @@ class ClassFive(A, B) : Super if (someTest()) {}}c; auto id = expect(tok!"identifier"); if (id is null) return null; node.name = *id; - if (currentIsOneOf(tok!"[", tok!"*")) + if (currentIs(tok!"[")) // dmd doesn't accept pointer after identifier { - error("C-style variable declarations are not supported."); - return null; + warn("C-style array declaration."); + TypeSuffix[] typeSuffixes; + while (moreTokens() && currentIs(tok!"[")) + { + auto suffix = parseTypeSuffix(); + if (suffix !is null) + typeSuffixes ~= suffix; + else + return null; + } + node.cstyle = ownArray(typeSuffixes); } if (currentIs(tok!"=")) { @@ -3932,7 +3941,7 @@ invariant() foo(); * Parses a Parameter * * $(GRAMMAR $(RULEDEF parameter): - * $(RULE parameterAttribute)* $(RULE type) ($(LITERAL Identifier)? $(LITERAL '...') | ($(LITERAL Identifier)? ($(LITERAL '=') $(RULE assignExpression))?))? + * $(RULE parameterAttribute)* $(RULE type) (($(LITERAL Identifier) $(RULE typeSuffix)*)? $(LITERAL '...') | ($(LITERAL Identifier)? ($(LITERAL '=') $(RULE assignExpression))?))? * ;) */ Parameter parseParameter() @@ -3964,6 +3973,19 @@ invariant() foo(); advance(); node.default_ = parseAssignExpression(); } + else if (currentIs(tok!"[")) + { + TypeSuffix[] typeSuffixes; + while(moreTokens() && currentIs(tok!"[")) + { + auto suffix = parseTypeSuffix(); + if (suffix !is null) + typeSuffixes ~= suffix; + else + return null; + } + node.cstyle = ownArray(typeSuffixes); + } } else if (currentIs(tok!"...")) {