summaryrefslogtreecommitdiff
path: root/vendor/modernc.org/ccgo
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/modernc.org/ccgo')
-rw-r--r--vendor/modernc.org/ccgo/v3/lib/Makefile3
-rw-r--r--vendor/modernc.org/ccgo/v3/lib/ccgo.go147
-rw-r--r--vendor/modernc.org/ccgo/v3/lib/go.go786
-rw-r--r--vendor/modernc.org/ccgo/v3/lib/init.go10
4 files changed, 480 insertions, 466 deletions
diff --git a/vendor/modernc.org/ccgo/v3/lib/Makefile b/vendor/modernc.org/ccgo/v3/lib/Makefile
index ec6f53518..1bd7e1934 100644
--- a/vendor/modernc.org/ccgo/v3/lib/Makefile
+++ b/vendor/modernc.org/ccgo/v3/lib/Makefile
@@ -112,7 +112,8 @@ edit:
editor:
gofmt -l -s -w *.go
- GO111MODULE=off go build -v -o $(GOPATH)/bin/ccgo modernc.org/ccgo/v3
+ go build -v -o $(GOPATH)/bin/ccgo modernc.org/ccgo/v3
+ go test -c -o /dev/null
later:
@grep -n $(grep) LATER * || true
diff --git a/vendor/modernc.org/ccgo/v3/lib/ccgo.go b/vendor/modernc.org/ccgo/v3/lib/ccgo.go
index 0c62d76b2..e04d74768 100644
--- a/vendor/modernc.org/ccgo/v3/lib/ccgo.go
+++ b/vendor/modernc.org/ccgo/v3/lib/ccgo.go
@@ -249,6 +249,7 @@ void *__builtin_memset(void *s, int c, size_t n);
void *__builtin_mmap(void *addr, size_t length, int prot, int flags, int fd, __INTPTR_TYPE__ offset);
void *__ccgo_va_arg(__builtin_va_list ap);
void __builtin_abort(void);
+void __builtin_bzero(void *s, size_t n);
void __builtin_exit(int status);
void __builtin_free(void *ptr);
void __builtin_prefetch (const void *addr, ...);
@@ -284,7 +285,6 @@ unsigned __sync_sub_and_fetch_uint32(unsigned*, unsigned);
func origin(skip int) string {
pc, fn, fl, _ := runtime.Caller(skip)
- fn = filepath.Base(fn)
f := runtime.FuncForPC(pc)
var fns string
if f != nil {
@@ -296,32 +296,20 @@ func origin(skip int) string {
return fmt.Sprintf("%s:%d:%s", fn, fl, fns)
}
-func todo(s string, args ...interface{}) string { //TODO-
+func todo(s string, args ...interface{}) string {
switch {
case s == "":
s = fmt.Sprintf(strings.Repeat("%v ", len(args)), args...)
default:
s = fmt.Sprintf(s, args...)
}
- pc, fn, fl, _ := runtime.Caller(1)
- f := runtime.FuncForPC(pc)
- var fns string
- if f != nil {
- fns = f.Name()
- if x := strings.LastIndex(fns, "."); x > 0 {
- fns = fns[x+1:]
- }
- }
- r := fmt.Sprintf("%s:%d:%s: TODOTODO %s", fn, fl, fns, s) //TODOOK
- if dmesgs {
- dmesg("%v: %v", origin(1), r)
- }
+ r := fmt.Sprintf("%s\n\tTODO %s", origin(2), s) //TODOOK
fmt.Fprintf(os.Stdout, "%s\n", r)
os.Stdout.Sync()
return r
}
-func trc(s string, args ...interface{}) string { //TODO-
+func trc(s string, args ...interface{}) string {
switch {
case s == "":
s = fmt.Sprintf(strings.Repeat("%v ", len(args)), args...)
@@ -329,8 +317,8 @@ func trc(s string, args ...interface{}) string { //TODO-
s = fmt.Sprintf(s, args...)
}
r := fmt.Sprintf("%s: TRC %s", origin(2), s)
- fmt.Fprintf(os.Stdout, "%s\n", r)
- os.Stdout.Sync()
+ fmt.Fprintf(os.Stderr, "%s\n", r)
+ os.Stderr.Sync()
return r
}
@@ -367,7 +355,8 @@ type Task struct {
hostIncludes []string
hostPredefined string
hostSysIncludes []string
- ignoredIncludes string // -ignored-includes
+ ignoredIncludes string // -ignored-includes
+ ignoredObjects map[string]struct{} // -ignore-object
imported []*imported
includedFiles map[string]struct{}
l []string // -l
@@ -395,37 +384,37 @@ type Task struct {
// feature should ever set it.
CallOutBinary string
- E bool // -E
- allErrors bool // -all-errors
- compiledbValid bool // -compiledb present
- configSaved bool
- configured bool // hostPredefined, hostIncludes, hostSysIncludes are valid
- cover bool // -cover-instrumentation
- coverC bool // -cover-instrumentation-c
- defaultUnExport bool // -unexported-by-default
- errTrace bool // -err-trace
- exportDefinesValid bool // -export-defines present
- exportEnumsValid bool // -export-enums present
- exportExternsValid bool // -export-externs present
- exportFieldsValid bool // -export-fields present
- exportStructsValid bool // -export-structs present
- exportTypedefsValid bool // -export-typedefs present
- fullPathComments bool // -full-path-comments
- funcSig bool // -func-sig
- header bool // -header
- ignoreUndefined bool // -ignoreUndefined
- isScripted bool
- mingw bool
- noCapi bool // -nocapi
- nostdinc bool // -nostdinc
- nostdlib bool // -nostdlib
- panicStubs bool // -panic-stubs
- tracePinning bool // -trace-pinning
- traceTranslationUnits bool // -trace-translation-units
- verifyStructs bool // -verify-structs
- version bool // -version
- watch bool // -watch-instrumentation
- windows bool // -windows
+ E bool // -E
+ allErrors bool // -all-errors
+ compiledbValid bool // -compiledb present
+ configSaved bool
+ configured bool // hostPredefined, hostIncludes, hostSysIncludes are valid
+ cover bool // -cover-instrumentation
+ coverC bool // -cover-instrumentation-c
+ defaultUnExport bool // -unexported-by-default
+ errTrace bool // -err-trace
+ exportDefinesValid bool // -export-defines present
+ exportEnumsValid bool // -export-enums present
+ exportExternsValid bool // -export-externs present
+ exportFieldsValid bool // -export-fields present
+ exportStructsValid bool // -export-structs present
+ exportTypedefsValid bool // -export-typedefs present
+ fullPathComments bool // -full-path-comments
+ funcSig bool // -func-sig
+ header bool // -header
+ ignoreUnsupportedAligment bool // -ignore-unsupported-alignment
+ isScripted bool
+ mingw bool
+ noCapi bool // -nocapi
+ nostdinc bool // -nostdinc
+ nostdlib bool // -nostdlib
+ panicStubs bool // -panic-stubs
+ tracePinning bool // -trace-pinning
+ traceTranslationUnits bool // -trace-translation-units
+ verifyStructs bool // -verify-structs
+ version bool // -version
+ watch bool // -watch-instrumentation
+ windows bool // -windows
}
// NewTask returns a newly created Task.
@@ -617,7 +606,6 @@ func (t *Task) capi2(files []string) (pkgName string, exports map[string]struct{
// Main executes task.
func (t *Task) Main() (err error) {
- // trc("%p: %q", t, t.args)
if dmesgs {
defer func() {
if err != nil {
@@ -681,7 +669,7 @@ func (t *Task) Main() (err error) {
opts.Opt("full-path-comments", func(opt string) error { t.fullPathComments = true; return nil })
opts.Opt("func-sig", func(opt string) error { t.funcSig = true; return nil })
opts.Opt("header", func(opt string) error { t.header = true; return nil })
- opts.Opt("ignore-undefined", func(opt string) error { t.ignoreUndefined = true; return nil })
+ opts.Opt("ignore-unsupported-alignment", func(opt string) error { t.ignoreUnsupportedAligment = true; return nil })
opts.Opt("nocapi", func(opt string) error { t.noCapi = true; return nil })
opts.Opt("nostdinc", func(opt string) error { t.nostdinc = true; return nil })
opts.Opt("panic-stubs", func(opt string) error { t.panicStubs = true; return nil })
@@ -710,6 +698,13 @@ func (t *Task) Main() (err error) {
}
return nil
})
+ opts.Arg("ignore-object", false, func(arg, value string) error {
+ if t.ignoredObjects == nil {
+ t.ignoredObjects = map[string]struct{}{}
+ }
+ t.ignoredObjects[value] = struct{}{}
+ return nil
+ })
opts.Arg("save-config", false, func(arg, value string) error {
if value == "" {
return nil
@@ -1120,6 +1115,9 @@ func (t *Task) link() (err error) {
return
}
+ if out, e := exec.Command("gofmt", "-r", "(x) -> x", "-l", "-s", "-w", t.o).CombinedOutput(); e != nil && err == nil {
+ err = fmt.Errorf(strings.Join([]string{string(out), e.Error()}, ": "))
+ }
if out, e := exec.Command("gofmt", "-l", "-s", "-w", t.o).CombinedOutput(); e != nil && err == nil {
err = fmt.Errorf(strings.Join([]string{string(out), e.Error()}, ": "))
}
@@ -1232,7 +1230,7 @@ type cdb struct {
outputIndex map[string][]*cdbItem
}
-func (db *cdb) find(obj map[string]*cdbItem, nm string, ver, seqLimit int, path []string, cc, ar string) error {
+func (db *cdb) find(obj map[string]*cdbItem, nm string, ver, seqLimit int, path []string, cc, ar string, ignored map[string]struct{}) error {
// trc("%v: nm %q ver %v seqLimit %v path %q cc %q ar %q", origin(1), nm, ver, seqLimit, path, cc, ar)
var item *cdbItem
var k string
@@ -1292,6 +1290,12 @@ func (db *cdb) find(obj map[string]*cdbItem, nm string, ver, seqLimit int, path
}
}
if item == nil {
+ for k := range ignored {
+ if k == nm || strings.HasSuffix(nm, k) {
+ return nil
+ }
+ }
+
return fmt.Errorf("not found in compile DB: %s (max seq %d), path %v", k, seqLimit, path)
}
@@ -1302,7 +1306,7 @@ func (db *cdb) find(obj map[string]*cdbItem, nm string, ver, seqLimit int, path
obj[k] = item
var errs []string
for _, v := range item.sources(cc, ar) {
- if err := db.find(obj, v, -1, item.seq, append(path, nm), cc, ar); err != nil {
+ if err := db.find(obj, v, -1, item.seq, append(path, nm), cc, ar, ignored); err != nil {
errs = append(errs, err.Error())
}
}
@@ -1380,7 +1384,7 @@ func (t *Task) useCompileDB(fn string, args []string) error {
notFound := false
for _, v := range args {
v, ver := suffixNum(v, 0)
- if err := cdb.find(obj, v, ver, -1, nil, t.ccLookPath, t.arLookPath); err != nil {
+ if err := cdb.find(obj, v, ver, -1, nil, t.ccLookPath, t.arLookPath, t.ignoredObjects); err != nil {
notFound = true
fmt.Fprintln(os.Stderr, err)
}
@@ -1584,9 +1588,19 @@ func hasPlusPrefix(s string) (n int, r string) {
}
func makeXParser(s string) (r []string, err error) {
- n, s := hasPlusPrefix(s)
- if n == 0 {
- return nil, nil
+ switch {
+ case strings.HasPrefix(s, "libtool: link: ar "):
+ s = s[len("libtool: link:"):]
+ case strings.HasPrefix(s, "libtool: compile: "):
+ s = s[len("libtool: compile:"):]
+ for strings.HasPrefix(s, " ") {
+ s = s[1:]
+ }
+ default:
+ var n int
+ if n, s = hasPlusPrefix(s); n == 0 {
+ return nil, nil
+ }
}
if !strings.HasPrefix(s, " ") {
@@ -1600,6 +1614,9 @@ func makeXParser(s string) (r []string, err error) {
return nil, nil // ignore
}
}
+ if len(r) != 0 && filepath.Base(r[0]) == "libtool" {
+ r[0] = "libtool"
+ }
return r, err
}
@@ -1692,13 +1709,20 @@ func (it *cdbItem) ccgoArgs(cc string) (r []string, err error) {
strings.HasPrefix(arg, "-m"):
// nop
+ case strings.HasPrefix(arg, ">"):
+ return opt.Skip(nil)
default:
return fmt.Errorf("unknown/unsupported CC option: %s", arg)
}
return nil
}); err != nil {
- return nil, err
+ switch err.(type) {
+ case opt.Skip:
+ // ok
+ default:
+ return nil, err
+ }
}
return r, nil
@@ -1756,6 +1780,7 @@ func (it *cdbItem) sources(cc, ar string) (r []string) {
case
"libtool",
ar,
+ filepath.Base(ar),
cc:
var prev string
@@ -1780,6 +1805,7 @@ type cdbMakeWriter struct {
b bytes.Buffer
cc string
ar string
+ arBase string
dir string
err error
it cdbItem
@@ -1793,6 +1819,7 @@ func (t *Task) newCdbMakeWriter(w *cdbWriter, dir string, parser func(s string)
r := &cdbMakeWriter{
cc: t.ccLookPath,
ar: t.arLookPath,
+ arBase: filepath.Base(t.arLookPath),
dir: dir,
parser: parser,
w: w,
@@ -1868,6 +1895,8 @@ func (w *cdbMakeWriter) Write(b []byte) (int, error) {
fmt.Printf("CCGO CC: %q\n", args)
err = w.handleGCC(args)
case w.ar:
+ fallthrough
+ case w.arBase:
if isCreateArchive(args[1]) {
fmt.Printf("CCGO AR: %q\n", args)
err = w.handleAR(args)
diff --git a/vendor/modernc.org/ccgo/v3/lib/go.go b/vendor/modernc.org/ccgo/v3/lib/go.go
index 0b826161d..4ee4ad6e8 100644
--- a/vendor/modernc.org/ccgo/v3/lib/go.go
+++ b/vendor/modernc.org/ccgo/v3/lib/go.go
@@ -105,8 +105,7 @@ const (
type flags byte
const (
- fOutermost flags = 1 << iota
- fForceConv
+ fForceConv flags = 1 << iota
fForceNoConv
fForceRuntimeConv
fNoCondAssignment
@@ -1180,7 +1179,7 @@ func (n *enumSpec) emit(p *project) {
p.emitedEnums[nm] = struct{}{}
p.w("%s%s = ", tidyComment("\n", en), p.enumConsts[nm])
- p.intConst(en, "", en.Operand, en.Operand.Type(), fOutermost|fForceNoConv)
+ p.intConst(en, "", en.Operand, en.Operand.Type(), fForceNoConv)
p.w(";")
}
p.w(");")
@@ -1334,7 +1333,7 @@ func (p *project) err(n cc.Node, s string, args ...interface{}) {
s = s + "(" + origin(2) + ")"
}
if p.task.traceTranslationUnits {
- trc("%v: error: %s (%v)", n.Position(), fmt.Sprintf(s, args...), origin(2))
+ trc("%v: error: %s (%v)", pos(n), fmt.Sprintf(s, args...), origin(2))
}
if !p.task.allErrors && len(p.errors) >= 10 {
return
@@ -1921,7 +1920,7 @@ func (p *project) structLiteral(n cc.Node, t cc.Type) string {
// trc("%v: %q\n%s", p.pos(n), t.Tag(), info)
b.WriteString("struct {")
if info.NeedExplicitAlign {
- fmt.Fprintf(b, "%s [0]uint%d;", p.padName(&npad), 8*p.align(t))
+ fmt.Fprintf(b, "%s [0]uint%d;", p.padName(&npad), 8*p.align(n, t))
}
var max uintptr
for _, off := range info.Offsets {
@@ -1974,7 +1973,7 @@ func (p *project) structLiteral(n cc.Node, t cc.Type) string {
}
max += ft.Size()
- fmt.Fprintf(b, "%s %s;", p.fieldName2(n, f), p.typ(nil, ft))
+ fmt.Fprintf(b, "%s %s;", p.fieldName2(n, f), p.typ(n, ft))
}
}
if info.PaddingAfter != 0 {
@@ -1983,6 +1982,10 @@ func (p *project) structLiteral(n cc.Node, t cc.Type) string {
b.WriteByte('}')
case cc.Union:
b.WriteString("struct {")
+ info := cc.NewStructLayout(t)
+ if info.NeedExplicitAlign {
+ fmt.Fprintf(b, "%s [0]uint%d;", p.padName(&npad), 8*p.align(n, t))
+ }
al := uintptr(t.Align())
sz := t.Size()
if al > sz {
@@ -2005,7 +2008,7 @@ func (p *project) structLiteral(n cc.Node, t cc.Type) string {
fmt.Fprintf(b, "uint%d;", f.BitFieldBlockWidth())
fsz = uintptr(f.BitFieldBlockWidth()) >> 3
default:
- fmt.Fprintf(b, "%s %s;", p.fieldName2(n, f), p.typ(nil, ft))
+ fmt.Fprintf(b, "%s %s;", p.fieldName2(n, f), p.typ(n, ft))
}
if pad := sz - fsz; pad != 0 {
fmt.Fprintf(b, "%s [%d]byte;", p.padName(&npad), pad)
@@ -2023,7 +2026,7 @@ func (p *project) structLiteral(n cc.Node, t cc.Type) string {
return r
}
-func (p *project) align(t cc.Type) int {
+func (p *project) align(nd cc.Node, t cc.Type) int {
switch n := t.Align(); {
case n <= 1:
return 1
@@ -2031,7 +2034,12 @@ func (p *project) align(t cc.Type) int {
return 2
case n <= 4:
return 4
+ case n <= 8:
+ return 8
default:
+ if !p.task.ignoreUnsupportedAligment {
+ p.err(nd, "unsupported alignment of type %s: %v", t, n)
+ }
return 8
}
}
@@ -2554,8 +2562,12 @@ package %s
p.o("\t\"fmt\"\n")
}
first := true
+ libc := false
for _, v := range p.task.imported {
if v.used {
+ if v.path == p.task.crtImportPath {
+ libc = true
+ }
if first {
p.o("\n")
first = false
@@ -2564,6 +2576,9 @@ package %s
}
}
if p.task.crtImportPath != "" {
+ if !libc {
+ p.o("\t%q\n", p.task.crtImportPath)
+ }
p.o("\t%q\n", p.task.crtImportPath+"/sys/types")
}
p.o(`)
@@ -2574,6 +2589,9 @@ var _ atomic.Value
var _ unsafe.Pointer
`)
if p.task.crtImportPath != "" {
+ if libc {
+ p.o("var _ *libc.TLS\n")
+ }
p.o("var _ types.Size_t\n")
}
if p.isMain {
@@ -2673,6 +2691,10 @@ package %s
return
}
+ if out, err := exec.Command("gofmt", "-r", "(x) -> x", "-l", "-s", "-w", p.task.capif).CombinedOutput(); err != nil {
+ p.err(nil, "%s: %v", out, err)
+ }
+
if out, err := exec.Command("gofmt", "-l", "-s", "-w", p.task.capif).CombinedOutput(); err != nil {
p.err(nil, "%s: %v", out, err)
}
@@ -2703,12 +2725,12 @@ func (p *project) initPatches() {
switch {
case d != nil && d.Type().Kind() == cc.Function:
p.w("\n*(*")
- p.functionSignature(nil, d.Type(), "")
+ p.functionSignature(d, nil, d.Type(), "")
p.w(")(unsafe.Pointer(uintptr(unsafe.Pointer(&%s))+%d%s)) = ", tld.name, init.Offset, fld)
p.declarator(init, nil, d, d.Type(), exprFunc, 0)
default:
p.w("\n*(*%s)(unsafe.Pointer(uintptr(unsafe.Pointer(&%s))+%d%s)) = ", p.typ(init, patch.t), tld.name, init.Offset, fld)
- p.assignmentExpression(nil, expr, patch.t, exprValue, fOutermost)
+ p.assignmentExpression(nil, expr, patch.t, exprValue, 0)
}
p.w("// %s:", p.pos(init))
}
@@ -2932,7 +2954,7 @@ func (p *project) initDeclarator(f *function, n *cc.InitDeclarator, sep string,
default:
sv := f.condInitPrefix
f.condInitPrefix = func() {
- p.declarator(d, f, d, d.Type(), exprLValue, fOutermost)
+ p.declarator(d, f, d, d.Type(), exprLValue, 0)
p.w(" = ")
}
switch {
@@ -2953,7 +2975,7 @@ func (p *project) initDeclarator(f *function, n *cc.InitDeclarator, sep string,
case local.isPinned:
sv := f.condInitPrefix
f.condInitPrefix = func() {
- //TODO- p.declarator(d, f, d, d.Type(), exprLValue, fOutermost)
+ //TODO- p.declarator(d, f, d, d.Type(), exprLValue, 0)
//TODO- p.w(" = ")
p.w("*(*%s)(unsafe.Pointer(%s%s/* %s */)) = ", p.typ(n, d.Type()), f.bpName, nonZeroUintptr(local.off), local.name)
}
@@ -3026,7 +3048,7 @@ func (p *project) initDeclaratorDeclVLA(f *function, n *cc.InitDeclarator, sep s
p.w("%s%s = %sXrealloc(%s, %s, types.Size_t(", sep, local.name, p.task.crt, f.tlsName, local.name)
e := d.Type().LenExpr()
- p.assignmentExpression(f, e, e.Operand.Type(), exprValue, fOutermost)
+ p.assignmentExpression(f, e, e.Operand.Type(), exprValue, 0)
if sz := d.Type().Elem().Size(); sz != 1 {
p.w("*%d", sz)
}
@@ -3095,7 +3117,7 @@ func (p *project) declaratorDecay(n cc.Node, f *function, d *cc.Declarator, t cc
return
}
- p.w("%s%s/* &%s[0] */", f.bpName, nonZeroUintptr(local.off), local.name)
+ p.w("(%s%s)/* &%s[0] */", f.bpName, nonZeroUintptr(local.off), local.name)
return
}
}
@@ -3261,7 +3283,7 @@ func (p *project) declaratorValueArray(n cc.Node, f *function, d *cc.Declarator,
if f != nil {
if local := f.locals[d]; local != nil {
if local.isPinned {
- p.w("%s%s/* %s */", f.bpName, nonZeroUintptr(local.off), local.name)
+ p.w("(%s%s)/* %s */", f.bpName, nonZeroUintptr(local.off), local.name)
return
}
@@ -3323,14 +3345,14 @@ func (p *project) declaratorFuncNormal(n cc.Node, f *function, d *cc.Declarator,
if local := f.locals[d]; local != nil {
if local.isPinned {
p.w("(*(*")
- p.functionSignature(f, u, "")
+ p.functionSignature(n, f, u, "")
p.w(")(unsafe.Pointer(%s%s)))", f.bpName, nonZeroUintptr(local.off))
return
}
if d.IsParameter {
p.w("(*(*")
- p.functionSignature(f, u, "")
+ p.functionSignature(n, f, u, "")
p.w(")(unsafe.Pointer(&%s)))", local.name)
return
}
@@ -3340,7 +3362,7 @@ func (p *project) declaratorFuncNormal(n cc.Node, f *function, d *cc.Declarator,
if x := p.tlds[d]; x != nil && d.IsStatic() {
p.w("(*(*")
- p.functionSignature(f, u, "")
+ p.functionSignature(n, f, u, "")
p.w(")(unsafe.Pointer(&%s)))", x.name)
return
}
@@ -3348,7 +3370,7 @@ func (p *project) declaratorFuncNormal(n cc.Node, f *function, d *cc.Declarator,
switch x := p.symtab[d.Name().String()].(type) {
case *tld:
p.w("(*(*")
- p.functionSignature(f, u, "")
+ p.functionSignature(n, f, u, "")
p.w(")(unsafe.Pointer(&%s)))", x.name)
case *imported:
x.used = true
@@ -3540,7 +3562,7 @@ func (p *project) declaratorAddrOfArrayParameter(n cc.Node, f *function, d *cc.D
}
local := f.locals[d]
- p.w("%s%s/* &%s */", f.bpName, nonZeroUintptr(local.off), local.name)
+ p.w("(%s%s)/* &%s */", f.bpName, nonZeroUintptr(local.off), local.name)
}
func (p *project) declaratorAddrOfFunction(n cc.Node, f *function, d *cc.Declarator) {
@@ -3550,7 +3572,7 @@ func (p *project) declaratorAddrOfFunction(n cc.Node, f *function, d *cc.Declara
if x := p.tlds[d]; x != nil && d.IsStatic() {
p.w("*(*uintptr)(unsafe.Pointer(&struct{f ")
- p.functionSignature(f, d.Type(), "")
+ p.functionSignature(n, f, d.Type(), "")
p.w("}{%s}))", x.name)
return
}
@@ -3558,12 +3580,12 @@ func (p *project) declaratorAddrOfFunction(n cc.Node, f *function, d *cc.Declara
switch x := p.symtab[d.Name().String()].(type) {
case *tld:
p.w("*(*uintptr)(unsafe.Pointer(&struct{f ")
- p.functionSignature(f, d.Type(), "")
+ p.functionSignature(n, f, d.Type(), "")
p.w("}{%s}))", x.name)
case *imported:
x.used = true
p.w("*(*uintptr)(unsafe.Pointer(&struct{f ")
- p.functionSignature(f, d.Type(), "")
+ p.functionSignature(n, f, d.Type(), "")
p.w("}{%sX%s}))", x.qualifier, d.Name())
default:
p.err(d, "back-end: undefined: %s", d.Name())
@@ -3579,7 +3601,7 @@ func (p *project) declaratorAddrOfUnion(n cc.Node, f *function, d *cc.Declarator
}
if local.isPinned {
- p.w("%s%s/* &%s */", f.bpName, nonZeroUintptr(local.off), local.name)
+ p.w("(%s%s)/* &%s */", f.bpName, nonZeroUintptr(local.off), local.name)
return
}
@@ -3612,7 +3634,7 @@ func (p *project) declaratorAddrOfNormal(n cc.Node, f *function, d *cc.Declarato
}
if local.isPinned {
- p.w("%s%s/* &%s */", f.bpName, nonZeroUintptr(local.off), local.name)
+ p.w("(%s%s)/* &%s */", f.bpName, nonZeroUintptr(local.off), local.name)
return
}
@@ -3654,7 +3676,7 @@ func (p *project) declaratorAddrOfArray(n cc.Node, f *function, d *cc.Declarator
}
if local.isPinned {
- p.w("%s%s/* &%s */", f.bpName, nonZeroUintptr(local.off), local.name)
+ p.w("(%s%s)/* &%s */", f.bpName, nonZeroUintptr(local.off), local.name)
return
}
@@ -3699,7 +3721,7 @@ func (p *project) convertType(n cc.Node, from, to cc.Type, flags flags) string {
// trc("%v: %v -> %v\n%s", p.pos(n), from, to, debug.Stack()[:600]) //TODO-
force := flags&fForceConv != 0
if from == nil {
- p.w("%s(", p.typ(nil, to))
+ p.w("%s(", p.typ(n, to))
return ")"
}
@@ -4015,7 +4037,7 @@ func (p *project) convertInt(n cc.Node, op cc.Operand, to cc.Type, flags flags)
value := op.Value()
if value == nil || !to.IsIntegerType() {
if to.IsScalarType() {
- p.w("%s(", p.typ(nil, to))
+ p.w("%s(", p.typ(n, to))
return ")"
}
@@ -4093,7 +4115,7 @@ func (p *project) convertInt(n cc.Node, op cc.Operand, to cc.Type, flags flags)
switch to.Size() {
case 1:
if x >= 0 && x <= math.MaxUint8 {
- p.w("%s(", p.typ(nil, to))
+ p.w("%s(", p.typ(n, to))
return ")"
}
@@ -4101,7 +4123,7 @@ func (p *project) convertInt(n cc.Node, op cc.Operand, to cc.Type, flags flags)
return ")"
case 2:
if x >= 0 && x <= math.MaxUint16 {
- p.w("%s(", p.typ(nil, to))
+ p.w("%s(", p.typ(n, to))
return ")"
}
@@ -4109,7 +4131,7 @@ func (p *project) convertInt(n cc.Node, op cc.Operand, to cc.Type, flags flags)
return ")"
case 4:
if x >= 0 && x <= math.MaxUint32 {
- p.w("%s(", p.typ(nil, to))
+ p.w("%s(", p.typ(n, to))
return ")"
}
@@ -4130,7 +4152,7 @@ func (p *project) convertInt(n cc.Node, op cc.Operand, to cc.Type, flags flags)
switch to.Size() {
case 1:
if x <= math.MaxUint8 {
- p.w("%s(", p.typ(nil, to))
+ p.w("%s(", p.typ(n, to))
return ")"
}
@@ -4138,7 +4160,7 @@ func (p *project) convertInt(n cc.Node, op cc.Operand, to cc.Type, flags flags)
return ")"
case 2:
if x <= math.MaxUint16 {
- p.w("%s(", p.typ(nil, to))
+ p.w("%s(", p.typ(n, to))
return ")"
}
@@ -4146,7 +4168,7 @@ func (p *project) convertInt(n cc.Node, op cc.Operand, to cc.Type, flags flags)
return ")"
case 4:
if x <= math.MaxUint32 {
- p.w("%s(", p.typ(nil, to))
+ p.w("%s(", p.typ(n, to))
return ")"
}
@@ -4318,7 +4340,7 @@ func (p *project) tld(f *function, n *cc.InitDeclarator, sep string, staticLocal
t = &tld{}
t.name = p.tldScope.take(d.Name())
}
- p.functionSignature2(nil, d.Type(), t.name)
+ p.functionSignature2(n, nil, d.Type(), t.name)
}
}
return
@@ -4427,7 +4449,7 @@ func (p *project) functionDefinition(n *cc.FunctionDefinition) {
p.compoundStatement(f, n.CompoundStatement, "", false, false, 0)
p.pass1 = false
p.w("\n\n")
- p.functionDefinitionSignature(f, tld)
+ p.functionDefinitionSignature(n, f, tld)
if p.task.header && p.task.funcSig {
return
}
@@ -4532,7 +4554,7 @@ func (p *project) compoundStatement(f *function, n *cc.CompoundStatement, scomme
}
if n.Parent() == nil && r == nil && f.rt.Kind() != cc.Void {
p.w("\nreturn ")
- p.zeroValue(f.rt)
+ p.zeroValue(n, f.rt)
}
s := tidyComment("\n", &n.Token2)
p.w("%s", s)
@@ -4545,15 +4567,15 @@ func (p *project) compoundStatement(f *function, n *cc.CompoundStatement, scomme
f.block = sv
}
-func (p *project) zeroValue(t cc.Type) {
+func (p *project) zeroValue(n cc.Node, t cc.Type) {
if t.IsScalarType() {
- p.w("%s(0)", p.typ(nil, t))
+ p.w("%s(0)", p.typ(n, t))
return
}
switch t.Kind() {
case cc.Struct, cc.Union:
- p.w("%s{}", p.typ(nil, t))
+ p.w("%s{}", p.typ(n, t))
default:
panic(todo("", t, t.Kind()))
}
@@ -4596,6 +4618,8 @@ func (p *project) instrument(n cc.Node) {
}
}
+var dummyJumpStatement = &cc.JumpStatement{}
+
func (p *project) statement(f *function, n *cc.Statement, forceCompoundStmtBrace, forceNoBraces, switchBlock bool, mode exprMode) (r *cc.JumpStatement) {
if forceCompoundStmtBrace {
p.w(" {")
@@ -4618,7 +4642,8 @@ func (p *project) statement(f *function, n *cc.Statement, forceCompoundStmtBrace
if mode != 0 {
p.w("return ")
e := n.ExpressionStatement.Expression
- p.expression(f, e, e.Operand.Type(), exprValue, fOutermost)
+ p.expression(f, e, e.Operand.Type(), exprValue, 0)
+ r = dummyJumpStatement
break
}
@@ -4687,21 +4712,21 @@ func (p *project) jumpStatement(f *function, n *cc.JumpStatement) (r *cc.JumpSta
switch {
case f.rt != nil && f.rt.Kind() == cc.Void:
if n.Expression != nil {
- p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, fOutermost)
+ p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, 0)
p.w(";")
}
p.w("return")
case f.rt != nil && f.rt.Kind() != cc.Void:
if n.Expression != nil {
- p.expression(f, n.Expression, f.rt, exprCondReturn, fOutermost)
+ p.expression(f, n.Expression, f.rt, exprCondReturn, 0)
break
}
p.w("return ")
- p.zeroValue(f.rt)
+ p.zeroValue(n, f.rt)
default:
if n.Expression != nil {
- p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, fOutermost)
+ p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, 0)
p.w(";")
}
p.w("return")
@@ -4745,7 +4770,7 @@ func (p *project) expressionDecay(f *function, n *cc.Expression, t cc.Type, mode
p.w("func() uintptr {")
p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, flags)
p.w("; return ")
- p.assignmentExpression(f, n.AssignmentExpression, t, mode, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, t, mode, flags)
p.w("}()")
default:
panic(todo("%v: internal error: %v", n.Position(), n.Case))
@@ -4802,9 +4827,9 @@ func (p *project) expressionAddrOf(f *function, n *cc.Expression, t cc.Type, mod
p.assignmentExpression(f, n.AssignmentExpression, t, mode, flags)
case cc.ExpressionComma: // Expression ',' AssignmentExpression
p.w(" func() uintptr {")
- p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, flags|fOutermost)
+ p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, flags)
p.w("; return ")
- p.assignmentExpression(f, n.AssignmentExpression, t, mode, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, t, mode, flags)
p.w("}()")
default:
panic(todo("%v: internal error: %v", n.Position(), n.Case))
@@ -5084,12 +5109,10 @@ func (p *project) assignmentExpressionBool(f *function, n *cc.AssignmentExpressi
// case cc.AssignmentExpressionAnd: // UnaryExpression "&=" AssignmentExpression
// case cc.AssignmentExpressionXor: // UnaryExpression "^=" AssignmentExpression
// case cc.AssignmentExpressionOr: // UnaryExpression "|=" AssignmentExpression
- if flags&fOutermost == 0 {
- p.w("(")
- defer p.w(")")
- }
+ p.w("(")
+ defer p.w(")")
defer p.w(" != 0 ")
- p.assignmentExpression(f, n, t, exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n, t, exprValue, flags)
}
}
@@ -5152,9 +5175,9 @@ func (p *project) assignmentExpressionValueAssignStructAddrof(f *function, n *cc
if local.isPinned {
if !p.pass1 {
p.w("%sXmemmove(tls, ", p.task.crt)
- p.unaryExpression(f, n.UnaryExpression, lhs, exprAddrOf, flags|fOutermost)
+ p.unaryExpression(f, n.UnaryExpression, lhs, exprAddrOf, flags)
p.w(", ")
- p.assignmentExpression(f, n.AssignmentExpression, rhs, exprAddrOf, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, rhs, exprAddrOf, flags)
p.w(", %d)", lhs.Size())
return
}
@@ -5167,9 +5190,9 @@ func (p *project) assignmentExpressionValueAssignStructAddrof(f *function, n *cc
}
p.w("%sXmemmove(tls, ", p.task.crt)
- p.unaryExpression(f, n.UnaryExpression, lhs, exprAddrOf, flags|fOutermost)
+ p.unaryExpression(f, n.UnaryExpression, lhs, exprAddrOf, flags)
p.w(", ")
- p.assignmentExpression(f, n.AssignmentExpression, rhs, exprAddrOf, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, rhs, exprAddrOf, flags)
p.w(", %d)", lhs.Size())
}
@@ -5231,9 +5254,9 @@ func (p *project) assignmentExpressionValueAssignStruct(f *function, n *cc.Assig
}
p.w(" func() %s { __v := ", p.typ(n, lhs))
- p.assignmentExpression(f, n.AssignmentExpression, rhs, exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, rhs, exprValue, flags)
p.w(";")
- p.unaryExpression(f, n.UnaryExpression, lhs, exprLValue, flags|fOutermost)
+ p.unaryExpression(f, n.UnaryExpression, lhs, exprLValue, flags)
p.w(" = __v; return __v}()")
}
@@ -5249,7 +5272,7 @@ func (p *project) assignmentExpressionValueAssignBitfield(f *function, n *cc.Ass
p.w("%sAssignBitFieldPtr%d%s(", p.task.crt, bf.BitFieldBlockWidth(), p.bfHelperType(lt))
p.unaryExpression(f, lhs, lt, exprAddrOf, flags)
p.w(", ")
- p.assignmentExpression(f, n.AssignmentExpression, lt, exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, lt, exprValue, flags)
p.w(", %d, %d, %#x)", bf.BitFieldWidth(), bf.BitFieldOffset(), bf.Mask())
}
@@ -5265,13 +5288,13 @@ func (p *project) assignmentExpressionValueAssignNormal(f *function, n *cc.Assig
p.w("%sAssignPtr%s(", p.task.crt, p.helperType(d, d.Type()))
p.w("%s%s /* %s */", f.bpName, nonZeroUintptr(local.off), local.name)
p.w(", ")
- p.assignmentExpression(f, n.AssignmentExpression, n.UnaryExpression.Operand.Type(), exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, n.UnaryExpression.Operand.Type(), exprValue, flags)
return
}
defer p.w(")%s", p.convertType(n, d.Type(), t, flags))
p.w("%sAssign%s(&%s, ", p.task.crt, p.helperType(n, d.Type()), local.name)
- p.assignmentExpression(f, n.AssignmentExpression, n.UnaryExpression.Operand.Type(), exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, n.UnaryExpression.Operand.Type(), exprValue, flags)
return
}
}
@@ -5280,7 +5303,7 @@ func (p *project) assignmentExpressionValueAssignNormal(f *function, n *cc.Assig
p.w("%sAssignPtr%s(", p.task.crt, p.helperType(n, n.UnaryExpression.Operand.Type()))
p.unaryExpression(f, n.UnaryExpression, n.UnaryExpression.Operand.Type(), exprAddrOf, flags)
p.w(", ")
- p.assignmentExpression(f, n.AssignmentExpression, n.UnaryExpression.Operand.Type(), exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, n.UnaryExpression.Operand.Type(), exprValue, flags)
}
func (p *project) assignmentExpressionVoid(f *function, n *cc.AssignmentExpression, t cc.Type, mode exprMode, flags flags) {
@@ -5307,29 +5330,29 @@ func (p *project) assignmentExpressionVoid(f *function, n *cc.AssignmentExpressi
p.unaryExpression(f, lhs, lt, exprLValue, flags)
p.w(" = ")
}
- p.assignmentExpression(f, n.AssignmentExpression, lt, exprCondInit, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, lt, exprCondInit, flags)
p.w(";")
default:
if d != nil && p.isVolatileOrAtomic(d) {
- p.setVolatileDeclarator(d, f, n.AssignmentExpression, lt, mode, flags|fOutermost)
+ p.setVolatileDeclarator(d, f, n.AssignmentExpression, lt, mode, flags)
return
}
p.unaryExpression(f, lhs, lt, exprLValue, flags)
p.w(" = ")
- p.assignmentExpression(f, n.AssignmentExpression, lt, mode, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, lt, mode, flags)
}
case opBitfield:
bf := lt.BitField()
p.w("%sSetBitFieldPtr%d%s(", p.task.crt, bf.BitFieldBlockWidth(), p.bfHelperType(lt))
p.unaryExpression(f, lhs, lt, exprAddrOf, flags)
p.w(", ")
- p.assignmentExpression(f, n.AssignmentExpression, lt, exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, lt, exprValue, flags)
p.w(", %d, %#x)", bf.BitFieldOffset(), bf.Mask())
case opUnion:
p.unaryExpression(f, lhs, lt, exprLValue, flags)
p.w(" = ")
- p.assignmentExpression(f, n.AssignmentExpression, lt, exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, lt, exprValue, flags)
default:
panic(todo("", n.Position(), k))
}
@@ -5372,7 +5395,7 @@ func (p *project) setVolatileDeclarator(d *cc.Declarator, f *function, n *cc.Ass
if local := f.locals[d]; local != nil {
if local.isPinned {
p.w("%sAtomicStoreP%s(%s%s /* %s */, ", p.task.crt, p.helperType(n, d.Type()), f.bpName, nonZeroUintptr(local.off), local.name)
- p.assignmentExpression(f, n, t, mode, flags|fOutermost)
+ p.assignmentExpression(f, n, t, mode, flags)
p.w(")")
return
}
@@ -5522,11 +5545,11 @@ func (p *project) conditionalExpressionDecay(f *function, n *cc.ConditionalExpre
case cc.ConditionalExpressionCond: // LogicalOrExpression '?' Expression ':' ConditionalExpression
t = t.Decay()
p.w(" func() %s { if ", p.typ(n, t))
- p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags|fOutermost)
+ p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags)
p.w(" { return ")
switch n.Expression.Operand.Type().Kind() {
case cc.Array:
- p.expression(f, n.Expression, t, exprDecay, flags|fOutermost)
+ p.expression(f, n.Expression, t, exprDecay, flags)
case cc.Ptr:
panic(todo("", n.Expression.Position(), n.Expression.Operand.Type()))
default:
@@ -5535,9 +5558,9 @@ func (p *project) conditionalExpressionDecay(f *function, n *cc.ConditionalExpre
p.w("}; return ")
switch n.ConditionalExpression.Operand.Type().Kind() {
case cc.Array:
- p.conditionalExpression(f, n.ConditionalExpression, t, exprDecay, flags|fOutermost)
+ p.conditionalExpression(f, n.ConditionalExpression, t, exprDecay, flags)
default:
- p.conditionalExpression(f, n.ConditionalExpression, t, exprValue, flags|fOutermost)
+ p.conditionalExpression(f, n.ConditionalExpression, t, exprValue, flags)
}
p.w("}()")
default:
@@ -5553,11 +5576,11 @@ func (p *project) conditionalExpressionInit(f *function, n *cc.ConditionalExpres
case cc.ConditionalExpressionCond: // LogicalOrExpression '?' Expression ':' ConditionalExpression
t = t.Decay()
p.w("if ")
- p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags|fOutermost)
+ p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags)
p.w(" {")
- p.expression(f, n.Expression, t, mode, flags|fOutermost)
+ p.expression(f, n.Expression, t, mode, flags)
p.w("} else { ")
- p.conditionalExpression(f, n.ConditionalExpression, t, mode, flags|fOutermost)
+ p.conditionalExpression(f, n.ConditionalExpression, t, mode, flags)
p.w("}")
default:
panic(todo("%v: internal error: %v", n.Position(), n.Case))
@@ -5572,11 +5595,11 @@ func (p *project) conditionalExpressionReturn(f *function, n *cc.ConditionalExpr
case cc.ConditionalExpressionCond: // LogicalOrExpression '?' Expression ':' ConditionalExpression
t = t.Decay()
p.w("if ")
- p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags|fOutermost)
+ p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags)
p.w(" {")
- p.expression(f, n.Expression, t, mode, flags|fOutermost)
+ p.expression(f, n.Expression, t, mode, flags)
p.w("}; ")
- p.conditionalExpression(f, n.ConditionalExpression, t, mode, flags|fOutermost)
+ p.conditionalExpression(f, n.ConditionalExpression, t, mode, flags)
default:
panic(todo("%v: internal error: %v", n.Position(), n.Case))
}
@@ -5608,9 +5631,9 @@ func (p *project) conditionalExpressionFunc(f *function, n *cc.ConditionalExpres
}
p.w(" func() ")
- p.functionSignature(f, t, "")
+ p.functionSignature(n, f, t, "")
p.w("{ if ")
- p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags|fOutermost)
+ p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags)
p.w(" { return ")
switch d := n.Expression.Declarator(); {
case d != nil:
@@ -5660,12 +5683,10 @@ func (p *project) conditionalExpressionBool(f *function, n *cc.ConditionalExpres
case cc.ConditionalExpressionLOr: // LogicalOrExpression
p.logicalOrExpression(f, n.LogicalOrExpression, t, mode, flags)
case cc.ConditionalExpressionCond: // LogicalOrExpression '?' Expression ':' ConditionalExpression
- if flags&fOutermost == 0 {
- p.w("(")
- defer p.w(")")
- }
+ p.w("(")
+ defer p.w(")")
defer p.w(" != 0 ")
- p.conditionalExpression(f, n, t, exprValue, flags|fOutermost)
+ p.conditionalExpression(f, n, t, exprValue, flags)
default:
panic(todo("%v: internal error: %v", n.Position(), n.Case))
}
@@ -5678,11 +5699,11 @@ func (p *project) conditionalExpressionAddrOf(f *function, n *cc.ConditionalExpr
case cc.ConditionalExpressionCond: // LogicalOrExpression '?' Expression ':' ConditionalExpression
t = t.Decay()
p.w(" func() %s { if ", p.typ(n, t))
- p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags|fOutermost)
+ p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags)
p.w(" { return ")
- p.expression(f, n.Expression, t, exprValue, flags|fOutermost)
+ p.expression(f, n.Expression, t, exprValue, flags)
p.w("}; return ")
- p.conditionalExpression(f, n.ConditionalExpression, t, exprValue, flags|fOutermost)
+ p.conditionalExpression(f, n.ConditionalExpression, t, exprValue, flags)
p.w("}()")
default:
panic(todo("%v: internal error: %v", n.Position(), n.Case))
@@ -5697,17 +5718,17 @@ func (p *project) conditionalExpressionVoid(f *function, n *cc.ConditionalExpres
switch {
case n.Expression.IsSideEffectsFree:
p.w("if !(")
- p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags|fOutermost)
+ p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags)
p.w(") {")
- p.conditionalExpression(f, n.ConditionalExpression, n.ConditionalExpression.Operand.Type(), mode, flags|fOutermost)
+ p.conditionalExpression(f, n.ConditionalExpression, n.ConditionalExpression.Operand.Type(), mode, flags)
p.w("}")
default:
p.w("if ")
- p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags|fOutermost)
+ p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags)
p.w(" {")
- p.expression(f, n.Expression, n.Expression.Operand.Type(), mode, flags|fOutermost)
+ p.expression(f, n.Expression, n.Expression.Operand.Type(), mode, flags)
p.w("} else {")
- p.conditionalExpression(f, n.ConditionalExpression, n.ConditionalExpression.Operand.Type(), mode, flags|fOutermost)
+ p.conditionalExpression(f, n.ConditionalExpression, n.ConditionalExpression.Operand.Type(), mode, flags)
p.w("}")
}
default:
@@ -5722,11 +5743,11 @@ func (p *project) conditionalExpressionValue(f *function, n *cc.ConditionalExpre
case cc.ConditionalExpressionCond: // LogicalOrExpression '?' Expression ':' ConditionalExpression
t = t.Decay()
p.w(" func() %s { if ", p.typ(n, t))
- p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags|fOutermost)
+ p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags)
p.w(" { return ")
- p.expression(f, n.Expression, t, exprValue, flags|fOutermost)
+ p.expression(f, n.Expression, t, exprValue, flags)
p.w("}; return ")
- p.conditionalExpression(f, n.ConditionalExpression, t, exprValue, flags|fOutermost)
+ p.conditionalExpression(f, n.ConditionalExpression, t, exprValue, flags)
p.w("}()")
default:
panic(todo("%v: internal error: %v", n.Position(), n.Case))
@@ -5841,7 +5862,7 @@ func (p *project) logicalOrExpressionVoid(f *function, n *cc.LogicalOrExpression
p.logicalAndExpression(f, n.LogicalAndExpression, t, mode, flags)
case cc.LogicalOrExpressionLOr: // LogicalOrExpression "||" LogicalAndExpression
p.w("_ = ")
- p.logicalOrExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost)
+ p.logicalOrExpression(f, n, n.Operand.Type(), exprValue, flags)
default:
panic(todo("%v: internal error: %v", n.Position(), n.Case))
}
@@ -5870,7 +5891,6 @@ func (p *project) binaryLogicalOrExpression(f *function, n *cc.LogicalOrExpressi
}
func (p *project) binaryLogicalOrExpressionBool(f *function, n *cc.LogicalOrExpression, t cc.Type, mode exprMode, flags flags) {
- flags &^= fOutermost
defer p.w("%s", p.booleanBinaryExpression(n, n.Operand, n.Operand.Type(), &mode, flags))
p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags)
p.w(" ||%s", tidyComment(" ", &n.Token))
@@ -5878,7 +5898,6 @@ func (p *project) binaryLogicalOrExpressionBool(f *function, n *cc.LogicalOrExpr
}
func (p *project) binaryLogicalOrExpressionValue(f *function, n *cc.LogicalOrExpression, t cc.Type, mode exprMode, flags flags) {
- flags &^= fOutermost
defer p.w("%s", p.booleanBinaryExpression(n, n.Operand, t, &mode, flags))
p.logicalOrExpression(f, n.LogicalOrExpression, n.LogicalOrExpression.Operand.Type(), exprBool, flags)
p.w(" ||%s", tidyComment(" ", &n.Token))
@@ -5886,10 +5905,8 @@ func (p *project) binaryLogicalOrExpressionValue(f *function, n *cc.LogicalOrExp
}
func (p *project) booleanBinaryExpression(n cc.Node, from cc.Operand, to cc.Type, mode *exprMode, flags flags) (r string) {
- if flags&fOutermost == 0 {
- p.w("(")
- r = ")"
- }
+ p.w("(")
+ r = ")"
switch *mode {
case exprBool:
*mode = exprValue
@@ -6037,7 +6054,6 @@ func (p *project) binaryLogicalAndExpression(f *function, n *cc.LogicalAndExpres
}
func (p *project) binaryLogicalAndExpressionValue(f *function, n *cc.LogicalAndExpression, t cc.Type, mode exprMode, flags flags) {
- flags &^= fOutermost
defer p.w("%s", p.booleanBinaryExpression(n, n.Operand, t, &mode, flags))
p.logicalAndExpression(f, n.LogicalAndExpression, n.LogicalAndExpression.Operand.Type(), exprBool, flags)
p.w(" &&%s", tidyComment(" ", &n.Token))
@@ -6045,7 +6061,6 @@ func (p *project) binaryLogicalAndExpressionValue(f *function, n *cc.LogicalAndE
}
func (p *project) binaryLogicalAndExpressionBool(f *function, n *cc.LogicalAndExpression, t cc.Type, mode exprMode, flags flags) {
- flags &^= fOutermost
defer p.w("%s", p.booleanBinaryExpression(n, n.Operand, t, &mode, flags))
p.logicalAndExpression(f, n.LogicalAndExpression, n.LogicalAndExpression.Operand.Type(), exprBool, flags)
p.w(" &&%s", tidyComment(" ", &n.Token))
@@ -6160,7 +6175,7 @@ func (p *project) inclusiveOrExpressionVoid(f *function, n *cc.InclusiveOrExpres
p.exclusiveOrExpression(f, n.ExclusiveOrExpression, t, mode, flags)
case cc.InclusiveOrExpressionOr: // InclusiveOrExpression '|' ExclusiveOrExpression
p.w("_ = ")
- p.inclusiveOrExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost)
+ p.inclusiveOrExpression(f, n, n.Operand.Type(), exprValue, flags)
default:
panic(todo("%v: internal error: %v", n.Position(), n.Case))
}
@@ -6203,7 +6218,6 @@ func (p *project) binaryInclusiveOrExpressionValue(f *function, n *cc.InclusiveO
return
}
- flags &^= fOutermost
defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags))
switch {
case orOverflows(n.InclusiveOrExpression.Operand, n.ExclusiveOrExpression.Operand, n.Promote()):
@@ -6219,7 +6233,6 @@ func (p *project) binaryInclusiveOrExpressionValue(f *function, n *cc.InclusiveO
func (p *project) binaryOrExpressionUint128(f *function, n *cc.InclusiveOrExpression, t cc.Type, mode exprMode, flags flags) {
// InclusiveOrExpression '|' ExclusiveOrExpression
- flags |= fOutermost
defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags))
p.inclusiveOrExpression(f, n.InclusiveOrExpression, n.Promote(), exprValue, flags)
p.w(".Or(")
@@ -6228,7 +6241,6 @@ func (p *project) binaryOrExpressionUint128(f *function, n *cc.InclusiveOrExpres
}
func (p *project) binaryInclusiveOrExpressionBool(f *function, n *cc.InclusiveOrExpression, t cc.Type, mode exprMode, flags flags) {
- flags &^= fOutermost
defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags))
switch {
case orOverflows(n.InclusiveOrExpression.Operand, n.ExclusiveOrExpression.Operand, n.Promote()):
@@ -6252,10 +6264,8 @@ func orOverflows(lo, ro cc.Operand, promote cc.Type) bool {
}
func (p *project) artithmeticBinaryExpression(n cc.Node, from cc.Operand, to cc.Type, mode *exprMode, flags flags) (r string) {
- if flags&fOutermost == 0 {
- p.w("(")
- r = ")"
- }
+ p.w("(")
+ r = ")"
switch *mode {
case exprBool:
p.w("(")
@@ -6382,7 +6392,7 @@ func (p *project) exclusiveOrExpressionVoid(f *function, n *cc.ExclusiveOrExpres
p.andExpression(f, n.AndExpression, t, mode, flags)
case cc.ExclusiveOrExpressionXor: // ExclusiveOrExpression '^' AndExpression
p.w("_ = ")
- p.exclusiveOrExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost)
+ p.exclusiveOrExpression(f, n, n.Operand.Type(), exprValue, flags)
default:
panic(todo("%v: internal error: %v", n.Position(), n.Case))
}
@@ -6423,7 +6433,6 @@ func (p *project) binaryExclusiveOrExpressionValue(f *function, n *cc.ExclusiveO
return
}
- flags &^= fOutermost
defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags))
switch {
case xorOverflows(n.ExclusiveOrExpression.Operand, n.AndExpression.Operand, n.Promote()):
@@ -6439,7 +6448,6 @@ func (p *project) binaryExclusiveOrExpressionValue(f *function, n *cc.ExclusiveO
func (p *project) binaryExclusiveOrExpressionUint128(f *function, n *cc.ExclusiveOrExpression, t cc.Type, mode exprMode, flags flags) {
// ExclusiveOrExpression '^' AndExpression
- flags |= fOutermost
defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags))
p.exclusiveOrExpression(f, n.ExclusiveOrExpression, n.Promote(), exprValue, flags)
p.w(".Xor(")
@@ -6566,7 +6574,7 @@ func (p *project) andExpressionVoid(f *function, n *cc.AndExpression, t cc.Type,
p.equalityExpression(f, n.EqualityExpression, t, mode, flags)
case cc.AndExpressionAnd: // AndExpression '&' EqualityExpression
p.w("_ = ")
- p.andExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost)
+ p.andExpression(f, n, n.Operand.Type(), exprValue, flags)
default:
panic(todo("%v: internal error: %v", n.Position(), n.Case))
}
@@ -6596,7 +6604,6 @@ func (p *project) binaryAndExpression(f *function, n *cc.AndExpression, t cc.Typ
}
func (p *project) binaryAndExpressionBool(f *function, n *cc.AndExpression, t cc.Type, mode exprMode, flags flags) {
- flags &^= fOutermost
defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, n.Operand.Type(), &mode, flags))
switch {
case andOverflows(n.AndExpression.Operand, n.EqualityExpression.Operand, n.Promote()):
@@ -6624,7 +6631,6 @@ func (p *project) binaryAndExpressionValue(f *function, n *cc.AndExpression, t c
return
}
- flags &^= fOutermost
defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags))
switch {
case andOverflows(n.AndExpression.Operand, n.EqualityExpression.Operand, n.Promote()):
@@ -6640,7 +6646,6 @@ func (p *project) binaryAndExpressionValue(f *function, n *cc.AndExpression, t c
func (p *project) binaryAndExpressionUint128(f *function, n *cc.AndExpression, t cc.Type, mode exprMode, flags flags) {
// AndExpression '&' EqualityExpression
- flags |= fOutermost
defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags))
p.andExpression(f, n.AndExpression, n.Promote(), exprValue, flags)
p.w(".And(")
@@ -6781,7 +6786,7 @@ func (p *project) equalityExpressionVoid(f *function, n *cc.EqualityExpression,
// case cc.EqualityExpressionEq: // EqualityExpression "==" RelationalExpression
// case cc.EqualityExpressionNeq: // EqualityExpression "!=" RelationalExpression
p.w("_ = ")
- p.equalityExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost)
+ p.equalityExpression(f, n, n.Operand.Type(), exprValue, flags)
}
}
@@ -6810,7 +6815,6 @@ func (p *project) binaryEqualityExpression(f *function, n *cc.EqualityExpression
}
func (p *project) binaryEqualityExpressionBool(f *function, n *cc.EqualityExpression, oper string, t cc.Type, mode exprMode, flags flags) {
- flags &^= fOutermost
defer p.w("%s", p.booleanBinaryExpression(n, n.Operand, t, &mode, flags))
p.equalityExpression(f, n.EqualityExpression, n.Promote(), exprValue, flags)
p.w(" %s%s", oper, tidyComment(" ", &n.Token))
@@ -6818,7 +6822,6 @@ func (p *project) binaryEqualityExpressionBool(f *function, n *cc.EqualityExpres
}
func (p *project) binaryEqualityExpressionValue(f *function, n *cc.EqualityExpression, oper string, t cc.Type, mode exprMode, flags flags) {
- flags &^= fOutermost
defer p.w("%s", p.booleanBinaryExpression(n, n.Operand, t, &mode, flags))
p.equalityExpression(f, n.EqualityExpression, n.Promote(), exprValue, flags)
p.w(" %s%s", oper, tidyComment(" ", &n.Token))
@@ -6979,7 +6982,7 @@ func (p *project) relationalExpressionVoid(f *function, n *cc.RelationalExpressi
// case cc.RelationalExpressionLeq: // RelationalExpression "<=" ShiftExpression
// case cc.RelationalExpressionGeq: // RelationalExpression ">=" ShiftExpression
p.w("_ = ")
- p.relationalExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost)
+ p.relationalExpression(f, n, n.Operand.Type(), exprValue, flags)
}
}
@@ -7013,7 +7016,6 @@ func (p *project) binaryRelationalExpression(f *function, n *cc.RelationalExpres
return
}
- flags &^= fOutermost
defer p.w("%s", p.booleanBinaryExpression(n, n.Operand, t, &mode, flags))
p.relationalExpression(f, n.RelationalExpression, n.Promote(), exprValue, flags)
p.w(" %s%s", oper, tidyComment(" ", &n.Token))
@@ -7022,7 +7024,6 @@ func (p *project) binaryRelationalExpression(f *function, n *cc.RelationalExpres
func (p *project) binaryRelationalExpressionInt128(f *function, n *cc.RelationalExpression, oper string, t cc.Type, mode exprMode, flags flags) {
// RelationalExpression "<=" ShiftExpression
- flags |= fOutermost
defer p.w("%s", p.booleanBinaryExpression(n, n.Operand, t, &mode, flags))
p.relationalExpression(f, n.RelationalExpression, n.Promote(), exprValue, flags)
p.w(".Cmp(")
@@ -7189,7 +7190,6 @@ func (p *project) todo(n cc.Node, t cc.Type) {
}
func (p *project) binaryShiftExpressionBool(f *function, n *cc.ShiftExpression, oper string, t cc.Type, mode exprMode, flags flags) {
- flags &^= fOutermost
defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, n.Operand.Type(), &mode, flags))
switch {
case n.ShiftExpression.Operand.Type().IsBitFieldType():
@@ -7231,14 +7231,13 @@ func bfValueMask(bf cc.Field) uint64 {
func (p *project) binaryShiftExpressionValue(f *function, n *cc.ShiftExpression, oper string, t cc.Type, mode exprMode, flags flags) {
// ShiftExpression "<<" AdditiveExpression
- flags &^= fOutermost
defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags))
switch k := n.ShiftExpression.Operand.Type().Kind(); {
case k == cc.Int128, k == cc.UInt128:
p.w("(")
- p.shiftExpression(f, n.ShiftExpression, n.Operand.Type(), exprValue, flags|fOutermost)
+ p.shiftExpression(f, n.ShiftExpression, n.Operand.Type(), exprValue, flags)
p.w(").%s(", shiftOp(oper))
- p.additiveExpression(f, n.AdditiveExpression, p.intType, exprValue, flags|fOutermost)
+ p.additiveExpression(f, n.AdditiveExpression, p.intType, exprValue, flags)
p.w(")")
case n.ShiftExpression.Operand.Type().IsBitFieldType():
p.w("(")
@@ -7416,7 +7415,7 @@ func (p *project) additiveExpressionVoid(f *function, n *cc.AdditiveExpression,
cc.AdditiveExpressionSub: // AdditiveExpression '-' MultiplicativeExpression
p.w("_ = ")
- p.additiveExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost)
+ p.additiveExpression(f, n, n.Operand.Type(), exprValue, flags)
default:
panic(todo("%v: internal error: %v", n.Position(), n.Case))
}
@@ -7449,7 +7448,6 @@ func (p *project) binaryAdditiveExpression(f *function, n *cc.AdditiveExpression
func (p *project) binaryAdditiveExpressionBool(f *function, n *cc.AdditiveExpression, oper string, t cc.Type, mode exprMode, flags flags) {
// AdditiveExpression '+' MultiplicativeExpression
- flags &^= fOutermost
defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, n.Operand.Type(), &mode, flags))
lo := n.AdditiveExpression.Operand
ro := n.MultiplicativeExpression.Operand
@@ -7495,7 +7493,6 @@ func (p *project) binaryAdditiveExpressionValue(f *function, n *cc.AdditiveExpre
return
}
- flags &^= fOutermost
defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags))
lo := n.AdditiveExpression.Operand
ro := n.MultiplicativeExpression.Operand
@@ -7554,7 +7551,7 @@ func (p *project) binaryAdditiveExpressionValue(f *function, n *cc.AdditiveExpre
p.w("(")
p.additiveExpression(f, n.AdditiveExpression, lt, exprValue, flags)
p.w(" %s%s", oper, tidyComment(" ", &n.Token))
- p.multiplicativeExpression(f, n.MultiplicativeExpression, rt.Decay(), exprDecay, flags&^fOutermost)
+ p.multiplicativeExpression(f, n.MultiplicativeExpression, rt.Decay(), exprDecay, flags)
p.w(")/%d", lt.Elem().Size())
case lt.Kind() == cc.Array && rt.Kind() == cc.Ptr && oper == "-": // p - q
panic(todo("", p.pos(n)))
@@ -7567,7 +7564,6 @@ func (p *project) binaryAdditiveExpressionValue(f *function, n *cc.AdditiveExpre
func (p *project) binaryAdditiveExpressionUint128(f *function, n *cc.AdditiveExpression, oper string, t cc.Type, mode exprMode, flags flags) {
// AdditiveExpression '+' MultiplicativeExpression
- flags |= fOutermost
defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags))
p.additiveExpression(f, n.AdditiveExpression, n.Promote(), exprValue, flags)
switch oper {
@@ -7793,12 +7789,10 @@ func (p *project) multiplicativeExpressionBool(f *function, n *cc.Multiplicative
cc.MultiplicativeExpressionDiv, // MultiplicativeExpression '/' CastExpression
cc.MultiplicativeExpressionMod: // MultiplicativeExpression '%' CastExpression
- if flags&fOutermost == 0 {
- p.w("(")
- defer p.w(")")
- }
+ p.w("(")
+ defer p.w(")")
defer p.w(" != 0 ")
- p.multiplicativeExpression(f, n, t, exprValue, flags|fOutermost)
+ p.multiplicativeExpression(f, n, t, exprValue, flags)
default:
panic(todo("%v: internal error: %v", n.Position(), n.Case))
}
@@ -7873,7 +7867,6 @@ func (p *project) binaryMultiplicativeExpressionValue(f *function, n *cc.Multipl
return
}
- flags &^= fOutermost
defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags))
switch {
case intMulOverflows(n, n.Operand, n.MultiplicativeExpression.Operand, n.CastExpression.Operand, oper, n.Promote()):
@@ -7898,7 +7891,6 @@ func (p *project) binaryMultiplicativeExpressionValue(f *function, n *cc.Multipl
func (p *project) binaryMultiplicativeExpressionUint128(f *function, n *cc.MultiplicativeExpression, oper string, t cc.Type, mode exprMode, flags flags) {
// MultiplicativeExpression '*' CastExpression
- flags |= fOutermost
defer p.w("%s", p.artithmeticBinaryExpression(n, n.Operand, t, &mode, flags))
p.multiplicativeExpression(f, n.MultiplicativeExpression, n.Promote(), exprValue, flags)
switch oper {
@@ -8065,7 +8057,7 @@ func (p *project) castExpressionFunc(f *function, n *cc.CastExpression, t cc.Typ
switch et := ot.Elem(); et.Kind() {
case cc.Function, cc.Void:
p.w("(*(*")
- p.functionSignature(f, ft, "")
+ p.functionSignature(n, f, ft, "")
p.w(")(unsafe.Pointer(")
p.castExpression(f, n.CastExpression, ot, exprAddrOf, flags)
p.w(")))")
@@ -8107,12 +8099,10 @@ func (p *project) castExpressionBool(f *function, n *cc.CastExpression, t cc.Typ
case cc.CastExpressionUnary: // UnaryExpression
p.unaryExpression(f, n.UnaryExpression, t, mode, flags)
case cc.CastExpressionCast: // '(' TypeName ')' CastExpression
- if flags&fOutermost == 0 {
- p.w("(")
- defer p.w(")")
- }
+ p.w("(")
+ defer p.w(")")
defer p.w(" != 0 ")
- p.castExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost)
+ p.castExpression(f, n, n.Operand.Type(), exprValue, flags)
default:
panic(todo("%v: internal error: %v", n.Position(), n.Case))
}
@@ -8212,7 +8202,7 @@ func (p *project) castExpressionValueNormal(f *function, n *cc.CastExpression, t
panic(todo("", p.pos(n)))
case isNegativeInt(op) && isUnsigned(t):
defer p.w("%s", p.convertType(n, tn, t, flags|fForceConv))
- p.castExpression(f, n.CastExpression, tn, exprValue, flags|fOutermost)
+ p.castExpression(f, n.CastExpression, tn, exprValue, flags)
default:
defer p.w("%s", p.convertType(n, tn, t, flags))
p.castExpression(f, n.CastExpression, tn, exprValue, flags)
@@ -8494,15 +8484,13 @@ func (p *project) unaryExpressionBool(f *function, n *cc.UnaryExpression, t cc.T
p.postfixExpression(f, n.PostfixExpression, t, mode, flags)
case cc.UnaryExpressionNot: // '!' CastExpression
p.w("!(")
- p.castExpression(f, n.CastExpression, t, mode, flags|fOutermost)
+ p.castExpression(f, n.CastExpression, t, mode, flags)
p.w(")")
default:
- if flags&fOutermost == 0 {
- p.w("(")
- defer p.w(")")
- }
+ p.w("(")
+ defer p.w(")")
defer p.w(" != 0 ")
- p.unaryExpression(f, n, t, exprValue, flags|fOutermost)
+ p.unaryExpression(f, n, t, exprValue, flags)
}
}
@@ -8575,11 +8563,11 @@ func (p *project) unaryExpressionVoid(f *function, n *cc.UnaryExpression, t cc.T
case n.CastExpression.Operand.Type().Kind() == cc.Array:
panic(todo("", p.pos(n)))
default:
- p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprAddrOf, flags|fOutermost)
+ p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprAddrOf, flags)
}
case cc.UnaryExpressionDeref: // '*' CastExpression
p.w("_ = *(*byte)(unsafe.Pointer(")
- p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags|fOutermost)
+ p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags)
p.w("))")
case
cc.UnaryExpressionPlus, // '+' CastExpression
@@ -8588,8 +8576,8 @@ func (p *project) unaryExpressionVoid(f *function, n *cc.UnaryExpression, t cc.T
cc.UnaryExpressionCpl: // '~' CastExpression
p.w("_ = ")
- defer p.w("%s", p.convert(n, n.CastExpression.Operand, p.intType, flags|fOutermost))
- p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags|fOutermost)
+ defer p.w("%s", p.convert(n, n.CastExpression.Operand, p.intType, flags))
+ p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags)
case cc.UnaryExpressionSizeofExpr: // "sizeof" UnaryExpression
// nop
case cc.UnaryExpressionSizeofType: // "sizeof" '(' TypeName ')'
@@ -8625,7 +8613,7 @@ func (p *project) unaryExpressionValue(f *function, n *cc.UnaryExpression, t cc.
case n.CastExpression.Operand.Type().Kind() == cc.Array:
panic(todo("", p.pos(n)))
default:
- p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprAddrOf, flags&^fOutermost)
+ p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprAddrOf, flags)
}
case cc.UnaryExpressionDeref: // '*' CastExpression
ot := n.CastExpression.Operand.Type()
@@ -8682,7 +8670,7 @@ func (p *project) unaryExpressionValue(f *function, n *cc.UnaryExpression, t cc.
p.castExpression(f, n.CastExpression, n.Operand.Type(), exprValue, flags|fForceRuntimeConv)
default:
p.w("%sCpl%s(", p.task.crt, p.helperType(n, n.Operand.Type()))
- p.castExpression(f, n.CastExpression, n.Operand.Type(), exprValue, flags|fOutermost)
+ p.castExpression(f, n.CastExpression, n.Operand.Type(), exprValue, flags)
p.w(")")
}
default:
@@ -8691,9 +8679,10 @@ func (p *project) unaryExpressionValue(f *function, n *cc.UnaryExpression, t cc.
}
case cc.UnaryExpressionNot: // '!' CastExpression
p.w("%sBool%s(!(", p.task.crt, p.helperType(n, t))
- p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprBool, flags|fOutermost)
+ p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprBool, flags)
p.w("))")
case cc.UnaryExpressionSizeofExpr: // "sizeof" UnaryExpression
+ p.checkSizeof(n.UnaryExpression, n.UnaryExpression.Operand.Type())
defer p.w("%s", p.convertNil(n, t, flags))
if d := n.UnaryExpression.Declarator(); d != nil {
var isLocal bool
@@ -8747,6 +8736,7 @@ func (p *project) unaryExpressionValue(f *function, n *cc.UnaryExpression, t cc.
case cc.UnaryExpressionSizeofType: // "sizeof" '(' TypeName ')'
defer p.w("%s", p.convertNil(n, t, flags))
t := n.TypeName.Type()
+ p.checkSizeof(n.TypeName, t)
if t.Kind() == cc.Array {
p.w("%d", t.Len()*t.Elem().Size())
break
@@ -8829,6 +8819,27 @@ func (p *project) unaryExpressionValue(f *function, n *cc.UnaryExpression, t cc.
}
}
+func (p *project) checkSizeof(n cc.Node, t cc.Type) {
+ if !p.checkSizeof0(n, t) {
+ p.err(n, "sizeof type %s: not supported", t.Alias())
+ }
+}
+
+func (p *project) checkSizeof0(n cc.Node, t cc.Type) (ok bool) {
+ switch t.Kind() {
+ case cc.Array:
+ return !t.IsVLA()
+ case cc.Struct, cc.Union:
+ nf := t.NumField()
+ for i := []int{0}; i[0] < nf; i[0]++ {
+ if !p.checkSizeof0(n, t.FieldByIndex(i).Type()) {
+ return false
+ }
+ }
+ }
+ return true
+}
+
func (p *project) unaryExpressionLValue(f *function, n *cc.UnaryExpression, t cc.Type, mode exprMode, flags flags) {
switch n.Case {
case cc.UnaryExpressionPostfix: // PostfixExpression
@@ -9043,12 +9054,10 @@ func (p *project) unaryExpressionDeref(f *function, n *cc.UnaryExpression, t cc.
func (p *project) unaryExpressionDerefBool(f *function, n *cc.UnaryExpression, t cc.Type, mode exprMode, flags flags) {
// '*' CastExpression
- if flags&fOutermost == 0 {
- p.w("(")
- defer p.w(")")
- }
+ p.w("(")
+ defer p.w(")")
p.w("*(*%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type()))
- p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags|fOutermost)
+ p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags)
p.w(")) != 0")
}
@@ -9075,13 +9084,13 @@ func (p *project) unaryExpressionDerefLValue(f *function, n *cc.UnaryExpression,
func (p *project) unaryExpressionDerefLValueArray(f *function, n *cc.UnaryExpression, t cc.Type, mode exprMode, flags flags) {
defer p.w("))%s", p.convertType(n, n.CastExpression.Operand.Type().Elem(), t, flags))
p.w("*(*%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type()))
- p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags|fOutermost)
+ p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags)
}
func (p *project) unaryExpressionDerefLValueNormal(f *function, n *cc.UnaryExpression, t cc.Type, mode exprMode, flags flags) {
defer p.w("))%s", p.convertType(n, n.CastExpression.Operand.Type().Elem(), t, flags))
p.w("*(*%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type()))
- p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags|fOutermost)
+ p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags)
}
func (p *project) unaryExpressionDerefValue(f *function, n *cc.UnaryExpression, t cc.Type, mode exprMode, flags flags) {
@@ -9098,7 +9107,7 @@ func (p *project) unaryExpressionDerefValue(f *function, n *cc.UnaryExpression,
func (p *project) unaryExpressionDerefValueArray(f *function, n *cc.UnaryExpression, t cc.Type, mode exprMode, flags flags) {
defer p.w("%s", p.convertType(n, n.CastExpression.Operand.Type().Elem(), t, flags))
- p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags|fOutermost)
+ p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), exprValue, flags)
p.w("[0]")
}
@@ -9110,7 +9119,7 @@ func (p *project) unaryExpressionDerefValueNormal(f *function, n *cc.UnaryExpres
default:
defer p.w("))%s", p.convertType(n, n.CastExpression.Operand.Type().Elem(), t, flags))
p.w("*(*%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type()))
- p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), mode, flags|fOutermost)
+ p.castExpression(f, n.CastExpression, n.CastExpression.Operand.Type(), mode, flags)
}
}
@@ -9149,14 +9158,14 @@ func (p *project) postfixExpressionDecay(f *function, n *cc.PostfixExpression, t
p.w("(")
switch {
case pe.Kind() == cc.Array:
- p.postfixExpression(f, n.PostfixExpression, pe, exprDecay, flags&^fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprDecay, flags)
case pe.Kind() == cc.Ptr:
- p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags&^fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags)
default:
panic(todo("", p.pos(n)))
}
if !n.Expression.Operand.IsZero() {
- p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand)
+ p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand)
if sz := pe.Elem().Size(); sz != 1 {
p.w("*%d", sz)
}
@@ -9188,40 +9197,30 @@ func (p *project) postfixExpressionBool(f *function, n *cc.PostfixExpression, t
case cc.PostfixExpressionPrimary: // PrimaryExpression
p.primaryExpression(f, n.PrimaryExpression, t, mode, flags)
case cc.PostfixExpressionIndex: // PostfixExpression '[' Expression ']'
- if flags&fOutermost == 0 {
- p.w("(")
- defer p.w(")")
- }
+ p.w("(")
+ defer p.w(")")
defer p.w(" != 0")
p.postfixExpression(f, n, t, exprValue, flags)
case cc.PostfixExpressionCall: // PostfixExpression '(' ArgumentExpressionList ')'
p.postfixExpressionCall(f, n, t, mode, flags)
case cc.PostfixExpressionSelect: // PostfixExpression '.' IDENTIFIER
- if flags&fOutermost == 0 {
- p.w("(")
- defer p.w(")")
- }
+ p.w("(")
+ defer p.w(")")
defer p.w(" != 0")
p.postfixExpression(f, n, t, exprValue, flags)
case cc.PostfixExpressionPSelect: // PostfixExpression "->" IDENTIFIER
- if flags&fOutermost == 0 {
- p.w("(")
- defer p.w(")")
- }
+ p.w("(")
+ defer p.w(")")
defer p.w(" != 0")
p.postfixExpression(f, n, t, exprValue, flags)
case cc.PostfixExpressionInc: // PostfixExpression "++"
- if flags&fOutermost == 0 {
- p.w("(")
- defer p.w(")")
- }
+ p.w("(")
+ defer p.w(")")
defer p.w(" != 0")
p.postfixExpression(f, n, t, exprValue, flags)
case cc.PostfixExpressionDec: // PostfixExpression "--"
- if flags&fOutermost == 0 {
- p.w("(")
- defer p.w(")")
- }
+ p.w("(")
+ defer p.w(")")
defer p.w(" != 0")
p.postfixExpression(f, n, t, exprValue, flags)
case cc.PostfixExpressionComplit: // '(' TypeName ')' '{' InitializerList ',' '}'
@@ -9229,10 +9228,8 @@ func (p *project) postfixExpressionBool(f *function, n *cc.PostfixExpression, t
case cc.PostfixExpressionTypeCmp: // "__builtin_types_compatible_p" '(' TypeName ',' TypeName ')'
panic(todo("", p.pos(n)))
case cc.PostfixExpressionChooseExpr:
- if flags&fOutermost == 0 {
- p.w("(")
- defer p.w(")")
- }
+ p.w("(")
+ defer p.w(")")
defer p.w(" != 0")
p.postfixExpression(f, n, t, exprValue, flags)
default:
@@ -9350,28 +9347,24 @@ func (p *project) postfixExpressionPSelectIndexNormal(f *function, n *cc.Postfix
case n.Operand.Type().Kind() == cc.Array:
panic(todo("", p.pos(n)))
case pe.Kind() == cc.Array:
- if flags&fOutermost == 0 {
- p.w("(")
- defer p.w(")")
- }
+ p.w("(")
+ defer p.w(")")
p.w("(*(**%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type().Elem()))
- p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags|fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags)
if !n.Expression.Operand.IsZero() {
- p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand)
+ p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand)
if sz := pe.Decay().Elem().Size(); sz != 1 {
p.w("*%d", sz)
}
}
p.w(")))")
default:
- if flags&fOutermost == 0 {
- p.w("(")
- defer p.w(")")
- }
+ p.w("(")
+ defer p.w(")")
p.w("(*(**%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type().Elem()))
- p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags|fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags)
if !n.Expression.Operand.IsZero() {
- p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand)
+ p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand)
if sz := pe.Decay().Elem().Size(); sz != 1 {
p.w("*%d", sz)
}
@@ -9467,7 +9460,7 @@ func (p *project) postfixExpressionSelectPSelectUnion(f *function, n *cc.Postfix
pe := n.PostfixExpression.Operand.Type()
defer p.w("%s", p.convert(n, n.Operand, t, flags))
p.w("(*%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type()))
- p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags|fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags)
p.w("))")
}
}
@@ -9533,7 +9526,7 @@ func (p *project) postfixExpressionSelectSelectStruct(f *function, n *cc.Postfix
p.err(&n.Token2, "internal error, wrong function for accessing a bit field: %s", n.Token2.Value)
}
pe := n.PostfixExpression.Operand.Type()
- p.postfixExpression(f, n.PostfixExpression, pe, exprSelect, flags&^fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprSelect, flags)
p.w(".%s", p.fieldName(n, n.Token2.Value))
}
}
@@ -9556,7 +9549,7 @@ func (p *project) postfixExpressionSelectSelectUnion(f *function, n *cc.PostfixE
pe := n.PostfixExpression.Operand.Type()
defer p.w("%s", p.convert(n, n.Operand, t, flags))
p.w("(*%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type()))
- p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags|fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags)
p.w("))")
}
}
@@ -9585,9 +9578,9 @@ func (p *project) postfixExpressionSelectIndexArrayParamater(f *function, n *cc.
panic(todo("", p.pos(n)))
default:
p.w("(*%s)(unsafe.Pointer(", p.typ(n, pe.Elem()))
- p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags&^fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags)
if !n.Expression.Operand.IsZero() {
- p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand)
+ p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand)
if sz := pe.Decay().Elem().Size(); sz != 1 {
p.w("*%d", sz)
}
@@ -9606,9 +9599,9 @@ func (p *project) postfixExpressionSelectIndexNormal(f *function, n *cc.PostfixE
panic(todo("", p.pos(n)))
case pe.Kind() != cc.Ptr:
p.w("(*%s)(unsafe.Pointer(", p.typ(n, pe.Elem()))
- p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags&^fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags)
if !n.Expression.Operand.IsZero() {
- p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand)
+ p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand)
if sz := pe.Decay().Elem().Size(); sz != 1 {
p.w("*%d", sz)
}
@@ -9616,9 +9609,9 @@ func (p *project) postfixExpressionSelectIndexNormal(f *function, n *cc.PostfixE
p.w("))")
default:
p.w("(*%s)(unsafe.Pointer(", p.typ(n, pe.Elem()))
- p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags&^fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags)
if !n.Expression.Operand.IsZero() {
- p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand)
+ p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand)
if sz := pe.Decay().Elem().Size(); sz != 1 {
p.w("*%d", sz)
}
@@ -9636,9 +9629,9 @@ func (p *project) postfixExpressionSelectIndexArray(f *function, n *cc.PostfixEx
panic(todo("", p.pos(n)))
default:
pe := n.PostfixExpression.Operand.Type()
- p.postfixExpression(f, n.PostfixExpression, pe, mode, flags&^fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, mode, flags)
p.w("[")
- p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost)
+ p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags)
p.w("]")
}
}
@@ -9722,35 +9715,30 @@ func (p *project) postfixExpressionAddrOf(f *function, n *cc.PostfixExpression,
func (p *project) postfixExpressionAddrOfPSelect(f *function, n *cc.PostfixExpression, t cc.Type, mode exprMode, flags flags) {
// PostfixExpression "->" IDENTIFIER
- if flags&fOutermost == 0 {
- p.w("(")
- defer p.w(")")
- }
+ p.w("(")
+ defer p.w(")")
pe := n.PostfixExpression.Operand.Type()
switch {
case n.Operand.Type().IsBitFieldType():
- p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags|fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags)
p.bitFldOff(pe.Elem(), n.Token2)
case pe.Kind() == cc.Array:
- p.postfixExpression(f, n.PostfixExpression, pe, exprDecay, flags|fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprDecay, flags)
p.fldOff(pe.Elem(), n.Token2)
default:
- p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags|fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags)
p.fldOff(pe.Elem(), n.Token2)
}
}
func (p *project) postfixExpressionAddrOfIndex(f *function, n *cc.PostfixExpression, t cc.Type, mode exprMode, flags flags) {
// PostfixExpression '[' Expression ']'
- if flags&fOutermost == 0 {
- p.w("(")
- defer p.w(")")
- }
+ p.w("(")
+ defer p.w(")")
switch {
case n.Operand.Type().Kind() == cc.Array:
fallthrough
default:
- flags &^= fOutermost
pe := n.PostfixExpression.Operand.Type()
d := n.PostfixExpression.Declarator()
switch {
@@ -9772,20 +9760,18 @@ func (p *project) postfixExpressionAddrOfIndex(f *function, n *cc.PostfixExpress
func (p *project) postfixExpressionAddrOfSelect(f *function, n *cc.PostfixExpression, t cc.Type, mode exprMode, flags flags) {
// PostfixExpression '.' IDENTIFIER
- if flags&fOutermost == 0 {
- p.w("(")
- defer p.w(")")
- }
+ p.w("(")
+ defer p.w(")")
switch {
case n.Operand.Type().IsBitFieldType():
pe := n.PostfixExpression.Operand.Type()
- p.postfixExpression(f, n.PostfixExpression, nil, mode, flags|fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, nil, mode, flags)
p.bitFldOff(pe, n.Token2)
case n.Operand.Type().Kind() == cc.Array:
fallthrough
default:
pe := n.PostfixExpression.Operand.Type()
- p.postfixExpression(f, n.PostfixExpression, nil, mode, flags|fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, nil, mode, flags)
p.fldOff(pe, n.Token2)
}
}
@@ -9799,11 +9785,9 @@ func (p *project) postfixExpressionFunc(f *function, n *cc.PostfixExpression, t
case cc.Ptr:
switch et := n.Operand.Type().Elem(); et.Kind() {
case cc.Function:
- p.w("(*(*")
- p.functionSignature(f, n.Operand.Type().Elem(), "")
- p.w(")(unsafe.Pointer(")
- p.postfixExpression(f, n, n.Operand.Type(), exprAddrOf, flags)
- p.w(")))")
+ p.fnVal(n, f, func() {
+ p.postfixExpression(f, n, n.Operand.Type(), exprValue, flags)
+ }, nil, n.Operand.Type(), 0, mode, flags)
default:
panic(todo("", p.pos(n), et, et.Kind()))
}
@@ -9815,11 +9799,9 @@ func (p *project) postfixExpressionFunc(f *function, n *cc.PostfixExpression, t
case cc.Ptr:
switch et := n.Operand.Type().Elem(); et.Kind() {
case cc.Function:
- p.w("(*(*")
- p.functionSignature(f, n.Operand.Type().Elem(), "")
- p.w(")(unsafe.Pointer(")
- p.postfixExpressionCall(f, n, t, exprValue, flags)
- p.w(")))")
+ p.fnVal(n, f, func() {
+ p.postfixExpressionCall(f, n, t, exprValue, flags)
+ }, nil, n.Operand.Type(), 0, mode, flags)
default:
panic(todo("", p.pos(n), et, et.Kind()))
}
@@ -9866,15 +9848,15 @@ func (p *project) postfixExpressionVoid(f *function, n *cc.PostfixExpression, t
p.primaryExpression(f, n.PrimaryExpression, t, mode, flags)
case cc.PostfixExpressionIndex: // PostfixExpression '[' Expression ']'
p.w("_ = ")
- p.postfixExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost)
+ p.postfixExpression(f, n, n.Operand.Type(), exprValue, flags)
case cc.PostfixExpressionCall: // PostfixExpression '(' ArgumentExpressionList ')'
p.postfixExpressionCall(f, n, n.Operand.Type(), mode, flags)
case cc.PostfixExpressionSelect: // PostfixExpression '.' IDENTIFIER
p.w("_ = ")
- p.postfixExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost)
+ p.postfixExpression(f, n, n.Operand.Type(), exprValue, flags)
case cc.PostfixExpressionPSelect: // PostfixExpression "->" IDENTIFIER
p.w("_ = ")
- p.postfixExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost)
+ p.postfixExpression(f, n, n.Operand.Type(), exprValue, flags)
case cc.PostfixExpressionInc: // PostfixExpression "++"
p.postfixExpressionIncDec(f, n, "++", "+=", t, mode, flags)
case cc.PostfixExpressionDec: // PostfixExpression "--"
@@ -10178,13 +10160,11 @@ func (p *project) postfixExpressionValueIndexArrayParameter(f *function, n *cc.P
switch {
case n.Operand.Type().Kind() == cc.Array:
defer p.w("%s", p.convert(n, n.Operand, t, flags))
- if flags&fOutermost == 0 {
- p.w("(")
- defer p.w(")")
- }
- p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags|fOutermost)
+ p.w("(")
+ defer p.w(")")
+ p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags)
if !n.Expression.Operand.IsZero() {
- p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand)
+ p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand)
if sz := pe.Elem().Size(); sz != 1 {
p.w("*%d", sz)
}
@@ -10192,9 +10172,9 @@ func (p *project) postfixExpressionValueIndexArrayParameter(f *function, n *cc.P
default:
defer p.w("%s", p.convert(n, n.Operand, t, flags))
p.w("*(*%s)(unsafe.Pointer(", p.typ(n, pe.Elem()))
- p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags&^fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags)
if !n.Expression.Operand.IsZero() {
- p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand)
+ p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand)
if sz := pe.Elem().Size(); sz != 1 {
p.w("*%d", sz)
}
@@ -10207,15 +10187,13 @@ func (p *project) postfixExpressionValueIndexNormal(f *function, n *cc.PostfixEx
// PostfixExpression '[' Expression ']'
switch {
case n.Operand.Type().Kind() == cc.Array:
- if flags&fOutermost == 0 {
- p.w("(")
- defer p.w(")")
- }
+ p.w("(")
+ defer p.w(")")
pe := n.PostfixExpression.Operand.Type()
defer p.w("%s", p.convert(n, n.Operand, t, flags))
- p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags|fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags)
if !n.Expression.Operand.IsZero() {
- p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand)
+ p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand)
if sz := pe.Elem().Size(); sz != 1 {
p.w("*%d", sz)
}
@@ -10225,9 +10203,9 @@ func (p *project) postfixExpressionValueIndexNormal(f *function, n *cc.PostfixEx
case cc.Ptr:
defer p.w("%s", p.convert(n, n.Operand, t, flags))
p.w("*(*%s)(unsafe.Pointer(", p.typ(n, pe.Elem()))
- p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags&^fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags)
if !n.Expression.Operand.IsZero() {
- p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand)
+ p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand)
if sz := pe.Elem().Size(); sz != 1 {
p.w("*%d", sz)
}
@@ -10236,9 +10214,9 @@ func (p *project) postfixExpressionValueIndexNormal(f *function, n *cc.PostfixEx
case cc.Array:
defer p.w("%s", p.convert(n, n.Operand, t, flags))
p.w("*(*%s)(unsafe.Pointer(", p.typ(n, pe.Elem()))
- p.postfixExpression(f, n.PostfixExpression, pe, exprDecay, flags&^fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprDecay, flags)
if !n.Expression.Operand.IsZero() {
- p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand)
+ p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand)
if sz := pe.Elem().Size(); sz != 1 {
p.w("*%d", sz)
}
@@ -10256,22 +10234,20 @@ func (p *project) postfixExpressionValueIndexArray(f *function, n *cc.PostfixExp
switch n.Operand.Type().Kind() {
case cc.Array:
defer p.w("%s", p.convert(n, n.Operand, t, flags))
- if flags&fOutermost == 0 {
- p.w("(")
- defer p.w(")")
- }
- p.postfixExpression(f, n.PostfixExpression, pe, exprDecay, flags|fOutermost)
+ p.w("(")
+ defer p.w(")")
+ p.postfixExpression(f, n.PostfixExpression, pe, exprDecay, flags)
if !n.Expression.Operand.IsZero() {
- p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand)
+ p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand)
if sz := pe.Elem().Size(); sz != 1 {
p.w("*%d", sz)
}
}
default:
defer p.w("%s", p.convert(n, n.Operand, t, flags))
- p.postfixExpression(f, n.PostfixExpression, pe, mode, flags&^fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, mode, flags)
p.w("[")
- p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost)
+ p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags)
p.w("]")
}
}
@@ -10305,14 +10281,14 @@ func (p *project) postfixExpressionValueSelectUnion(f *function, n *cc.PostfixEx
p.w("<<%d>>%[1]d", int(fld.Promote().Size()*8)-fld.BitFieldWidth())
}
case n.Operand.Type().Kind() == cc.Array:
- p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags|fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags)
default:
if fld.IsBitField() {
p.err(&n.Token2, "internal error, wrong function for accessing a bit field: %s", n.Token2.Value)
}
defer p.w("%s", p.convert(n, n.Operand, t, flags))
p.w("*(*%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type()))
- p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags|fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags)
p.w("))")
}
}
@@ -10346,7 +10322,7 @@ func (p *project) postfixExpressionValueSelectStruct(f *function, n *cc.PostfixE
p.err(&n.Token2, "internal error, wrong function for accessing a bit field: %s", n.Token2.Value)
}
defer p.w("%s", p.convert(n, n.Operand, t, flags))
- p.postfixExpression(f, n.PostfixExpression, pe, exprSelect, flags&^fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprSelect, flags)
p.w(".%s", p.fieldName(n, n.Token2.Value))
}
}
@@ -10389,7 +10365,7 @@ func (p *project) postfixExpressionLValuePSelect(f *function, n *cc.PostfixExpre
}
p.w("*(*%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type()))
- p.postfixExpression(f, pe, pe.Operand.Type(), exprValue, flags|fOutermost)
+ p.postfixExpression(f, pe, pe.Operand.Type(), exprValue, flags)
p.fldOff(pe.Operand.Type().Elem(), n.Token2)
p.w("))")
case opUnion:
@@ -10463,9 +10439,9 @@ func (p *project) postfixExpressionLValueIndexArrayParameter(f *function, n *cc.
defer p.w("%s", p.convert(n, n.Operand, t, flags))
pe := n.PostfixExpression.Operand.Type()
p.w("*(*%s)(unsafe.Pointer(", p.typ(n, pe.Elem()))
- p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags&^fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags)
if !n.Expression.Operand.IsZero() {
- p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand)
+ p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand)
if sz := pe.Elem().Size(); sz != 1 {
p.w("*%d", sz)
}
@@ -10483,9 +10459,9 @@ func (p *project) postfixExpressionLValueIndexNormal(f *function, n *cc.PostfixE
case cc.Ptr:
defer p.w("%s", p.convert(n, n.Operand, t, flags))
p.w("*(*%s)(unsafe.Pointer(", p.typ(n, pe.Elem()))
- p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags&^fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprValue, flags)
if !n.Expression.Operand.IsZero() {
- p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand)
+ p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand)
if sz := pe.Elem().Size(); sz != 1 {
p.w("*%d", sz)
}
@@ -10494,9 +10470,9 @@ func (p *project) postfixExpressionLValueIndexNormal(f *function, n *cc.PostfixE
case cc.Array:
defer p.w("%s", p.convert(n, n.Operand, t, flags))
p.w("*(*%s)(unsafe.Pointer(", p.typ(n, pe.Elem()))
- p.postfixExpression(f, n.PostfixExpression, pe, exprDecay, flags&^fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprDecay, flags)
if !n.Expression.Operand.IsZero() {
- p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost) }, n.Expression.Operand)
+ p.nzUintptr(n, func() { p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags) }, n.Expression.Operand)
if sz := pe.Elem().Size(); sz != 1 {
p.w("*%d", sz)
}
@@ -10511,9 +10487,9 @@ func (p *project) postfixExpressionLValueIndexNormal(f *function, n *cc.PostfixE
func (p *project) postfixExpressionLValueIndexArray(f *function, n *cc.PostfixExpression, t cc.Type, mode exprMode, flags flags) {
// PostfixExpression '[' Expression ']'
pe := n.PostfixExpression.Operand.Type()
- p.postfixExpression(f, n.PostfixExpression, pe, mode, flags&^fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, mode, flags)
p.w("[")
- p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags|fOutermost)
+ p.expression(f, n.Expression, n.Expression.Operand.Type(), exprValue, flags)
p.w("]")
}
@@ -10528,7 +10504,7 @@ func (p *project) postfixExpressionLValueSelect(f *function, n *cc.PostfixExpres
}
p.w("*(*%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type()))
- p.postfixExpression(f, pe, pe.Operand.Type(), exprAddrOf, flags|fOutermost)
+ p.postfixExpression(f, pe, pe.Operand.Type(), exprAddrOf, flags)
p.fldOff(pe.Operand.Type(), n.Token2)
p.w("))")
case opUnion:
@@ -10561,7 +10537,7 @@ func (p *project) postfixExpressionLValueSelectUnion(f *function, n *cc.PostfixE
p.err(&n.Token2, "internal error, wrong function for accessing a bit field: %s", n.Token2.Value)
}
p.w("*(*%s)(unsafe.Pointer(", p.typ(n, n.Operand.Type()))
- p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags|fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprAddrOf, flags)
nonZeroUintptr(fld.Offset())
p.w("))")
}
@@ -10578,7 +10554,7 @@ func (p *project) postfixExpressionLValueSelectStruct(f *function, n *cc.Postfix
p.err(&n.Token2, "internal error, wrong function for accessing a bit field: %s", n.Token2.Value)
}
pe := n.PostfixExpression.Operand.Type()
- p.postfixExpression(f, n.PostfixExpression, pe, exprSelect, flags&^fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, pe, exprSelect, flags)
p.w(".%s", p.fieldName(n, n.Token2.Value))
}
}
@@ -10836,10 +10812,8 @@ func (p *project) postfixExpressionCall(f *function, n *cc.PostfixExpression, t
func (p *project) postfixExpressionCallBool(f *function, n *cc.PostfixExpression, t cc.Type, mode exprMode, flags flags) {
// PostfixExpression '(' ArgumentExpressionList ')'
- if flags&fOutermost == 0 {
- p.w("(")
- defer p.w(")")
- }
+ p.w("(")
+ defer p.w(")")
defer p.w(" != 0")
if d := n.PostfixExpression.Declarator(); d != nil {
switch d.Name() {
@@ -10866,7 +10840,7 @@ func (p *project) postfixExpressionCallBool(f *function, n *cc.PostfixExpression
if f != nil {
va = f.vaLists[n]
}
- p.postfixExpression(f, n.PostfixExpression, n.PostfixExpression.Operand.Type(), exprFunc, flags&^fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, n.PostfixExpression.Operand.Type(), exprFunc, flags)
p.argumentExpressionList(f, n.PostfixExpression, n.ArgumentExpressionList, va)
}
@@ -10916,7 +10890,7 @@ func (p *project) postfixExpressionCallValue(f *function, n *cc.PostfixExpressio
if f != nil {
va = f.vaLists[n]
}
- p.postfixExpression(f, n.PostfixExpression, n.PostfixExpression.Operand.Type(), exprFunc, flags&^fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, n.PostfixExpression.Operand.Type(), exprFunc, flags)
p.argumentExpressionList(f, n.PostfixExpression, n.ArgumentExpressionList, va)
}
@@ -10948,7 +10922,7 @@ func (p *project) mulOverflow(f *function, n *cc.PostfixExpression, t cc.Type, m
types := []cc.Type{vt, vt, pt}
for i, v := range args[:3] {
p.w(", ")
- p.assignmentExpression(f, v, types[i], exprValue, flags|fOutermost)
+ p.assignmentExpression(f, v, types[i], exprValue, flags)
}
p.w(")")
return
@@ -10985,7 +10959,7 @@ func (p *project) subOverflow(f *function, n *cc.PostfixExpression, t cc.Type, m
types := []cc.Type{vt, vt, pt}
for i, v := range args[:3] {
p.w(", ")
- p.assignmentExpression(f, v, types[i], exprValue, flags|fOutermost)
+ p.assignmentExpression(f, v, types[i], exprValue, flags)
}
p.w(")")
return
@@ -11022,7 +10996,7 @@ func (p *project) addOverflow(f *function, n *cc.PostfixExpression, t cc.Type, m
types := []cc.Type{vt, vt, pt}
for i, v := range args[:3] {
p.w(", ")
- p.assignmentExpression(f, v, types[i], exprValue, flags|fOutermost)
+ p.assignmentExpression(f, v, types[i], exprValue, flags)
}
p.w(")")
return
@@ -11068,7 +11042,7 @@ func (p *project) atomicLoadN(f *function, n *cc.PostfixExpression, t cc.Type, m
if i != 0 {
p.w(", ")
}
- p.assignmentExpression(f, v, types[i], exprValue, flags|fOutermost)
+ p.assignmentExpression(f, v, types[i], exprValue, flags)
}
p.w(")")
return
@@ -11115,7 +11089,7 @@ func (p *project) postfixExpressionCallVoid(f *function, n *cc.PostfixExpression
if f != nil {
va = f.vaLists[n]
}
- p.postfixExpression(f, n.PostfixExpression, n.PostfixExpression.Operand.Type(), exprFunc, flags&^fOutermost)
+ p.postfixExpression(f, n.PostfixExpression, n.PostfixExpression.Operand.Type(), exprFunc, flags)
p.argumentExpressionList(f, n.PostfixExpression, n.ArgumentExpressionList, va)
}
@@ -11159,7 +11133,7 @@ func (p *project) atomicStoreN(f *function, n *cc.PostfixExpression, t cc.Type,
if i == 1 {
p.w("%s(", strings.ToLower(p.helperType(n, vt)))
}
- p.assignmentExpression(f, v, types[i], exprValue, flags|fOutermost)
+ p.assignmentExpression(f, v, types[i], exprValue, flags)
if i == 1 {
p.w(")")
}
@@ -11230,14 +11204,14 @@ func (p *project) argumentExpressionList(f *function, pe *cc.PostfixExpression,
case isTransparentUnion(params[i].Type()):
p.callArgTransparentUnion(f, arg, pt)
default:
- p.assignmentExpression(f, arg, arg.Promote(), mode, fOutermost)
+ p.assignmentExpression(f, arg, arg.Promote(), mode, 0)
}
case va && i == len(params):
p.w("%sVaList(%s%s, ", p.task.crt, f.bpName, nonZeroUintptr(bpOff))
paren = ")"
fallthrough
default:
- flags := fOutermost
+ var flags flags
if arg.Promote().IsIntegerType() {
switch x := arg.Operand.Value().(type) {
case cc.Int64Value:
@@ -11322,7 +11296,7 @@ func (p *project) callArgTransparentUnion(f *function, n *cc.AssignmentExpressio
panic(todo("", n.Position(), k, pt))
}
- p.assignmentExpression(f, n, ot, exprValue, fOutermost)
+ p.assignmentExpression(f, n, ot, exprValue, 0)
default:
panic(todo("", n.Position(), k, pt))
}
@@ -11452,7 +11426,7 @@ func (p *project) primaryExpressionVoid(f *function, n *cc.PrimaryExpression, t
switch n.Case {
case cc.PrimaryExpressionIdent: // IDENTIFIER
p.w("_ = ")
- p.primaryExpression(f, n, n.Operand.Type(), exprValue, flags|fOutermost)
+ p.primaryExpression(f, n, n.Operand.Type(), exprValue, flags)
case cc.PrimaryExpressionInt, // INTCONST
cc.PrimaryExpressionFloat, // FLOATCONST
cc.PrimaryExpressionEnum, // ENUMCONST
@@ -11463,7 +11437,7 @@ func (p *project) primaryExpressionVoid(f *function, n *cc.PrimaryExpression, t
// nop
case cc.PrimaryExpressionExpr: // '(' Expression ')'
- p.expression(f, n.Expression, n.Expression.Operand.Type(), mode, flags|fOutermost)
+ p.expression(f, n.Expression, n.Expression.Operand.Type(), mode, flags)
case cc.PrimaryExpressionStmt: // '(' CompoundStatement ')'
p.compoundStatement(f, n.CompoundStatement, "", true, false, 0)
default:
@@ -11472,7 +11446,7 @@ func (p *project) primaryExpressionVoid(f *function, n *cc.PrimaryExpression, t
}
func (p *project) primaryExpressionBool(f *function, n *cc.PrimaryExpression, t cc.Type, mode exprMode, flags flags) {
- if flags&fOutermost == 0 && n.Case != cc.PrimaryExpressionExpr {
+ if n.Case != cc.PrimaryExpressionExpr {
p.w("(")
defer p.w(")")
}
@@ -11505,7 +11479,7 @@ func (p *project) primaryExpressionBool(f *function, n *cc.PrimaryExpression, t
case cc.PrimaryExpressionExpr: // '(' Expression ')'
p.w("(")
defer p.w(")")
- p.expression(f, n.Expression, t, mode, flags|fOutermost)
+ p.expression(f, n.Expression, t, mode, flags)
case cc.PrimaryExpressionStmt: // '(' CompoundStatement ')'
p.w("func() %v {", p.typ(n, n.CompoundStatement.Operand.Type()))
p.compoundStatement(f, n.CompoundStatement, "", true, false, exprValue)
@@ -11700,11 +11674,9 @@ func (p *project) primaryExpressionValue(f *function, n *cc.PrimaryExpression, t
case cc.PrimaryExpressionLString: // LONGSTRINGLITERAL
p.w("%s", p.wideStringLiteral(n.Operand.Value(), 0))
case cc.PrimaryExpressionExpr: // '(' Expression ')'
- if flags&fOutermost == 0 {
- p.w("(")
- defer p.w(")")
- }
- p.expression(f, n.Expression, t, mode, flags|fOutermost)
+ p.w("(")
+ defer p.w(")")
+ p.expression(f, n.Expression, t, mode, flags)
case cc.PrimaryExpressionStmt: // '(' CompoundStatement ')'
p.statementExpression(f, n.CompoundStatement, t, mode, flags)
default:
@@ -11745,7 +11717,7 @@ func (p *project) primaryExpressionLValue(f *function, n *cc.PrimaryExpression,
case cc.PrimaryExpressionExpr: // '(' Expression ')'
p.w("(")
defer p.w(")")
- p.expression(f, n.Expression, t, mode, flags|fOutermost)
+ p.expression(f, n.Expression, t, mode, flags)
case cc.PrimaryExpressionStmt: // '(' CompoundStatement ')'
p.err(n, "statement expressions not supported")
default:
@@ -11766,7 +11738,7 @@ func (p *project) stringLiteralString(s string) string {
p.ts.WriteByte(0)
p.tsOffs[id] = off
}
- return fmt.Sprintf("%s%s%s", p.tsNameP, nonZeroUintptr(off), p.stringSnippet(s))
+ return fmt.Sprintf("(%s%s)%s", p.tsNameP, nonZeroUintptr(off), p.stringSnippet(s))
}
func (p *project) stringLiteral(v cc.Value) string {
@@ -11785,7 +11757,7 @@ func (p *project) stringLiteral(v cc.Value) string {
p.ts.WriteByte(0)
p.tsOffs[id] = off
}
- return fmt.Sprintf("%s%s%s", p.tsNameP, nonZeroUintptr(off), p.stringSnippet(s))
+ return fmt.Sprintf("(%s%s)%s", p.tsNameP, nonZeroUintptr(off), p.stringSnippet(s))
default:
panic(todo("%T", x))
}
@@ -11821,7 +11793,7 @@ func (p *project) wideStringLiteral(v cc.Value, pad int) string {
p.tsW = append(p.tsW, 0)
p.tsWOffs[id] = off
}
- return fmt.Sprintf("%s%s", p.tsWNameP, nonZeroUintptr(off))
+ return fmt.Sprintf("(%s%s)", p.tsWNameP, nonZeroUintptr(off))
default:
panic(todo("%T", x))
}
@@ -11861,38 +11833,50 @@ func (p *project) charConst(n cc.Node, src string, op cc.Operand, to cc.Type, fl
p.w("%d", on)
return
case to.IsSignedType():
+ var in int64
+ var ok bool
switch to.Size() {
case 1:
- mask = math.MaxInt8
+ in = int64(int8(on))
+ ok = int8(on) >= 0
case 2:
- mask = math.MaxInt16
+ in = int64(int16(on))
+ ok = int16(on) >= 0
case 4:
- mask = math.MaxInt32
+ in = int64(int32(on))
+ ok = int32(on) >= 0
case 8:
- mask = math.MaxInt64
+ in = int64(int64(on))
+ ok = in >= 0
default:
panic(todo("", op.Type().Size()))
}
+ if ok && rValid && uint64(in) == on { // Prefer original form
+ p.w("%s", src)
+ return
+ }
+
+ p.w("%d", in)
default:
switch to.Size() {
case 1:
- mask = math.MaxUint8
+ mask = 0xff
case 2:
- mask = math.MaxUint16
+ mask = 0xffff
case 4:
- mask = math.MaxUint32
+ mask = 0xffffffff
case 8:
- mask = math.MaxUint64
+ mask = 0xffffffffffffffff
default:
panic(todo("", op.Type().Size()))
}
- }
- if rValid && uint64(r)&mask == on { // Prefer original form
- p.w("%s", src)
- return
- }
+ if rValid && uint64(r)&mask == on { // Prefer original form
+ p.w("%s", src)
+ return
+ }
- p.w("%d", mask&on)
+ p.w("%d", on&mask)
+ }
}
func (p *project) floatConst(n cc.Node, src string, op cc.Operand, to cc.Type, flags flags) {
@@ -12116,15 +12100,15 @@ func (p *project) assignShiftOpVoidNormal(f *function, n *cc.AssignmentExpressio
if d := n.UnaryExpression.Declarator(); d != nil {
switch d.Type().Kind() {
case cc.Int128, cc.UInt128:
- p.declarator(n, f, d, d.Type(), exprLValue, flags|fOutermost)
+ p.declarator(n, f, d, d.Type(), exprLValue, flags)
p.w(".LValue%s(", oper2)
- p.assignmentExpression(f, n.AssignmentExpression, p.intType, exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, p.intType, exprValue, flags)
p.w(")")
return
default:
- p.declarator(n, f, d, d.Type(), exprLValue, flags|fOutermost)
+ p.declarator(n, f, d, d.Type(), exprLValue, flags)
p.w(" %s= ", oper)
- p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags)
return
}
}
@@ -12133,9 +12117,9 @@ func (p *project) assignShiftOpVoidNormal(f *function, n *cc.AssignmentExpressio
switch {
case lhs.Operand.Type().IsArithmeticType():
p.w("%sAssign%sPtr%s(", p.task.crt, oper2, p.helperType(n, lhs.Operand.Type()))
- p.unaryExpression(f, lhs, lhs.Operand.Type(), exprAddrOf, flags|fOutermost)
+ p.unaryExpression(f, lhs, lhs.Operand.Type(), exprAddrOf, flags)
p.w(", int(")
- p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags)
p.w("))")
default:
panic(todo("", p.pos(n), lhs.Operand.Type()))
@@ -12186,11 +12170,11 @@ func (p *project) assignOpValueBitfield(f *function, n *cc.AssignmentExpression,
switch pe.Case {
case cc.PostfixExpressionSelect: // PostfixExpression '.' IDENTIFIER
p.w("__p := ")
- p.postfixExpression(f, pe, pe.Operand.Type(), exprAddrOf, flags|fOutermost)
+ p.postfixExpression(f, pe, pe.Operand.Type(), exprAddrOf, flags)
p.w("; __v := ")
p.readBitfield(lhs, "__p", bf, ot)
p.w(" %s (", oper)
- p.assignmentExpression(f, n.AssignmentExpression, ot, exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, ot, exprValue, flags)
p.w("); return %sAssignBitFieldPtr%d%s(__p, __v, %d, %d, %#x)", p.task.crt, bf.BitFieldBlockWidth(), p.bfHelperType(ot), bf.BitFieldWidth(), bf.BitFieldOffset(), bf.Mask())
case cc.PostfixExpressionPSelect: // PostfixExpression "->" IDENTIFIER
panic(todo("", p.pos(n)))
@@ -12231,12 +12215,12 @@ func (p *project) assignOpValueNormal(f *function, n *cc.AssignmentExpression, t
case lhs.Operand.Type().IsArithmeticType():
defer p.w("%s", p.convertType(n, lhs.Operand.Type(), t, flags))
p.w("%sAssign%sPtr%s(", p.task.crt, oper2, p.helperType(n, lhs.Operand.Type()))
- p.unaryExpression(f, lhs, lhs.Operand.Type(), exprAddrOf, flags|fOutermost)
+ p.unaryExpression(f, lhs, lhs.Operand.Type(), exprAddrOf, flags)
p.w(", ")
if asInt {
p.w("int(")
}
- p.assignmentExpression(f, n.AssignmentExpression, lhs.Operand.Type(), exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, lhs.Operand.Type(), exprValue, flags)
if asInt {
p.w(")")
}
@@ -12251,23 +12235,23 @@ func (p *project) assignOpValueNormal(f *function, n *cc.AssignmentExpression, t
case d.Type().Kind() == cc.Ptr:
defer p.w("%s", p.convertType(n, d.Type(), t, flags))
p.w("%sAssign%s%s(&", p.task.crt, oper2, p.helperType(n, d.Type()))
- p.declarator(n, f, d, d.Type(), exprLValue, flags|fOutermost)
+ p.declarator(n, f, d, d.Type(), exprLValue, flags)
p.w(", ")
if dd := p.incDelta(d, d.Type()); dd != 1 {
p.w("%d*(", dd)
defer p.w(")")
}
- p.assignmentExpression(f, n.AssignmentExpression, d.Type(), exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, d.Type(), exprValue, flags)
p.w(")")
case d.Type().IsArithmeticType():
defer p.w("%s", p.convertType(n, d.Type(), t, flags))
p.w("%sAssign%s%s(&", p.task.crt, oper2, p.helperType(n, d.Type()))
- p.declarator(n, f, d, d.Type(), exprLValue, flags|fOutermost)
+ p.declarator(n, f, d, d.Type(), exprLValue, flags)
p.w(", ")
if asInt {
p.w("int(")
}
- p.assignmentExpression(f, n.AssignmentExpression, d.Type(), exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, d.Type(), exprValue, flags)
p.w(")")
if asInt {
p.w(")")
@@ -12282,12 +12266,12 @@ func (p *project) assignOpValueNormal(f *function, n *cc.AssignmentExpression, t
case lhs.Operand.Type().IsArithmeticType():
defer p.w("%s", p.convertType(n, lhs.Operand.Type(), t, flags))
p.w("%sAssign%sPtr%s(", p.task.crt, oper2, p.helperType(n, lhs.Operand.Type()))
- p.unaryExpression(f, lhs, lhs.Operand.Type(), exprAddrOf, flags|fOutermost)
+ p.unaryExpression(f, lhs, lhs.Operand.Type(), exprAddrOf, flags)
p.w(", ")
if asInt {
p.w("int(")
}
- p.assignmentExpression(f, n.AssignmentExpression, lhs.Operand.Type(), exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, lhs.Operand.Type(), exprValue, flags)
if asInt {
p.w(")")
}
@@ -12322,7 +12306,7 @@ func (p *project) assignOpVoidArrayParameter(f *function, n *cc.AssignmentExpres
case local != nil && local.isPinned:
p.w("*(*uintptr)(unsafe.Pointer(%s%s))", f.bpName, nonZeroUintptr(local.off))
default:
- p.declarator(n, f, d, d.Type(), exprLValue, flags|fOutermost)
+ p.declarator(n, f, d, d.Type(), exprLValue, flags)
}
p.w(" %s= ", oper)
@@ -12330,7 +12314,7 @@ func (p *project) assignOpVoidArrayParameter(f *function, n *cc.AssignmentExpres
p.w("%d*", dd)
}
p.w("uintptr(")
- p.assignmentExpression(f, n.AssignmentExpression, n.AssignmentExpression.Operand.Type(), exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, n.AssignmentExpression.Operand.Type(), exprValue, flags)
p.w(")")
}
@@ -12351,7 +12335,7 @@ func (p *project) assignOpVoidBitfield(f *function, n *cc.AssignmentExpression,
p.unaryExpression(f, lhs, lt, exprValue, flags)
p.w(")%s %s ", s, oper)
s = p.convertType(n, lt, n.Promote(), flags)
- p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags)
p.w("%s", s)
p.w(", %d, %#x)", bf.BitFieldOffset(), bf.Mask())
case cc.PostfixExpressionPSelect: // PostfixExpression "->" IDENTIFIER
@@ -12387,11 +12371,11 @@ func (p *project) assignOpVoidNormal(f *function, n *cc.AssignmentExpression, t
defer p.w(")")
}
defer p.w("%s", p.convert(n, rop.ConvertTo(n.Promote()), d.Type(), flags))
- p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags)
case d.Type().IsArithmeticType():
p.w(" %s= ", oper)
defer p.w("%s", p.convert(n, rop.ConvertTo(n.Promote()), d.Type(), flags))
- p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags)
default:
panic(todo("", n.Position(), d.Type().Kind()))
}
@@ -12444,22 +12428,22 @@ func (p *project) assignOpVoidNormal(f *function, n *cc.AssignmentExpression, t
}
p.w("%sAtomicAdd%s(&%s, %s%s(", p.task.crt, ht, nm, sign, p.typ(n, d.Type()))
- p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags)
p.w("))")
return
default:
p.warn(n, "unsupported volatile declarator operation: %v", oper)
p.w("%s = ", nm)
defer p.w("%s", p.convert(n, rop.ConvertTo(n.Promote()), d.Type(), flags))
- p.declarator(n, f, d, n.Promote(), exprValue, flags|fOutermost)
+ p.declarator(n, f, d, n.Promote(), exprValue, flags)
p.w(" %s (", oper)
- p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags)
p.w(")")
return
}
}
- p.declarator(n, f, d, d.Type(), exprLValue, flags|fOutermost)
+ p.declarator(n, f, d, d.Type(), exprLValue, flags)
switch d.Type().Kind() {
case cc.Ptr:
if oper != "+" && oper != "-" {
@@ -12472,19 +12456,19 @@ func (p *project) assignOpVoidNormal(f *function, n *cc.AssignmentExpression, t
defer p.w(")")
}
defer p.w("%s", p.convert(n, rop.ConvertTo(n.Promote()), d.Type(), flags))
- p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags)
case cc.Int128, cc.UInt128:
p.w(" = ")
- p.declarator(n, f, d, n.Promote(), exprValue, flags|fOutermost)
+ p.declarator(n, f, d, n.Promote(), exprValue, flags)
p.w(".%s(", oper2)
- p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags)
p.w(")")
default:
p.w(" = ")
defer p.w("%s", p.convert(n, rop.ConvertTo(n.Promote()), d.Type(), flags))
- p.declarator(n, f, d, n.Promote(), exprValue, flags|fOutermost)
+ p.declarator(n, f, d, n.Promote(), exprValue, flags)
p.w(" %s (", oper)
- p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags)
p.w(")")
}
return
@@ -12494,17 +12478,17 @@ func (p *project) assignOpVoidNormal(f *function, n *cc.AssignmentExpression, t
switch {
case lhs.Operand.Type().IsArithmeticType():
p.w("*(*%s)(unsafe.Pointer(", p.typ(n, lhs.Operand.Type()))
- p.unaryExpression(f, lhs, lhs.Operand.Type(), exprAddrOf, flags|fOutermost)
+ p.unaryExpression(f, lhs, lhs.Operand.Type(), exprAddrOf, flags)
p.w(")) %s= ", oper)
defer p.w("%s", p.convert(n, rop.ConvertTo(n.Promote()), lhs.Operand.Type(), flags))
p.w("(")
- p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, n.Promote(), exprValue, flags)
p.w(")")
case lhs.Operand.Type().Kind() == cc.Ptr:
p.w("*(*%s)(unsafe.Pointer(", p.typ(n, lhs.Operand.Type()))
- p.unaryExpression(f, lhs, lhs.Operand.Type(), exprAddrOf, flags|fOutermost)
+ p.unaryExpression(f, lhs, lhs.Operand.Type(), exprAddrOf, flags)
p.w(")) %s= (", oper)
- p.assignmentExpression(f, n.AssignmentExpression, lhs.Operand.Type(), exprValue, flags|fOutermost)
+ p.assignmentExpression(f, n.AssignmentExpression, lhs.Operand.Type(), exprValue, flags)
p.w(")")
if dd := p.incDelta(n, lhs.Operand.Type()); dd != 1 {
p.w("*%d", dd)
@@ -12545,7 +12529,7 @@ func (p *project) iterationStatement(f *function, n *cc.IterationStatement) {
f.continueCtx = a
f.breakCtx = b
p.w("__%d: if !(", a)
- p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, fOutermost)
+ p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, 0)
p.w(") { goto __%d };", b)
p.statement(f, n.Statement, false, false, false, 0)
p.w("; goto __%d; __%d:", a, b)
@@ -12553,7 +12537,7 @@ func (p *project) iterationStatement(f *function, n *cc.IterationStatement) {
}
p.w("for ")
- p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, fOutermost)
+ p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, 0)
p.statement(f, n.Statement, true, false, false, 0)
case cc.IterationStatementDo: // "do" Statement "while" '(' Expression ')' ';'
if f.hasJumps {
@@ -12568,7 +12552,7 @@ func (p *project) iterationStatement(f *function, n *cc.IterationStatement) {
p.w("__%d:", a)
p.statement(f, n.Statement, false, false, false, 0)
p.w(";goto __%d; __%[1]d: if ", b)
- p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, fOutermost)
+ p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, 0)
p.w("{goto __%d};goto __%d;__%[2]d:", a, c)
break
}
@@ -12578,7 +12562,7 @@ func (p *project) iterationStatement(f *function, n *cc.IterationStatement) {
v = f.scope.take(cc.String(v))
}
p.w("for %v := true; %[1]v; %[1]v = ", v)
- p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, fOutermost)
+ p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, 0)
p.statement(f, n.Statement, true, false, false, 0)
case cc.IterationStatementFor: // "for" '(' Expression ';' Expression ';' Expression ')' Statement
if f.hasJumps || n.Expression3 != nil && n.Expression3.Case == cc.ExpressionComma {
@@ -12594,7 +12578,7 @@ func (p *project) iterationStatement(f *function, n *cc.IterationStatement) {
c := f.flatLabel()
f.breakCtx = c
if n.Expression != nil {
- p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, fOutermost|fNoCondAssignment)
+ p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, fNoCondAssignment)
}
semi := ""
if n.Expression != nil || n.Expression2 != nil || n.Expression3 != nil {
@@ -12603,14 +12587,14 @@ func (p *project) iterationStatement(f *function, n *cc.IterationStatement) {
p.w("%s__%d:", semi, a)
if n.Expression2 != nil {
p.w("if !(")
- p.expression(f, n.Expression2, n.Expression2.Operand.Type(), exprBool, fOutermost)
+ p.expression(f, n.Expression2, n.Expression2.Operand.Type(), exprBool, 0)
p.w(") { goto __%d }", c)
}
p.w("%s", semi)
p.statement(f, n.Statement, false, false, false, 0)
p.w(";goto __%d; __%[1]d:", b)
if n.Expression3 != nil {
- p.expression(f, n.Expression3, n.Expression3.Operand.Type(), exprVoid, fOutermost|fNoCondAssignment)
+ p.expression(f, n.Expression3, n.Expression3.Operand.Type(), exprVoid, fNoCondAssignment)
}
p.w("%sgoto __%d; goto __%d;__%[3]d:", semi, a, c)
break
@@ -12618,21 +12602,21 @@ func (p *project) iterationStatement(f *function, n *cc.IterationStatement) {
expr := true
if n.Expression != nil && n.Expression.Case == cc.ExpressionComma {
- p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, fOutermost)
+ p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, 0)
p.w(";")
expr = false
}
p.w("for ")
if expr && n.Expression != nil {
- p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, fOutermost|fNoCondAssignment)
+ p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, fNoCondAssignment)
}
p.w("; ")
if n.Expression2 != nil {
- p.expression(f, n.Expression2, n.Expression2.Operand.Type(), exprBool, fOutermost)
+ p.expression(f, n.Expression2, n.Expression2.Operand.Type(), exprBool, 0)
}
p.w("; ")
if n.Expression3 != nil {
- p.expression(f, n.Expression3, n.Expression3.Operand.Type(), exprVoid, fOutermost|fNoCondAssignment)
+ p.expression(f, n.Expression3, n.Expression3.Operand.Type(), exprVoid, fNoCondAssignment)
}
p.statement(f, n.Statement, true, false, false, 0)
case cc.IterationStatementForDecl: // "for" '(' Declaration Expression ';' Expression ')' Statement
@@ -12658,14 +12642,14 @@ func (p *project) iterationStatement(f *function, n *cc.IterationStatement) {
p.w("__%d:", a)
if n.Expression != nil {
p.w("if !(")
- p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, fOutermost)
+ p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, 0)
p.w(") { goto __%d }", c)
}
p.w(";")
p.statement(f, n.Statement, false, false, false, 0)
p.w(";goto __%d; __%[1]d:", b)
if n.Expression2 != nil {
- p.expression(f, n.Expression2, n.Expression2.Operand.Type(), exprVoid, fOutermost|fNoCondAssignment)
+ p.expression(f, n.Expression2, n.Expression2.Operand.Type(), exprVoid, fNoCondAssignment)
}
p.w("; goto __%d; goto __%d;__%[2]d:\n}", a, c)
default:
@@ -12687,7 +12671,7 @@ func (p *project) selectionStatement(f *function, n *cc.SelectionStatement) {
f.ifCtx = n
a := f.flatLabel()
p.w("if !(")
- p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, fOutermost)
+ p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, 0)
p.w(") { goto __%d };", a)
p.statement(f, n.Statement, false, false, false, 0)
p.w(";__%d: ", a)
@@ -12695,7 +12679,7 @@ func (p *project) selectionStatement(f *function, n *cc.SelectionStatement) {
}
p.w("if ")
- p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, fOutermost)
+ p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, 0)
p.statement(f, n.Statement, true, false, false, 0)
case cc.SelectionStatementIfElse: // "if" '(' Expression ')' Statement "else" Statement
sv := f.ifCtx
@@ -12711,7 +12695,7 @@ func (p *project) selectionStatement(f *function, n *cc.SelectionStatement) {
a := f.flatLabel()
b := f.flatLabel()
p.w("if !(")
- p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, fOutermost)
+ p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, 0)
p.w(") { goto __%d };", a)
p.statement(f, n.Statement, false, false, false, 0)
p.w(";goto __%d; __%d:", b, a)
@@ -12721,7 +12705,7 @@ func (p *project) selectionStatement(f *function, n *cc.SelectionStatement) {
}
p.w("if ")
- p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, fOutermost)
+ p.expression(f, n.Expression, n.Expression.Operand.Type(), exprBool, 0)
p.statement(f, n.Statement, true, false, false, 0)
p.w(" else ")
switch {
@@ -12746,7 +12730,7 @@ func (p *project) selectionStatement(f *function, n *cc.SelectionStatement) {
f.switchCtx = inSwitchFirst
p.w("switch ")
- p.expression(f, n.Expression, n.Promote(), exprValue, fOutermost)
+ p.expression(f, n.Expression, n.Promote(), exprValue, 0)
p.statement(f, n.Statement, true, false, true, 0)
default:
panic(todo("%v: internal error: %v", n.Position(), n.Case))
@@ -12780,7 +12764,7 @@ func (p *project) flatSwitch(f *function, n *cc.SelectionStatement) {
svBreakCtx := f.breakCtx
f.breakCtx = f.flatLabel()
p.w("switch ")
- p.expression(f, n.Expression, n.Promote(), exprValue, fOutermost)
+ p.expression(f, n.Expression, n.Promote(), exprValue, 0)
p.w("{")
for _, ls := range cases {
switch ls.Case {
@@ -12788,7 +12772,7 @@ func (p *project) flatSwitch(f *function, n *cc.SelectionStatement) {
continue
case cc.LabeledStatementCaseLabel: // "case" ConstantExpression ':' Statement
p.w("%scase ", tidyComment("\n", ls))
- p.constantExpression(f, ls.ConstantExpression, ls.ConstantExpression.Operand.Type(), exprValue, fOutermost)
+ p.constantExpression(f, ls.ConstantExpression, ls.ConstantExpression.Operand.Type(), exprValue, 0)
p.w(":")
case cc.LabeledStatementDefault: // "default" ':' Statement
p.w("%sdefault:", tidyComment("\n", ls))
@@ -12817,7 +12801,7 @@ func (p *project) expressionStatement(f *function, n *cc.ExpressionStatement) {
return
}
- p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, fOutermost)
+ p.expression(f, n.Expression, n.Expression.Operand.Type(), exprVoid, 0)
}
func (p *project) labeledStatement(f *function, n *cc.LabeledStatement) (r *cc.JumpStatement) {
@@ -12886,7 +12870,7 @@ func (p *project) labeledStatementCase(f *function, n *cc.LabeledStatement) {
p.w("%s__%d:", tidyComment("\n", n), f.flatSwitchLabels[n])
default:
p.w("%scase ", tidyComment("\n", n))
- p.constantExpression(f, n.ConstantExpression, n.ConstantExpression.Operand.Type(), exprValue, fOutermost)
+ p.constantExpression(f, n.ConstantExpression, n.ConstantExpression.Operand.Type(), exprValue, 0)
p.w(":")
}
case cc.LabeledStatementDefault: // "default" ':' Statement
@@ -12907,17 +12891,17 @@ func (p *project) constantExpression(f *function, n *cc.ConstantExpression, t cc
p.conditionalExpression(f, n.ConditionalExpression, t, mode, flags)
}
-func (p *project) functionDefinitionSignature(f *function, tld *tld) {
+func (p *project) functionDefinitionSignature(n cc.Node, f *function, tld *tld) {
switch {
case f.mainSignatureForced:
p.w("%sfunc %s(%s *%sTLS, _ int32, _ uintptr) int32", tidyComment("\n", f.fndef), tld.name, f.tlsName, p.task.crt)
default:
p.w("%s", tidyComment("\n", f.fndef))
- p.functionSignature(f, f.fndef.Declarator.Type(), tld.name)
+ p.functionSignature(n, f, f.fndef.Declarator.Type(), tld.name)
}
}
-func (p *project) functionSignature2(f *function, t cc.Type, nm string) {
+func (p *project) functionSignature2(n cc.Node, f *function, t cc.Type, nm string) {
p.w("func %s", nm)
p.w("(_ *%sTLS", p.task.crt)
suffix := 1
@@ -12941,11 +12925,11 @@ func (p *project) functionSignature2(f *function, t cc.Type, nm string) {
}
p.w(")")
if rt := t.Result(); rt != nil && rt.Kind() != cc.Void {
- p.w(" %s", p.typ(nil, rt))
+ p.w(" %s", p.typ(n, rt))
}
}
-func (p *project) functionSignature(f *function, t cc.Type, nm string) {
+func (p *project) functionSignature(n cc.Node, f *function, t cc.Type, nm string) {
p.w("func")
if nm != "" {
p.w(" %s", nm)
@@ -12982,7 +12966,7 @@ func (p *project) functionSignature(f *function, t cc.Type, nm string) {
}
p.w(")")
if rt := t.Result(); rt != nil && rt.Kind() != cc.Void {
- p.w(" %s", p.typ(nil, rt))
+ p.w(" %s", p.typ(n, rt))
}
}
@@ -13000,7 +12984,7 @@ func (p *project) paramTyp(n cc.Node, t cc.Type) string {
}
}
- return p.typ(nil, t)
+ return p.typ(n, t)
}
func (p *project) dbg(a ...interface{}) {
@@ -13034,7 +13018,7 @@ func (p *project) fnVal(n cc.Node, f *function, expr func(), exprDecl *cc.Declar
case 0:
// (*struct{ f func()})(unsafe.Pointer(&struct{uintptr}{fprintfptr})).f()
p.w("(*struct{ f ")
- p.functionSignature(f, et, "")
+ p.functionSignature(n, f, et, "")
p.w("})(unsafe.Pointer(&struct{uintptr}{")
expr()
p.w("})).f")
@@ -13051,7 +13035,7 @@ func (p *project) fnVal(n cc.Node, f *function, expr func(), exprDecl *cc.Declar
default:
// (*struct{ f func()})(unsafe.Pointer(&struct{uintptr}{fprintfptr})).f()
p.w("(*(**struct{ f ")
- p.functionSignature(f, et2, "")
+ p.functionSignature(n, f, et2, "")
p.w("})(unsafe.Pointer(&struct{uintptr}{")
expr()
p.w("}))).f")
diff --git a/vendor/modernc.org/ccgo/v3/lib/init.go b/vendor/modernc.org/ccgo/v3/lib/init.go
index ad443cd2e..db3ad9133 100644
--- a/vendor/modernc.org/ccgo/v3/lib/init.go
+++ b/vendor/modernc.org/ccgo/v3/lib/init.go
@@ -59,7 +59,7 @@ func (p *project) initializerInner(tag string, off uintptr, f *function, s []*cc
tld.patches = append(tld.patches, initPatch{t, s[0], patchField})
p.w(" 0 ")
default:
- p.assignmentExpression(f, s[0].AssignmentExpression, t, exprValue, fOutermost)
+ p.assignmentExpression(f, s[0].AssignmentExpression, t, exprValue, 0)
}
return
}
@@ -79,7 +79,7 @@ func (p *project) initializerInner(tag string, off uintptr, f *function, s []*cc
case cc.Struct, cc.Union:
if compatibleStructOrUnion(t, s[0].AssignmentExpression.Operand.Type()) {
p.w("%s%s", tidyComment("", s[0]), tag)
- p.assignmentExpression(f, s[0].AssignmentExpression, t, exprValue, fOutermost)
+ p.assignmentExpression(f, s[0].AssignmentExpression, t, exprValue, 0)
return
}
}
@@ -258,7 +258,7 @@ func (p *project) initializerStruct(tag string, off uintptr, f *function, s []*c
bitFld := v.Field
p.w("%s%s", tidyComment("", v.AssignmentExpression), tag)
tag = ""
- p.assignmentExpression(f, v.AssignmentExpression, bft, exprValue, fOutermost)
+ p.assignmentExpression(f, v.AssignmentExpression, bft, exprValue, 0)
p.w("&%#x", uint64(1)<<uint64(bitFld.BitFieldWidth())-1)
if o := bitFld.BitFieldOffset() + 8*int((bitFld.Offset()-off0)); o != 0 {
p.w("<<%d", o)
@@ -387,14 +387,14 @@ func (p *project) initializerUnion(tag string, off uintptr, f *function, s []*cc
case fld != nil && fld.IsBitField():
bft := p.bitFileType(part, fld.BitFieldBlockWidth())
p.w("*(*%s)(unsafe.Pointer(uintptr(unsafe.Pointer(&r))+%d)) |= ", p.typ(part, bft), part.Offset-off)
- p.assignmentExpression(f, part.AssignmentExpression, bft, exprValue, fOutermost)
+ p.assignmentExpression(f, part.AssignmentExpression, bft, exprValue, 0)
p.w("&%#x", uint64(1)<<uint64(fld.BitFieldWidth())-1)
if o := fld.BitFieldOffset(); o != 0 {
p.w("<<%d", o)
}
default:
p.w("*(*%s)(unsafe.Pointer(uintptr(unsafe.Pointer(&r))+%d)) = ", p.typ(part, ft), part.Offset-off)
- p.assignmentExpression(f, part.AssignmentExpression, ft, exprValue, fOutermost)
+ p.assignmentExpression(f, part.AssignmentExpression, ft, exprValue, 0)
}
p.w("\n")
}