From 5ef8dbdf5a63ccf7e069527dbb2493dc2ef0c319 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Fri, 2 Mar 2018 15:44:54 +0100 Subject: pkg/compiler: support size attribute for unions --- pkg/compiler/gen.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'pkg/compiler/gen.go') diff --git a/pkg/compiler/gen.go b/pkg/compiler/gen.go index 74d1b5d78..5bf239e79 100644 --- a/pkg/compiler/gen.go +++ b/pkg/compiler/gen.go @@ -165,14 +165,24 @@ func (comp *compiler) genStructDescs(syscalls []*prog.Syscall) []*prog.KeyedStru if !checkStruct(t.Key, &t.StructDesc) { return } + structNode := comp.structNodes[t.StructDesc] + varlen, sizeAttr := comp.parseUnionAttrs(structNode) t.TypeSize = 0 - varlen := comp.parseUnionAttrs(comp.structNodes[t.StructDesc]) if !varlen { for _, fld := range t.Fields { - if t.TypeSize < fld.Size() { - t.TypeSize = fld.Size() + sz := fld.Size() + if sizeAttr != sizeUnassigned && sz > sizeAttr { + comp.error(structNode.Pos, "union %v has size attribute %v"+ + " which is less than field %v size %v", + structNode.Name.Name, sizeAttr, fld.Name(), sz) + } + if t.TypeSize < sz { + t.TypeSize = sz } } + if sizeAttr != sizeUnassigned { + t.TypeSize = sizeAttr + } } } } -- cgit mrf-deployment