Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hide statements #5562

Merged
merged 94 commits into from
Jul 24, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
94 commits
Select commit Hold shift + click to select a range
a9d1b80
Add Boogie as a submodule
keyboardDrummer Jun 12, 2024
7bded0a
Use Boogie submodule
keyboardDrummer Jun 12, 2024
e7be101
Added reveal test
keyboardDrummer Jun 13, 2024
d34a4fa
Move resolve code for revealStmt to RevealStmt class
keyboardDrummer Jun 13, 2024
b7ae5a5
reveal.dfy test passes
keyboardDrummer Jun 13, 2024
f354052
Update reveal test
keyboardDrummer Jun 13, 2024
23f82c6
Progress towards blind functions
keyboardDrummer Jun 15, 2024
dcc4a89
Simplification
keyboardDrummer Jun 15, 2024
5bbc32e
Reveal.dfy passes
keyboardDrummer Jun 15, 2024
10d4a0f
Refactoring for readability
keyboardDrummer Jun 15, 2024
8f5940a
Add hidden function ensure clause test case to reveal.dfy
keyboardDrummer Jun 16, 2024
37f9462
Refactor TrPredicateStmt
keyboardDrummer Jun 16, 2024
608a6ab
Fix test
keyboardDrummer Jun 16, 2024
fca4526
Reveal now had a passing test for combining blind, opaque and reveal
keyboardDrummer Jun 17, 2024
8c0b90d
Update reveal.dfy test
keyboardDrummer Jun 20, 2024
97c4910
Add scratch test for playing around with
keyboardDrummer Jun 24, 2024
653c776
Make functions in Prelude revealed
keyboardDrummer Jun 24, 2024
3d7e01c
Make more generated function always revealed
keyboardDrummer Jun 24, 2024
5a65cb8
Let axioms decide if they can be hidden
keyboardDrummer Jun 27, 2024
af8b397
Update tests
keyboardDrummer Jun 27, 2024
f8bf900
Update test
keyboardDrummer Jun 27, 2024
84021fb
Update tests
keyboardDrummer Jun 27, 2024
eba67ca
Draft
keyboardDrummer Jul 1, 2024
f4da59c
Replace blind with hide statement
keyboardDrummer Jul 1, 2024
ee98116
Some success on revealFunctions.dfy
keyboardDrummer Jul 1, 2024
64f1c3d
revealFunctions.dfy works except for scoping now
keyboardDrummer Jul 1, 2024
28a2483
Scoping for if now works for revealFunctions.dfy
keyboardDrummer Jul 1, 2024
f4e3658
revealFunctions passes
keyboardDrummer Jul 1, 2024
b755a61
Reveal functions passes
keyboardDrummer Jul 2, 2024
0c2f5a0
Finished draft of revealInBlock test
keyboardDrummer Jul 2, 2024
10db663
Fix printing and cloning of hide reveal statements
keyboardDrummer Jul 2, 2024
18fb8fb
revealInBlock test passes
keyboardDrummer Jul 2, 2024
dd9fd67
Fixed revealInExpression test
keyboardDrummer Jul 2, 2024
f5afce8
Refactoring
keyboardDrummer Jul 2, 2024
a6e65d2
Progress in isolating expression wellformedness checks
keyboardDrummer Jul 3, 2024
c46ff52
revealInExpression test now passes
keyboardDrummer Jul 3, 2024
7861efa
Some cleanup
keyboardDrummer Jul 3, 2024
5664a6f
Adapt to Boogie changes and fix tests
keyboardDrummer Jul 3, 2024
64c5b4c
Refactoring and fixes
keyboardDrummer Jul 3, 2024
b5ad048
Remove comment
keyboardDrummer Jul 4, 2024
eca25fb
Merge commit 'origin/master~1' into alwaysOpaque
keyboardDrummer Jul 4, 2024
c60e66f
Merge remote-tracking branch 'origin/master' into alwaysOpaque
keyboardDrummer Jul 4, 2024
c33ffb1
Refactoring
keyboardDrummer Jul 4, 2024
fbe6356
Update documentation
keyboardDrummer Jul 4, 2024
a8670a9
Add release note
keyboardDrummer Jul 4, 2024
a2a6541
Revert "Use Boogie submodule"
keyboardDrummer Jul 4, 2024
b0b6350
Revert "Add Boogie as a submodule"
keyboardDrummer Jul 4, 2024
915659d
Update Boogie version
keyboardDrummer Jul 4, 2024
6c23085
Update test
keyboardDrummer Jul 14, 2024
484a7a1
Fixes
keyboardDrummer Jul 15, 2024
52b2c78
Merge branch 'master' into alwaysOpaque
keyboardDrummer Jul 15, 2024
4cca877
Fix IsReveal check
keyboardDrummer Jul 15, 2024
11abf08
Merge branch 'alwaysOpaque' of github.com:keyboardDrummer/dafny into …
keyboardDrummer Jul 15, 2024
771f877
Add test for if-case and fix scoping code
keyboardDrummer Jul 15, 2024
c07da2a
Add calc statement test
keyboardDrummer Jul 15, 2024
5dabba1
Delete Boogie submodule
keyboardDrummer Jul 15, 2024
7635658
Fix letSuchThatExprInfo scope
keyboardDrummer Jul 15, 2024
c2ebedf
Move added tests
keyboardDrummer Jul 15, 2024
747c14c
Fix test
keyboardDrummer Jul 15, 2024
7c9d19c
Turn off isolation of statements in a statementexpression
keyboardDrummer Jul 15, 2024
36766ca
Fix BindingGuards
keyboardDrummer Jul 15, 2024
beab051
Added Boogie as submodule
keyboardDrummer Jul 15, 2024
e7dd5bc
Use Boogie submodule
keyboardDrummer Jul 15, 2024
f8a797b
Improve tokens for ChangeScope commands
keyboardDrummer Jul 15, 2024
d27b06f
Add mechanism to deal with the scope change of continue and break sta…
keyboardDrummer Jul 15, 2024
268f249
Remove unnecessary scope changes
keyboardDrummer Jul 15, 2024
e0d319a
More ChangeScope fixes for jumps
keyboardDrummer Jul 15, 2024
d284059
Fix source location issue by not emitting push/pops in return positions
keyboardDrummer Jul 16, 2024
3fb842d
Refactoring
keyboardDrummer Jul 16, 2024
f486987
Add explanatory comment
keyboardDrummer Jul 16, 2024
e739e83
Fix breakage of legacy reveal
keyboardDrummer Jul 16, 2024
67bae1c
Fix HideRevealStmt resolution
keyboardDrummer Jul 16, 2024
d541fd4
Test fixes
keyboardDrummer Jul 16, 2024
ffa458f
Fix tests
keyboardDrummer Jul 16, 2024
11ebe08
Change IdGenerator push popping to be more like it was
keyboardDrummer Jul 16, 2024
15db4b6
Add focus test
keyboardDrummer Jul 17, 2024
823bd99
Trigger CI
keyboardDrummer Jul 17, 2024
66ce6aa
Fixes and test fixes
keyboardDrummer Jul 17, 2024
40eb41c
Fix bugs and tests
keyboardDrummer Jul 17, 2024
70da107
Update error message
keyboardDrummer Jul 17, 2024
e90ba39
Enable hiding of constants
keyboardDrummer Jul 17, 2024
1006d19
Fix doc examples
keyboardDrummer Jul 17, 2024
6919832
Fix docs
keyboardDrummer Jul 17, 2024
1fef94f
Merge branch 'alwaysOpaque' of github.com:keyboardDrummer/dafny into …
keyboardDrummer Jul 18, 2024
7bc15cd
Revert "Use Boogie submodule"
keyboardDrummer Jul 18, 2024
b7e006b
Revert "Added Boogie as submodule"
keyboardDrummer Jul 18, 2024
79516d5
Update Boogie
keyboardDrummer Jul 18, 2024
710a90a
Undo change
keyboardDrummer Jul 18, 2024
8cac279
Update Boogie version
keyboardDrummer Jul 18, 2024
ed700c3
Fix expect file
keyboardDrummer Jul 18, 2024
ba265dc
Update error messages
keyboardDrummer Jul 23, 2024
ffb9607
Merge branch 'master' into alwaysOpaque
keyboardDrummer Jul 23, 2024
5cd817e
Fix woopse
keyboardDrummer Jul 23, 2024
9fbe781
Merge branch 'master' into alwaysOpaque
atomb Jul 24, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Progress towards blind functions
  • Loading branch information
keyboardDrummer committed Jun 15, 2024
commit 23f82c65258bfe3d16f9ee8bb307172bdf52d489
10 changes: 9 additions & 1 deletion Source/DafnyCore/AST/Grammar/ParserNonGeneratedPart.cs
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,13 @@ public Parser(DafnyOptions options, Scanner/*!*/ scanner, Errors/*!*/ errors, Ca
}

bool IsFunctionDecl() {
switch (la.kind) {
var kind = la.kind;
return IsFunctionDecl(kind);
}

private bool IsFunctionDecl(int kind)
{
switch (kind) {
case _function:
case _predicate:
case _copredicate:
Expand Down Expand Up @@ -618,6 +624,8 @@ class DeclModifierData {
public bool IsStatic;
public IToken StaticToken;
public bool IsOpaque;
public bool IsBlind;
public IToken BlindToken;
public IToken OpaqueToken;
public IToken FirstToken;
}
Expand Down
19 changes: 10 additions & 9 deletions Source/DafnyCore/AST/Members/Function.cs
Original file line number Diff line number Diff line change
Expand Up @@ -389,14 +389,15 @@ public enum CoCallClusterInvolvement {

resolver.ResolveParameterDefaultValues(Ins, ResolutionContext.FromCodeContext(this));

var contractContext = new ResolutionContext(this, this is TwoStateFunction, false);
foreach (var req in Req) {
resolver.ResolveAttributes(req, new ResolutionContext(this, this is TwoStateFunction));
resolver.ResolveAttributes(req, contractContext);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good refactoring !

Expression r = req.E;
resolver.ResolveExpression(r, new ResolutionContext(this, this is TwoStateFunction));
resolver.ResolveExpression(r, contractContext);
Contract.Assert(r.Type != null); // follows from postcondition of ResolveExpression
resolver.ConstrainTypeExprBool(r, "Precondition must be a boolean (got {0})");
}
resolver.ResolveAttributes(Reads, new ResolutionContext(this, this is TwoStateFunction));
resolver.ResolveAttributes(Reads, contractContext);
foreach (FrameExpression fr in Reads.Expressions) {
resolver.ResolveFrameExpressionTopLevel(fr, FrameExpressionUse.Reads, this);
}
Expand All @@ -407,16 +408,16 @@ public enum CoCallClusterInvolvement {
}
foreach (AttributedExpression e in Ens) {
Expression r = e.E;
resolver.ResolveAttributes(e, new ResolutionContext(this, this is TwoStateFunction));
resolver.ResolveExpression(r, new ResolutionContext(this, this is TwoStateFunction) with { InFunctionPostcondition = true });
resolver.ResolveAttributes(e, contractContext);
resolver.ResolveExpression(r, contractContext with { InFunctionPostcondition = true });
Contract.Assert(r.Type != null); // follows from postcondition of ResolveExpression
resolver.ConstrainTypeExprBool(r, "Postcondition must be a boolean (got {0})");
}
resolver.scope.PopMarker(); // function result name

resolver.ResolveAttributes(Decreases, new ResolutionContext(this, this is TwoStateFunction));
resolver.ResolveAttributes(Decreases, contractContext);
foreach (Expression r in Decreases.Expressions) {
resolver.ResolveExpression(r, new ResolutionContext(this, this is TwoStateFunction));
resolver.ResolveExpression(r, contractContext);
// any type is fine
}
resolver.SolveAllTypeConstraints(); // solve type constraints in the specification
Expand All @@ -434,7 +435,7 @@ public enum CoCallClusterInvolvement {
}
}
}
resolver.ResolveExpression(Body, new ResolutionContext(this, this is TwoStateFunction));
resolver.ResolveExpression(Body, new ResolutionContext(this, this is TwoStateFunction, IsBlind));
Contract.Assert(Body.Type != null); // follows from postcondition of ResolveExpression
resolver.AddAssignableConstraint(tok, ResultType, Body.Type, "Function body type mismatch (expected {0}, got {1})");
resolver.SolveAllTypeConstraints();
Expand All @@ -445,7 +446,7 @@ public enum CoCallClusterInvolvement {
if (Result != null) {
resolver.scope.Push(Result.Name, Result); // function return only visible in post-conditions (and in function attributes)
}
resolver.ResolveAttributes(this, new ResolutionContext(this, this is TwoStateFunction), true);
resolver.ResolveAttributes(this, contractContext, true);
resolver.scope.PopMarker(); // function result name

resolver.scope.PopMarker(); // formals
Expand Down
29 changes: 14 additions & 15 deletions Source/DafnyCore/AST/Members/Method.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,6 @@ public class Method : MethodOrFunction, TypeParameter.ParentType,
Concat(Ins).Concat(Outs).Concat<Node>(TypeArgs).
Concat(Req).Concat(Ens).Concat(Reads.Expressions).Concat(Mod.Expressions);
public override IEnumerable<INode> PreResolveChildren => Children;

public bool IsBlind { get; set; }
public override string WhatKind => "method";
public bool SignatureIsOmitted { get { return SignatureEllipsis != null; } }
public readonly IToken SignatureEllipsis;
Expand Down Expand Up @@ -126,7 +124,6 @@ public class Method : MethodOrFunction, TypeParameter.ParentType,
this.Outs = original.Outs.ConvertAll(p => cloner.CloneFormal(p, false));
}

this.IsBlind = original.IsBlind;
this.Reads = cloner.CloneSpecFrameExpr(original.Reads);
this.Mod = cloner.CloneSpecFrameExpr(original.Mod);
this.Body = cloner.CloneMethodBody(original);
Expand All @@ -145,10 +142,9 @@ public class Method : MethodOrFunction, TypeParameter.ParentType,
[Captured] Specification<Expression> decreases,
[Captured] BlockStmt body,
Attributes attributes, IToken signatureEllipsis,
bool isByMethod = false, bool isBlind = false)
bool isByMethod = false)
: base(rangeToken, name, hasStaticKeyword, isGhost, attributes, signatureEllipsis != null,
typeArgs, ins, req, ens, decreases) {
this.IsBlind = isBlind;
Contract.Requires(rangeToken != null);
Contract.Requires(name != null);
Contract.Requires(cce.NonNullElements(typeArgs));
Expand Down Expand Up @@ -287,29 +283,31 @@ public class Method : MethodOrFunction, TypeParameter.ParentType,
resolver.scope.Push(p.Name, p);
}

resolver.ResolveParameterDefaultValues(Ins, new ResolutionContext(this, this is TwoStateLemma));
var resolutionContext = new ResolutionContext(this, this is TwoStateLemma, IsBlind);
resolver.ResolveParameterDefaultValues(Ins, resolutionContext);

// Start resolving specification...
foreach (AttributedExpression e in Req) {
resolver.ResolveAttributes(e, new ResolutionContext(this, this is TwoStateLemma));
resolver.ResolveExpression(e.E, new ResolutionContext(this, this is TwoStateLemma));
resolver.ResolveAttributes(e, resolutionContext);
resolver.ResolveExpression(e.E, resolutionContext);
Contract.Assert(e.E.Type != null); // follows from postcondition of ResolveExpression
resolver.ConstrainTypeExprBool(e.E, "Precondition must be a boolean (got {0})");
}

resolver.ResolveAttributes(Reads, new ResolutionContext(this, false));
var context = new ResolutionContext(this, false, IsBlind);
resolver.ResolveAttributes(Reads, context);
foreach (FrameExpression fe in Reads.Expressions) {
resolver.ResolveFrameExpressionTopLevel(fe, FrameExpressionUse.Reads, this);
}

resolver.ResolveAttributes(Mod, new ResolutionContext(this, false));
resolver.ResolveAttributes(Mod, context);
foreach (FrameExpression fe in Mod.Expressions) {
resolver.ResolveFrameExpressionTopLevel(fe, FrameExpressionUse.Modifies, this);
}

resolver.ResolveAttributes(Decreases, new ResolutionContext(this, false));
resolver.ResolveAttributes(Decreases, context);
foreach (Expression e in Decreases.Expressions) {
resolver.ResolveExpression(e, new ResolutionContext(this, this is TwoStateLemma));
resolver.ResolveExpression(e, resolutionContext);
// any type is fine
}

Expand All @@ -335,8 +333,9 @@ public class Method : MethodOrFunction, TypeParameter.ParentType,

// ... continue resolving specification
foreach (AttributedExpression e in Ens) {
resolver.ResolveAttributes(e, new ResolutionContext(this, true));
resolver.ResolveExpression(e.E, new ResolutionContext(this, true));
var ensuresContext = new ResolutionContext(this, true, false);
resolver.ResolveAttributes(e, ensuresContext);
resolver.ResolveExpression(e.E, ensuresContext);
Contract.Assert(e.E.Type != null); // follows from postcondition of ResolveExpression
resolver.ConstrainTypeExprBool(e.E, "Postcondition must be a boolean (got {0})");
}
Expand Down Expand Up @@ -370,7 +369,7 @@ public class Method : MethodOrFunction, TypeParameter.ParentType,
}

// attributes are allowed to mention both in- and out-parameters (including the implicit _k, for greatest lemmas)
resolver.ResolveAttributes(this, new ResolutionContext(this, this is TwoStateLemma), true);
resolver.ResolveAttributes(this, resolutionContext, true);

resolver.Options.WarnShadowing = warnShadowingOption; // restore the original warnShadowing value
resolver.scope.PopMarker(); // for the out-parameters and outermost-level locals
Expand Down
4 changes: 3 additions & 1 deletion Source/DafnyCore/AST/Members/MethodOrFunction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ public abstract class MethodOrFunction : MemberDecl {
static MethodOrFunction() {
DooFile.RegisterLibraryCheck(AllowExternalContracts, OptionCompatibility.OptionLibraryImpliesLocalError);
}


public bool IsBlind { get; set; }
public readonly List<TypeParameter> TypeArgs;
public readonly List<AttributedExpression> Req;
public readonly List<AttributedExpression> Ens;
Expand All @@ -39,6 +40,7 @@ public abstract class MethodOrFunction : MemberDecl {
this.Decreases = cloner.CloneSpecExpr(original.Decreases);
this.Ens = original.Ens.ConvertAll(cloner.CloneAttributedExpr);
this.Ins = original.Ins.ConvertAll(p => cloner.CloneFormal(p, false));
IsBlind = original.IsBlind;
}

protected abstract bool Bodyless { get; }
Expand Down
2 changes: 1 addition & 1 deletion Source/DafnyCore/AST/Modules/ModuleDefinition.cs
Original file line number Diff line number Diff line change
Expand Up @@ -464,7 +464,7 @@ public class ModuleDefinition : RangeNode, IAttributeBearingDeclaration, IClonea

resolver.scope.PushMarker();
resolver.scope.AllowInstance = false;
resolver.ResolveAttributes(this, new ResolutionContext(new NoContext(EnclosingModule), false), true); // Must follow ResolveTopLevelDecls_Signatures, in case attributes refer to members
resolver.ResolveAttributes(this, new ResolutionContext(new NoContext(EnclosingModule), false, false), true); // Must follow ResolveTopLevelDecls_Signatures, in case attributes refer to members
resolver.scope.PopMarker();

if (resolver.reporter.Count(ErrorLevel.Error) == prevErrorCount) {
Expand Down
3 changes: 2 additions & 1 deletion Source/DafnyCore/CompileNestedMatch/MatchFlattener.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ public MatchFlattener(ErrorReporter reporter, FreshIdGenerator idGenerator)
}

if (node is ICallable callable) {
resolutionContext = new ResolutionContext(callable, false);
// TODO investigate why the match flattener needs a resolution context.
resolutionContext = new ResolutionContext(callable, false, false);
}

if (node is NestedMatchStmt nestedMatchStmt) {
Expand Down
17 changes: 10 additions & 7 deletions Source/DafnyCore/Dafny.atg
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,7 @@ DeclModifier<ref DeclModifierData dmod>
| "ghost" (. dmod.IsGhost = true; CheckAndSetToken(ref dmod.GhostToken); CheckAndSetTokenOnce(ref dmod.FirstToken); .)
| "static" (. dmod.IsStatic = true; CheckAndSetToken(ref dmod.StaticToken); CheckAndSetTokenOnce(ref dmod.FirstToken); .)
| "opaque" (. dmod.IsOpaque = true; CheckAndSetToken(ref dmod.OpaqueToken); CheckAndSetTokenOnce(ref dmod.FirstToken); .)
| "blind" (. dmod.IsBlind = true; CheckAndSetToken(ref dmod.BlindToken); CheckAndSetTokenOnce(ref dmod.FirstToken); .)
)
.

Expand Down Expand Up @@ -1172,13 +1173,11 @@ MethodDecl<DeclModifierData dmod, bool allowConstructor, out Method/*!*/ m>
IToken tokenWithTrailingDocString = Token.NoToken;
IToken bodyStart = Token.NoToken;
IToken bodyEnd = Token.NoToken;
bool isBlind = false;
AllowedDeclModifiers allowed = AllowedDeclModifiers.None;
string caption = "";
ExtremePredicate.KType kType = ExtremePredicate.KType.Unspecified;
.)
SYNC
[ "blind" ] (. isBlind = true; .)
( "method" (. isPlainOlMethod = true; caption = "method";
CheckAndSetTokenOnce(ref dmod.FirstToken);
allowed = AllowedDeclModifiers.Ghost | AllowedDeclModifiers.Static; .)
Expand Down Expand Up @@ -1276,9 +1275,9 @@ MethodDecl<DeclModifierData dmod, bool allowConstructor, out Method/*!*/ m>
m = new Method(range, name, dmod.IsStatic, dmod.IsGhost, typeArgs, ins, outs,
req, new Specification<FrameExpression>(reads, readsAttrs),
new Specification<FrameExpression>(mod, modAttrs), ens,
new Specification<Expression>(dec, decAttrs), body, attrs, signatureEllipsis,
isBlind: isBlind);
new Specification<Expression>(dec, decAttrs), body, attrs, signatureEllipsis);
}
m.IsBlind = dmod.IsBlind;
m.BodyStartTok = bodyStart;
m.TokenWithTrailingDocString = tokenWithTrailingDocString;
.)
Expand Down Expand Up @@ -1984,15 +1983,18 @@ FunctionDecl<DeclModifierData dmod, out Function/*!*/ f>
if (isTwoState && isPredicate) {
Contract.Assert(functionMethodToken == null && !dmod.IsGhost);
f = new TwoStatePredicate(range, name, dmod.IsStatic, dmod.IsOpaque, typeArgs, formals, result,
reqs, new Specification<FrameExpression>(reads, readsAttrs), ens, new Specification<Expression>(decreases, decAttrs), body, attrs, signatureEllipsis);
reqs, new Specification<FrameExpression>(reads, readsAttrs), ens,
new Specification<Expression>(decreases, decAttrs), body, attrs, signatureEllipsis);
} else if (isTwoState) {
Contract.Assert(functionMethodToken == null && !dmod.IsGhost);
f = new TwoStateFunction(range, name, dmod.IsStatic, dmod.IsOpaque, typeArgs, formals, result, returnType,
reqs, new Specification<FrameExpression>(reads, readsAttrs), ens, new Specification<Expression>(decreases, decAttrs), body, attrs, signatureEllipsis);
reqs, new Specification<FrameExpression>(reads, readsAttrs), ens,
new Specification<Expression>(decreases, decAttrs), body, attrs, signatureEllipsis);
} else if (isPredicate) {
Contract.Assert(functionMethodToken == null || !dmod.IsGhost);
f = new Predicate(range, name, dmod.IsStatic, isGhost, dmod.IsOpaque, typeArgs, formals, result,
reqs, new Specification<FrameExpression>(reads, readsAttrs), ens, new Specification<Expression>(decreases, decAttrs), body, Predicate.BodyOriginKind.OriginalOrInherited,
reqs, new Specification<FrameExpression>(reads, readsAttrs), ens,
new Specification<Expression>(decreases, decAttrs), body, Predicate.BodyOriginKind.OriginalOrInherited,
byMethodTok, byMethodBody, attrs, signatureEllipsis);
} else if (isLeastPredicate) {
Contract.Assert(functionMethodToken == null && !dmod.IsGhost);
Expand All @@ -2010,6 +2012,7 @@ FunctionDecl<DeclModifierData dmod, out Function/*!*/ f>
byMethodTok, byMethodBody,
attrs, signatureEllipsis);
}
f.IsBlind = dmod.IsBlind;
f.BodyStartTok = bodyStart;
f.TokenWithTrailingDocString = tokenWithTrailingDocString;
SystemModuleModifiers.Add(b => b.CreateArrowTypeDecl(formals.Count));
Expand Down
2 changes: 1 addition & 1 deletion Source/DafnyCore/Resolver/PreType/PreTypeResolve.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1308,7 +1308,7 @@ private PreTypeResolver(ModuleResolver resolver, PreTypeInferenceModuleState pre
}
if (f.Body != null) {
var prevErrorCount = ErrorCount;
ResolveExpression(f.Body, new ResolutionContext(f, f is TwoStateFunction));
ResolveExpression(f.Body, new ResolutionContext(f, f is TwoStateFunction, f.IsBlind));
AddSubtypeConstraint(Type2PreType(f.ResultType), f.Body.PreType, f.tok, "Function body type mismatch (expected {0}, got {1})");
Constraints.SolveAllTypeConstraints($"body of {f.WhatKind} '{f.Name}'");
}
Expand Down
4 changes: 2 additions & 2 deletions Source/DafnyCore/Resolver/ResolutionContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ public record ResolutionContext(ICodeContext CodeContext, bool IsTwoState, bool

public bool IsGhost => CodeContext.IsGhost;

public ResolutionContext(ICodeContext codeContext, bool isTwoState)
: this(codeContext, isTwoState, false, false, false, false, false) {
public ResolutionContext(ICodeContext codeContext, bool isTwoState, bool isBlind = false)
: this(codeContext, isTwoState, false, false, false, false, isBlind) {
}

/// <summary>
Expand Down
Loading