diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2018-03-08 12:02:17 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2018-03-08 12:02:17 +0100 |
| commit | d0790618dcf6599098c1b14a3ed0405168a3f814 (patch) | |
| tree | c44c6bdb05a49d2aac1fc039bcbefa3b5fc26701 /prog/prog.go | |
| parent | 549f0dc24e0f395223d16069bb2692bafdf3e2da (diff) | |
prog: fix isDefaultArg
Test that isDefaultArg returns true for result of DefaultArg.
Fix few bugs uncovered by this test.
Diffstat (limited to 'prog/prog.go')
| -rw-r--r-- | prog/prog.go | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/prog/prog.go b/prog/prog.go index dd282d730..769161f7a 100644 --- a/prog/prog.go +++ b/prog/prog.go @@ -364,6 +364,9 @@ func (target *Target) defaultArg(t Type) Arg { case *UnionType: return MakeUnionArg(t, target.defaultArg(typ.Fields[0])) case *VmaType: + if t.Optional() { + return MakeNullPointerArg(t) + } return MakeVmaPointerArg(t, 0, target.PageSize) case *PtrType: if t.Optional() { @@ -388,7 +391,7 @@ func (target *Target) isDefaultArg(arg Arg) bool { panic(fmt.Sprintf("unknown const type: %#v", t)) } case *GroupArg: - if !a.fixedInnerSize() { + if !a.fixedInnerSize() && len(a.Inner) != 0 { return false } for _, elem := range a.Inner { @@ -399,7 +402,7 @@ func (target *Target) isDefaultArg(arg Arg) bool { return true case *UnionArg: t := a.Type().(*UnionType) - return a.Option.Type().FieldName() == t.Fields[0].Name() && + return a.Option.Type().FieldName() == t.Fields[0].FieldName() && target.isDefaultArg(a.Option) case *DataArg: if a.Size() == 0 { @@ -425,6 +428,9 @@ func (target *Target) isDefaultArg(arg Arg) bool { } return a.Address == 0 && target.isDefaultArg(a.Res) case *VmaType: + if t.Optional() { + return a.IsNull() + } return a.Address == 0 && a.VmaSize == target.PageSize default: panic(fmt.Sprintf("unknown pointer type: %#v", t)) |
