summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJuan M Gómez <info@jmgomez.me>2023-08-09 19:57:52 +0100
committerGitHub <noreply@github.com>2023-08-09 20:57:52 +0200
commit6ec1c80779831875b2552d6ba2d613503b53a012 (patch)
tree4257dc656097cf5d5ea9a68211583ce61c4a7d8a
parent91c32218559924ef4f74302310e9195773183f79 (diff)
downloadNim-6ec1c80779831875b2552d6ba2d613503b53a012.tar.gz
makes asmnostackframe work with cpp member #22411 (#22429)
-rw-r--r--compiler/cgen.nim7
-rw-r--r--tests/cpp/tvirtual.nim37
2 files changed, 41 insertions, 3 deletions
diff --git a/compiler/cgen.nim b/compiler/cgen.nim
index e21d85a07..af30f546e 100644
--- a/compiler/cgen.nim
+++ b/compiler/cgen.nim
@@ -1142,7 +1142,8 @@ proc isNoReturn(m: BModule; s: PSym): bool {.inline.} =
 proc genProcAux*(m: BModule, prc: PSym) =
   var p = newProc(prc, m)
   var header = newRopeAppender()
-  if m.config.backend == backendCpp and sfCppMember * prc.flags != {}:
+  let isCppMember = m.config.backend == backendCpp and sfCppMember * prc.flags != {}
+  if isCppMember:
     genMemberProcHeader(m, prc, header)
   else:
     genProcHeader(m, prc, header)
@@ -1205,10 +1206,10 @@ proc genProcAux*(m: BModule, prc: PSym) =
   var generatedProc: Rope = ""
   generatedProc.genCLineDir prc.info, m.config
   if isNoReturn(p.module, prc):
-    if hasDeclspec in extccomp.CC[p.config.cCompiler].props:
+    if hasDeclspec in extccomp.CC[p.config.cCompiler].props and not isCppMember:
       header = "__declspec(noreturn) " & header
   if sfPure in prc.flags:
-    if hasDeclspec in extccomp.CC[p.config.cCompiler].props:
+    if hasDeclspec in extccomp.CC[p.config.cCompiler].props and not isCppMember:
       header = "__declspec(naked) " & header
     generatedProc.add ropecg(p.module, "$1 {$n$2$3$4}$N$N",
                          [header, p.s(cpsLocals), p.s(cpsInit), p.s(cpsStmts)])
diff --git a/tests/cpp/tvirtual.nim b/tests/cpp/tvirtual.nim
index 7acec21ba..fb792380b 100644
--- a/tests/cpp/tvirtual.nim
+++ b/tests/cpp/tvirtual.nim
@@ -79,3 +79,40 @@ type Doo = object
 proc naiveMember(x: Doo): int {. virtual .} = 2
 discard naiveMember(Doo())
 
+#asmnostackframe works with virtual
+{.emit:"""/*TYPESECTION*/
+  template<typename T>
+  struct Box {
+      T* first;
+     
+      Box(int x){
+        first = new T(x);
+      };
+  };
+  struct Inner {
+    int val;
+    //Coo() = default;
+    Inner(int x){
+      val = x;
+    };
+  };
+  struct Base {
+    virtual Box<Inner> test() = 0;
+  };
+""".}
+
+type 
+  Inner {.importcpp.} = object
+  Base {.importcpp, inheritable.} = object
+  Child  = object of Base
+  Box[T] {.importcpp, inheritable.} = object
+    first: T
+
+proc makeBox[T](x:int32): Box[T] {.importcpp:"Box<'0>(@)", constructor.}
+
+proc test(self: Child): Box[Inner] {.virtual, asmnostackframe.} = 
+  let res {.exportc.} = makeBox[Inner](100)
+  {.emit:"return res;".}
+  
+
+discard Child().test() 
\ No newline at end of file