From 01586c6a0f0c063ea452760933adcf6239349e08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Mayer?= Date: Thu, 24 Oct 2024 13:36:07 -0500 Subject: [PATCH 01/15] Fix: Object::from_ref no longer forgetting to increment the strong count (#5858) Fixes #5851 I haven't been able to produce consistently any program that could exhibit the issue this PR is solving, the only hint I had that this happened was the report of #5851, which I reasoned manually must come from this function that is being skipped. By making it opaque to the compiler, we prevent optimizations that would skip the strong count from increasing. Alternative to this would be to pass &Rc instead of &Self, which is what https://github.com/dafny-lang/dafny/tree/fix-object-safety-rust does, but &Rc does not make traits object-safe, which means we can't yet use them in the code. I tried also passing a second arguments so that we directly have a `Rc<>` and don't need to recover it from the &T, but `this: Rc` again makes the trait not object-safe, and `this: Rc` causes an issue because we can't create this argument when what we have is only the trait, and trait upcast to Any is currently unsound in Rust. This PR is the best workaround I found so far. By submitting this pull request, I confirm that my contribution is made under the terms of the [MIT license](https://github.com/dafny-lang/dafny/blob/master/LICENSE.txt). --- Source/DafnyRuntime/DafnyRuntimeRust/src/lib.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Source/DafnyRuntime/DafnyRuntimeRust/src/lib.rs b/Source/DafnyRuntime/DafnyRuntimeRust/src/lib.rs index 13745ff9c0b..596f761a6b4 100644 --- a/Source/DafnyRuntime/DafnyRuntimeRust/src/lib.rs +++ b/Source/DafnyRuntime/DafnyRuntimeRust/src/lib.rs @@ -3508,15 +3508,24 @@ impl AsRef for Object { fn increment_strong_count(data: *const T) { // SAFETY: This method is called only on values that were constructed from an Rc unsafe { - Rc::increment_strong_count(data); + // Black box avoids the compiler wrongly inferring that increment strong count does nothing since the data it was applied to can be traced to be borrowed + ::std::hint::black_box(Rc::increment_strong_count(data)); } } impl Object { + // SAFETY: This function needs to be called from a reference obtained by calling read!(o) on an object + // We never inline this function, otherwise the compiler might figure out a way to remove the increment_strong_count + #[inline(never)] pub fn from_ref(r: &T) -> Object { let pt = r as *const T as *const UnsafeCell; - crate::increment_strong_count(pt); + // SAFETY: Not guaranteed unfortunately. But looking at the sources of from_raw as of today 10/24/2024 + // it will will correctly rebuilt the Rc let rebuilt = unsafe { Rc::from_raw(pt) }; + let previous_strong_count = Rc::strong_count(&rebuilt); + ::std::hint::black_box(crate::increment_strong_count(pt)); + let new_strong_count = Rc::strong_count(&rebuilt); + assert_eq!(new_strong_count, previous_strong_count + 1); // Will panic if not Object(Some(rebuilt)) } } From 7a265bc2bcbcfff2b8077a8e2c05598d5c086c9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Mayer?= Date: Mon, 28 Oct 2024 09:12:38 -0500 Subject: [PATCH 02/15] Removing offending test for the unsound Rust compiler to unblock CI (#5866) ### Description This PR removes the test "comp/rust/cargoreleasefailure.dfy" because this test is randomly failing. This test however catches a soundness issue in the Rust compiler, without it, we can't assume safely that the Rust code generator is sound anymore until it's added back, which I'll do in a subsequent PR labelled "run-deep-tests" to ensure this test is thoroughly fixed. By submitting this pull request, I confirm that my contribution is made under the terms of the [MIT license](https://github.com/dafny-lang/dafny/blob/master/LICENSE.txt). --- .../LitTest/comp/rust/cargoreleasefailure.dfy | 48 ------------------- 1 file changed, 48 deletions(-) delete mode 100644 Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/cargoreleasefailure.dfy diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/cargoreleasefailure.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/cargoreleasefailure.dfy deleted file mode 100644 index e247b923cfc..00000000000 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/cargoreleasefailure.dfy +++ /dev/null @@ -1,48 +0,0 @@ -// NONUNIFORM: Rust-specific tests -// RUN: %baredafny build --target=rs "%s" -// If there is no '#[inline(never)]' in front of ::dafny_runtime::increment_strong_count -// then the release will think it's safe to remove the strong count increment, resulting ins a segfault -// RUN: "%S/cargoreleasefailure-rust/cargo" run --release - -module TraitModule { - trait {:termination false} MyTrait { - method DoThing ( input: int ) returns (output: int) - } -} - -module ImplModule { - import TraitModule - class MyImpl extends TraitModule.MyTrait { - constructor(){} - method DoThing ( input: int ) returns (output: int) - { - return 1; - } - } -} - -module WorkModule { - import ImplModule - import TraitModule - - method DoWork() { - var worker := new ImplModule.MyImpl(); - DoMoreWork(worker, 1); - DoMoreWork(worker, 2); - DoMoreWork(worker, 3); - DoMoreWork(worker, 4); - DoMoreWork(worker, 5); - } - - method DoMoreWork(client : TraitModule.MyTrait, num : int) - { - var _ := client.DoThing(num); - } -} - -module MainModule { - import WorkModule - method Main() { - WorkModule.DoWork(); - } -} \ No newline at end of file From 89ec40a97b8e602e945e03d095e98f3ca70a7d31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Mayer?= Date: Tue, 29 Oct 2024 12:56:40 -0500 Subject: [PATCH 03/15] Chore: Fix cargo release for Object::from_ref (#5867) This PR should run all deep tests and pass before being merged, so that the test cargoreleasefailurefix.dfy passes ### Description This PR adds more black-boxing around a critical function so that the compiler won't optimize things away by for example moving the increment strong count and the assignments to `previous_strong_count`, which could have caused panicking; ### How has this been tested? All deep tests should pass, so that cargoreleasefailurefix.dfy is tested for each supported architecture By submitting this pull request, I confirm that my contribution is made under the terms of the [MIT license](https://github.com/dafny-lang/dafny/blob/master/LICENSE.txt). --- .../workflows/integration-tests-reusable.yml | 16 +++++++ .../DafnyRuntime/DafnyRuntimeRust/src/lib.rs | 8 ++-- .../LitTest/comp/rust/cargoreleasefailure.dfy | 48 +++++++++++++++++++ 3 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/cargoreleasefailure.dfy diff --git a/.github/workflows/integration-tests-reusable.yml b/.github/workflows/integration-tests-reusable.yml index 3df76e1caea..ed6ee6687f3 100644 --- a/.github/workflows/integration-tests-reusable.yml +++ b/.github/workflows/integration-tests-reusable.yml @@ -128,6 +128,22 @@ jobs: # - name: Clean up libraries for testing # run: | # rm dafny/Test/libraries/lit.site.cfg # we remove the lit configuration file in the library repo (a git submodule) to prevent override + - name: Use the default Rust linker (Non-Windows) + if: runner.os != 'Windows' + run: rustup default stable + - name: Use specific Toolchain (Windows) + if: runner.os == 'Windows' + run: rustup default stable-x86_64-pc-windows-gnu + - name: Rust-related System information + run: | + echo "What is the Rust version?" + rustc -vV + echo "What is the cargo version?" + cargo --version + echo "What is the architecture?" + uname -m + echo "What are Rust toolchains installed?" + rustup toolchain list - name: Create release if: inputs.all_platforms run: | diff --git a/Source/DafnyRuntime/DafnyRuntimeRust/src/lib.rs b/Source/DafnyRuntime/DafnyRuntimeRust/src/lib.rs index 596f761a6b4..38144c2d35e 100644 --- a/Source/DafnyRuntime/DafnyRuntimeRust/src/lib.rs +++ b/Source/DafnyRuntime/DafnyRuntimeRust/src/lib.rs @@ -3516,15 +3516,15 @@ fn increment_strong_count(data: *const T) { impl Object { // SAFETY: This function needs to be called from a reference obtained by calling read!(o) on an object // We never inline this function, otherwise the compiler might figure out a way to remove the increment_strong_count - #[inline(never)] + #[inline(never)] pub fn from_ref(r: &T) -> Object { let pt = r as *const T as *const UnsafeCell; // SAFETY: Not guaranteed unfortunately. But looking at the sources of from_raw as of today 10/24/2024 // it will will correctly rebuilt the Rc - let rebuilt = unsafe { Rc::from_raw(pt) }; - let previous_strong_count = Rc::strong_count(&rebuilt); + let rebuilt = ::std::hint::black_box(unsafe { Rc::from_raw(pt) }); + let previous_strong_count = ::std::hint::black_box(Rc::strong_count(&rebuilt)); ::std::hint::black_box(crate::increment_strong_count(pt)); - let new_strong_count = Rc::strong_count(&rebuilt); + let new_strong_count = ::std::hint::black_box(Rc::strong_count(&rebuilt)); assert_eq!(new_strong_count, previous_strong_count + 1); // Will panic if not Object(Some(rebuilt)) } diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/cargoreleasefailure.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/cargoreleasefailure.dfy new file mode 100644 index 00000000000..e247b923cfc --- /dev/null +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/cargoreleasefailure.dfy @@ -0,0 +1,48 @@ +// NONUNIFORM: Rust-specific tests +// RUN: %baredafny build --target=rs "%s" +// If there is no '#[inline(never)]' in front of ::dafny_runtime::increment_strong_count +// then the release will think it's safe to remove the strong count increment, resulting ins a segfault +// RUN: "%S/cargoreleasefailure-rust/cargo" run --release + +module TraitModule { + trait {:termination false} MyTrait { + method DoThing ( input: int ) returns (output: int) + } +} + +module ImplModule { + import TraitModule + class MyImpl extends TraitModule.MyTrait { + constructor(){} + method DoThing ( input: int ) returns (output: int) + { + return 1; + } + } +} + +module WorkModule { + import ImplModule + import TraitModule + + method DoWork() { + var worker := new ImplModule.MyImpl(); + DoMoreWork(worker, 1); + DoMoreWork(worker, 2); + DoMoreWork(worker, 3); + DoMoreWork(worker, 4); + DoMoreWork(worker, 5); + } + + method DoMoreWork(client : TraitModule.MyTrait, num : int) + { + var _ := client.DoThing(num); + } +} + +module MainModule { + import WorkModule + method Main() { + WorkModule.DoWork(); + } +} \ No newline at end of file From 77cb3ba4699264045976d443469e6adaa08dbd4a Mon Sep 17 00:00:00 2001 From: Robin Salkeld Date: Tue, 29 Oct 2024 11:29:14 -0700 Subject: [PATCH 04/15] fix: Make FuncExtensions internal again, handle it in DafnyGeneratedFromDafnyPost.py instead (#5860) ### Description #5757 made `FuncExtensions` in the C# runtime public instead of internal, which is not ideal since it increases the API surface area of the runtime and is a one-way door (and causes false positives in prerelease regressions testing). It was done because it seemed to be necessary, but the actual root cause was dropping these extension methods when post-processing Dafny's output. This PR reverts the change and special-cases the class in the python script instead. ### How has this been tested? Existing tests. By submitting this pull request, I confirm that my contribution is made under the terms of the [MIT license](https://github.com/dafny-lang/dafny/blob/master/LICENSE.txt). --------- Co-authored-by: Mikael Mayer --- .../Backends/CSharp/CsharpCodeGenerator.cs | 9 +---- .../DafnyCore/DafnyGeneratedFromDafnyPost.py | 12 ++++++ .../GeneratedFromDafny/FuncExtensions.cs | 38 +++++++++++++++++++ .../DafnyRuntime/DafnyRuntimeSystemModule.cs | 3 +- 4 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 Source/DafnyCore/GeneratedFromDafny/FuncExtensions.cs diff --git a/Source/DafnyCore/Backends/CSharp/CsharpCodeGenerator.cs b/Source/DafnyCore/Backends/CSharp/CsharpCodeGenerator.cs index 770aeb9a096..8f1af398528 100644 --- a/Source/DafnyCore/Backends/CSharp/CsharpCodeGenerator.cs +++ b/Source/DafnyCore/Backends/CSharp/CsharpCodeGenerator.cs @@ -185,15 +185,10 @@ protected override void EmitBuiltInDecls(SystemModuleManager systemModuleManager // } // They aren't in any namespace to make them universally accessible. private void EmitFuncExtensions(SystemModuleManager systemModuleManager, ConcreteSyntaxTree wr) { - // An extension for this arity will be provided in the Runtime which has to be linked. - var omitAritiesBefore16 = !Options.IncludeRuntime && Options.SystemModuleTranslationMode is not CommonOptionBag.SystemModuleMode.OmitAllOtherModules; - var name = omitAritiesBefore16 ? "FuncExtensionsAfterArity16" : "FuncExtensions"; - var funcExtensions = wr.NewNamedBlock("public static class " + name); + var funcExtensions = wr.NewNamedBlock("internal static class FuncExtensions"); + wr.WriteLine("// end of class FuncExtensions"); foreach (var kv in systemModuleManager.ArrowTypeDecls) { int arity = kv.Key; - if (omitAritiesBefore16 && arity <= 16) { - continue; - } List TypeParameterList(string prefix) { var l = arity switch { diff --git a/Source/DafnyCore/DafnyGeneratedFromDafnyPost.py b/Source/DafnyCore/DafnyGeneratedFromDafnyPost.py index f493acfaea3..af5eadec414 100644 --- a/Source/DafnyCore/DafnyGeneratedFromDafnyPost.py +++ b/Source/DafnyCore/DafnyGeneratedFromDafnyPost.py @@ -67,6 +67,18 @@ print(f"File generated: {file_path}") + # Special-case the FuncExtensions class, which isn't declared inside a namespace + func_extensions_pattern = re.compile(r'(internal\s+static\s+class\s+FuncExtensions\s*{[\s\S]*?}\s*//\s*end\s*of\s*class\s*FuncExtensions)') + match = func_extensions_pattern.search(content) + func_extensions_content = match[0] + + file_content = f"{prelude}\n\n{func_extensions_content}" + file_path = f"{output}/FuncExtensions.cs" + with open(file_path, 'w') as file: + file.write(file_content) + + print(f"File generated: {file_path}") + # Now delete the file output.cs os.remove(output + '.cs') print("File deleted: " + output + '.cs') diff --git a/Source/DafnyCore/GeneratedFromDafny/FuncExtensions.cs b/Source/DafnyCore/GeneratedFromDafny/FuncExtensions.cs new file mode 100644 index 00000000000..39894fcdf07 --- /dev/null +++ b/Source/DafnyCore/GeneratedFromDafny/FuncExtensions.cs @@ -0,0 +1,38 @@ +// Dafny program the_program compiled into C# +// To recompile, you will need the libraries +// System.Runtime.Numerics.dll System.Collections.Immutable.dll +// but the 'dotnet' tool in net6.0 should pick those up automatically. +// Optionally, you may want to include compiler switches like +// /debug /nowarn:162,164,168,183,219,436,1717,1718 + +using System; +using System.Numerics; +using System.Collections; +#pragma warning disable CS0164 // This label has not been referenced +#pragma warning disable CS0162 // Unreachable code detected +#pragma warning disable CS1717 // Assignment made to same variable + +internal static class FuncExtensions { + public static Func DowncastClone(this Func F, Func ArgConv, Func ResConv) { + return arg => ResConv(F(ArgConv(arg))); + } + public static Func DowncastClone(this Func F, Func ResConv) { + return () => ResConv(F()); + } + public static Func DowncastClone(this Func F, Func ArgConv1, Func ArgConv2, Func ResConv) { + return (arg1, arg2) => ResConv(F(ArgConv1(arg1), ArgConv2(arg2))); + } + public static Func DowncastClone(this Func F, Func ArgConv1, Func ArgConv2, Func ArgConv3, Func ResConv) { + return (arg1, arg2, arg3) => ResConv(F(ArgConv1(arg1), ArgConv2(arg2), ArgConv3(arg3))); + } + public static Func DowncastClone(this Func F, Func ArgConv1, Func ArgConv2, Func ArgConv3, Func ArgConv4, Func ResConv) { + return (arg1, arg2, arg3, arg4) => ResConv(F(ArgConv1(arg1), ArgConv2(arg2), ArgConv3(arg3), ArgConv4(arg4))); + } + public static Func DowncastClone(this Func F, Func ArgConv1, Func ArgConv2, Func ArgConv3, Func ArgConv4, Func ArgConv5, Func ArgConv6, Func ArgConv7, Func ResConv) { + return (arg1, arg2, arg3, arg4, arg5, arg6, arg7) => ResConv(F(ArgConv1(arg1), ArgConv2(arg2), ArgConv3(arg3), ArgConv4(arg4), ArgConv5(arg5), ArgConv6(arg6), ArgConv7(arg7))); + } + public static Func DowncastClone(this Func F, Func ArgConv1, Func ArgConv2, Func ArgConv3, Func ArgConv4, Func ArgConv5, Func ResConv) { + return (arg1, arg2, arg3, arg4, arg5) => ResConv(F(ArgConv1(arg1), ArgConv2(arg2), ArgConv3(arg3), ArgConv4(arg4), ArgConv5(arg5))); + } +} +// end of class FuncExtensions \ No newline at end of file diff --git a/Source/DafnyRuntime/DafnyRuntimeSystemModule.cs b/Source/DafnyRuntime/DafnyRuntimeSystemModule.cs index 2c19c6eacb4..b5b6988b139 100644 --- a/Source/DafnyRuntime/DafnyRuntimeSystemModule.cs +++ b/Source/DafnyRuntime/DafnyRuntimeSystemModule.cs @@ -503,7 +503,7 @@ public static T[] InitNewArray1(T z, BigInteger size0) { } } } // end of namespace Dafny -public static class FuncExtensions { +internal static class FuncExtensions { public static Func DowncastClone(this Func F, Func ArgConv, Func ResConv) { return arg => ResConv(F(ArgConv(arg))); } @@ -556,6 +556,7 @@ public static Func ResConv(F(ArgConv1(arg1), ArgConv2(arg2), ArgConv3(arg3), ArgConv4(arg4), ArgConv5(arg5), ArgConv6(arg6), ArgConv7(arg7), ArgConv8(arg8), ArgConv9(arg9), ArgConv10(arg10), ArgConv11(arg11), ArgConv12(arg12), ArgConv13(arg13), ArgConv14(arg14), ArgConv15(arg15), ArgConv16(arg16))); } } +// end of class FuncExtensions #endif namespace _System { From 142c49e6c25c45d442343ad7e95fc59e9bee6e80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Mayer?= Date: Tue, 29 Oct 2024 14:33:56 -0500 Subject: [PATCH 05/15] Fix: --rust-module-name with externs (#5865) Fixes #5864 ### Description This PR adds the ability to use `--rust-module-name` along with externs, by detecting that we are not generating an entry library file, and in that case it removes the "pub mod" declaration for the externs since side files do not have the ability to import externs themselves. Since the Rust compiler is internal, we don't advertise this change yet. ### How has this been tested? The test `translate_additional/more_dafny.dfy` was updated to include externs. The test was not working without this PR, reproducing faithfully the issue. By submitting this pull request, I confirm that my contribution is made under the terms of the [MIT license](https://github.com/dafny-lang/dafny/blob/master/LICENSE.txt). --- Source/DafnyCore/Backends/Rust/Dafny-compiler-rust.dfy | 6 ++++-- Source/DafnyCore/GeneratedFromDafny/DCOMP.cs | 8 +++++--- .../LitTest/comp/rust/translate-additional/more_dafny.dfy | 8 ++++++-- .../comp/rust/translate-additional/more_dafny_extern.rs | 5 +++++ .../project_depending_on_dafny/.gitignore | 1 + .../src/project_depending_on_dafny.rs | 1 + 6 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/more_dafny_extern.rs diff --git a/Source/DafnyCore/Backends/Rust/Dafny-compiler-rust.dfy b/Source/DafnyCore/Backends/Rust/Dafny-compiler-rust.dfy index b77139a0f79..1fc4232fece 100644 --- a/Source/DafnyCore/Backends/Rust/Dafny-compiler-rust.dfy +++ b/Source/DafnyCore/Backends/Rust/Dafny-compiler-rust.dfy @@ -3744,8 +3744,10 @@ module {:extern "DCOMP"} DafnyToRustCompiler { } else { error := Some("Unrecognized external file " + externalFile + ". External file must be *.rs files"); } - var externMod := R.ExternMod(externalMod); - s := s + externMod.ToString("") + "\n"; + if rootType.RootCrate? { + var externMod := R.ExternMod(externalMod); + s := s + externMod.ToString("") + "\n"; + } externUseDecls := externUseDecls + [ R.UseDecl(R.Use(R.PUB, R.crate.MSel(externalMod).MSel("*"))) ]; diff --git a/Source/DafnyCore/GeneratedFromDafny/DCOMP.cs b/Source/DafnyCore/GeneratedFromDafny/DCOMP.cs index 9158c6ca83b..4482140deb5 100644 --- a/Source/DafnyCore/GeneratedFromDafny/DCOMP.cs +++ b/Source/DafnyCore/GeneratedFromDafny/DCOMP.cs @@ -6679,9 +6679,11 @@ public RAST._IExpr Error(Dafny.ISequence message, RAST._IExpr defaul } else { (this).error = Std.Wrappers.Option>.create_Some(Dafny.Sequence.Concat(Dafny.Sequence.Concat(Dafny.Sequence.UnicodeFromString("Unrecognized external file "), _2_externalFile), Dafny.Sequence.UnicodeFromString(". External file must be *.rs files"))); } - RAST._IMod _4_externMod; - _4_externMod = RAST.Mod.create_ExternMod(_3_externalMod); - s = Dafny.Sequence.Concat(Dafny.Sequence.Concat(s, (_4_externMod)._ToString(Dafny.Sequence.UnicodeFromString(""))), Dafny.Sequence.UnicodeFromString("\n")); + if (((this).rootType).is_RootCrate) { + RAST._IMod _4_externMod; + _4_externMod = RAST.Mod.create_ExternMod(_3_externalMod); + s = Dafny.Sequence.Concat(Dafny.Sequence.Concat(s, (_4_externMod)._ToString(Dafny.Sequence.UnicodeFromString(""))), Dafny.Sequence.UnicodeFromString("\n")); + } _0_externUseDecls = Dafny.Sequence.Concat(_0_externUseDecls, Dafny.Sequence.FromElements(RAST.ModDecl.create_UseDecl(RAST.Use.create(RAST.Visibility.create_PUB(), ((RAST.__default.crate).MSel(_3_externalMod)).MSel(Dafny.Sequence.UnicodeFromString("*")))))); } if (!(_0_externUseDecls).Equals(Dafny.Sequence.FromElements())) { diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/more_dafny.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/more_dafny.dfy index e4facc514b9..c55fc26cb3f 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/more_dafny.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/more_dafny.dfy @@ -1,12 +1,16 @@ -// RUN: %baredafny translate rs --rust-module-name additional_module "%s" +// RUN: %baredafny translate rs --rust-module-name additional_module "%S/more_dafny_extern.rs" "%s" // RUN: %exits-with -any %rm -f "%S/project_depending_on_dafny/src/additional_module.rs" +// RUN: %exits-with -any %rm -f "%S/project_depending_on_dafny/src/more_dafny_extern.rs" // RUN: %mv "%S/more_dafny-rust/src/more_dafny.rs" "%S/project_depending_on_dafny/src/additional_module.rs" +// RUN: %mv "%S/more_dafny-rust/src/more_dafny_extern.rs" "%S/project_depending_on_dafny/src/more_dafny_extern.rs" // RUN: "%S/project_depending_on_dafny/cargo" run > "%t" // RUN: %diff "%s.expect" "%t" module SubModule { + function {:axiom} {:extern "extern_dafny", "eight"} Eight(): (r: bv16) ensures r == 8 + function reverse(input: bv16): bv16 { - ((input & 0xFF) << 8) | ((input & 0xFF00) >> 8) + ((input & 0xFF) << Eight()) | ((input & 0xFF00) >> Eight()) } } diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/more_dafny_extern.rs b/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/more_dafny_extern.rs new file mode 100644 index 00000000000..59348bf4c2a --- /dev/null +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/more_dafny_extern.rs @@ -0,0 +1,5 @@ +pub mod extern_dafny { + pub fn eight() -> u16 { + 8 + } +} \ No newline at end of file diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/project_depending_on_dafny/.gitignore b/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/project_depending_on_dafny/.gitignore index bc950be1152..d149df7bd20 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/project_depending_on_dafny/.gitignore +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/project_depending_on_dafny/.gitignore @@ -1,2 +1,3 @@ src/additional_module.rs +src/more_dafny_extern.rs target/ \ No newline at end of file diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/project_depending_on_dafny/src/project_depending_on_dafny.rs b/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/project_depending_on_dafny/src/project_depending_on_dafny.rs index 3dc44c6beae..ddcab2f93c8 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/project_depending_on_dafny/src/project_depending_on_dafny.rs +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/project_depending_on_dafny/src/project_depending_on_dafny.rs @@ -1,4 +1,5 @@ pub mod additional_module; +pub mod more_dafny_extern; fn main() { let x = additional_module::_module::_default::reverse(10); From bd38a723cdc67dbe04558c3d0490254f4bc39567 Mon Sep 17 00:00:00 2001 From: Robin Salkeld Date: Tue, 29 Oct 2024 11:29:14 -0700 Subject: [PATCH 06/15] fix: Make FuncExtensions internal again, handle it in DafnyGeneratedFromDafnyPost.py instead (#5860) ### Description #5757 made `FuncExtensions` in the C# runtime public instead of internal, which is not ideal since it increases the API surface area of the runtime and is a one-way door (and causes false positives in prerelease regressions testing). It was done because it seemed to be necessary, but the actual root cause was dropping these extension methods when post-processing Dafny's output. This PR reverts the change and special-cases the class in the python script instead. ### How has this been tested? Existing tests. By submitting this pull request, I confirm that my contribution is made under the terms of the [MIT license](https://github.com/dafny-lang/dafny/blob/master/LICENSE.txt). --------- Co-authored-by: Mikael Mayer --- .../Backends/CSharp/CsharpCodeGenerator.cs | 9 +---- .../DafnyCore/DafnyGeneratedFromDafnyPost.py | 12 ++++++ .../GeneratedFromDafny/FuncExtensions.cs | 38 +++++++++++++++++++ .../DafnyRuntime/DafnyRuntimeSystemModule.cs | 3 +- 4 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 Source/DafnyCore/GeneratedFromDafny/FuncExtensions.cs diff --git a/Source/DafnyCore/Backends/CSharp/CsharpCodeGenerator.cs b/Source/DafnyCore/Backends/CSharp/CsharpCodeGenerator.cs index 770aeb9a096..8f1af398528 100644 --- a/Source/DafnyCore/Backends/CSharp/CsharpCodeGenerator.cs +++ b/Source/DafnyCore/Backends/CSharp/CsharpCodeGenerator.cs @@ -185,15 +185,10 @@ protected override void EmitBuiltInDecls(SystemModuleManager systemModuleManager // } // They aren't in any namespace to make them universally accessible. private void EmitFuncExtensions(SystemModuleManager systemModuleManager, ConcreteSyntaxTree wr) { - // An extension for this arity will be provided in the Runtime which has to be linked. - var omitAritiesBefore16 = !Options.IncludeRuntime && Options.SystemModuleTranslationMode is not CommonOptionBag.SystemModuleMode.OmitAllOtherModules; - var name = omitAritiesBefore16 ? "FuncExtensionsAfterArity16" : "FuncExtensions"; - var funcExtensions = wr.NewNamedBlock("public static class " + name); + var funcExtensions = wr.NewNamedBlock("internal static class FuncExtensions"); + wr.WriteLine("// end of class FuncExtensions"); foreach (var kv in systemModuleManager.ArrowTypeDecls) { int arity = kv.Key; - if (omitAritiesBefore16 && arity <= 16) { - continue; - } List TypeParameterList(string prefix) { var l = arity switch { diff --git a/Source/DafnyCore/DafnyGeneratedFromDafnyPost.py b/Source/DafnyCore/DafnyGeneratedFromDafnyPost.py index f493acfaea3..af5eadec414 100644 --- a/Source/DafnyCore/DafnyGeneratedFromDafnyPost.py +++ b/Source/DafnyCore/DafnyGeneratedFromDafnyPost.py @@ -67,6 +67,18 @@ print(f"File generated: {file_path}") + # Special-case the FuncExtensions class, which isn't declared inside a namespace + func_extensions_pattern = re.compile(r'(internal\s+static\s+class\s+FuncExtensions\s*{[\s\S]*?}\s*//\s*end\s*of\s*class\s*FuncExtensions)') + match = func_extensions_pattern.search(content) + func_extensions_content = match[0] + + file_content = f"{prelude}\n\n{func_extensions_content}" + file_path = f"{output}/FuncExtensions.cs" + with open(file_path, 'w') as file: + file.write(file_content) + + print(f"File generated: {file_path}") + # Now delete the file output.cs os.remove(output + '.cs') print("File deleted: " + output + '.cs') diff --git a/Source/DafnyCore/GeneratedFromDafny/FuncExtensions.cs b/Source/DafnyCore/GeneratedFromDafny/FuncExtensions.cs new file mode 100644 index 00000000000..39894fcdf07 --- /dev/null +++ b/Source/DafnyCore/GeneratedFromDafny/FuncExtensions.cs @@ -0,0 +1,38 @@ +// Dafny program the_program compiled into C# +// To recompile, you will need the libraries +// System.Runtime.Numerics.dll System.Collections.Immutable.dll +// but the 'dotnet' tool in net6.0 should pick those up automatically. +// Optionally, you may want to include compiler switches like +// /debug /nowarn:162,164,168,183,219,436,1717,1718 + +using System; +using System.Numerics; +using System.Collections; +#pragma warning disable CS0164 // This label has not been referenced +#pragma warning disable CS0162 // Unreachable code detected +#pragma warning disable CS1717 // Assignment made to same variable + +internal static class FuncExtensions { + public static Func DowncastClone(this Func F, Func ArgConv, Func ResConv) { + return arg => ResConv(F(ArgConv(arg))); + } + public static Func DowncastClone(this Func F, Func ResConv) { + return () => ResConv(F()); + } + public static Func DowncastClone(this Func F, Func ArgConv1, Func ArgConv2, Func ResConv) { + return (arg1, arg2) => ResConv(F(ArgConv1(arg1), ArgConv2(arg2))); + } + public static Func DowncastClone(this Func F, Func ArgConv1, Func ArgConv2, Func ArgConv3, Func ResConv) { + return (arg1, arg2, arg3) => ResConv(F(ArgConv1(arg1), ArgConv2(arg2), ArgConv3(arg3))); + } + public static Func DowncastClone(this Func F, Func ArgConv1, Func ArgConv2, Func ArgConv3, Func ArgConv4, Func ResConv) { + return (arg1, arg2, arg3, arg4) => ResConv(F(ArgConv1(arg1), ArgConv2(arg2), ArgConv3(arg3), ArgConv4(arg4))); + } + public static Func DowncastClone(this Func F, Func ArgConv1, Func ArgConv2, Func ArgConv3, Func ArgConv4, Func ArgConv5, Func ArgConv6, Func ArgConv7, Func ResConv) { + return (arg1, arg2, arg3, arg4, arg5, arg6, arg7) => ResConv(F(ArgConv1(arg1), ArgConv2(arg2), ArgConv3(arg3), ArgConv4(arg4), ArgConv5(arg5), ArgConv6(arg6), ArgConv7(arg7))); + } + public static Func DowncastClone(this Func F, Func ArgConv1, Func ArgConv2, Func ArgConv3, Func ArgConv4, Func ArgConv5, Func ResConv) { + return (arg1, arg2, arg3, arg4, arg5) => ResConv(F(ArgConv1(arg1), ArgConv2(arg2), ArgConv3(arg3), ArgConv4(arg4), ArgConv5(arg5))); + } +} +// end of class FuncExtensions \ No newline at end of file diff --git a/Source/DafnyRuntime/DafnyRuntimeSystemModule.cs b/Source/DafnyRuntime/DafnyRuntimeSystemModule.cs index 2c19c6eacb4..b5b6988b139 100644 --- a/Source/DafnyRuntime/DafnyRuntimeSystemModule.cs +++ b/Source/DafnyRuntime/DafnyRuntimeSystemModule.cs @@ -503,7 +503,7 @@ public static T[] InitNewArray1(T z, BigInteger size0) { } } } // end of namespace Dafny -public static class FuncExtensions { +internal static class FuncExtensions { public static Func DowncastClone(this Func F, Func ArgConv, Func ResConv) { return arg => ResConv(F(ArgConv(arg))); } @@ -556,6 +556,7 @@ public static Func ResConv(F(ArgConv1(arg1), ArgConv2(arg2), ArgConv3(arg3), ArgConv4(arg4), ArgConv5(arg5), ArgConv6(arg6), ArgConv7(arg7), ArgConv8(arg8), ArgConv9(arg9), ArgConv10(arg10), ArgConv11(arg11), ArgConv12(arg12), ArgConv13(arg13), ArgConv14(arg14), ArgConv15(arg15), ArgConv16(arg16))); } } +// end of class FuncExtensions #endif namespace _System { From c5ce8c9b633003c34e7a20b9ce212ae818a87e8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Mayer?= Date: Tue, 29 Oct 2024 14:33:56 -0500 Subject: [PATCH 07/15] Fix: --rust-module-name with externs (#5865) Fixes #5864 ### Description This PR adds the ability to use `--rust-module-name` along with externs, by detecting that we are not generating an entry library file, and in that case it removes the "pub mod" declaration for the externs since side files do not have the ability to import externs themselves. Since the Rust compiler is internal, we don't advertise this change yet. ### How has this been tested? The test `translate_additional/more_dafny.dfy` was updated to include externs. The test was not working without this PR, reproducing faithfully the issue. By submitting this pull request, I confirm that my contribution is made under the terms of the [MIT license](https://github.com/dafny-lang/dafny/blob/master/LICENSE.txt). --- Source/DafnyCore/Backends/Rust/Dafny-compiler-rust.dfy | 6 ++++-- Source/DafnyCore/GeneratedFromDafny/DCOMP.cs | 8 +++++--- .../LitTest/comp/rust/translate-additional/more_dafny.dfy | 8 ++++++-- .../comp/rust/translate-additional/more_dafny_extern.rs | 5 +++++ .../project_depending_on_dafny/.gitignore | 1 + .../src/project_depending_on_dafny.rs | 1 + 6 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/more_dafny_extern.rs diff --git a/Source/DafnyCore/Backends/Rust/Dafny-compiler-rust.dfy b/Source/DafnyCore/Backends/Rust/Dafny-compiler-rust.dfy index b77139a0f79..1fc4232fece 100644 --- a/Source/DafnyCore/Backends/Rust/Dafny-compiler-rust.dfy +++ b/Source/DafnyCore/Backends/Rust/Dafny-compiler-rust.dfy @@ -3744,8 +3744,10 @@ module {:extern "DCOMP"} DafnyToRustCompiler { } else { error := Some("Unrecognized external file " + externalFile + ". External file must be *.rs files"); } - var externMod := R.ExternMod(externalMod); - s := s + externMod.ToString("") + "\n"; + if rootType.RootCrate? { + var externMod := R.ExternMod(externalMod); + s := s + externMod.ToString("") + "\n"; + } externUseDecls := externUseDecls + [ R.UseDecl(R.Use(R.PUB, R.crate.MSel(externalMod).MSel("*"))) ]; diff --git a/Source/DafnyCore/GeneratedFromDafny/DCOMP.cs b/Source/DafnyCore/GeneratedFromDafny/DCOMP.cs index 9158c6ca83b..4482140deb5 100644 --- a/Source/DafnyCore/GeneratedFromDafny/DCOMP.cs +++ b/Source/DafnyCore/GeneratedFromDafny/DCOMP.cs @@ -6679,9 +6679,11 @@ public RAST._IExpr Error(Dafny.ISequence message, RAST._IExpr defaul } else { (this).error = Std.Wrappers.Option>.create_Some(Dafny.Sequence.Concat(Dafny.Sequence.Concat(Dafny.Sequence.UnicodeFromString("Unrecognized external file "), _2_externalFile), Dafny.Sequence.UnicodeFromString(". External file must be *.rs files"))); } - RAST._IMod _4_externMod; - _4_externMod = RAST.Mod.create_ExternMod(_3_externalMod); - s = Dafny.Sequence.Concat(Dafny.Sequence.Concat(s, (_4_externMod)._ToString(Dafny.Sequence.UnicodeFromString(""))), Dafny.Sequence.UnicodeFromString("\n")); + if (((this).rootType).is_RootCrate) { + RAST._IMod _4_externMod; + _4_externMod = RAST.Mod.create_ExternMod(_3_externalMod); + s = Dafny.Sequence.Concat(Dafny.Sequence.Concat(s, (_4_externMod)._ToString(Dafny.Sequence.UnicodeFromString(""))), Dafny.Sequence.UnicodeFromString("\n")); + } _0_externUseDecls = Dafny.Sequence.Concat(_0_externUseDecls, Dafny.Sequence.FromElements(RAST.ModDecl.create_UseDecl(RAST.Use.create(RAST.Visibility.create_PUB(), ((RAST.__default.crate).MSel(_3_externalMod)).MSel(Dafny.Sequence.UnicodeFromString("*")))))); } if (!(_0_externUseDecls).Equals(Dafny.Sequence.FromElements())) { diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/more_dafny.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/more_dafny.dfy index e4facc514b9..c55fc26cb3f 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/more_dafny.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/more_dafny.dfy @@ -1,12 +1,16 @@ -// RUN: %baredafny translate rs --rust-module-name additional_module "%s" +// RUN: %baredafny translate rs --rust-module-name additional_module "%S/more_dafny_extern.rs" "%s" // RUN: %exits-with -any %rm -f "%S/project_depending_on_dafny/src/additional_module.rs" +// RUN: %exits-with -any %rm -f "%S/project_depending_on_dafny/src/more_dafny_extern.rs" // RUN: %mv "%S/more_dafny-rust/src/more_dafny.rs" "%S/project_depending_on_dafny/src/additional_module.rs" +// RUN: %mv "%S/more_dafny-rust/src/more_dafny_extern.rs" "%S/project_depending_on_dafny/src/more_dafny_extern.rs" // RUN: "%S/project_depending_on_dafny/cargo" run > "%t" // RUN: %diff "%s.expect" "%t" module SubModule { + function {:axiom} {:extern "extern_dafny", "eight"} Eight(): (r: bv16) ensures r == 8 + function reverse(input: bv16): bv16 { - ((input & 0xFF) << 8) | ((input & 0xFF00) >> 8) + ((input & 0xFF) << Eight()) | ((input & 0xFF00) >> Eight()) } } diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/more_dafny_extern.rs b/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/more_dafny_extern.rs new file mode 100644 index 00000000000..59348bf4c2a --- /dev/null +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/more_dafny_extern.rs @@ -0,0 +1,5 @@ +pub mod extern_dafny { + pub fn eight() -> u16 { + 8 + } +} \ No newline at end of file diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/project_depending_on_dafny/.gitignore b/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/project_depending_on_dafny/.gitignore index bc950be1152..d149df7bd20 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/project_depending_on_dafny/.gitignore +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/project_depending_on_dafny/.gitignore @@ -1,2 +1,3 @@ src/additional_module.rs +src/more_dafny_extern.rs target/ \ No newline at end of file diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/project_depending_on_dafny/src/project_depending_on_dafny.rs b/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/project_depending_on_dafny/src/project_depending_on_dafny.rs index 3dc44c6beae..ddcab2f93c8 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/project_depending_on_dafny/src/project_depending_on_dafny.rs +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/rust/translate-additional/project_depending_on_dafny/src/project_depending_on_dafny.rs @@ -1,4 +1,5 @@ pub mod additional_module; +pub mod more_dafny_extern; fn main() { let x = additional_module::_module::_default::reverse(10); From d356eba7890bc4d15eb132268a601d27b2c369a1 Mon Sep 17 00:00:00 2001 From: Mikael Mayer Date: Wed, 30 Oct 2024 09:22:16 -0500 Subject: [PATCH 08/15] Release Dafny 4.9.0 --- RELEASE_NOTES.md | 22 ++++++++++++++++++++++ Source/Directory.Build.props | 2 +- docs/dev/news/5761.feat | 1 - docs/dev/news/5779.feat | 1 - docs/dev/news/5808.fix | 1 - docs/dev/news/5812.feat | 1 - docs/dev/news/5823.fix | 1 - docs/dev/news/5827.fix | 1 - docs/dev/news/5841.fix | 1 - docs/dev/news/at-attributes.feat | 1 - 10 files changed, 23 insertions(+), 9 deletions(-) delete mode 100644 docs/dev/news/5761.feat delete mode 100644 docs/dev/news/5779.feat delete mode 100644 docs/dev/news/5808.fix delete mode 100644 docs/dev/news/5812.feat delete mode 100644 docs/dev/news/5823.fix delete mode 100644 docs/dev/news/5827.fix delete mode 100644 docs/dev/news/5841.fix delete mode 100644 docs/dev/news/at-attributes.feat diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index c70aab6cb2a..7cc9aad3837 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -2,6 +2,28 @@ See [docs/dev/news/](docs/dev/news/). +# 4.9.0 + +## New features + +- Added opaque blocks to the language. Opaque blocks enable improving verification performance. See the documentation for more details. (https://github.com/dafny-lang/dafny/pull/5761) + +- By blocks ("... by { ... }") are now available for assert statements, call statements, and the three types of assignments (:=, :-, :|). Also, by blocks should now be more intuitive since they enable proving any assertions on the left-hand side of the 'by', not just the 'outermost' one. For example, previously `assert 3 / x == 1 by { assume x == 3; }` could still give a possible division by zero error, but now it won't. (https://github.com/dafny-lang/dafny/pull/5779) + +- Use --suggest-proof-refactoring to be alerted of function definitions, which have no contribution to a method's proof, and facts, which are only used once in a proof. (https://github.com/dafny-lang/dafny/pull/5812) + +- Support for [top-level @-attributes](https://dafny.org/latest/DafnyRef/DafnyRef#sec-at-attributes) (https://github.com/dafny-lang/dafny/pull/5825) + +## Bug fixes + +- Enable abstract imports to work well with match expression that occur in specifications (https://github.com/dafny-lang/dafny/pull/5808) + +- Fix a bug that prevented using reveal statement expressions in the body of a constant. (https://github.com/dafny-lang/dafny/pull/5823) + +- Improve performance of `dafny verify` for large applications, by removing memory leaks (https://github.com/dafny-lang/dafny/pull/5827) + +- Green gutter icons cover constants without RHS (https://github.com/dafny-lang/dafny/pull/5841) + # 4.8.1 ## New features diff --git a/Source/Directory.Build.props b/Source/Directory.Build.props index 46783273314..a63a82c5d23 100644 --- a/Source/Directory.Build.props +++ b/Source/Directory.Build.props @@ -1,7 +1,7 @@ - 4.8.1 + 4.9.0 1701;1702;VSTHRD200 diff --git a/docs/dev/news/5761.feat b/docs/dev/news/5761.feat deleted file mode 100644 index 1d01f56a6e0..00000000000 --- a/docs/dev/news/5761.feat +++ /dev/null @@ -1 +0,0 @@ -Added opaque blocks to the language. Opaque blocks enable improving verification performance. See the documentation for more details. \ No newline at end of file diff --git a/docs/dev/news/5779.feat b/docs/dev/news/5779.feat deleted file mode 100644 index ba2d7b37f35..00000000000 --- a/docs/dev/news/5779.feat +++ /dev/null @@ -1 +0,0 @@ -By blocks ("... by { ... }") are now available for assert statements, call statements, and the three types of assignments (:=, :-, :|). Also, by blocks should now be more intuitive since they enable proving any assertions on the left-hand side of the 'by', not just the 'outermost' one. For example, previously `assert 3 / x == 1 by { assume x == 3; }` could still give a possible division by zero error, but now it won't. \ No newline at end of file diff --git a/docs/dev/news/5808.fix b/docs/dev/news/5808.fix deleted file mode 100644 index b226adea13d..00000000000 --- a/docs/dev/news/5808.fix +++ /dev/null @@ -1 +0,0 @@ -Enable abstract imports to work well with match expression that occur in specifications \ No newline at end of file diff --git a/docs/dev/news/5812.feat b/docs/dev/news/5812.feat deleted file mode 100644 index a1a0d51160e..00000000000 --- a/docs/dev/news/5812.feat +++ /dev/null @@ -1 +0,0 @@ -Use --suggest-proof-refactoring to be alerted of function definitions, which have no contribution to a method's proof, and facts, which are only used once in a proof. \ No newline at end of file diff --git a/docs/dev/news/5823.fix b/docs/dev/news/5823.fix deleted file mode 100644 index 86cf98f5763..00000000000 --- a/docs/dev/news/5823.fix +++ /dev/null @@ -1 +0,0 @@ -Fix a bug that prevented using reveal statement expressions in the body of a constant. \ No newline at end of file diff --git a/docs/dev/news/5827.fix b/docs/dev/news/5827.fix deleted file mode 100644 index a86341ede80..00000000000 --- a/docs/dev/news/5827.fix +++ /dev/null @@ -1 +0,0 @@ -Improve performance of `dafny verify` for large applications, by removing memory leaks \ No newline at end of file diff --git a/docs/dev/news/5841.fix b/docs/dev/news/5841.fix deleted file mode 100644 index df5fa34687a..00000000000 --- a/docs/dev/news/5841.fix +++ /dev/null @@ -1 +0,0 @@ -Green gutter icons cover constants without RHS diff --git a/docs/dev/news/at-attributes.feat b/docs/dev/news/at-attributes.feat deleted file mode 100644 index a3baa4e8b82..00000000000 --- a/docs/dev/news/at-attributes.feat +++ /dev/null @@ -1 +0,0 @@ -Support for [top-level @-attributes](https://dafny.org/latest/DafnyRef/DafnyRef#sec-at-attributes) \ No newline at end of file From 968fa807f0b78d79f09afa9644700638232d42db Mon Sep 17 00:00:00 2001 From: Mikael Mayer Date: Wed, 30 Oct 2024 15:59:24 -0500 Subject: [PATCH 09/15] All necessary updates --- .../DafnyRuntimeJava/build.gradle | 2 +- .../binaries/DafnyStandardLibraries-cs.doo | Bin 1540 -> 1546 bytes .../binaries/DafnyStandardLibraries-go.doo | Bin 1561 -> 1568 bytes .../binaries/DafnyStandardLibraries-java.doo | Bin 1531 -> 1537 bytes .../binaries/DafnyStandardLibraries-js.doo | Bin 2049 -> 2056 bytes .../DafnyStandardLibraries-notarget.doo | Bin 1520 -> 1524 bytes .../binaries/DafnyStandardLibraries-py.doo | Bin 1527 -> 1533 bytes .../binaries/DafnyStandardLibraries.doo | Bin 57234 -> 56977 bytes .../src/Std/Arithmetic/DivMod.dfy | 2 +- .../InvalidFormat.dfy.expect | 2 +- .../LitTest/gomodule/multimodule/test-go.dtr | 2 +- .../LitTest/gomodule/multimodule/test.doo | Bin 663 -> 686 bytes .../multimodule/PythonModule1-py.dtr | 2 +- .../multimodule/PythonModule1.doo | Bin 663 -> 686 bytes .../nestedmodule/SomeNestedModule.doo | Bin 667 -> 690 bytes .../SomeNestedModule/SomeNestedModule-py.dtr | 2 +- 16 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Source/DafnyRuntime/DafnyRuntimeJava/build.gradle b/Source/DafnyRuntime/DafnyRuntimeJava/build.gradle index 8660036a9b4..7a7f73a6973 100644 --- a/Source/DafnyRuntime/DafnyRuntimeJava/build.gradle +++ b/Source/DafnyRuntime/DafnyRuntimeJava/build.gradle @@ -17,7 +17,7 @@ dependencies { } group = 'org.dafny' -version = '4.6.0' +version = "4.9.0' sourceCompatibility = '1.8' java { diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-cs.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-cs.doo index 31247ec268bad4f811798cb852824e6e1ab9e68e..9dc2f8a53600c36519f6d578a8d4bd48967e3522 100644 GIT binary patch literal 1546 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 diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-go.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-go.doo index d87a74d7883a26c828817294f977097c4f3c307c..54518e2c2a6f8b848559efd2337108bdf6f16ecc 100644 GIT binary patch literal 1568 zcmZ{kdpOez7{`BRb4#_08FAdA*lOC4(N2XZEqCR1gq#(MnHH1T=z>Cvr3f2^Q7E@1 z9OEFevL_w7y5yRnyUQ9ndY{CKF zJ)R^70BCstSi8Cn4~hsqNmuTZx>Ed`j-Z!)Lm`Ycc zK_P8k#?Pl;w~8lnliJvLud`n!<=oLIMK83E6HMP^uqC0UAQ{W(9Im^u&2Vy!mt4RQ z`|$2;dQ)5LxgPbxdRoBme*K6+NLN+L-i?o~5uAzq(I~9}n2nNzai*lS@~+664{z|# z>X(AOK3_cQ`6LmYo>##eu)#zE%Gf8j6Nr_)h~=o7%N1$35p~L3_?|UJNBRu9|-X|6(hBCd{HXbwEAVwsE|sI4~sIsIiSTvjTGcA+W$l zH{Z3dhNTJx0L9h7BBLnBqJqLZyoM;RwnLc<0n}*@m@b*$9wJDNCRw*R?J)HDs?pVJ zq`&0?+EKZO`0f3U%tKB-!aVg?AdQTNjk0DLy@?YbRG2%raDJF=(7lP{_<)1Ae|{b( zR&j7y?}nzjtZ~dCi$&$bw*El^2e~`Ur=*32J0%5s933pt%7Y&RVs)SH(YEPr!IFueS%7f$9uXEr_T7j zsrka_cF8ihHXQyoP6^(3qV7Xy9*b=#jmw1|a!zqS0&hr@$wL?5T8mjeRjThEXl_9s zUCSy#l{X%w5Fh9k<4q1E8Va>6Sjqjb<&gS}Eo!4ut1EYKqsW)gV1ea~DXk{eu4`kl z_@(wt=-eM}#Ndy9&G`dNa>qb_hl6Ee^D@SW51~axMJ9>6Hp~~Ta65BRMMRa-(R9D% z9DcuZjltpM?S+1T_J+$5M(HIsf=A}M!;p#Wmd!9EL`7-R^C5Fw+^`arp&BVERS-#{-?r9$$F7Zqpb!gBF7VsUM@fN!gU9wo3OJ& zA+b(>yqX{%$|%q09I-b!WNkk^V|afmdFOFG?%7Huf1X)3U{RpLEVvC@dX9CCITL-Q zjC>lzIPIa(DbWjsz5bxe!cCq`KqNk?cvy>LxP(OWrh)O5sn-o`Ss|)-)Z0qd_azgw zWf%73tVS_vQv$KMIGQqz8M;mut-ptQraRaq6mDv!@Q~f4RvUxMgZEigYvSgv`+w>O hQvYoInG*l{s#anD4>Mdz5QXmt&}v7n&g+ox>Tl1TzD)oC delta 1524 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 delta 1495 zcmZ9Mdo&XY0LC|C9(fhz{g_tdF|S>Pd38y#h7m(v$(7`_yz-i1y2>+hH6uimka>=1 zh}@Bo){qE!jA0pF*Q2ifxaZ!}_t$s6bH2ZR=lk%&yN4v~Z9%+}002M$@T|$f^>MUz zAR$NMI4;J{>Xtl}BSkW=+^{8i-0g8?r$kOO=h*qH$HIyz*2OZn(XgB&o(YfCjwbxQ zfkiwtl@|l548?AavbX_0jnHIm$!ra)vn+NCGb4J!5Qiwry1njK1!iS|%AIOOgPrOp zEK|y(`9Y{8#pSl={v2lq>3dwl)5K@rYdtM+1<}!+UEm^xvtes(e@0fT#tAF;sVHW^ zSx6-Dbml;O#IL-NO0FQWtgRd7t6;l?z2vqiF^SY5+FS8g!9$zl4ESm~fl#Vt2v5CP zh4BvSB*a+8w}&xR_Msq7aA{9qLu$pdC{w(jp=p*>7q<`vFGA141k#7m5fsWg9oMFZ zCr{KU(1hwx%8}%)i$WoS3R0*ZfmwFH5z%3zaN=>9z6(|BsFIir)zwh&CfHh@h+F2M zTuOcFm}49-ku|YRP4eJEV=anQ0Q9=c?tmSxrioYP-pp#B-=Y^M^JP6V|=L zICfFW*rGS(+88*vCamp}JPHL!nH>r6`&@_fmKwd4k;Z!m;= z=P$lF#=75n6Z&<_fjI(yK+8(!h#fpY^ImIig!^`n+B#;8ucaq;hN^D%;EQEq1DX~u zj#Kj=AQ&&~;RWW`tK%?k5IuZpi2j;b3DqC-a%j+|>l2pLMd_g~*lnGi@vJKX;nugJFh zt&rWLw@sgK4=z7fI}{>>-rv!fC-*kuHX1@xho0)Nb7oTbG%6CmMO!XBq8d$68BC}; z8*XS7!ZZwbN%SC(>{qr5^)k0)=RZOwhqbQN+hMH@2=9?5O(1ToK_z|Ibt7`QFvxL`r(5*OG(N$|8DUGB zl3^ToiWd@j${=BO2lNoXgST3JNS24IKapcbc^fshO+OKZPAM~|n_wD@nH9ZEu{sOy zph~PO8xJ>SeZ8RTa%#b-7uP**gJp}%iu zR$-uJaszm7qZwAZ5SFTP_j7eWMMuB=js+S~CXLS5JgU!G{CJ6-Ay3$iLHmhrKDHeB zzH;P@3LGucdCCWOx$}G_slnVsZU!N)>(Kn(0)hS>Y$6|pOtUVZreEv(oMjn0slHpR zI&__!TRzp-G<6#Oj>aOTR%tb%ZcMz5xQ}`QOlAxa+76<^SA1qqrV9o!k n9RI@w`2+|2=65q(2NoU@bmQml&rk4Qw=Q>vPZk`(_apfS^%28$ diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-js.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-js.doo index 15dcd2b943d28b5a6a9453a9af2c397820e872cb..2ac23699051cb7c4d6bbb517a1e15e97fc3217cc 100644 GIT binary patch delta 2024 zcmZ9NX*kr20>=NwVCdx7vWu}VC(Fn#YnJGYL7Axx6GGV<#+K!8kX@p1#9%PCP{xSK zQjT3xR3r^rNVY7^*tzH4=ehT}Pw%Jq%lql~JnxUlm%=BAvS)`10RR94UPZZGs*KR^ zOUf3M16jps5H9t74kf0dDothjGRY zV}b|4O?T@vv_1<5F$2zbLJ6^uon&SmQVBNak^RF8WBNk+bcxevOMX!@WzoZPrZ5z| z#_7;(BhktIctqw&6{AqdP0&!iD22agGB1=``Zc_TVI|UV6YF3siMZMHMSfUJ67T!a zTl(qfMPJDkov{7-t`%bO3atRSl-HBWvDS<++N$&8n9_hQejQT_ij1OGl_4fiMJ(UY zp`|l~BQ4tInkYEmFom{maQP5|vIqYkN+~VlppF9o<|F}t>mO7%gM)m6uLks9vJaWk zbYpqcb2 zHoiaTWb}IENA3x)+eAw^ZkUm9r^PwEPV9*W1mr`rxj>L%WYTR!`}**^jS@ajohf@r zObk4)!fQ~bzab@}UC}Xhhc7rLS?hIzp5&XG$?6`fA9uF@PW3+KXCm$JI&(WTzVc1Y zN8pO>fPN+xS^Wg>XC#pYHS#)REYO!NqNqz1ehg+z7nK@W?62FdqL=u4)n0|_TkGBV zQD4{S>MRWMK@Kp7bmu6@u=L=NS0J&ZK!-EdxDswTE?ykaqgiqa*@rCz!$p@{#&s|I zs(K`$pWJD^#D>el55~&QC`0uaun_}ZyS+2(76It#rSWx}VTIe=ko*}!+EG$&tM~m6 z3n4vc1X#rA+w3_wN|}Aw_k)Dcu!c;F>f{anoVq_LmiNv{rj5gQj9h({7_?Yt!&E1W zIxv!qo8Q*ufeJqkM%2^x$pFccIGl&^N=}( z&x@K=#KgH%CJfMxt&DdQLJl!HFL43}4q6Qgrf0K^PC`}sk&R7G14lzL$hV$>uAmEN z=5VFJg1_5Yn3UATYfjG#?pFp*#JGmiKn2)VqG4y&_`nm#U7oIcA}-Hgep3}epi-NQ zzskB#%=B@1tUEJZ=!Ucz6S3*4_kKuGsg}exq@!&6x~LC~`gao8lP0`cUjAE@Q-i0F zlBm=9ZW1Nq!XMh_H~Slj7q^<{3Kp&!-Lfs>5wJ@~qSDEE;9Fp4B+ff5CQ<~Z^L**Z^CH&7 zi^d8&49BO^Y01*B!$|JJxly162&K#C`wb0JHSCV#Ol=lU%%ZBy^oZn9&06C?yyUI& zwhHNY^M}pZp<6phZc!Ik;+6vYehyrKE2R@6E?<2(1ltJh)u^c4m6fgr`5RP{n)c)bXFfG#k3B+1(%eviBJJE` zoG_MJV=T;kkiwgqo7%g!b^(cc6|usfWS&I0A2reO^veem0UGIbC3U>54z@UjeOEZt zvldVO{-!8omcUp9>sczTFHap*%9Vo~H49b}X|t7jdIEdLHLSb)$i4nGN4QaIEw;2> zW5>I$dW9$7GFvWv!(shc&IwkJOiQ^MSfTV!9Z7)P!jt)DLCGJ+)5PK7%(xGcb)dPL z$smZ6o)n9&H9d+hW`$Qd#h;j&fBE7wY@&0Pwa3cWT4k4>ZV?(dJK>cv zM3WQx4#FzdQs`%z%aWMd{hMR}Q&2#_xc8|`N_fwiRR~Akaz11~2x2ActZwuGyVhq_ zauSMgna5biNj{ApP?hm@>pFYUwP%^BE%DR~>F+D%(d&xZ5EyHBM+9Zh1`z^&Q7#(* ysImjV@qga^KQaGr0RpZDUiZEhLQp3J1^EBE{nZTrTLF#tK5>b2#{XLvz`p?d6tPtR literal 2049 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 b`1@JH<$q>>eSrVi`t%PR5}as`f17^*h627| literal 1520 zcmZ{kYd8}M7{})}b64)NC{c4+XoX`D*_kr;%bLRD6pq5&%{@%65z1l5IBCr#=3aAI zrn3s25Xoh^Y#oKw>CDC?>C>1JKq4-?Is&%n@CIhpG zkC+^uSuFS@A55%AmMEn>X`{ z1$*(y@NL|faRQu}le+9(1!U(4ken%!fzAzMmUt3QSim;vFsHT6m+R`Fn75Yl=w|I6 z#lyT1hog4_iC~N1rPi*9>f^EEYA=r-z71oePz1y5S8?Iz1&>s$i4e+KpFyvJtyv*1 zZVNK+QQ8E1gm4us=yB{Bp&B~hF{&k&zrpOG$rrZf5fi1WjG>7#W?`%dYX`Kd@X>>q zE!{JuW0q7GJ0A%nI!;4DS^bXT_4Ui$tpRFo(K=hTi1G~^QLG49!IlAk4gkt&1)4%Zfa->YtTgzG7>B(<(n{(8QNVq09u=b5=k zgC3~vkgmuN&1s+8=q^d>x#rI8FCXeRU37h=&Y|GFFX_Q$Y4FZd?;@+CeY<_a( zODNTF&sAD5Fo%q@9r;Wvd*N_wK1pc?PdnJk@d*0?(q57nPP zFbLx5e5hYw(nR@gPCtl)JDWl{HEG*Z@3vf`Oy|nQiXhyG^|OL0(e)mmoq7}W5xWym ze6viMy<#eK<^zC1qszzpp|ya#L2(LojFI((^LF9~cI@7cXL*BE zLti5zB8m=%;~voq(VjhwZ{eT94UT+d&|qB!Isfbn^3z zKwC<-*j@32*%7x#iP6C--fmWA{Id;Vgg=HhDE_V`ww^qY;k#Y;O$?h&>A&T7&ZO>& za&mzij{yxGqRWJHog+}RAtT5WTqOA2#|Xe4-#Y+U+*~q4Pc7;lP3QOD4yk=Q--wWZY}apAA&}Qk{sC zY}E{N@~z{$eh$22fmGkxXfhuc85<6~{yW6Dp# zgspjB%PPGK&EcpcAbC~u^&Qrj|_QrKFvNk@95=jkeIh~v!s z912_66bMb_XSCi{uZS#!QPsWUsmA%S-T(Ke~Og& oO}-=VkFP(*{@+IcfRtFb5AXjVU~er1{C42q@1T9XF7$2s8;cIVvH$=8 diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-py.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-py.doo index f44d53da924afb4d68d8eb9585a91bb74f8c4b0a..f80f17ce85158650576aa5d4529a6d0a72445d09 100644 GIT binary patch literal 1533 zcmZ{kc{CIV9LHydaZb5Mu2rUTOvsodCRfYk2ye0(9dhJ|nJ_b=P@)vkxY;l{b_~fe z#_+ykT+%oe~2Q)Y=8Bioe{I^!lh0 zus$rj_<2pg&Vy|fkR?Y(xj)AACP-55=c&ou+uBBCK2wf57v8~wZEtPP)F3V=GQC7P zQdDwC>pQfp;OA$;P?V@)aJnFIM18y|oRR%lE3}9sH7?Us+;)X`#7nGE-ur$fq zYbk?U{EjOzo(}yFG~zOgUyPZ;{Q<&S{YBxZk^!kN1V(&utj;9VZw+tLz)!jd+Iqb9 z%2riq#w}sV9Ba%{M!vvIo|8C~L*=@;PhQH zc)1d5xbeyt%+}`TP7lES?u3-nauLIt!3#d8DxQu(@0iuiFsLrxw~y5|-(T1R*?$)p zebKr*XFseiF#tetKQMoSpBKRu-|Fb<_YNh#H-0@J)S4>EVHfp5fg`~*gbDkQazfgu zUXi6DPL-?nWhpc3M!*P(XJSHqSr``dmPlU0%?<1JRc}_tPg<1Ykn)x%Fi=>Xl>{Oo zd6ig_v|QXVg|X^B^$HCGP-M(}#KE)aO|qRaAZl*3zK0bvL_)h${7)hgo*Wfp$?1Z) zOEOc$3!}|uRU9v;(xH+ObR|&J)f7n?)XlR#Y{**idE7$C#pnsE@oKy(HdpQRt@BQP z3Cq6E>giB#@i`*ppvsqn@hpOFZQ6V#RE|9H{5 zyP9QG3aZzvaFri`bbGdCt2P_HXQuB4suRJc#s!vP^~0AKQT~yk8i5?zR12}?jAmtF z+r>*ZvP_&FrHQ&V40k9y{PZtZpEbNPj0IXsE@CC_p|kDnWQk;>k7nh_N5^)vwcj#p z%%p)OH3K3VD>#yqZ8n#+X?*da!U-5wzmMt@(#3~^sHbfK&!?Txq^G%fpt;i8Vm9<# zX?T*`;=@!{b?x~+&IcZ@Jx*fuy6{zm8-&^xOEe5=+QZ=VXd%}E8{hmZ zP3)}lN+cqJ{AgBX!}@qLG2st*oza0zNb#+(e6RFq5#Mb5^XB<&zzlIu>005G5J7L0 zJUx^tIIjkEVt)GcoGNm9J$#dd1`_Aey$?!)>+|yP+`xzMIK;$)-_l7)1~jOyns^nB zYc;RBQzF#_hwrU4Hat342INrHqEmKY8>^(?SKt+mS^VU0*Y{tg>584fj4vn%Zv1-JBIA9AVH_75(_I4wzpHk5d-?Nj zKD%qg#}SPY(P+HeSrSVVc9rL_S6^=X83B<{8aH1Q5x!%NnZj~J>3nQ{Uc`3rf?4ej zo;Eq26@)F@xiD1ZCHT2CS;=L21IhF0m1)fjXJpC!@D-sQZGEkru_+qGEGL(G%D!q$`r zVTX2-gMZ$RjFms$c+Bi1uY6*K!0v%0B3Ehuh vdut#_8u0(%-GAl()OQ&E(fT6-{`JxKN&XKI?5)89-wvSt_TQgD;BV@0Qv|`> delta 1473 zcmZ9MYd8}M0ERbXHal8O?n6W>A(m29?qTkXI-v`Pav77MsWFP9W-=r;4P!1PBxw|i zmRp>J8YP!vGux1L;&dG6$9Yaq-_P&){=LupeTRL8Av|3{(nx3X3KRGrdC|FdEr8hX0sAYH?-&72`Qf|2I%C}{l z)tw`naG>rW;ma^@<@}kZ9cd;?IeQ#zd4fk{Lawlo=*{xw>jF)Qe%GKJG`x|vZHpIfj#Ewod9cddYWWU7U-I@H04o6pujN+lu zMF+C`F2~zRZ?9T`7L~D|8J|PC&g1+}&LJkydx|_AWNT0{&B+!r_d0+(TI{h>jYlgE zukj4FA67fpHS(csyf7I${}*IgWg&>3y|s75=qRZ^`Evq_?mcY`xiRD&-_RiHA+pU< zS=@WbcDZ_Y9XxB*O%4l1s)Eg2g9%79Q9T8yq z^!Rn@p#i3-h@MM-QYN%Fkr01i(y-{-PXhq}y>I|Pc9T>L4jYC$6V>hSLCS?NUK^cL?A$-c>kz)6IqPQy!~#2qjDb4TtH+@C)yXav zcJUlU#JZR7$ICXYjRRn3W;VI^l8vk#)(}6c&IqE3j20c%5ISRhBOhGRuu9A)!P-TW7CqP&1Km+ zZXQV~WJY!<8}wS=877bp;O6h{>OLMEe>t4jR{i1X=B&F)zRf`UYO58q@$o_@;0eP*H4=d7MnEQm+<(;$1X zfgXdVGy0fg3(=CfRp_ljp2x-NY`xRWcI}5}t>Fb;{SRn-mPW42sdvEGHHN%d82U|` zy=~Yj#~PYlyVUXp}*PD=YeqBR(Q!GuCyjb6$mXgn{U+?7NTNV4#bF12H~+e~U&$f@fp zE_DfDQBL`9vyyAkqVU!Xfy`Y|sMfAIOz2?V-me3o%Waxh4u?1vGuKD6no2Burf1J? z2tq{je6+Ur9WA9^P^Wph@~r)P-X#pFaa>{;Q4=VHbvpR61YBacI-(LNsCU-m8C5EHCxtiS0glFn#+FSs?1XN@^O zpuiqr-w)k?qwjWcAu1%YsdM2a@DHuF`4tUMSD=&<=%;rD0sy-=ZI<6O`M)qzsiiW? W20tu+cK-imJ@vheIyhG5-{v0zO0xg} diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries.doo index 44716b7ba7425da6a1a7b6dd5bdc2f176467038f..baf810cbb0430590a1d491e3a88c93c6e233d571 100644 GIT binary patch literal 56977 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 K01Ms#0000`1lY6y literal 57234 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­TmKL_^Dq5U(pf1cVu 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 delta 565 zcmdnQI-9jVz?+#xgn@y9gF(OBAhPpnXk8v71H)G)1_oZBXl`O&W?E`-iC#&5Zcc8H zW1h4j&z|?%O?ywTm@QLuQokxIP@>1>t>}^x=ieR&y1nENlYxSz0aVdR&p& ze7EzVIR^#XpUIyqUA+2&$xZP!Kir#dueZ4sJ1M4L>cn-W=W(&8ujfY|*VNzS6Q<=K zyDrQ*e0TODNzwhCtj?Qvt-bL7XDuU2+)UofSW?f7JF0-O1qMqRK@>{F1$Z+ui6Cj+ vpZGB$9H=NCh}l7^p6y>KECFTZrv$BE2nSihWNQ(lK1P}oL7}?n^ diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/pythonmodule/nestedmodule/SomeNestedModule/SomeNestedModule-py.dtr b/Source/IntegrationTests/TestFiles/LitTests/LitTest/pythonmodule/nestedmodule/SomeNestedModule/SomeNestedModule-py.dtr index cfd91307ee9..8553f51be68 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/pythonmodule/nestedmodule/SomeNestedModule/SomeNestedModule-py.dtr +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/pythonmodule/nestedmodule/SomeNestedModule/SomeNestedModule-py.dtr @@ -1,4 +1,4 @@ file_format_version = "1.0" -dafny_version = "4.8.1.0" +dafny_version = "4.9.0.0" [options_by_module."Some.Nested.Module"] python-module-name = "SomeNestedModule" From 6cb8c0c73fdde783a75b9fd17962298508e85f2f Mon Sep 17 00:00:00 2001 From: Mikael Mayer Date: Wed, 30 Oct 2024 16:35:13 -0500 Subject: [PATCH 10/15] Fixed a release issue --- Source/DafnyRuntime/DafnyRuntimeJava/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/DafnyRuntime/DafnyRuntimeJava/build.gradle b/Source/DafnyRuntime/DafnyRuntimeJava/build.gradle index 7a7f73a6973..acc008e9f26 100644 --- a/Source/DafnyRuntime/DafnyRuntimeJava/build.gradle +++ b/Source/DafnyRuntime/DafnyRuntimeJava/build.gradle @@ -17,7 +17,7 @@ dependencies { } group = 'org.dafny' -version = "4.9.0' +version = '4.9.0' sourceCompatibility = '1.8' java { From 7e637e6d3bb980a4deb554bb68c594b6e2086a2b Mon Sep 17 00:00:00 2001 From: Rustan Leino Date: Wed, 30 Oct 2024 14:42:43 -0700 Subject: [PATCH 11/15] =?UTF-8?q?fix:=20Don=E2=80=99t=20prematurely=20assu?= =?UTF-8?q?me=20properties=20of=20=E2=80=9Cthis=E2=80=9D=20in=20constructo?= =?UTF-8?q?rs=20(#5876)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR fixes a soundness issue where, previously, type properties of `this` were assumed already in the first phase of `constructor`s. Now they are assumed at the time of the `new;`. Fixes #5136 ### Description The details of the fix are as described in issue #5136. By submitting this pull request, I confirm that my contribution is made under the terms of the [MIT license](https://github.com/dafny-lang/dafny/blob/master/LICENSE.txt). --- .../Verifier/BoogieGenerator.Methods.cs | 12 ++- Source/DafnyCore/Verifier/BoogieGenerator.cs | 7 +- .../Statements/BoogieGenerator.TrStatement.cs | 17 ++-- .../LitTest/git-issues/git-issue-5136.dfy | 98 +++++++++++++++++++ .../git-issues/git-issue-5136.dfy.expect | 8 ++ docs/dev/news/5876.fix | 1 + 6 files changed, 129 insertions(+), 14 deletions(-) create mode 100644 Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5136.dfy create mode 100644 Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5136.dfy.expect create mode 100644 docs/dev/news/5876.fix diff --git a/Source/DafnyCore/Verifier/BoogieGenerator.Methods.cs b/Source/DafnyCore/Verifier/BoogieGenerator.Methods.cs index faa4378422c..a79b9a0c131 100644 --- a/Source/DafnyCore/Verifier/BoogieGenerator.Methods.cs +++ b/Source/DafnyCore/Verifier/BoogieGenerator.Methods.cs @@ -650,7 +650,7 @@ private StmtList TrMethodContractWellformednessCheck(Method m, ExpressionTransla CheckWellformed(p, wfOptions, localVariables, builder, etran); } - if (!(m is TwoStateLemma)) { + if (m is not TwoStateLemma) { var modifies = m.Mod; var allowsAllocation = m.AllowsAllocation; @@ -665,8 +665,16 @@ private StmtList TrMethodContractWellformednessCheck(Method m, ExpressionTransla outH.Add(new Boogie.IdentifierExpr(b.tok, b)); } builder.Add(new Boogie.HavocCmd(m.tok, outH)); + if (m is Constructor) { + var receiverType = ModuleResolver.GetReceiverType(m.tok, m); + var receiver = new Bpl.IdentifierExpr(m.tok, "this", TrType(receiverType)); + var wh = BplAnd( + ReceiverNotNull(receiver), + GetWhereClause(m.tok, receiver, receiverType, etran, IsAllocType.ISALLOC)); + builder.Add(TrAssumeCmd(m.tok, wh)); + } } - // mark the end of the modifles/out-parameter havocking with a CaptureState; make its location be the first ensures clause, if any (and just + // mark the end of the modifies/out-parameter havocking with a CaptureState; make its location be the first ensures clause, if any (and just // omit the CaptureState if there's no ensures clause) if (m.Ens.Count != 0) { builder.AddCaptureState(m.Ens[0].E.tok, false, "post-state"); diff --git a/Source/DafnyCore/Verifier/BoogieGenerator.cs b/Source/DafnyCore/Verifier/BoogieGenerator.cs index d59cb22c937..134442cd3d5 100644 --- a/Source/DafnyCore/Verifier/BoogieGenerator.cs +++ b/Source/DafnyCore/Verifier/BoogieGenerator.cs @@ -2828,10 +2828,9 @@ private void GenerateMethodParametersChoose(IToken tok, IMethodCodeContext m, Me Bpl.Expr wh; var receiver = new Bpl.IdentifierExpr(tok, "this", TrType(receiverType)); - if (m is Constructor && kind == MethodTranslationKind.Implementation) { - wh = BplAnd( - ReceiverNotNull(receiver), - GetWhereClause(tok, receiver, receiverType, etran, IsAllocType.NEVERALLOC)); + if (m is Constructor && kind is MethodTranslationKind.Implementation or MethodTranslationKind.SpecWellformedness) { + // For constructors, the typical "where" condition is added in an assumption in the body, rather than in the parameter declaration itself + wh = null; } else { wh = BplAnd( ReceiverNotNull(receiver), diff --git a/Source/DafnyCore/Verifier/Statements/BoogieGenerator.TrStatement.cs b/Source/DafnyCore/Verifier/Statements/BoogieGenerator.TrStatement.cs index 926e680c905..28381c005a2 100644 --- a/Source/DafnyCore/Verifier/Statements/BoogieGenerator.TrStatement.cs +++ b/Source/DafnyCore/Verifier/Statements/BoogieGenerator.TrStatement.cs @@ -754,20 +754,21 @@ private void SelectAllocateObject(IToken tok, Bpl.IdentifierExpr nw, Type type, Contract.Requires(type != null); Contract.Requires(builder != null); Contract.Requires(etran != null); - var udt = type as UserDefinedType; - if (udt != null && udt.ResolvedClass is NonNullTypeDecl) { - var nnt = (NonNullTypeDecl)udt.ResolvedClass; + if (type is UserDefinedType { ResolvedClass: NonNullTypeDecl nnt }) { type = nnt.RhsWithArgument(type.TypeArgs); } + if (includeHavoc) { // havoc $nw; builder.Add(new Bpl.HavocCmd(tok, new List { nw })); - // assume $nw != null && $Is($nw, type); - var nwNotNull = Bpl.Expr.Neq(nw, Predef.Null); - // drop the $Is conjunct if the type is "object", because "new object" allocates an object of an arbitrary type - var rightType = type.IsObjectQ ? Bpl.Expr.True : MkIs(nw, type); - builder.Add(TrAssumeCmd(tok, BplAnd(nwNotNull, rightType))); } + + // assume $nw != null && $Is($nw, type); + var nwNotNull = Bpl.Expr.Neq(nw, Predef.Null); + // drop the $Is conjunct if the type is "object", because "new object" allocates an object of an arbitrary type + var rightType = type.IsObjectQ ? Bpl.Expr.True : MkIs(nw, type); + builder.Add(TrAssumeCmd(tok, BplAnd(nwNotNull, rightType))); + // assume !$Heap[$nw, alloc]; var notAlloc = Bpl.Expr.Not(etran.IsAlloced(tok, nw)); builder.Add(TrAssumeCmd(tok, notAlloc)); diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5136.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5136.dfy new file mode 100644 index 00000000000..490110a2dd9 --- /dev/null +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5136.dfy @@ -0,0 +1,98 @@ +// RUN: %exits-with 4 %verify --type-system-refresh --general-traits=datatype "%s" > "%t" +// RUN: %diff "%s.expect" "%t" + +type Empty = x: int | false witness * + +class TestEmpty { + const x: Empty + + constructor () + ensures false + { + x := 2; // error: RHS does not satisfy type constraint for Empty + new; + } + constructor BadPrecondition(u: int) + requires 10 / u == 2 // error: division by 0 + decreases * + { + for i := 0 to * { + } + new; + } + + constructor BadPostcondition(u: int) + // The following expression is fine, because the assumption generated between the well-formedness checks of the pre- and postconditions + // should allow the verifier to derive false. + ensures x as int is Empty && 10 / u == 2 + decreases * + { + for i := 0 to * { + } + new; + } + + constructor Star() { + x := *; + new; // error: x is subject to definite assignment, but a ":= *" does not count for a possibly empty type + } + +} + +// Repeat the class above, but with "var x" instead of "const x" +class TestEmptyWithVar { + var x: Empty + + constructor () + ensures false + { + x := 2; // error: RHS does not satisfy type constraint for Empty + new; + } + + constructor BadPrecondition(u: int) + requires 10 / u == 2 // error: division by 0 + decreases * + { + for i := 0 to * { + } + new; + } + + constructor BadPostcondition(u: int) + // The following expression is fine, because the assumption generated between the well-formedness checks of the pre- and postconditions + // should allow the verifier to derive false. + ensures x as int is Empty && 10 / u == 2 + decreases * + { + for i := 0 to * { + } + new; + } + + constructor Star() { + x := *; + new; // error: x is subject to definite assignment, but a ":= *" does not count for a possibly empty type + } +} + +method CallEm() + ensures false +{ + if + case true => + var tc := new TestEmpty(); + case true => + var tv := new TestEmptyWithVar(); + case true => + var tc := new TestEmpty.Star(); + assert tc.x as int is Empty; + case true => + var tv := new TestEmptyWithVar.Star(); + assert tv.x as int is Empty; +} + +method Main() { + CallEm(); + print 10 / 0, "\n"; +} diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5136.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5136.dfy.expect new file mode 100644 index 00000000000..070be655a9d --- /dev/null +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5136.dfy.expect @@ -0,0 +1,8 @@ +git-issue-5136.dfy(12,9): Error: value does not satisfy the subset constraints of 'Empty' +git-issue-5136.dfy(16,16): Error: possible division by zero +git-issue-5136.dfy(37,4): Error: field 'x', which is subject to definite-assignment rules, might be uninitialized at this point in the constructor body +git-issue-5136.dfy(49,9): Error: value does not satisfy the subset constraints of 'Empty' +git-issue-5136.dfy(54,16): Error: possible division by zero +git-issue-5136.dfy(75,4): Error: field 'x', which is subject to definite-assignment rules, might be uninitialized at this point in the constructor body + +Dafny program verifier finished with 8 verified, 6 errors diff --git a/docs/dev/news/5876.fix b/docs/dev/news/5876.fix new file mode 100644 index 00000000000..e8dfa94713f --- /dev/null +++ b/docs/dev/news/5876.fix @@ -0,0 +1 @@ +Fix soundness issue where the verifier had assumed properties of `this` already during the first phase of a constructor From d138037e1ad39d1f19e38ecd39de3a43934d0c04 Mon Sep 17 00:00:00 2001 From: Mikael Mayer Date: Wed, 30 Oct 2024 19:53:01 -0500 Subject: [PATCH 12/15] Two more updates to the runtime --- Source/DafnyPipeline/DafnyPipeline.csproj | 2 +- Source/DafnyRuntime/DafnyRuntime.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/DafnyPipeline/DafnyPipeline.csproj b/Source/DafnyPipeline/DafnyPipeline.csproj index 35baf4ddff4..6ac6e5227ce 100644 --- a/Source/DafnyPipeline/DafnyPipeline.csproj +++ b/Source/DafnyPipeline/DafnyPipeline.csproj @@ -90,7 +90,7 @@ DafnyRuntimeJava Always - + DafnyRuntime.jar DafnyRuntime.jar PreserveNewest diff --git a/Source/DafnyRuntime/DafnyRuntime.csproj b/Source/DafnyRuntime/DafnyRuntime.csproj index 336bad0466b..0533feacdce 100644 --- a/Source/DafnyRuntime/DafnyRuntime.csproj +++ b/Source/DafnyRuntime/DafnyRuntime.csproj @@ -46,7 +46,7 @@ - DafnyRuntimeJava/build/libs/DafnyRuntime-4.6.0.jar + DafnyRuntimeJava/build/libs/DafnyRuntime-4.9.0.jar From 25fa1000744d8d8a9a6a84c0712149daeda6f67e Mon Sep 17 00:00:00 2001 From: Mikael Mayer Date: Wed, 30 Oct 2024 20:24:20 -0500 Subject: [PATCH 13/15] Recomputed the binary files --- .../binaries/DafnyStandardLibraries-cs.doo | Bin 1546 -> 1547 bytes .../binaries/DafnyStandardLibraries-go.doo | Bin 1568 -> 1569 bytes .../binaries/DafnyStandardLibraries-java.doo | Bin 1537 -> 1538 bytes .../binaries/DafnyStandardLibraries-js.doo | Bin 2056 -> 2057 bytes .../DafnyStandardLibraries-notarget.doo | Bin 1524 -> 1525 bytes .../binaries/DafnyStandardLibraries-py.doo | Bin 1533 -> 1534 bytes .../binaries/DafnyStandardLibraries.doo | Bin 56977 -> 56978 bytes .../LitTest/gomodule/multimodule/test.doo | Bin 686 -> 686 bytes .../multimodule/PythonModule1.doo | Bin 686 -> 686 bytes .../nestedmodule/SomeNestedModule.doo | Bin 690 -> 690 bytes 10 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-cs.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-cs.doo index 9dc2f8a53600c36519f6d578a8d4bd48967e3522..d399d0336ca015f4eb0e20b1dd52d0a64a0a405e 100644 GIT binary patch delta 493 zcmV@6aWAK2mleHURe|bj{1iI001fj000dD003=aZfRy^b963r zZ*6RCQbBGTF$}!>6~W$R#BDD<^cOiLC=5oTc8N&TmXvC5Uth}WuI-@Lnc;vlWGLkr zDdF)qic;aHA5X(!|2*shL|*REZ~O22=gw$J1|KOPSBivx(%ILq8}Tr6__99?ySFk| zgY@SPQYt40XDV4u5g{pF!GN=%hc5iY;JKnOB^6*vXkls8U}?0000007Jk-V delta 492 zcmV@6aWAK2mrl%URkDiFKdPY001fj000dD003=aZfRy^b963r zZ*6RCQo*hhF$}!-E1veAiUJ2N`~@cvs{9gX*CKKD*$M6P^*Fm_+dgrf8IL?;hf>aw z5}tpfC>4JB`ZAo3ABIDK$jc-8`S|6yGFpU*C^jK$v*E!@-2k7NNLwUu0X> z6W#^Lv4}?_%{mj4=AGkm8{H8>2SANxn{{OdPqjxIz6r3-AhxI7n-pFXIxd`u5yaV+b+Vx3cemX|7p`z!Pdpql zaI@ni%o!YUXsc!)y3ti=9PKrB{H?+5fu8NOnNI6Kmc)q#@U>Vw_pECL+b;y_@6aWAK2mrl%v%Ue-0|~u* iURkDiFKdRAngucfy?c|+1snmflj{W<280Cw0001ogx@#- diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-go.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-go.doo index 54518e2c2a6f8b848559efd2337108bdf6f16ecc..3ffe9fd0fe60a1b935379a7a88071737f0278657 100644 GIT binary patch delta 515 zcmZ3$vyi7gz?+#xgn@y9gF$ssT%-s~->-H?1_mu=1_oZBXl`O&W?E`-iC#&5Zcc8H zW1h4j&z|3+2k)gG$WPH%u;Z?=I&5e*gRVxeQM>c}<1zu9o^sH?Oak{%BDAW0O74?(Ih5 z&0n7L1!<|Xr)x#}3My*G9c)Je2?YC#twJovsS{BpY=X2lD#Y7$nmPCY1xW(8%{?o7upp&_1aIC^v_*sAr~99 zdgrX2f7VgEfPqu*V*T!hJL@kA*Y1cs5q3B3S|~{f=-v$~kQn8SrWL z?PrU)!!6?dY~C0ZY<{eAMpC9QL;S2+$#{m;*1jqGFZsJTa-?nE s%lML+6CQb!*RvYQgLnyN7QZ_Jj7A;-1_pLuR3gBpNo-PVvspm`05kI0D*ylh delta 515 zcmZ3;vw){Qz?+#xgn@y9gW+0rT;#F}{p>bI1_mu=1_oZBXl`O&W?E`-iC#&5Zcc8{ z!F9rhJbS)t&-*s7i-}$D539Pssy{;M*Odyt-Q;}x>8r)=)Z2E2b0zz2lG}sMO%$3} zzgR=G?&mL~IeqeN&J8C{EC2fWnLNK2eOTr1L7P*L;VfriZs+VyIVKiIm+K;=1iIAi?%{y2vj6?+aJY&j>ka7Rge zO7u11d#oomcDO5_wGy8EZ0_SC>AQlC9ItAcmaSN~;dI1upv*)+y!F#Dka`kP$h+C>^@VG51>-4xXZAw;teEg}`>)tN7KJ#INaf-%M3C)Ke z&AWmgE|>Q|ocQ174UeUQ;2wtEK+Z&Fkx>KN=MO*ksSMd%ID1 z^Oxs*L0anU=~|J#f{L1P2OBmoXxIC5Ytd;QOXT6V$WbX<%a=fZ(TDD@{hSL$tg?7bGz4ntO{c~4Z$i+sj z-Z^XMpLNtOVBpldSiigB&iYHjwL2nDgdLM8>@EM8>$8ugq>kxl``0yo>Kso~Cg!_F z*q@d+nIH5hR#0N$(pO2z_h*-;viWaymyTnJNEf($`JFGR)Un;)y3k(4RS5I<{HvUK$Yi(A<_Ki0EdXRq3FInBy(ZMKlQ*n#Uw zZ|`i1(~7893{amQS9$vNWLuG`C-V*_hp%23`{vpS;aj@$x~$HdwQtJ)Oa3m79BG^P tGM-}Qgh$@w39Lr)ARcq0tH4rVG#=$=U|L7@MdNaVPIh3U^r177rCrLKf8^QfkBIzfq@q&nwyxHnU-2yqF0iio0A)K zaGkIr&z|qv^S;gNVq(|(!>TT@>W@(Rb)~{@H#y&a`f9N|^|oE%T*-c$_6bHj<#%D;a8c)G(VYSO`Ut`k$07M9e1`@MW_#VpHOn|W=A`;Eez zzdUCQ(h_G6*NXHNRMfn8pkecZcDTgI32NEXjkmiYd=}SKX;{tTx`_p zowIiST}SN#22Q<;tLqzV)?E_*TeNw?+8)D4V)M2+sGIdY<{eAMpC9QV|AMRu8W}=GH*@G{;WOtwsGFuEi?UIJ4`#$$@*by zg!T6|*{rwqSzbN4q@7<`y=nO(qno-FZ?a6cbl(-LblUxN^U{QjGS%IO>)-riLXNY| z`xs9#bHd|p@v*)+y!F#Dka`kP$h+C>^@VG51>-4xXZAw;teEg}`>)tN7KJ#INaf-%M3C)Ke z&AWmgE|>Q|ocQ174UeUQ;2wtEK+Z&Fkx>KN=MO*ksSMd%ID1 z^Oxs*L0anU=~|J#f{L1P2OBmoXxIC5Ytd;QOXT6V$WbX<%a=fZ(TDD@{hSL$tg?7bGz4ntO{c~4Z$i+sj z-Z^XMpLNtOVBpldSiigB&iYHjwL2nDgdLM8>@EM8>$8ugq>kxl``0yo>Kso~Cg!_F z*q@d+nIH5hR#0N$(pO2z_h*-;viWaymyTnJNEf($`JFGR)Un;)y3k(4RS5I<{HvUK$Yi(A<_Ki0EdXRq3FInBy(ZMKlQ*n#Uw zZ|`i1(~7893{amQS9$vNWLuG`C-V*_hp%23`{vpS;aj@$x~$HdwQtJ)Oa3m79BG^P yGG1imgh$@w>Fh>K3X3M6W|vXi1dPdoqWtut#M}UHRyJUKGB5#Q0g!HH2k`&_h}kay delta 513 zcmeAa=n$w6@MdNaVPIh3U^rhL7rCrLKf8^QfkBIzfq@q&nwyxHnU-2yqF0iio0A)K zaGkIr&z|qv^S;gNVq(|(!>TT@>W@(Rb)~{@H#y&a`f9N|^|oE%T*-c$_6bHj<#%D;a8c)G(VYSO`Ut`k$07M9e1`@MW_#VpHOn|W=A`;Eez zzdUCQ(h_G6*NXHNRMfn8pkecZcDTgI32NEXjkmiYd=}SKX;{tTx`_p zowIiST}SN#22Q<;tLqzV)?E_*TeNw?+8)D4V)M2+sGIdY<{eAMpC9QV|AMRu8W}=GH*@G{;WOtwsGFuEi?UIJ4`#$$@*by zg!T6|*{rwqSzbN4q@7<`y=nO(qno-FZ?a6cbl(-LblUxN^U{QjGS%IO>)-riLXNY| z`xq~>a>C-H?1_mu=1_oZBXl`O&W?E`-iC#&5Zcc8H zW1h4j&z|3+2k)gG$WPH%u;Z?=I&5e*gRVxeQM>c}<1zu9o^sH?Oak{%BDAW0O74?(Ih5 z&0n7L1!<|Xr)x#}3My*G9c)Je2?YC#twJovsS{BpY=X2lD#Y7$nmPCY1xW(8%{?o7upp&_1aIC^v_*sAr~99 zdgrX2f7VgEfPqu*V*T!hJL@kA*Y1cs5q3B3S|~{f=-v$~kQn8SrWL z?PrU)!!6?dY~C0ZY<{eAMpC9QL;S2+$#{m;*1jqGFZsJTa-?nE z%ea@B6CQb!n^}$QK|I}cZ(qy+Mq>dV0|PrSDiL54FoFw;^3#hFa|66t*+3FZKv)2z I^I1VW03Kf4i2wiq delta 513 zcmey${e`bI1_mu=1_oZBXl`O&W?E`-iC#&5Zcc8{ z!F9rhJbS)t&-*s7i-}$D539Pssy{;M*Odyt-Q;}x>8r)=)Z2E2b0zz2lG}sMO%$3} zzgR=G?&mL~IeqeN&J8C{EC2fWnLNK2eOTr1L7P*L;VfriZs+VyIVKiIm+K;=1iIAi?%{y2vj6?+aJY&j>ka7Rge zO7u11d#oomcDO5_wGy8EZ0_SC>AQlC9ItAcmaSN~;dI1up@6aWAK2mmXhURe|bj{1iI001fj000dD003=aZfRy^b963r zZ*6RCQbBGTF$}!>6~W$R#BDD<^cOiLC=5oTc8N&TmXvC5Uth}WuI-@Lnc;vlWGLkr zDdF)qic;aHA5X(!|2*shL|*REZ~O22=gw$J1|KOPSBivx(%ILq8}Tr6__99?ySFk| zgY@SPQYt40XDV4u5g{pF!GN=%hc5iY;JKnOB@6aWAK2ms)FURkDiFKdPY001fj000dD003=aZfRy^b963r zZ*6RCQo*hhF$}!-E1veAiUJ2N`~@cvs{9gX*CKKD*$M6P^*Fm_+dgrf8IL?;hf>aw z5}tpfC>4JB`ZAo3ABIDK$jc-8`S|6yGFpU*C^jK$v*E!@-2k7NNLwUu0X> z6W#^Lv4}?_%{mj4=AGkm8{H8>2SANxn{{OdPqjxIz6r3-AhxI7n-pFXIxd`u5yaV+b+Vx3cemX|7p`z!Pdpql zaI@ni%o!YUXsc!)y3ti=9PKrB{H?+5fu8NOnNI6Kmc)q#@U>Vw_pECL+b;y_@6aWAK2ms)Fv%Uew0}0@J iURkDiFKdRAjRi6S;Cqw71snmflimdy26qJj0001nKj3Eo diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries.doo index baf810cbb0430590a1d491e3a88c93c6e233d571..c4d4f32af9137e5782a6867b9633c94b2d177c89 100644 GIT binary patch delta 518 zcmbQZmwD1&=K26{W)=|!1_llW)VuV_w#cZo^0}(3gKNX^_Om5UoZX9p!mlod!F6f zjl!G1Jm(A2QfE)siu4s!)QmgWuz5kd-k&26b}lkddCncq7;oP{&tXQzo`VNl&WSDD zQ4*gLeNFft%ZZI0?#gGageO1ieOx4aSHO|uRZY{f73(&fj#w_VD|YI&pDgL0yV61~ zHfr_GSv&u%qjmuUr{2Z--3@ovUlOj}5qTo)m_%W3`Nv$JeJmw)Oh4PduJKdnc$zXX z-!;Piw7kjuphvNS5(}5UN=m*zyEK)}f2+H697{yH!0pTLe7W9p%8L6P;dqpD+A1>O z)9l;N7IBAL#QWL2F)G;nSmlhQOksxjS+kO*t1npG%Fg+*p6xn&)t1X?R*q}4h1A6k zTu*v?XH%S3M7?5w`t-QU)2}Dno-(>=Sn;N4>%U#M*3MMll5E$->b%+brsBWn-^Gz5 wZS!8ns5_kS$eXNi&qyA`%Q|*i!}JaVLt_mq13NG(5n$8g!h2F|Joi8%03s;foB#j- delta 538 zcmbQVmwDn|=K26{W)=|!1_lm>wbgNvPt~p8v@tR;=rA)d@B&416Z10DQj1IUO7e4a za)S=86E@`8^Id!1w|QMm?0SD#)dg1l5lX+VRQT;C=i5(TEq15gwkw<~*>98F9&~P^ z(7gJ^8lrVSe;Li`lW%iwIB{C}*UukMcNj%YI+)INVye=@lKOAIm(Q)3Wm#)8ukCQZ zQF!y0=ZryG;_TsCk-mb8n)ePgY+lf=S9AQq)?hW8KZ*Dk5$e{$`od-PLtntF*HNwt!dexwFloe&U?FMrr&FaX-7I) zKWvS#{=O!g^|n6Ct0$MV^DC=2rAMk+v-QWWyA~h5TlaHI*_rf>2^nQ-)<^#T`NxDD zXPfsiM&03r$K7Pbdq(ykUe>YG8m4y`7#eF>8Q6g_i2xgc@mo-opI(%h8{o~#29jU` M!U7=8eGkL~03(s-Qvd(} diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/gomodule/multimodule/test.doo b/Source/IntegrationTests/TestFiles/LitTests/LitTest/gomodule/multimodule/test.doo index 8859e16cae7a6e19d06deec71772a6b64fdb4a7c..f0875d5542287d5979c4d22badf77b001f1abc1a 100644 GIT binary patch delta 42 tcmZ3-x{j46z?+#xgn@y9gJI30jXdiZnbs_tyoa#@M42&Jf~Z0!TLAar4C(*? delta 42 tcmZ3-x{j46z?+#xgn@y9gF&cfBhNZUCZU?idl)M~lo^vHh$>{V1pvnR3F-g< diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/pythonmodule/multimodule/PythonModule1.doo b/Source/IntegrationTests/TestFiles/LitTests/LitTest/pythonmodule/multimodule/PythonModule1.doo index 9cdcd9c9ff762de4e1aaa99f6e977f3a2de72bf3..56bcad45a6b34cedc1c7b6ca45f34aa93ee49bf0 100644 GIT binary patch delta 42 tcmZ3-x{j46z?+#xgn@y9gJJcejXdiZnN}~Fyoa#@M42&Jf~Z0!TLAZ;4CVj; delta 42 tcmZ3-x{j46z?+#xgn@y9gMq(hBhNZUCjOeqdl)M~lo^vHh$>{V1pvk~3Eltz diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/pythonmodule/nestedmodule/SomeNestedModule.doo b/Source/IntegrationTests/TestFiles/LitTests/LitTest/pythonmodule/nestedmodule/SomeNestedModule.doo index ba7413051117193797a0eb6f5a6d33994a9cea5f..d08ddb6acdff873c3c255cbdf214afa836a03ade 100644 GIT binary patch delta 42 tcmdnQx`~x1z?+#xgn@y9gJI30jXdiZnbs_tyoa#{L|HLef~Zm^TLAf)4E_KB delta 42 tcmdnQx`~x1z?+#xgn@y9gF&!nBhNZUCc&D?dl+j#logXDh$>~W1pvrz3Hks4 From a30178233df7645cb38d27ec341615ac10019f79 Mon Sep 17 00:00:00 2001 From: Mikael Mayer Date: Wed, 30 Oct 2024 22:21:13 -0500 Subject: [PATCH 14/15] Preparing next patch 4.9.1 --- Source/Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Directory.Build.props b/Source/Directory.Build.props index a63a82c5d23..7fe507d80e6 100644 --- a/Source/Directory.Build.props +++ b/Source/Directory.Build.props @@ -1,7 +1,7 @@ - 4.9.0 + 4.9.1 1701;1702;VSTHRD200 From a7be29b286c705fd1b45212c960a42f613c3823b Mon Sep 17 00:00:00 2001 From: Mikael Mayer Date: Wed, 30 Oct 2024 22:46:54 -0500 Subject: [PATCH 15/15] Prepared next patch 4.9.1 --- .../binaries/DafnyStandardLibraries-cs.doo | Bin 1547 -> 1546 bytes .../binaries/DafnyStandardLibraries-go.doo | Bin 1569 -> 1568 bytes .../binaries/DafnyStandardLibraries-java.doo | Bin 1538 -> 1537 bytes .../binaries/DafnyStandardLibraries-js.doo | Bin 2057 -> 2056 bytes .../DafnyStandardLibraries-notarget.doo | Bin 1525 -> 1524 bytes .../binaries/DafnyStandardLibraries-py.doo | Bin 1534 -> 1533 bytes .../binaries/DafnyStandardLibraries.doo | Bin 56978 -> 56977 bytes 7 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-cs.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-cs.doo index d399d0336ca015f4eb0e20b1dd52d0a64a0a405e..beb76a262d62e300f5ab51d58c58cc8e6db015af 100644 GIT binary patch delta 492 zcmV@6aWAK2mqaw z5}tpfC>4JB`ZAo3ABIDK$jc-8`S|6yGFpU*C^jK$v*E!@-2k7NNLwUu0X> z6W#^Lv4}?_%{mj4=AGkm8{H8>2SANxn{{OdPqjxIz6r3-AhxI7n-pFXIxd`u5yaV+b+Vx3cemX|7p`z!Pdpql zaI@ni%o!YUXsc!)y3ti=9PKrB{H?+5fu8NOnNI6Kmc)q#@U>Vw_pECL+b;y_@6aWAK2mq@6aWAK2mleHURe|bj{1iI001fj000dD003=aZfRy^b963r zZ*6RCQbBGTF$}!>6~W$R#BDD<^cOiLC=5oTc8N&TmXvC5Uth}WuI-@Lnc;vlWGLkr zDdF)qic;aHA5X(!|2*shL|*REZ~O22=gw$J1|KOPSBivx(%ILq8}Tr6__99?ySFk| zgY@SPQYt40XDV4u5g{pF!GN=%hc5iY;JKnOB^6*vXkls8U}?0000007Jk-V diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-go.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-go.doo index 3ffe9fd0fe60a1b935379a7a88071737f0278657..4f078eb34a079ed3a37992ee8127fc68c88d0410 100644 GIT binary patch delta 515 zcmZ3;vw){Qz?+#xgn@y9gJI9sxJZG!J|Ef`85p#f85nqhqPdBAnQ5uTC3+?KxjDH( z2iFN3^6dGpJ@4DRE+%olKdkBktNsY3Uso#pc9Zk%r>_>fQ*YZ9&Xw%9Np251H&JL_ z{bCK#x}U#{=Jd(8IX9d*t^DifkEc6~q9z?o=Q=S}X<R?M=jwVBs;xZfze z`O9<0AT4qBaIHvRK}F4b2O2gnXxFPb{$T4O1C{68;f(S3`{NvDRO~r?u;rZC!W|{? zDbd%2@3EfP*x{~x)=GHtv$>Cpr0)tka=fZ(TDD@{hSL$tg?7bGz4ntO{Bu`Y$i+sj z-Z^XM-*wb3VBpldxVpZzeSrTtnD#;B$od**JmF~NgdPA_OEOF)H$9eO?>Yf zVSifQWPZ>iXF-XDOJ5}=-=AHY%I3e-U3wqqhI0zrmfxK%5+`h>H>X4J$jxb`n-)AN z-+tFsd|g4Tzm1Gh!RE&*XC!3`Ggha`@46V8A@kO>?9bYRZyV>m-7?efwZpU{ova_W zMp%Delg)ZtpXJq)OWOIB)ti-H?1_mu=1_oZBXl`O&W?E`-iC#&5Zcc8H zW1h4j&z|3+2k)gG$WPH%u;Z?=I&5e*gRVxeQM>c}<1zu9o^sH?Oak{%BDAW0O74?(Ih5 z&0n7L1!<|Xr)x#}3My*G9c)Je2?YC#twJovsS{BpY=X2lD#Y7$nmPCY1xW(8%{?o7upp&_1aIC^v_*sAr~99 zdgrX2f7VgEfPqu*V*T!hJL@kA*Y1cs5q3B3S|~{f=-v$~kQn8SrWL z?PrU)!!6?dY~C0ZY<{eAMpC9QL;S2+$#{m;*1jqGFZsJTa-?nE s%lML+6CQb!*RvYQgLnyN7QZ_Jj7A;-1_pLuR3gBpNo-PVvspm`05kI0D*ylh diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-java.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-java.doo index 1f118dc7f141fd68b6b440654c4c2d79bf16de78..4ace84e1b5ac95f085b9274d3c303e33f7bb7b5e 100644 GIT binary patch delta 536 zcmZqTY2>L7@MdNaVPIh3U|7F3E>hsG&xbZf1_mu=1_oZBXl`O&W?E`-iC#&5Zcc8{ z!F9rhJbS)t&-*s7i%FdC539Pssy{;M*Odyt-Q;}x>8r)=)Z2E2b0zz2lG}sMO%$3} zzgR=G?&mL~IeqeN&J8C{EC2fWnLNK2eOTr1L7P*L;VfriZs+VyIVKiIm+K;=1iIAi?%{y2vj6?+aJY&j>ka7Rge zO7u11d#oomcDO5_wGy8EZ0_SC>AQlC9ItAcmaSN~;dI1up_I%{MpuEQz*s!W&%nSAj7bF82#nu?qWtut#M}UHRyL3X6A%^v J>1tLG4**^Xv*)+y!F#Dka`kP$h+C>^@VG51>-4xXZAw;teEg}`>)tN7KJ#INaf-%M3C)Ke z&AWmgE|>Q|ocQ174UeUQ;2wtEK+Z&Fkx>KN=MO*ksSMd%ID1 z^Oxs*L0anU=~|J#f{L1P2OBmoXxIC5Ytd;QOXT6V$WbX<%a=fZ(TDD@{hSL$tg?7bGz4ntO{c~4Z$i+sj z-Z^XMpLNtOVBpldSiigB&iYHjwL2nDgdLM8>@EM8>$8ugq>kxl``0yo>Kso~Cg!_F z*q@d+nIH5hR#0N$(pO2z_h*-;viWaymyTnJNEf($`JFGR)Un;)y3k(4RS5I<{HvUK$Yi(A<_Ki0EdXRq3FInBy(ZMKlQ*n#Uw zZ|`i1(~7893{amQS9$vNWLuG`C-V*_hp%23`{vpS;aj@$x~$HdwQtJ)Oa3m79BG^P tGM-}Qgh$@w39Lr)ARcq0tH4rVG#=$=U|hsG&xbZf1_mu=1_oZBXl`O&W?E`-iC#&5Zcc8{ z!F9rhJbS)t&-*s7i%FdC539Pssy{;M*Odyt-Q;}x>8r)=)Z2E2b0zz2lG}sMO%$3} zzgR=G?&mL~IeqeN&J8C{EC2fWnLNK2eOTr1L7P*L;VfriZs+VyIVKiIm+K;=1iIAi?%{y2vj6?+aJY&j>ka7Rge zO7u11d#oomcDO5_wGy8EZ0_SC>AQlC9ItAcmaSN~;dI1upv*)+y!F#Dka`kP$h+C>^@VG51>-4xXZAw;teEg}`>)tN7KJ#INaf-%M3C)Ke z&AWmgE|>Q|ocQ174UeUQ;2wtEK+Z&Fkx>KN=MO*ksSMd%ID1 z^Oxs*L0anU=~|J#f{L1P2OBmoXxIC5Ytd;QOXT6V$WbX<%a=fZ(TDD@{hSL$tg?7bGz4ntO{c~4Z$i+sj z-Z^XMpLNtOVBpldSiigB&iYHjwL2nDgdLM8>@EM8>$8ugq>kxl``0yo>Kso~Cg!_F z*q@d+nIH5hR#0N$(pO2z_h*-;viWaymyTnJNEf($`JFGR)Un;)y3k(4RS5I<{HvUK$Yi(A<_Ki0EdXRq3FInBy(ZMKlQ*n#Uw zZ|`i1(~7893{amQS9$vNWLuG`C-V*_hp%23`{vpS;aj@$x~$HdwQtJ)Oa3m79BG^P yGG1imgh$@w>Fh>K3X3M6W|vXi1dPdoqWtut#M}UHRyJUKGB5#Q0g!HH2k`&_h}kay diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-notarget.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-notarget.doo index f0ea299b0305a58ed7824fa88709c66b4be253f2..c3babf5b1229d93af5e8da871c4cfd9f16deecab 100644 GIT binary patch delta 513 zcmey${e`_>fQ*YZ9&Xw%9Np251H&JL_ z{bCK#x}U#{=Jd(8IX9d*t^DifkEc6~q9z?o=Q=S}X<R?M=jwVBs;xZfze z`O9<0AT4qBaIHvRK}F4b2O2gnXxFPb{$T4O1C{68;f(S3`{NvDRO~r?u;rZC!W|{? zDbd%2@3EfP*x{~x)=GHtv$>Cpr0)tka=fZ(TDD@{hSL$tg?7bGz4ntO{Bu`Y$i+sj z-Z^XM-*wb3VBpldxVpZzeSrTtnD#;B$od**JmF~NgdPA_OEOF)H$9eO?>Yf zVSifQWPZ>iXF-XDOJ5}=-=AHY%I3e-U3wqqhI0zrmfxK%5+`h>H>X4J$jxb`n-)AN z-+tFsd|g4Tzm1Gh!RE&*XC!3`Ggha`@46V8A@kO>?9bYRZyV>m-7?efwZpU{ova_W zMp%Delg)ZtpXJq)OWOIB)tiD7bWHfc(bwrqmzLN2n&F89xI3k0I^`> Ai~s-t delta 537 zcmeyu{gt~uz?+#xgn@y9gMoWdT%-s~->-H?1_mu=1_oZBXl`O&W?E`-iC#&5Zcc8H zW1h4j&z|3+2k)gG$WPH%u;Z?=I&5e*gRVxeQM>c}<1zu9o^sH?Oak{%BDAW0O74?(Ih5 z&0n7L1!<|Xr)x#}3My*G9c)Je2?YC#twJovsS{BpY=X2lD#Y7$nmPCY1xW(8%{?o7upp&_1aIC^v_*sAr~99 zdgrX2f7VgEfPqu*V*T!hJL@kA*Y1cs5q3B3S|~{f=-v$~kQn8SrWL z?PrU)!!6?dY~C0ZY<{eAMpC9QL;S2+$#{m;*1jqGFZsJTa-?nE z%ea@B6CQb!n^}$QK|I}cZ(qy+Mq>dV0|PrSDiL54FoFw;^3#hFa|66t*+3FZKv)2z I^I1VW03Kf4i2wiq diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-py.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-py.doo index 1ceb9edf3f9a6fbbe69ca729a4303d47c2e7ec7e..04382d31932d679e622d428302b2174bd654e553 100644 GIT binary patch delta 492 zcmV@6aWAK2mr>lURe;`Oz?&Q001fj000dD003=aZfRy^b963r zZ*6RCQo*hhF$}!-E1veAiUJo7`~@cvs{9gX*CKKD*$M6P^*Fm_+dgrf8IL?;hf>aw z5}tpfC>4JB`ZAo3ABIDK$jc-8`S|6yGFpU*C^jK$v*E!@-2k7NNLwUu0X> z6W#^Lv4}?_%{mj4=AGkm8{H8>2SANxn{{OdPqjxIz6r3-AhxI7n-pFXIxd`u5yaV+b+Vx3cemX|7p`z!Pdpql zaI@ni%o!YUXsc!)y3ti=9PKrB{H?+5fu8NOnNI6Kmc)q#@U>Vw_pECL+b;y_@6aWAK2mr>lv%Uew0|~~p iURe;`Oz?)2jRi6S#@6aWAK2mmXhURe|bj{1iI001fj000dD003=aZfRy^b963r zZ*6RCQbBGTF$}!>6~W$R#BDD<^cOiLC=5oTc8N&TmXvC5Uth}WuI-@Lnc;vlWGLkr zDdF)qic;aHA5X(!|2*shL|*REZ~O22=gw$J1|KOPSBivx(%ILq8}Tr6__99?ySFk| zgY@SPQYt40XDV4u5g{pF!GN=%hc5iY;JKnOB8C&Bb??00G(ZUq635-C-0p>0mn7iK$8pOX|P=P;vU&*6hD=foE7 zD2Y#rz9xK+^~A;wcjdEI!jqrPeOx4cSJ08;RZY{f73(&fj#w_VD|YI&pDf{@yV61~ zHfr_GSv&u(qjmuUr{2ZY^$j-bE(!lF+B{)xkKrS+{I9t_`&dfqn0~f@UE`VuV_w#cZo^0}(3gKNX^_Om5UoZX9p!mlod!F6f zjl!G1Jm(A2QfE)siu4s!)QmgWuz5kd-k&26b}lkddCncq7;oP{&tXQzo`VNl&WSDD zQ4*gLeNFft%ZZI0?#gGageO1ieOx4aSHO|uRZY{f73(&fj#w_VD|YI&pDgL0yV61~ zHfr_GSv&u%qjmuUr{2Z--3@ovUlOj}5qTo)m_%W3`Nv$JeJmw)Oh4PduJKdnc$zXX z-!;Piw7kjuphvNS5(}5UN=m*zyEK)}f2+H697{yH!0pTLe7W9p%8L6P;dqpD+A1>O z)9l;N7IBAL#QWL2F)G;nSmlhQOksxjS+kO*t1npG%Fg+*p6xn&)t1X?R*q}4h1A6k zTu*v?XH%S3M7?5w`t-QU)2}Dno-(>=Sn;N4>%U#M*3MMll5E$->b%+brsBWn-^Gz5 wZS!8ns5_kS$eXNi&qyA`%Q|*i!}JaVLt_mq13NG(5n$8g!h2F|Joi8%03s;foB#j-