summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJuan M Gómez <info@jmgomez.me>2024-03-29 21:09:00 +0000
committerGitHub <noreply@github.com>2024-03-29 22:09:00 +0100
commitcf00b2fd9e00909ac6368ece9515f0e020d7813d (patch)
tree035ee84c5e32f894024d1708c081a887f19d95cf
parent4b6a9e4add2af2a458d171b23030acb5d1c70ecb (diff)
downloadNim-cf00b2fd9e00909ac6368ece9515f0e020d7813d.tar.gz
adds ccMember CC fixes #23434 (#23457)
-rw-r--r--compiler/ast.nim1
-rw-r--r--compiler/ccgtypes.nim4
-rw-r--r--compiler/nir/ast2ir.nim2
-rw-r--r--compiler/nir/types2ir.nim2
-rw-r--r--compiler/pragmas.nim2
-rw-r--r--tests/cpp/t23434.nim17
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