# HG changeset patch # User aziz # Date 1189272245 0 # Node ID 5ebe80ce84f21469477e09f8816da28907703842 # Parent 0bd21b746a043713d57c0f5d6f52ecd5bcd5eab1 - Separated common code to parseTemplateArguments_(). - Checking for null before adding targs to children member, because pTA() and pTA2() can return null. diff -r 0bd21b746a04 -r 5ebe80ce84f2 trunk/src/dil/Expressions.d --- a/trunk/src/dil/Expressions.d Sat Sep 08 16:42:02 2007 +0000 +++ b/trunk/src/dil/Expressions.d Sat Sep 08 17:24:05 2007 +0000 @@ -618,7 +618,8 @@ this(Token* ident, TemplateArguments targs) { mixin(set_kind); - this.children = [targs]; + if (targs) + this.children = [targs]; this.ident = ident; this.targs = targs; } @@ -872,7 +873,8 @@ this(typeof(ident) ident, typeof(targs) targs) { mixin(set_kind); - this.children = [targs]; + if (targs) + this.children = [targs]; this.ident = ident; this.targs = targs; } diff -r 0bd21b746a04 -r 5ebe80ce84f2 trunk/src/dil/Parser.d --- a/trunk/src/dil/Parser.d Sat Sep 08 16:42:02 2007 +0000 +++ b/trunk/src/dil/Parser.d Sat Sep 08 17:24:05 2007 +0000 @@ -3975,78 +3975,55 @@ TemplateArguments parseTemplateArguments() { - auto begin = token; - auto args = new TemplateArguments; - + TemplateArguments targs; require(T.LParen); if (token.type != T.RParen) - { - while (1) - { - bool success; - auto typeArgument = try_(parseType(), success); - if (success) - { - // TemplateArgument: - // Type - // Symbol - args ~= typeArgument; - } - else - { - // TemplateArgument: - // AssignExpression - args ~= parseAssignExpression(); - } - if (token.type != T.Comma) - break; // Exit loop. - nT(); - } - } + targs = parseTemplateArguments_(); require(T.RParen); - set(args, begin); - return args; + return targs; } + version(D2) { TemplateArguments parseTemplateArguments2() { assert(token.type == T.Comma); nT(); - auto begin = token; - auto args = new TemplateArguments; - + TemplateArguments targs; if (token.type != T.RParen) - { - while (1) - { - bool success; - auto typeArgument = try_(parseType(), success); - if (success) - { - // TemplateArgument: - // Type - // Symbol - args ~= typeArgument; - } - else - { - // TemplateArgument: - // AssignExpression - args ~= parseAssignExpression(); - } - if (token.type != T.Comma) - break; // Exit loop. - nT(); - } - } + targs = parseTemplateArguments_(); else error(MID.ExpectedButFound, "Type/Expression", ")"); require(T.RParen); - set(args, begin); - return args; + return targs; } } // version(D2) + + TemplateArguments parseTemplateArguments_() + { + auto begin = token; + auto targs = new TemplateArguments; + while (1) + { + bool success; + auto typeArgument = try_(parseType(), success); + if (success) + // TemplateArgument: + // Type + // Symbol + targs ~= typeArgument; + else + // TemplateArgument: + // AssignExpression + targs ~= parseAssignExpression(); + if (token.type != T.Comma) + break; // Exit loop. + nT(); + } + set(targs, begin); + return targs; + } + TemplateParameters parseTemplateParameterList() { auto begin = token; diff -r 0bd21b746a04 -r 5ebe80ce84f2 trunk/src/dil/Types.d --- a/trunk/src/dil/Types.d Sat Sep 08 16:42:02 2007 +0000 +++ b/trunk/src/dil/Types.d Sat Sep 08 17:24:05 2007 +0000 @@ -397,7 +397,8 @@ { super(TID.TemplateInstance); mixin(set_kind); - this.children ~= targs; + if (targs) + this.children ~= targs; this.ident = ident; this.targs = targs; }