aboutsummaryrefslogtreecommitdiffstats
path: root/prog/prog.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2018-03-08 12:02:17 +0100
committerDmitry Vyukov <dvyukov@google.com>2018-03-08 12:02:17 +0100
commitd0790618dcf6599098c1b14a3ed0405168a3f814 (patch)
treec44c6bdb05a49d2aac1fc039bcbefa3b5fc26701 /prog/prog.go
parent549f0dc24e0f395223d16069bb2692bafdf3e2da (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.go10
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))