internal/core/validate: use defaults in concrete mode

Change-Id: Ib9275fe6bfccc272d142b853ae7b6d6555a63098
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/6654
Reviewed-by: CUE cueckoo <cueckoo@gmail.com>
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/internal/core/validate/validate.go b/internal/core/validate/validate.go
index ecf85fb..c0a5479 100644
--- a/internal/core/validate/validate.go
+++ b/internal/core/validate/validate.go
@@ -82,12 +82,14 @@
 			return
 		}
 
-	} else if v.Concrete && v.inDefinition == 0 && !adt.IsConcrete(x) {
-		// TODO: use ValueError to get full path.
-		v.add(&adt.Bottom{
-			Code: adt.IncompleteError,
-			Err:  v.ctx.Newf("incomplete value %v", v.ctx.Str(x.Value)),
-		})
+	} else if v.Concrete && v.inDefinition == 0 {
+		x := x.Default()
+		if !adt.IsConcrete(x) {
+			v.add(&adt.Bottom{
+				Code: adt.IncompleteError,
+				Err:  v.ctx.Newf("incomplete value %v", v.ctx.Str(x.Value)),
+			})
+		}
 	}
 
 	for _, a := range x.Arcs {
diff --git a/internal/core/validate/validate_test.go b/internal/core/validate/validate_test.go
index 4813ef5..3d0e0df 100644
--- a/internal/core/validate/validate_test.go
+++ b/internal/core/validate/validate_test.go
@@ -143,6 +143,12 @@
 		x: 1 & 2
 		`,
 		out: "eval\nx: incompatible values 2 and 1",
+	}, {
+		desc: "consider defaults for concreteness",
+		cfg:  &Config{Concrete: true},
+		in: `
+		x: *1 | 2
+		`,
 	}}
 
 	r := runtime.New()