diff --git a/theories/typing/singleton.v b/theories/typing/singleton.v
index bb9e92df093c7ec4c802a99df9ef0cb3a1f983b3..ec66a7b7f9569d0b632edbc9925c2cae74219d88 100644
--- a/theories/typing/singleton.v
+++ b/theories/typing/singleton.v
@@ -27,6 +27,17 @@ Section singleton_val.
     SimplifyHypVal v (singleton_val ly p) (Some 0%N) :=
     λ T, i2p (singleton_val_simplify v T ly p).
 
+  Lemma singleton_val_subsume_goal v v' ly ty `{!Movable ty} T:
+    (v ◁ᵥ ty -∗ ⌜ty.(ty_layout) = ly⌝ ∗ ⌜v = v'⌝ ∗ T) -∗
+    subsume (v ◁ᵥ ty) (v ◁ᵥ singleton_val ly v') T.
+  Proof.
+    iIntros "HT Hty". iDestruct (ty_size_eq with "Hty") as %Hly.
+    by iDestruct ("HT" with "Hty") as (<- ->) "$".
+  Qed.
+  Global Instance singleton_val_subsume_goal_inst v v' ly ty `{!Movable ty}:
+    SubsumeVal v ty (singleton_val ly v') :=
+    λ T, i2p (singleton_val_subsume_goal v v' ly ty T).
+
   Lemma singleton_val_merge v l ly T:
     (find_in_context (FindVal v) (λ ty:mtype, ⌜ty.(ty_layout) = ly⌝ ∗ (l ◁ₗ ty -∗ T))) -∗
       simplify_hyp (l ◁ₗ singleton_val ly v) T.
diff --git a/tutorial/proofs/t03_list/generated_code.v b/tutorial/proofs/t03_list/generated_code.v
index dae4270c3cdbac5f458d1dd3d4f8308356e26249..f642ed05474c99f12f045131a43d1cfb22e647ad 100644
--- a/tutorial/proofs/t03_list/generated_code.v
+++ b/tutorial/proofs/t03_list/generated_code.v
@@ -6,163 +6,163 @@ Set Default Proof Using "Type".
 (* Generated from [tutorial/t03_list.c]. *)
 Section code.
   Definition file_0 : string := "tutorial/t03_list.c".
-  Definition loc_2 : location_info := LocationInfo file_0 141 4 141 25.
-  Definition loc_3 : location_info := LocationInfo file_0 142 4 142 42.
-  Definition loc_4 : location_info := LocationInfo file_0 143 4 143 42.
-  Definition loc_5 : location_info := LocationInfo file_0 144 4 144 42.
-  Definition loc_6 : location_info := LocationInfo file_0 146 4 146 28.
-  Definition loc_7 : location_info := LocationInfo file_0 148 4 148 15.
-  Definition loc_8 : location_info := LocationInfo file_0 149 4 149 15.
-  Definition loc_9 : location_info := LocationInfo file_0 150 4 150 15.
-  Definition loc_10 : location_info := LocationInfo file_0 152 4 152 29.
-  Definition loc_11 : location_info := LocationInfo file_0 153 4 153 29.
-  Definition loc_12 : location_info := LocationInfo file_0 154 4 154 29.
-  Definition loc_13 : location_info := LocationInfo file_0 156 4 156 29.
-  Definition loc_14 : location_info := LocationInfo file_0 158 4 158 25.
-  Definition loc_15 : location_info := LocationInfo file_0 160 4 160 29.
-  Definition loc_16 : location_info := LocationInfo file_0 162 4 162 23.
-  Definition loc_17 : location_info := LocationInfo file_0 163 4 163 23.
-  Definition loc_18 : location_info := LocationInfo file_0 164 4 164 23.
-  Definition loc_19 : location_info := LocationInfo file_0 166 4 166 28.
-  Definition loc_20 : location_info := LocationInfo file_0 168 4 168 32.
-  Definition loc_21 : location_info := LocationInfo file_0 169 4 169 32.
-  Definition loc_22 : location_info := LocationInfo file_0 170 4 170 32.
-  Definition loc_23 : location_info := LocationInfo file_0 172 4 172 32.
-  Definition loc_24 : location_info := LocationInfo file_0 173 4 173 32.
-  Definition loc_25 : location_info := LocationInfo file_0 174 4 174 32.
-  Definition loc_26 : location_info := LocationInfo file_0 174 4 174 8.
-  Definition loc_27 : location_info := LocationInfo file_0 174 4 174 8.
-  Definition loc_28 : location_info := LocationInfo file_0 174 9 174 23.
-  Definition loc_29 : location_info := LocationInfo file_0 174 25 174 30.
-  Definition loc_30 : location_info := LocationInfo file_0 174 25 174 30.
-  Definition loc_31 : location_info := LocationInfo file_0 173 4 173 8.
-  Definition loc_32 : location_info := LocationInfo file_0 173 4 173 8.
-  Definition loc_33 : location_info := LocationInfo file_0 173 9 173 23.
-  Definition loc_34 : location_info := LocationInfo file_0 173 25 173 30.
-  Definition loc_35 : location_info := LocationInfo file_0 173 25 173 30.
-  Definition loc_36 : location_info := LocationInfo file_0 172 4 172 8.
-  Definition loc_37 : location_info := LocationInfo file_0 172 4 172 8.
-  Definition loc_38 : location_info := LocationInfo file_0 172 9 172 23.
-  Definition loc_39 : location_info := LocationInfo file_0 172 25 172 30.
-  Definition loc_40 : location_info := LocationInfo file_0 172 25 172 30.
-  Definition loc_41 : location_info := LocationInfo file_0 170 11 170 30.
-  Definition loc_42 : location_info := LocationInfo file_0 170 11 170 17.
-  Definition loc_43 : location_info := LocationInfo file_0 170 11 170 17.
-  Definition loc_44 : location_info := LocationInfo file_0 170 12 170 17.
-  Definition loc_45 : location_info := LocationInfo file_0 170 12 170 17.
-  Definition loc_46 : location_info := LocationInfo file_0 170 21 170 30.
-  Definition loc_47 : location_info := LocationInfo file_0 170 29 170 30.
-  Definition loc_48 : location_info := LocationInfo file_0 169 11 169 30.
-  Definition loc_49 : location_info := LocationInfo file_0 169 11 169 17.
-  Definition loc_50 : location_info := LocationInfo file_0 169 11 169 17.
-  Definition loc_51 : location_info := LocationInfo file_0 169 12 169 17.
-  Definition loc_52 : location_info := LocationInfo file_0 169 12 169 17.
-  Definition loc_53 : location_info := LocationInfo file_0 169 21 169 30.
-  Definition loc_54 : location_info := LocationInfo file_0 169 29 169 30.
-  Definition loc_55 : location_info := LocationInfo file_0 168 11 168 30.
-  Definition loc_56 : location_info := LocationInfo file_0 168 11 168 17.
-  Definition loc_57 : location_info := LocationInfo file_0 168 11 168 17.
-  Definition loc_58 : location_info := LocationInfo file_0 168 12 168 17.
-  Definition loc_59 : location_info := LocationInfo file_0 168 12 168 17.
-  Definition loc_60 : location_info := LocationInfo file_0 168 21 168 30.
-  Definition loc_61 : location_info := LocationInfo file_0 168 29 168 30.
-  Definition loc_62 : location_info := LocationInfo file_0 166 11 166 26.
-  Definition loc_63 : location_info := LocationInfo file_0 166 11 166 19.
-  Definition loc_64 : location_info := LocationInfo file_0 166 11 166 19.
-  Definition loc_65 : location_info := LocationInfo file_0 166 20 166 25.
-  Definition loc_66 : location_info := LocationInfo file_0 166 21 166 25.
-  Definition loc_67 : location_info := LocationInfo file_0 164 4 164 9.
-  Definition loc_68 : location_info := LocationInfo file_0 164 12 164 22.
-  Definition loc_69 : location_info := LocationInfo file_0 164 12 164 15.
-  Definition loc_70 : location_info := LocationInfo file_0 164 12 164 15.
-  Definition loc_71 : location_info := LocationInfo file_0 164 16 164 21.
-  Definition loc_72 : location_info := LocationInfo file_0 164 17 164 21.
-  Definition loc_73 : location_info := LocationInfo file_0 163 4 163 9.
-  Definition loc_74 : location_info := LocationInfo file_0 163 12 163 22.
-  Definition loc_75 : location_info := LocationInfo file_0 163 12 163 15.
-  Definition loc_76 : location_info := LocationInfo file_0 163 12 163 15.
-  Definition loc_77 : location_info := LocationInfo file_0 163 16 163 21.
-  Definition loc_78 : location_info := LocationInfo file_0 163 17 163 21.
-  Definition loc_79 : location_info := LocationInfo file_0 162 4 162 9.
-  Definition loc_80 : location_info := LocationInfo file_0 162 12 162 22.
-  Definition loc_81 : location_info := LocationInfo file_0 162 12 162 15.
-  Definition loc_82 : location_info := LocationInfo file_0 162 12 162 15.
-  Definition loc_83 : location_info := LocationInfo file_0 162 16 162 21.
-  Definition loc_84 : location_info := LocationInfo file_0 162 17 162 21.
-  Definition loc_85 : location_info := LocationInfo file_0 160 11 160 27.
-  Definition loc_86 : location_info := LocationInfo file_0 160 11 160 17.
-  Definition loc_87 : location_info := LocationInfo file_0 160 11 160 17.
-  Definition loc_88 : location_info := LocationInfo file_0 160 18 160 23.
-  Definition loc_89 : location_info := LocationInfo file_0 160 19 160 23.
-  Definition loc_90 : location_info := LocationInfo file_0 160 25 160 26.
-  Definition loc_91 : location_info := LocationInfo file_0 158 4 158 8.
-  Definition loc_92 : location_info := LocationInfo file_0 158 11 158 24.
-  Definition loc_93 : location_info := LocationInfo file_0 158 11 158 18.
-  Definition loc_94 : location_info := LocationInfo file_0 158 11 158 18.
-  Definition loc_95 : location_info := LocationInfo file_0 158 19 158 23.
-  Definition loc_96 : location_info := LocationInfo file_0 158 19 158 23.
-  Definition loc_97 : location_info := LocationInfo file_0 156 11 156 27.
-  Definition loc_98 : location_info := LocationInfo file_0 156 11 156 17.
-  Definition loc_99 : location_info := LocationInfo file_0 156 11 156 17.
-  Definition loc_100 : location_info := LocationInfo file_0 156 18 156 23.
-  Definition loc_101 : location_info := LocationInfo file_0 156 19 156 23.
-  Definition loc_102 : location_info := LocationInfo file_0 156 25 156 26.
-  Definition loc_103 : location_info := LocationInfo file_0 154 4 154 8.
-  Definition loc_104 : location_info := LocationInfo file_0 154 11 154 28.
-  Definition loc_105 : location_info := LocationInfo file_0 154 11 154 15.
-  Definition loc_106 : location_info := LocationInfo file_0 154 11 154 15.
-  Definition loc_107 : location_info := LocationInfo file_0 154 16 154 20.
-  Definition loc_108 : location_info := LocationInfo file_0 154 16 154 20.
-  Definition loc_109 : location_info := LocationInfo file_0 154 22 154 27.
-  Definition loc_110 : location_info := LocationInfo file_0 154 22 154 27.
-  Definition loc_111 : location_info := LocationInfo file_0 153 4 153 8.
-  Definition loc_112 : location_info := LocationInfo file_0 153 11 153 28.
-  Definition loc_113 : location_info := LocationInfo file_0 153 11 153 15.
-  Definition loc_114 : location_info := LocationInfo file_0 153 11 153 15.
-  Definition loc_115 : location_info := LocationInfo file_0 153 16 153 20.
-  Definition loc_116 : location_info := LocationInfo file_0 153 16 153 20.
-  Definition loc_117 : location_info := LocationInfo file_0 153 22 153 27.
-  Definition loc_118 : location_info := LocationInfo file_0 153 22 153 27.
-  Definition loc_119 : location_info := LocationInfo file_0 152 4 152 8.
-  Definition loc_120 : location_info := LocationInfo file_0 152 11 152 28.
-  Definition loc_121 : location_info := LocationInfo file_0 152 11 152 15.
-  Definition loc_122 : location_info := LocationInfo file_0 152 11 152 15.
-  Definition loc_123 : location_info := LocationInfo file_0 152 16 152 20.
-  Definition loc_124 : location_info := LocationInfo file_0 152 16 152 20.
-  Definition loc_125 : location_info := LocationInfo file_0 152 22 152 27.
-  Definition loc_126 : location_info := LocationInfo file_0 152 22 152 27.
-  Definition loc_127 : location_info := LocationInfo file_0 150 4 150 10.
-  Definition loc_128 : location_info := LocationInfo file_0 150 5 150 10.
-  Definition loc_129 : location_info := LocationInfo file_0 150 5 150 10.
-  Definition loc_130 : location_info := LocationInfo file_0 150 13 150 14.
-  Definition loc_131 : location_info := LocationInfo file_0 149 4 149 10.
-  Definition loc_132 : location_info := LocationInfo file_0 149 5 149 10.
-  Definition loc_133 : location_info := LocationInfo file_0 149 5 149 10.
-  Definition loc_134 : location_info := LocationInfo file_0 149 13 149 14.
-  Definition loc_135 : location_info := LocationInfo file_0 148 4 148 10.
-  Definition loc_136 : location_info := LocationInfo file_0 148 5 148 10.
-  Definition loc_137 : location_info := LocationInfo file_0 148 5 148 10.
-  Definition loc_138 : location_info := LocationInfo file_0 148 13 148 14.
-  Definition loc_139 : location_info := LocationInfo file_0 146 11 146 26.
-  Definition loc_140 : location_info := LocationInfo file_0 146 11 146 19.
-  Definition loc_141 : location_info := LocationInfo file_0 146 11 146 19.
-  Definition loc_142 : location_info := LocationInfo file_0 146 20 146 25.
-  Definition loc_143 : location_info := LocationInfo file_0 146 21 146 25.
-  Definition loc_144 : location_info := LocationInfo file_0 144 20 144 41.
-  Definition loc_145 : location_info := LocationInfo file_0 144 20 144 25.
-  Definition loc_146 : location_info := LocationInfo file_0 144 20 144 25.
-  Definition loc_147 : location_info := LocationInfo file_0 144 26 144 40.
-  Definition loc_150 : location_info := LocationInfo file_0 143 20 143 41.
-  Definition loc_151 : location_info := LocationInfo file_0 143 20 143 25.
-  Definition loc_152 : location_info := LocationInfo file_0 143 20 143 25.
-  Definition loc_153 : location_info := LocationInfo file_0 143 26 143 40.
-  Definition loc_156 : location_info := LocationInfo file_0 142 20 142 41.
-  Definition loc_157 : location_info := LocationInfo file_0 142 20 142 25.
-  Definition loc_158 : location_info := LocationInfo file_0 142 20 142 25.
-  Definition loc_159 : location_info := LocationInfo file_0 142 26 142 40.
-  Definition loc_162 : location_info := LocationInfo file_0 141 18 141 24.
-  Definition loc_163 : location_info := LocationInfo file_0 141 18 141 22.
-  Definition loc_164 : location_info := LocationInfo file_0 141 18 141 22.
+  Definition loc_2 : location_info := LocationInfo file_0 154 4 154 25.
+  Definition loc_3 : location_info := LocationInfo file_0 155 4 155 42.
+  Definition loc_4 : location_info := LocationInfo file_0 156 4 156 42.
+  Definition loc_5 : location_info := LocationInfo file_0 157 4 157 42.
+  Definition loc_6 : location_info := LocationInfo file_0 159 4 159 28.
+  Definition loc_7 : location_info := LocationInfo file_0 161 4 161 15.
+  Definition loc_8 : location_info := LocationInfo file_0 162 4 162 15.
+  Definition loc_9 : location_info := LocationInfo file_0 163 4 163 15.
+  Definition loc_10 : location_info := LocationInfo file_0 165 4 165 29.
+  Definition loc_11 : location_info := LocationInfo file_0 166 4 166 29.
+  Definition loc_12 : location_info := LocationInfo file_0 167 4 167 29.
+  Definition loc_13 : location_info := LocationInfo file_0 169 4 169 29.
+  Definition loc_14 : location_info := LocationInfo file_0 171 4 171 25.
+  Definition loc_15 : location_info := LocationInfo file_0 173 4 173 29.
+  Definition loc_16 : location_info := LocationInfo file_0 175 4 175 23.
+  Definition loc_17 : location_info := LocationInfo file_0 176 4 176 23.
+  Definition loc_18 : location_info := LocationInfo file_0 177 4 177 23.
+  Definition loc_19 : location_info := LocationInfo file_0 179 4 179 28.
+  Definition loc_20 : location_info := LocationInfo file_0 181 4 181 32.
+  Definition loc_21 : location_info := LocationInfo file_0 182 4 182 32.
+  Definition loc_22 : location_info := LocationInfo file_0 183 4 183 32.
+  Definition loc_23 : location_info := LocationInfo file_0 185 4 185 32.
+  Definition loc_24 : location_info := LocationInfo file_0 186 4 186 32.
+  Definition loc_25 : location_info := LocationInfo file_0 187 4 187 32.
+  Definition loc_26 : location_info := LocationInfo file_0 187 4 187 8.
+  Definition loc_27 : location_info := LocationInfo file_0 187 4 187 8.
+  Definition loc_28 : location_info := LocationInfo file_0 187 9 187 23.
+  Definition loc_29 : location_info := LocationInfo file_0 187 25 187 30.
+  Definition loc_30 : location_info := LocationInfo file_0 187 25 187 30.
+  Definition loc_31 : location_info := LocationInfo file_0 186 4 186 8.
+  Definition loc_32 : location_info := LocationInfo file_0 186 4 186 8.
+  Definition loc_33 : location_info := LocationInfo file_0 186 9 186 23.
+  Definition loc_34 : location_info := LocationInfo file_0 186 25 186 30.
+  Definition loc_35 : location_info := LocationInfo file_0 186 25 186 30.
+  Definition loc_36 : location_info := LocationInfo file_0 185 4 185 8.
+  Definition loc_37 : location_info := LocationInfo file_0 185 4 185 8.
+  Definition loc_38 : location_info := LocationInfo file_0 185 9 185 23.
+  Definition loc_39 : location_info := LocationInfo file_0 185 25 185 30.
+  Definition loc_40 : location_info := LocationInfo file_0 185 25 185 30.
+  Definition loc_41 : location_info := LocationInfo file_0 183 11 183 30.
+  Definition loc_42 : location_info := LocationInfo file_0 183 11 183 17.
+  Definition loc_43 : location_info := LocationInfo file_0 183 11 183 17.
+  Definition loc_44 : location_info := LocationInfo file_0 183 12 183 17.
+  Definition loc_45 : location_info := LocationInfo file_0 183 12 183 17.
+  Definition loc_46 : location_info := LocationInfo file_0 183 21 183 30.
+  Definition loc_47 : location_info := LocationInfo file_0 183 29 183 30.
+  Definition loc_48 : location_info := LocationInfo file_0 182 11 182 30.
+  Definition loc_49 : location_info := LocationInfo file_0 182 11 182 17.
+  Definition loc_50 : location_info := LocationInfo file_0 182 11 182 17.
+  Definition loc_51 : location_info := LocationInfo file_0 182 12 182 17.
+  Definition loc_52 : location_info := LocationInfo file_0 182 12 182 17.
+  Definition loc_53 : location_info := LocationInfo file_0 182 21 182 30.
+  Definition loc_54 : location_info := LocationInfo file_0 182 29 182 30.
+  Definition loc_55 : location_info := LocationInfo file_0 181 11 181 30.
+  Definition loc_56 : location_info := LocationInfo file_0 181 11 181 17.
+  Definition loc_57 : location_info := LocationInfo file_0 181 11 181 17.
+  Definition loc_58 : location_info := LocationInfo file_0 181 12 181 17.
+  Definition loc_59 : location_info := LocationInfo file_0 181 12 181 17.
+  Definition loc_60 : location_info := LocationInfo file_0 181 21 181 30.
+  Definition loc_61 : location_info := LocationInfo file_0 181 29 181 30.
+  Definition loc_62 : location_info := LocationInfo file_0 179 11 179 26.
+  Definition loc_63 : location_info := LocationInfo file_0 179 11 179 19.
+  Definition loc_64 : location_info := LocationInfo file_0 179 11 179 19.
+  Definition loc_65 : location_info := LocationInfo file_0 179 20 179 25.
+  Definition loc_66 : location_info := LocationInfo file_0 179 21 179 25.
+  Definition loc_67 : location_info := LocationInfo file_0 177 4 177 9.
+  Definition loc_68 : location_info := LocationInfo file_0 177 12 177 22.
+  Definition loc_69 : location_info := LocationInfo file_0 177 12 177 15.
+  Definition loc_70 : location_info := LocationInfo file_0 177 12 177 15.
+  Definition loc_71 : location_info := LocationInfo file_0 177 16 177 21.
+  Definition loc_72 : location_info := LocationInfo file_0 177 17 177 21.
+  Definition loc_73 : location_info := LocationInfo file_0 176 4 176 9.
+  Definition loc_74 : location_info := LocationInfo file_0 176 12 176 22.
+  Definition loc_75 : location_info := LocationInfo file_0 176 12 176 15.
+  Definition loc_76 : location_info := LocationInfo file_0 176 12 176 15.
+  Definition loc_77 : location_info := LocationInfo file_0 176 16 176 21.
+  Definition loc_78 : location_info := LocationInfo file_0 176 17 176 21.
+  Definition loc_79 : location_info := LocationInfo file_0 175 4 175 9.
+  Definition loc_80 : location_info := LocationInfo file_0 175 12 175 22.
+  Definition loc_81 : location_info := LocationInfo file_0 175 12 175 15.
+  Definition loc_82 : location_info := LocationInfo file_0 175 12 175 15.
+  Definition loc_83 : location_info := LocationInfo file_0 175 16 175 21.
+  Definition loc_84 : location_info := LocationInfo file_0 175 17 175 21.
+  Definition loc_85 : location_info := LocationInfo file_0 173 11 173 27.
+  Definition loc_86 : location_info := LocationInfo file_0 173 11 173 17.
+  Definition loc_87 : location_info := LocationInfo file_0 173 11 173 17.
+  Definition loc_88 : location_info := LocationInfo file_0 173 18 173 23.
+  Definition loc_89 : location_info := LocationInfo file_0 173 19 173 23.
+  Definition loc_90 : location_info := LocationInfo file_0 173 25 173 26.
+  Definition loc_91 : location_info := LocationInfo file_0 171 4 171 8.
+  Definition loc_92 : location_info := LocationInfo file_0 171 11 171 24.
+  Definition loc_93 : location_info := LocationInfo file_0 171 11 171 18.
+  Definition loc_94 : location_info := LocationInfo file_0 171 11 171 18.
+  Definition loc_95 : location_info := LocationInfo file_0 171 19 171 23.
+  Definition loc_96 : location_info := LocationInfo file_0 171 19 171 23.
+  Definition loc_97 : location_info := LocationInfo file_0 169 11 169 27.
+  Definition loc_98 : location_info := LocationInfo file_0 169 11 169 17.
+  Definition loc_99 : location_info := LocationInfo file_0 169 11 169 17.
+  Definition loc_100 : location_info := LocationInfo file_0 169 18 169 23.
+  Definition loc_101 : location_info := LocationInfo file_0 169 19 169 23.
+  Definition loc_102 : location_info := LocationInfo file_0 169 25 169 26.
+  Definition loc_103 : location_info := LocationInfo file_0 167 4 167 8.
+  Definition loc_104 : location_info := LocationInfo file_0 167 11 167 28.
+  Definition loc_105 : location_info := LocationInfo file_0 167 11 167 15.
+  Definition loc_106 : location_info := LocationInfo file_0 167 11 167 15.
+  Definition loc_107 : location_info := LocationInfo file_0 167 16 167 20.
+  Definition loc_108 : location_info := LocationInfo file_0 167 16 167 20.
+  Definition loc_109 : location_info := LocationInfo file_0 167 22 167 27.
+  Definition loc_110 : location_info := LocationInfo file_0 167 22 167 27.
+  Definition loc_111 : location_info := LocationInfo file_0 166 4 166 8.
+  Definition loc_112 : location_info := LocationInfo file_0 166 11 166 28.
+  Definition loc_113 : location_info := LocationInfo file_0 166 11 166 15.
+  Definition loc_114 : location_info := LocationInfo file_0 166 11 166 15.
+  Definition loc_115 : location_info := LocationInfo file_0 166 16 166 20.
+  Definition loc_116 : location_info := LocationInfo file_0 166 16 166 20.
+  Definition loc_117 : location_info := LocationInfo file_0 166 22 166 27.
+  Definition loc_118 : location_info := LocationInfo file_0 166 22 166 27.
+  Definition loc_119 : location_info := LocationInfo file_0 165 4 165 8.
+  Definition loc_120 : location_info := LocationInfo file_0 165 11 165 28.
+  Definition loc_121 : location_info := LocationInfo file_0 165 11 165 15.
+  Definition loc_122 : location_info := LocationInfo file_0 165 11 165 15.
+  Definition loc_123 : location_info := LocationInfo file_0 165 16 165 20.
+  Definition loc_124 : location_info := LocationInfo file_0 165 16 165 20.
+  Definition loc_125 : location_info := LocationInfo file_0 165 22 165 27.
+  Definition loc_126 : location_info := LocationInfo file_0 165 22 165 27.
+  Definition loc_127 : location_info := LocationInfo file_0 163 4 163 10.
+  Definition loc_128 : location_info := LocationInfo file_0 163 5 163 10.
+  Definition loc_129 : location_info := LocationInfo file_0 163 5 163 10.
+  Definition loc_130 : location_info := LocationInfo file_0 163 13 163 14.
+  Definition loc_131 : location_info := LocationInfo file_0 162 4 162 10.
+  Definition loc_132 : location_info := LocationInfo file_0 162 5 162 10.
+  Definition loc_133 : location_info := LocationInfo file_0 162 5 162 10.
+  Definition loc_134 : location_info := LocationInfo file_0 162 13 162 14.
+  Definition loc_135 : location_info := LocationInfo file_0 161 4 161 10.
+  Definition loc_136 : location_info := LocationInfo file_0 161 5 161 10.
+  Definition loc_137 : location_info := LocationInfo file_0 161 5 161 10.
+  Definition loc_138 : location_info := LocationInfo file_0 161 13 161 14.
+  Definition loc_139 : location_info := LocationInfo file_0 159 11 159 26.
+  Definition loc_140 : location_info := LocationInfo file_0 159 11 159 19.
+  Definition loc_141 : location_info := LocationInfo file_0 159 11 159 19.
+  Definition loc_142 : location_info := LocationInfo file_0 159 20 159 25.
+  Definition loc_143 : location_info := LocationInfo file_0 159 21 159 25.
+  Definition loc_144 : location_info := LocationInfo file_0 157 20 157 41.
+  Definition loc_145 : location_info := LocationInfo file_0 157 20 157 25.
+  Definition loc_146 : location_info := LocationInfo file_0 157 20 157 25.
+  Definition loc_147 : location_info := LocationInfo file_0 157 26 157 40.
+  Definition loc_150 : location_info := LocationInfo file_0 156 20 156 41.
+  Definition loc_151 : location_info := LocationInfo file_0 156 20 156 25.
+  Definition loc_152 : location_info := LocationInfo file_0 156 20 156 25.
+  Definition loc_153 : location_info := LocationInfo file_0 156 26 156 40.
+  Definition loc_156 : location_info := LocationInfo file_0 155 20 155 41.
+  Definition loc_157 : location_info := LocationInfo file_0 155 20 155 25.
+  Definition loc_158 : location_info := LocationInfo file_0 155 20 155 25.
+  Definition loc_159 : location_info := LocationInfo file_0 155 26 155 40.
+  Definition loc_162 : location_info := LocationInfo file_0 154 18 154 24.
+  Definition loc_163 : location_info := LocationInfo file_0 154 18 154 22.
+  Definition loc_164 : location_info := LocationInfo file_0 154 18 154 22.
   Definition loc_169 : location_info := LocationInfo file_0 27 4 27 26.
   Definition loc_170 : location_info := LocationInfo file_0 27 11 27 25.
   Definition loc_173 : location_info := LocationInfo file_0 35 4 35 32.
@@ -294,113 +294,131 @@ Section code.
   Definition loc_314 : location_info := LocationInfo file_0 93 10 93 11.
   Definition loc_315 : location_info := LocationInfo file_0 93 15 93 29.
   Definition loc_316 : location_info := LocationInfo file_0 89 15 89 16.
-  Definition loc_321 : location_info := LocationInfo file_0 104 2 104 19.
-  Definition loc_322 : location_info := LocationInfo file_0 108 2 110 3.
-  Definition loc_323 : location_info := LocationInfo file_0 111 2 111 12.
-  Definition loc_324 : location_info := LocationInfo file_0 111 2 111 6.
-  Definition loc_325 : location_info := LocationInfo file_0 111 3 111 6.
-  Definition loc_326 : location_info := LocationInfo file_0 111 3 111 6.
-  Definition loc_327 : location_info := LocationInfo file_0 111 9 111 11.
-  Definition loc_328 : location_info := LocationInfo file_0 111 9 111 11.
-  Definition loc_329 : location_info := LocationInfo file_0 108 2 110 3.
-  Definition loc_330 : location_info := LocationInfo file_0 108 31 110 3.
-  Definition loc_331 : location_info := LocationInfo file_0 109 4 109 26.
-  Definition loc_332 : location_info := LocationInfo file_0 108 2 110 3.
-  Definition loc_333 : location_info := LocationInfo file_0 108 2 110 3.
-  Definition loc_334 : location_info := LocationInfo file_0 109 4 109 7.
-  Definition loc_335 : location_info := LocationInfo file_0 109 10 109 25.
-  Definition loc_336 : location_info := LocationInfo file_0 109 11 109 25.
-  Definition loc_337 : location_info := LocationInfo file_0 109 12 109 18.
-  Definition loc_338 : location_info := LocationInfo file_0 109 12 109 18.
-  Definition loc_339 : location_info := LocationInfo file_0 109 14 109 17.
-  Definition loc_340 : location_info := LocationInfo file_0 109 14 109 17.
-  Definition loc_341 : location_info := LocationInfo file_0 108 8 108 30.
-  Definition loc_342 : location_info := LocationInfo file_0 108 8 108 12.
-  Definition loc_343 : location_info := LocationInfo file_0 108 8 108 12.
-  Definition loc_344 : location_info := LocationInfo file_0 108 9 108 12.
-  Definition loc_345 : location_info := LocationInfo file_0 108 9 108 12.
-  Definition loc_346 : location_info := LocationInfo file_0 108 16 108 30.
-  Definition loc_347 : location_info := LocationInfo file_0 104 16 104 18.
-  Definition loc_348 : location_info := LocationInfo file_0 104 16 104 18.
-  Definition loc_353 : location_info := LocationInfo file_0 121 4 121 21.
-  Definition loc_354 : location_info := LocationInfo file_0 126 4 135 5.
-  Definition loc_355 : location_info := LocationInfo file_0 136 4 136 13.
-  Definition loc_356 : location_info := LocationInfo file_0 136 11 136 12.
-  Definition loc_357 : location_info := LocationInfo file_0 126 4 135 5.
-  Definition loc_358 : location_info := LocationInfo file_0 126 35 135 5.
-  Definition loc_359 : location_info := LocationInfo file_0 127 8 127 27.
-  Definition loc_360 : location_info := LocationInfo file_0 129 8 129 33.
-  Definition loc_361 : location_info := LocationInfo file_0 130 8 132 9.
-  Definition loc_362 : location_info := LocationInfo file_0 134 8 134 26.
-  Definition loc_363 : location_info := LocationInfo file_0 126 4 135 5.
-  Definition loc_364 : location_info := LocationInfo file_0 126 4 135 5.
-  Definition loc_365 : location_info := LocationInfo file_0 134 8 134 12.
-  Definition loc_366 : location_info := LocationInfo file_0 134 15 134 25.
-  Definition loc_367 : location_info := LocationInfo file_0 134 16 134 25.
-  Definition loc_368 : location_info := LocationInfo file_0 134 16 134 19.
-  Definition loc_369 : location_info := LocationInfo file_0 134 16 134 19.
-  Definition loc_370 : location_info := LocationInfo file_0 130 23 132 9.
-  Definition loc_371 : location_info := LocationInfo file_0 131 12 131 21.
-  Definition loc_372 : location_info := LocationInfo file_0 131 19 131 20.
-  Definition loc_374 : location_info := LocationInfo file_0 130 11 130 21.
-  Definition loc_375 : location_info := LocationInfo file_0 130 11 130 16.
-  Definition loc_376 : location_info := LocationInfo file_0 130 11 130 16.
-  Definition loc_377 : location_info := LocationInfo file_0 130 12 130 16.
-  Definition loc_378 : location_info := LocationInfo file_0 130 12 130 16.
-  Definition loc_379 : location_info := LocationInfo file_0 130 20 130 21.
-  Definition loc_380 : location_info := LocationInfo file_0 130 20 130 21.
-  Definition loc_381 : location_info := LocationInfo file_0 129 23 129 32.
-  Definition loc_382 : location_info := LocationInfo file_0 129 23 129 32.
-  Definition loc_383 : location_info := LocationInfo file_0 129 23 129 26.
-  Definition loc_384 : location_info := LocationInfo file_0 129 23 129 26.
-  Definition loc_387 : location_info := LocationInfo file_0 127 21 127 26.
-  Definition loc_388 : location_info := LocationInfo file_0 127 21 127 26.
-  Definition loc_389 : location_info := LocationInfo file_0 127 22 127 26.
-  Definition loc_390 : location_info := LocationInfo file_0 127 22 127 26.
-  Definition loc_393 : location_info := LocationInfo file_0 126 10 126 33.
-  Definition loc_394 : location_info := LocationInfo file_0 126 10 126 15.
-  Definition loc_395 : location_info := LocationInfo file_0 126 10 126 15.
-  Definition loc_396 : location_info := LocationInfo file_0 126 11 126 15.
-  Definition loc_397 : location_info := LocationInfo file_0 126 11 126 15.
-  Definition loc_398 : location_info := LocationInfo file_0 126 19 126 33.
-  Definition loc_399 : location_info := LocationInfo file_0 121 19 121 20.
-  Definition loc_400 : location_info := LocationInfo file_0 121 19 121 20.
-  Definition loc_405 : location_info := LocationInfo file_0 181 2 181 18.
-  Definition loc_406 : location_info := LocationInfo file_0 191 2 196 3.
-  Definition loc_407 : location_info := LocationInfo file_0 191 2 196 3.
-  Definition loc_408 : location_info := LocationInfo file_0 191 31 196 3.
-  Definition loc_409 : location_info := LocationInfo file_0 192 4 192 25.
-  Definition loc_410 : location_info := LocationInfo file_0 193 4 193 20.
-  Definition loc_411 : location_info := LocationInfo file_0 194 4 194 14.
-  Definition loc_412 : location_info := LocationInfo file_0 195 4 195 19.
-  Definition loc_413 : location_info := LocationInfo file_0 191 2 196 3.
-  Definition loc_414 : location_info := LocationInfo file_0 191 2 196 3.
-  Definition loc_415 : location_info := LocationInfo file_0 195 4 195 7.
-  Definition loc_416 : location_info := LocationInfo file_0 195 10 195 18.
-  Definition loc_417 : location_info := LocationInfo file_0 195 10 195 18.
-  Definition loc_418 : location_info := LocationInfo file_0 194 4 194 7.
-  Definition loc_419 : location_info := LocationInfo file_0 194 5 194 7.
-  Definition loc_420 : location_info := LocationInfo file_0 194 5 194 7.
-  Definition loc_421 : location_info := LocationInfo file_0 194 10 194 13.
-  Definition loc_422 : location_info := LocationInfo file_0 194 10 194 13.
-  Definition loc_423 : location_info := LocationInfo file_0 193 4 193 13.
-  Definition loc_424 : location_info := LocationInfo file_0 193 4 193 7.
-  Definition loc_425 : location_info := LocationInfo file_0 193 4 193 7.
-  Definition loc_426 : location_info := LocationInfo file_0 193 16 193 19.
-  Definition loc_427 : location_info := LocationInfo file_0 193 16 193 19.
-  Definition loc_428 : location_info := LocationInfo file_0 193 17 193 19.
-  Definition loc_429 : location_info := LocationInfo file_0 193 17 193 19.
-  Definition loc_430 : location_info := LocationInfo file_0 192 4 192 12.
-  Definition loc_431 : location_info := LocationInfo file_0 192 15 192 24.
-  Definition loc_432 : location_info := LocationInfo file_0 192 15 192 24.
-  Definition loc_433 : location_info := LocationInfo file_0 192 15 192 18.
-  Definition loc_434 : location_info := LocationInfo file_0 192 15 192 18.
-  Definition loc_435 : location_info := LocationInfo file_0 191 8 191 29.
-  Definition loc_436 : location_info := LocationInfo file_0 191 8 191 11.
-  Definition loc_437 : location_info := LocationInfo file_0 191 8 191 11.
-  Definition loc_438 : location_info := LocationInfo file_0 191 15 191 29.
-  Definition loc_439 : location_info := LocationInfo file_0 181 15 181 17.
-  Definition loc_440 : location_info := LocationInfo file_0 181 15 181 17.
+  Definition loc_321 : location_info := LocationInfo file_0 107 2 109 3.
+  Definition loc_322 : location_info := LocationInfo file_0 110 2 110 37.
+  Definition loc_323 : location_info := LocationInfo file_0 110 9 110 36.
+  Definition loc_324 : location_info := LocationInfo file_0 110 9 110 32.
+  Definition loc_325 : location_info := LocationInfo file_0 110 9 110 23.
+  Definition loc_326 : location_info := LocationInfo file_0 110 9 110 23.
+  Definition loc_327 : location_info := LocationInfo file_0 110 24 110 31.
+  Definition loc_328 : location_info := LocationInfo file_0 110 24 110 31.
+  Definition loc_329 : location_info := LocationInfo file_0 110 24 110 25.
+  Definition loc_330 : location_info := LocationInfo file_0 110 24 110 25.
+  Definition loc_331 : location_info := LocationInfo file_0 110 35 110 36.
+  Definition loc_332 : location_info := LocationInfo file_0 107 26 109 3.
+  Definition loc_333 : location_info := LocationInfo file_0 108 4 108 13.
+  Definition loc_334 : location_info := LocationInfo file_0 108 11 108 12.
+  Definition loc_336 : location_info := LocationInfo file_0 107 5 107 24.
+  Definition loc_337 : location_info := LocationInfo file_0 107 5 107 6.
+  Definition loc_338 : location_info := LocationInfo file_0 107 5 107 6.
+  Definition loc_339 : location_info := LocationInfo file_0 107 10 107 24.
+  Definition loc_342 : location_info := LocationInfo file_0 117 2 117 19.
+  Definition loc_343 : location_info := LocationInfo file_0 121 2 123 3.
+  Definition loc_344 : location_info := LocationInfo file_0 124 2 124 12.
+  Definition loc_345 : location_info := LocationInfo file_0 124 2 124 6.
+  Definition loc_346 : location_info := LocationInfo file_0 124 3 124 6.
+  Definition loc_347 : location_info := LocationInfo file_0 124 3 124 6.
+  Definition loc_348 : location_info := LocationInfo file_0 124 9 124 11.
+  Definition loc_349 : location_info := LocationInfo file_0 124 9 124 11.
+  Definition loc_350 : location_info := LocationInfo file_0 121 2 123 3.
+  Definition loc_351 : location_info := LocationInfo file_0 121 31 123 3.
+  Definition loc_352 : location_info := LocationInfo file_0 122 4 122 26.
+  Definition loc_353 : location_info := LocationInfo file_0 121 2 123 3.
+  Definition loc_354 : location_info := LocationInfo file_0 121 2 123 3.
+  Definition loc_355 : location_info := LocationInfo file_0 122 4 122 7.
+  Definition loc_356 : location_info := LocationInfo file_0 122 10 122 25.
+  Definition loc_357 : location_info := LocationInfo file_0 122 11 122 25.
+  Definition loc_358 : location_info := LocationInfo file_0 122 12 122 18.
+  Definition loc_359 : location_info := LocationInfo file_0 122 12 122 18.
+  Definition loc_360 : location_info := LocationInfo file_0 122 14 122 17.
+  Definition loc_361 : location_info := LocationInfo file_0 122 14 122 17.
+  Definition loc_362 : location_info := LocationInfo file_0 121 8 121 30.
+  Definition loc_363 : location_info := LocationInfo file_0 121 8 121 12.
+  Definition loc_364 : location_info := LocationInfo file_0 121 8 121 12.
+  Definition loc_365 : location_info := LocationInfo file_0 121 9 121 12.
+  Definition loc_366 : location_info := LocationInfo file_0 121 9 121 12.
+  Definition loc_367 : location_info := LocationInfo file_0 121 16 121 30.
+  Definition loc_368 : location_info := LocationInfo file_0 117 16 117 18.
+  Definition loc_369 : location_info := LocationInfo file_0 117 16 117 18.
+  Definition loc_374 : location_info := LocationInfo file_0 134 4 134 21.
+  Definition loc_375 : location_info := LocationInfo file_0 139 4 148 5.
+  Definition loc_376 : location_info := LocationInfo file_0 149 4 149 13.
+  Definition loc_377 : location_info := LocationInfo file_0 149 11 149 12.
+  Definition loc_378 : location_info := LocationInfo file_0 139 4 148 5.
+  Definition loc_379 : location_info := LocationInfo file_0 139 35 148 5.
+  Definition loc_380 : location_info := LocationInfo file_0 140 8 140 27.
+  Definition loc_381 : location_info := LocationInfo file_0 142 8 142 33.
+  Definition loc_382 : location_info := LocationInfo file_0 143 8 145 9.
+  Definition loc_383 : location_info := LocationInfo file_0 147 8 147 26.
+  Definition loc_384 : location_info := LocationInfo file_0 139 4 148 5.
+  Definition loc_385 : location_info := LocationInfo file_0 139 4 148 5.
+  Definition loc_386 : location_info := LocationInfo file_0 147 8 147 12.
+  Definition loc_387 : location_info := LocationInfo file_0 147 15 147 25.
+  Definition loc_388 : location_info := LocationInfo file_0 147 16 147 25.
+  Definition loc_389 : location_info := LocationInfo file_0 147 16 147 19.
+  Definition loc_390 : location_info := LocationInfo file_0 147 16 147 19.
+  Definition loc_391 : location_info := LocationInfo file_0 143 23 145 9.
+  Definition loc_392 : location_info := LocationInfo file_0 144 12 144 21.
+  Definition loc_393 : location_info := LocationInfo file_0 144 19 144 20.
+  Definition loc_395 : location_info := LocationInfo file_0 143 11 143 21.
+  Definition loc_396 : location_info := LocationInfo file_0 143 11 143 16.
+  Definition loc_397 : location_info := LocationInfo file_0 143 11 143 16.
+  Definition loc_398 : location_info := LocationInfo file_0 143 12 143 16.
+  Definition loc_399 : location_info := LocationInfo file_0 143 12 143 16.
+  Definition loc_400 : location_info := LocationInfo file_0 143 20 143 21.
+  Definition loc_401 : location_info := LocationInfo file_0 143 20 143 21.
+  Definition loc_402 : location_info := LocationInfo file_0 142 23 142 32.
+  Definition loc_403 : location_info := LocationInfo file_0 142 23 142 32.
+  Definition loc_404 : location_info := LocationInfo file_0 142 23 142 26.
+  Definition loc_405 : location_info := LocationInfo file_0 142 23 142 26.
+  Definition loc_408 : location_info := LocationInfo file_0 140 21 140 26.
+  Definition loc_409 : location_info := LocationInfo file_0 140 21 140 26.
+  Definition loc_410 : location_info := LocationInfo file_0 140 22 140 26.
+  Definition loc_411 : location_info := LocationInfo file_0 140 22 140 26.
+  Definition loc_414 : location_info := LocationInfo file_0 139 10 139 33.
+  Definition loc_415 : location_info := LocationInfo file_0 139 10 139 15.
+  Definition loc_416 : location_info := LocationInfo file_0 139 10 139 15.
+  Definition loc_417 : location_info := LocationInfo file_0 139 11 139 15.
+  Definition loc_418 : location_info := LocationInfo file_0 139 11 139 15.
+  Definition loc_419 : location_info := LocationInfo file_0 139 19 139 33.
+  Definition loc_420 : location_info := LocationInfo file_0 134 19 134 20.
+  Definition loc_421 : location_info := LocationInfo file_0 134 19 134 20.
+  Definition loc_426 : location_info := LocationInfo file_0 194 2 194 18.
+  Definition loc_427 : location_info := LocationInfo file_0 204 2 209 3.
+  Definition loc_428 : location_info := LocationInfo file_0 204 2 209 3.
+  Definition loc_429 : location_info := LocationInfo file_0 204 31 209 3.
+  Definition loc_430 : location_info := LocationInfo file_0 205 4 205 25.
+  Definition loc_431 : location_info := LocationInfo file_0 206 4 206 20.
+  Definition loc_432 : location_info := LocationInfo file_0 207 4 207 14.
+  Definition loc_433 : location_info := LocationInfo file_0 208 4 208 19.
+  Definition loc_434 : location_info := LocationInfo file_0 204 2 209 3.
+  Definition loc_435 : location_info := LocationInfo file_0 204 2 209 3.
+  Definition loc_436 : location_info := LocationInfo file_0 208 4 208 7.
+  Definition loc_437 : location_info := LocationInfo file_0 208 10 208 18.
+  Definition loc_438 : location_info := LocationInfo file_0 208 10 208 18.
+  Definition loc_439 : location_info := LocationInfo file_0 207 4 207 7.
+  Definition loc_440 : location_info := LocationInfo file_0 207 5 207 7.
+  Definition loc_441 : location_info := LocationInfo file_0 207 5 207 7.
+  Definition loc_442 : location_info := LocationInfo file_0 207 10 207 13.
+  Definition loc_443 : location_info := LocationInfo file_0 207 10 207 13.
+  Definition loc_444 : location_info := LocationInfo file_0 206 4 206 13.
+  Definition loc_445 : location_info := LocationInfo file_0 206 4 206 7.
+  Definition loc_446 : location_info := LocationInfo file_0 206 4 206 7.
+  Definition loc_447 : location_info := LocationInfo file_0 206 16 206 19.
+  Definition loc_448 : location_info := LocationInfo file_0 206 16 206 19.
+  Definition loc_449 : location_info := LocationInfo file_0 206 17 206 19.
+  Definition loc_450 : location_info := LocationInfo file_0 206 17 206 19.
+  Definition loc_451 : location_info := LocationInfo file_0 205 4 205 12.
+  Definition loc_452 : location_info := LocationInfo file_0 205 15 205 24.
+  Definition loc_453 : location_info := LocationInfo file_0 205 15 205 24.
+  Definition loc_454 : location_info := LocationInfo file_0 205 15 205 18.
+  Definition loc_455 : location_info := LocationInfo file_0 205 15 205 18.
+  Definition loc_456 : location_info := LocationInfo file_0 204 8 204 29.
+  Definition loc_457 : location_info := LocationInfo file_0 204 8 204 11.
+  Definition loc_458 : location_info := LocationInfo file_0 204 8 204 11.
+  Definition loc_459 : location_info := LocationInfo file_0 204 15 204 29.
+  Definition loc_460 : location_info := LocationInfo file_0 194 15 194 17.
+  Definition loc_461 : location_info := LocationInfo file_0 194 15 194 17.
 
   (* Definition of struct [list]. *)
   Program Definition struct_list := {|
@@ -740,6 +758,43 @@ Section code.
     )%E
   |}.
 
+  (* Definition of function [length_val_rec]. *)
+  Definition impl_length_val_rec (global_length_val_rec : loc): function := {|
+    f_args := [
+      ("p", LPtr)
+    ];
+    f_local_vars := [
+    ];
+    f_init := "#0";
+    f_code := (
+      <[ "#0" :=
+        locinfo: loc_336 ;
+        if: LocInfoE loc_336 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_336 ((LocInfoE loc_337 (use{LPtr} (LocInfoE loc_338 ("p")))) ={PtrOp, PtrOp} (LocInfoE loc_339 (NULL)))))
+        then
+        locinfo: loc_333 ;
+          Goto "#2"
+        else
+        locinfo: loc_324 ;
+          Goto "#3"
+      ]> $
+      <[ "#1" :=
+        locinfo: loc_324 ;
+        "$0" <- LocInfoE loc_326 (global_length_val_rec) with
+          [ LocInfoE loc_327 (use{LPtr} (LocInfoE loc_328 ((LocInfoE loc_329 (!{LPtr} (LocInfoE loc_330 ("p")))) at{struct_list} "tail"))) ] ;
+        locinfo: loc_322 ;
+        Return (LocInfoE loc_323 ((LocInfoE loc_324 ("$0")) +{IntOp size_t, IntOp size_t} (LocInfoE loc_331 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_331 (i2v 1 i32))))))
+      ]> $
+      <[ "#2" :=
+        locinfo: loc_333 ;
+        Return (LocInfoE loc_334 (UnOp (CastOp $ IntOp size_t) (IntOp i32) (LocInfoE loc_334 (i2v 0 i32))))
+      ]> $
+      <[ "#3" :=
+        locinfo: loc_324 ;
+        Goto "#1"
+      ]> $∅
+    )%E
+  |}.
+
   (* Definition of function [append]. *)
   Definition impl_append : function := {|
     f_args := [
@@ -753,35 +808,35 @@ Section code.
     f_code := (
       <[ "#0" :=
         "end" <-{ LPtr }
-          LocInfoE loc_347 (use{LPtr} (LocInfoE loc_348 ("l1"))) ;
-        locinfo: loc_322 ;
+          LocInfoE loc_368 (use{LPtr} (LocInfoE loc_369 ("l1"))) ;
+        locinfo: loc_343 ;
         Goto "#1"
       ]> $
       <[ "#1" :=
-        locinfo: loc_341 ;
-        if: LocInfoE loc_341 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_341 ((LocInfoE loc_342 (use{LPtr} (LocInfoE loc_344 (!{LPtr} (LocInfoE loc_345 ("end")))))) !={PtrOp, PtrOp} (LocInfoE loc_346 (NULL)))))
+        locinfo: loc_362 ;
+        if: LocInfoE loc_362 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_362 ((LocInfoE loc_363 (use{LPtr} (LocInfoE loc_365 (!{LPtr} (LocInfoE loc_366 ("end")))))) !={PtrOp, PtrOp} (LocInfoE loc_367 (NULL)))))
         then
-        locinfo: loc_331 ;
+        locinfo: loc_352 ;
           Goto "#2"
         else
-        locinfo: loc_323 ;
+        locinfo: loc_344 ;
           Goto "#3"
       ]> $
       <[ "#2" :=
-        locinfo: loc_331 ;
-        LocInfoE loc_334 ("end") <-{ LPtr }
-          LocInfoE loc_335 (&(LocInfoE loc_336 ((LocInfoE loc_337 (!{LPtr} (LocInfoE loc_339 (!{LPtr} (LocInfoE loc_340 ("end")))))) at{struct_list} "tail"))) ;
-        locinfo: loc_332 ;
-        Goto "continue19"
+        locinfo: loc_352 ;
+        LocInfoE loc_355 ("end") <-{ LPtr }
+          LocInfoE loc_356 (&(LocInfoE loc_357 ((LocInfoE loc_358 (!{LPtr} (LocInfoE loc_360 (!{LPtr} (LocInfoE loc_361 ("end")))))) at{struct_list} "tail"))) ;
+        locinfo: loc_353 ;
+        Goto "continue22"
       ]> $
       <[ "#3" :=
-        locinfo: loc_323 ;
-        LocInfoE loc_325 (!{LPtr} (LocInfoE loc_326 ("end"))) <-{ LPtr }
-          LocInfoE loc_327 (use{LPtr} (LocInfoE loc_328 ("l2"))) ;
+        locinfo: loc_344 ;
+        LocInfoE loc_346 (!{LPtr} (LocInfoE loc_347 ("end"))) <-{ LPtr }
+          LocInfoE loc_348 (use{LPtr} (LocInfoE loc_349 ("l2"))) ;
         Return (VOID)
       ]> $
-      <[ "continue19" :=
-        locinfo: loc_322 ;
+      <[ "continue22" :=
+        locinfo: loc_343 ;
         Goto "#1"
       ]> $∅
     )%E
@@ -802,54 +857,54 @@ Section code.
     f_code := (
       <[ "#0" :=
         "prev" <-{ LPtr }
-          LocInfoE loc_399 (use{LPtr} (LocInfoE loc_400 ("p"))) ;
-        locinfo: loc_354 ;
+          LocInfoE loc_420 (use{LPtr} (LocInfoE loc_421 ("p"))) ;
+        locinfo: loc_375 ;
         Goto "#1"
       ]> $
       <[ "#1" :=
-        locinfo: loc_393 ;
-        if: LocInfoE loc_393 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_393 ((LocInfoE loc_394 (use{LPtr} (LocInfoE loc_396 (!{LPtr} (LocInfoE loc_397 ("prev")))))) !={PtrOp, PtrOp} (LocInfoE loc_398 (NULL)))))
+        locinfo: loc_414 ;
+        if: LocInfoE loc_414 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_414 ((LocInfoE loc_415 (use{LPtr} (LocInfoE loc_417 (!{LPtr} (LocInfoE loc_418 ("prev")))))) !={PtrOp, PtrOp} (LocInfoE loc_419 (NULL)))))
         then
         Goto "#2"
         else
-        locinfo: loc_355 ;
+        locinfo: loc_376 ;
           Goto "#3"
       ]> $
       <[ "#2" :=
         "cur" <-{ LPtr }
-          LocInfoE loc_387 (use{LPtr} (LocInfoE loc_389 (!{LPtr} (LocInfoE loc_390 ("prev"))))) ;
+          LocInfoE loc_408 (use{LPtr} (LocInfoE loc_410 (!{LPtr} (LocInfoE loc_411 ("prev"))))) ;
         "head" <-{ LPtr }
-          LocInfoE loc_381 (UnOp (CastOp $ PtrOp) (PtrOp) (LocInfoE loc_381 (use{LPtr} (LocInfoE loc_382 ((LocInfoE loc_383 (!{LPtr} (LocInfoE loc_384 ("cur")))) at{struct_list} "head"))))) ;
-        locinfo: loc_374 ;
-        if: LocInfoE loc_374 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_374 ((LocInfoE loc_375 (use{it_layout size_t} (LocInfoE loc_377 (!{LPtr} (LocInfoE loc_378 ("head")))))) ={IntOp size_t, IntOp size_t} (LocInfoE loc_379 (use{it_layout size_t} (LocInfoE loc_380 ("k")))))))
+          LocInfoE loc_402 (UnOp (CastOp $ PtrOp) (PtrOp) (LocInfoE loc_402 (use{LPtr} (LocInfoE loc_403 ((LocInfoE loc_404 (!{LPtr} (LocInfoE loc_405 ("cur")))) at{struct_list} "head"))))) ;
+        locinfo: loc_395 ;
+        if: LocInfoE loc_395 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_395 ((LocInfoE loc_396 (use{it_layout size_t} (LocInfoE loc_398 (!{LPtr} (LocInfoE loc_399 ("head")))))) ={IntOp size_t, IntOp size_t} (LocInfoE loc_400 (use{it_layout size_t} (LocInfoE loc_401 ("k")))))))
         then
-        locinfo: loc_371 ;
+        locinfo: loc_392 ;
           Goto "#5"
         else
-        locinfo: loc_362 ;
+        locinfo: loc_383 ;
           Goto "#6"
       ]> $
       <[ "#3" :=
-        locinfo: loc_355 ;
-        Return (LocInfoE loc_356 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_356 (i2v 0 i32))))
+        locinfo: loc_376 ;
+        Return (LocInfoE loc_377 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_377 (i2v 0 i32))))
       ]> $
       <[ "#4" :=
-        locinfo: loc_362 ;
-        LocInfoE loc_365 ("prev") <-{ LPtr }
-          LocInfoE loc_366 (&(LocInfoE loc_367 ((LocInfoE loc_368 (!{LPtr} (LocInfoE loc_369 ("cur")))) at{struct_list} "tail"))) ;
-        locinfo: loc_363 ;
-        Goto "continue23"
+        locinfo: loc_383 ;
+        LocInfoE loc_386 ("prev") <-{ LPtr }
+          LocInfoE loc_387 (&(LocInfoE loc_388 ((LocInfoE loc_389 (!{LPtr} (LocInfoE loc_390 ("cur")))) at{struct_list} "tail"))) ;
+        locinfo: loc_384 ;
+        Goto "continue26"
       ]> $
       <[ "#5" :=
-        locinfo: loc_371 ;
-        Return (LocInfoE loc_372 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_372 (i2v 1 i32))))
+        locinfo: loc_392 ;
+        Return (LocInfoE loc_393 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_393 (i2v 1 i32))))
       ]> $
       <[ "#6" :=
-        locinfo: loc_362 ;
+        locinfo: loc_383 ;
         Goto "#4"
       ]> $
-      <[ "continue23" :=
-        locinfo: loc_354 ;
+      <[ "continue26" :=
+        locinfo: loc_375 ;
         Goto "#1"
       ]> $∅
     )%E
@@ -869,40 +924,40 @@ Section code.
     f_code := (
       <[ "#0" :=
         "cur" <-{ LPtr }
-          LocInfoE loc_439 (use{LPtr} (LocInfoE loc_440 ("l1"))) ;
-        locinfo: loc_406 ;
+          LocInfoE loc_460 (use{LPtr} (LocInfoE loc_461 ("l1"))) ;
+        locinfo: loc_427 ;
         Goto "#1"
       ]> $
       <[ "#1" :=
-        locinfo: loc_435 ;
-        if: LocInfoE loc_435 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_435 ((LocInfoE loc_436 (use{LPtr} (LocInfoE loc_437 ("cur")))) !={PtrOp, PtrOp} (LocInfoE loc_438 (NULL)))))
+        locinfo: loc_456 ;
+        if: LocInfoE loc_456 (UnOp (CastOp $ IntOp bool_it) (IntOp i32) (LocInfoE loc_456 ((LocInfoE loc_457 (use{LPtr} (LocInfoE loc_458 ("cur")))) !={PtrOp, PtrOp} (LocInfoE loc_459 (NULL)))))
         then
-        locinfo: loc_409 ;
+        locinfo: loc_430 ;
           Goto "#2"
         else
         Goto "#3"
       ]> $
       <[ "#2" :=
-        locinfo: loc_409 ;
-        LocInfoE loc_430 ("cur_tail") <-{ LPtr }
-          LocInfoE loc_431 (use{LPtr} (LocInfoE loc_432 ((LocInfoE loc_433 (!{LPtr} (LocInfoE loc_434 ("cur")))) at{struct_list} "tail"))) ;
-        locinfo: loc_410 ;
-        LocInfoE loc_423 ((LocInfoE loc_424 (!{LPtr} (LocInfoE loc_425 ("cur")))) at{struct_list} "tail") <-{ LPtr }
-          LocInfoE loc_426 (use{LPtr} (LocInfoE loc_428 (!{LPtr} (LocInfoE loc_429 ("l2"))))) ;
-        locinfo: loc_411 ;
-        LocInfoE loc_419 (!{LPtr} (LocInfoE loc_420 ("l2"))) <-{ LPtr }
-          LocInfoE loc_421 (use{LPtr} (LocInfoE loc_422 ("cur"))) ;
-        locinfo: loc_412 ;
-        LocInfoE loc_415 ("cur") <-{ LPtr }
-          LocInfoE loc_416 (use{LPtr} (LocInfoE loc_417 ("cur_tail"))) ;
-        locinfo: loc_413 ;
-        Goto "continue30"
+        locinfo: loc_430 ;
+        LocInfoE loc_451 ("cur_tail") <-{ LPtr }
+          LocInfoE loc_452 (use{LPtr} (LocInfoE loc_453 ((LocInfoE loc_454 (!{LPtr} (LocInfoE loc_455 ("cur")))) at{struct_list} "tail"))) ;
+        locinfo: loc_431 ;
+        LocInfoE loc_444 ((LocInfoE loc_445 (!{LPtr} (LocInfoE loc_446 ("cur")))) at{struct_list} "tail") <-{ LPtr }
+          LocInfoE loc_447 (use{LPtr} (LocInfoE loc_449 (!{LPtr} (LocInfoE loc_450 ("l2"))))) ;
+        locinfo: loc_432 ;
+        LocInfoE loc_440 (!{LPtr} (LocInfoE loc_441 ("l2"))) <-{ LPtr }
+          LocInfoE loc_442 (use{LPtr} (LocInfoE loc_443 ("cur"))) ;
+        locinfo: loc_433 ;
+        LocInfoE loc_436 ("cur") <-{ LPtr }
+          LocInfoE loc_437 (use{LPtr} (LocInfoE loc_438 ("cur_tail"))) ;
+        locinfo: loc_434 ;
+        Goto "continue33"
       ]> $
       <[ "#3" :=
         Return (VOID)
       ]> $
-      <[ "continue30" :=
-        locinfo: loc_406 ;
+      <[ "continue33" :=
+        locinfo: loc_427 ;
         Goto "#1"
       ]> $∅
     )%E
diff --git a/tutorial/proofs/t03_list/generated_proof_length_val_rec.v b/tutorial/proofs/t03_list/generated_proof_length_val_rec.v
new file mode 100644
index 0000000000000000000000000000000000000000..05c5281534e34380d70f0bc30ec855ad9ef0297b
--- /dev/null
+++ b/tutorial/proofs/t03_list/generated_proof_length_val_rec.v
@@ -0,0 +1,26 @@
+From refinedc.typing Require Import typing.
+From refinedc.tutorial.t03_list Require Import generated_code.
+From refinedc.tutorial.t03_list Require Import generated_spec.
+Set Default Proof Using "Type".
+
+(* Generated from [tutorial/t03_list.c]. *)
+Section proof_length_val_rec.
+  Context `{!typeG Σ} `{!globalG Σ}.
+
+  (* Typing proof for [length_val_rec]. *)
+  Lemma type_length_val_rec (global_length_val_rec : loc) :
+    global_length_val_rec ◁ᵥ global_length_val_rec @ function_ptr type_of_length_val_rec -∗
+    typed_function (impl_length_val_rec global_length_val_rec) type_of_length_val_rec.
+  Proof.
+    start_function "length_val_rec" ([v l]) => arg_p.
+    split_blocks ((
+      ∅
+    )%I : gmap label (iProp Σ)) ((
+      ∅
+    )%I : gmap label (iProp Σ)).
+    - repeat liRStep; liShow.
+      all: print_typesystem_goal "length_val_rec" "#0".
+    Unshelve. all: sidecond_hook; prepare_sideconditions; normalize_and_simpl_goal; try solve_goal; unsolved_sidecond_hook.
+    all: print_sidecondition_goal "length_val_rec".
+  Qed.
+End proof_length_val_rec.
diff --git a/tutorial/proofs/t03_list/generated_spec.v b/tutorial/proofs/t03_list/generated_spec.v
index e403b481eb494cb2ee0f889c12fb35e66a984d9c..15833f2767632d5f77a1a7bcea9e02700dc9901a 100644
--- a/tutorial/proofs/t03_list/generated_spec.v
+++ b/tutorial/proofs/t03_list/generated_spec.v
@@ -127,6 +127,11 @@ Section spec.
     fn(∀ (p, l) : loc * (list type); (p @ (&own (l @ (list_t)))); ⌜length l <= max_int size_t⌝)
       → ∃ () : (), ((length l) @ (int (size_t))); (p ◁ₗ (l @ (list_t))).
 
+  (* Specifications for function [length_val_rec]. *)
+  Definition type_of_length_val_rec :=
+    fn(∀ (v, l) : val * (list type); (singleton_val (LPtr) (v)); (v ◁ᵥ l @ list_t) ∗ ⌜length l <= max_int size_t⌝)
+      → ∃ () : (), ((length l) @ (int (size_t))); (v ◁ᵥ l @ list_t).
+
   (* Specifications for function [append]. *)
   Definition type_of_append :=
     fn(∀ (p, l1, l2) : loc * (list type) * (list type); (p @ (&own (l1 @ (list_t)))), (l2 @ (list_t)); True)
diff --git a/tutorial/proofs/t03_list/proof_files b/tutorial/proofs/t03_list/proof_files
index 4f3248c6ee0babb6fcb631386b020f666599766d..5ab37abd5cd8d4e8ad3045e4bbb8133af66c8180 100644
--- a/tutorial/proofs/t03_list/proof_files
+++ b/tutorial/proofs/t03_list/proof_files
@@ -6,6 +6,7 @@ generated_proof_free_array.v
 generated_proof_init.v
 generated_proof_is_empty.v
 generated_proof_length.v
+generated_proof_length_val_rec.v
 generated_proof_member.v
 generated_proof_pop.v
 generated_proof_push.v
diff --git a/tutorial/t03_list.c b/tutorial/t03_list.c
index ddf745a31a388d020fd2fdea16325826ce3b0636..410a504181277b7667d01edf213ad1b3ddf03b51 100644
--- a/tutorial/t03_list.c
+++ b/tutorial/t03_list.c
@@ -97,6 +97,19 @@ size_t length (list_t *p) {
   return len;
 }
 
+[[rc::parameters("v : val", "l : {list type}")]]
+[[rc::args("singleton_val<LPtr, v>")]]
+[[rc::requires("[v ◁ᵥ l @ list_t]")]]
+[[rc::requires("{length l <= max_int size_t}")]]
+[[rc::returns("{length l} @ int<size_t>")]]
+[[rc::ensures("[v ◁ᵥ l @ list_t]")]]  // TODO: there should be nicer syntax for this
+size_t length_val_rec (list_t p) {
+  if(p == NULL) {
+    return 0;
+  }
+  return length_val_rec(p->tail) + 1;
+}
+
 [[rc::parameters("p : loc", "l1 : {list type}", "l2 : {list type}")]]
 [[rc::args("p @ &own<l1 @ list_t>", "l2 @ list_t")]]
 [[rc::ensures("p @ &own<{l1 ++ l2} @ list_t>")]]