adds ccMember CC fixes #23434 (#23457)

This commit is contained in:
Juan M Gómez
2024-03-29 21:09:00 +00:00
committed by GitHub
parent 4b6a9e4add
commit cf00b2fd9e
6 changed files with 24 additions and 4 deletions

View File

@@ -36,6 +36,7 @@ type
ccThisCall = "thiscall" # thiscall (parameters are pushed right-to-left)
ccClosure = "closure" # proc has a closure
ccNoConvention = "noconv" # needed for generating proper C procs sometimes
ccMember = "member" # proc is a (cpp) member
TNodeKinds* = set[TNodeKind]

View File

@@ -288,7 +288,9 @@ const
"N_STDCALL", "N_CDECL", "N_SAFECALL",
"N_SYSCALL", # this is probably not correct for all platforms,
# but one can #define it to what one wants
"N_INLINE", "N_NOINLINE", "N_FASTCALL", "N_THISCALL", "N_CLOSURE", "N_NOCONV"]
"N_INLINE", "N_NOINLINE", "N_FASTCALL", "N_THISCALL", "N_CLOSURE", "N_NOCONV",
"N_NOCONV" #ccMember is N_NOCONV
]
proc cacheGetType(tab: TypeCache; sig: SigHash): Rope =
# returns nil if we need to declare this type

View File

@@ -2423,7 +2423,7 @@ proc addCallConv(c: var ProcCon; info: PackedLineInfo; callConv: TCallingConvent
of ccInline: ann InlineCall
of ccNoInline: ann NoinlineCall
of ccThisCall: ann ThisCall
of ccNoConvention: ann NoCall
of ccNoConvention, ccMember: ann NoCall
proc genProc(cOuter: var ProcCon; prc: PSym) =
if prc.magic notin generatedMagics: return

View File

@@ -150,7 +150,7 @@ proc procToIr(c: var TypesCon; g: var TypeGraph; t: PType; addEnv = false): Type
of ccInline: g.addAnnotation "__inline"
of ccNoInline: g.addAnnotation "__noinline"
of ccThisCall: g.addAnnotation "__thiscall"
of ccNoConvention: g.addAnnotation ""
of ccNoConvention, ccMember: g.addAnnotation ""
for i in 0..<fieldTypes.len:
g.addType fieldTypes[i]

View File

@@ -241,7 +241,7 @@ proc processVirtual(c: PContext, n: PNode, s: PSym, flag: TSymFlag) =
s.constraint.strVal = s.constraint.strVal % s.name.s
s.flags.incl {flag, sfInfixCall, sfExportc, sfMangleCpp}
s.typ.callConv = ccNoConvention
s.typ.callConv = ccMember
incl c.config.globalOptions, optMixedMode
proc processCodegenDecl(c: PContext, n: PNode, sym: PSym) =

17
tests/cpp/t23434.nim Normal file
View File

@@ -0,0 +1,17 @@
discard """
cmd:"nim cpp $file"
errormsg: "type mismatch: got <proc (self: SomeObject){.member, gcsafe.}>"
line: 17
"""
type SomeObject = object
value: int
proc printValue(self: SomeObject) {.virtual.} =
echo "The value is ", self.value
proc callAProc(p: proc(self: SomeObject){.noconv.}) =
let someObj = SomeObject(value: 4)
echo "calling param proc"
p(someObj)
callAProc(printValue)