diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index e023eeee7b..18ba1b0a67 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -3143,6 +3143,12 @@ proc genMagicExpr(p: BProc, e: PNode, d: var TLoc, op: TMagic) = localError(p.config, e.info, "for --mm:arc|atomicArc|orc 'deepcopy' support has to be enabled with --deepcopy:on") + let typ = e[1].typ.skipTypes({tyVar, tyRef, tyGenericInst, tyTypeDesc, + tyAlias, tyInferred, tySink, tyLent, tyOwned}) + if hasDisabledAsgn(p.module.g.graph, typ): + localError(p.config, e.info, + "'deepCopy' is not available for type <" & typeToString(typ) & ">") + let x = if e[1].kind in {nkAddr, nkHiddenAddr}: e[1][0] else: e[1] var a = initLocExpr(p, x) var b = initLocExpr(p, e[2]) diff --git a/tests/system/tdeepcopy_nocopy.nim b/tests/system/tdeepcopy_nocopy.nim new file mode 100644 index 0000000000..98fc639259 --- /dev/null +++ b/tests/system/tdeepcopy_nocopy.nim @@ -0,0 +1,12 @@ +discard """ + matrix: "--mm:refc; --mm:orc --deepcopy:on" + errormsg: "'deepCopy' is not available for type " + file: "system.nim" +""" + +type NoCopy = object + +proc `=copy`(a: var NoCopy; b: NoCopy) {.error.} + +var a = new NoCopy +var b = deepCopy(a) diff --git a/tests/system/tdeepcopy_nocopy_field.nim b/tests/system/tdeepcopy_nocopy_field.nim new file mode 100644 index 0000000000..1c48ccb623 --- /dev/null +++ b/tests/system/tdeepcopy_nocopy_field.nim @@ -0,0 +1,15 @@ +discard """ + matrix: "--mm:refc; --mm:orc --deepcopy:on" + errormsg: "'deepCopy' is not available for type " + file: "system.nim" +""" + +type + NoCopy = object + Container = object + value: NoCopy + +proc `=copy`(a: var NoCopy; b: NoCopy) {.error.} + +var a = new Container +var b = deepCopy(a)