diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2020-10-01 09:46:50 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-01 09:46:50 +0200 |
commit | b703f02ad2a95975513f07d1a48c368b80825ddb (patch) | |
tree | 194f411a96006d222936990a9d0c687cfbcb2d08 | |
parent | 6b3654c48de4b0c431e1bfaad6d34ec3e33df026 (diff) | |
download | Nim-b703f02ad2a95975513f07d1a48c368b80825ddb.tar.gz |
added missing .noalias support for object fields (#15445)
-rw-r--r-- | compiler/ccgtypes.nim | 8 | ||||
-rw-r--r-- | tests/ccgbugs/tnoalias.nim | 7 |
2 files changed, 11 insertions, 4 deletions
diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim index ff7b17590..c1a214532 100644 --- a/compiler/ccgtypes.nim +++ b/compiler/ccgtypes.nim @@ -564,19 +564,21 @@ proc genRecordFieldsAux(m: BModule, n: PNode, # have to recurse via 'getTypeDescAux'. And not doing so prevents problems # with heavily templatized C++ code: if not isImportedCppType(rectype): + let noAlias = if sfNoalias in field.flags: ~" NIM_NOALIAS" else: nil + let fieldType = field.loc.lode.typ.skipTypes(abstractInst) if fieldType.kind == tyUncheckedArray: result.addf("$1 $2[SEQ_DECL_SIZE];$n", [getTypeDescAux(m, fieldType.elemType, check, skField), sname]) elif fieldType.kind == tySequence: # we need to use a weak dependency here for trecursive_table. - result.addf("$1 $2;$n", [getTypeDescWeak(m, field.loc.t, check, skField), sname]) + result.addf("$1$3 $2;$n", [getTypeDescWeak(m, field.loc.t, check, skField), sname, noAlias]) elif field.bitsize != 0: - result.addf("$1 $2:$3;$n", [getTypeDescAux(m, field.loc.t, check, skField), sname, rope($field.bitsize)]) + result.addf("$1$4 $2:$3;$n", [getTypeDescAux(m, field.loc.t, check, skField), sname, rope($field.bitsize), noAlias]) else: # don't use fieldType here because we need the # tyGenericInst for C++ template support - result.addf("$1 $2;$n", [getTypeDescAux(m, field.loc.t, check, skField), sname]) + result.addf("$1$3 $2;$n", [getTypeDescAux(m, field.loc.t, check, skField), sname, noAlias]) else: internalError(m.config, n.info, "genRecordFieldsAux()") proc getRecordFields(m: BModule, typ: PType, check: var IntSet): Rope = diff --git a/tests/ccgbugs/tnoalias.nim b/tests/ccgbugs/tnoalias.nim index 5ddfac5bb..0c6e84e44 100644 --- a/tests/ccgbugs/tnoalias.nim +++ b/tests/ccgbugs/tnoalias.nim @@ -1,8 +1,13 @@ discard """ - ccodecheck: "\\i@'NIM_CHAR* NIM_NOALIAS x,' @'void* NIM_NOALIAS q'" + ccodecheck: "\\i@'NI* NIM_NOALIAS field;' @'NIM_CHAR* NIM_NOALIAS x,' @'void* NIM_NOALIAS q'" """ +type + BigNum = object + field {.noalias.}: ptr UncheckedArray[int] + proc p(x {.noalias.}: openArray[char]) = var q {.noalias.}: pointer = unsafeAddr(x[0]) +var bn: BigNum p "abc" |