diff options
author | Juan M Gómez <info@jmgomez.me> | 2024-03-29 21:09:00 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-29 22:09:00 +0100 |
commit | cf00b2fd9e00909ac6368ece9515f0e020d7813d (patch) | |
tree | 035ee84c5e32f894024d1708c081a887f19d95cf | |
parent | 4b6a9e4add2af2a458d171b23030acb5d1c70ecb (diff) | |
download | Nim-cf00b2fd9e00909ac6368ece9515f0e020d7813d.tar.gz |
adds ccMember CC fixes #23434 (#23457)
-rw-r--r-- | compiler/ast.nim | 1 | ||||
-rw-r--r-- | compiler/ccgtypes.nim | 4 | ||||
-rw-r--r-- | compiler/nir/ast2ir.nim | 2 | ||||
-rw-r--r-- | compiler/nir/types2ir.nim | 2 | ||||
-rw-r--r-- | compiler/pragmas.nim | 2 | ||||
-rw-r--r-- | tests/cpp/t23434.nim | 17 |
6 files changed, 24 insertions, 4 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim index ada4b6665..2db159013 100644 --- a/compiler/ast.nim +++ b/compiler/ast.nim @@ -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] diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim index 3d1a3af6f..613beb9c5 100644 --- a/compiler/ccgtypes.nim +++ b/compiler/ccgtypes.nim @@ -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 diff --git a/compiler/nir/ast2ir.nim b/compiler/nir/ast2ir.nim index 907d45013..20dfbf2a7 100644 --- a/compiler/nir/ast2ir.nim +++ b/compiler/nir/ast2ir.nim @@ -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 diff --git a/compiler/nir/types2ir.nim b/compiler/nir/types2ir.nim index cdadc4f0d..8d9583486 100644 --- a/compiler/nir/types2ir.nim +++ b/compiler/nir/types2ir.nim @@ -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] diff --git a/compiler/pragmas.nim b/compiler/pragmas.nim index d85c52a93..a644639fe 100644 --- a/compiler/pragmas.nim +++ b/compiler/pragmas.nim @@ -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) = diff --git a/tests/cpp/t23434.nim b/tests/cpp/t23434.nim new file mode 100644 index 000000000..04a83227e --- /dev/null +++ b/tests/cpp/t23434.nim @@ -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) \ No newline at end of file |