Thread overview
[Issue 1335] New: typedef-1 can't be stored in same typedef
Jul 11, 2007
d-bugmail
Jul 11, 2007
d-bugmail
Jul 11, 2007
d-bugmail
Jul 11, 2007
d-bugmail
Jul 11, 2007
d-bugmail
Jul 12, 2007
d-bugmail
Jul 12, 2007
d-bugmail
July 11, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1335

           Summary: typedef-1 can't be stored in same typedef
           Product: D
           Version: 1.018
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: bugzilla@digitalmars.com
        ReportedBy: webmaster@villagersonline.com


The following file fails to compile:

typedef uint foo;

void main() {
  foo f = 100;
  f--; // this works
  foo g = f-1; // this doesn't
}

ERROR MESSAGE:
typedef_problem.d(6): Error: cannot implicitly convert expression (f - 1u) of
type uint to foo


-- 

July 11, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1335





------- Comment #1 from shro8822@vandals.uidaho.edu  2007-07-11 15:32 -------
that would indicate that the typing rules will only convert back to base types in expressions.

(cast(foo)1) + 1  => (cast(uint)(cast(foo)1)) + (cast(uint)1)

I think this is the correct way to do things, however an argument might be made for literal being a special case.


-- 

July 11, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1335


deewiant@gmail.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Severity|normal                      |enhancement
           Priority|P2                          |P3




------- Comment #2 from deewiant@gmail.com  2007-07-11 15:45 -------
This is as intended, but it's still the most annoying thing about typedefs. IMHO typedefs should convert freely to and from their base type, explicit casts should only be needed when converting to other typedefs.

Use "foo g = f - cast(foo)1".


-- 

July 11, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1335


shro8822@vandals.uidaho.edu changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Severity|enhancement                 |normal
           Priority|P3                          |P2




------- Comment #3 from shro8822@vandals.uidaho.edu  2007-07-11 15:54 -------
Free conversion to and from a typedef might have some issues with overloading of functions. Either the rules have to not apply to function args (a special case) or typdefs become little more than aliases. I agree that having to cast literals to make math work is a bit silly, but I don't known how to fix it without loosing D's advantages over C in this area.


-- 

July 11, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1335





------- Comment #4 from webmaster@villagersonline.com  2007-07-11 18:47 -------
There are a number of ways that you might make this work, but IMHO the current implementation is broken.  (Maybe it's working as design, and the design is broken, too, I don't know.)  Let me expand the example code:

typedef uint foo;
void main() {
  foo f = 100;
  f--; // this works
  uint i = f-1; // this works
  foo g = f-1; // this doesn't
}

From this example, and by reading the error message, you realize that DMD is allowing implicit conversion typedef->uint, but not the other way around. Isn't this pretty inconsistent?

IMHO, implicit conversions either way should be disallowed.  We could still allow for nice math with literals if we followed this rule:

  "Math between numeric typedefs and numeric literals is allowed, and the
result has the same type as the typedef."

You could even consider allowing math between numeric typedefs and non-typedef variables, but I am more skeptical of that.


-- 

July 12, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1335





------- Comment #5 from shro8822@vandals.uidaho.edu  2007-07-11 19:05 -------
> From this example, and by reading the error message, you realize that DMD is allowing implicit conversion typedef->uint, but not the other way around. Isn't this pretty inconsistent?

this is more or less the same as the class conversion rules

conversion towards Object; no cast
conversion away from Object; needs cast

conversion towards built ins; no cast
conversion away from built ins; needs cast

typdefs can be considered subsets of what they typedef

For the little I've thought of it I'd have no problem with your suggested rule. However, I still want the free down cast.


-- 

July 12, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1335


bugzilla@digitalmars.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Severity|normal                      |enhancement




------- Comment #6 from bugzilla@digitalmars.com  2007-07-12 12:48 -------
This is working as designed, so changing it is an enhancement request.


-- 

October 10, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=1335


Alex Rønne Petersen <alex@lycus.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
                 CC|                            |alex@lycus.org
         Resolution|                            |WONTFIX


--- Comment #7 from Alex Rønne Petersen <alex@lycus.org> 2012-10-10 02:42:06 CEST ---
Closing since typedef is effectively deprecated.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------