Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions _demo/go/embedunexport-1598/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package main

import (
"go/token"
"go/types"
)

// wrappedFunc embeds *types.Func to implement types.Object
type wrappedFunc struct {
*types.Func
}

func main() {
pkg := types.NewPackage("test", "test")
scope := pkg.Scope()

sig := types.NewSignatureType(nil, nil, nil, nil, nil, false)
fn := types.NewFunc(token.NoPos, pkg, "testFunc", sig)

wrapped := &wrappedFunc{Func: fn}
var obj types.Object = wrapped

scope.Insert(obj)
}
29 changes: 29 additions & 0 deletions cl/_testdata/embedunexport/embedunexport.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package embedunexport

// Object is an interface with both exported and unexported methods
type Object interface {
Name() string
setName(string)
}

// Base implements Object
type Base struct {
name string
}

func (b *Base) Name() string {
return b.name
}

func (b *Base) setName(name string) {
b.name = name
}

func NewBase(name string) *Base {
return &Base{name: name}
}

// Use calls the unexported method through interface
func Use(obj Object) {
obj.setName("modified")
}
62 changes: 62 additions & 0 deletions cl/_testdata/embedunexport/out.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
; ModuleID = 'github.com/goplus/llgo/cl/_testdata/embedunexport'
source_filename = "github.com/goplus/llgo/cl/_testdata/embedunexport"

%"github.com/goplus/llgo/runtime/internal/runtime.String" = type { ptr, i64 }
%"github.com/goplus/llgo/cl/_testdata/embedunexport.Base" = type { %"github.com/goplus/llgo/runtime/internal/runtime.String" }
%"github.com/goplus/llgo/runtime/internal/runtime.iface" = type { ptr, ptr }

@"github.com/goplus/llgo/cl/_testdata/embedunexport.init$guard" = global i1 false, align 1
@0 = private unnamed_addr constant [8 x i8] c"modified", align 1

define %"github.com/goplus/llgo/runtime/internal/runtime.String" @"github.com/goplus/llgo/cl/_testdata/embedunexport.(*Base).Name"(ptr %0) {
_llgo_0:
%1 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/embedunexport.Base", ptr %0, i32 0, i32 0
%2 = load %"github.com/goplus/llgo/runtime/internal/runtime.String", ptr %1, align 8
ret %"github.com/goplus/llgo/runtime/internal/runtime.String" %2
}

define void @"github.com/goplus/llgo/cl/_testdata/embedunexport.(*Base).setName"(ptr %0, %"github.com/goplus/llgo/runtime/internal/runtime.String" %1) {
_llgo_0:
%2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/embedunexport.Base", ptr %0, i32 0, i32 0
store %"github.com/goplus/llgo/runtime/internal/runtime.String" %1, ptr %2, align 8
ret void
}

define ptr @"github.com/goplus/llgo/cl/_testdata/embedunexport.NewBase"(%"github.com/goplus/llgo/runtime/internal/runtime.String" %0) {
_llgo_0:
%1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16)
%2 = getelementptr inbounds %"github.com/goplus/llgo/cl/_testdata/embedunexport.Base", ptr %1, i32 0, i32 0
store %"github.com/goplus/llgo/runtime/internal/runtime.String" %0, ptr %2, align 8
ret ptr %1
}

define void @"github.com/goplus/llgo/cl/_testdata/embedunexport.Use"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %0) {
_llgo_0:
%1 = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface" %0)
%2 = extractvalue %"github.com/goplus/llgo/runtime/internal/runtime.iface" %0, 0
%3 = getelementptr ptr, ptr %2, i64 4
%4 = load ptr, ptr %3, align 8
%5 = insertvalue { ptr, ptr } undef, ptr %4, 0
%6 = insertvalue { ptr, ptr } %5, ptr %1, 1
%7 = extractvalue { ptr, ptr } %6, 1
%8 = extractvalue { ptr, ptr } %6, 0
call void %8(ptr %7, %"github.com/goplus/llgo/runtime/internal/runtime.String" { ptr @0, i64 8 })
ret void
}

define void @"github.com/goplus/llgo/cl/_testdata/embedunexport.init"() {
_llgo_0:
%0 = load i1, ptr @"github.com/goplus/llgo/cl/_testdata/embedunexport.init$guard", align 1
br i1 %0, label %_llgo_2, label %_llgo_1

_llgo_1: ; preds = %_llgo_0
store i1 true, ptr @"github.com/goplus/llgo/cl/_testdata/embedunexport.init$guard", align 1
br label %_llgo_2

_llgo_2: ; preds = %_llgo_1, %_llgo_0
ret void
}

declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64)

declare ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfacePtrData"(%"github.com/goplus/llgo/runtime/internal/runtime.iface")
4 changes: 2 additions & 2 deletions cl/_testgo/abimethod/out.ll

Large diffs are not rendered by default.

19 changes: 19 additions & 0 deletions cl/_testgo/embedunexport-1598/in.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package main

import "github.com/goplus/llgo/cl/_testdata/embedunexport"

// Wrapped embeds *embedunexport.Base to implement embedunexport.Object
type Wrapped struct {
*embedunexport.Base
}

func main() {
base := embedunexport.NewBase("test")
wrapped := &Wrapped{Base: base}

// This should work: calling unexported method through interface
var obj embedunexport.Object = wrapped
embedunexport.Use(obj)

println(obj.Name())
}
Loading
Loading