cuelang.org/go@v0.10.1/cue/testdata/cycle/freeze.txtar (about)

     1  // This files tests that values are properly "frozen" in case of mutual
     2  // references. Non-structural cyclic references are okay, as long a property
     3  // that is dependended upon in the cycle is not changed after the fact,
     4  // that is, a value may not become more specific after it is used.
     5  -- in.cue --
     6  freezing: t1: ok: {
     7  	#a: x: "a"
     8  	len(#a) // 1
     9  }
    10  
    11  -- comprehension.cue --
    12  // This should be an incomplete error, as z is inserted in x, over which the
    13  // comprehension loops. Adding a field z to x would fix this.
    14  // This test would fail in the old evaluator, depending on ordering.
    15  comprehension: t1: _
    16  comprehension: t1: ok: p0: {
    17  	x: y: {}
    18  	// order of comprehensions matter in old evaluator.
    19  	for _ in x {
    20  		if true { x: z: a: {} }
    21  	}
    22  	if true {
    23  		if true { x: z: a: {} }
    24  	}
    25  }
    26  
    27  comprehension: t1: ok: p1: {
    28  	for _ in x {
    29  		if true { x: z: a: {} }
    30  	}
    31  	x: y: {}
    32  	if true {
    33  		if true { x: z: a: {} }
    34  	}
    35  }
    36  
    37  comprehension: t1: ok: p2: {
    38  	for _ in x {
    39  		if true { x: z: a: {} }
    40  	}
    41  	if true {
    42  		if true { x: z: a: {} }
    43  	}
    44  	x: y: {}
    45  }
    46  
    47  comprehension: t1: ok: p3: {
    48  	x: y: {}
    49  	if true {
    50  		if true { x: z: a: {} }
    51  	}
    52  	for _ in x {
    53  		if true { x: z: a: {} }
    54  	}
    55  }
    56  
    57  comprehension: t1: ok: p4: {
    58  	if true {
    59  		if true { x: z: a: {} }
    60  	}
    61  	x: y: {}
    62  	for _ in x {
    63  		if true { x: z: a: {} }
    64  	}
    65  }
    66  
    67  comprehension: t1: ok: p5: {
    68  	if true {
    69  		if true { x: z: a: {} }
    70  	}
    71  	for _ in x {
    72  		if true { x: z: a: {} }
    73  	}
    74  	x: y: {}
    75  }
    76  
    77  
    78  comprehension: t2: err: {
    79  	a: {
    80  		x: 1
    81  		for k, v in a {
    82  			(k+"q"): v // This increases the set of fields in a.
    83  		}
    84  	}
    85  }
    86  
    87  comprehension: t3: err: {
    88  	// mutual dependencies not okay in this case, as the set of fields grows.
    89  	a: x: 1
    90  	b: y: 1
    91  	a: {
    92  		for k, v in b {
    93  			(k+"q"): v
    94  		}
    95  	}
    96  	b: {
    97  		for k, v in a {
    98  			(k): v
    99  		}
   100  	}
   101  }
   102  
   103  comprehension: t4: ok: {
   104  	// It is okay to make x more specific as long as no fields are added.
   105  	x: y: {}
   106  	for _ in x {
   107  		if true { x: y: a: {} }
   108  	}
   109  }
   110  
   111  comprehension: moreSpecific: ok: {
   112  	a: {
   113  		x: int
   114  		for k, v in a {
   115  			(k): 1
   116  		}
   117  	}
   118  }
   119  
   120  comprehension: moreSpecific: err: {
   121  	a: {
   122  		x: {y: 1}
   123  		// len(v) should free the size of x.
   124  		for k, v in a if len(v) > 0 {
   125  			(k): {z: 1}
   126  		}
   127  	}
   128  }
   129  -- out/eval/stats --
   130  Leaks:  0
   131  Freed:  67
   132  Reused: 59
   133  Allocs: 8
   134  Retain: 12
   135  
   136  Unifications: 67
   137  Conjuncts:    119
   138  Disjuncts:    76
   139  -- out/evalalpha --
   140  Errors:
   141  comprehension.t2.err.a: adding field xq not allowed as field set was already referenced:
   142      ./comprehension.cue:71:13
   143  comprehension.t3.err.a: adding field xq not allowed as field set was already referenced:
   144      ./comprehension.cue:82:13
   145  comprehension.moreSpecific.err.a.x: adding field z not allowed as field set was already referenced:
   146      ./comprehension.cue:114:9
   147  
   148  Result:
   149  (_|_){
   150    // [eval]
   151    comprehension: (_|_){
   152      // [eval]
   153      t1: (struct){
   154        ok: (struct){
   155          p0: (_|_){
   156            // [incomplete] comprehension.t1.ok.p0.x.z: cyclic reference to field z:
   157            //     ./comprehension.cue:9:3
   158            // comprehension.t1.ok.p0.x.z.a: cyclic reference to field z:
   159            //     ./comprehension.cue:12:3
   160            x: (struct){
   161              y: (struct){
   162              }
   163            }
   164          }
   165          p1: (_|_){
   166            // [incomplete] comprehension.t1.ok.p1.x.z: cyclic reference to field z:
   167            //     ./comprehension.cue:18:3
   168            // comprehension.t1.ok.p1.x.z.a: cyclic reference to field z:
   169            //     ./comprehension.cue:22:3
   170            x: (struct){
   171              y: (struct){
   172              }
   173            }
   174          }
   175          p2: (_|_){
   176            // [incomplete] comprehension.t1.ok.p2.x.z: cyclic reference to field z:
   177            //     ./comprehension.cue:28:3
   178            // comprehension.t1.ok.p2.x.z.a: cyclic reference to field z:
   179            //     ./comprehension.cue:31:3
   180            x: (struct){
   181              y: (struct){
   182              }
   183            }
   184          }
   185          p3: (_|_){
   186            // [incomplete] comprehension.t1.ok.p3.x.z.a: cyclic reference to field z:
   187            //     ./comprehension.cue:39:3
   188            // comprehension.t1.ok.p3.x.z: cyclic reference to field z:
   189            //     ./comprehension.cue:42:3
   190            x: (struct){
   191              y: (struct){
   192              }
   193            }
   194          }
   195          p4: (_|_){
   196            // [incomplete] comprehension.t1.ok.p4.x.z.a: cyclic reference to field z:
   197            //     ./comprehension.cue:48:3
   198            // comprehension.t1.ok.p4.x.z: cyclic reference to field z:
   199            //     ./comprehension.cue:52:3
   200            x: (struct){
   201              y: (struct){
   202              }
   203            }
   204          }
   205          p5: (_|_){
   206            // [incomplete] comprehension.t1.ok.p5.x.z.a: cyclic reference to field z:
   207            //     ./comprehension.cue:58:3
   208            // comprehension.t1.ok.p5.x.z: cyclic reference to field z:
   209            //     ./comprehension.cue:61:3
   210            x: (struct){
   211              y: (struct){
   212              }
   213            }
   214          }
   215        }
   216      }
   217      t2: (_|_){
   218        // [eval]
   219        err: (_|_){
   220          // [eval]
   221          a: (_|_){
   222            // [eval] comprehension.t2.err.a: adding field xq not allowed as field set was already referenced:
   223            //     ./comprehension.cue:71:13
   224            x: (int){ 1 }
   225          }
   226        }
   227      }
   228      t3: (_|_){
   229        // [eval]
   230        err: (_|_){
   231          // [eval]
   232          a: (_|_){
   233            // [eval] comprehension.t3.err.a: adding field xq not allowed as field set was already referenced:
   234            //     ./comprehension.cue:82:13
   235            x: (int){ 1 }
   236          }
   237          b: (struct){
   238            y: (int){ 1 }
   239            x: (int){ 1 }
   240          }
   241        }
   242      }
   243      t4: (struct){
   244        ok: (struct){
   245          x: (struct){
   246            y: (struct){
   247              a: (struct){
   248              }
   249            }
   250          }
   251        }
   252      }
   253      moreSpecific: (_|_){
   254        // [eval]
   255        ok: (struct){
   256          a: (struct){
   257            x: (int){ 1 }
   258          }
   259        }
   260        err: (_|_){
   261          // [eval]
   262          a: (_|_){
   263            // [eval] comprehension.moreSpecific.err.a.x: adding field z not allowed as field set was already referenced:
   264            //     ./comprehension.cue:114:9
   265            x: (struct){
   266              y: (int){ 1 }
   267            }
   268          }
   269        }
   270      }
   271    }
   272    freezing: (struct){
   273      t1: (struct){
   274        ok: (int){
   275          1
   276          #a: (#struct){
   277            x: (string){ "a" }
   278          }
   279        }
   280      }
   281    }
   282  }
   283  -- diff/-out/evalalpha<==>+out/eval --
   284  diff old new
   285  --- old
   286  +++ new
   287  @@ -1,11 +1,10 @@
   288   Errors:
   289  -comprehension.moreSpecific.err.a: field z not allowed by earlier comprehension or reference cycle
   290  -comprehension.t1.ok.p0.x: field z not allowed by earlier comprehension or reference cycle
   291  -comprehension.t1.ok.p1.x: field z not allowed by earlier comprehension or reference cycle
   292  -comprehension.t1.ok.p2.x: field z not allowed by earlier comprehension or reference cycle
   293  -comprehension.t2.err.a: field xq not allowed by earlier comprehension or reference cycle
   294  -comprehension.t3.err.b: field x not allowed by earlier comprehension or reference cycle
   295  -comprehension.t3.err.b: field yq not allowed by earlier comprehension or reference cycle
   296  +comprehension.t2.err.a: adding field xq not allowed as field set was already referenced:
   297  +    ./comprehension.cue:71:13
   298  +comprehension.t3.err.a: adding field xq not allowed as field set was already referenced:
   299  +    ./comprehension.cue:82:13
   300  +comprehension.moreSpecific.err.a.x: adding field z not allowed as field set was already referenced:
   301  +    ./comprehension.cue:114:9
   302   
   303   Result:
   304   (_|_){
   305  @@ -12,73 +11,65 @@
   306     // [eval]
   307     comprehension: (_|_){
   308       // [eval]
   309  -    t1: (_|_){
   310  -      // [eval]
   311  -      ok: (_|_){
   312  -        // [eval]
   313  +    t1: (struct){
   314  +      ok: (struct){
   315           p0: (_|_){
   316  -          // [eval]
   317  -          x: (_|_){
   318  -            // [eval] comprehension.t1.ok.p0.x: field z not allowed by earlier comprehension or reference cycle
   319  -            y: (struct){
   320  -            }
   321  -            z: (struct){
   322  -              a: (struct){
   323  -              }
   324  +          // [incomplete] comprehension.t1.ok.p0.x.z: cyclic reference to field z:
   325  +          //     ./comprehension.cue:9:3
   326  +          // comprehension.t1.ok.p0.x.z.a: cyclic reference to field z:
   327  +          //     ./comprehension.cue:12:3
   328  +          x: (struct){
   329  +            y: (struct){
   330               }
   331             }
   332           }
   333           p1: (_|_){
   334  -          // [eval]
   335  -          x: (_|_){
   336  -            // [eval] comprehension.t1.ok.p1.x: field z not allowed by earlier comprehension or reference cycle
   337  -            y: (struct){
   338  -            }
   339  -            z: (struct){
   340  -              a: (struct){
   341  -              }
   342  +          // [incomplete] comprehension.t1.ok.p1.x.z: cyclic reference to field z:
   343  +          //     ./comprehension.cue:18:3
   344  +          // comprehension.t1.ok.p1.x.z.a: cyclic reference to field z:
   345  +          //     ./comprehension.cue:22:3
   346  +          x: (struct){
   347  +            y: (struct){
   348               }
   349             }
   350           }
   351           p2: (_|_){
   352  -          // [eval]
   353  -          x: (_|_){
   354  -            // [eval] comprehension.t1.ok.p2.x: field z not allowed by earlier comprehension or reference cycle
   355  -            y: (struct){
   356  -            }
   357  -            z: (struct){
   358  -              a: (struct){
   359  -              }
   360  -            }
   361  -          }
   362  -        }
   363  -        p3: (struct){
   364  -          x: (struct){
   365  -            y: (struct){
   366  -            }
   367  -            z: (struct){
   368  -              a: (struct){
   369  -              }
   370  -            }
   371  -          }
   372  -        }
   373  -        p4: (struct){
   374  -          x: (struct){
   375  -            y: (struct){
   376  -            }
   377  -            z: (struct){
   378  -              a: (struct){
   379  -              }
   380  -            }
   381  -          }
   382  -        }
   383  -        p5: (struct){
   384  -          x: (struct){
   385  -            y: (struct){
   386  -            }
   387  -            z: (struct){
   388  -              a: (struct){
   389  -              }
   390  +          // [incomplete] comprehension.t1.ok.p2.x.z: cyclic reference to field z:
   391  +          //     ./comprehension.cue:28:3
   392  +          // comprehension.t1.ok.p2.x.z.a: cyclic reference to field z:
   393  +          //     ./comprehension.cue:31:3
   394  +          x: (struct){
   395  +            y: (struct){
   396  +            }
   397  +          }
   398  +        }
   399  +        p3: (_|_){
   400  +          // [incomplete] comprehension.t1.ok.p3.x.z.a: cyclic reference to field z:
   401  +          //     ./comprehension.cue:39:3
   402  +          // comprehension.t1.ok.p3.x.z: cyclic reference to field z:
   403  +          //     ./comprehension.cue:42:3
   404  +          x: (struct){
   405  +            y: (struct){
   406  +            }
   407  +          }
   408  +        }
   409  +        p4: (_|_){
   410  +          // [incomplete] comprehension.t1.ok.p4.x.z.a: cyclic reference to field z:
   411  +          //     ./comprehension.cue:48:3
   412  +          // comprehension.t1.ok.p4.x.z: cyclic reference to field z:
   413  +          //     ./comprehension.cue:52:3
   414  +          x: (struct){
   415  +            y: (struct){
   416  +            }
   417  +          }
   418  +        }
   419  +        p5: (_|_){
   420  +          // [incomplete] comprehension.t1.ok.p5.x.z.a: cyclic reference to field z:
   421  +          //     ./comprehension.cue:58:3
   422  +          // comprehension.t1.ok.p5.x.z: cyclic reference to field z:
   423  +          //     ./comprehension.cue:61:3
   424  +          x: (struct){
   425  +            y: (struct){
   426               }
   427             }
   428           }
   429  @@ -89,9 +80,9 @@
   430         err: (_|_){
   431           // [eval]
   432           a: (_|_){
   433  -          // [eval] comprehension.t2.err.a: field xq not allowed by earlier comprehension or reference cycle
   434  -          x: (int){ 1 }
   435  -          xq: (int){ 1 }
   436  +          // [eval] comprehension.t2.err.a: adding field xq not allowed as field set was already referenced:
   437  +          //     ./comprehension.cue:71:13
   438  +          x: (int){ 1 }
   439           }
   440         }
   441       }
   442  @@ -99,16 +90,14 @@
   443         // [eval]
   444         err: (_|_){
   445           // [eval]
   446  -        a: (struct){
   447  -          x: (int){ 1 }
   448  -          yq: (int){ 1 }
   449  -        }
   450  -        b: (_|_){
   451  -          // [eval] comprehension.t3.err.b: field x not allowed by earlier comprehension or reference cycle
   452  -          // comprehension.t3.err.b: field yq not allowed by earlier comprehension or reference cycle
   453  +        a: (_|_){
   454  +          // [eval] comprehension.t3.err.a: adding field xq not allowed as field set was already referenced:
   455  +          //     ./comprehension.cue:82:13
   456  +          x: (int){ 1 }
   457  +        }
   458  +        b: (struct){
   459             y: (int){ 1 }
   460             x: (int){ 1 }
   461  -          yq: (int){ 1 }
   462           }
   463         }
   464       }
   465  @@ -132,10 +121,10 @@
   466         err: (_|_){
   467           // [eval]
   468           a: (_|_){
   469  -          // [eval] comprehension.moreSpecific.err.a: field z not allowed by earlier comprehension or reference cycle
   470  +          // [eval] comprehension.moreSpecific.err.a.x: adding field z not allowed as field set was already referenced:
   471  +          //     ./comprehension.cue:114:9
   472             x: (struct){
   473               y: (int){ 1 }
   474  -            z: (int){ 1 }
   475             }
   476           }
   477         }
   478  -- diff/explanation --
   479  v0.7 fixes bugs in v0.6:
   480  - t1 should be incomplete error, as it is fixable.
   481  -- out/eval --
   482  Errors:
   483  comprehension.moreSpecific.err.a: field z not allowed by earlier comprehension or reference cycle
   484  comprehension.t1.ok.p0.x: field z not allowed by earlier comprehension or reference cycle
   485  comprehension.t1.ok.p1.x: field z not allowed by earlier comprehension or reference cycle
   486  comprehension.t1.ok.p2.x: field z not allowed by earlier comprehension or reference cycle
   487  comprehension.t2.err.a: field xq not allowed by earlier comprehension or reference cycle
   488  comprehension.t3.err.b: field x not allowed by earlier comprehension or reference cycle
   489  comprehension.t3.err.b: field yq not allowed by earlier comprehension or reference cycle
   490  
   491  Result:
   492  (_|_){
   493    // [eval]
   494    comprehension: (_|_){
   495      // [eval]
   496      t1: (_|_){
   497        // [eval]
   498        ok: (_|_){
   499          // [eval]
   500          p0: (_|_){
   501            // [eval]
   502            x: (_|_){
   503              // [eval] comprehension.t1.ok.p0.x: field z not allowed by earlier comprehension or reference cycle
   504              y: (struct){
   505              }
   506              z: (struct){
   507                a: (struct){
   508                }
   509              }
   510            }
   511          }
   512          p1: (_|_){
   513            // [eval]
   514            x: (_|_){
   515              // [eval] comprehension.t1.ok.p1.x: field z not allowed by earlier comprehension or reference cycle
   516              y: (struct){
   517              }
   518              z: (struct){
   519                a: (struct){
   520                }
   521              }
   522            }
   523          }
   524          p2: (_|_){
   525            // [eval]
   526            x: (_|_){
   527              // [eval] comprehension.t1.ok.p2.x: field z not allowed by earlier comprehension or reference cycle
   528              y: (struct){
   529              }
   530              z: (struct){
   531                a: (struct){
   532                }
   533              }
   534            }
   535          }
   536          p3: (struct){
   537            x: (struct){
   538              y: (struct){
   539              }
   540              z: (struct){
   541                a: (struct){
   542                }
   543              }
   544            }
   545          }
   546          p4: (struct){
   547            x: (struct){
   548              y: (struct){
   549              }
   550              z: (struct){
   551                a: (struct){
   552                }
   553              }
   554            }
   555          }
   556          p5: (struct){
   557            x: (struct){
   558              y: (struct){
   559              }
   560              z: (struct){
   561                a: (struct){
   562                }
   563              }
   564            }
   565          }
   566        }
   567      }
   568      t2: (_|_){
   569        // [eval]
   570        err: (_|_){
   571          // [eval]
   572          a: (_|_){
   573            // [eval] comprehension.t2.err.a: field xq not allowed by earlier comprehension or reference cycle
   574            x: (int){ 1 }
   575            xq: (int){ 1 }
   576          }
   577        }
   578      }
   579      t3: (_|_){
   580        // [eval]
   581        err: (_|_){
   582          // [eval]
   583          a: (struct){
   584            x: (int){ 1 }
   585            yq: (int){ 1 }
   586          }
   587          b: (_|_){
   588            // [eval] comprehension.t3.err.b: field x not allowed by earlier comprehension or reference cycle
   589            // comprehension.t3.err.b: field yq not allowed by earlier comprehension or reference cycle
   590            y: (int){ 1 }
   591            x: (int){ 1 }
   592            yq: (int){ 1 }
   593          }
   594        }
   595      }
   596      t4: (struct){
   597        ok: (struct){
   598          x: (struct){
   599            y: (struct){
   600              a: (struct){
   601              }
   602            }
   603          }
   604        }
   605      }
   606      moreSpecific: (_|_){
   607        // [eval]
   608        ok: (struct){
   609          a: (struct){
   610            x: (int){ 1 }
   611          }
   612        }
   613        err: (_|_){
   614          // [eval]
   615          a: (_|_){
   616            // [eval] comprehension.moreSpecific.err.a: field z not allowed by earlier comprehension or reference cycle
   617            x: (struct){
   618              y: (int){ 1 }
   619              z: (int){ 1 }
   620            }
   621          }
   622        }
   623      }
   624    }
   625    freezing: (struct){
   626      t1: (struct){
   627        ok: (int){
   628          1
   629          #a: (#struct){
   630            x: (string){ "a" }
   631          }
   632        }
   633      }
   634    }
   635  }
   636  -- out/compile --
   637  --- comprehension.cue
   638  {
   639    comprehension: {
   640      t1: _
   641    }
   642    comprehension: {
   643      t1: {
   644        ok: {
   645          p0: {
   646            x: {
   647              y: {}
   648            }
   649            for _, _ in 〈0;x〉 {
   650              if true {
   651                x: {
   652                  z: {
   653                    a: {}
   654                  }
   655                }
   656              }
   657            }
   658            if true {
   659              if true {
   660                x: {
   661                  z: {
   662                    a: {}
   663                  }
   664                }
   665              }
   666            }
   667          }
   668        }
   669      }
   670    }
   671    comprehension: {
   672      t1: {
   673        ok: {
   674          p1: {
   675            for _, _ in 〈0;x〉 {
   676              if true {
   677                x: {
   678                  z: {
   679                    a: {}
   680                  }
   681                }
   682              }
   683            }
   684            x: {
   685              y: {}
   686            }
   687            if true {
   688              if true {
   689                x: {
   690                  z: {
   691                    a: {}
   692                  }
   693                }
   694              }
   695            }
   696          }
   697        }
   698      }
   699    }
   700    comprehension: {
   701      t1: {
   702        ok: {
   703          p2: {
   704            for _, _ in 〈0;x〉 {
   705              if true {
   706                x: {
   707                  z: {
   708                    a: {}
   709                  }
   710                }
   711              }
   712            }
   713            if true {
   714              if true {
   715                x: {
   716                  z: {
   717                    a: {}
   718                  }
   719                }
   720              }
   721            }
   722            x: {
   723              y: {}
   724            }
   725          }
   726        }
   727      }
   728    }
   729    comprehension: {
   730      t1: {
   731        ok: {
   732          p3: {
   733            x: {
   734              y: {}
   735            }
   736            if true {
   737              if true {
   738                x: {
   739                  z: {
   740                    a: {}
   741                  }
   742                }
   743              }
   744            }
   745            for _, _ in 〈0;x〉 {
   746              if true {
   747                x: {
   748                  z: {
   749                    a: {}
   750                  }
   751                }
   752              }
   753            }
   754          }
   755        }
   756      }
   757    }
   758    comprehension: {
   759      t1: {
   760        ok: {
   761          p4: {
   762            if true {
   763              if true {
   764                x: {
   765                  z: {
   766                    a: {}
   767                  }
   768                }
   769              }
   770            }
   771            x: {
   772              y: {}
   773            }
   774            for _, _ in 〈0;x〉 {
   775              if true {
   776                x: {
   777                  z: {
   778                    a: {}
   779                  }
   780                }
   781              }
   782            }
   783          }
   784        }
   785      }
   786    }
   787    comprehension: {
   788      t1: {
   789        ok: {
   790          p5: {
   791            if true {
   792              if true {
   793                x: {
   794                  z: {
   795                    a: {}
   796                  }
   797                }
   798              }
   799            }
   800            for _, _ in 〈0;x〉 {
   801              if true {
   802                x: {
   803                  z: {
   804                    a: {}
   805                  }
   806                }
   807              }
   808            }
   809            x: {
   810              y: {}
   811            }
   812          }
   813        }
   814      }
   815    }
   816    comprehension: {
   817      t2: {
   818        err: {
   819          a: {
   820            x: 1
   821            for k, v in 〈1;a〉 {
   822              (〈1;k〉 + "q"): 〈1;v〉
   823            }
   824          }
   825        }
   826      }
   827    }
   828    comprehension: {
   829      t3: {
   830        err: {
   831          a: {
   832            x: 1
   833          }
   834          b: {
   835            y: 1
   836          }
   837          a: {
   838            for k, v in 〈1;b〉 {
   839              (〈1;k〉 + "q"): 〈1;v〉
   840            }
   841          }
   842          b: {
   843            for k, v in 〈1;a〉 {
   844              〈1;k〉: 〈1;v〉
   845            }
   846          }
   847        }
   848      }
   849    }
   850    comprehension: {
   851      t4: {
   852        ok: {
   853          x: {
   854            y: {}
   855          }
   856          for _, _ in 〈0;x〉 {
   857            if true {
   858              x: {
   859                y: {
   860                  a: {}
   861                }
   862              }
   863            }
   864          }
   865        }
   866      }
   867    }
   868    comprehension: {
   869      moreSpecific: {
   870        ok: {
   871          a: {
   872            x: int
   873            for k, v in 〈1;a〉 {
   874              〈1;k〉: 1
   875            }
   876          }
   877        }
   878      }
   879    }
   880    comprehension: {
   881      moreSpecific: {
   882        err: {
   883          a: {
   884            x: {
   885              y: 1
   886            }
   887            for k, v in 〈1;a〉 if (len(〈0;v〉) > 0) {
   888              〈1;k〉: {
   889                z: 1
   890              }
   891            }
   892          }
   893        }
   894      }
   895    }
   896  }
   897  --- in.cue
   898  {
   899    freezing: {
   900      t1: {
   901        ok: {
   902          #a: {
   903            x: "a"
   904          }
   905          len(〈0;#a〉)
   906        }
   907      }
   908    }
   909  }