From f85172a7916b26eb78123da685286b0a2e111384 Mon Sep 17 00:00:00 2001 From: Marcel van Lohuizen Date: Tue, 4 Apr 2023 15:54:08 +0200 Subject: [PATCH] internal/core: fail on missing required only when concrete In other case it is very much an incomplete error that should be handled accordingly. Also fixes a bug reporting issue where the error for a required field that violates closedness did not get passed to the parent. Fixes #2318 Signed-off-by: Marcel van Lohuizen Change-Id: Id3c629460e137a42fc7fe5dd44f05433c170d848 Reviewed-on: https://review.gerrithub.io/c/cue-lang/cue/+/552185 Unity-Result: CUEcueckoo TryBot-Result: CUEcueckoo Reviewed-by: Roger Peppe --- cmd/cue/cmd/testdata/script/vet_req.txtar | 15 +++++++++++++++ cue/testdata/eval/required.txtar | 18 ++++++++---------- internal/core/adt/eval.go | 2 +- internal/core/validate/validate.go | 2 +- 4 files changed, 25 insertions(+), 12 deletions(-) create mode 100644 cmd/cue/cmd/testdata/script/vet_req.txtar diff --git a/cmd/cue/cmd/testdata/script/vet_req.txtar b/cmd/cue/cmd/testdata/script/vet_req.txtar new file mode 100644 index 00000000000..7b21a649975 --- /dev/null +++ b/cmd/cue/cmd/testdata/script/vet_req.txtar @@ -0,0 +1,15 @@ +! exec cue vet in.cue +cmp stdout expect-stdout1 +cmp stderr expect-stderr1 + +exec cue vet -c=false in.cue +cmp stdout expect-stdout2 +cmp stderr expect-stderr2 + +-- in.cue -- +x!: string +-- expect-stdout1 -- +-- expect-stderr1 -- +some instances are incomplete; use the -c flag to show errors or suppress this message +-- expect-stdout2 -- +-- expect-stderr2 -- diff --git a/cue/testdata/eval/required.txtar b/cue/testdata/eval/required.txtar index 9e11124a05c..2a6fdeafbbc 100644 --- a/cue/testdata/eval/required.txtar +++ b/cue/testdata/eval/required.txtar @@ -111,13 +111,8 @@ Unifications: 27 Conjuncts: 40 Disjuncts: 28 -- out/eval -- -Errors: -self.t2.a: field is required but not present -unify.t2.p1.a: field is required but not present -unify.t2.p2.a: field is required but not present - -Result: -(struct){ +(_|_){ + // [eval] self: (struct){ t1: (struct){ a?: (int){ int } @@ -149,9 +144,12 @@ Result: a!: (int){ int } } } - allowed: (struct){ - issue2306: (struct){ - #A: (#struct){ + allowed: (_|_){ + // [eval] + issue2306: (_|_){ + // [eval] + #A: (_|_){ + // [eval] a!: (_|_){ // [eval] allowed.issue2306.#A.a: field not allowed: // ./in.cue:34:6 diff --git a/internal/core/adt/eval.go b/internal/core/adt/eval.go index 92eef33e5da..ec491ca5725 100644 --- a/internal/core/adt/eval.go +++ b/internal/core/adt/eval.go @@ -780,7 +780,7 @@ func (n *nodeContext) completeArcs(state vertexStatus) { // Errors are allowed in let fields. Handle errors and failure to // complete accordingly. - if !a.Label.IsLet() && a.ArcType == ArcMember { + if !a.Label.IsLet() && a.ArcType <= ArcRequired { // Don't set the state to Finalized if the child arcs are not done. if state == finalized && a.status < finalized { state = conjuncts diff --git a/internal/core/validate/validate.go b/internal/core/validate/validate.go index 66cae481b1c..8816928af11 100644 --- a/internal/core/validate/validate.go +++ b/internal/core/validate/validate.go @@ -98,7 +98,7 @@ func (v *validator) validate(x *adt.Vertex) { } for _, a := range x.Arcs { - if a.ArcType == adt.ArcRequired && v.inDefinition == 0 { + if a.ArcType == adt.ArcRequired && v.Concrete { v.add(adt.NewRequiredNotPresentError(v.ctx, a)) continue }