]> Cypherpunks repositories - gostls13.git/commitdiff
Fix named types being defined to named types. In general, the
authorAustin Clements <aclements@csail.mit.edu>
Fri, 28 Aug 2009 21:39:12 +0000 (14:39 -0700)
committerAustin Clements <aclements@csail.mit.edu>
Fri, 28 Aug 2009 21:39:12 +0000 (14:39 -0700)
code assumes that the definition of a named type is not a
named type, but some code paths could violate that.

R=rsc
APPROVED=rsc
DELTA=9  (5 added, 2 deleted, 2 changed)
OCL=34046
CL=34053

usr/austin/eval/scope.go
usr/austin/eval/type.go

index fd95530b1cd739d56b4f92c7c3beeb51ed5d3f10..0f6f3a0d04e6610272ae7b0054cc4ca4477f72e5 100644 (file)
@@ -85,12 +85,10 @@ func (b *block) DefineType(name string, pos token.Position, t Type) Type {
        if _, ok := b.defs[name]; ok {
                return nil;
        }
-       // We take the representative type of t because multiple
-       // levels of naming are useless.
+       nt := &NamedType{pos, name, nil, true, make(map[string] Method)};
        if t != nil {
-               t = t.lit();
+               nt.Complete(t);
        }
-       nt := &NamedType{pos, name, t, false, make(map[string] Method)};
        b.defs[name] = nt;
        return nt;
 }
index 457b18be75cb615f5c321921bcc510cedd462dee..6ac06df8ea47b17cc7e260b341951daf219d28d4 100644 (file)
@@ -980,6 +980,11 @@ func (t *NamedType) Complete(def Type) {
        if !t.incomplete {
                log.Crashf("cannot complete already completed NamedType %+v", *t);
        }
+       // We strip the name from def because multiple levels of
+       // naming are useless.
+       if ndef, ok := def.(*NamedType); ok {
+               def = ndef.Def;
+       }
        t.Def = def;
        t.incomplete = false;
 }