From 52f03fabc12f7f0cd9ed41b55d8c03fb5319f971 Mon Sep 17 00:00:00 2001 From: Vindaar Date: Mon, 27 Aug 2018 08:35:07 +0200 Subject: [PATCH] fixes #8781 by appending "_U" instead of 'U' (#8787) --- compiler/ccgtypes.nim | 4 +++- tests/ccgbugs/t8781.nim | 25 +++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 tests/ccgbugs/t8781.nim diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim index 59fbfc3e1..dd79f4846 100644 --- a/compiler/ccgtypes.nim +++ b/compiler/ccgtypes.nim @@ -449,7 +449,9 @@ proc genRecordFieldsAux(m: BModule, n: PNode, of nkRecCase: if n.sons[0].kind != nkSym: internalError(m.config, n.info, "genRecordFieldsAux") add(result, genRecordFieldsAux(m, n.sons[0], accessExpr, rectype, check)) - let uname = rope(mangle(n.sons[0].sym.name.s) & 'U') + # prefix mangled name with "_U" to avoid clashes with other field names, + # since identifiers are not allowed to start with '_' + let uname = rope("_U" & mangle(n.sons[0].sym.name.s)) let ae = if accessExpr != nil: "$1.$2" % [accessExpr, uname] else: uname var unionBody: Rope = nil diff --git a/tests/ccgbugs/t8781.nim b/tests/ccgbugs/t8781.nim new file mode 100644 index 000000000..1fa8ec8a5 --- /dev/null +++ b/tests/ccgbugs/t8781.nim @@ -0,0 +1,25 @@ +discard """ +output: "" +""" + +type + Drawable = object of RootObj + discard + + # issue #8781, following type was broken due to 'U' suffix + # on `animatedU`. U also added as union identifier for C. + # replaced by "_U" prefix, which is not allowed as an + # identifier + TypeOne = ref object of Drawable + animatedU: bool + case animated: bool + of true: + frames: seq[int] + of false: + region: float + +when isMainModule: + let r = 1.5 + let a = TypeOne(animatedU: true, + animated: false, + region: r)