Fix enum cross-compilation support
authorIan Lynagh <igloo@earth.li>
Wed, 23 Mar 2011 23:02:37 +0000 (23:02 +0000)
committerIan Lynagh <igloo@earth.li>
Wed, 23 Mar 2011 23:02:37 +0000 (23:02 +0000)
For:
    #{enum ControlOp, ControlOp
     , controlOpAdd    = EPOLL_CTL_ADD
     , controlOpModify = EPOLL_CTL_MOD
     , controlOpDelete = EPOLL_CTL_DEL
     }
we were generating something like:
    void _hsc2hs_test19()
    {
        static int test_array[( EPOLL_CTL_ADD) > 0 ? 2 : 1];
        (void)test_array;
        static int test_array[( EPOLL_CTL_MOD) > 0 ? 2 : 1];
        (void)test_array;
        static int test_array[( EPOLL_CTL_DEL) > 0 ? 2 : 1];
        (void)test_array;
    }
which gave errors like:
    EPoll.hsc:136: error: redeclaration of ‘test_array’ with no linkage

We now wrap each
    static int test_array[( EPOLL_CTL_ADD) > 0 ? 2 : 1];
    (void)test_array;
in { ... }

CrossCodegen.hs

index 5f58156..c3afd56 100644 (file)
@@ -287,7 +287,7 @@ outValidityCheck s@(Special pos key value) uniq =
                 "}\n"
 
     -- we want this to fail if the value is syntactically invalid or isn't a constant
-    validConstTest value' = outCLine pos ++ "    static int test_array[(" ++ value' ++ ") > 0 ? 2 : 1];\n    (void)test_array;\n";
+    validConstTest value' = outCLine pos ++ "    {\n        static int test_array[(" ++ value' ++ ") > 0 ? 2 : 1];\n        (void)test_array;\n    }\n";
 
 outValidityCheck (Text _ _) _ = ""