mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-06 07:38:24 +00:00
@@ -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]
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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
17
tests/cpp/t23434.nim
Normal 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)
|
||||
Reference in New Issue
Block a user