Mercurial > projects > ddmd
diff dmd/IntegerExp.d @ 72:2e2a5c3f943a
reduced warnings by adding override to the methods
think this also normalizes different line endings used all over the place
author | Trass3r |
---|---|
date | Sat, 28 Aug 2010 16:19:48 +0200 |
parents | ee3a9f34dc48 |
children | ef02e2e203c2 |
line wrap: on
line diff
--- a/dmd/IntegerExp.d Sat Aug 28 16:14:07 2010 +0200 +++ b/dmd/IntegerExp.d Sat Aug 28 16:19:48 2010 +0200 @@ -1,559 +1,559 @@ -module dmd.IntegerExp; - -import dmd.Expression; -import dmd.backend.elem; -import dmd.TY; -import dmd.TypeEnum; -import dmd.TypeTypedef; -import dmd.Global; -import dmd.InterState; -import dmd.MATCH; -import dmd.Type; -import dmd.OutBuffer; -import dmd.Loc; -import dmd.Scope; -import dmd.IntRange; -import dmd.IRState; -import dmd.HdrGenState; -import dmd.TOK; -import dmd.Complex; - -import dmd.backend.dt_t; -import dmd.backend.Util; - -import core.stdc.ctype : isprint; - +module dmd.IntegerExp; + +import dmd.Expression; +import dmd.backend.elem; +import dmd.TY; +import dmd.TypeEnum; +import dmd.TypeTypedef; +import dmd.Global; +import dmd.InterState; +import dmd.MATCH; +import dmd.Type; +import dmd.OutBuffer; +import dmd.Loc; +import dmd.Scope; +import dmd.IntRange; +import dmd.IRState; +import dmd.HdrGenState; +import dmd.TOK; +import dmd.Complex; + +import dmd.backend.dt_t; +import dmd.backend.Util; + +import core.stdc.ctype : isprint; + class IntegerExp : Expression { ulong value; this(Loc loc, ulong value, Type type) { - super(loc, TOK.TOKint64, IntegerExp.sizeof); - - //printf("IntegerExp(value = %lld, type = '%s')\n", value, type ? type.toChars() : ""); - if (type && !type.isscalar()) - { - //printf("%s, loc = %d\n", toChars(), loc.linnum); - error("integral constant must be scalar type, not %s", type.toChars()); - type = Type.terror; - } - this.type = type; + super(loc, TOK.TOKint64, IntegerExp.sizeof); + + //printf("IntegerExp(value = %lld, type = '%s')\n", value, type ? type.toChars() : ""); + if (type && !type.isscalar()) + { + //printf("%s, loc = %d\n", toChars(), loc.linnum); + error("integral constant must be scalar type, not %s", type.toChars()); + type = Type.terror; + } + this.type = type; this.value = value; } this(ulong value) - { + { super(Loc(0), TOK.TOKint64, IntegerExp.sizeof); - this.type = Type.tint32; + this.type = Type.tint32; this.value = value; } - bool equals(Object o) + override bool equals(Object o) { - IntegerExp ne; - - if (this == o || - ((cast(Expression)o).op == TOKint64 && - ((ne = cast(IntegerExp)o), type.toHeadMutable().equals(ne.type.toHeadMutable())) && - value == ne.value) - ) - return 1; - + IntegerExp ne; + + if (this == o || + ((cast(Expression)o).op == TOKint64 && + ((ne = cast(IntegerExp)o), type.toHeadMutable().equals(ne.type.toHeadMutable())) && + value == ne.value) + ) + return 1; + return 0; } - Expression semantic(Scope sc) + override Expression semantic(Scope sc) { - if (!type) - { - // Determine what the type of this number is - ulong number = value; - - if (number & 0x8000000000000000) - type = Type.tuns64; - else if (number & 0xFFFFFFFF80000000) - type = Type.tint64; - else - type = Type.tint32; - } - else - { if (!type.deco) - type = type.semantic(loc, sc); - } + if (!type) + { + // Determine what the type of this number is + ulong number = value; + + if (number & 0x8000000000000000) + type = Type.tuns64; + else if (number & 0xFFFFFFFF80000000) + type = Type.tint64; + else + type = Type.tint32; + } + else + { if (!type.deco) + type = type.semantic(loc, sc); + } return this; } - Expression interpret(InterState istate) + override Expression interpret(InterState istate) { -version (LOG) { - printf("IntegerExp.interpret() %s\n", toChars()); -} +version (LOG) { + printf("IntegerExp.interpret() %s\n", toChars()); +} return this; } - string toChars() + override string toChars() { -static if (true) { - return Expression.toChars(); -} else { - static char buffer[value.sizeof * 3 + 1]; - int len = sprintf(buffer.ptr, "%jd", value); - return buffer[0..len].idup; +static if (true) { + return Expression.toChars(); +} else { + static char buffer[value.sizeof * 3 + 1]; + int len = sprintf(buffer.ptr, "%jd", value); + return buffer[0..len].idup; } } - void dump(int indent) + override void dump(int indent) { assert(false); } - IntRange getIntRange() + override IntRange getIntRange() { - IntRange ir; - ir.imin = value & type.sizemask(); - ir.imax = ir.imin; + IntRange ir; + ir.imin = value & type.sizemask(); + ir.imax = ir.imin; return ir; } - ulong toInteger() + override ulong toInteger() { - Type t; - - t = type; - while (t) - { - switch (t.ty) - { - case TY.Tbit: - case TY.Tbool: value = (value != 0); break; - case TY.Tint8: value = cast(byte) value; break; - case TY.Tchar: - case TY.Tuns8: value = cast(ubyte) value; break; - case TY.Tint16: value = cast(short) value; break; - case TY.Twchar: - case TY.Tuns16: value = cast(ushort)value; break; - case TY.Tint32: value = cast(int) value; break; - case TY.Tdchar: - case TY.Tuns32: value = cast(uint) value; break; - case TY.Tint64: value = cast(long) value; break; - case TY.Tuns64: value = cast(ulong) value; break; - case TY.Tpointer: - if (PTRSIZE == 4) - value = cast(uint) value; - else if (PTRSIZE == 8) - value = cast(ulong) value; - else - assert(0); - break; - - case TY.Tenum: - { - TypeEnum te = cast(TypeEnum)t; - t = te.sym.memtype; - continue; - } - - case TY.Ttypedef: - { - TypeTypedef tt = cast(TypeTypedef)t; - t = tt.sym.basetype; - continue; - } - - default: - /* This can happen if errors, such as - * the type is painted on like in fromConstInitializer(). - */ - if (!global.errors) - { - ///type.print(); - assert(0); - } - break; - } - break; - } + Type t; + + t = type; + while (t) + { + switch (t.ty) + { + case TY.Tbit: + case TY.Tbool: value = (value != 0); break; + case TY.Tint8: value = cast(byte) value; break; + case TY.Tchar: + case TY.Tuns8: value = cast(ubyte) value; break; + case TY.Tint16: value = cast(short) value; break; + case TY.Twchar: + case TY.Tuns16: value = cast(ushort)value; break; + case TY.Tint32: value = cast(int) value; break; + case TY.Tdchar: + case TY.Tuns32: value = cast(uint) value; break; + case TY.Tint64: value = cast(long) value; break; + case TY.Tuns64: value = cast(ulong) value; break; + case TY.Tpointer: + if (PTRSIZE == 4) + value = cast(uint) value; + else if (PTRSIZE == 8) + value = cast(ulong) value; + else + assert(0); + break; + + case TY.Tenum: + { + TypeEnum te = cast(TypeEnum)t; + t = te.sym.memtype; + continue; + } + + case TY.Ttypedef: + { + TypeTypedef tt = cast(TypeTypedef)t; + t = tt.sym.basetype; + continue; + } + + default: + /* This can happen if errors, such as + * the type is painted on like in fromConstInitializer(). + */ + if (!global.errors) + { + ///type.print(); + assert(0); + } + break; + } + break; + } return value; } - real toReal() + override real toReal() { - Type t; - - toInteger(); - t = type.toBasetype(); - if (t.ty == Tuns64) - return cast(real)cast(ulong)value; - else + Type t; + + toInteger(); + t = type.toBasetype(); + if (t.ty == Tuns64) + return cast(real)cast(ulong)value; + else return cast(real)cast(long)value; } - real toImaginary() + override real toImaginary() { assert(false); } - Complex!(real) toComplex() + override Complex!(real) toComplex() { assert(false); } - int isConst() + override int isConst() { return 1; } - bool isBool(bool result) + override bool isBool(bool result) { return result ? value != 0 : value == 0; } - MATCH implicitConvTo(Type t) + override MATCH implicitConvTo(Type t) { -static if (false) { - printf("IntegerExp.implicitConvTo(this=%s, type=%s, t=%s)\n", - toChars(), type.toChars(), t.toChars()); -} - - MATCH m = type.implicitConvTo(t); - if (m >= MATCH.MATCHconst) - return m; - - TY ty = type.toBasetype().ty; - TY toty = t.toBasetype().ty; - - if (m == MATCH.MATCHnomatch && t.ty == TY.Tenum) - goto Lno; - - switch (ty) - { - case TY.Tbit: - case TY.Tbool: - value &= 1; - ty = TY.Tint32; - break; - - case TY.Tint8: - value = cast(byte)value; - ty = TY.Tint32; - break; - - case TY.Tchar: - case TY.Tuns8: - value &= 0xFF; - ty = TY.Tint32; - break; - - case TY.Tint16: - value = cast(short)value; - ty = TY.Tint32; - break; - - case TY.Tuns16: - case TY.Twchar: - value &= 0xFFFF; - ty = TY.Tint32; - break; - - case TY.Tint32: - value = cast(int)value; - break; - - case TY.Tuns32: - case TY.Tdchar: - value &= 0xFFFFFFFF; - ty = TY.Tuns32; - break; - - default: - break; - } - - // Only allow conversion if no change in value - switch (toty) - { - case TY.Tbit: - case TY.Tbool: - if ((value & 1) != value) - goto Lno; - goto Lyes; - - case TY.Tint8: - if (cast(byte)value != value) - goto Lno; - goto Lyes; - - case TY.Tchar: - case TY.Tuns8: - //printf("value = %llu %llu\n", (dinteger_t)(unsigned char)value, value); - if (cast(ubyte)value != value) - goto Lno; - goto Lyes; - - case TY.Tint16: - if (cast(short)value != value) - goto Lno; - goto Lyes; - - case TY.Tuns16: - if (cast(ushort)value != value) - goto Lno; - goto Lyes; - - case TY.Tint32: - if (ty == TY.Tuns32) { - ; - } - else if (cast(int)value != value) { - goto Lno; - } - goto Lyes; - - case TY.Tuns32: - if (ty == TY.Tint32) { - } else if (cast(uint)value != value) { - goto Lno; - } - goto Lyes; - - case TY.Tdchar: - if (value > 0x10FFFF) { - goto Lno; - } - goto Lyes; - - case TY.Twchar: - if (cast(ushort)value != value) { - goto Lno; - } - goto Lyes; - - case TY.Tfloat32: - { - /*volatile*/ float f; /// - if (type.isunsigned()) { - f = cast(float)value; - if (f != value) { - goto Lno; - } - } else { - f = cast(float)cast(long)value; - if (f != cast(long)value) { - goto Lno; - } - } - goto Lyes; - } - - case TY.Tfloat64: - { - /*volatile*/ double f; /// - if (type.isunsigned()) { - f = cast(double)value; - if (f != value) - goto Lno; - } else { - f = cast(double)cast(long)value; - if (f != cast(long)value) - goto Lno; - } - goto Lyes; - } - - case TY.Tfloat80: - { - /*volatile*/ real f; /// - if (type.isunsigned()) { - f = cast(real)value; - if (f != value) - goto Lno; - } else { - f = cast(real)cast(long)value; - if (f != cast(long)value) - goto Lno; - } - goto Lyes; - } - - case TY.Tpointer: - //printf("type = %s\n", type.toBasetype().toChars()); - //printf("t = %s\n", t.toBasetype().toChars()); - if (ty == TY.Tpointer && type.toBasetype().nextOf().ty == t.toBasetype().nextOf().ty) - { - /* Allow things like: - * const char* P = cast(char *)3; - * char* q = P; - */ - goto Lyes; - } - break; - - default: - break; /// - } - - return Expression.implicitConvTo(t); - - Lyes: - //printf("MATCHconvert\n"); - return MATCH.MATCHconvert; - - Lno: - //printf("MATCHnomatch\n"); +static if (false) { + printf("IntegerExp.implicitConvTo(this=%s, type=%s, t=%s)\n", + toChars(), type.toChars(), t.toChars()); +} + + MATCH m = type.implicitConvTo(t); + if (m >= MATCH.MATCHconst) + return m; + + TY ty = type.toBasetype().ty; + TY toty = t.toBasetype().ty; + + if (m == MATCH.MATCHnomatch && t.ty == TY.Tenum) + goto Lno; + + switch (ty) + { + case TY.Tbit: + case TY.Tbool: + value &= 1; + ty = TY.Tint32; + break; + + case TY.Tint8: + value = cast(byte)value; + ty = TY.Tint32; + break; + + case TY.Tchar: + case TY.Tuns8: + value &= 0xFF; + ty = TY.Tint32; + break; + + case TY.Tint16: + value = cast(short)value; + ty = TY.Tint32; + break; + + case TY.Tuns16: + case TY.Twchar: + value &= 0xFFFF; + ty = TY.Tint32; + break; + + case TY.Tint32: + value = cast(int)value; + break; + + case TY.Tuns32: + case TY.Tdchar: + value &= 0xFFFFFFFF; + ty = TY.Tuns32; + break; + + default: + break; + } + + // Only allow conversion if no change in value + switch (toty) + { + case TY.Tbit: + case TY.Tbool: + if ((value & 1) != value) + goto Lno; + goto Lyes; + + case TY.Tint8: + if (cast(byte)value != value) + goto Lno; + goto Lyes; + + case TY.Tchar: + case TY.Tuns8: + //printf("value = %llu %llu\n", (dinteger_t)(unsigned char)value, value); + if (cast(ubyte)value != value) + goto Lno; + goto Lyes; + + case TY.Tint16: + if (cast(short)value != value) + goto Lno; + goto Lyes; + + case TY.Tuns16: + if (cast(ushort)value != value) + goto Lno; + goto Lyes; + + case TY.Tint32: + if (ty == TY.Tuns32) { + ; + } + else if (cast(int)value != value) { + goto Lno; + } + goto Lyes; + + case TY.Tuns32: + if (ty == TY.Tint32) { + } else if (cast(uint)value != value) { + goto Lno; + } + goto Lyes; + + case TY.Tdchar: + if (value > 0x10FFFF) { + goto Lno; + } + goto Lyes; + + case TY.Twchar: + if (cast(ushort)value != value) { + goto Lno; + } + goto Lyes; + + case TY.Tfloat32: + { + /*volatile*/ float f; /// + if (type.isunsigned()) { + f = cast(float)value; + if (f != value) { + goto Lno; + } + } else { + f = cast(float)cast(long)value; + if (f != cast(long)value) { + goto Lno; + } + } + goto Lyes; + } + + case TY.Tfloat64: + { + /*volatile*/ double f; /// + if (type.isunsigned()) { + f = cast(double)value; + if (f != value) + goto Lno; + } else { + f = cast(double)cast(long)value; + if (f != cast(long)value) + goto Lno; + } + goto Lyes; + } + + case TY.Tfloat80: + { + /*volatile*/ real f; /// + if (type.isunsigned()) { + f = cast(real)value; + if (f != value) + goto Lno; + } else { + f = cast(real)cast(long)value; + if (f != cast(long)value) + goto Lno; + } + goto Lyes; + } + + case TY.Tpointer: + //printf("type = %s\n", type.toBasetype().toChars()); + //printf("t = %s\n", t.toBasetype().toChars()); + if (ty == TY.Tpointer && type.toBasetype().nextOf().ty == t.toBasetype().nextOf().ty) + { + /* Allow things like: + * const char* P = cast(char *)3; + * char* q = P; + */ + goto Lyes; + } + break; + + default: + break; /// + } + + return Expression.implicitConvTo(t); + + Lyes: + //printf("MATCHconvert\n"); + return MATCH.MATCHconvert; + + Lno: + //printf("MATCHnomatch\n"); return MATCH.MATCHnomatch; } - void toCBuffer(OutBuffer buf, HdrGenState* hgs) + override void toCBuffer(OutBuffer buf, HdrGenState* hgs) { - long v = toInteger(); - - if (type) - { - Type t = type; - - L1: - switch (t.ty) - { - case TY.Tenum: - { - TypeEnum te = cast(TypeEnum)t; - buf.printf("cast(%s)", te.sym.toChars()); - t = te.sym.memtype; - goto L1; - } - - case TY.Ttypedef: - { - TypeTypedef tt = cast(TypeTypedef)t; - buf.printf("cast(%s)", tt.sym.toChars()); - t = tt.sym.basetype; - goto L1; - } - - case TY.Twchar: // BUG: need to cast(wchar) - case TY.Tdchar: // BUG: need to cast(dchar) - if (cast(ulong)v > 0xFF) - { - buf.printf("'\\U%08x'", v); - break; - } - case TY.Tchar: - if (v == '\'') - buf.writestring("'\\''"); - else if (isprint(cast(int)v) && v != '\\') - buf.printf("'%c'", cast(int)v); - else - buf.printf("'\\x%02x'", cast(int)v); - break; - - case TY.Tint8: - buf.writestring("cast(byte)"); - goto L2; - - case TY.Tint16: - buf.writestring("cast(short)"); - goto L2; - - case TY.Tint32: - L2: - buf.printf("%d", cast(int)v); - break; - - case TY.Tuns8: - buf.writestring("cast(ubyte)"); - goto L3; - - case TY.Tuns16: - buf.writestring("cast(ushort)"); - goto L3; - - case TY.Tuns32: - L3: - buf.printf("%du", cast(uint)v); - break; - - case TY.Tint64: - //buf.printf("%jdL", v); - buf.printf("%sL", v); - break; - - case TY.Tuns64: - L4: - //buf.printf("%juLU", v); - buf.printf("%sLU", v); - break; - - case TY.Tbit: - case TY.Tbool: - buf.writestring(v ? "true" : "false"); - break; - - case TY.Tpointer: - buf.writestring("cast("); - buf.writestring(t.toChars()); - buf.writeByte(')'); - if (PTRSIZE == 4) - goto L3; - else if (PTRSIZE == 8) - goto L4; - else - assert(0); - - default: - /* This can happen if errors, such as - * the type is painted on like in fromConstInitializer(). - */ - if (!global.errors) - { - debug { - writef("%s\n", t.toChars()); - } - assert(0); - } - break; - } - } - else if (v & 0x8000000000000000L) - buf.printf("0x%jx", v); - else + long v = toInteger(); + + if (type) + { + Type t = type; + + L1: + switch (t.ty) + { + case TY.Tenum: + { + TypeEnum te = cast(TypeEnum)t; + buf.printf("cast(%s)", te.sym.toChars()); + t = te.sym.memtype; + goto L1; + } + + case TY.Ttypedef: + { + TypeTypedef tt = cast(TypeTypedef)t; + buf.printf("cast(%s)", tt.sym.toChars()); + t = tt.sym.basetype; + goto L1; + } + + case TY.Twchar: // BUG: need to cast(wchar) + case TY.Tdchar: // BUG: need to cast(dchar) + if (cast(ulong)v > 0xFF) + { + buf.printf("'\\U%08x'", v); + break; + } + case TY.Tchar: + if (v == '\'') + buf.writestring("'\\''"); + else if (isprint(cast(int)v) && v != '\\') + buf.printf("'%c'", cast(int)v); + else + buf.printf("'\\x%02x'", cast(int)v); + break; + + case TY.Tint8: + buf.writestring("cast(byte)"); + goto L2; + + case TY.Tint16: + buf.writestring("cast(short)"); + goto L2; + + case TY.Tint32: + L2: + buf.printf("%d", cast(int)v); + break; + + case TY.Tuns8: + buf.writestring("cast(ubyte)"); + goto L3; + + case TY.Tuns16: + buf.writestring("cast(ushort)"); + goto L3; + + case TY.Tuns32: + L3: + buf.printf("%du", cast(uint)v); + break; + + case TY.Tint64: + //buf.printf("%jdL", v); + buf.printf("%sL", v); + break; + + case TY.Tuns64: + L4: + //buf.printf("%juLU", v); + buf.printf("%sLU", v); + break; + + case TY.Tbit: + case TY.Tbool: + buf.writestring(v ? "true" : "false"); + break; + + case TY.Tpointer: + buf.writestring("cast("); + buf.writestring(t.toChars()); + buf.writeByte(')'); + if (PTRSIZE == 4) + goto L3; + else if (PTRSIZE == 8) + goto L4; + else + assert(0); + + default: + /* This can happen if errors, such as + * the type is painted on like in fromConstInitializer(). + */ + if (!global.errors) + { + debug { + writef("%s\n", t.toChars()); + } + assert(0); + } + break; + } + } + else if (v & 0x8000000000000000L) + buf.printf("0x%jx", v); + else buf.printf("%jd", v); } - void toMangleBuffer(OutBuffer buf) + override void toMangleBuffer(OutBuffer buf) { - if (cast(long)value < 0) - buf.printf("N%d", -value); - else - buf.printf("%d", value); + if (cast(long)value < 0) + buf.printf("N%d", -value); + else + buf.printf("%d", value); } - Expression toLvalue(Scope sc, Expression e) + override Expression toLvalue(Scope sc, Expression e) { - if (!e) - e = this; - else if (!loc.filename) - loc = e.loc; - e.error("constant %s is not an lvalue", e.toChars()); + if (!e) + e = this; + else if (!loc.filename) + loc = e.loc; + e.error("constant %s is not an lvalue", e.toChars()); return this; } - elem* toElem(IRState* irs) + override elem* toElem(IRState* irs) { - elem* e = el_long(type.totym(), value); - el_setLoc(e,loc); + elem* e = el_long(type.totym(), value); + el_setLoc(e,loc); return e; } - dt_t** toDt(dt_t** pdt) + override dt_t** toDt(dt_t** pdt) { - //printf("IntegerExp.toDt() %d\n", op); - uint sz = cast(uint)type.size(); - if (value == 0) - pdt = dtnzeros(pdt, sz); - else - pdt = dtnbytes(pdt, sz, cast(char*)&value); - + //printf("IntegerExp.toDt() %d\n", op); + uint sz = cast(uint)type.size(); + if (value == 0) + pdt = dtnzeros(pdt, sz); + else + pdt = dtnbytes(pdt, sz, cast(char*)&value); + return pdt; } }