cuelang.org/go@v0.13.0/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  -- issue3178.cue --
   130  issue3178: {
   131  	// This should pass. Reasoning:
   132  	// - second comprehension runs
   133  	// - in order to satisfy, first comprehension must run
   134  	// - first comprehension runs and completes
   135  	input: [ "Value" ]
   136  	output: {...}
   137  	for name in input {
   138  			output: "\(name)": true
   139  	}
   140  	for name, v in output {
   141  	}
   142  }
   143  -- out/eval/stats --
   144  Leaks:  14
   145  Freed:  58
   146  Reused: 51
   147  Allocs: 21
   148  Retain: 15
   149  
   150  Unifications: 72
   151  Conjuncts:    127
   152  Disjuncts:    83
   153  -- out/evalalpha --
   154  Errors:
   155  comprehension.t2.err.a: adding field xq not allowed as field set was already referenced:
   156      ./comprehension.cue:71:13
   157  comprehension.t3.err.a: adding field xq not allowed as field set was already referenced:
   158      ./comprehension.cue:82:13
   159  comprehension.moreSpecific.err.a.x: adding field z not allowed as field set was already referenced:
   160      ./comprehension.cue:114:9
   161  
   162  Result:
   163  (_|_){
   164    // [eval]
   165    comprehension: (_|_){
   166      // [eval]
   167      t1: (struct){
   168        ok: (struct){
   169          p0: (struct){
   170            x: (struct){
   171              y: (struct){
   172              }
   173              z: (struct){
   174                a: (struct){
   175                }
   176              }
   177            }
   178          }
   179          p1: (struct){
   180            x: (struct){
   181              y: (struct){
   182              }
   183              z: (struct){
   184                a: (struct){
   185                }
   186              }
   187            }
   188          }
   189          p2: (struct){
   190            x: (struct){
   191              y: (struct){
   192              }
   193              z: (struct){
   194                a: (struct){
   195                }
   196              }
   197            }
   198          }
   199          p3: (struct){
   200            x: (struct){
   201              y: (struct){
   202              }
   203              z: (struct){
   204                a: (struct){
   205                }
   206              }
   207            }
   208          }
   209          p4: (struct){
   210            x: (struct){
   211              y: (struct){
   212              }
   213              z: (struct){
   214                a: (struct){
   215                }
   216              }
   217            }
   218          }
   219          p5: (struct){
   220            x: (struct){
   221              y: (struct){
   222              }
   223              z: (struct){
   224                a: (struct){
   225                }
   226              }
   227            }
   228          }
   229        }
   230      }
   231      t2: (_|_){
   232        // [eval]
   233        err: (_|_){
   234          // [eval]
   235          a: (_|_){
   236            // [eval] comprehension.t2.err.a: adding field xq not allowed as field set was already referenced:
   237            //     ./comprehension.cue:71:13
   238            x: (int){ 1 }
   239          }
   240        }
   241      }
   242      t3: (_|_){
   243        // [eval]
   244        err: (_|_){
   245          // [eval]
   246          a: (_|_){
   247            // [eval] comprehension.t3.err.a: adding field xq not allowed as field set was already referenced:
   248            //     ./comprehension.cue:82:13
   249            x: (int){ 1 }
   250          }
   251          b: (struct){
   252            y: (int){ 1 }
   253            x: (int){ 1 }
   254          }
   255        }
   256      }
   257      t4: (struct){
   258        ok: (struct){
   259          x: (struct){
   260            y: (struct){
   261              a: (struct){
   262              }
   263            }
   264          }
   265        }
   266      }
   267      moreSpecific: (_|_){
   268        // [eval]
   269        ok: (struct){
   270          a: (struct){
   271            x: (int){ 1 }
   272          }
   273        }
   274        err: (_|_){
   275          // [eval]
   276          a: (_|_){
   277            // [eval] comprehension.moreSpecific.err.a.x: adding field z not allowed as field set was already referenced:
   278            //     ./comprehension.cue:114:9
   279            x: (struct){
   280              y: (int){ 1 }
   281            }
   282          }
   283        }
   284      }
   285    }
   286    freezing: (struct){
   287      t1: (struct){
   288        ok: (int){
   289          1
   290          #a: (#struct){
   291            x: (string){ "a" }
   292          }
   293        }
   294      }
   295    }
   296    issue3178: (struct){
   297      input: (#list){
   298        0: (string){ "Value" }
   299      }
   300      output: (struct){
   301        Value: (bool){ true }
   302      }
   303    }
   304  }
   305  -- diff/-out/evalalpha<==>+out/eval --
   306  diff old new
   307  --- old
   308  +++ new
   309  @@ -1,11 +1,10 @@
   310   Errors:
   311  -comprehension.moreSpecific.err.a: field z not allowed by earlier comprehension or reference cycle
   312  -comprehension.t1.ok.p0.x: field z not allowed by earlier comprehension or reference cycle
   313  -comprehension.t1.ok.p1.x: field z not allowed by earlier comprehension or reference cycle
   314  -comprehension.t1.ok.p2.x: field z not allowed by earlier comprehension or reference cycle
   315  -comprehension.t2.err.a: field xq not allowed by earlier comprehension or reference cycle
   316  -comprehension.t3.err.b: field x not allowed by earlier comprehension or reference cycle
   317  -comprehension.t3.err.b: field yq not allowed by earlier comprehension or reference cycle
   318  +comprehension.t2.err.a: adding field xq not allowed as field set was already referenced:
   319  +    ./comprehension.cue:71:13
   320  +comprehension.t3.err.a: adding field xq not allowed as field set was already referenced:
   321  +    ./comprehension.cue:82:13
   322  +comprehension.moreSpecific.err.a.x: adding field z not allowed as field set was already referenced:
   323  +    ./comprehension.cue:114:9
   324   
   325   Result:
   326   (_|_){
   327  @@ -12,38 +11,30 @@
   328     // [eval]
   329     comprehension: (_|_){
   330       // [eval]
   331  -    t1: (_|_){
   332  -      // [eval]
   333  -      ok: (_|_){
   334  -        // [eval]
   335  -        p0: (_|_){
   336  -          // [eval]
   337  -          x: (_|_){
   338  -            // [eval] comprehension.t1.ok.p0.x: field z not allowed by earlier comprehension or reference cycle
   339  -            y: (struct){
   340  -            }
   341  -            z: (struct){
   342  -              a: (struct){
   343  -              }
   344  -            }
   345  -          }
   346  -        }
   347  -        p1: (_|_){
   348  -          // [eval]
   349  -          x: (_|_){
   350  -            // [eval] comprehension.t1.ok.p1.x: field z not allowed by earlier comprehension or reference cycle
   351  -            y: (struct){
   352  -            }
   353  -            z: (struct){
   354  -              a: (struct){
   355  -              }
   356  -            }
   357  -          }
   358  -        }
   359  -        p2: (_|_){
   360  -          // [eval]
   361  -          x: (_|_){
   362  -            // [eval] comprehension.t1.ok.p2.x: field z not allowed by earlier comprehension or reference cycle
   363  +    t1: (struct){
   364  +      ok: (struct){
   365  +        p0: (struct){
   366  +          x: (struct){
   367  +            y: (struct){
   368  +            }
   369  +            z: (struct){
   370  +              a: (struct){
   371  +              }
   372  +            }
   373  +          }
   374  +        }
   375  +        p1: (struct){
   376  +          x: (struct){
   377  +            y: (struct){
   378  +            }
   379  +            z: (struct){
   380  +              a: (struct){
   381  +              }
   382  +            }
   383  +          }
   384  +        }
   385  +        p2: (struct){
   386  +          x: (struct){
   387               y: (struct){
   388               }
   389               z: (struct){
   390  @@ -89,9 +80,9 @@
   391         err: (_|_){
   392           // [eval]
   393           a: (_|_){
   394  -          // [eval] comprehension.t2.err.a: field xq not allowed by earlier comprehension or reference cycle
   395  -          x: (int){ 1 }
   396  -          xq: (int){ 1 }
   397  +          // [eval] comprehension.t2.err.a: adding field xq not allowed as field set was already referenced:
   398  +          //     ./comprehension.cue:71:13
   399  +          x: (int){ 1 }
   400           }
   401         }
   402       }
   403  @@ -99,16 +90,14 @@
   404         // [eval]
   405         err: (_|_){
   406           // [eval]
   407  -        a: (struct){
   408  -          x: (int){ 1 }
   409  -          yq: (int){ 1 }
   410  -        }
   411  -        b: (_|_){
   412  -          // [eval] comprehension.t3.err.b: field x not allowed by earlier comprehension or reference cycle
   413  -          // comprehension.t3.err.b: field yq not allowed by earlier comprehension or reference cycle
   414  +        a: (_|_){
   415  +          // [eval] comprehension.t3.err.a: adding field xq not allowed as field set was already referenced:
   416  +          //     ./comprehension.cue:82:13
   417  +          x: (int){ 1 }
   418  +        }
   419  +        b: (struct){
   420             y: (int){ 1 }
   421             x: (int){ 1 }
   422  -          yq: (int){ 1 }
   423           }
   424         }
   425       }
   426  @@ -132,10 +121,10 @@
   427         err: (_|_){
   428           // [eval]
   429           a: (_|_){
   430  -          // [eval] comprehension.moreSpecific.err.a: field z not allowed by earlier comprehension or reference cycle
   431  +          // [eval] comprehension.moreSpecific.err.a.x: adding field z not allowed as field set was already referenced:
   432  +          //     ./comprehension.cue:114:9
   433             x: (struct){
   434               y: (int){ 1 }
   435  -            z: (int){ 1 }
   436             }
   437           }
   438         }
   439  -- diff/explanation --
   440  v0.7 fixes bugs in v0.6:
   441  - comprehension.t1 should be at most an incomplete error, as it is fixable.
   442    Arguably they should pass, though, as there is a predictable path to its
   443    resolution.
   444  -- out/eval --
   445  Errors:
   446  comprehension.moreSpecific.err.a: field z not allowed by earlier comprehension or reference cycle
   447  comprehension.t1.ok.p0.x: field z not allowed by earlier comprehension or reference cycle
   448  comprehension.t1.ok.p1.x: field z not allowed by earlier comprehension or reference cycle
   449  comprehension.t1.ok.p2.x: field z not allowed by earlier comprehension or reference cycle
   450  comprehension.t2.err.a: field xq not allowed by earlier comprehension or reference cycle
   451  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  
   454  Result:
   455  (_|_){
   456    // [eval]
   457    comprehension: (_|_){
   458      // [eval]
   459      t1: (_|_){
   460        // [eval]
   461        ok: (_|_){
   462          // [eval]
   463          p0: (_|_){
   464            // [eval]
   465            x: (_|_){
   466              // [eval] comprehension.t1.ok.p0.x: field z not allowed by earlier comprehension or reference cycle
   467              y: (struct){
   468              }
   469              z: (struct){
   470                a: (struct){
   471                }
   472              }
   473            }
   474          }
   475          p1: (_|_){
   476            // [eval]
   477            x: (_|_){
   478              // [eval] comprehension.t1.ok.p1.x: field z not allowed by earlier comprehension or reference cycle
   479              y: (struct){
   480              }
   481              z: (struct){
   482                a: (struct){
   483                }
   484              }
   485            }
   486          }
   487          p2: (_|_){
   488            // [eval]
   489            x: (_|_){
   490              // [eval] comprehension.t1.ok.p2.x: field z not allowed by earlier comprehension or reference cycle
   491              y: (struct){
   492              }
   493              z: (struct){
   494                a: (struct){
   495                }
   496              }
   497            }
   498          }
   499          p3: (struct){
   500            x: (struct){
   501              y: (struct){
   502              }
   503              z: (struct){
   504                a: (struct){
   505                }
   506              }
   507            }
   508          }
   509          p4: (struct){
   510            x: (struct){
   511              y: (struct){
   512              }
   513              z: (struct){
   514                a: (struct){
   515                }
   516              }
   517            }
   518          }
   519          p5: (struct){
   520            x: (struct){
   521              y: (struct){
   522              }
   523              z: (struct){
   524                a: (struct){
   525                }
   526              }
   527            }
   528          }
   529        }
   530      }
   531      t2: (_|_){
   532        // [eval]
   533        err: (_|_){
   534          // [eval]
   535          a: (_|_){
   536            // [eval] comprehension.t2.err.a: field xq not allowed by earlier comprehension or reference cycle
   537            x: (int){ 1 }
   538            xq: (int){ 1 }
   539          }
   540        }
   541      }
   542      t3: (_|_){
   543        // [eval]
   544        err: (_|_){
   545          // [eval]
   546          a: (struct){
   547            x: (int){ 1 }
   548            yq: (int){ 1 }
   549          }
   550          b: (_|_){
   551            // [eval] comprehension.t3.err.b: field x not allowed by earlier comprehension or reference cycle
   552            // comprehension.t3.err.b: field yq not allowed by earlier comprehension or reference cycle
   553            y: (int){ 1 }
   554            x: (int){ 1 }
   555            yq: (int){ 1 }
   556          }
   557        }
   558      }
   559      t4: (struct){
   560        ok: (struct){
   561          x: (struct){
   562            y: (struct){
   563              a: (struct){
   564              }
   565            }
   566          }
   567        }
   568      }
   569      moreSpecific: (_|_){
   570        // [eval]
   571        ok: (struct){
   572          a: (struct){
   573            x: (int){ 1 }
   574          }
   575        }
   576        err: (_|_){
   577          // [eval]
   578          a: (_|_){
   579            // [eval] comprehension.moreSpecific.err.a: field z not allowed by earlier comprehension or reference cycle
   580            x: (struct){
   581              y: (int){ 1 }
   582              z: (int){ 1 }
   583            }
   584          }
   585        }
   586      }
   587    }
   588    freezing: (struct){
   589      t1: (struct){
   590        ok: (int){
   591          1
   592          #a: (#struct){
   593            x: (string){ "a" }
   594          }
   595        }
   596      }
   597    }
   598    issue3178: (struct){
   599      input: (#list){
   600        0: (string){ "Value" }
   601      }
   602      output: (struct){
   603        Value: (bool){ true }
   604      }
   605    }
   606  }
   607  -- out/compile --
   608  --- comprehension.cue
   609  {
   610    comprehension: {
   611      t1: _
   612    }
   613    comprehension: {
   614      t1: {
   615        ok: {
   616          p0: {
   617            x: {
   618              y: {}
   619            }
   620            for _, _ in 〈0;x〉 {
   621              if true {
   622                x: {
   623                  z: {
   624                    a: {}
   625                  }
   626                }
   627              }
   628            }
   629            if true {
   630              if true {
   631                x: {
   632                  z: {
   633                    a: {}
   634                  }
   635                }
   636              }
   637            }
   638          }
   639        }
   640      }
   641    }
   642    comprehension: {
   643      t1: {
   644        ok: {
   645          p1: {
   646            for _, _ in 〈0;x〉 {
   647              if true {
   648                x: {
   649                  z: {
   650                    a: {}
   651                  }
   652                }
   653              }
   654            }
   655            x: {
   656              y: {}
   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          p2: {
   675            for _, _ in 〈0;x〉 {
   676              if true {
   677                x: {
   678                  z: {
   679                    a: {}
   680                  }
   681                }
   682              }
   683            }
   684            if true {
   685              if true {
   686                x: {
   687                  z: {
   688                    a: {}
   689                  }
   690                }
   691              }
   692            }
   693            x: {
   694              y: {}
   695            }
   696          }
   697        }
   698      }
   699    }
   700    comprehension: {
   701      t1: {
   702        ok: {
   703          p3: {
   704            x: {
   705              y: {}
   706            }
   707            if true {
   708              if true {
   709                x: {
   710                  z: {
   711                    a: {}
   712                  }
   713                }
   714              }
   715            }
   716            for _, _ in 〈0;x〉 {
   717              if true {
   718                x: {
   719                  z: {
   720                    a: {}
   721                  }
   722                }
   723              }
   724            }
   725          }
   726        }
   727      }
   728    }
   729    comprehension: {
   730      t1: {
   731        ok: {
   732          p4: {
   733            if true {
   734              if true {
   735                x: {
   736                  z: {
   737                    a: {}
   738                  }
   739                }
   740              }
   741            }
   742            x: {
   743              y: {}
   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          p5: {
   762            if true {
   763              if true {
   764                x: {
   765                  z: {
   766                    a: {}
   767                  }
   768                }
   769              }
   770            }
   771            for _, _ in 〈0;x〉 {
   772              if true {
   773                x: {
   774                  z: {
   775                    a: {}
   776                  }
   777                }
   778              }
   779            }
   780            x: {
   781              y: {}
   782            }
   783          }
   784        }
   785      }
   786    }
   787    comprehension: {
   788      t2: {
   789        err: {
   790          a: {
   791            x: 1
   792            for k, v in 〈1;a〉 {
   793              (〈1;k〉 + "q"): 〈1;v〉
   794            }
   795          }
   796        }
   797      }
   798    }
   799    comprehension: {
   800      t3: {
   801        err: {
   802          a: {
   803            x: 1
   804          }
   805          b: {
   806            y: 1
   807          }
   808          a: {
   809            for k, v in 〈1;b〉 {
   810              (〈1;k〉 + "q"): 〈1;v〉
   811            }
   812          }
   813          b: {
   814            for k, v in 〈1;a〉 {
   815              〈1;k〉: 〈1;v〉
   816            }
   817          }
   818        }
   819      }
   820    }
   821    comprehension: {
   822      t4: {
   823        ok: {
   824          x: {
   825            y: {}
   826          }
   827          for _, _ in 〈0;x〉 {
   828            if true {
   829              x: {
   830                y: {
   831                  a: {}
   832                }
   833              }
   834            }
   835          }
   836        }
   837      }
   838    }
   839    comprehension: {
   840      moreSpecific: {
   841        ok: {
   842          a: {
   843            x: int
   844            for k, v in 〈1;a〉 {
   845              〈1;k〉: 1
   846            }
   847          }
   848        }
   849      }
   850    }
   851    comprehension: {
   852      moreSpecific: {
   853        err: {
   854          a: {
   855            x: {
   856              y: 1
   857            }
   858            for k, v in 〈1;a〉 if (len(〈0;v〉) > 0) {
   859              〈1;k〉: {
   860                z: 1
   861              }
   862            }
   863          }
   864        }
   865      }
   866    }
   867  }
   868  --- in.cue
   869  {
   870    freezing: {
   871      t1: {
   872        ok: {
   873          #a: {
   874            x: "a"
   875          }
   876          len(〈0;#a〉)
   877        }
   878      }
   879    }
   880  }
   881  --- issue3178.cue
   882  {
   883    issue3178: {
   884      input: [
   885        "Value",
   886      ]
   887      output: {
   888        ...
   889      }
   890      for _, name in 〈0;input〉 {
   891        output: {
   892          "\(〈2;name〉)": true
   893        }
   894      }
   895      for name, v in 〈0;output〉 {}
   896    }
   897  }