diff --git a/rtree-c/src/ReduceC.hs b/rtree-c/src/ReduceC.hs
index 1190e21aa632d64e900dc15623ced9bdae5cf77c..b6c5c38b9f843a04ad46ac39c5bc40d0c76e8774 100644
--- a/rtree-c/src/ReduceC.hs
+++ b/rtree-c/src/ReduceC.hs
@@ -28,12 +28,14 @@ import qualified Language.C.Data.Ident as C
 data Context = Context
   { keywords :: !(Set.Set Keyword)
   , typeDefs :: !(Map.Map C.Ident [C.CDeclarationSpecifier C.NodeInfo])
+  , inlineExprs :: !(Map.Map C.Ident C.CExpr)
   }
 
 data Keyword
   = KeepMain
   | DoNoops
   | NoSemantics
+  | AllowEmptyDeclarations
   deriving (Show, Read, Enum, Eq, Ord)
 
 type CM m = (MonadReduce (String, C.Position) m, MonadReader Context m, MonadFail m)
@@ -49,11 +51,19 @@ addTypeDefs ids cs Context{..} =
     , ..
     }
 
+addInlineExpr :: C.Ident -> C.CExpr -> Context -> Context
+addInlineExpr i e Context{..} =
+  Context
+    { inlineExprs = Map.insert i e inlineExprs
+    , ..
+    }
+
 defaultContext :: Context
 defaultContext =
   Context
     { keywords = Set.fromList [KeepMain]
     , typeDefs = Map.empty
+    , inlineExprs = Map.empty
     }
 
 keyword :: (MonadReader Context m) => Keyword -> m Bool
@@ -87,9 +97,37 @@ instance CReducible C.CTranslUnit where
                 ("inline typedef " <> C.identToString ids, C.posOf r)
                 (local (addTypeDefs [ids] rst) cont)
                 ((r :) <$> local (addTypeDefs [ids] [C.CTypeSpec (C.CTypeDef ids n)]) cont)
+            -- A const
+            C.CDecl rec decl ni' -> do
+              (decl', cont') <- foldr reduceCDeclarationItem (pure ([], cont)) decl
+              allow <- keyword AllowEmptyDeclarations
+              case decl' of
+                []
+                  | allow ->
+                      split ("remove empty declaration", C.posOf r) cont' do
+                        (C.CDeclExt (C.CDecl rec decl' ni') :) <$> cont'
+                  | otherwise -> cont'
+                _ow -> (C.CDeclExt (C.CDecl rec decl' ni') :) <$> cont'
             a -> don'tHandle a
         _r -> don'tHandle r
 
+reduceCDeclarationItem
+  :: (CM m)
+  => C.CDeclarationItem C.NodeInfo
+  -> m ([C.CDeclarationItem C.NodeInfo], m a)
+  -> m ([C.CDeclarationItem C.NodeInfo], m a)
+reduceCDeclarationItem d ma = case d of
+  C.CDeclarationItem
+    (C.CDeclr (Just i) [] Nothing [] ni)
+    (Just (C.CInitExpr c _))
+    Nothing -> do
+      (ds, cont) <- ma
+      split
+        ("inline variable " <> C.identToString i, C.posOf ni)
+        (pure (ds, local (addInlineExpr i c) cont))
+        (pure (d : ds, local (addInlineExpr i (C.CVar i ni)) cont))
+  a -> don'tHandle a
+
 prettyIdent :: C.Identifier C.NodeInfo -> [Char]
 prettyIdent (C.Ident s _ a) = s ++ " at " ++ show (C.posOfNode a)
 
@@ -109,10 +147,18 @@ reduceCCompoundBlockItem r cont = case r of
     split ("remove statement", C.posOf r) cont do
       smt' <- reduceC smt
       (C.CBlockStmt smt' :) <$> cont
-  C.CBlockDecl decl -> do
-    case decl of
-      C.CDecl{} -> do
-        (r :) <$> cont
+  C.CBlockDecl declr -> do
+    case declr of
+      C.CDecl rec decl ni' -> do
+        (decl', cont') <- foldr reduceCDeclarationItem (pure ([], cont)) decl
+        allow <- keyword AllowEmptyDeclarations
+        case decl' of
+          []
+            | allow ->
+                split ("remove empty declaration", C.posOf r) cont' do
+                  (C.CBlockDecl (C.CDecl rec decl' ni') :) <$> cont'
+            | otherwise -> cont'
+          _ow -> (C.CBlockDecl (C.CDecl rec decl' ni') :) <$> cont'
       d -> don'tHandle d
   a -> don'tHandle a
 
@@ -142,15 +188,6 @@ instance CReducible (C.CStatement C.NodeInfo) where
           pure $ C.CReturn Nothing ni
     a -> don'tHandle a
 
-splitIf :: (MonadReduce l m) => Bool -> l -> m a -> m a -> m a
-splitIf True s a b = split s a b
-splitIf False _ _ b = b
-
-splitOn :: (MonadReduce l m, MonadReader Context m) => Keyword -> l -> m a -> m a -> m a
-splitOn k s a b = do
-  con <- keyword k
-  splitIf con s a b
-
 --     C.CCompound is cbi ni -> do
 --       cbi' <- collect (reduce @C.CCompoundBlockItem) cbi
 --       pure $ C.CCompound is cbi' ni
@@ -214,8 +251,10 @@ instance CReducible C.CExpr where
           elhs' <- reduceC elhs
           erhs' <- reduceC erhs
           pure $ C.CBinary o elhs' erhs' ni
-    C.CVar i ni -> do
-      pure $ C.CVar i ni
+    C.CVar i _ -> do
+      asks (Map.lookup i . inlineExprs) >>= \case
+        Just mx -> pure mx
+        Nothing -> fail ("Could not find " <> show i)
     C.CConst x -> do
       pure $ C.CConst x
     C.CUnary o elhs ni -> do
@@ -264,6 +303,15 @@ instance CReducible C.CExpr where
 --    where
 --     onBothExpr elhs erhs = onBoth (reduce elhs) (reduce erhs)
 
+splitIf :: (MonadReduce l m) => Bool -> l -> m a -> m a -> m a
+splitIf True s a b = split s a b
+splitIf False _ _ b = b
+
+splitOn :: (MonadReduce l m, MonadReader Context m) => Keyword -> l -> m a -> m a -> m a
+splitOn k s a b = do
+  con <- keyword k
+  splitIf con s a b
+
 inlineTypeDefs :: forall d m. (Data d, MonadFail m, MonadReader Context m) => d -> m d
 inlineTypeDefs r = do
   case eqT @d @[C.CDeclarationSpecifier C.NodeInfo] of
diff --git a/rtree-c/test/cases/constant.c b/rtree-c/test/cases/constant.c
new file mode 100644
index 0000000000000000000000000000000000000000..1c591ba818f1ea54d1291a55b83e8846ce23ffbc
--- /dev/null
+++ b/rtree-c/test/cases/constant.c
@@ -0,0 +1,6 @@
+int x = 10;
+
+int main () { 
+  int y = 25;
+  return x + y;
+}
diff --git a/rtree-c/test/expected/constant/main.c b/rtree-c/test/expected/constant/main.c
new file mode 100644
index 0000000000000000000000000000000000000000..2d97bcf93dfde4721d4fb10cf918207fcddd7aed
--- /dev/null
+++ b/rtree-c/test/expected/constant/main.c
@@ -0,0 +1,6 @@
+int x = 10;
+int main()
+{
+    int y = 25;
+    return x + y;
+}
diff --git a/rtree-c/test/expected/constant/reduction/r000.c b/rtree-c/test/expected/constant/reduction/r000.c
new file mode 100644
index 0000000000000000000000000000000000000000..2d97bcf93dfde4721d4fb10cf918207fcddd7aed
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r000.c
@@ -0,0 +1,6 @@
+int x = 10;
+int main()
+{
+    int y = 25;
+    return x + y;
+}
diff --git a/rtree-c/test/expected/constant/reduction/r000.choices b/rtree-c/test/expected/constant/reduction/r000.choices
new file mode 100644
index 0000000000000000000000000000000000000000..805d1e46d119fb64eed5ced44893cc390c035fb4
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r000.choices
@@ -0,0 +1,3 @@
+0 remove statement at ("test/cases/constant.c": line 5)
+0 inline variable y at ("test/cases/constant.c": line 4)
+0 inline variable x at ("test/cases/constant.c": line 1)
diff --git a/rtree-c/test/expected/constant/reduction/r001.c b/rtree-c/test/expected/constant/reduction/r001.c
new file mode 100644
index 0000000000000000000000000000000000000000..ce017c75b05c4627b85cec0cf810ffd93c75fbe8
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r001.c
@@ -0,0 +1,5 @@
+int x = 10;
+int main()
+{
+    int y = 25;
+}
diff --git a/rtree-c/test/expected/constant/reduction/r001.choices b/rtree-c/test/expected/constant/reduction/r001.choices
new file mode 100644
index 0000000000000000000000000000000000000000..ac41d353d720bad82da47eac348f5e9316cf5275
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r001.choices
@@ -0,0 +1,3 @@
+1 remove statement at ("test/cases/constant.c": line 5)
+0 inline variable y at ("test/cases/constant.c": line 4)
+0 inline variable x at ("test/cases/constant.c": line 1)
diff --git a/rtree-c/test/expected/constant/reduction/r010.c b/rtree-c/test/expected/constant/reduction/r010.c
new file mode 100644
index 0000000000000000000000000000000000000000..c9d30b9e5ad490feb040d19b73449ec52b004149
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r010.c
@@ -0,0 +1,5 @@
+int x = 10;
+int main()
+{
+    return x + 25;
+}
diff --git a/rtree-c/test/expected/constant/reduction/r010.choices b/rtree-c/test/expected/constant/reduction/r010.choices
new file mode 100644
index 0000000000000000000000000000000000000000..f19a549046cd9717a58eb4492353ea9c58846037
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r010.choices
@@ -0,0 +1,3 @@
+0 remove statement at ("test/cases/constant.c": line 5)
+1 inline variable y at ("test/cases/constant.c": line 4)
+0 inline variable x at ("test/cases/constant.c": line 1)
diff --git a/rtree-c/test/expected/while-loops/reduction/r1.c b/rtree-c/test/expected/constant/reduction/r011.c
similarity index 50%
rename from rtree-c/test/expected/while-loops/reduction/r1.c
rename to rtree-c/test/expected/constant/reduction/r011.c
index 28c57198a6a492b3111dc1e96a5e9396ba9beb39..78bfe213fc82db904b7b2192675760ce23c3e333 100644
--- a/rtree-c/test/expected/while-loops/reduction/r1.c
+++ b/rtree-c/test/expected/constant/reduction/r011.c
@@ -1,4 +1,4 @@
+int x = 10;
 int main()
 {
-    int i = 0;
 }
diff --git a/rtree-c/test/expected/constant/reduction/r011.choices b/rtree-c/test/expected/constant/reduction/r011.choices
new file mode 100644
index 0000000000000000000000000000000000000000..22358a3035b055dbc9901595f4af49a3f92e3caa
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r011.choices
@@ -0,0 +1,3 @@
+1 remove statement at ("test/cases/constant.c": line 5)
+1 inline variable y at ("test/cases/constant.c": line 4)
+0 inline variable x at ("test/cases/constant.c": line 1)
diff --git a/rtree-c/test/expected/constant/reduction/r100.c b/rtree-c/test/expected/constant/reduction/r100.c
new file mode 100644
index 0000000000000000000000000000000000000000..1c93710aea3b96651b053d28c0c64b1348377d33
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r100.c
@@ -0,0 +1,5 @@
+int main()
+{
+    int y = 25;
+    return 10 + y;
+}
diff --git a/rtree-c/test/expected/constant/reduction/r100.choices b/rtree-c/test/expected/constant/reduction/r100.choices
new file mode 100644
index 0000000000000000000000000000000000000000..2bc5629417ea19a3ed8c35af79ca4967a7fba06f
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r100.choices
@@ -0,0 +1,3 @@
+0 remove statement at ("test/cases/constant.c": line 5)
+0 inline variable y at ("test/cases/constant.c": line 4)
+1 inline variable x at ("test/cases/constant.c": line 1)
diff --git a/rtree-c/test/expected/constant/reduction/r101.c b/rtree-c/test/expected/constant/reduction/r101.c
new file mode 100644
index 0000000000000000000000000000000000000000..b6737657ff782d61f57b7bf4485e388310c38207
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r101.c
@@ -0,0 +1,4 @@
+int main()
+{
+    int y = 25;
+}
diff --git a/rtree-c/test/expected/constant/reduction/r101.choices b/rtree-c/test/expected/constant/reduction/r101.choices
new file mode 100644
index 0000000000000000000000000000000000000000..e49e1e4b65150c4b7693bba10e9a26d1722c9e31
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r101.choices
@@ -0,0 +1,3 @@
+1 remove statement at ("test/cases/constant.c": line 5)
+0 inline variable y at ("test/cases/constant.c": line 4)
+1 inline variable x at ("test/cases/constant.c": line 1)
diff --git a/rtree-c/test/expected/constant/reduction/r110.c b/rtree-c/test/expected/constant/reduction/r110.c
new file mode 100644
index 0000000000000000000000000000000000000000..fd039c7be7e8c0d5329e00e1990368a2b7611ce6
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r110.c
@@ -0,0 +1,4 @@
+int main()
+{
+    return 10 + 25;
+}
diff --git a/rtree-c/test/expected/constant/reduction/r110.choices b/rtree-c/test/expected/constant/reduction/r110.choices
new file mode 100644
index 0000000000000000000000000000000000000000..f84f675a49a5d8d7d95ed9fcba369e1dc22a2f20
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r110.choices
@@ -0,0 +1,3 @@
+0 remove statement at ("test/cases/constant.c": line 5)
+1 inline variable y at ("test/cases/constant.c": line 4)
+1 inline variable x at ("test/cases/constant.c": line 1)
diff --git a/rtree-c/test/expected/constant/reduction/r111.c b/rtree-c/test/expected/constant/reduction/r111.c
new file mode 100644
index 0000000000000000000000000000000000000000..5047a34e393afabd94f779966acc69b8edf9570d
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r111.c
@@ -0,0 +1,3 @@
+int main()
+{
+}
diff --git a/rtree-c/test/expected/constant/reduction/r111.choices b/rtree-c/test/expected/constant/reduction/r111.choices
new file mode 100644
index 0000000000000000000000000000000000000000..e0fb7c237aaf449cba7c5c205152e157955abb70
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r111.choices
@@ -0,0 +1,3 @@
+1 remove statement at ("test/cases/constant.c": line 5)
+1 inline variable y at ("test/cases/constant.c": line 4)
+1 inline variable x at ("test/cases/constant.c": line 1)
diff --git a/rtree-c/test/expected/typedef/reduction/r000.c b/rtree-c/test/expected/typedef/reduction/r0000.c
similarity index 100%
rename from rtree-c/test/expected/typedef/reduction/r000.c
rename to rtree-c/test/expected/typedef/reduction/r0000.c
diff --git a/rtree-c/test/expected/typedef/reduction/r000.choices b/rtree-c/test/expected/typedef/reduction/r0000.choices
similarity index 75%
rename from rtree-c/test/expected/typedef/reduction/r000.choices
rename to rtree-c/test/expected/typedef/reduction/r0000.choices
index b281d1cc056d4d8dca690877b4f04f5b9ad42607..fa1b06c8e6595d32756258576f2307cde1e96280 100644
--- a/rtree-c/test/expected/typedef/reduction/r000.choices
+++ b/rtree-c/test/expected/typedef/reduction/r0000.choices
@@ -1,3 +1,4 @@
 0 remove statement at ("test/cases/typedef.c": line 9)
+0 inline variable x at ("test/cases/typedef.c": line 8)
 0 remove function f at ("test/cases/typedef.c": line 4)
 0 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r001.c b/rtree-c/test/expected/typedef/reduction/r0001.c
similarity index 100%
rename from rtree-c/test/expected/typedef/reduction/r001.c
rename to rtree-c/test/expected/typedef/reduction/r0001.c
diff --git a/rtree-c/test/expected/typedef/reduction/r001.choices b/rtree-c/test/expected/typedef/reduction/r0001.choices
similarity index 75%
rename from rtree-c/test/expected/typedef/reduction/r001.choices
rename to rtree-c/test/expected/typedef/reduction/r0001.choices
index a44e5d57ac287e233313d33ee873448ea5efdea1..9c6d7a29d18ea39ee552b5dbb3c25adfd704220c 100644
--- a/rtree-c/test/expected/typedef/reduction/r001.choices
+++ b/rtree-c/test/expected/typedef/reduction/r0001.choices
@@ -1,3 +1,4 @@
 1 remove statement at ("test/cases/typedef.c": line 9)
+0 inline variable x at ("test/cases/typedef.c": line 8)
 0 remove function f at ("test/cases/typedef.c": line 4)
 0 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r0010.c b/rtree-c/test/expected/typedef/reduction/r0010.c
new file mode 100644
index 0000000000000000000000000000000000000000..d13fa764ff869364db73713978f3495c2e958d75
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r0010.c
@@ -0,0 +1,8 @@
+typedef int uint64;
+void f(uint64 a)
+{
+}
+int main()
+{
+    return 1;
+}
diff --git a/rtree-c/test/expected/typedef/reduction/r0010.choices b/rtree-c/test/expected/typedef/reduction/r0010.choices
new file mode 100644
index 0000000000000000000000000000000000000000..986dac1ebe69e74d0a19d4f7e07a6a80aac4ffd0
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r0010.choices
@@ -0,0 +1,4 @@
+0 remove statement at ("test/cases/typedef.c": line 9)
+1 inline variable x at ("test/cases/typedef.c": line 8)
+0 remove function f at ("test/cases/typedef.c": line 4)
+0 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r0011.c b/rtree-c/test/expected/typedef/reduction/r0011.c
new file mode 100644
index 0000000000000000000000000000000000000000..1ce0a1b4da14e3c937604fee4dba5a9544aff775
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r0011.c
@@ -0,0 +1,7 @@
+typedef int uint64;
+void f(uint64 a)
+{
+}
+int main()
+{
+}
diff --git a/rtree-c/test/expected/typedef/reduction/r0011.choices b/rtree-c/test/expected/typedef/reduction/r0011.choices
new file mode 100644
index 0000000000000000000000000000000000000000..81989ef72ad294d9967dd5f4d6a9adab191974e1
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r0011.choices
@@ -0,0 +1,4 @@
+1 remove statement at ("test/cases/typedef.c": line 9)
+1 inline variable x at ("test/cases/typedef.c": line 8)
+0 remove function f at ("test/cases/typedef.c": line 4)
+0 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r010.c b/rtree-c/test/expected/typedef/reduction/r0100.c
similarity index 100%
rename from rtree-c/test/expected/typedef/reduction/r010.c
rename to rtree-c/test/expected/typedef/reduction/r0100.c
diff --git a/rtree-c/test/expected/typedef/reduction/r010.choices b/rtree-c/test/expected/typedef/reduction/r0100.choices
similarity index 75%
rename from rtree-c/test/expected/typedef/reduction/r010.choices
rename to rtree-c/test/expected/typedef/reduction/r0100.choices
index dbaeb2cd58084015017a8237845112fa630a5eba..145e4f841fda106b262dd5a47f9148ecc6de549b 100644
--- a/rtree-c/test/expected/typedef/reduction/r010.choices
+++ b/rtree-c/test/expected/typedef/reduction/r0100.choices
@@ -1,3 +1,4 @@
 0 remove statement at ("test/cases/typedef.c": line 9)
+0 inline variable x at ("test/cases/typedef.c": line 8)
 1 remove function f at ("test/cases/typedef.c": line 4)
 0 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r011.c b/rtree-c/test/expected/typedef/reduction/r0101.c
similarity index 100%
rename from rtree-c/test/expected/typedef/reduction/r011.c
rename to rtree-c/test/expected/typedef/reduction/r0101.c
diff --git a/rtree-c/test/expected/typedef/reduction/r011.choices b/rtree-c/test/expected/typedef/reduction/r0101.choices
similarity index 75%
rename from rtree-c/test/expected/typedef/reduction/r011.choices
rename to rtree-c/test/expected/typedef/reduction/r0101.choices
index 92fc7aed082767056d3e534e2556b35ae2a40f85..0bda8fbe7c2147d2a5553d29d893c694a13596f2 100644
--- a/rtree-c/test/expected/typedef/reduction/r011.choices
+++ b/rtree-c/test/expected/typedef/reduction/r0101.choices
@@ -1,3 +1,4 @@
 1 remove statement at ("test/cases/typedef.c": line 9)
+0 inline variable x at ("test/cases/typedef.c": line 8)
 1 remove function f at ("test/cases/typedef.c": line 4)
 0 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r0110.c b/rtree-c/test/expected/typedef/reduction/r0110.c
new file mode 100644
index 0000000000000000000000000000000000000000..239f38da754c844fc4b0457660d2e10d61d62f2f
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r0110.c
@@ -0,0 +1,5 @@
+typedef int uint64;
+int main()
+{
+    return 1;
+}
diff --git a/rtree-c/test/expected/typedef/reduction/r0110.choices b/rtree-c/test/expected/typedef/reduction/r0110.choices
new file mode 100644
index 0000000000000000000000000000000000000000..8f09241ff2e8edca31007a2da29e915342f8a1cf
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r0110.choices
@@ -0,0 +1,4 @@
+0 remove statement at ("test/cases/typedef.c": line 9)
+1 inline variable x at ("test/cases/typedef.c": line 8)
+1 remove function f at ("test/cases/typedef.c": line 4)
+0 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r0111.c b/rtree-c/test/expected/typedef/reduction/r0111.c
new file mode 100644
index 0000000000000000000000000000000000000000..17825b9e9424118eaa839851f59cf1e5426b394c
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r0111.c
@@ -0,0 +1,4 @@
+typedef int uint64;
+int main()
+{
+}
diff --git a/rtree-c/test/expected/typedef/reduction/r0111.choices b/rtree-c/test/expected/typedef/reduction/r0111.choices
new file mode 100644
index 0000000000000000000000000000000000000000..291f3872f4326a47f9fa22cec8531f60cd0f3dcd
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r0111.choices
@@ -0,0 +1,4 @@
+1 remove statement at ("test/cases/typedef.c": line 9)
+1 inline variable x at ("test/cases/typedef.c": line 8)
+1 remove function f at ("test/cases/typedef.c": line 4)
+0 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r100.c b/rtree-c/test/expected/typedef/reduction/r1000.c
similarity index 100%
rename from rtree-c/test/expected/typedef/reduction/r100.c
rename to rtree-c/test/expected/typedef/reduction/r1000.c
diff --git a/rtree-c/test/expected/typedef/reduction/r100.choices b/rtree-c/test/expected/typedef/reduction/r1000.choices
similarity index 75%
rename from rtree-c/test/expected/typedef/reduction/r100.choices
rename to rtree-c/test/expected/typedef/reduction/r1000.choices
index 48c32e18558929bdc7b8d123db70aef4b17775bb..a7a7a5002ff2b5714cf3dafd9e897bb4ec864b61 100644
--- a/rtree-c/test/expected/typedef/reduction/r100.choices
+++ b/rtree-c/test/expected/typedef/reduction/r1000.choices
@@ -1,3 +1,4 @@
 0 remove statement at ("test/cases/typedef.c": line 9)
+0 inline variable x at ("test/cases/typedef.c": line 8)
 0 remove function f at ("test/cases/typedef.c": line 4)
 1 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r101.c b/rtree-c/test/expected/typedef/reduction/r1001.c
similarity index 100%
rename from rtree-c/test/expected/typedef/reduction/r101.c
rename to rtree-c/test/expected/typedef/reduction/r1001.c
diff --git a/rtree-c/test/expected/typedef/reduction/r101.choices b/rtree-c/test/expected/typedef/reduction/r1001.choices
similarity index 75%
rename from rtree-c/test/expected/typedef/reduction/r101.choices
rename to rtree-c/test/expected/typedef/reduction/r1001.choices
index 76ba0838e1966d7c327004b76996ac790bcfa1a9..d8280cc9d7f16472a3438f0c4b9f1755d74cf32d 100644
--- a/rtree-c/test/expected/typedef/reduction/r101.choices
+++ b/rtree-c/test/expected/typedef/reduction/r1001.choices
@@ -1,3 +1,4 @@
 1 remove statement at ("test/cases/typedef.c": line 9)
+0 inline variable x at ("test/cases/typedef.c": line 8)
 0 remove function f at ("test/cases/typedef.c": line 4)
 1 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r1010.c b/rtree-c/test/expected/typedef/reduction/r1010.c
new file mode 100644
index 0000000000000000000000000000000000000000..e11fc7db8535b827ed08921ae1187b553db5c19b
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r1010.c
@@ -0,0 +1,7 @@
+void f(int a)
+{
+}
+int main()
+{
+    return 1;
+}
diff --git a/rtree-c/test/expected/typedef/reduction/r1010.choices b/rtree-c/test/expected/typedef/reduction/r1010.choices
new file mode 100644
index 0000000000000000000000000000000000000000..4b158a3624bdd6d66fc8d2334a170db7937637f9
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r1010.choices
@@ -0,0 +1,4 @@
+0 remove statement at ("test/cases/typedef.c": line 9)
+1 inline variable x at ("test/cases/typedef.c": line 8)
+0 remove function f at ("test/cases/typedef.c": line 4)
+1 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r1011.c b/rtree-c/test/expected/typedef/reduction/r1011.c
new file mode 100644
index 0000000000000000000000000000000000000000..3fa6be1ce4f41bead5cd77acb39b5eabda8c589d
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r1011.c
@@ -0,0 +1,6 @@
+void f(int a)
+{
+}
+int main()
+{
+}
diff --git a/rtree-c/test/expected/typedef/reduction/r1011.choices b/rtree-c/test/expected/typedef/reduction/r1011.choices
new file mode 100644
index 0000000000000000000000000000000000000000..76cb6f2d73496a11b52f97431706bd4dd03cb1de
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r1011.choices
@@ -0,0 +1,4 @@
+1 remove statement at ("test/cases/typedef.c": line 9)
+1 inline variable x at ("test/cases/typedef.c": line 8)
+0 remove function f at ("test/cases/typedef.c": line 4)
+1 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r110.c b/rtree-c/test/expected/typedef/reduction/r1100.c
similarity index 100%
rename from rtree-c/test/expected/typedef/reduction/r110.c
rename to rtree-c/test/expected/typedef/reduction/r1100.c
diff --git a/rtree-c/test/expected/typedef/reduction/r110.choices b/rtree-c/test/expected/typedef/reduction/r1100.choices
similarity index 75%
rename from rtree-c/test/expected/typedef/reduction/r110.choices
rename to rtree-c/test/expected/typedef/reduction/r1100.choices
index e70ee972eeca9c39b5ab1c9f833f507f7c2fc429..9ee0fbdbfa1db3e739c12424206f2478ee8714f1 100644
--- a/rtree-c/test/expected/typedef/reduction/r110.choices
+++ b/rtree-c/test/expected/typedef/reduction/r1100.choices
@@ -1,3 +1,4 @@
 0 remove statement at ("test/cases/typedef.c": line 9)
+0 inline variable x at ("test/cases/typedef.c": line 8)
 1 remove function f at ("test/cases/typedef.c": line 4)
 1 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r111.c b/rtree-c/test/expected/typedef/reduction/r1101.c
similarity index 100%
rename from rtree-c/test/expected/typedef/reduction/r111.c
rename to rtree-c/test/expected/typedef/reduction/r1101.c
diff --git a/rtree-c/test/expected/typedef/reduction/r111.choices b/rtree-c/test/expected/typedef/reduction/r1101.choices
similarity index 75%
rename from rtree-c/test/expected/typedef/reduction/r111.choices
rename to rtree-c/test/expected/typedef/reduction/r1101.choices
index bceac89ebba248df4d51bad64bbcd0cbdd31bc65..1e5ebac29c639c077c68fadfbcb41260eecebd9a 100644
--- a/rtree-c/test/expected/typedef/reduction/r111.choices
+++ b/rtree-c/test/expected/typedef/reduction/r1101.choices
@@ -1,3 +1,4 @@
 1 remove statement at ("test/cases/typedef.c": line 9)
+0 inline variable x at ("test/cases/typedef.c": line 8)
 1 remove function f at ("test/cases/typedef.c": line 4)
 1 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r1110.c b/rtree-c/test/expected/typedef/reduction/r1110.c
new file mode 100644
index 0000000000000000000000000000000000000000..2227c3aa8f2039e763e3b1aefe282dfc7c5e9ac5
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r1110.c
@@ -0,0 +1,4 @@
+int main()
+{
+    return 1;
+}
diff --git a/rtree-c/test/expected/typedef/reduction/r1110.choices b/rtree-c/test/expected/typedef/reduction/r1110.choices
new file mode 100644
index 0000000000000000000000000000000000000000..2b8312610e1d15b698520e473b45113b87ee9bfe
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r1110.choices
@@ -0,0 +1,4 @@
+0 remove statement at ("test/cases/typedef.c": line 9)
+1 inline variable x at ("test/cases/typedef.c": line 8)
+1 remove function f at ("test/cases/typedef.c": line 4)
+1 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r1111.c b/rtree-c/test/expected/typedef/reduction/r1111.c
new file mode 100644
index 0000000000000000000000000000000000000000..5047a34e393afabd94f779966acc69b8edf9570d
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r1111.c
@@ -0,0 +1,3 @@
+int main()
+{
+}
diff --git a/rtree-c/test/expected/typedef/reduction/r1111.choices b/rtree-c/test/expected/typedef/reduction/r1111.choices
new file mode 100644
index 0000000000000000000000000000000000000000..6c02b126cbc0bd321d5c230fed9ef77386727329
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r1111.choices
@@ -0,0 +1,4 @@
+1 remove statement at ("test/cases/typedef.c": line 9)
+1 inline variable x at ("test/cases/typedef.c": line 8)
+1 remove function f at ("test/cases/typedef.c": line 4)
+1 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/while-loops/reduction/r00.c b/rtree-c/test/expected/while-loops/reduction/r000.c
similarity index 100%
rename from rtree-c/test/expected/while-loops/reduction/r00.c
rename to rtree-c/test/expected/while-loops/reduction/r000.c
diff --git a/rtree-c/test/expected/while-loops/reduction/r00.choices b/rtree-c/test/expected/while-loops/reduction/r000.choices
similarity index 66%
rename from rtree-c/test/expected/while-loops/reduction/r00.choices
rename to rtree-c/test/expected/while-loops/reduction/r000.choices
index 4fee46cf1f79a8ce57fa9a30b2ab28878952f482..7712d43e629a34c2a3b633011741ded2268b6c94 100644
--- a/rtree-c/test/expected/while-loops/reduction/r00.choices
+++ b/rtree-c/test/expected/while-loops/reduction/r000.choices
@@ -1,2 +1,3 @@
 0 remove statement at ("test/cases/while-loops.c": line 4)
 0 remove statement at ("test/cases/while-loops.c": line 3)
+0 inline variable i at ("test/cases/while-loops.c": line 2)
diff --git a/rtree-c/test/expected/while-loops/reduction/r001.c b/rtree-c/test/expected/while-loops/reduction/r001.c
new file mode 100644
index 0000000000000000000000000000000000000000..714143b53b7c7e544b37c7a0753133581e2673ca
--- /dev/null
+++ b/rtree-c/test/expected/while-loops/reduction/r001.c
@@ -0,0 +1,7 @@
+int main()
+{
+    int i = 0;
+    while (i < 10)
+    {
+    }
+}
diff --git a/rtree-c/test/expected/while-loops/reduction/r001.choices b/rtree-c/test/expected/while-loops/reduction/r001.choices
new file mode 100644
index 0000000000000000000000000000000000000000..f04eb9779dcdd1f0f610631f3d9c9d7d85883d2d
--- /dev/null
+++ b/rtree-c/test/expected/while-loops/reduction/r001.choices
@@ -0,0 +1,3 @@
+1 remove statement at ("test/cases/while-loops.c": line 4)
+0 remove statement at ("test/cases/while-loops.c": line 3)
+0 inline variable i at ("test/cases/while-loops.c": line 2)
diff --git a/rtree-c/test/expected/while-loops/reduction/r01.c b/rtree-c/test/expected/while-loops/reduction/r01.c
index 714143b53b7c7e544b37c7a0753133581e2673ca..28c57198a6a492b3111dc1e96a5e9396ba9beb39 100644
--- a/rtree-c/test/expected/while-loops/reduction/r01.c
+++ b/rtree-c/test/expected/while-loops/reduction/r01.c
@@ -1,7 +1,4 @@
 int main()
 {
     int i = 0;
-    while (i < 10)
-    {
-    }
 }
diff --git a/rtree-c/test/expected/while-loops/reduction/r01.choices b/rtree-c/test/expected/while-loops/reduction/r01.choices
index 69ec6af359513d77d57c1fafb3c512098af6f0ab..a891b77d9a4d800f3247c06fd59131bad2bad7f0 100644
--- a/rtree-c/test/expected/while-loops/reduction/r01.choices
+++ b/rtree-c/test/expected/while-loops/reduction/r01.choices
@@ -1,2 +1,2 @@
-1 remove statement at ("test/cases/while-loops.c": line 4)
-0 remove statement at ("test/cases/while-loops.c": line 3)
+1 remove statement at ("test/cases/while-loops.c": line 3)
+0 inline variable i at ("test/cases/while-loops.c": line 2)
diff --git a/rtree-c/test/expected/while-loops/reduction/r1.choices b/rtree-c/test/expected/while-loops/reduction/r1.choices
deleted file mode 100644
index efbb5949e944a195a22d82ee752f00cf2a476370..0000000000000000000000000000000000000000
--- a/rtree-c/test/expected/while-loops/reduction/r1.choices
+++ /dev/null
@@ -1 +0,0 @@
-1 remove statement at ("test/cases/while-loops.c": line 3)
diff --git a/rtree-c/test/expected/while-loops/reduction/r100.c b/rtree-c/test/expected/while-loops/reduction/r100.c
new file mode 100644
index 0000000000000000000000000000000000000000..45b4b7d818fe7858b9d3d0a947864f06dd4ee878
--- /dev/null
+++ b/rtree-c/test/expected/while-loops/reduction/r100.c
@@ -0,0 +1,7 @@
+int main()
+{
+    while (0 < 10)
+    {
+        0++;
+    }
+}
diff --git a/rtree-c/test/expected/while-loops/reduction/r100.choices b/rtree-c/test/expected/while-loops/reduction/r100.choices
new file mode 100644
index 0000000000000000000000000000000000000000..cdd24cf81de2e3678302398cb7b2b6e904a632fd
--- /dev/null
+++ b/rtree-c/test/expected/while-loops/reduction/r100.choices
@@ -0,0 +1,3 @@
+0 remove statement at ("test/cases/while-loops.c": line 4)
+0 remove statement at ("test/cases/while-loops.c": line 3)
+1 inline variable i at ("test/cases/while-loops.c": line 2)
diff --git a/rtree-c/test/expected/while-loops/reduction/r101.c b/rtree-c/test/expected/while-loops/reduction/r101.c
new file mode 100644
index 0000000000000000000000000000000000000000..db783f8abc2aa6c74e9d960fe7adcb51b6e6aaa2
--- /dev/null
+++ b/rtree-c/test/expected/while-loops/reduction/r101.c
@@ -0,0 +1,6 @@
+int main()
+{
+    while (0 < 10)
+    {
+    }
+}
diff --git a/rtree-c/test/expected/while-loops/reduction/r101.choices b/rtree-c/test/expected/while-loops/reduction/r101.choices
new file mode 100644
index 0000000000000000000000000000000000000000..c054f9bf22f796706f42415497dbd8498f4eaca7
--- /dev/null
+++ b/rtree-c/test/expected/while-loops/reduction/r101.choices
@@ -0,0 +1,3 @@
+1 remove statement at ("test/cases/while-loops.c": line 4)
+0 remove statement at ("test/cases/while-loops.c": line 3)
+1 inline variable i at ("test/cases/while-loops.c": line 2)
diff --git a/rtree-c/test/expected/while-loops/reduction/r11.c b/rtree-c/test/expected/while-loops/reduction/r11.c
new file mode 100644
index 0000000000000000000000000000000000000000..5047a34e393afabd94f779966acc69b8edf9570d
--- /dev/null
+++ b/rtree-c/test/expected/while-loops/reduction/r11.c
@@ -0,0 +1,3 @@
+int main()
+{
+}
diff --git a/rtree-c/test/expected/while-loops/reduction/r11.choices b/rtree-c/test/expected/while-loops/reduction/r11.choices
new file mode 100644
index 0000000000000000000000000000000000000000..7ad5e3f7c856b11eb527175b51ccf044ab2a113e
--- /dev/null
+++ b/rtree-c/test/expected/while-loops/reduction/r11.choices
@@ -0,0 +1,2 @@
+1 remove statement at ("test/cases/while-loops.c": line 3)
+1 inline variable i at ("test/cases/while-loops.c": line 2)