Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

Fixing a bug involving linear variable preservation/consumption in lo…

…ops.
  • Loading branch information...
commit d2feb4133290183be2585cc4d3ea071e4d7c8153 1 parent 6ce466a
Hongwei Xi authored
11 BUGS.txt
@@ -228,10 +228,17 @@ end // end of [fun]
228 228
229 229 Saturday: April 2, 2010 (HX)
230 230
231   -Status: no solution yet
  231 +STATUS: FIXED on May 27, 2010 (HX)
232 232
233 233 Using linear proofs/values in a while/for loop is not done correctly during
234   -typechecking.
  234 +typechecking. Here is an example:
  235 +
  236 +fun f () = () where {
  237 + prval pf = unit_v ()
  238 + val () = while (true) let
  239 + prval unit_v () = pf in continue
  240 + end // end of [val]
  241 +} // end of [where]
235 242
236 243 ######
237 244
17 contrib/GTK/CATS/gtk.cats
@@ -860,11 +860,13 @@ ATSinline()
860 860 ats_ptr_type
861 861 atsctrb_gtk_message_dialog_new0 (
862 862 GtkDialogFlags flags
863   -, GtkMessageType type, GtkButtonsType buttons
864   -, ats_ptr_type message
  863 +, GtkMessageType _type, GtkButtonsType buttons, ats_ptr_type msg
865 864 ) {
866 865 GtkWidget *widget =
867   - gtk_message_dialog_new (NULL, flags, type, buttons, (gchar*)message) ;
  866 + gtk_message_dialog_new (NULL, flags, _type, buttons, NULL) ;
  867 + gtk_label_set_text (
  868 + GTK_LABEL (GTK_MESSAGE_DIALOG (widget)->label), (gchar*)msg
  869 + ) ; // end of [gtk_label_set_text]
868 870 g_object_ref_sink(G_OBJECT(widget)) ; // removing floating reference!
869 871 return widget ;
870 872 } // end of [atsctrb_gtk_message_dialog_new0]
@@ -873,17 +875,20 @@ ATSinline()
873 875 ats_ptr_type
874 876 atsctrb_gtk_message_dialog_new0_with_markup (
875 877 GtkDialogFlags flags
876   -, GtkMessageType _type, GtkButtonsType buttons
877   -, ats_ptr_type message
  878 +, GtkMessageType _type, GtkButtonsType buttons, ats_ptr_type msg
878 879 ) {
879 880 GtkWidget *widget =
880   - gtk_message_dialog_new_with_markup (NULL, flags, _type, buttons, (gchar*)message) ;
  881 + gtk_message_dialog_new_with_markup (NULL, flags, _type, buttons, NULL) ;
  882 + gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (widget), (gchar*)msg) ;
881 883 g_object_ref_sink(G_OBJECT(widget)) ; // removing floating reference!
882 884 return widget ;
883 885 } // end of [atsctrb_gtk_message_dialog_new0_with_markup]
884 886
885 887 #define atsctrb_gtk_message_dialog_set_markup gtk_message_dialog_set_markup
886 888
  889 +#define atsctrb_gtk_messgage_dialog_get_image gtk_messgage_dialog_get_image
  890 +#define atsctrb_gtk_messgage_dialog_set_image gtk_messgage_dialog_set_image
  891 +
887 892 /* ****** ****** */
888 893
889 894 //
24 contrib/GTK/SATS/gtk/gtkmessagedialog.sats
@@ -58,7 +58,7 @@ macdef GTK_BUTTONS_OK_CANCEL = $extval (GtkButtonsType, "GTK_BUTTONS_OK_CANCEL")
58 58 (* ****** ****** *)
59 59
60 60 //
61   -// HX: these are just simplified versions
  61 +// HX-2010-05: these are just slightly simplified versions
62 62 //
63 63 fun gtk_message_dialog_new0
64 64 {l:addr} (
@@ -90,4 +90,26 @@ fun gtk_message_dialog_set_markup
90 90
91 91 (* ****** ****** *)
92 92
  93 +//
  94 +// HX-2010-05-26: checked: this is a 'get0' function
  95 +//
  96 +fun gtk_messgage_dialog_get_image
  97 + {c:cls | c <= GtkMessageDialog} {l:agz}
  98 + (dialog: !gobjref (c, l)): [l1:agz] (
  99 + minus (gobjref (c, l), gobjref (GtkImage, l1)) | gobjref (GtkImage, l1)
  100 + ) = "#atsctrb_gtk_messgage_dialog_get_image"
  101 +// end of [gtk_messgage_dialog_get_image]
  102 +
  103 +//
  104 +// HX-2010-05-26: checked: [image] can be NULL!
  105 +//
  106 +fun gtk_messgage_dialog_set_image
  107 + {c1,c2:cls | c1 <= GtkMessageDialog; c2 <= GtkImage}
  108 + {l1,l2:addr | l1 > null}
  109 + (dialog: !gobjref (c1, l1), image: !gobjref (c2, l2)): void
  110 + = "#atsctrb_gtk_messgage_dialog_set_image"
  111 +// end of [gtk_messgage_dialog_set_image]
  112 +
  113 +(* ****** ****** *)
  114 +
93 115 (* end of [gtkmessagedialog.sats] *)
2  src/Makefile
@@ -58,7 +58,7 @@ ATSCC="$(ATSHOME)"/bin/atscc
58 58 ATSCCFLAGS=-g
59 59 #ATSCCFLAGS=-O0
60 60 #ATSCCFLAGS=-O1
61   -#ATSCCFLAGS=-O2
  61 +ATSCCFLAGS=-O2
62 62 #ATSCCFLAGS=-D_ATS_MULTITHREAD -O2 -g
63 63 #ATSCCFLAGS=-O2 -g
64 64
20 src/ats_trans3_env.dats
@@ -780,19 +780,21 @@ the_d2varset_env_find_viewat (s2r0, s2ls0) = let
780 780 | None => () // this happens if [d2v] is linear and consumed
781 781 end // end of [f]
782 782
783   - fun loop (pf: !unit_v | ld2vsitems: ld2vsitemlst, env: !env_vt)
784   - : void = begin case+ ld2vsitems of
  783 + fun loop (
  784 + pf: !unit_v
  785 + | ld2vsitems: ld2vsitemlst, env: !env_vt
  786 + ) : void = begin case+ ld2vsitems of
785 787 | list_cons (ld2vsitem, ld2vsitems) => let
786 788 val () = (case+ ld2vsitem of
787 789 | LD2VSITEMlam () => $raise NotFound ()
788 790 | LD2VSITEMllam _(*r_d2vs*) => () // continue search
789 791 | LD2VSITEMset dvs => begin
790 792 d2varset_foreach_main {unit_v} {env_vt} (pf | dvs, f, env)
791   - end
  793 + end // end of [LD2VSITEMset]
792 794 ) : void
793 795 in
794 796 loop (pf | ld2vsitems, env)
795   - end
  797 + end // end of [list_cons]
796 798 | list_nil () => ()
797 799 end // end of [loop]
798 800 in
@@ -821,6 +823,12 @@ the_d2varset_env_stbefitemlst_save () = let
821 823 viewdef V = stbefitemlst @ sbis
822 824 fun f (pf: !V | d2v: d2var_t, sbis: !sbisptr): void = let
823 825 val lin = d2var_lin_get d2v
  826 +(*
  827 + val () = begin
  828 + print "the_d2varset_env_stbefitemlst_save: f: d2v = "; print d2v; print_newline ();
  829 + print "the_d2varset_env_stbefitemlst_save: f: lin = "; print lin; print_newline ();
  830 + end // end of [val]
  831 +*)
824 832 in
825 833 if lin >= 0 then let val sbi =
826 834 stbefitem_make (d2v, lin) in !sbis := list_cons (sbi, !sbis)
@@ -837,14 +845,14 @@ the_d2varset_env_stbefitemlst_save () = let
837 845 end
838 846 in
839 847 aux (pf | xs, sbis)
840   - end
  848 + end (* LD2VSITEMset *)
841 849 end // end of [list_cons]
842 850 | list_nil () => ()
843 851 end // end of [aux]
844 852 prval pf = view@ sbis
845 853 val () = begin
846 854 d2varset_foreach_main {V} {sbisptr} (pf | !the_ld2vs, f, &sbis)
847   - end
  855 + end // end of [val]
848 856 val () = aux (pf | !the_ld2vsitems, &sbis)
849 857 in
850 858 view@ sbis := pf; sbis
16 src/ats_trans3_env.sats
@@ -431,21 +431,29 @@ fun stbefitemlst_restore_lin_typ (sbis: stbefitemlst): void
431 431 abstype staftitem_t // assumed in [ats_trans3_env_state.dats]
432 432 typedef staftitemlst (n:int) = list (staftitem_t, n)
433 433
434   -abstype staftscstr_t (n:int) // assumed in [ats_trans3_env_state.dats]
  434 +(* ****** ****** *)
435 435
436   -//
  436 +abstype staftscstr_t (n:int) // assumed in [ats_trans3_env_state.dats]
437 437
438 438 fun staftscstr_met_set
439 439 {n:nat} (sac: staftscstr_t n, met: s2explstopt): void
440 440 = "ats_trans3_env_state_staftscstr_met_set"
441   -
442   -//
  441 +// end of [staftscstr_met_set]
443 442
444 443 fun staftscstr_initialize {n:nat}
445 444 (res: i2nvresstate, sbis: stbefitemlst n): staftscstr_t n
446 445
447 446 fun staftscstr_stbefitemlst_merge {n:nat}
448 447 (loc: loc_t, sac: staftscstr_t n, sbis: stbefitemlst n): void
  448 +// end of [staftscstr_stbefitemlst_merge]
  449 +//
  450 +// HX-2010-05-27:
  451 +// This version of [staftscstr_stbefitemlst_merge] skips termination
  452 +// metric checking even if termination metric is provided.
  453 +//
  454 +fun staftscstr_stbefitemlst_merge_skipmetck {n:nat}
  455 + (loc: loc_t, sac: staftscstr_t n, sbis: stbefitemlst n): void
  456 +// end of [staftscstr_stbefitemlst_merge]
449 457
450 458 fun staftscstr_stbefitemlst_check {n:nat}
451 459 (loc0: loc_t, sac: staftscstr_t n, sbis: stbefitemlst n): void
121 src/ats_trans3_env_state.dats
@@ -30,10 +30,10 @@
30 30 *)
31 31
32 32 (* ****** ****** *)
33   -
  33 +//
34 34 // Author: Hongwei Xi (hwxi AT cs DOT bu DOT edu)
35 35 // Time: January 2008
36   -
  36 +//
37 37 (* ****** ****** *)
38 38
39 39 (* Mainly for tracking states during the third translation *)
@@ -114,6 +114,25 @@ fn saityp_loc_get (x: saityp): loc_t = case+ x of
114 114 | SAITYPsome (loc, _) => loc | SAITYPnone loc => loc
115 115 // end of [saityp_loc_get]
116 116
  117 +fun print_saityp (x: saityp): void =
  118 + case+ x of
  119 + | SAITYPsome (_, s2e) =>
  120 + (print "SAITYPsome("; print_s2exp s2e; print ")")
  121 + | SAITYPnone _ => print "SAITYPnone()"
  122 +// end of [print_saityp]
  123 +fun print_saityplst
  124 + (xs: saityplst): void = loop (xs, 0) where {
  125 + fun loop (xs: saityplst, i: int): void =
  126 + case+ xs of
  127 + | list_cons (x, xs) => (
  128 + if (i > 0) then print ", "; print_saityp x; loop (xs, i+1)
  129 + ) // end of [list_cons]
  130 + | list_nil () => ()
  131 + // end of [loop]
  132 +} // end of [print_saityp]
  133 +
  134 +(* ****** ****** *)
  135 +
117 136 fn saityplst_check
118 137 (d2v: d2var_t, xs: saityplst): int = let
119 138 fn errmsg (d2v: d2var_t, x: saityp): void = case+ x of
@@ -198,18 +217,27 @@ typedef staftscstr (n:int) = '{
198 217
199 218 assume staftscstr_t (n:int) = staftscstr (n)
200 219
201   -extern fun staftscstr_cstr_set
202   - {n:nat} (sac: staftscstr n, cstr: sascstrlst): void
203   - = "ats_trans3_env_state_staftscstr_cstr_set"
  220 +extern
  221 +fun staftscstr_cstr_set {n:nat} (
  222 + sac: staftscstr n, cstr: sascstrlst
  223 + ) : void = "ats_trans3_env_state_staftscstr_cstr_set"
  224 +// end of [staftscstr_cstr_set]
204 225
205 226 (* ****** ****** *)
206 227
207   -implement staftscstr_initialize (res, sbis) = let
  228 +implement
  229 +staftscstr_initialize (res, sbis) = let
208 230 val sais = aux sbis where {
209 231 fun aux {n:nat}
210 232 (sbis: stbefitemlst n): staftitemlst n = case+ sbis of
211 233 | list_cons (sbi, sbis) => let
212 234 val d2v = sbi.stbefitem_var; val lin = d2var_lin_get d2v
  235 +(*
  236 + val () = begin
  237 + print "staftscstr_initialize: aux: d2v = "; print d2v; print_newline ();
  238 + print "staftscstr_initialize: aux: lin = "; print lin; print_newline ();
  239 + end // end of [val]
  240 +*)
213 241 val sai = '{
214 242 staftitem_var= d2v, staftitem_lin= lin, staftitem_typ= list_nil ()
215 243 } // end of [val]
@@ -226,14 +254,16 @@ in '{
226 254 , staftscstr_cstr= list_nil ()
227 255 } end // end of [staftscstr_initialize]
228 256
229   -// [loc0] is the location of the branch
230   -implement staftscstr_stbefitemlst_merge (loc0, sac, sbis) = let
  257 +//
  258 +// HX: [loc0] is the location of the branch
  259 +//
  260 +fun staftscstr_stbefitemlst_merge_ifmetck {n:nat} (
  261 + loc0: loc_t, sac: staftscstr_t n, sbis: stbefitemlst n, metck: bool
  262 + ) : void = let
231 263 fn aux (loc0: loc_t, sai: staftitem, sbi: stbefitem): void = let
232 264 val linbef = sbi.stbefitem_lin
233 265 val d2v = sbi.stbefitem_var
234 266 val lincur = d2var_lin_get d2v
235   - val saityp = case+ d2var_typ_get d2v of
236   - | Some s2e => SAITYPsome (loc0, s2e) | None () => SAITYPnone loc0
237 267 val linaft = sai.staftitem_lin
238 268 (*
239 269 val () = begin
@@ -245,12 +275,28 @@ implement staftscstr_stbefitemlst_merge (loc0, sac, sbis) = let
245 275 print lincur; print_newline ();
246 276 print "staftscstr_stbefitemlst_merge: aux: sai.staftitem_lin = ";
247 277 print linaft; print_newline ();
  278 +
  279 + end // end of [val]
  280 +*)
  281 + val saityp = case+ d2var_typ_get d2v of
  282 + | Some s2e => SAITYPsome (loc0, s2e) | None () => SAITYPnone loc0
  283 + // end of [val]
  284 +(*
  285 + val () = begin
  286 + print "staftscstr_stbefitemlst_merge: aux: saityp = ";
  287 + print_saityp saityp; print_newline ()
248 288 end // end of [val]
249 289 *)
250 290 val () = if lincur > linbef then begin
251 291 staftitem_lin_set (sai, linaft + lincur - linbef)
252 292 end // end of [val]
253 293 val saityps = sai.staftitem_typ
  294 +(*
  295 + val () = begin
  296 + print "staftscstr_stbefitemlst_merge: aux: saityps = ";
  297 + print_saityplst saityps; print_newline ()
  298 + end // end of [val]
  299 +*)
254 300 val () = case+ saityps of // consistency check
255 301 | list_cons (saityp1, _) => begin case+ (saityp, saityp1) of
256 302 | (SAITYPsome (loc, _), SAITYPnone _) => begin
@@ -281,12 +327,16 @@ implement staftscstr_stbefitemlst_merge (loc0, sac, sbis) = let
281 327 aux (loc0, sai, sbi); auxlst (loc0, sais, sbis)
282 328 end // end of [list_cons]
283 329 | list_nil () => ()
  330 + // end of [auxlst]
284 331 val res = sac.staftscstr_res
285 332 val sub = s2qua_instantiate_and_add
286 333 (loc0, res.i2nvresstate_svs, res.i2nvresstate_gua)
287 334 // end of [val]
288   - val met = (case+ res.i2nvresstate_met of
289   - | Some s2es => Some (s2explst_subst (sub, s2es)) | None () => None ()
  335 + val met = (
  336 + if metck then
  337 + case+ res.i2nvresstate_met of
  338 + | Some s2es => Some (s2explst_subst (sub, s2es)) | None () => None ()
  339 + else None () // end of [if]
290 340 ) : s2explstopt
291 341 val r = ref_make_elt<c3stropt> (None ())
292 342 val sascstr = sascstr_make (loc0, met, sub, r)
@@ -294,7 +344,15 @@ in
294 344 trans3_env_add_cstr_ref (r);
295 345 staftscstr_cstr_set (sac, list_cons (sascstr, sac.staftscstr_cstr));
296 346 auxlst (loc0, sac.staftscstr_sais, sbis)
297   -end // end of [staftscstr_stbefitemlst_merge]
  347 +end // end of [staftscstr_stbefitemlst_merge_ifmetck]
  348 +
  349 +implement staftscstr_stbefitemlst_merge
  350 + (loc0, sac, sbis) = staftscstr_stbefitemlst_merge_ifmetck (loc0, sac, sbis, true)
  351 +// end of [staftscstr_stbefitemlst_merge]
  352 +
  353 +implement staftscstr_stbefitemlst_merge_skipmetck
  354 + (loc0, sac, sbis) = staftscstr_stbefitemlst_merge_ifmetck (loc0, sac, sbis, false)
  355 +// end of [staftscstr_stbefitemlst_merge_skipmetck]
298 356
299 357 (* ****** ****** *)
300 358
@@ -480,11 +538,7 @@ fn aux_term_check
480 538 in
481 539 trans3_env_add_metric_dec (x.sascstr_loc, s2es, s2es_bound)
482 540 end // end of [Some]
483   - | None () => begin
484   - prerr_interror ();
485   - prerr ": aux_term_check: Some: None"; prerr_newline ();
486   - $Err.abort {void} ()
487   - end // end of [None]
  541 + | None () => () // this means that termination checking is skipped
488 542 end (* end of [Some] *)
489 543 | None () => ()
490 544 end // end of [aux_term_check]
@@ -512,7 +566,8 @@ end // end of [aux_itemlst_all]
512 566
513 567 in // in of [local]
514 568
515   -implement staftscstr_stbefitemlst_check (loc0, sac, sbis) = let
  569 +implement
  570 +staftscstr_stbefitemlst_check (loc0, sac, sbis) = let
516 571 (*
517 572 val () = begin
518 573 $Loc.print_location loc0;
@@ -599,7 +654,8 @@ end // end of [aux_iter]
599 654
600 655 in // in of [local]
601 656
602   -implement staftscstr_stbefitemlst_update (loc0, sac, sbis) = let
  657 +implement
  658 +staftscstr_stbefitemlst_update (loc0, sac, sbis) = let
603 659 val res = sac.staftscstr_res and sais = sac.staftscstr_sais
604 660 val () = trans3_env_add_svarlst res.i2nvresstate_svs
605 661 val () = trans3_env_hypo_add_proplst (loc0, res.i2nvresstate_gua)
@@ -616,16 +672,16 @@ extern typedef "staftitem_t" = staftitem
616 672 %{$
617 673
618 674 ats_void_type
619   -ats_trans3_env_state_staftitem_lin_set (ats_ptr_type sai, ats_int_type lin)
620   -{
  675 +ats_trans3_env_state_staftitem_lin_set
  676 + (ats_ptr_type sai, ats_int_type lin) {
621 677 ((staftitem_t)sai)->atslab_staftitem_lin = lin; return ;
622   -}
  678 +} // end of [ats_trans3_env_state_staftitem_lin_set]
623 679
624 680 ats_void_type
625   -ats_trans3_env_state_staftitem_typ_set (ats_ptr_type sai, ats_ptr_type os2es)
626   -{
  681 +ats_trans3_env_state_staftitem_typ_set
  682 + (ats_ptr_type sai, ats_ptr_type os2es) {
627 683 ((staftitem_t)sai)->atslab_staftitem_typ = os2es; return ;
628   -}
  684 +} // end of [ats_trans3_env_state_staftitem_typ_set]
629 685
630 686 %} // end of [%{$]
631 687
@@ -634,20 +690,19 @@ extern typedef "staftscstr_t" = [n:int] staftscstr (n)
634 690 %{$
635 691
636 692 ats_void_type
637   -ats_trans3_env_state_staftscstr_met_set (ats_ptr_type sac, ats_ptr_type met)
638   -{
  693 +ats_trans3_env_state_staftscstr_met_set
  694 + (ats_ptr_type sac, ats_ptr_type met) {
639 695 ((staftscstr_t)sac)->atslab_staftscstr_met = met ; return ;
640   -}
  696 +} // end of [ats_trans3_env_state_staftscstr_met_set]
641 697
642 698 ats_void_type
643   -ats_trans3_env_state_staftscstr_cstr_set (ats_ptr_type sac, ats_ptr_type cstr)
644   -{
  699 +ats_trans3_env_state_staftscstr_cstr_set
  700 + (ats_ptr_type sac, ats_ptr_type cstr) {
645 701 ((staftscstr_t)sac)->atslab_staftscstr_cstr = cstr ; return ;
646   -}
  702 +} // end of [ats_trans3_env_state_staftscstr_cstr_set]
647 703
648 704 %} // end of [%{$]
649 705
650 706 (* ****** ****** *)
651 707
652 708 (* end of [ats_trans3_env_state.dats] *)
653   -
6 src/ats_trans3_exp_dn.dats
@@ -248,7 +248,7 @@ implement d2exp_sif_tr_dn
248 248 val res = i2nvresstate_update (res)
249 249 val sbis = the_d2varset_env_stbefitemlst_save ()
250 250 val sac = staftscstr_initialize (res, sbis)
251   -
  251 +//
252 252 val d3e_then = let
253 253 val () = trans3_env_push_sta ()
254 254 val () = trans3_env_hypo_add_prop (loc0, s2p_cond)
@@ -258,9 +258,9 @@ implement d2exp_sif_tr_dn
258 258 in
259 259 d3e_then
260 260 end // end of [val]
261   -
  261 +//
262 262 val () = stbefitemlst_restore_lin_typ (sbis)
263   -
  263 +//
264 264 val d3e_else = let
265 265 val () = trans3_env_push_sta ()
266 266 val () = trans3_env_hypo_add_prop (loc0, s2exp_neg_bool_bool s2p_cond)
13 src/ats_trans3_loop.dats
@@ -30,10 +30,10 @@
30 30 *)
31 31
32 32 (* ****** ****** *)
33   -
  33 +//
34 34 // Author: Hongwei Xi (hwxi AT cs DOT bu DOT edu)
35 35 // March 2008
36   -
  36 +//
37 37 (* ****** ****** *)
38 38
39 39 staload Err = "ats_error.sats"
@@ -98,7 +98,8 @@ fn d2exp_loopinv_tr
98 98 i2nvresstate_make (i2nv_res_svs, i2nv_res_gua, i2nv_res_arg_new)
99 99 end // end of [val]
100 100 val () = let
101   - fn aux (arg: i2nvarg):<cloptr1> void = let
  101 + fn aux (arg: i2nvarg)
  102 + :<cloptr1> void = let
102 103 val d2v = arg.i2nvarg_var
103 104 in
104 105 case+ arg.i2nvarg_typ of
@@ -165,13 +166,15 @@ implement d2exp_loop_tr_up
165 166 staftscstr_stbefitemlst_check (loc0, sac0_init, sbis)
166 167 //
167 168 val () = trans3_env_push_sta () // loop checking begs
168   - val () = // updating the types of the modified variables
  169 + val () =
  170 + // updating the types of the modified variables
169 171 // according to the types given in the invariant
170 172 staftscstr_stbefitemlst_update (loc0, sac0_init, sbis)
171 173 (* end of [val] *)
172 174 //
173   - val (i2nv_met, res_exit) = d2exp_loopinv_tr (i2nv)
174 175 val sac_init = staftscstr_initialize (res_init, sbis)
  176 + val () = staftscstr_stbefitemlst_merge_skipmetck (loc0, sac_init, sbis)
  177 + val (i2nv_met, res_exit) = d2exp_loopinv_tr (i2nv)
175 178 val () = staftscstr_met_set (sac_init, i2nv_met)
176 179 val sac_exit = staftscstr_initialize (res_exit, sbis)
177 180 //
4 utils/scripts/atslib_main.dats
@@ -39,13 +39,11 @@
39 39 (* ****** ****** *)
40 40
41 41 %{^
42   -
43 42 #include "libc/CATS/stdio.cats"
44 43 #include "libc/CATS/stdlib.cats"
45 44 #include "libc/sys/CATS/types.cats"
46 45 #include "libc/CATS/unistd.cats"
47   -
48   -%}
  46 +%} // end of [%{^]
49 47
50 48 (* ****** ****** *)
51 49
2  utils/scripts/atspack.dats
@@ -345,7 +345,7 @@ in
345 345 in
346 346 res
347 347 end else
348   - false // [sfx] cannot be the suffix of [name
  348 + false // [sfx] cannot be the suffix of [name]
349 349 // end of [if]
350 350 end // end of [name_is_suffix]
351 351

0 comments on commit d2feb41

Please sign in to comment.
Something went wrong with that request. Please try again.