diff --git a/cl/compile.go b/cl/compile.go index a4ac9fb..902b720 100644 --- a/cl/compile.go +++ b/cl/compile.go @@ -310,11 +310,13 @@ func compileDeclStmt(ctx *blockCtx, node *ast.Node, global bool) { case ast.VarDecl: compileVarDecl(ctx, decl, global) case ast.TypedefDecl: - if typ := compileTypedef(ctx, decl, global); typ != nil && global { - name := decl.Name - if ctx.getPubName(&name) { - ctx.pkg.AliasType(name, typ, ctx.goNodePos(decl)) - } + origName, pub := decl.Name, false + if global { + pub = ctx.getPubName(&decl.Name) + } + compileTypedef(ctx, decl, global, pub) + if pub { + substObj(ctx.pkg.Types, scope, origName, scope, decl.Name) } case ast.RecordDecl: pub := false @@ -327,6 +329,9 @@ func compileDeclStmt(ctx *blockCtx, node *ast.Node, global bool) { } typ, del := compileStructOrUnion(ctx, name, decl, pub) if suKind != suAnonymous { + if pub { + substObj(ctx.pkg.Types, scope, decl.Name, scope, name) + } break } ctx.unnameds[decl.ID] = unnamedType{typ: typ, del: del} diff --git a/cl/type_and_var.go b/cl/type_and_var.go index 2eda6ac..de869b3 100644 --- a/cl/type_and_var.go +++ b/cl/type_and_var.go @@ -173,7 +173,7 @@ func checkAnonymous(ctx *blockCtx, scope *types.Scope, typ types.Type, v *ast.No // ----------------------------------------------------------------------------- -func compileTypedef(ctx *blockCtx, decl *ast.Node, global bool) types.Type { +func compileTypedef(ctx *blockCtx, decl *ast.Node, global, pub bool) types.Type { name, qualType := decl.Name, decl.Type.QualType if debugCompileDecl { log.Println("typedef", name, "-", qualType)