From 6f120b0e75fca23fdeb869c9581289cd87ee7bd1 Mon Sep 17 00:00:00 2001 From: Scott Olsen Date: Mon, 24 Jan 2022 07:06:32 -0500 Subject: [PATCH] fix: mangle field names in setter templates (#1379) * fix: mangle field names in setter templates This fixes a regression whereby the names of struct fields weren't mangled in calls to setters/mutators, resulting in invalid C code if the user happened to use reserved words in their struct field names such as "short" or a disallowed character like a dash. * test: check struct field name mangle regression This test ensures struct field names are mangled correctly in C output. --- src/Deftype.hs | 4 ++-- test/regression.carp | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Deftype.hs b/src/Deftype.hs index ecb5e67d..6987fc2f 100644 --- a/src/Deftype.hs +++ b/src/Deftype.hs @@ -288,7 +288,7 @@ setterGenerator = TG.mkTemplateGenerator tgen decl body deps body GeneratorArg {tenv, env, instanceT = (FuncTy [_, ty] _ _), value = (TC.StructField name _)} = multilineTemplate [ "$DECL {", - memberDeletion tenv env (name, ty), + memberDeletion tenv env (mangle name, ty), " p." ++ (mangle name) ++ " = newValue;", " return p;", "}\n" @@ -319,7 +319,7 @@ mutatorGenerator = TG.mkTemplateGenerator tgen decl body deps body GeneratorArg {tenv, env, instanceT = (FuncTy [_, ty] _ _), value = (TC.StructField name _)} = multilineTemplate [ "$DECL {", - memberRefDeletion tenv env (name, ty), + memberRefDeletion tenv env (mangle name, ty), " pRef->" ++ mangle name ++ " = newValue;", "}\n" ] diff --git a/test/regression.carp b/test/regression.carp index 6d0ba14f..fbe19bdb 100644 --- a/test/regression.carp +++ b/test/regression.carp @@ -100,6 +100,13 @@ (defn poly-nest-two [x] (Bar.Qux.init (Bar.Baz x))) (defn poly-nest-three [x] (PolyNest (Bar.Baz x))) +;; struct field names are mangled correctly (#1378) +(deftype Mangled + [short Int ;; c reserved word + default-value String ;; invalid var name symbol (-) + ] + ) + (deftest test (assert-equal test 1 @@ -160,4 +167,9 @@ @(Bar.Baz.it (PolyNest.it &(poly-nest-three 2))) "test that polymorphic types in modules can be referred to using other types outside the module") + (assert-equal test + "bar" + (Mangled.default-value &(Mangled.set-default-value (Mangled.init 0 @"foo") + @"bar")) + "struct field names are mangled correctly") )