# HG changeset patch # User dkoroskin <> # Date 1260791403 -10800 # Node ID 89cc05dbdae16474869c0ffe46fa82db53a5abb8 # Parent 69d413ef14adc15a6f9e12a53967b7eca651dd64 Implementing TemplateAliasParameter and TemplateValueParameter diff -r 69d413ef14ad -r 89cc05dbdae1 commands.txt --- a/commands.txt Tue Dec 08 21:40:08 2009 +0300 +++ b/commands.txt Mon Dec 14 14:50:03 2009 +0300 @@ -14,10 +14,10 @@ -version=SEH -version=OMFOBJ -version=SNAN_DEFAULT_INIT --ofddmd.exe +-ofC:\dmd_2.032\windows\bin\dmd.exe bridge.obj ddmd.def -dmd.lib +C:\dmd_2.032\src\dmd\dmd.lib main.d win32\windef.d win32\winuser.d @@ -42,6 +42,7 @@ dmd\CatAssignExp.d dmd\Port.d dmd\declaration\MATCH.d +dmd\templates\Util.d dmd\expression\Util.d dmd\expression\Add.d dmd\expression\Xor.d diff -r 69d413ef14ad -r 89cc05dbdae1 dmd/TemplateAliasParameter.d --- a/dmd/TemplateAliasParameter.d Tue Dec 08 21:40:08 2009 +0300 +++ b/dmd/TemplateAliasParameter.d Mon Dec 14 14:50:03 2009 +0300 @@ -12,6 +12,8 @@ import dmd.HdrGenState; import dmd.Dsymbol; +import dmd.templates.Util; + class TemplateAliasParameter : TemplateParameter { /* Syntax: @@ -26,18 +28,26 @@ this(Loc loc, Identifier ident, Type specType, Object specAlias, Object defaultAlias) { - assert(false); super(loc, ident); + + this.specType = specType; + this.specAlias = specAlias; + this.defaultAlias = defaultAlias; } TemplateAliasParameter isTemplateAliasParameter() { - assert(false); + return this; } TemplateParameter syntaxCopy() { - assert(false); + TemplateAliasParameter tp = new TemplateAliasParameter(loc, ident, specType, specAlias, defaultAlias); + if (tp.specType) + tp.specType = specType.syntaxCopy(); + tp.specAlias = objectSyntaxCopy(specAlias); + tp.defaultAlias = objectSyntaxCopy(defaultAlias); + return tp; } void declareParameter(Scope sc) diff -r 69d413ef14ad -r 89cc05dbdae1 dmd/TemplateValueParameter.d --- a/dmd/TemplateValueParameter.d Tue Dec 08 21:40:08 2009 +0300 +++ b/dmd/TemplateValueParameter.d Mon Dec 14 14:50:03 2009 +0300 @@ -11,6 +11,12 @@ import dmd.OutBuffer; import dmd.HdrGenState; import dmd.MATCH; +import dmd.VarDeclaration; +import dmd.STC; +import dmd.Util; +import dmd.TY; +import dmd.WANT; +import dmd.TOK; class TemplateValueParameter : TemplateParameter { @@ -26,28 +32,71 @@ this(Loc loc, Identifier ident, Type valType, Expression specValue, Expression defaultValue) { - assert(false); super(loc, ident); + + this.valType = valType; + this.specValue = specValue; + this.defaultValue = defaultValue; } TemplateValueParameter isTemplateValueParameter() { - assert(false); + return this; } TemplateParameter syntaxCopy() { - assert(false); + TemplateValueParameter tp = new TemplateValueParameter(loc, ident, valType, specValue, defaultValue); + tp.valType = valType.syntaxCopy(); + if (specValue) + tp.specValue = specValue.syntaxCopy(); + if (defaultValue) + tp.defaultValue = defaultValue.syntaxCopy(); + return tp; } void declareParameter(Scope sc) { - assert(false); + VarDeclaration v = new VarDeclaration(loc, valType, ident, null); + v.storage_class = STC.STCtemplateparameter; + if (!sc.insert(v)) + error(loc, "parameter '%s' multiply defined", ident.toChars()); + sparam = v; } - void semantic(Scope) + void semantic(Scope sc) { - assert(false); + sparam.semantic(sc); + valType = valType.semantic(loc, sc); + if (!(valType.isintegral() || valType.isfloating() || valType.isString()) && valType.ty != TY.Tident) + error(loc, "arithmetic/string type expected for value-parameter, not %s", valType.toChars()); + + if (specValue) + { + Expression e = specValue; + + e = e.semantic(sc); + e = e.implicitCastTo(sc, valType); + e = e.optimize(WANTvalue | WANTinterpret); + if (e.op == TOKint64 || e.op == TOKfloat64 || + e.op == TOKcomplex80 || e.op == TOKnull || e.op == TOKstring) + specValue = e; + //e.toInteger(); + } + +static if (false) { // defer semantic analysis to arg match + if (defaultValue) + { + Expression e = defaultValue; + + e = e.semantic(sc); + e = e.implicitCastTo(sc, valType); + e = e.optimize(WANTvalue | WANTinterpret); + if (e.op == TOKint64) + defaultValue = e; + //e.toInteger(); + } +} } void print(Object oarg, Object oded) @@ -70,9 +119,25 @@ assert(false); } - bool overloadMatch(TemplateParameter) + bool overloadMatch(TemplateParameter tp) { - assert(false); + TemplateValueParameter tvp = tp.isTemplateValueParameter(); + + if (tvp) + { + if (valType != tvp.valType) + return false; + + if (valType && !valType.equals(tvp.valType)) + return false; + + if (specValue != tvp.specValue) + return false; + + return true; // match + } + + return false; } MATCH matchArg(Scope sc, Objects tiargs, int i, TemplateParameters parameters, Objects dedtypes, Declaration* psparam, int flags) diff -r 69d413ef14ad -r 89cc05dbdae1 dmd/templates/Util.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dmd/templates/Util.d Mon Dec 14 14:50:03 2009 +0300 @@ -0,0 +1,23 @@ +module dmd.templates.Util; + +import dmd.Dsymbol; +import dmd.Type; +import dmd.Expression; + +version (DMDV2) { + Object objectSyntaxCopy(Object o) + { + if (!o) + return null; + + Type t = isType(o); + if (t) + return t.syntaxCopy(); + + Expression e = isExpression(o); + if (e) + return e.syntaxCopy(); + + return o; + } +} \ No newline at end of file