diff --git a/extractor/dbscheme/tables.go b/extractor/dbscheme/tables.go index 0a968fd8ecd..8da7312dfb8 100644 --- a/extractor/dbscheme/tables.go +++ b/extractor/dbscheme/tables.go @@ -896,16 +896,12 @@ var NumlinesTable = NewTable("numlines", var FilesTable = NewTable("files", EntityColumn(FileType, "id").Key(), StringColumn("name"), - StringColumn("simple"), - StringColumn("ext"), - IntColumn("fromSource"), ) // FoldersTable is the table defining folder entities var FoldersTable = NewTable("folders", EntityColumn(FolderType, "id").Key(), StringColumn("name"), - StringColumn("simple"), ) // ContainerParentTable is the table defining the parent-child relation among container entities diff --git a/extractor/extractor.go b/extractor/extractor.go index 2c625ef00a0..4208a788d02 100644 --- a/extractor/extractor.go +++ b/extractor/extractor.go @@ -590,15 +590,6 @@ func (extraction *Extraction) extractFile(ast *ast.File, pkg *packages.Package) return nil } -// stemAndExt splits a given file name into its stem (the part before the last '.') -// and extension (the part after the last '.') -func stemAndExt(base string) (string, string) { - if i := strings.LastIndexByte(base, '.'); i >= 0 { - return base[:i], base[i+1:] - } - return base, "" -} - // extractFileInfo extracts file-system level information for the given file, populating // the `files` and `containerparent` tables func (extraction *Extraction) extractFileInfo(tw *trap.Writer, file string) { @@ -627,9 +618,8 @@ func (extraction *Extraction) extractFileInfo(tw *trap.Writer, file string) { path = parentPath + "/" + component } if i == len(components)-1 { - stem, ext := stemAndExt(component) lbl := tw.Labeler.FileLabelFor(file) - dbscheme.FilesTable.Emit(tw, lbl, path, stem, ext, 0) + dbscheme.FilesTable.Emit(tw, lbl, path) dbscheme.ContainerParentTable.Emit(tw, parentLbl, lbl) dbscheme.HasLocationTable.Emit(tw, lbl, emitLocation(tw, lbl, 0, 0, 0, 0)) extraction.Lock.Lock() @@ -639,7 +629,7 @@ func (extraction *Extraction) extractFileInfo(tw *trap.Writer, file string) { break } lbl := tw.Labeler.GlobalID(util.EscapeTrapSpecialChars(path) + ";folder") - dbscheme.FoldersTable.Emit(tw, lbl, path, component) + dbscheme.FoldersTable.Emit(tw, lbl, path) if i > 0 { dbscheme.ContainerParentTable.Emit(tw, parentLbl, lbl) } diff --git a/ql/lib/go.dbscheme b/ql/lib/go.dbscheme index b37faf5d62c..2842941c6f9 100644 --- a/ql/lib/go.dbscheme +++ b/ql/lib/go.dbscheme @@ -133,9 +133,9 @@ locations_default(unique int id: @location_default, int file: @file ref, int beg numlines(int element_id: @sourceline ref, int num_lines: int ref, int num_code: int ref, int num_comment: int ref); -files(unique int id: @file, string name: string ref, string simple: string ref, string ext: string ref, int fromSource: int ref); +files(unique int id: @file, string name: string ref); -folders(unique int id: @folder, string name: string ref, string simple: string ref); +folders(unique int id: @folder, string name: string ref); containerparent(int parent: @container ref, unique int child: @container ref); diff --git a/ql/lib/go.dbscheme.stats b/ql/lib/go.dbscheme.stats index 4a1886f84c2..b18e8556fb2 100644 --- a/ql/lib/go.dbscheme.stats +++ b/ql/lib/go.dbscheme.stats @@ -8175,18 +8175,6 @@ name 529 - - simple - 373 - - - ext - 3 - - - fromSource - 1 - @@ -8205,54 +8193,6 @@ - - id - simple - - - 12 - - - 1 - 2 - 529 - - - - - - - id - ext - - - 12 - - - 1 - 2 - 529 - - - - - - - id - fromSource - - - 12 - - - 1 - 2 - 529 - - - - - name id @@ -8269,301 +8209,6 @@ - - name - simple - - - 12 - - - 1 - 2 - 529 - - - - - - - name - ext - - - 12 - - - 1 - 2 - 529 - - - - - - - name - fromSource - - - 12 - - - 1 - 2 - 529 - - - - - - - simple - id - - - 12 - - - 1 - 2 - 301 - - - 2 - 3 - 47 - - - 3 - 22 - 25 - - - - - - - simple - name - - - 12 - - - 1 - 2 - 301 - - - 2 - 3 - 47 - - - 3 - 22 - 25 - - - - - - - simple - ext - - - 12 - - - 1 - 2 - 368 - - - 2 - 3 - 5 - - - - - - - simple - fromSource - - - 12 - - - 1 - 2 - 373 - - - - - - - ext - id - - - 12 - - - 1 - 2 - 1 - - - 14 - 15 - 1 - - - 514 - 515 - 1 - - - - - - - ext - name - - - 12 - - - 1 - 2 - 1 - - - 14 - 15 - 1 - - - 514 - 515 - 1 - - - - - - - ext - simple - - - 12 - - - 1 - 2 - 1 - - - 14 - 15 - 1 - - - 363 - 364 - 1 - - - - - - - ext - fromSource - - - 12 - - - 1 - 2 - 3 - - - - - - - fromSource - id - - - 12 - - - 529 - 530 - 1 - - - - - - - fromSource - name - - - 12 - - - 529 - 530 - 1 - - - - - - - fromSource - simple - - - 12 - - - 373 - 374 - 1 - - - - - - - fromSource - ext - - - 12 - - - 3 - 4 - 1 - - - - - @@ -8578,10 +8223,6 @@ name 210 - - simple - 178 - @@ -8600,22 +8241,6 @@ - - id - simple - - - 12 - - - 1 - 2 - 210 - - - - - name id @@ -8632,74 +8257,6 @@ - - name - simple - - - 12 - - - 1 - 2 - 210 - - - - - - - simple - id - - - 12 - - - 1 - 2 - 157 - - - 2 - 3 - 18 - - - 3 - 10 - 3 - - - - - - - simple - name - - - 12 - - - 1 - 2 - 157 - - - 2 - 3 - 18 - - - 3 - 10 - 3 - - - - - diff --git a/ql/lib/semmle/go/Files.qll b/ql/lib/semmle/go/Files.qll index 92981b74711..28cb395beb3 100644 --- a/ql/lib/semmle/go/Files.qll +++ b/ql/lib/semmle/go/Files.qll @@ -155,7 +155,7 @@ abstract class Container extends @container { /** A folder. */ class Folder extends Container, @folder { - override string getAbsolutePath() { folders(this, result, _) } + override string getAbsolutePath() { folders(this, result) } /** Gets the file or subfolder in this folder that has the given `name`, if any. */ Container getChildContainer(string name) { @@ -182,7 +182,7 @@ class ExtractedOrExternalFile extends Container, @file, Documentable, ExprParent DeclParent, ScopeNode { override Location getLocation() { has_location(this, result) } - override string getAbsolutePath() { files(this, result, _, _, _) } + override string getAbsolutePath() { files(this, result) } /** Gets the number of lines in this file. */ int getNumberOfLines() { numlines(this, result, _, _) } diff --git a/ql/lib/semmle/go/StringOps.qll b/ql/lib/semmle/go/StringOps.qll index f844d945072..296263b1d44 100644 --- a/ql/lib/semmle/go/StringOps.qll +++ b/ql/lib/semmle/go/StringOps.qll @@ -432,7 +432,7 @@ module StringOps { * The location spans column `startcolumn` of line `startline` to * column `endcolumn` of line `endline` in file `filepath`. * For more information, see - * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn diff --git a/ql/lib/semmle/go/VariableWithFields.qll b/ql/lib/semmle/go/VariableWithFields.qll index c0df810d057..adb5e2b308a 100644 --- a/ql/lib/semmle/go/VariableWithFields.qll +++ b/ql/lib/semmle/go/VariableWithFields.qll @@ -188,7 +188,7 @@ class VariableWithFields extends TVariableWithFields { * The location spans column `startcolumn` of line `startline` to * column `endcolumn` of line `endline` in file `filepath`. * For more information, see - * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn diff --git a/ql/lib/semmle/go/controlflow/BasicBlocks.qll b/ql/lib/semmle/go/controlflow/BasicBlocks.qll index 2fb6b602440..39b7590d8a3 100644 --- a/ql/lib/semmle/go/controlflow/BasicBlocks.qll +++ b/ql/lib/semmle/go/controlflow/BasicBlocks.qll @@ -119,7 +119,7 @@ class BasicBlock extends TControlFlowNode { * The location spans column `startcolumn` of line `startline` to * column `endcolumn` of line `endline` in file `filepath`. * For more information, see - * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn diff --git a/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll b/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll index 71bd7f1c74f..4bb09adfbad 100644 --- a/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll +++ b/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll @@ -89,7 +89,7 @@ module ControlFlow { * The location spans column `startcolumn` of line `startline` to * column `endcolumn` of line `endline` in file `filepath`. * For more information, see - * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn diff --git a/ql/lib/semmle/go/controlflow/IR.qll b/ql/lib/semmle/go/controlflow/IR.qll index c85d69ee45c..552425f7edb 100644 --- a/ql/lib/semmle/go/controlflow/IR.qll +++ b/ql/lib/semmle/go/controlflow/IR.qll @@ -1400,7 +1400,7 @@ module IR { * The location spans column `startcolumn` of line `startline` to * column `endcolumn` of line `endline` in file `filepath`. * For more information, see - * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn diff --git a/ql/lib/semmle/go/dataflow/GlobalValueNumbering.qll b/ql/lib/semmle/go/dataflow/GlobalValueNumbering.qll index 29ea9bdc4e1..c9c0c58b33e 100644 --- a/ql/lib/semmle/go/dataflow/GlobalValueNumbering.qll +++ b/ql/lib/semmle/go/dataflow/GlobalValueNumbering.qll @@ -314,7 +314,7 @@ class GVN extends GVNBase { * The location spans column `startcolumn` of line `startline` to * column `endcolumn` of line `endline` in file `filepath`. * For more information, see - * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn diff --git a/ql/lib/semmle/go/dataflow/SSA.qll b/ql/lib/semmle/go/dataflow/SSA.qll index e847d86c72a..e9e9ce84b2a 100644 --- a/ql/lib/semmle/go/dataflow/SSA.qll +++ b/ql/lib/semmle/go/dataflow/SSA.qll @@ -90,7 +90,7 @@ class SsaVariable extends TSsaDefinition { * The location spans column `startcolumn` of line `startline` to * column `endcolumn` of line `endline` in file `filepath`. * For more information, see - * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn @@ -149,7 +149,7 @@ class SsaDefinition extends TSsaDefinition { * The location spans column `startcolumn` of line `startline` to * column `endcolumn` of line `endline` in file `filepath`. * For more information, see - * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ abstract predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn @@ -388,7 +388,7 @@ class SsaWithFields extends TSsaWithFields { * The location spans column `startcolumn` of line `startline` to * column `endcolumn` of line `endline` in file `filepath`. * For more information, see - * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn diff --git a/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll b/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll index 058d66b1496..7693fc72848 100644 --- a/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll +++ b/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll @@ -2955,7 +2955,7 @@ class PathNode extends TPathNode { * The location spans column `startcolumn` of line `startline` to * column `endcolumn` of line `endline` in file `filepath`. * For more information, see - * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn @@ -3641,7 +3641,7 @@ private module FlowExploration { * The location spans column `startcolumn` of line `startline` to * column `endcolumn` of line `endline` in file `filepath`. * For more information, see - * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn diff --git a/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll b/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll index 058d66b1496..7693fc72848 100644 --- a/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll +++ b/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll @@ -2955,7 +2955,7 @@ class PathNode extends TPathNode { * The location spans column `startcolumn` of line `startline` to * column `endcolumn` of line `endline` in file `filepath`. * For more information, see - * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn @@ -3641,7 +3641,7 @@ private module FlowExploration { * The location spans column `startcolumn` of line `startline` to * column `endcolumn` of line `endline` in file `filepath`. * For more information, see - * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn diff --git a/ql/lib/semmle/go/dataflow/internal/DataFlowUtil.qll b/ql/lib/semmle/go/dataflow/internal/DataFlowUtil.qll index eab96dac19e..0f764173167 100644 --- a/ql/lib/semmle/go/dataflow/internal/DataFlowUtil.qll +++ b/ql/lib/semmle/go/dataflow/internal/DataFlowUtil.qll @@ -52,7 +52,7 @@ class Node extends TNode { * The location spans column `startcolumn` of line `startline` to * column `endcolumn` of line `endline` in file `filepath`. * For more information, see - * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn @@ -1219,7 +1219,7 @@ abstract class BarrierGuard extends Node { // Case: a function like "return someBarrierGuard(arg)" // or "return !someBarrierGuard(arg) && otherCond(...)" exists(boolean outcome | - not exists(DataFlow::Node otherRet | otherRet = outp.getEntryNode(fd) | otherRet != ret) and + ret = getUniqueOutputNode(fd, outp) and this.checks(arg.asExpr(), outcome) and // This predicate's contract is (p holds of ret ==> arg is checked), // (and we have (this has outcome ==> arg is checked)) @@ -1234,7 +1234,7 @@ abstract class BarrierGuard extends Node { Function f2, FunctionInput inp2, FunctionOutput outp2, CallNode c, DataFlow::Property outpProp | - not exists(DataFlow::Node otherRet | otherRet = outp.getEntryNode(fd) | otherRet != ret) and + ret = getUniqueOutputNode(fd, outp) and this.guardingFunction(f2, inp2, outp2, outpProp) and c = f2.getACall() and arg = inp2.getNode(c) and @@ -1252,6 +1252,10 @@ abstract class BarrierGuard extends Node { } } +DataFlow::Node getUniqueOutputNode(FuncDecl fd, FunctionOutput outp) { + result = unique(DataFlow::Node n | n = outp.getEntryNode(fd) | n) +} + /** * Holds if `ret` is a data-flow node whose value contributes to the output `res` of `fd`, * and that node may have Boolean value `b`. diff --git a/ql/lib/semmle/go/frameworks/stdlib/HtmlTemplate.qll b/ql/lib/semmle/go/frameworks/stdlib/HtmlTemplate.qll index 54f3b959593..abc8413563d 100644 --- a/ql/lib/semmle/go/frameworks/stdlib/HtmlTemplate.qll +++ b/ql/lib/semmle/go/frameworks/stdlib/HtmlTemplate.qll @@ -113,7 +113,7 @@ module HtmlTemplate { * The location spans column `startcolumn` of line `startline` to * column `endcolumn` of line `endline` in file `filepath`. * For more information, see - * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn @@ -161,7 +161,7 @@ module HtmlTemplate { * The location spans column `startcolumn` of line `startline` to * column `endcolumn` of line `endline` in file `filepath`. * For more information, see - * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn diff --git a/ql/src/AlertSuppression.ql b/ql/src/AlertSuppression.ql index 12ce2ad1e4d..f0a3b5df730 100644 --- a/ql/src/AlertSuppression.ql +++ b/ql/src/AlertSuppression.ql @@ -60,7 +60,7 @@ class SuppressionScope extends @locatable { * The location spans column `startcolumn` of line `startline` to * column `endcolumn` of line `endline` in file `filepath`. * For more information, see - * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn diff --git a/ql/src/Diagnostics/DiagnosticsReporting.qll b/ql/src/Diagnostics/DiagnosticsReporting.qll index 3a6f1f18224..2b18ffa214c 100644 --- a/ql/src/Diagnostics/DiagnosticsReporting.qll +++ b/ql/src/Diagnostics/DiagnosticsReporting.qll @@ -24,7 +24,7 @@ private class Diagnostic extends @diagnostic { * The location spans column `startcolumn` of line `startline` to * column `endcolumn` of line `endline` in file `filepath`. * For more information, see - * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ predicate hasLocationInfo(string path, int sl, int sc, int el, int ec) { exists(Location l | diagnostics(this, _, _, _, _, l) | l.hasLocationInfo(path, sl, sc, el, ec)) diff --git a/ql/src/experimental/CWE-942/CorsMisconfiguration.ql b/ql/src/experimental/CWE-942/CorsMisconfiguration.ql index fa07af5914f..50283c73165 100644 --- a/ql/src/experimental/CWE-942/CorsMisconfiguration.ql +++ b/ql/src/experimental/CWE-942/CorsMisconfiguration.ql @@ -1,7 +1,7 @@ /** * @name CORS misconfiguration * @description If a CORS policy is configured to accept an origin value obtained from the request data, - * or is set to `*` or `null`, and it allows credential sharing, then the users of the + * or is set to `null`, and it allows credential sharing, then the users of the * application are vulnerable to the same range of attacks as in XSS (credential stealing, etc.). * @kind problem * @problem.severity warning diff --git a/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CFG.expected b/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CFG.expected index 615418114ba..4e62ba42deb 100644 --- a/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CFG.expected +++ b/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CFG.expected @@ -1,4 +1,1410 @@ -nodes edges +| DuplicateSwitchCase.go:0:0:0:0 | entry | DuplicateSwitchCase.go:3:6:3:15 | skip | +| DuplicateSwitchCase.go:3:1:3:1 | entry | DuplicateSwitchCase.go:3:17:3:19 | argument corresponding to msg | +| DuplicateSwitchCase.go:3:1:12:1 | function declaration | DuplicateSwitchCase.go:14:6:14:10 | skip | +| DuplicateSwitchCase.go:3:6:3:15 | skip | DuplicateSwitchCase.go:3:1:12:1 | function declaration | +| DuplicateSwitchCase.go:3:17:3:19 | argument corresponding to msg | DuplicateSwitchCase.go:3:17:3:19 | initialization of msg | +| DuplicateSwitchCase.go:3:17:3:19 | initialization of msg | DuplicateSwitchCase.go:4:2:4:2 | true | +| DuplicateSwitchCase.go:4:2:4:2 | true | DuplicateSwitchCase.go:5:7:5:9 | msg | +| DuplicateSwitchCase.go:5:7:5:9 | msg | DuplicateSwitchCase.go:5:14:5:20 | "start" | +| DuplicateSwitchCase.go:5:7:5:20 | ...==... | DuplicateSwitchCase.go:5:7:5:20 | case ...==... | +| DuplicateSwitchCase.go:5:7:5:20 | case ...==... | DuplicateSwitchCase.go:5:20:5:20 | ...==... is false | +| DuplicateSwitchCase.go:5:7:5:20 | case ...==... | DuplicateSwitchCase.go:5:20:5:20 | ...==... is true | +| DuplicateSwitchCase.go:5:14:5:20 | "start" | DuplicateSwitchCase.go:5:7:5:20 | ...==... | +| DuplicateSwitchCase.go:5:20:5:20 | ...==... is false | DuplicateSwitchCase.go:7:7:7:9 | msg | +| DuplicateSwitchCase.go:5:20:5:20 | ...==... is true | DuplicateSwitchCase.go:6:3:6:7 | start | +| DuplicateSwitchCase.go:6:3:6:7 | start | DuplicateSwitchCase.go:6:3:6:9 | call to start | +| DuplicateSwitchCase.go:6:3:6:9 | call to start | DuplicateSwitchCase.go:12:1:12:1 | exit | +| DuplicateSwitchCase.go:7:7:7:9 | msg | DuplicateSwitchCase.go:7:14:7:20 | "start" | +| DuplicateSwitchCase.go:7:7:7:20 | ...==... | DuplicateSwitchCase.go:7:7:7:20 | case ...==... | +| DuplicateSwitchCase.go:7:7:7:20 | case ...==... | DuplicateSwitchCase.go:7:20:7:20 | ...==... is false | +| DuplicateSwitchCase.go:7:7:7:20 | case ...==... | DuplicateSwitchCase.go:7:20:7:20 | ...==... is true | +| DuplicateSwitchCase.go:7:14:7:20 | "start" | DuplicateSwitchCase.go:7:7:7:20 | ...==... | +| DuplicateSwitchCase.go:7:20:7:20 | ...==... is false | DuplicateSwitchCase.go:10:3:10:7 | panic | +| DuplicateSwitchCase.go:7:20:7:20 | ...==... is true | DuplicateSwitchCase.go:8:3:8:6 | stop | +| DuplicateSwitchCase.go:8:3:8:6 | stop | DuplicateSwitchCase.go:8:3:8:8 | call to stop | +| DuplicateSwitchCase.go:8:3:8:8 | call to stop | DuplicateSwitchCase.go:12:1:12:1 | exit | +| DuplicateSwitchCase.go:10:3:10:7 | panic | DuplicateSwitchCase.go:10:9:10:33 | "Message not understood." | +| DuplicateSwitchCase.go:10:3:10:34 | call to panic | DuplicateSwitchCase.go:12:1:12:1 | exit | +| DuplicateSwitchCase.go:10:9:10:33 | "Message not understood." | DuplicateSwitchCase.go:10:3:10:34 | call to panic | +| DuplicateSwitchCase.go:14:1:14:1 | entry | DuplicateSwitchCase.go:14:14:14:15 | skip | +| DuplicateSwitchCase.go:14:1:14:15 | function declaration | DuplicateSwitchCase.go:16:6:16:9 | skip | +| DuplicateSwitchCase.go:14:6:14:10 | skip | DuplicateSwitchCase.go:14:1:14:15 | function declaration | +| DuplicateSwitchCase.go:14:14:14:15 | skip | DuplicateSwitchCase.go:14:15:14:15 | exit | +| DuplicateSwitchCase.go:16:1:16:1 | entry | DuplicateSwitchCase.go:16:13:16:14 | skip | +| DuplicateSwitchCase.go:16:1:16:14 | function declaration | DuplicateSwitchCase.go:0:0:0:0 | exit | +| DuplicateSwitchCase.go:16:6:16:9 | skip | DuplicateSwitchCase.go:16:1:16:14 | function declaration | +| DuplicateSwitchCase.go:16:13:16:14 | skip | DuplicateSwitchCase.go:16:14:16:14 | exit | +| equalitytests.go:0:0:0:0 | entry | equalitytests.go:3:1:5:1 | skip | +| equalitytests.go:3:1:5:1 | skip | equalitytests.go:7:1:9:1 | skip | +| equalitytests.go:7:1:9:1 | skip | equalitytests.go:11:6:11:18 | skip | +| equalitytests.go:11:1:11:1 | entry | equalitytests.go:11:20:11:21 | argument corresponding to i1 | +| equalitytests.go:11:1:13:1 | function declaration | equalitytests.go:0:0:0:0 | exit | +| equalitytests.go:11:6:11:18 | skip | equalitytests.go:11:1:13:1 | function declaration | +| equalitytests.go:11:20:11:21 | argument corresponding to i1 | equalitytests.go:11:20:11:21 | initialization of i1 | +| equalitytests.go:11:20:11:21 | initialization of i1 | equalitytests.go:11:28:11:29 | argument corresponding to i2 | +| equalitytests.go:11:28:11:29 | argument corresponding to i2 | equalitytests.go:11:28:11:29 | initialization of i2 | +| equalitytests.go:11:28:11:29 | initialization of i2 | equalitytests.go:11:36:11:37 | argument corresponding to e1 | +| equalitytests.go:11:36:11:37 | argument corresponding to e1 | equalitytests.go:11:36:11:37 | initialization of e1 | +| equalitytests.go:11:36:11:37 | initialization of e1 | equalitytests.go:11:46:11:47 | argument corresponding to e2 | +| equalitytests.go:11:46:11:47 | argument corresponding to e2 | equalitytests.go:11:46:11:47 | initialization of e2 | +| equalitytests.go:11:46:11:47 | initialization of e2 | equalitytests.go:11:56:11:57 | argument corresponding to s1 | +| equalitytests.go:11:56:11:57 | argument corresponding to s1 | equalitytests.go:11:56:11:57 | initialization of s1 | +| equalitytests.go:11:56:11:57 | initialization of s1 | equalitytests.go:11:83:11:84 | argument corresponding to s2 | +| equalitytests.go:11:83:11:84 | argument corresponding to s2 | equalitytests.go:11:83:11:84 | initialization of s2 | +| equalitytests.go:11:83:11:84 | initialization of s2 | equalitytests.go:11:110:11:111 | argument corresponding to s3 | +| equalitytests.go:11:110:11:111 | argument corresponding to s3 | equalitytests.go:11:110:11:111 | initialization of s3 | +| equalitytests.go:11:110:11:111 | initialization of s3 | equalitytests.go:11:134:11:135 | argument corresponding to s4 | +| equalitytests.go:11:134:11:135 | argument corresponding to s4 | equalitytests.go:11:134:11:135 | initialization of s4 | +| equalitytests.go:11:134:11:135 | initialization of s4 | equalitytests.go:11:158:11:159 | argument corresponding to a1 | +| equalitytests.go:11:158:11:159 | argument corresponding to a1 | equalitytests.go:11:158:11:159 | initialization of a1 | +| equalitytests.go:11:158:11:159 | initialization of a1 | equalitytests.go:11:171:11:172 | argument corresponding to a2 | +| equalitytests.go:11:171:11:172 | argument corresponding to a2 | equalitytests.go:11:171:11:172 | initialization of a2 | +| equalitytests.go:11:171:11:172 | initialization of a2 | equalitytests.go:11:184:11:185 | argument corresponding to a3 | +| equalitytests.go:11:184:11:185 | argument corresponding to a3 | equalitytests.go:11:184:11:185 | initialization of a3 | +| equalitytests.go:11:184:11:185 | initialization of a3 | equalitytests.go:11:195:11:196 | argument corresponding to a4 | +| equalitytests.go:11:195:11:196 | argument corresponding to a4 | equalitytests.go:11:195:11:196 | initialization of a4 | +| equalitytests.go:11:195:11:196 | initialization of a4 | equalitytests.go:12:9:12:10 | i1 | +| equalitytests.go:12:2:12:76 | return statement | equalitytests.go:13:1:13:1 | exit | +| equalitytests.go:12:9:12:10 | i1 | equalitytests.go:12:15:12:16 | i2 | +| equalitytests.go:12:9:12:16 | ...==... | equalitytests.go:12:16:12:16 | ...==... is false | +| equalitytests.go:12:9:12:16 | ...==... | equalitytests.go:12:16:12:16 | ...==... is true | +| equalitytests.go:12:9:12:76 | ...&&... | equalitytests.go:12:2:12:76 | return statement | +| equalitytests.go:12:15:12:16 | i2 | equalitytests.go:12:9:12:16 | ...==... | +| equalitytests.go:12:16:12:16 | ...==... is false | equalitytests.go:12:28:12:28 | ...&&... is false | +| equalitytests.go:12:16:12:16 | ...==... is true | equalitytests.go:12:21:12:22 | e1 | +| equalitytests.go:12:21:12:22 | e1 | equalitytests.go:12:27:12:28 | e2 | +| equalitytests.go:12:21:12:28 | ...==... | equalitytests.go:12:28:12:28 | ...&&... is false | +| equalitytests.go:12:21:12:28 | ...==... | equalitytests.go:12:28:12:28 | ...&&... is true | +| equalitytests.go:12:21:12:28 | ...==... | equalitytests.go:13:1:13:1 | exit | +| equalitytests.go:12:27:12:28 | e2 | equalitytests.go:12:21:12:28 | ...==... | +| equalitytests.go:12:28:12:28 | ...&&... is false | equalitytests.go:12:40:12:40 | ...&&... is false | +| equalitytests.go:12:28:12:28 | ...&&... is true | equalitytests.go:12:33:12:34 | s1 | +| equalitytests.go:12:33:12:34 | s1 | equalitytests.go:12:39:12:40 | s2 | +| equalitytests.go:12:33:12:40 | ...==... | equalitytests.go:12:40:12:40 | ...&&... is false | +| equalitytests.go:12:33:12:40 | ...==... | equalitytests.go:12:40:12:40 | ...&&... is true | +| equalitytests.go:12:33:12:40 | ...==... | equalitytests.go:13:1:13:1 | exit | +| equalitytests.go:12:39:12:40 | s2 | equalitytests.go:12:33:12:40 | ...==... | +| equalitytests.go:12:40:12:40 | ...&&... is false | equalitytests.go:12:52:12:52 | ...&&... is false | +| equalitytests.go:12:40:12:40 | ...&&... is true | equalitytests.go:12:45:12:46 | s3 | +| equalitytests.go:12:45:12:46 | s3 | equalitytests.go:12:51:12:52 | s4 | +| equalitytests.go:12:45:12:52 | ...==... | equalitytests.go:12:52:12:52 | ...&&... is false | +| equalitytests.go:12:45:12:52 | ...==... | equalitytests.go:12:52:12:52 | ...&&... is true | +| equalitytests.go:12:45:12:52 | ...==... | equalitytests.go:13:1:13:1 | exit | +| equalitytests.go:12:51:12:52 | s4 | equalitytests.go:12:45:12:52 | ...==... | +| equalitytests.go:12:52:12:52 | ...&&... is false | equalitytests.go:12:64:12:64 | ...&&... is false | +| equalitytests.go:12:52:12:52 | ...&&... is true | equalitytests.go:12:57:12:58 | a1 | +| equalitytests.go:12:57:12:58 | a1 | equalitytests.go:12:63:12:64 | a2 | +| equalitytests.go:12:57:12:64 | ...==... | equalitytests.go:12:64:12:64 | ...&&... is false | +| equalitytests.go:12:57:12:64 | ...==... | equalitytests.go:12:64:12:64 | ...&&... is true | +| equalitytests.go:12:57:12:64 | ...==... | equalitytests.go:13:1:13:1 | exit | +| equalitytests.go:12:63:12:64 | a2 | equalitytests.go:12:57:12:64 | ...==... | +| equalitytests.go:12:64:12:64 | ...&&... is false | equalitytests.go:12:9:12:76 | ...&&... | +| equalitytests.go:12:64:12:64 | ...&&... is true | equalitytests.go:12:69:12:70 | a3 | +| equalitytests.go:12:69:12:70 | a3 | equalitytests.go:12:75:12:76 | a4 | +| equalitytests.go:12:69:12:76 | ...==... | equalitytests.go:12:9:12:76 | ...&&... | +| equalitytests.go:12:69:12:76 | ...==... | equalitytests.go:13:1:13:1 | exit | +| equalitytests.go:12:75:12:76 | a4 | equalitytests.go:12:69:12:76 | ...==... | +| exprs.go:0:0:0:0 | entry | exprs.go:3:1:3:29 | skip | +| exprs.go:3:1:3:29 | skip | exprs.go:5:6:5:9 | skip | +| exprs.go:5:1:5:1 | entry | exprs.go:6:6:6:6 | skip | +| exprs.go:5:1:26:1 | function declaration | exprs.go:28:6:28:10 | skip | +| exprs.go:5:6:5:9 | skip | exprs.go:5:1:26:1 | function declaration | +| exprs.go:6:6:6:6 | assignment to i | exprs.go:6:9:6:9 | assignment to j | +| exprs.go:6:6:6:6 | skip | exprs.go:6:9:6:9 | skip | +| exprs.go:6:9:6:9 | assignment to j | exprs.go:7:6:7:6 | skip | +| exprs.go:6:9:6:9 | skip | exprs.go:6:13:6:13 | 0 | +| exprs.go:6:13:6:13 | 0 | exprs.go:6:16:6:26 | ...+... | +| exprs.go:6:16:6:26 | ...+... | exprs.go:6:6:6:6 | assignment to i | +| exprs.go:7:6:7:6 | assignment to k | exprs.go:8:2:8:2 | skip | +| exprs.go:7:6:7:6 | skip | exprs.go:7:10:7:10 | i | +| exprs.go:7:10:7:10 | i | exprs.go:7:14:7:14 | 2 | +| exprs.go:7:10:7:16 | ...+... | exprs.go:7:6:7:6 | assignment to k | +| exprs.go:7:14:7:14 | 2 | exprs.go:7:16:7:16 | j | +| exprs.go:7:14:7:16 | ...*... | exprs.go:7:10:7:16 | ...+... | +| exprs.go:7:16:7:16 | j | exprs.go:7:14:7:16 | ...*... | +| exprs.go:8:2:8:2 | assignment to s | exprs.go:9:2:9:3 | skip | +| exprs.go:8:2:8:2 | skip | exprs.go:8:7:8:12 | "k = " | +| exprs.go:8:7:8:12 | "k = " | exprs.go:8:23:8:23 | k | +| exprs.go:8:7:8:24 | ...+... | exprs.go:8:2:8:2 | assignment to s | +| exprs.go:8:16:8:24 | type conversion | exprs.go:8:7:8:24 | ...+... | +| exprs.go:8:23:8:23 | k | exprs.go:8:16:8:24 | type conversion | +| exprs.go:9:2:9:3 | assignment to fn | exprs.go:10:2:10:8 | skip | +| exprs.go:9:2:9:3 | skip | exprs.go:9:8:9:61 | function literal | +| exprs.go:9:8:9:8 | entry | exprs.go:9:13:9:13 | argument corresponding to a | +| exprs.go:9:8:9:61 | function literal | exprs.go:9:2:9:3 | assignment to fn | +| exprs.go:9:13:9:13 | argument corresponding to a | exprs.go:9:13:9:13 | initialization of a | +| exprs.go:9:13:9:13 | initialization of a | exprs.go:9:16:9:16 | argument corresponding to b | +| exprs.go:9:16:9:16 | argument corresponding to b | exprs.go:9:16:9:16 | initialization of b | +| exprs.go:9:16:9:16 | initialization of b | exprs.go:9:23:9:23 | argument corresponding to z | +| exprs.go:9:23:9:23 | argument corresponding to z | exprs.go:9:23:9:23 | initialization of z | +| exprs.go:9:23:9:23 | initialization of z | exprs.go:9:48:9:48 | a | +| exprs.go:9:41:9:59 | return statement | exprs.go:9:61:9:61 | exit | +| exprs.go:9:48:9:48 | a | exprs.go:9:50:9:50 | b | +| exprs.go:9:48:9:50 | ...*... | exprs.go:9:58:9:58 | z | +| exprs.go:9:48:9:59 | ...<... | exprs.go:9:41:9:59 | return statement | +| exprs.go:9:50:9:50 | b | exprs.go:9:48:9:50 | ...*... | +| exprs.go:9:54:9:59 | type conversion | exprs.go:9:48:9:59 | ...<... | +| exprs.go:9:58:9:58 | z | exprs.go:9:54:9:59 | type conversion | +| exprs.go:10:2:10:8 | assignment to struct1 | exprs.go:11:2:11:8 | skip | +| exprs.go:10:2:10:8 | skip | exprs.go:10:13:10:32 | struct literal | +| exprs.go:10:13:10:32 | struct literal | exprs.go:10:2:10:8 | assignment to struct1 | +| exprs.go:11:2:11:8 | assignment to struct2 | exprs.go:15:2:15:8 | skip | +| exprs.go:11:2:11:8 | skip | exprs.go:11:13:14:21 | struct literal | +| exprs.go:11:13:14:21 | struct literal | exprs.go:14:4:14:4 | k | +| exprs.go:14:4:14:4 | init of k | exprs.go:14:7:14:8 | fn | +| exprs.go:14:4:14:4 | k | exprs.go:14:4:14:4 | init of k | +| exprs.go:14:7:14:8 | fn | exprs.go:14:10:14:10 | i | +| exprs.go:14:7:14:20 | call to fn | exprs.go:14:7:14:20 | init of call to fn | +| exprs.go:14:7:14:20 | call to fn | exprs.go:26:1:26:1 | exit | +| exprs.go:14:7:14:20 | init of call to fn | exprs.go:11:2:11:8 | assignment to struct2 | +| exprs.go:14:10:14:10 | i | exprs.go:14:13:14:13 | j | +| exprs.go:14:13:14:13 | j | exprs.go:14:16:14:19 | .../... | +| exprs.go:14:16:14:19 | .../... | exprs.go:14:7:14:20 | call to fn | +| exprs.go:15:2:15:8 | assignment to struct3 | exprs.go:16:2:16:5 | skip | +| exprs.go:15:2:15:8 | skip | exprs.go:15:13:15:58 | struct literal | +| exprs.go:15:13:15:58 | struct literal | exprs.go:15:35:15:41 | struct1 | +| exprs.go:15:32:15:43 | init of key-value pair | exprs.go:15:49:15:55 | struct2 | +| exprs.go:15:35:15:41 | struct1 | exprs.go:15:35:15:43 | selection of x | +| exprs.go:15:35:15:43 | selection of x | exprs.go:15:32:15:43 | init of key-value pair | +| exprs.go:15:46:15:57 | init of key-value pair | exprs.go:15:2:15:8 | assignment to struct3 | +| exprs.go:15:49:15:55 | struct2 | exprs.go:15:49:15:57 | selection of x | +| exprs.go:15:49:15:57 | selection of x | exprs.go:15:46:15:57 | init of key-value pair | +| exprs.go:16:2:16:5 | assignment to arr1 | exprs.go:17:2:17:5 | skip | +| exprs.go:16:2:16:5 | skip | exprs.go:16:10:16:26 | array literal | +| exprs.go:16:10:16:26 | array literal | exprs.go:16:17:16:17 | element index | +| exprs.go:16:17:16:17 | element index | exprs.go:16:17:16:23 | struct3 | +| exprs.go:16:17:16:23 | struct3 | exprs.go:16:17:16:25 | selection of x | +| exprs.go:16:17:16:25 | init of selection of x | exprs.go:16:2:16:5 | assignment to arr1 | +| exprs.go:16:17:16:25 | selection of x | exprs.go:16:17:16:25 | init of selection of x | +| exprs.go:17:2:17:5 | assignment to arr2 | exprs.go:18:2:18:4 | skip | +| exprs.go:17:2:17:5 | skip | exprs.go:17:10:17:40 | array literal | +| exprs.go:17:10:17:40 | array literal | exprs.go:17:19:17:19 | element index | +| exprs.go:17:19:17:19 | element index | exprs.go:17:19:17:25 | struct3 | +| exprs.go:17:19:17:25 | struct3 | exprs.go:17:19:17:27 | selection of x | +| exprs.go:17:19:17:27 | init of selection of x | exprs.go:17:30:17:30 | 2 | +| exprs.go:17:19:17:27 | selection of x | exprs.go:17:19:17:27 | init of selection of x | +| exprs.go:17:30:17:30 | 2 | exprs.go:17:33:17:36 | arr1 | +| exprs.go:17:30:17:39 | init of key-value pair | exprs.go:17:2:17:5 | assignment to arr2 | +| exprs.go:17:33:17:36 | arr1 | exprs.go:17:38:17:38 | 0 | +| exprs.go:17:33:17:39 | index expression | exprs.go:17:30:17:39 | init of key-value pair | +| exprs.go:17:33:17:39 | index expression | exprs.go:26:1:26:1 | exit | +| exprs.go:17:38:17:38 | 0 | exprs.go:17:33:17:39 | index expression | +| exprs.go:18:2:18:4 | assignment to slc | exprs.go:19:2:19:3 | skip | +| exprs.go:18:2:18:4 | skip | exprs.go:18:9:18:22 | slice literal | +| exprs.go:18:9:18:22 | slice literal | exprs.go:18:18:18:18 | element index | +| exprs.go:18:18:18:18 | element index | exprs.go:18:18:18:18 | s | +| exprs.go:18:18:18:18 | init of s | exprs.go:18:21:18:21 | element index | +| exprs.go:18:18:18:18 | s | exprs.go:18:18:18:18 | init of s | +| exprs.go:18:21:18:21 | element index | exprs.go:18:21:18:21 | s | +| exprs.go:18:21:18:21 | init of s | exprs.go:18:2:18:4 | assignment to slc | +| exprs.go:18:21:18:21 | s | exprs.go:18:21:18:21 | init of s | +| exprs.go:19:2:19:3 | assignment to mp | exprs.go:20:2:20:5 | skip | +| exprs.go:19:2:19:3 | skip | exprs.go:19:8:19:38 | map literal | +| exprs.go:19:8:19:38 | map literal | exprs.go:19:23:19:25 | slc | +| exprs.go:19:23:19:25 | slc | exprs.go:19:27:19:27 | 0 | +| exprs.go:19:23:19:28 | index expression | exprs.go:19:31:19:34 | arr2 | +| exprs.go:19:23:19:28 | index expression | exprs.go:26:1:26:1 | exit | +| exprs.go:19:23:19:37 | init of key-value pair | exprs.go:19:2:19:3 | assignment to mp | +| exprs.go:19:27:19:27 | 0 | exprs.go:19:23:19:28 | index expression | +| exprs.go:19:31:19:34 | arr2 | exprs.go:19:36:19:36 | 1 | +| exprs.go:19:31:19:37 | index expression | exprs.go:19:23:19:37 | init of key-value pair | +| exprs.go:19:31:19:37 | index expression | exprs.go:26:1:26:1 | exit | +| exprs.go:19:36:19:36 | 1 | exprs.go:19:31:19:37 | index expression | +| exprs.go:20:2:20:5 | assignment to slc2 | exprs.go:21:2:21:5 | skip | +| exprs.go:20:2:20:5 | skip | exprs.go:20:10:20:12 | slc | +| exprs.go:20:10:20:12 | slc | exprs.go:20:14:20:14 | 1 | +| exprs.go:20:10:20:19 | slice expression | exprs.go:20:2:20:5 | assignment to slc2 | +| exprs.go:20:10:20:19 | slice expression | exprs.go:26:1:26:1 | exit | +| exprs.go:20:14:20:14 | 1 | exprs.go:20:16:20:16 | 2 | +| exprs.go:20:16:20:16 | 2 | exprs.go:20:18:20:18 | 3 | +| exprs.go:20:18:20:18 | 3 | exprs.go:20:10:20:19 | slice expression | +| exprs.go:21:2:21:5 | assignment to slc3 | exprs.go:22:2:22:5 | skip | +| exprs.go:21:2:21:5 | skip | exprs.go:21:10:21:13 | slc2 | +| exprs.go:21:10:21:13 | slc2 | exprs.go:21:10:21:19 | 0 | +| exprs.go:21:10:21:19 | 0 | exprs.go:21:16:21:16 | 2 | +| exprs.go:21:10:21:19 | slice expression | exprs.go:21:2:21:5 | assignment to slc3 | +| exprs.go:21:10:21:19 | slice expression | exprs.go:26:1:26:1 | exit | +| exprs.go:21:16:21:16 | 2 | exprs.go:21:18:21:18 | 3 | +| exprs.go:21:18:21:18 | 3 | exprs.go:21:10:21:19 | slice expression | +| exprs.go:22:2:22:5 | assignment to slc4 | exprs.go:23:2:23:5 | skip | +| exprs.go:22:2:22:5 | skip | exprs.go:22:10:22:13 | slc3 | +| exprs.go:22:10:22:13 | slc3 | exprs.go:22:15:22:15 | 0 | +| exprs.go:22:10:22:18 | cap | exprs.go:22:10:22:18 | slice expression | +| exprs.go:22:10:22:18 | slice expression | exprs.go:22:2:22:5 | assignment to slc4 | +| exprs.go:22:10:22:18 | slice expression | exprs.go:26:1:26:1 | exit | +| exprs.go:22:15:22:15 | 0 | exprs.go:22:17:22:17 | 2 | +| exprs.go:22:17:22:17 | 2 | exprs.go:22:10:22:18 | cap | +| exprs.go:23:2:23:5 | assignment to slc5 | exprs.go:24:2:24:5 | skip | +| exprs.go:23:2:23:5 | skip | exprs.go:23:10:23:13 | slc4 | +| exprs.go:23:10:23:13 | slc4 | exprs.go:23:15:23:15 | 0 | +| exprs.go:23:10:23:17 | cap | exprs.go:23:10:23:17 | slice expression | +| exprs.go:23:10:23:17 | len | exprs.go:23:10:23:17 | cap | +| exprs.go:23:10:23:17 | slice expression | exprs.go:23:2:23:5 | assignment to slc5 | +| exprs.go:23:10:23:17 | slice expression | exprs.go:26:1:26:1 | exit | +| exprs.go:23:15:23:15 | 0 | exprs.go:23:10:23:17 | len | +| exprs.go:24:2:24:5 | assignment to slc6 | exprs.go:25:9:25:34 | struct literal | +| exprs.go:24:2:24:5 | skip | exprs.go:24:10:24:13 | slc5 | +| exprs.go:24:10:24:13 | slc5 | exprs.go:24:10:24:17 | 0 | +| exprs.go:24:10:24:17 | 0 | exprs.go:24:16:24:16 | 2 | +| exprs.go:24:10:24:17 | cap | exprs.go:24:10:24:17 | slice expression | +| exprs.go:24:10:24:17 | slice expression | exprs.go:24:2:24:5 | assignment to slc6 | +| exprs.go:24:10:24:17 | slice expression | exprs.go:26:1:26:1 | exit | +| exprs.go:24:16:24:16 | 2 | exprs.go:24:10:24:17 | cap | +| exprs.go:25:2:25:34 | return statement | exprs.go:26:1:26:1 | exit | +| exprs.go:25:9:25:34 | struct literal | exprs.go:25:15:25:16 | mp | +| exprs.go:25:15:25:16 | mp | exprs.go:25:18:25:18 | s | +| exprs.go:25:15:25:19 | index expression | exprs.go:25:15:25:19 | init of index expression | +| exprs.go:25:15:25:19 | index expression | exprs.go:26:1:26:1 | exit | +| exprs.go:25:15:25:19 | init of index expression | exprs.go:25:22:25:24 | len | +| exprs.go:25:18:25:18 | s | exprs.go:25:15:25:19 | index expression | +| exprs.go:25:22:25:24 | len | exprs.go:25:26:25:29 | slc6 | +| exprs.go:25:22:25:33 | call to len | exprs.go:25:22:25:33 | init of call to len | +| exprs.go:25:22:25:33 | init of call to len | exprs.go:25:2:25:34 | return statement | +| exprs.go:25:26:25:29 | slc6 | exprs.go:25:31:25:31 | 0 | +| exprs.go:25:26:25:32 | index expression | exprs.go:25:22:25:33 | call to len | +| exprs.go:25:26:25:32 | index expression | exprs.go:26:1:26:1 | exit | +| exprs.go:25:31:25:31 | 0 | exprs.go:25:26:25:32 | index expression | +| exprs.go:28:1:28:1 | entry | exprs.go:28:12:28:14 | argument corresponding to arg | +| exprs.go:28:1:30:1 | function declaration | exprs.go:32:6:32:10 | skip | +| exprs.go:28:6:28:10 | skip | exprs.go:28:1:30:1 | function declaration | +| exprs.go:28:12:28:14 | argument corresponding to arg | exprs.go:28:12:28:14 | initialization of arg | +| exprs.go:28:12:28:14 | initialization of arg | exprs.go:29:9:29:11 | arg | +| exprs.go:29:2:29:21 | return statement | exprs.go:30:1:30:1 | exit | +| exprs.go:29:9:29:11 | arg | exprs.go:29:9:29:19 | type assertion | +| exprs.go:29:9:29:19 | type assertion | exprs.go:29:9:29:21 | selection of x | +| exprs.go:29:9:29:19 | type assertion | exprs.go:30:1:30:1 | exit | +| exprs.go:29:9:29:21 | selection of x | exprs.go:29:2:29:21 | return statement | +| exprs.go:32:1:32:1 | entry | exprs.go:32:12:32:14 | argument corresponding to arg | +| exprs.go:32:1:37:1 | function declaration | exprs.go:39:6:39:10 | skip | +| exprs.go:32:6:32:10 | skip | exprs.go:32:1:37:1 | function declaration | +| exprs.go:32:12:32:14 | argument corresponding to arg | exprs.go:32:12:32:14 | initialization of arg | +| exprs.go:32:12:32:14 | initialization of arg | exprs.go:33:5:33:5 | skip | +| exprs.go:33:5:33:5 | assignment to p | exprs.go:33:5:33:24 | ... := ...[1] | +| exprs.go:33:5:33:5 | skip | exprs.go:33:8:33:9 | skip | +| exprs.go:33:5:33:24 | ... := ...[0] | exprs.go:33:5:33:5 | assignment to p | +| exprs.go:33:5:33:24 | ... := ...[1] | exprs.go:33:8:33:9 | assignment to ok | +| exprs.go:33:8:33:9 | assignment to ok | exprs.go:33:27:33:28 | ok | +| exprs.go:33:8:33:9 | skip | exprs.go:33:14:33:16 | arg | +| exprs.go:33:14:33:16 | arg | exprs.go:33:14:33:24 | type assertion | +| exprs.go:33:14:33:24 | type assertion | exprs.go:33:5:33:24 | ... := ...[0] | +| exprs.go:33:27:33:28 | ok | exprs.go:33:28:33:28 | ok is false | +| exprs.go:33:27:33:28 | ok | exprs.go:33:28:33:28 | ok is true | +| exprs.go:33:28:33:28 | ok is false | exprs.go:36:9:36:10 | -... | +| exprs.go:33:28:33:28 | ok is true | exprs.go:34:10:34:10 | p | +| exprs.go:34:3:34:12 | return statement | exprs.go:37:1:37:1 | exit | +| exprs.go:34:10:34:10 | p | exprs.go:34:10:34:12 | selection of x | +| exprs.go:34:10:34:12 | selection of x | exprs.go:34:3:34:12 | return statement | +| exprs.go:36:2:36:10 | return statement | exprs.go:37:1:37:1 | exit | +| exprs.go:36:9:36:10 | -... | exprs.go:36:2:36:10 | return statement | +| exprs.go:39:1:39:1 | entry | exprs.go:39:12:39:14 | argument corresponding to arg | +| exprs.go:39:1:47:1 | function declaration | exprs.go:49:6:49:8 | skip | +| exprs.go:39:6:39:10 | skip | exprs.go:39:1:47:1 | function declaration | +| exprs.go:39:12:39:14 | argument corresponding to arg | exprs.go:39:12:39:14 | initialization of arg | +| exprs.go:39:12:39:14 | initialization of arg | exprs.go:40:6:40:6 | skip | +| exprs.go:40:6:40:6 | assignment to p | exprs.go:41:6:41:7 | skip | +| exprs.go:40:6:40:6 | skip | exprs.go:40:6:40:6 | zero value for p | +| exprs.go:40:6:40:6 | zero value for p | exprs.go:40:6:40:6 | assignment to p | +| exprs.go:41:6:41:7 | assignment to ok | exprs.go:42:2:42:2 | skip | +| exprs.go:41:6:41:7 | skip | exprs.go:41:6:41:7 | zero value for ok | +| exprs.go:41:6:41:7 | zero value for ok | exprs.go:41:6:41:7 | assignment to ok | +| exprs.go:42:2:42:2 | assignment to p | exprs.go:42:2:42:20 | ... = ...[1] | +| exprs.go:42:2:42:2 | skip | exprs.go:42:5:42:6 | skip | +| exprs.go:42:2:42:20 | ... = ...[0] | exprs.go:42:2:42:2 | assignment to p | +| exprs.go:42:2:42:20 | ... = ...[1] | exprs.go:42:5:42:6 | assignment to ok | +| exprs.go:42:5:42:6 | assignment to ok | exprs.go:43:5:43:6 | ok | +| exprs.go:42:5:42:6 | skip | exprs.go:42:10:42:12 | arg | +| exprs.go:42:10:42:12 | arg | exprs.go:42:10:42:20 | type assertion | +| exprs.go:42:10:42:20 | type assertion | exprs.go:42:2:42:20 | ... = ...[0] | +| exprs.go:43:5:43:6 | ok | exprs.go:43:6:43:6 | ok is false | +| exprs.go:43:5:43:6 | ok | exprs.go:43:6:43:6 | ok is true | +| exprs.go:43:6:43:6 | ok is false | exprs.go:46:9:46:10 | -... | +| exprs.go:43:6:43:6 | ok is true | exprs.go:44:10:44:10 | p | +| exprs.go:44:3:44:12 | return statement | exprs.go:47:1:47:1 | exit | +| exprs.go:44:10:44:10 | p | exprs.go:44:10:44:12 | selection of x | +| exprs.go:44:10:44:12 | selection of x | exprs.go:44:3:44:12 | return statement | +| exprs.go:46:2:46:10 | return statement | exprs.go:47:1:47:1 | exit | +| exprs.go:46:9:46:10 | -... | exprs.go:46:2:46:10 | return statement | +| exprs.go:49:1:49:1 | entry | exprs.go:49:10:49:11 | argument corresponding to xs | +| exprs.go:49:1:54:1 | function declaration | exprs.go:56:6:56:9 | skip | +| exprs.go:49:6:49:8 | skip | exprs.go:49:1:54:1 | function declaration | +| exprs.go:49:10:49:11 | argument corresponding to xs | exprs.go:49:10:49:11 | initialization of xs | +| exprs.go:49:10:49:11 | initialization of xs | exprs.go:49:21:49:23 | zero value for res | +| exprs.go:49:21:49:23 | implicit read of res | exprs.go:54:1:54:1 | exit | +| exprs.go:49:21:49:23 | initialization of res | exprs.go:50:6:50:6 | skip | +| exprs.go:49:21:49:23 | zero value for res | exprs.go:49:21:49:23 | initialization of res | +| exprs.go:50:6:50:6 | assignment to i | exprs.go:50:14:50:14 | i | +| exprs.go:50:6:50:6 | skip | exprs.go:50:11:50:11 | 0 | +| exprs.go:50:11:50:11 | 0 | exprs.go:50:6:50:6 | assignment to i | +| exprs.go:50:14:50:14 | i | exprs.go:50:18:50:20 | len | +| exprs.go:50:14:50:24 | ...<... | exprs.go:50:24:50:24 | ...<... is false | +| exprs.go:50:14:50:24 | ...<... | exprs.go:50:24:50:24 | ...<... is true | +| exprs.go:50:18:50:20 | len | exprs.go:50:22:50:23 | xs | +| exprs.go:50:18:50:24 | call to len | exprs.go:50:14:50:24 | ...<... | +| exprs.go:50:22:50:23 | xs | exprs.go:50:18:50:24 | call to len | +| exprs.go:50:24:50:24 | ...<... is false | exprs.go:53:2:53:7 | return statement | +| exprs.go:50:24:50:24 | ...<... is true | exprs.go:51:3:51:5 | res | +| exprs.go:50:27:50:27 | i | exprs.go:50:27:50:29 | 1 | +| exprs.go:50:27:50:29 | 1 | exprs.go:50:27:50:29 | rhs of increment statement | +| exprs.go:50:27:50:29 | increment statement | exprs.go:50:14:50:14 | i | +| exprs.go:50:27:50:29 | rhs of increment statement | exprs.go:50:27:50:29 | increment statement | +| exprs.go:51:3:51:5 | assignment to res | exprs.go:50:27:50:27 | i | +| exprs.go:51:3:51:5 | res | exprs.go:51:10:51:11 | xs | +| exprs.go:51:3:51:14 | ... += ... | exprs.go:51:3:51:5 | assignment to res | +| exprs.go:51:10:51:11 | xs | exprs.go:51:13:51:13 | i | +| exprs.go:51:10:51:14 | index expression | exprs.go:51:3:51:14 | ... += ... | +| exprs.go:51:10:51:14 | index expression | exprs.go:54:1:54:1 | exit | +| exprs.go:51:13:51:13 | i | exprs.go:51:10:51:14 | index expression | +| exprs.go:53:2:53:7 | return statement | exprs.go:49:21:49:23 | implicit read of res | +| exprs.go:56:1:56:1 | entry | exprs.go:56:11:56:12 | argument corresponding to xs | +| exprs.go:56:1:58:1 | function declaration | exprs.go:60:6:60:9 | skip | +| exprs.go:56:6:56:9 | skip | exprs.go:56:1:58:1 | function declaration | +| exprs.go:56:11:56:12 | argument corresponding to xs | exprs.go:56:11:56:12 | initialization of xs | +| exprs.go:56:11:56:12 | initialization of xs | exprs.go:57:9:57:11 | sum | +| exprs.go:57:2:57:15 | return statement | exprs.go:58:1:58:1 | exit | +| exprs.go:57:9:57:11 | sum | exprs.go:57:13:57:14 | xs | +| exprs.go:57:9:57:15 | call to sum | exprs.go:57:2:57:15 | return statement | +| exprs.go:57:9:57:15 | call to sum | exprs.go:58:1:58:1 | exit | +| exprs.go:57:13:57:14 | xs | exprs.go:57:9:57:15 | call to sum | +| exprs.go:60:1:60:1 | entry | exprs.go:61:9:61:22 | slice literal | +| exprs.go:60:1:62:1 | function declaration | exprs.go:64:5:64:5 | skip | +| exprs.go:60:6:60:9 | skip | exprs.go:60:1:62:1 | function declaration | +| exprs.go:61:2:61:22 | return statement | exprs.go:62:1:62:1 | exit | +| exprs.go:61:9:61:22 | slice literal | exprs.go:61:15:61:15 | element index | +| exprs.go:61:15:61:15 | 1 | exprs.go:61:15:61:15 | init of 1 | +| exprs.go:61:15:61:15 | element index | exprs.go:61:15:61:15 | 1 | +| exprs.go:61:15:61:15 | init of 1 | exprs.go:61:18:61:18 | element index | +| exprs.go:61:18:61:18 | 2 | exprs.go:61:18:61:18 | init of 2 | +| exprs.go:61:18:61:18 | element index | exprs.go:61:18:61:18 | 2 | +| exprs.go:61:18:61:18 | init of 2 | exprs.go:61:21:61:21 | element index | +| exprs.go:61:21:61:21 | 3 | exprs.go:61:21:61:21 | init of 3 | +| exprs.go:61:21:61:21 | element index | exprs.go:61:21:61:21 | 3 | +| exprs.go:61:21:61:21 | init of 3 | exprs.go:61:2:61:22 | return statement | +| exprs.go:64:5:64:5 | assignment to s | exprs.go:65:5:65:6 | skip | +| exprs.go:64:5:64:5 | skip | exprs.go:64:9:64:11 | sum | +| exprs.go:64:9:64:11 | sum | exprs.go:64:13:64:16 | ints | +| exprs.go:64:9:64:19 | call to sum | exprs.go:0:0:0:0 | exit | +| exprs.go:64:9:64:19 | call to sum | exprs.go:64:5:64:5 | assignment to s | +| exprs.go:64:13:64:16 | ints | exprs.go:64:13:64:18 | call to ints | +| exprs.go:64:13:64:18 | call to ints | exprs.go:0:0:0:0 | exit | +| exprs.go:64:13:64:18 | call to ints | exprs.go:64:9:64:19 | call to sum | +| exprs.go:65:5:65:6 | assignment to s2 | exprs.go:67:6:67:8 | skip | +| exprs.go:65:5:65:6 | skip | exprs.go:65:10:65:13 | sum2 | +| exprs.go:65:10:65:13 | sum2 | exprs.go:65:15:65:18 | ints | +| exprs.go:65:10:65:24 | call to sum2 | exprs.go:0:0:0:0 | exit | +| exprs.go:65:10:65:24 | call to sum2 | exprs.go:65:5:65:6 | assignment to s2 | +| exprs.go:65:15:65:18 | ints | exprs.go:65:15:65:20 | call to ints | +| exprs.go:65:15:65:20 | call to ints | exprs.go:0:0:0:0 | exit | +| exprs.go:65:15:65:20 | call to ints | exprs.go:65:10:65:24 | call to sum2 | +| exprs.go:67:1:67:1 | entry | exprs.go:67:10:67:10 | argument corresponding to x | +| exprs.go:67:1:69:1 | function declaration | exprs.go:71:6:71:8 | skip | +| exprs.go:67:6:67:8 | skip | exprs.go:67:1:69:1 | function declaration | +| exprs.go:67:10:67:10 | argument corresponding to x | exprs.go:67:10:67:10 | initialization of x | +| exprs.go:67:10:67:10 | initialization of x | exprs.go:67:13:67:13 | argument corresponding to y | +| exprs.go:67:13:67:13 | argument corresponding to y | exprs.go:67:13:67:13 | initialization of y | +| exprs.go:67:13:67:13 | initialization of y | exprs.go:68:9:68:9 | x | +| exprs.go:68:2:68:13 | return statement | exprs.go:69:1:69:1 | exit | +| exprs.go:68:9:68:9 | x | exprs.go:68:13:68:13 | y | +| exprs.go:68:9:68:13 | ...+... | exprs.go:68:2:68:13 | return statement | +| exprs.go:68:13:68:13 | y | exprs.go:68:9:68:13 | ...+... | +| exprs.go:71:1:71:1 | entry | exprs.go:72:9:72:9 | 1 | +| exprs.go:71:1:73:1 | function declaration | exprs.go:75:5:75:6 | skip | +| exprs.go:71:6:71:8 | skip | exprs.go:71:1:73:1 | function declaration | +| exprs.go:72:2:72:12 | return statement | exprs.go:73:1:73:1 | exit | +| exprs.go:72:9:72:9 | 1 | exprs.go:72:12:72:12 | 2 | +| exprs.go:72:12:72:12 | 2 | exprs.go:72:2:72:12 | return statement | +| exprs.go:75:5:75:6 | assignment to s3 | exprs.go:77:6:77:10 | skip | +| exprs.go:75:5:75:6 | skip | exprs.go:75:10:75:12 | add | +| exprs.go:75:10:75:12 | add | exprs.go:75:14:75:16 | gen | +| exprs.go:75:10:75:19 | call to add | exprs.go:0:0:0:0 | exit | +| exprs.go:75:10:75:19 | call to add | exprs.go:75:5:75:6 | assignment to s3 | +| exprs.go:75:10:75:19 | call to add[0] | exprs.go:75:10:75:19 | call to add[1] | +| exprs.go:75:10:75:19 | call to add[1] | exprs.go:75:10:75:19 | call to add | +| exprs.go:75:14:75:16 | gen | exprs.go:75:14:75:18 | call to gen | +| exprs.go:75:14:75:18 | call to gen | exprs.go:0:0:0:0 | exit | +| exprs.go:75:14:75:18 | call to gen | exprs.go:75:10:75:19 | call to add[0] | +| exprs.go:77:1:77:1 | entry | exprs.go:77:12:77:12 | argument corresponding to x | +| exprs.go:77:1:79:1 | function declaration | exprs.go:81:6:81:16 | skip | +| exprs.go:77:6:77:10 | skip | exprs.go:77:1:79:1 | function declaration | +| exprs.go:77:12:77:12 | argument corresponding to x | exprs.go:77:12:77:12 | initialization of x | +| exprs.go:77:12:77:12 | initialization of x | exprs.go:77:15:77:15 | argument corresponding to y | +| exprs.go:77:15:77:15 | argument corresponding to y | exprs.go:77:15:77:15 | initialization of y | +| exprs.go:77:15:77:15 | initialization of y | exprs.go:77:18:77:18 | argument corresponding to z | +| exprs.go:77:18:77:18 | argument corresponding to z | exprs.go:77:18:77:18 | initialization of z | +| exprs.go:77:18:77:18 | initialization of z | exprs.go:78:11:78:11 | x | +| exprs.go:78:2:78:22 | return statement | exprs.go:79:1:79:1 | exit | +| exprs.go:78:9:78:17 | !... | exprs.go:78:17:78:17 | !... is false | +| exprs.go:78:9:78:17 | !... | exprs.go:78:17:78:17 | !... is true | +| exprs.go:78:9:78:22 | ...\|\|... | exprs.go:78:2:78:22 | return statement | +| exprs.go:78:11:78:11 | x | exprs.go:78:11:78:11 | x is false | +| exprs.go:78:11:78:11 | x | exprs.go:78:11:78:11 | x is true | +| exprs.go:78:11:78:11 | x is false | exprs.go:78:11:78:16 | ...&&... | +| exprs.go:78:11:78:11 | x is true | exprs.go:78:16:78:16 | y | +| exprs.go:78:11:78:16 | ...&&... | exprs.go:78:9:78:17 | !... | +| exprs.go:78:16:78:16 | y | exprs.go:78:11:78:16 | ...&&... | +| exprs.go:78:17:78:17 | !... is false | exprs.go:78:22:78:22 | z | +| exprs.go:78:17:78:17 | !... is true | exprs.go:78:9:78:22 | ...\|\|... | +| exprs.go:78:22:78:22 | z | exprs.go:78:9:78:22 | ...\|\|... | +| exprs.go:81:1:81:1 | entry | exprs.go:81:18:81:19 | argument corresponding to ch | +| exprs.go:81:1:87:1 | function declaration | exprs.go:89:7:89:9 | skip | +| exprs.go:81:6:81:16 | skip | exprs.go:81:1:87:1 | function declaration | +| exprs.go:81:18:81:19 | argument corresponding to ch | exprs.go:81:18:81:19 | initialization of ch | +| exprs.go:81:18:81:19 | initialization of ch | exprs.go:82:2:82:4 | skip | +| exprs.go:82:2:82:4 | assignment to val | exprs.go:82:2:82:16 | ... := ...[1] | +| exprs.go:82:2:82:4 | skip | exprs.go:82:7:82:8 | skip | +| exprs.go:82:2:82:16 | ... := ...[0] | exprs.go:82:2:82:4 | assignment to val | +| exprs.go:82:2:82:16 | ... := ...[1] | exprs.go:82:7:82:8 | assignment to ok | +| exprs.go:82:7:82:8 | assignment to ok | exprs.go:83:5:83:6 | ok | +| exprs.go:82:7:82:8 | skip | exprs.go:82:15:82:16 | ch | +| exprs.go:82:13:82:16 | <-... | exprs.go:82:2:82:16 | ... := ...[0] | +| exprs.go:82:15:82:16 | ch | exprs.go:82:13:82:16 | <-... | +| exprs.go:83:5:83:6 | ok | exprs.go:83:6:83:6 | ok is false | +| exprs.go:83:5:83:6 | ok | exprs.go:83:6:83:6 | ok is true | +| exprs.go:83:6:83:6 | ok is false | exprs.go:86:2:86:6 | panic | +| exprs.go:83:6:83:6 | ok is true | exprs.go:84:10:84:12 | val | +| exprs.go:84:3:84:12 | return statement | exprs.go:87:1:87:1 | exit | +| exprs.go:84:10:84:12 | val | exprs.go:84:3:84:12 | return statement | +| exprs.go:86:2:86:6 | panic | exprs.go:86:8:86:17 | "No value" | +| exprs.go:86:2:86:18 | call to panic | exprs.go:87:1:87:1 | exit | +| exprs.go:86:8:86:17 | "No value" | exprs.go:86:2:86:18 | call to panic | +| exprs.go:89:7:89:9 | assignment to one | exprs.go:91:5:91:5 | skip | +| exprs.go:89:7:89:9 | skip | exprs.go:89:13:89:13 | 1 | +| exprs.go:89:13:89:13 | 1 | exprs.go:89:7:89:9 | assignment to one | +| exprs.go:91:5:91:5 | assignment to a | exprs.go:93:6:93:11 | skip | +| exprs.go:91:5:91:5 | skip | exprs.go:91:9:91:25 | slice literal | +| exprs.go:91:9:91:25 | slice literal | exprs.go:91:15:91:21 | ...+... | +| exprs.go:91:15:91:21 | ...+... | exprs.go:91:24:91:24 | 2 | +| exprs.go:91:15:91:24 | init of key-value pair | exprs.go:91:5:91:5 | assignment to a | +| exprs.go:91:24:91:24 | 2 | exprs.go:91:15:91:24 | init of key-value pair | +| exprs.go:93:1:93:1 | entry | exprs.go:93:13:93:13 | argument corresponding to x | +| exprs.go:93:1:95:1 | function declaration | exprs.go:0:0:0:0 | exit | +| exprs.go:93:6:93:11 | skip | exprs.go:93:1:95:1 | function declaration | +| exprs.go:93:13:93:13 | argument corresponding to x | exprs.go:93:13:93:13 | initialization of x | +| exprs.go:93:13:93:13 | initialization of x | exprs.go:93:16:93:16 | argument corresponding to y | +| exprs.go:93:16:93:16 | argument corresponding to y | exprs.go:93:16:93:16 | initialization of y | +| exprs.go:93:16:93:16 | initialization of y | exprs.go:93:19:93:19 | argument corresponding to z | +| exprs.go:93:19:93:19 | argument corresponding to z | exprs.go:93:19:93:19 | initialization of z | +| exprs.go:93:19:93:19 | initialization of z | exprs.go:94:10:94:10 | x | +| exprs.go:94:2:94:21 | return statement | exprs.go:95:1:95:1 | exit | +| exprs.go:94:9:94:21 | ...\|\|... | exprs.go:94:2:94:21 | return statement | +| exprs.go:94:10:94:10 | x | exprs.go:94:10:94:10 | x is false | +| exprs.go:94:10:94:10 | x | exprs.go:94:10:94:10 | x is true | +| exprs.go:94:10:94:10 | x is false | exprs.go:94:16:94:16 | (...) is false | +| exprs.go:94:10:94:10 | x is true | exprs.go:94:15:94:15 | y | +| exprs.go:94:15:94:15 | y | exprs.go:94:16:94:16 | (...) is false | +| exprs.go:94:15:94:15 | y | exprs.go:94:16:94:16 | (...) is true | +| exprs.go:94:16:94:16 | (...) is false | exprs.go:94:21:94:21 | z | +| exprs.go:94:16:94:16 | (...) is true | exprs.go:94:9:94:21 | ...\|\|... | +| exprs.go:94:21:94:21 | z | exprs.go:94:9:94:21 | ...\|\|... | +| hello.go:0:0:0:0 | entry | hello.go:3:1:3:12 | skip | +| hello.go:3:1:3:12 | skip | hello.go:5:7:5:13 | skip | +| hello.go:5:7:5:13 | assignment to message | hello.go:7:6:7:13 | skip | +| hello.go:5:7:5:13 | skip | hello.go:5:17:5:31 | "Hello, world!" | +| hello.go:5:17:5:31 | "Hello, world!" | hello.go:5:7:5:13 | assignment to message | +| hello.go:7:1:7:1 | entry | hello.go:8:2:8:12 | selection of Println | +| hello.go:7:1:9:1 | function declaration | hello.go:0:0:0:0 | exit | +| hello.go:7:6:7:13 | skip | hello.go:7:1:9:1 | function declaration | +| hello.go:8:2:8:12 | selection of Println | hello.go:8:14:8:20 | message | +| hello.go:8:2:8:21 | call to Println | hello.go:9:1:9:1 | exit | +| hello.go:8:14:8:20 | message | hello.go:8:2:8:21 | call to Println | +| main.go:0:0:0:0 | entry | main.go:3:1:6:1 | skip | +| main.go:3:1:6:1 | skip | main.go:8:6:8:9 | skip | +| main.go:8:1:8:1 | entry | main.go:9:9:9:20 | selection of Float64 | +| main.go:8:1:10:1 | function declaration | main.go:12:6:12:9 | skip | +| main.go:8:6:8:9 | skip | main.go:8:1:10:1 | function declaration | +| main.go:9:2:9:29 | return statement | main.go:10:1:10:1 | exit | +| main.go:9:9:9:20 | selection of Float64 | main.go:9:9:9:22 | call to Float64 | +| main.go:9:9:9:22 | call to Float64 | main.go:9:27:9:29 | 0.5 | +| main.go:9:9:9:22 | call to Float64 | main.go:10:1:10:1 | exit | +| main.go:9:9:9:29 | ...>=... | main.go:9:2:9:29 | return statement | +| main.go:9:27:9:29 | 0.5 | main.go:9:9:9:29 | ...>=... | +| main.go:12:1:12:1 | entry | main.go:13:6:13:6 | skip | +| main.go:12:1:24:1 | function declaration | main.go:26:6:26:8 | skip | +| main.go:12:6:12:9 | skip | main.go:12:1:24:1 | function declaration | +| main.go:13:6:13:6 | assignment to x | main.go:14:2:14:2 | skip | +| main.go:13:6:13:6 | skip | main.go:13:6:13:6 | zero value for x | +| main.go:13:6:13:6 | zero value for x | main.go:13:6:13:6 | assignment to x | +| main.go:14:2:14:2 | assignment to y | main.go:15:2:15:10 | selection of Print | +| main.go:14:2:14:2 | skip | main.go:14:7:14:8 | 23 | +| main.go:14:7:14:8 | 23 | main.go:14:2:14:2 | assignment to y | +| main.go:15:2:15:10 | selection of Print | main.go:15:12:15:12 | x | +| main.go:15:2:15:16 | call to Print | main.go:16:5:16:8 | cond | +| main.go:15:2:15:16 | call to Print | main.go:24:1:24:1 | exit | +| main.go:15:12:15:12 | x | main.go:15:15:15:15 | y | +| main.go:15:15:15:15 | y | main.go:15:2:15:16 | call to Print | +| main.go:16:5:16:8 | cond | main.go:16:5:16:10 | call to cond | +| main.go:16:5:16:10 | call to cond | main.go:16:10:16:10 | call to cond is false | +| main.go:16:5:16:10 | call to cond | main.go:16:10:16:10 | call to cond is true | +| main.go:16:5:16:10 | call to cond | main.go:24:1:24:1 | exit | +| main.go:16:10:16:10 | call to cond is false | main.go:19:2:19:10 | selection of Print | +| main.go:16:10:16:10 | call to cond is true | main.go:17:3:17:3 | y | +| main.go:17:3:17:3 | assignment to y | main.go:19:2:19:10 | selection of Print | +| main.go:17:3:17:3 | y | main.go:17:8:17:9 | 19 | +| main.go:17:3:17:9 | ... += ... | main.go:17:3:17:3 | assignment to y | +| main.go:17:8:17:9 | 19 | main.go:17:3:17:9 | ... += ... | +| main.go:19:2:19:10 | selection of Print | main.go:19:12:19:12 | x | +| main.go:19:2:19:16 | call to Print | main.go:20:5:20:8 | cond | +| main.go:19:2:19:16 | call to Print | main.go:24:1:24:1 | exit | +| main.go:19:12:19:12 | x | main.go:19:15:19:15 | y | +| main.go:19:15:19:15 | y | main.go:19:2:19:16 | call to Print | +| main.go:20:5:20:8 | cond | main.go:20:5:20:10 | call to cond | +| main.go:20:5:20:10 | call to cond | main.go:20:10:20:10 | call to cond is false | +| main.go:20:5:20:10 | call to cond | main.go:20:10:20:10 | call to cond is true | +| main.go:20:5:20:10 | call to cond | main.go:24:1:24:1 | exit | +| main.go:20:10:20:10 | call to cond is false | main.go:23:2:23:10 | selection of Print | +| main.go:20:10:20:10 | call to cond is true | main.go:21:3:21:3 | skip | +| main.go:21:3:21:3 | assignment to x | main.go:23:2:23:10 | selection of Print | +| main.go:21:3:21:3 | skip | main.go:21:7:21:7 | y | +| main.go:21:7:21:7 | y | main.go:21:3:21:3 | assignment to x | +| main.go:23:2:23:10 | selection of Print | main.go:23:12:23:12 | x | +| main.go:23:2:23:16 | call to Print | main.go:24:1:24:1 | exit | +| main.go:23:12:23:12 | x | main.go:23:15:23:15 | y | +| main.go:23:15:23:15 | y | main.go:23:2:23:16 | call to Print | +| main.go:26:1:26:1 | entry | main.go:26:10:26:10 | argument corresponding to x | +| main.go:26:1:32:1 | function declaration | main.go:34:6:34:9 | skip | +| main.go:26:6:26:8 | skip | main.go:26:1:32:1 | function declaration | +| main.go:26:10:26:10 | argument corresponding to x | main.go:26:10:26:10 | initialization of x | +| main.go:26:10:26:10 | initialization of x | main.go:27:2:27:2 | skip | +| main.go:27:2:27:2 | assignment to a | main.go:27:5:27:5 | assignment to b | +| main.go:27:2:27:2 | skip | main.go:27:5:27:5 | skip | +| main.go:27:5:27:5 | assignment to b | main.go:28:5:28:8 | cond | +| main.go:27:5:27:5 | skip | main.go:27:10:27:10 | x | +| main.go:27:10:27:10 | x | main.go:27:13:27:13 | 0 | +| main.go:27:13:27:13 | 0 | main.go:27:2:27:2 | assignment to a | +| main.go:28:5:28:8 | cond | main.go:28:5:28:10 | call to cond | +| main.go:28:5:28:10 | call to cond | main.go:28:10:28:10 | call to cond is false | +| main.go:28:5:28:10 | call to cond | main.go:28:10:28:10 | call to cond is true | +| main.go:28:5:28:10 | call to cond | main.go:32:1:32:1 | exit | +| main.go:28:10:28:10 | call to cond is false | main.go:31:9:31:9 | a | +| main.go:28:10:28:10 | call to cond is true | main.go:29:3:29:3 | skip | +| main.go:29:3:29:3 | assignment to a | main.go:29:6:29:6 | assignment to b | +| main.go:29:3:29:3 | skip | main.go:29:6:29:6 | skip | +| main.go:29:6:29:6 | assignment to b | main.go:31:9:31:9 | a | +| main.go:29:6:29:6 | skip | main.go:29:10:29:10 | b | +| main.go:29:10:29:10 | b | main.go:29:13:29:13 | a | +| main.go:29:13:29:13 | a | main.go:29:3:29:3 | assignment to a | +| main.go:31:2:31:12 | return statement | main.go:32:1:32:1 | exit | +| main.go:31:9:31:9 | a | main.go:31:12:31:12 | b | +| main.go:31:12:31:12 | b | main.go:31:2:31:12 | return statement | +| main.go:34:1:34:1 | entry | main.go:34:11:34:11 | argument corresponding to x | +| main.go:34:1:36:1 | function declaration | main.go:38:6:38:8 | skip | +| main.go:34:6:34:9 | skip | main.go:34:1:36:1 | function declaration | +| main.go:34:11:34:11 | argument corresponding to x | main.go:34:11:34:11 | initialization of x | +| main.go:34:11:34:11 | initialization of x | main.go:35:3:35:3 | x | +| main.go:35:2:35:3 | assignment to star expression | main.go:36:1:36:1 | exit | +| main.go:35:2:35:3 | star expression | main.go:35:8:35:9 | 19 | +| main.go:35:2:35:3 | star expression | main.go:36:1:36:1 | exit | +| main.go:35:2:35:9 | ... += ... | main.go:35:2:35:3 | assignment to star expression | +| main.go:35:3:35:3 | x | main.go:35:2:35:3 | star expression | +| main.go:35:8:35:9 | 19 | main.go:35:2:35:9 | ... += ... | +| main.go:38:1:38:1 | entry | main.go:39:2:39:2 | skip | +| main.go:38:1:45:1 | function declaration | main.go:47:6:47:8 | skip | +| main.go:38:6:38:8 | skip | main.go:38:1:45:1 | function declaration | +| main.go:39:2:39:2 | assignment to x | main.go:40:2:40:4 | skip | +| main.go:39:2:39:2 | skip | main.go:39:7:39:8 | 23 | +| main.go:39:7:39:8 | 23 | main.go:39:2:39:2 | assignment to x | +| main.go:40:2:40:4 | assignment to ptr | main.go:41:5:41:8 | cond | +| main.go:40:2:40:4 | skip | main.go:40:10:40:10 | x | +| main.go:40:9:40:10 | &... | main.go:40:2:40:4 | assignment to ptr | +| main.go:40:10:40:10 | x | main.go:40:9:40:10 | &... | +| main.go:41:5:41:8 | cond | main.go:41:5:41:10 | call to cond | +| main.go:41:5:41:10 | call to cond | main.go:41:10:41:10 | call to cond is false | +| main.go:41:5:41:10 | call to cond | main.go:41:10:41:10 | call to cond is true | +| main.go:41:5:41:10 | call to cond | main.go:45:1:45:1 | exit | +| main.go:41:10:41:10 | call to cond is false | main.go:44:2:44:10 | selection of Print | +| main.go:41:10:41:10 | call to cond is true | main.go:42:3:42:6 | bump | +| main.go:42:3:42:6 | bump | main.go:42:8:42:10 | ptr | +| main.go:42:3:42:11 | call to bump | main.go:44:2:44:10 | selection of Print | +| main.go:42:3:42:11 | call to bump | main.go:45:1:45:1 | exit | +| main.go:42:8:42:10 | ptr | main.go:42:3:42:11 | call to bump | +| main.go:44:2:44:10 | selection of Print | main.go:44:12:44:12 | x | +| main.go:44:2:44:13 | call to Print | main.go:45:1:45:1 | exit | +| main.go:44:12:44:12 | x | main.go:44:2:44:13 | call to Print | +| main.go:47:1:47:1 | entry | main.go:47:13:47:18 | zero value for result | +| main.go:47:1:50:1 | function declaration | main.go:52:6:52:9 | skip | +| main.go:47:6:47:8 | skip | main.go:47:1:50:1 | function declaration | +| main.go:47:13:47:18 | implicit read of result | main.go:50:1:50:1 | exit | +| main.go:47:13:47:18 | initialization of result | main.go:48:2:48:7 | skip | +| main.go:47:13:47:18 | zero value for result | main.go:47:13:47:18 | initialization of result | +| main.go:48:2:48:7 | assignment to result | main.go:49:2:49:7 | return statement | +| main.go:48:2:48:7 | skip | main.go:48:11:48:12 | 42 | +| main.go:48:11:48:12 | 42 | main.go:48:2:48:7 | assignment to result | +| main.go:49:2:49:7 | return statement | main.go:47:13:47:18 | implicit read of result | +| main.go:52:1:52:1 | entry | main.go:52:14:52:19 | zero value for result | +| main.go:52:1:54:1 | function declaration | main.go:56:6:56:10 | skip | +| main.go:52:6:52:9 | skip | main.go:52:1:54:1 | function declaration | +| main.go:52:14:52:19 | implicit read of result | main.go:54:1:54:1 | exit | +| main.go:52:14:52:19 | initialization of result | main.go:53:2:53:7 | return statement | +| main.go:52:14:52:19 | zero value for result | main.go:52:14:52:19 | initialization of result | +| main.go:53:2:53:7 | return statement | main.go:52:14:52:19 | implicit read of result | +| main.go:56:1:56:1 | entry | main.go:57:6:57:6 | skip | +| main.go:56:1:80:1 | function declaration | main.go:82:6:82:13 | skip | +| main.go:56:6:56:10 | skip | main.go:56:1:80:1 | function declaration | +| main.go:57:6:57:6 | assignment to x | main.go:58:6:58:9 | cond | +| main.go:57:6:57:6 | skip | main.go:57:6:57:6 | zero value for x | +| main.go:57:6:57:6 | zero value for x | main.go:57:6:57:6 | assignment to x | +| main.go:58:6:58:9 | cond | main.go:58:6:58:11 | call to cond | +| main.go:58:6:58:11 | call to cond | main.go:58:11:58:11 | call to cond is false | +| main.go:58:6:58:11 | call to cond | main.go:58:11:58:11 | call to cond is true | +| main.go:58:6:58:11 | call to cond | main.go:80:1:80:1 | exit | +| main.go:58:11:58:11 | call to cond is false | main.go:61:2:61:10 | selection of Print | +| main.go:58:11:58:11 | call to cond is true | main.go:59:3:59:3 | skip | +| main.go:59:3:59:3 | assignment to x | main.go:58:6:58:9 | cond | +| main.go:59:3:59:3 | skip | main.go:59:7:59:7 | 2 | +| main.go:59:7:59:7 | 2 | main.go:59:3:59:3 | assignment to x | +| main.go:61:2:61:10 | selection of Print | main.go:61:12:61:12 | x | +| main.go:61:2:61:13 | call to Print | main.go:63:2:63:2 | skip | +| main.go:61:2:61:13 | call to Print | main.go:80:1:80:1 | exit | +| main.go:61:12:61:12 | x | main.go:61:2:61:13 | call to Print | +| main.go:63:2:63:2 | assignment to y | main.go:64:6:64:6 | skip | +| main.go:63:2:63:2 | skip | main.go:63:7:63:7 | 1 | +| main.go:63:7:63:7 | 1 | main.go:63:2:63:2 | assignment to y | +| main.go:64:6:64:6 | assignment to i | main.go:65:6:65:9 | cond | +| main.go:64:6:64:6 | skip | main.go:64:11:64:11 | 0 | +| main.go:64:11:64:11 | 0 | main.go:64:6:64:6 | assignment to i | +| main.go:64:16:64:16 | i | main.go:64:16:64:18 | 1 | +| main.go:64:16:64:18 | 1 | main.go:64:16:64:18 | rhs of increment statement | +| main.go:64:16:64:18 | increment statement | main.go:65:6:65:9 | cond | +| main.go:64:16:64:18 | rhs of increment statement | main.go:64:16:64:18 | increment statement | +| main.go:65:6:65:9 | cond | main.go:65:6:65:11 | call to cond | +| main.go:65:6:65:11 | call to cond | main.go:65:11:65:11 | call to cond is false | +| main.go:65:6:65:11 | call to cond | main.go:65:11:65:11 | call to cond is true | +| main.go:65:6:65:11 | call to cond | main.go:80:1:80:1 | exit | +| main.go:65:11:65:11 | call to cond is false | main.go:68:3:68:3 | skip | +| main.go:65:11:65:11 | call to cond is true | main.go:66:4:66:8 | skip | +| main.go:66:4:66:8 | skip | main.go:70:2:70:10 | selection of Print | +| main.go:68:3:68:3 | assignment to y | main.go:64:16:64:16 | i | +| main.go:68:3:68:3 | skip | main.go:68:7:68:7 | 2 | +| main.go:68:7:68:7 | 2 | main.go:68:3:68:3 | assignment to y | +| main.go:70:2:70:10 | selection of Print | main.go:70:12:70:12 | y | +| main.go:70:2:70:13 | call to Print | main.go:72:2:72:2 | skip | +| main.go:70:2:70:13 | call to Print | main.go:80:1:80:1 | exit | +| main.go:70:12:70:12 | y | main.go:70:2:70:13 | call to Print | +| main.go:72:2:72:2 | assignment to z | main.go:73:6:73:6 | skip | +| main.go:72:2:72:2 | skip | main.go:72:7:72:7 | 1 | +| main.go:72:7:72:7 | 1 | main.go:72:2:72:2 | assignment to z | +| main.go:73:6:73:6 | assignment to i | main.go:74:3:74:3 | skip | +| main.go:73:6:73:6 | skip | main.go:73:11:73:11 | 0 | +| main.go:73:11:73:11 | 0 | main.go:73:6:73:6 | assignment to i | +| main.go:73:16:73:16 | i | main.go:73:16:73:18 | 1 | +| main.go:73:16:73:18 | 1 | main.go:73:16:73:18 | rhs of increment statement | +| main.go:73:16:73:18 | increment statement | main.go:74:3:74:3 | skip | +| main.go:73:16:73:18 | rhs of increment statement | main.go:73:16:73:18 | increment statement | +| main.go:74:3:74:3 | assignment to z | main.go:75:6:75:9 | cond | +| main.go:74:3:74:3 | skip | main.go:74:7:74:7 | 2 | +| main.go:74:7:74:7 | 2 | main.go:74:3:74:3 | assignment to z | +| main.go:75:6:75:9 | cond | main.go:75:6:75:11 | call to cond | +| main.go:75:6:75:11 | call to cond | main.go:75:11:75:11 | call to cond is false | +| main.go:75:6:75:11 | call to cond | main.go:75:11:75:11 | call to cond is true | +| main.go:75:6:75:11 | call to cond | main.go:80:1:80:1 | exit | +| main.go:75:11:75:11 | call to cond is false | main.go:73:16:73:16 | i | +| main.go:75:11:75:11 | call to cond is true | main.go:76:4:76:8 | skip | +| main.go:76:4:76:8 | skip | main.go:79:2:79:10 | selection of Print | +| main.go:79:2:79:10 | selection of Print | main.go:79:12:79:12 | z | +| main.go:79:2:79:13 | call to Print | main.go:80:1:80:1 | exit | +| main.go:79:12:79:12 | z | main.go:79:2:79:13 | call to Print | +| main.go:82:1:82:1 | entry | main.go:82:18:82:18 | zero value for a | +| main.go:82:1:86:1 | function declaration | main.go:88:6:88:23 | skip | +| main.go:82:6:82:13 | skip | main.go:82:1:86:1 | function declaration | +| main.go:82:18:82:18 | implicit read of a | main.go:82:25:82:25 | implicit read of b | +| main.go:82:18:82:18 | initialization of a | main.go:82:25:82:25 | zero value for b | +| main.go:82:18:82:18 | zero value for a | main.go:82:18:82:18 | initialization of a | +| main.go:82:25:82:25 | implicit read of b | main.go:86:1:86:1 | exit | +| main.go:82:25:82:25 | initialization of b | main.go:83:2:83:2 | skip | +| main.go:82:25:82:25 | zero value for b | main.go:82:25:82:25 | initialization of b | +| main.go:83:2:83:2 | assignment to x | main.go:84:2:84:2 | skip | +| main.go:83:2:83:2 | skip | main.go:83:7:83:8 | 23 | +| main.go:83:7:83:8 | 23 | main.go:83:2:83:2 | assignment to x | +| main.go:84:2:84:2 | assignment to x | main.go:84:5:84:5 | assignment to a | +| main.go:84:2:84:2 | skip | main.go:84:5:84:5 | skip | +| main.go:84:5:84:5 | assignment to a | main.go:85:2:85:7 | return statement | +| main.go:84:5:84:5 | skip | main.go:84:9:84:9 | x | +| main.go:84:9:84:9 | x | main.go:84:11:84:12 | 19 | +| main.go:84:9:84:12 | ...+... | main.go:84:15:84:15 | x | +| main.go:84:11:84:12 | 19 | main.go:84:9:84:12 | ...+... | +| main.go:84:15:84:15 | x | main.go:84:2:84:2 | assignment to x | +| main.go:85:2:85:7 | return statement | main.go:82:18:82:18 | implicit read of a | +| main.go:88:1:88:1 | entry | main.go:88:25:88:25 | argument corresponding to x | +| main.go:88:1:96:1 | function declaration | main.go:0:0:0:0 | exit | +| main.go:88:6:88:23 | skip | main.go:88:1:96:1 | function declaration | +| main.go:88:25:88:25 | argument corresponding to x | main.go:88:25:88:25 | initialization of x | +| main.go:88:25:88:25 | initialization of x | main.go:89:2:89:2 | skip | +| main.go:89:2:89:2 | assignment to a | main.go:89:5:89:5 | assignment to b | +| main.go:89:2:89:2 | skip | main.go:89:5:89:5 | skip | +| main.go:89:5:89:5 | assignment to b | main.go:90:5:90:8 | cond | +| main.go:89:5:89:5 | skip | main.go:89:10:89:10 | x | +| main.go:89:10:89:10 | x | main.go:89:13:89:13 | 0 | +| main.go:89:13:89:13 | 0 | main.go:89:2:89:2 | assignment to a | +| main.go:90:5:90:8 | cond | main.go:90:5:90:10 | call to cond | +| main.go:90:5:90:10 | call to cond | main.go:90:10:90:10 | call to cond is false | +| main.go:90:5:90:10 | call to cond | main.go:90:10:90:10 | call to cond is true | +| main.go:90:5:90:10 | call to cond | main.go:96:1:96:1 | exit | +| main.go:90:10:90:10 | call to cond is false | main.go:93:3:93:3 | skip | +| main.go:90:10:90:10 | call to cond is true | main.go:91:3:91:3 | skip | +| main.go:91:3:91:3 | assignment to a | main.go:95:9:95:9 | a | +| main.go:91:3:91:3 | skip | main.go:91:6:91:6 | skip | +| main.go:91:6:91:6 | skip | main.go:91:10:91:10 | b | +| main.go:91:10:91:10 | b | main.go:91:13:91:13 | a | +| main.go:91:13:91:13 | a | main.go:91:3:91:3 | assignment to a | +| main.go:93:3:93:3 | skip | main.go:93:6:93:6 | skip | +| main.go:93:6:93:6 | assignment to b | main.go:95:9:95:9 | a | +| main.go:93:6:93:6 | skip | main.go:93:10:93:10 | b | +| main.go:93:10:93:10 | b | main.go:93:13:93:13 | a | +| main.go:93:13:93:13 | a | main.go:93:6:93:6 | assignment to b | +| main.go:95:2:95:12 | return statement | main.go:96:1:96:1 | exit | +| main.go:95:9:95:9 | a | main.go:95:12:95:12 | b | +| main.go:95:12:95:12 | b | main.go:95:2:95:12 | return statement | +| noretfunctions.go:0:0:0:0 | entry | noretfunctions.go:3:1:6:1 | skip | +| noretfunctions.go:3:1:6:1 | skip | noretfunctions.go:8:6:8:12 | skip | +| noretfunctions.go:8:1:8:1 | entry | noretfunctions.go:9:2:9:8 | selection of Exit | +| noretfunctions.go:8:1:10:1 | function declaration | noretfunctions.go:12:6:12:11 | skip | +| noretfunctions.go:8:6:8:12 | skip | noretfunctions.go:8:1:10:1 | function declaration | +| noretfunctions.go:9:2:9:8 | selection of Exit | noretfunctions.go:9:10:9:10 | 1 | +| noretfunctions.go:9:2:9:11 | call to Exit | noretfunctions.go:10:1:10:1 | exit | +| noretfunctions.go:9:10:9:10 | 1 | noretfunctions.go:9:2:9:11 | call to Exit | +| noretfunctions.go:12:1:12:1 | entry | noretfunctions.go:12:13:12:13 | argument corresponding to x | +| noretfunctions.go:12:1:16:1 | function declaration | noretfunctions.go:18:6:18:12 | skip | +| noretfunctions.go:12:6:12:11 | skip | noretfunctions.go:12:1:16:1 | function declaration | +| noretfunctions.go:12:13:12:13 | argument corresponding to x | noretfunctions.go:12:13:12:13 | initialization of x | +| noretfunctions.go:12:13:12:13 | initialization of x | noretfunctions.go:13:5:13:5 | x | +| noretfunctions.go:13:5:13:5 | x | noretfunctions.go:13:10:13:10 | 0 | +| noretfunctions.go:13:5:13:10 | ...!=... | noretfunctions.go:13:10:13:10 | ...!=... is false | +| noretfunctions.go:13:5:13:10 | ...!=... | noretfunctions.go:13:10:13:10 | ...!=... is true | +| noretfunctions.go:13:10:13:10 | 0 | noretfunctions.go:13:5:13:10 | ...!=... | +| noretfunctions.go:13:10:13:10 | ...!=... is false | noretfunctions.go:16:1:16:1 | exit | +| noretfunctions.go:13:10:13:10 | ...!=... is true | noretfunctions.go:14:3:14:9 | selection of Exit | +| noretfunctions.go:14:3:14:9 | selection of Exit | noretfunctions.go:14:11:14:11 | x | +| noretfunctions.go:14:3:14:12 | call to Exit | noretfunctions.go:16:1:16:1 | exit | +| noretfunctions.go:14:11:14:11 | x | noretfunctions.go:14:3:14:12 | call to Exit | +| noretfunctions.go:18:1:18:1 | entry | noretfunctions.go:18:16:18:17 | skip | +| noretfunctions.go:18:1:18:17 | function declaration | noretfunctions.go:20:6:20:22 | skip | +| noretfunctions.go:18:6:18:12 | skip | noretfunctions.go:18:1:18:17 | function declaration | +| noretfunctions.go:18:16:18:17 | skip | noretfunctions.go:18:17:18:17 | exit | +| noretfunctions.go:20:1:20:1 | entry | noretfunctions.go:21:2:21:10 | selection of Fatal | +| noretfunctions.go:20:1:22:1 | function declaration | noretfunctions.go:24:6:24:23 | skip | +| noretfunctions.go:20:6:20:22 | skip | noretfunctions.go:20:1:22:1 | function declaration | +| noretfunctions.go:21:2:21:10 | selection of Fatal | noretfunctions.go:21:12:21:18 | "Oh no" | +| noretfunctions.go:21:2:21:19 | call to Fatal | noretfunctions.go:22:1:22:1 | exit | +| noretfunctions.go:21:12:21:18 | "Oh no" | noretfunctions.go:21:2:21:19 | call to Fatal | +| noretfunctions.go:24:1:24:1 | entry | noretfunctions.go:25:2:25:11 | selection of Fatalf | +| noretfunctions.go:24:1:26:1 | function declaration | noretfunctions.go:0:0:0:0 | exit | +| noretfunctions.go:24:6:24:23 | skip | noretfunctions.go:24:1:26:1 | function declaration | +| noretfunctions.go:25:2:25:11 | selection of Fatalf | noretfunctions.go:25:13:25:30 | "It's as I feared" | +| noretfunctions.go:25:2:25:31 | call to Fatalf | noretfunctions.go:26:1:26:1 | exit | +| noretfunctions.go:25:13:25:30 | "It's as I feared" | noretfunctions.go:25:2:25:31 | call to Fatalf | +| stmts2.go:0:0:0:0 | entry | stmts2.go:3:6:3:11 | skip | +| stmts2.go:3:1:3:1 | entry | stmts2.go:4:2:4:2 | skip | +| stmts2.go:3:1:7:1 | function declaration | stmts2.go:9:6:9:11 | skip | +| stmts2.go:3:6:3:11 | skip | stmts2.go:3:1:7:1 | function declaration | +| stmts2.go:4:2:4:2 | skip | stmts2.go:4:6:4:10 | test7 | +| stmts2.go:4:6:4:10 | test7 | stmts2.go:4:12:4:12 | 0 | +| stmts2.go:4:6:4:13 | call to test7 | stmts2.go:5:6:5:6 | skip | +| stmts2.go:4:6:4:13 | call to test7 | stmts2.go:7:1:7:1 | exit | +| stmts2.go:4:12:4:12 | 0 | stmts2.go:4:6:4:13 | call to test7 | +| stmts2.go:5:6:5:6 | skip | stmts2.go:5:10:5:14 | test7 | +| stmts2.go:5:10:5:14 | test7 | stmts2.go:5:16:5:16 | 1 | +| stmts2.go:5:10:5:17 | call to test7 | stmts2.go:6:9:6:9 | 2 | +| stmts2.go:5:10:5:17 | call to test7 | stmts2.go:7:1:7:1 | exit | +| stmts2.go:5:16:5:16 | 1 | stmts2.go:5:10:5:17 | call to test7 | +| stmts2.go:6:2:6:9 | return statement | stmts2.go:7:1:7:1 | exit | +| stmts2.go:6:9:6:9 | 2 | stmts2.go:6:2:6:9 | return statement | +| stmts2.go:9:1:9:1 | entry | stmts2.go:10:2:10:2 | skip | +| stmts2.go:9:1:13:1 | function declaration | stmts2.go:15:6:15:11 | skip | +| stmts2.go:9:6:9:11 | skip | stmts2.go:9:1:13:1 | function declaration | +| stmts2.go:10:2:10:2 | skip | stmts2.go:10:5:10:5 | skip | +| stmts2.go:10:2:10:14 | ... := ...[0] | stmts2.go:10:2:10:14 | ... := ...[1] | +| stmts2.go:10:2:10:14 | ... := ...[1] | stmts2.go:10:5:10:5 | assignment to x | +| stmts2.go:10:5:10:5 | assignment to x | stmts2.go:11:6:11:6 | skip | +| stmts2.go:10:5:10:5 | skip | stmts2.go:10:10:10:12 | gen | +| stmts2.go:10:10:10:12 | gen | stmts2.go:10:10:10:14 | call to gen | +| stmts2.go:10:10:10:14 | call to gen | stmts2.go:10:2:10:14 | ... := ...[0] | +| stmts2.go:10:10:10:14 | call to gen | stmts2.go:13:1:13:1 | exit | +| stmts2.go:11:6:11:6 | skip | stmts2.go:11:9:11:9 | skip | +| stmts2.go:11:6:11:17 | value declaration specifier[0] | stmts2.go:11:6:11:17 | value declaration specifier[1] | +| stmts2.go:11:6:11:17 | value declaration specifier[1] | stmts2.go:11:9:11:9 | assignment to y | +| stmts2.go:11:9:11:9 | assignment to y | stmts2.go:12:9:12:9 | x | +| stmts2.go:11:9:11:9 | skip | stmts2.go:11:13:11:15 | gen | +| stmts2.go:11:13:11:15 | gen | stmts2.go:11:13:11:17 | call to gen | +| stmts2.go:11:13:11:17 | call to gen | stmts2.go:11:6:11:17 | value declaration specifier[0] | +| stmts2.go:11:13:11:17 | call to gen | stmts2.go:13:1:13:1 | exit | +| stmts2.go:12:2:12:13 | return statement | stmts2.go:13:1:13:1 | exit | +| stmts2.go:12:9:12:9 | x | stmts2.go:12:13:12:13 | y | +| stmts2.go:12:9:12:13 | ...+... | stmts2.go:12:2:12:13 | return statement | +| stmts2.go:12:13:12:13 | y | stmts2.go:12:9:12:13 | ...+... | +| stmts2.go:15:1:15:1 | entry | stmts2.go:15:13:15:14 | argument corresponding to ch | +| stmts2.go:15:1:28:1 | function declaration | stmts2.go:30:6:30:12 | skip | +| stmts2.go:15:6:15:11 | skip | stmts2.go:15:1:28:1 | function declaration | +| stmts2.go:15:13:15:14 | argument corresponding to ch | stmts2.go:15:13:15:14 | initialization of ch | +| stmts2.go:15:13:15:14 | initialization of ch | stmts2.go:17:13:17:14 | ch | +| stmts2.go:16:2:26:2 | select statement | stmts2.go:17:11:17:14 | <-... | +| stmts2.go:16:2:26:2 | select statement | stmts2.go:18:15:18:18 | <-... | +| stmts2.go:16:2:26:2 | select statement | stmts2.go:20:15:20:18 | <-... | +| stmts2.go:16:2:26:2 | select statement | stmts2.go:25:14:25:17 | <-... | +| stmts2.go:17:2:17:15 | skip | stmts2.go:27:9:27:9 | 1 | +| stmts2.go:17:7:17:7 | skip | stmts2.go:17:2:17:15 | skip | +| stmts2.go:17:11:17:14 | <-... | stmts2.go:17:7:17:7 | skip | +| stmts2.go:17:13:17:14 | ch | stmts2.go:18:17:18:18 | ch | +| stmts2.go:18:7:18:7 | assignment to x | stmts2.go:18:7:18:18 | ... := ...[1] | +| stmts2.go:18:7:18:7 | skip | stmts2.go:18:10:18:10 | skip | +| stmts2.go:18:7:18:18 | ... := ...[0] | stmts2.go:18:7:18:7 | assignment to x | +| stmts2.go:18:7:18:18 | ... := ...[1] | stmts2.go:19:10:19:10 | x | +| stmts2.go:18:10:18:10 | skip | stmts2.go:18:7:18:18 | ... := ...[0] | +| stmts2.go:18:15:18:18 | <-... | stmts2.go:18:7:18:7 | skip | +| stmts2.go:18:17:18:18 | ch | stmts2.go:20:17:20:18 | ch | +| stmts2.go:19:3:19:10 | return statement | stmts2.go:28:1:28:1 | exit | +| stmts2.go:19:10:19:10 | x | stmts2.go:19:3:19:10 | return statement | +| stmts2.go:20:7:20:7 | skip | stmts2.go:20:10:20:10 | skip | +| stmts2.go:20:7:20:18 | ... := ...[0] | stmts2.go:20:7:20:18 | ... := ...[1] | +| stmts2.go:20:7:20:18 | ... := ...[1] | stmts2.go:20:10:20:10 | assignment to y | +| stmts2.go:20:10:20:10 | assignment to y | stmts2.go:21:6:21:6 | y | +| stmts2.go:20:10:20:10 | skip | stmts2.go:20:7:20:18 | ... := ...[0] | +| stmts2.go:20:15:20:18 | <-... | stmts2.go:20:7:20:7 | skip | +| stmts2.go:20:17:20:18 | ch | stmts2.go:25:16:25:17 | ch | +| stmts2.go:21:6:21:6 | y | stmts2.go:21:6:21:6 | y is false | +| stmts2.go:21:6:21:6 | y | stmts2.go:21:6:21:6 | y is true | +| stmts2.go:21:6:21:6 | y is false | stmts2.go:24:10:24:10 | 0 | +| stmts2.go:21:6:21:6 | y is true | stmts2.go:22:4:22:8 | skip | +| stmts2.go:22:4:22:8 | skip | stmts2.go:27:9:27:9 | 1 | +| stmts2.go:24:3:24:10 | return statement | stmts2.go:28:1:28:1 | exit | +| stmts2.go:24:10:24:10 | 0 | stmts2.go:24:3:24:10 | return statement | +| stmts2.go:25:2:25:18 | skip | stmts2.go:27:9:27:9 | 1 | +| stmts2.go:25:7:25:7 | skip | stmts2.go:25:10:25:10 | skip | +| stmts2.go:25:7:25:17 | ... = ...[0] | stmts2.go:25:7:25:17 | ... = ...[1] | +| stmts2.go:25:7:25:17 | ... = ...[1] | stmts2.go:25:2:25:18 | skip | +| stmts2.go:25:10:25:10 | skip | stmts2.go:25:7:25:17 | ... = ...[0] | +| stmts2.go:25:14:25:17 | <-... | stmts2.go:25:7:25:7 | skip | +| stmts2.go:25:16:25:17 | ch | stmts2.go:16:2:26:2 | select statement | +| stmts2.go:27:2:27:9 | return statement | stmts2.go:28:1:28:1 | exit | +| stmts2.go:27:9:27:9 | 1 | stmts2.go:27:2:27:9 | return statement | +| stmts2.go:30:1:30:1 | entry | stmts2.go:31:2:31:2 | skip | +| stmts2.go:30:1:34:1 | function declaration | stmts2.go:0:0:0:0 | exit | +| stmts2.go:30:6:30:12 | skip | stmts2.go:30:1:34:1 | function declaration | +| stmts2.go:31:2:31:2 | assignment to x | stmts2.go:31:2:31:14 | ... := ...[1] | +| stmts2.go:31:2:31:2 | skip | stmts2.go:31:5:31:5 | skip | +| stmts2.go:31:2:31:14 | ... := ...[0] | stmts2.go:31:2:31:2 | assignment to x | +| stmts2.go:31:2:31:14 | ... := ...[1] | stmts2.go:32:6:32:6 | skip | +| stmts2.go:31:5:31:5 | skip | stmts2.go:31:10:31:12 | gen | +| stmts2.go:31:10:31:12 | gen | stmts2.go:31:10:31:14 | call to gen | +| stmts2.go:31:10:31:14 | call to gen | stmts2.go:31:2:31:14 | ... := ...[0] | +| stmts2.go:31:10:31:14 | call to gen | stmts2.go:34:1:34:1 | exit | +| stmts2.go:32:6:32:6 | assignment to y | stmts2.go:32:6:32:17 | value declaration specifier[1] | +| stmts2.go:32:6:32:6 | skip | stmts2.go:32:9:32:9 | skip | +| stmts2.go:32:6:32:17 | value declaration specifier[0] | stmts2.go:32:6:32:6 | assignment to y | +| stmts2.go:32:6:32:17 | value declaration specifier[1] | stmts2.go:33:9:33:9 | x | +| stmts2.go:32:9:32:9 | skip | stmts2.go:32:13:32:15 | gen | +| stmts2.go:32:13:32:15 | gen | stmts2.go:32:13:32:17 | call to gen | +| stmts2.go:32:13:32:17 | call to gen | stmts2.go:32:6:32:17 | value declaration specifier[0] | +| stmts2.go:32:13:32:17 | call to gen | stmts2.go:34:1:34:1 | exit | +| stmts2.go:33:2:33:13 | return statement | stmts2.go:34:1:34:1 | exit | +| stmts2.go:33:9:33:9 | x | stmts2.go:33:13:33:13 | y | +| stmts2.go:33:9:33:13 | ...+... | stmts2.go:33:2:33:13 | return statement | +| stmts2.go:33:13:33:13 | y | stmts2.go:33:9:33:13 | ...+... | +| stmts3.go:0:0:0:0 | entry | stmts3.go:3:1:3:13 | skip | +| stmts3.go:3:1:3:13 | skip | stmts3.go:5:6:5:11 | skip | +| stmts3.go:5:1:5:1 | entry | stmts3.go:7:3:7:5 | skip | +| stmts3.go:5:1:12:1 | function declaration | stmts3.go:14:6:14:11 | skip | +| stmts3.go:5:6:5:11 | skip | stmts3.go:5:1:12:1 | function declaration | +| stmts3.go:7:3:7:5 | assignment to red | stmts3.go:8:3:8:7 | skip | +| stmts3.go:7:3:7:5 | skip | stmts3.go:7:9:7:12 | iota | +| stmts3.go:7:9:7:12 | iota | stmts3.go:7:3:7:5 | assignment to red | +| stmts3.go:8:3:8:7 | assignment to green | stmts3.go:9:3:9:6 | skip | +| stmts3.go:8:3:8:7 | skip | stmts3.go:8:3:8:7 | zero value for green | +| stmts3.go:8:3:8:7 | zero value for green | stmts3.go:8:3:8:7 | assignment to green | +| stmts3.go:9:3:9:6 | assignment to blue | stmts3.go:11:9:11:26 | ...-... | +| stmts3.go:9:3:9:6 | skip | stmts3.go:9:3:9:6 | zero value for blue | +| stmts3.go:9:3:9:6 | zero value for blue | stmts3.go:9:3:9:6 | assignment to blue | +| stmts3.go:11:2:11:26 | return statement | stmts3.go:12:1:12:1 | exit | +| stmts3.go:11:9:11:26 | ...-... | stmts3.go:11:2:11:26 | return statement | +| stmts3.go:14:1:14:1 | entry | stmts3.go:14:13:14:13 | argument corresponding to x | +| stmts3.go:14:1:16:1 | function declaration | stmts3.go:18:6:18:11 | skip | +| stmts3.go:14:6:14:11 | skip | stmts3.go:14:1:16:1 | function declaration | +| stmts3.go:14:13:14:13 | argument corresponding to x | stmts3.go:14:13:14:13 | initialization of x | +| stmts3.go:14:13:14:13 | initialization of x | stmts3.go:15:3:15:3 | x | +| stmts3.go:15:2:15:3 | assignment to star expression | stmts3.go:16:1:16:1 | exit | +| stmts3.go:15:2:15:3 | skip | stmts3.go:15:7:15:8 | 42 | +| stmts3.go:15:2:15:3 | skip | stmts3.go:16:1:16:1 | exit | +| stmts3.go:15:3:15:3 | x | stmts3.go:15:2:15:3 | skip | +| stmts3.go:15:7:15:8 | 42 | stmts3.go:15:2:15:3 | assignment to star expression | +| stmts3.go:18:1:18:1 | entry | stmts3.go:19:2:19:11 | skip | +| stmts3.go:18:1:20:1 | function declaration | stmts3.go:0:0:0:0 | exit | +| stmts3.go:18:6:18:11 | skip | stmts3.go:18:1:20:1 | function declaration | +| stmts3.go:19:2:19:11 | assignment to Usage | stmts3.go:20:1:20:1 | exit | +| stmts3.go:19:2:19:11 | skip | stmts3.go:19:15:19:23 | function literal | +| stmts3.go:19:15:19:15 | entry | stmts3.go:19:22:19:23 | skip | +| stmts3.go:19:15:19:23 | function literal | stmts3.go:19:2:19:11 | assignment to Usage | +| stmts3.go:19:22:19:23 | skip | stmts3.go:19:23:19:23 | exit | +| stmts4.go:0:0:0:0 | entry | stmts4.go:3:5:3:5 | skip | +| stmts4.go:3:5:3:5 | skip | stmts4.go:3:5:3:5 | zero value for _ | +| stmts4.go:3:5:3:5 | zero value for _ | stmts4.go:5:6:5:11 | skip | +| stmts4.go:5:1:5:26 | function declaration | stmts4.go:0:0:0:0 | exit | +| stmts4.go:5:6:5:11 | skip | stmts4.go:5:1:5:26 | function declaration | +| stmts5.go:0:0:0:0 | entry | stmts5.go:3:1:5:1 | skip | +| stmts5.go:3:1:5:1 | skip | stmts5.go:7:17:7:20 | skip | +| stmts5.go:7:1:7:1 | entry | stmts5.go:7:7:7:8 | argument corresponding to me | +| stmts5.go:7:1:9:1 | function declaration | stmts5.go:11:14:11:16 | skip | +| stmts5.go:7:7:7:8 | argument corresponding to me | stmts5.go:7:7:7:8 | initialization of me | +| stmts5.go:7:7:7:8 | initialization of me | stmts5.go:7:22:7:26 | argument corresponding to other | +| stmts5.go:7:17:7:20 | skip | stmts5.go:7:1:9:1 | function declaration | +| stmts5.go:7:22:7:26 | argument corresponding to other | stmts5.go:7:22:7:26 | initialization of other | +| stmts5.go:7:22:7:26 | initialization of other | stmts5.go:8:2:8:3 | me | +| stmts5.go:8:2:8:3 | me | stmts5.go:8:2:8:7 | selection of val | +| stmts5.go:8:2:8:7 | assignment to field val | stmts5.go:9:1:9:1 | exit | +| stmts5.go:8:2:8:7 | selection of val | stmts5.go:8:12:8:16 | other | +| stmts5.go:8:2:8:16 | ... += ... | stmts5.go:8:2:8:7 | assignment to field val | +| stmts5.go:8:12:8:16 | other | stmts5.go:8:2:8:16 | ... += ... | +| stmts5.go:11:1:11:1 | entry | stmts5.go:11:20:12:1 | skip | +| stmts5.go:11:1:12:1 | function declaration | stmts5.go:0:0:0:0 | exit | +| stmts5.go:11:14:11:16 | skip | stmts5.go:11:1:12:1 | function declaration | +| stmts5.go:11:20:12:1 | skip | stmts5.go:12:1:12:1 | exit | +| stmts6.go:0:0:0:0 | entry | stmts6.go:3:6:3:11 | skip | +| stmts6.go:3:1:3:1 | entry | stmts6.go:4:5:4:8 | true | +| stmts6.go:3:1:8:1 | function declaration | stmts6.go:0:0:0:0 | exit | +| stmts6.go:3:6:3:11 | skip | stmts6.go:3:1:8:1 | function declaration | +| stmts6.go:4:5:4:8 | true | stmts6.go:4:8:4:8 | true is true | +| stmts6.go:4:8:4:8 | true is false | stmts6.go:7:9:7:10 | 23 | +| stmts6.go:4:8:4:8 | true is true | stmts6.go:5:10:5:11 | 42 | +| stmts6.go:5:3:5:11 | return statement | stmts6.go:8:1:8:1 | exit | +| stmts6.go:5:10:5:11 | 42 | stmts6.go:5:3:5:11 | return statement | +| stmts6.go:7:9:7:10 | 23 | stmts6.go:7:2:7:10 | return statement | +| stmts7.go:0:0:0:0 | entry | stmts7.go:3:1:3:12 | skip | +| stmts7.go:3:1:3:12 | skip | stmts7.go:5:6:5:17 | skip | +| stmts7.go:5:1:5:1 | entry | stmts7.go:6:2:6:5 | skip | +| stmts7.go:5:1:8:1 | function declaration | stmts7.go:10:6:10:15 | skip | +| stmts7.go:5:6:5:17 | skip | stmts7.go:5:1:8:1 | function declaration | +| stmts7.go:6:2:6:5 | assignment to blah | stmts7.go:7:2:7:12 | selection of Println | +| stmts7.go:6:2:6:5 | skip | stmts7.go:6:10:6:16 | recover | +| stmts7.go:6:10:6:16 | recover | stmts7.go:6:10:6:18 | call to recover | +| stmts7.go:6:10:6:18 | call to recover | stmts7.go:6:2:6:5 | assignment to blah | +| stmts7.go:7:2:7:12 | selection of Println | stmts7.go:7:14:7:26 | "recovered: " | +| stmts7.go:7:2:7:33 | call to Println | stmts7.go:8:1:8:1 | exit | +| stmts7.go:7:14:7:26 | "recovered: " | stmts7.go:7:29:7:32 | blah | +| stmts7.go:7:29:7:32 | blah | stmts7.go:7:2:7:33 | call to Println | +| stmts7.go:10:1:10:1 | entry | stmts7.go:11:8:11:19 | recoverPanic | +| stmts7.go:10:1:13:1 | function declaration | stmts7.go:15:1:17:1 | skip | +| stmts7.go:10:6:10:15 | skip | stmts7.go:10:1:13:1 | function declaration | +| stmts7.go:11:2:11:21 | defer statement | stmts7.go:12:2:12:6 | panic | +| stmts7.go:11:8:11:19 | recoverPanic | stmts7.go:11:2:11:21 | defer statement | +| stmts7.go:11:8:11:21 | call to recoverPanic | stmts7.go:13:1:13:1 | exit | +| stmts7.go:12:2:12:6 | panic | stmts7.go:12:8:12:9 | "" | +| stmts7.go:12:2:12:10 | call to panic | stmts7.go:11:8:11:21 | call to recoverPanic | +| stmts7.go:12:8:12:9 | "" | stmts7.go:12:2:12:10 | call to panic | +| stmts7.go:15:1:17:1 | skip | stmts7.go:19:26:19:28 | skip | +| stmts7.go:19:1:19:1 | entry | stmts7.go:19:7:19:13 | argument corresponding to methods | +| stmts7.go:19:1:21:1 | function declaration | stmts7.go:23:6:23:14 | skip | +| stmts7.go:19:7:19:13 | argument corresponding to methods | stmts7.go:19:7:19:13 | initialization of methods | +| stmts7.go:19:7:19:13 | initialization of methods | stmts7.go:20:2:20:8 | methods | +| stmts7.go:19:26:19:28 | skip | stmts7.go:19:1:21:1 | function declaration | +| stmts7.go:20:2:20:8 | implicit dereference | stmts7.go:20:2:20:11 | selection of fn | +| stmts7.go:20:2:20:8 | implicit dereference | stmts7.go:21:1:21:1 | exit | +| stmts7.go:20:2:20:8 | methods | stmts7.go:20:2:20:8 | implicit dereference | +| stmts7.go:20:2:20:11 | selection of fn | stmts7.go:20:2:20:13 | call to fn | +| stmts7.go:20:2:20:13 | call to fn | stmts7.go:21:1:21:1 | exit | +| stmts7.go:23:1:23:1 | entry | stmts7.go:23:16:23:23 | argument corresponding to callback | +| stmts7.go:23:1:28:1 | function declaration | stmts7.go:0:0:0:0 | exit | +| stmts7.go:23:6:23:14 | skip | stmts7.go:23:1:28:1 | function declaration | +| stmts7.go:23:16:23:23 | argument corresponding to callback | stmts7.go:23:16:23:23 | initialization of callback | +| stmts7.go:23:16:23:23 | initialization of callback | stmts7.go:24:8:24:15 | callback | +| stmts7.go:24:2:24:20 | defer statement | stmts7.go:25:10:25:17 | callback | +| stmts7.go:24:8:24:15 | callback | stmts7.go:24:8:24:18 | selection of fn | +| stmts7.go:24:8:24:18 | selection of fn | stmts7.go:24:2:24:20 | defer statement | +| stmts7.go:24:8:24:20 | call to fn | stmts7.go:28:1:28:1 | exit | +| stmts7.go:25:2:25:23 | defer statement | stmts7.go:26:2:26:12 | selection of Println | +| stmts7.go:25:8:25:18 | implicit dereference | stmts7.go:24:8:24:20 | call to fn | +| stmts7.go:25:8:25:18 | implicit dereference | stmts7.go:25:8:25:21 | selection of fn | +| stmts7.go:25:8:25:21 | selection of fn | stmts7.go:25:2:25:23 | defer statement | +| stmts7.go:25:8:25:23 | call to fn | stmts7.go:24:8:24:20 | call to fn | +| stmts7.go:25:9:25:17 | &... | stmts7.go:25:8:25:18 | implicit dereference | +| stmts7.go:25:10:25:17 | callback | stmts7.go:25:9:25:17 | &... | +| stmts7.go:26:2:26:12 | selection of Println | stmts7.go:26:14:26:30 | "print something" | +| stmts7.go:26:2:26:31 | call to Println | stmts7.go:25:8:25:23 | call to fn | +| stmts7.go:26:2:26:31 | call to Println | stmts7.go:27:9:27:13 | false | +| stmts7.go:26:14:26:30 | "print something" | stmts7.go:26:2:26:31 | call to Println | +| stmts7.go:27:2:27:13 | return statement | stmts7.go:25:8:25:23 | call to fn | +| stmts7.go:27:9:27:13 | false | stmts7.go:27:2:27:13 | return statement | +| stmts8.go:0:0:0:0 | entry | stmts8.go:3:6:3:11 | skip | +| stmts8.go:3:1:3:1 | entry | stmts8.go:3:13:3:13 | argument corresponding to x | +| stmts8.go:3:1:7:1 | function declaration | stmts8.go:9:6:9:12 | skip | +| stmts8.go:3:6:3:11 | skip | stmts8.go:3:1:7:1 | function declaration | +| stmts8.go:3:13:3:13 | argument corresponding to x | stmts8.go:3:13:3:13 | initialization of x | +| stmts8.go:3:13:3:13 | initialization of x | stmts8.go:4:2:4:2 | skip | +| stmts8.go:4:2:4:2 | assignment to y | stmts8.go:5:2:5:2 | skip | +| stmts8.go:4:2:4:2 | skip | stmts8.go:4:7:4:7 | x | +| stmts8.go:4:7:4:7 | x | stmts8.go:4:12:4:12 | 5 | +| stmts8.go:4:7:4:12 | ...>>... | stmts8.go:4:2:4:2 | assignment to y | +| stmts8.go:4:12:4:12 | 5 | stmts8.go:4:7:4:12 | ...>>... | +| stmts8.go:5:2:5:2 | assignment to z | stmts8.go:6:9:6:9 | z | +| stmts8.go:5:2:5:2 | skip | stmts8.go:5:7:5:7 | x | +| stmts8.go:5:7:5:7 | x | stmts8.go:5:12:5:12 | 1 | +| stmts8.go:5:7:5:13 | ...%... | stmts8.go:5:2:5:2 | assignment to z | +| stmts8.go:5:12:5:12 | 1 | stmts8.go:5:7:5:13 | ...%... | +| stmts8.go:6:2:6:17 | return statement | stmts8.go:7:1:7:1 | exit | +| stmts8.go:6:9:6:9 | z | stmts8.go:6:12:6:12 | y | +| stmts8.go:6:12:6:12 | y | stmts8.go:6:16:6:17 | 13 | +| stmts8.go:6:12:6:17 | ...%... | stmts8.go:6:2:6:17 | return statement | +| stmts8.go:6:16:6:17 | 13 | stmts8.go:6:12:6:17 | ...%... | +| stmts8.go:9:1:9:1 | entry | stmts8.go:10:5:10:9 | linux | +| stmts8.go:9:1:14:1 | function declaration | stmts8.go:0:0:0:0 | exit | +| stmts8.go:9:6:9:12 | skip | stmts8.go:9:1:14:1 | function declaration | +| stmts8.go:10:5:10:9 | linux | stmts8.go:10:9:10:9 | linux is false | +| stmts8.go:10:5:10:9 | linux | stmts8.go:10:9:10:9 | linux is true | +| stmts8.go:10:9:10:9 | linux is false | stmts8.go:13:9:13:13 | false | +| stmts8.go:10:9:10:9 | linux is true | stmts8.go:11:10:11:13 | true | +| stmts8.go:11:3:11:13 | return statement | stmts8.go:14:1:14:1 | exit | +| stmts8.go:11:10:11:13 | true | stmts8.go:11:3:11:13 | return statement | +| stmts8.go:13:2:13:13 | return statement | stmts8.go:14:1:14:1 | exit | +| stmts8.go:13:9:13:13 | false | stmts8.go:13:2:13:13 | return statement | +| stmts.go:0:0:0:0 | entry | stmts.go:3:1:3:12 | skip | +| stmts.go:3:1:3:12 | skip | stmts.go:10:6:10:10 | skip | +| stmts.go:10:1:10:1 | entry | stmts.go:10:12:10:12 | argument corresponding to b | +| stmts.go:10:1:43:1 | function declaration | stmts.go:46:6:46:10 | skip | +| stmts.go:10:6:10:10 | skip | stmts.go:10:1:43:1 | function declaration | +| stmts.go:10:12:10:12 | argument corresponding to b | stmts.go:10:12:10:12 | initialization of b | +| stmts.go:10:12:10:12 | initialization of b | stmts.go:12:7:12:7 | b | +| stmts.go:12:6:12:7 | !... | stmts.go:12:7:12:7 | !... is false | +| stmts.go:12:6:12:7 | !... | stmts.go:12:7:12:7 | !... is true | +| stmts.go:12:7:12:7 | !... is false | stmts.go:15:3:16:3 | skip | +| stmts.go:12:7:12:7 | !... is true | stmts.go:13:4:13:13 | skip | +| stmts.go:12:7:12:7 | b | stmts.go:12:6:12:7 | !... | +| stmts.go:13:4:13:13 | skip | stmts.go:23:6:23:9 | true | +| stmts.go:15:3:16:3 | skip | stmts.go:17:3:17:3 | skip | +| stmts.go:17:3:17:3 | skip | stmts.go:20:2:20:12 | selection of Println | +| stmts.go:20:2:20:12 | selection of Println | stmts.go:20:14:20:17 | "Hi" | +| stmts.go:20:2:20:18 | call to Println | stmts.go:23:6:23:9 | true | +| stmts.go:20:2:20:18 | call to Println | stmts.go:43:1:43:1 | exit | +| stmts.go:20:14:20:17 | "Hi" | stmts.go:20:2:20:18 | call to Println | +| stmts.go:23:6:23:9 | true | stmts.go:23:9:23:9 | true is true | +| stmts.go:23:9:23:9 | true is false | stmts.go:39:2:39:2 | skip | +| stmts.go:23:9:23:9 | true is true | stmts.go:24:7:24:7 | skip | +| stmts.go:24:7:24:7 | assignment to i | stmts.go:24:15:24:15 | i | +| stmts.go:24:7:24:7 | skip | stmts.go:24:12:24:12 | 0 | +| stmts.go:24:12:24:12 | 0 | stmts.go:24:7:24:7 | assignment to i | +| stmts.go:24:15:24:15 | i | stmts.go:24:19:24:20 | 10 | +| stmts.go:24:15:24:20 | ...<... | stmts.go:24:20:24:20 | ...<... is false | +| stmts.go:24:15:24:20 | ...<... | stmts.go:24:20:24:20 | ...<... is true | +| stmts.go:24:19:24:20 | 10 | stmts.go:24:15:24:20 | ...<... | +| stmts.go:24:20:24:20 | ...<... is false | stmts.go:23:6:23:9 | true | +| stmts.go:24:20:24:20 | ...<... is true | stmts.go:25:7:25:7 | skip | +| stmts.go:24:23:24:23 | i | stmts.go:24:23:24:25 | 1 | +| stmts.go:24:23:24:25 | 1 | stmts.go:24:23:24:25 | rhs of increment statement | +| stmts.go:24:23:24:25 | increment statement | stmts.go:24:15:24:15 | i | +| stmts.go:24:23:24:25 | rhs of increment statement | stmts.go:24:23:24:25 | increment statement | +| stmts.go:25:7:25:7 | assignment to j | stmts.go:25:19:25:19 | j | +| stmts.go:25:7:25:7 | skip | stmts.go:25:12:25:12 | i | +| stmts.go:25:12:25:12 | i | stmts.go:25:16:25:16 | 1 | +| stmts.go:25:12:25:16 | ...-... | stmts.go:25:7:25:7 | assignment to j | +| stmts.go:25:16:25:16 | 1 | stmts.go:25:12:25:16 | ...-... | +| stmts.go:25:19:25:19 | j | stmts.go:25:23:25:23 | 5 | +| stmts.go:25:19:25:23 | ...>... | stmts.go:25:23:25:23 | ...>... is false | +| stmts.go:25:19:25:23 | ...>... | stmts.go:25:23:25:23 | ...>... is true | +| stmts.go:25:23:25:23 | 5 | stmts.go:25:19:25:23 | ...>... | +| stmts.go:25:23:25:23 | ...>... is false | stmts.go:27:14:27:14 | i | +| stmts.go:25:23:25:23 | ...>... is true | stmts.go:26:5:26:15 | skip | +| stmts.go:26:5:26:15 | skip | stmts.go:39:2:39:2 | skip | +| stmts.go:27:14:27:14 | i | stmts.go:27:18:27:18 | 3 | +| stmts.go:27:14:27:18 | ...<... | stmts.go:27:18:27:18 | ...<... is false | +| stmts.go:27:14:27:18 | ...<... | stmts.go:27:18:27:18 | ...<... is true | +| stmts.go:27:18:27:18 | 3 | stmts.go:27:14:27:18 | ...<... | +| stmts.go:27:18:27:18 | ...<... is false | stmts.go:29:14:29:14 | i | +| stmts.go:27:18:27:18 | ...<... is true | stmts.go:28:5:28:9 | skip | +| stmts.go:28:5:28:9 | skip | stmts.go:23:6:23:9 | true | +| stmts.go:29:14:29:14 | i | stmts.go:29:19:29:19 | 9 | +| stmts.go:29:14:29:19 | ...!=... | stmts.go:29:19:29:19 | ...!=... is false | +| stmts.go:29:14:29:19 | ...!=... | stmts.go:29:19:29:19 | ...!=... is true | +| stmts.go:29:19:29:19 | 9 | stmts.go:29:14:29:19 | ...!=... | +| stmts.go:29:19:29:19 | ...!=... is false | stmts.go:31:14:31:14 | i | +| stmts.go:29:19:29:19 | ...!=... is true | stmts.go:30:5:30:18 | skip | +| stmts.go:30:5:30:18 | skip | stmts.go:23:6:23:9 | true | +| stmts.go:31:14:31:14 | i | stmts.go:31:19:31:19 | 4 | +| stmts.go:31:14:31:19 | ...>=... | stmts.go:31:19:31:19 | ...>=... is false | +| stmts.go:31:14:31:19 | ...>=... | stmts.go:31:19:31:19 | ...>=... is true | +| stmts.go:31:19:31:19 | 4 | stmts.go:31:14:31:19 | ...>=... | +| stmts.go:31:19:31:19 | ...>=... is false | stmts.go:34:5:34:12 | skip | +| stmts.go:31:19:31:19 | ...>=... is true | stmts.go:32:5:32:14 | skip | +| stmts.go:32:5:32:14 | skip | stmts.go:23:6:23:9 | true | +| stmts.go:34:5:34:12 | skip | stmts.go:24:23:24:23 | i | +| stmts.go:39:2:39:2 | assignment to k | stmts.go:41:3:41:12 | skip | +| stmts.go:39:2:39:2 | skip | stmts.go:39:7:39:7 | 9 | +| stmts.go:39:7:39:7 | 9 | stmts.go:39:2:39:2 | assignment to k | +| stmts.go:40:10:40:10 | k | stmts.go:40:10:40:12 | 1 | +| stmts.go:40:10:40:12 | 1 | stmts.go:40:10:40:12 | rhs of increment statement | +| stmts.go:40:10:40:12 | increment statement | stmts.go:41:3:41:12 | skip | +| stmts.go:40:10:40:12 | rhs of increment statement | stmts.go:40:10:40:12 | increment statement | +| stmts.go:41:3:41:12 | skip | stmts.go:23:6:23:9 | true | +| stmts.go:46:1:46:1 | entry | stmts.go:46:12:46:14 | argument corresponding to ch1 | +| stmts.go:46:1:62:1 | function declaration | stmts.go:65:6:65:10 | skip | +| stmts.go:46:6:46:10 | skip | stmts.go:46:1:62:1 | function declaration | +| stmts.go:46:12:46:14 | argument corresponding to ch1 | stmts.go:46:12:46:14 | initialization of ch1 | +| stmts.go:46:12:46:14 | initialization of ch1 | stmts.go:46:26:46:28 | argument corresponding to ch2 | +| stmts.go:46:26:46:28 | argument corresponding to ch2 | stmts.go:46:26:46:28 | initialization of ch2 | +| stmts.go:46:26:46:28 | initialization of ch2 | stmts.go:47:6:47:6 | skip | +| stmts.go:47:6:47:6 | assignment to a | stmts.go:48:6:48:6 | skip | +| stmts.go:47:6:47:6 | skip | stmts.go:47:6:47:6 | zero value for a | +| stmts.go:47:6:47:6 | zero value for a | stmts.go:47:6:47:6 | assignment to a | +| stmts.go:48:6:48:6 | assignment to w | stmts.go:51:9:51:11 | ch1 | +| stmts.go:48:6:48:6 | skip | stmts.go:48:6:48:6 | zero value for w | +| stmts.go:48:6:48:6 | zero value for w | stmts.go:48:6:48:6 | assignment to w | +| stmts.go:50:2:59:2 | select statement | stmts.go:51:7:51:11 | <-... | +| stmts.go:50:2:59:2 | select statement | stmts.go:53:17:53:21 | <-... | +| stmts.go:50:2:59:2 | select statement | stmts.go:57:3:57:13 | selection of Println | +| stmts.go:50:2:59:2 | select statement | stmts.go:58:7:58:15 | send statement | +| stmts.go:51:7:51:11 | <-... | stmts.go:52:3:52:13 | selection of Println | +| stmts.go:51:9:51:11 | ch1 | stmts.go:53:19:53:21 | ch2 | +| stmts.go:52:3:52:13 | selection of Println | stmts.go:52:15:52:30 | "Heard from ch1" | +| stmts.go:52:3:52:31 | call to Println | stmts.go:61:2:61:10 | select statement | +| stmts.go:52:3:52:31 | call to Println | stmts.go:62:1:62:1 | exit | +| stmts.go:52:15:52:30 | "Heard from ch1" | stmts.go:52:3:52:31 | call to Println | +| stmts.go:53:7:53:7 | a | stmts.go:53:9:53:9 | 0 | +| stmts.go:53:7:53:10 | assignment to element | stmts.go:53:7:53:21 | ... = ...[1] | +| stmts.go:53:7:53:10 | skip | stmts.go:53:13:53:13 | skip | +| stmts.go:53:7:53:10 | skip | stmts.go:62:1:62:1 | exit | +| stmts.go:53:7:53:21 | ... = ...[0] | stmts.go:53:7:53:10 | assignment to element | +| stmts.go:53:7:53:21 | ... = ...[1] | stmts.go:53:13:53:13 | assignment to w | +| stmts.go:53:9:53:9 | 0 | stmts.go:53:7:53:10 | skip | +| stmts.go:53:13:53:13 | assignment to w | stmts.go:54:3:54:13 | selection of Println | +| stmts.go:53:13:53:13 | skip | stmts.go:53:7:53:21 | ... = ...[0] | +| stmts.go:53:17:53:21 | <-... | stmts.go:53:7:53:7 | a | +| stmts.go:53:19:53:21 | ch2 | stmts.go:58:7:58:9 | ch1 | +| stmts.go:54:3:54:13 | selection of Println | stmts.go:54:15:54:15 | a | +| stmts.go:54:3:54:16 | call to Println | stmts.go:55:3:55:13 | selection of Println | +| stmts.go:54:3:54:16 | call to Println | stmts.go:62:1:62:1 | exit | +| stmts.go:54:15:54:15 | a | stmts.go:54:3:54:16 | call to Println | +| stmts.go:55:3:55:13 | selection of Println | stmts.go:55:15:55:15 | w | +| stmts.go:55:3:55:16 | call to Println | stmts.go:61:2:61:10 | select statement | +| stmts.go:55:3:55:16 | call to Println | stmts.go:62:1:62:1 | exit | +| stmts.go:55:15:55:15 | w | stmts.go:55:3:55:16 | call to Println | +| stmts.go:57:3:57:13 | selection of Println | stmts.go:57:3:57:15 | call to Println | +| stmts.go:57:3:57:15 | call to Println | stmts.go:61:2:61:10 | select statement | +| stmts.go:57:3:57:15 | call to Println | stmts.go:62:1:62:1 | exit | +| stmts.go:58:2:58:16 | skip | stmts.go:61:2:61:10 | select statement | +| stmts.go:58:7:58:9 | ch1 | stmts.go:58:14:58:15 | 42 | +| stmts.go:58:7:58:15 | send statement | stmts.go:58:2:58:16 | skip | +| stmts.go:58:7:58:15 | send statement | stmts.go:62:1:62:1 | exit | +| stmts.go:58:14:58:15 | 42 | stmts.go:50:2:59:2 | select statement | +| stmts.go:65:1:65:1 | entry | stmts.go:65:12:65:12 | argument corresponding to x | +| stmts.go:65:1:72:1 | function declaration | stmts.go:75:6:75:10 | skip | +| stmts.go:65:6:65:10 | skip | stmts.go:65:1:72:1 | function declaration | +| stmts.go:65:12:65:12 | argument corresponding to x | stmts.go:65:12:65:12 | initialization of x | +| stmts.go:65:12:65:12 | initialization of x | stmts.go:66:5:66:5 | x | +| stmts.go:66:5:66:5 | x | stmts.go:66:9:66:9 | 0 | +| stmts.go:66:5:66:9 | ...>... | stmts.go:66:9:66:9 | ...>... is false | +| stmts.go:66:5:66:9 | ...>... | stmts.go:66:9:66:9 | ...>... is true | +| stmts.go:66:9:66:9 | 0 | stmts.go:66:5:66:9 | ...>... | +| stmts.go:66:9:66:9 | ...>... is false | stmts.go:69:9:69:34 | function literal | +| stmts.go:66:9:66:9 | ...>... is true | stmts.go:67:9:67:33 | function literal | +| stmts.go:67:3:67:35 | defer statement | stmts.go:71:9:71:10 | 42 | +| stmts.go:67:9:67:9 | entry | stmts.go:67:18:67:28 | selection of Println | +| stmts.go:67:9:67:33 | function literal | stmts.go:67:3:67:35 | defer statement | +| stmts.go:67:9:67:35 | function call | stmts.go:72:1:72:1 | exit | +| stmts.go:67:18:67:28 | selection of Println | stmts.go:67:30:67:30 | x | +| stmts.go:67:18:67:31 | call to Println | stmts.go:67:33:67:33 | exit | +| stmts.go:67:30:67:30 | x | stmts.go:67:18:67:31 | call to Println | +| stmts.go:69:3:69:36 | defer statement | stmts.go:71:9:71:10 | 42 | +| stmts.go:69:9:69:9 | entry | stmts.go:69:18:69:28 | selection of Println | +| stmts.go:69:9:69:34 | function literal | stmts.go:69:3:69:36 | defer statement | +| stmts.go:69:9:69:36 | function call | stmts.go:72:1:72:1 | exit | +| stmts.go:69:18:69:28 | selection of Println | stmts.go:69:31:69:31 | x | +| stmts.go:69:18:69:32 | call to Println | stmts.go:69:34:69:34 | exit | +| stmts.go:69:30:69:31 | -... | stmts.go:69:18:69:32 | call to Println | +| stmts.go:69:31:69:31 | x | stmts.go:69:30:69:31 | -... | +| stmts.go:71:2:71:10 | return statement | stmts.go:67:9:67:35 | function call | +| stmts.go:71:2:71:10 | return statement | stmts.go:69:9:69:36 | function call | +| stmts.go:71:9:71:10 | 42 | stmts.go:71:2:71:10 | return statement | +| stmts.go:75:1:75:1 | entry | stmts.go:75:12:75:12 | argument corresponding to x | +| stmts.go:75:1:109:1 | function declaration | stmts.go:112:6:112:10 | skip | +| stmts.go:75:6:75:10 | skip | stmts.go:75:1:109:1 | function declaration | +| stmts.go:75:12:75:12 | argument corresponding to x | stmts.go:75:12:75:12 | initialization of x | +| stmts.go:75:12:75:12 | initialization of x | stmts.go:76:9:76:9 | x | +| stmts.go:76:9:76:9 | x | stmts.go:79:9:79:9 | skip | +| stmts.go:79:9:79:9 | assignment to y | stmts.go:79:17:79:17 | y | +| stmts.go:79:9:79:9 | skip | stmts.go:79:14:79:14 | x | +| stmts.go:79:14:79:14 | x | stmts.go:79:9:79:9 | assignment to y | +| stmts.go:79:17:79:17 | y | stmts.go:79:21:79:22 | 19 | +| stmts.go:79:17:79:22 | ...-... | stmts.go:81:3:81:7 | test5 | +| stmts.go:79:21:79:22 | 19 | stmts.go:79:17:79:22 | ...-... | +| stmts.go:81:3:81:7 | test5 | stmts.go:81:9:81:13 | false | +| stmts.go:81:3:81:14 | call to test5 | stmts.go:109:1:109:1 | exit | +| stmts.go:81:9:81:13 | false | stmts.go:81:3:81:14 | call to test5 | +| stmts.go:84:9:84:9 | x | stmts.go:85:7:85:7 | 1 | +| stmts.go:84:9:84:9 | x | stmts.go:90:9:90:9 | x | +| stmts.go:85:2:85:8 | skip | stmts.go:90:9:90:9 | x | +| stmts.go:85:7:85:7 | 1 | stmts.go:85:7:85:7 | case 1 | +| stmts.go:85:7:85:7 | case 1 | stmts.go:85:2:85:8 | skip | +| stmts.go:85:7:85:7 | case 1 | stmts.go:86:7:86:7 | 2 | +| stmts.go:86:7:86:7 | 2 | stmts.go:86:7:86:7 | case 2 | +| stmts.go:86:7:86:7 | case 2 | stmts.go:86:10:86:10 | 3 | +| stmts.go:86:7:86:7 | case 2 | stmts.go:87:3:87:7 | test5 | +| stmts.go:86:10:86:10 | 3 | stmts.go:86:10:86:10 | case 3 | +| stmts.go:86:10:86:10 | case 3 | stmts.go:87:3:87:7 | test5 | +| stmts.go:86:10:86:10 | case 3 | stmts.go:90:9:90:9 | x | +| stmts.go:87:3:87:7 | test5 | stmts.go:87:9:87:12 | true | +| stmts.go:87:9:87:12 | true | stmts.go:87:3:87:13 | call to test5 | +| stmts.go:90:9:90:9 | x | stmts.go:91:7:91:7 | 1 | +| stmts.go:90:9:90:9 | x | stmts.go:98:9:98:9 | x | +| stmts.go:91:7:91:7 | 1 | stmts.go:91:7:91:7 | case 1 | +| stmts.go:91:7:91:7 | case 1 | stmts.go:92:3:92:7 | test5 | +| stmts.go:91:7:91:7 | case 1 | stmts.go:94:7:94:11 | ...-... | +| stmts.go:92:3:92:7 | test5 | stmts.go:92:9:92:13 | false | +| stmts.go:92:9:92:13 | false | stmts.go:92:3:92:14 | call to test5 | +| stmts.go:93:3:93:13 | skip | stmts.go:95:3:95:7 | test5 | +| stmts.go:94:7:94:11 | ...-... | stmts.go:94:7:94:11 | case ...-... | +| stmts.go:94:7:94:11 | case ...-... | stmts.go:95:3:95:7 | test5 | +| stmts.go:94:7:94:11 | case ...-... | stmts.go:98:9:98:9 | x | +| stmts.go:95:3:95:7 | test5 | stmts.go:95:9:95:12 | true | +| stmts.go:95:9:95:12 | true | stmts.go:95:3:95:13 | call to test5 | +| stmts.go:98:9:98:9 | x | stmts.go:100:7:100:7 | 2 | +| stmts.go:99:2:99:9 | skip | stmts.go:104:2:104:2 | true | +| stmts.go:100:7:100:7 | 2 | stmts.go:100:7:100:7 | case 2 | +| stmts.go:100:7:100:7 | case 2 | stmts.go:99:2:99:9 | skip | +| stmts.go:100:7:100:7 | case 2 | stmts.go:101:3:101:7 | test5 | +| stmts.go:101:3:101:7 | test5 | stmts.go:101:9:101:12 | true | +| stmts.go:101:9:101:12 | true | stmts.go:101:3:101:13 | call to test5 | +| stmts.go:104:2:104:2 | true | stmts.go:107:7:107:10 | true | +| stmts.go:107:7:107:10 | case true | stmts.go:107:10:107:10 | true is false | +| stmts.go:107:7:107:10 | case true | stmts.go:107:10:107:10 | true is true | +| stmts.go:107:7:107:10 | true | stmts.go:107:7:107:10 | case true | +| stmts.go:107:10:107:10 | true is false | stmts.go:106:3:106:7 | skip | +| stmts.go:107:10:107:10 | true is true | stmts.go:107:2:107:11 | skip | +| stmts.go:112:1:112:1 | entry | stmts.go:112:12:112:12 | argument corresponding to x | +| stmts.go:112:1:125:1 | function declaration | stmts.go:128:6:128:11 | skip | +| stmts.go:112:6:112:10 | skip | stmts.go:112:1:125:1 | function declaration | +| stmts.go:112:12:112:12 | argument corresponding to x | stmts.go:112:12:112:12 | initialization of x | +| stmts.go:112:12:112:12 | initialization of x | stmts.go:113:9:113:9 | skip | +| stmts.go:113:9:113:9 | assignment to y | stmts.go:114:7:114:11 | case error | +| stmts.go:113:9:113:9 | assignment to y | stmts.go:121:9:121:9 | skip | +| stmts.go:113:9:113:9 | skip | stmts.go:113:14:113:14 | x | +| stmts.go:113:14:113:14 | x | stmts.go:113:14:113:21 | type assertion | +| stmts.go:113:14:113:21 | type assertion | stmts.go:113:9:113:9 | assignment to y | +| stmts.go:114:7:114:11 | case error | stmts.go:114:14:114:19 | case string | +| stmts.go:114:7:114:11 | case error | stmts.go:115:3:115:13 | selection of Println | +| stmts.go:114:14:114:19 | case string | stmts.go:115:3:115:13 | selection of Println | +| stmts.go:114:14:114:19 | case string | stmts.go:116:7:116:13 | case float32 | +| stmts.go:115:3:115:13 | selection of Println | stmts.go:115:15:115:15 | y | +| stmts.go:115:3:115:16 | call to Println | stmts.go:121:9:121:9 | skip | +| stmts.go:115:3:115:16 | call to Println | stmts.go:125:1:125:1 | exit | +| stmts.go:115:15:115:15 | y | stmts.go:115:3:115:16 | call to Println | +| stmts.go:116:7:116:13 | case float32 | stmts.go:117:3:117:7 | test5 | +| stmts.go:116:7:116:13 | case float32 | stmts.go:121:9:121:9 | skip | +| stmts.go:117:3:117:7 | test5 | stmts.go:117:9:117:12 | true | +| stmts.go:117:3:117:13 | call to test5 | stmts.go:125:1:125:1 | exit | +| stmts.go:117:9:117:12 | true | stmts.go:117:3:117:13 | call to test5 | +| stmts.go:118:3:118:7 | test5 | stmts.go:118:9:118:13 | false | +| stmts.go:118:9:118:13 | false | stmts.go:118:3:118:14 | call to test5 | +| stmts.go:121:9:121:9 | assignment to y | stmts.go:121:17:121:17 | y | +| stmts.go:121:9:121:9 | skip | stmts.go:121:14:121:14 | x | +| stmts.go:121:14:121:14 | x | stmts.go:121:9:121:9 | assignment to y | +| stmts.go:121:17:121:17 | y | stmts.go:121:17:121:24 | type assertion | +| stmts.go:121:17:121:24 | type assertion | stmts.go:123:3:123:7 | test5 | +| stmts.go:123:3:123:7 | test5 | stmts.go:123:9:123:13 | false | +| stmts.go:123:3:123:14 | call to test5 | stmts.go:125:1:125:1 | exit | +| stmts.go:123:9:123:13 | false | stmts.go:123:3:123:14 | call to test5 | +| stmts.go:128:1:128:1 | entry | stmts.go:128:13:128:13 | argument corresponding to f | +| stmts.go:128:1:130:1 | function declaration | stmts.go:133:6:133:11 | skip | +| stmts.go:128:6:128:11 | skip | stmts.go:128:1:130:1 | function declaration | +| stmts.go:128:13:128:13 | argument corresponding to f | stmts.go:128:13:128:13 | initialization of f | +| stmts.go:128:13:128:13 | initialization of f | stmts.go:129:5:129:5 | f | +| stmts.go:129:2:129:7 | go statement | stmts.go:130:1:130:1 | exit | +| stmts.go:129:5:129:5 | f | stmts.go:129:2:129:7 | go statement | +| stmts.go:133:1:133:1 | entry | stmts.go:133:13:133:14 | argument corresponding to xs | +| stmts.go:133:1:147:1 | function declaration | stmts.go:0:0:0:0 | exit | +| stmts.go:133:6:133:11 | skip | stmts.go:133:1:147:1 | function declaration | +| stmts.go:133:13:133:14 | argument corresponding to xs | stmts.go:133:13:133:14 | initialization of xs | +| stmts.go:133:13:133:14 | initialization of xs | stmts.go:134:17:134:18 | xs | +| stmts.go:134:2:139:2 | range statement[0] | stmts.go:134:6:134:6 | assignment to x | +| stmts.go:134:6:134:6 | assignment to x | stmts.go:135:6:135:6 | x | +| stmts.go:134:6:134:6 | skip | stmts.go:134:2:139:2 | range statement[0] | +| stmts.go:134:17:134:18 | next key-value pair in range | stmts.go:134:6:134:6 | skip | +| stmts.go:134:17:134:18 | next key-value pair in range | stmts.go:141:20:141:21 | xs | +| stmts.go:134:17:134:18 | xs | stmts.go:134:17:134:18 | next key-value pair in range | +| stmts.go:135:6:135:6 | x | stmts.go:135:10:135:10 | 5 | +| stmts.go:135:6:135:10 | ...>... | stmts.go:135:10:135:10 | ...>... is false | +| stmts.go:135:6:135:10 | ...>... | stmts.go:135:10:135:10 | ...>... is true | +| stmts.go:135:10:135:10 | 5 | stmts.go:135:6:135:10 | ...>... | +| stmts.go:135:10:135:10 | ...>... is false | stmts.go:138:3:138:11 | selection of Print | +| stmts.go:135:10:135:10 | ...>... is true | stmts.go:136:4:136:11 | skip | +| stmts.go:136:4:136:11 | skip | stmts.go:134:17:134:18 | next key-value pair in range | +| stmts.go:138:3:138:11 | selection of Print | stmts.go:138:13:138:13 | x | +| stmts.go:138:3:138:14 | call to Print | stmts.go:134:17:134:18 | next key-value pair in range | +| stmts.go:138:3:138:14 | call to Print | stmts.go:147:1:147:1 | exit | +| stmts.go:138:13:138:13 | x | stmts.go:138:3:138:14 | call to Print | +| stmts.go:141:2:143:2 | range statement[0] | stmts.go:141:2:143:2 | range statement[1] | +| stmts.go:141:2:143:2 | range statement[1] | stmts.go:141:6:141:6 | assignment to i | +| stmts.go:141:6:141:6 | assignment to i | stmts.go:141:9:141:9 | assignment to v | +| stmts.go:141:6:141:6 | skip | stmts.go:141:9:141:9 | skip | +| stmts.go:141:9:141:9 | assignment to v | stmts.go:142:3:142:11 | selection of Print | +| stmts.go:141:9:141:9 | skip | stmts.go:141:2:143:2 | range statement[0] | +| stmts.go:141:20:141:21 | next key-value pair in range | stmts.go:141:6:141:6 | skip | +| stmts.go:141:20:141:21 | next key-value pair in range | stmts.go:145:12:145:13 | xs | +| stmts.go:141:20:141:21 | xs | stmts.go:141:20:141:21 | next key-value pair in range | +| stmts.go:142:3:142:11 | selection of Print | stmts.go:142:13:142:13 | i | +| stmts.go:142:3:142:17 | call to Print | stmts.go:141:20:141:21 | next key-value pair in range | +| stmts.go:142:3:142:17 | call to Print | stmts.go:147:1:147:1 | exit | +| stmts.go:142:13:142:13 | i | stmts.go:142:16:142:16 | v | +| stmts.go:142:16:142:16 | v | stmts.go:142:3:142:17 | call to Print | +| stmts.go:145:12:145:13 | next key-value pair in range | stmts.go:145:15:146:2 | skip | +| stmts.go:145:12:145:13 | next key-value pair in range | stmts.go:147:1:147:1 | exit | +| stmts.go:145:12:145:13 | xs | stmts.go:145:12:145:13 | next key-value pair in range | +| stmts.go:145:15:146:2 | skip | stmts.go:145:12:145:13 | next key-value pair in range | +| tst.go:0:0:0:0 | entry | tst.go:3:6:3:10 | skip | +| tst.go:3:1:3:1 | entry | tst.go:3:12:3:12 | argument corresponding to x | +| tst.go:3:1:12:1 | function declaration | tst.go:14:6:14:11 | skip | +| tst.go:3:6:3:10 | skip | tst.go:3:1:12:1 | function declaration | +| tst.go:3:12:3:12 | argument corresponding to x | tst.go:3:12:3:12 | initialization of x | +| tst.go:3:12:3:12 | initialization of x | tst.go:4:2:4:2 | true | +| tst.go:4:2:4:2 | true | tst.go:5:7:5:7 | x | +| tst.go:5:2:5:13 | skip | tst.go:12:1:12:1 | exit | +| tst.go:5:7:5:7 | x | tst.go:5:11:5:12 | 23 | +| tst.go:5:7:5:12 | ...<... | tst.go:5:7:5:12 | case ...<... | +| tst.go:5:7:5:12 | case ...<... | tst.go:5:12:5:12 | ...<... is false | +| tst.go:5:7:5:12 | case ...<... | tst.go:5:12:5:12 | ...<... is true | +| tst.go:5:11:5:12 | 23 | tst.go:5:7:5:12 | ...<... | +| tst.go:5:12:5:12 | ...<... is false | tst.go:7:7:7:7 | x | +| tst.go:5:12:5:12 | ...<... is true | tst.go:5:2:5:13 | skip | +| tst.go:7:2:7:13 | skip | tst.go:12:1:12:1 | exit | +| tst.go:7:7:7:7 | x | tst.go:7:11:7:12 | 42 | +| tst.go:7:7:7:12 | ...<... | tst.go:7:7:7:12 | case ...<... | +| tst.go:7:7:7:12 | case ...<... | tst.go:7:12:7:12 | ...<... is false | +| tst.go:7:7:7:12 | case ...<... | tst.go:7:12:7:12 | ...<... is true | +| tst.go:7:11:7:12 | 42 | tst.go:7:7:7:12 | ...<... | +| tst.go:7:12:7:12 | ...<... is false | tst.go:9:7:9:7 | x | +| tst.go:7:12:7:12 | ...<... is true | tst.go:7:2:7:13 | skip | +| tst.go:9:2:9:13 | skip | tst.go:12:1:12:1 | exit | +| tst.go:9:7:9:7 | x | tst.go:9:11:9:12 | 23 | +| tst.go:9:7:9:12 | ...<... | tst.go:9:7:9:12 | case ...<... | +| tst.go:9:7:9:12 | case ...<... | tst.go:9:12:9:12 | ...<... is false | +| tst.go:9:7:9:12 | case ...<... | tst.go:9:12:9:12 | ...<... is true | +| tst.go:9:11:9:12 | 23 | tst.go:9:7:9:12 | ...<... | +| tst.go:9:12:9:12 | ...<... is false | tst.go:12:1:12:1 | exit | +| tst.go:9:12:9:12 | ...<... is true | tst.go:9:2:9:13 | skip | +| tst.go:14:1:14:1 | entry | tst.go:14:13:14:17 | argument corresponding to value | +| tst.go:14:1:21:1 | function declaration | tst.go:23:6:23:11 | skip | +| tst.go:14:6:14:11 | skip | tst.go:14:1:21:1 | function declaration | +| tst.go:14:13:14:17 | argument corresponding to value | tst.go:14:13:14:17 | initialization of value | +| tst.go:14:13:14:17 | initialization of value | tst.go:15:2:15:2 | true | +| tst.go:15:2:15:2 | true | tst.go:16:7:16:11 | value | +| tst.go:16:2:16:34 | skip | tst.go:21:1:21:1 | exit | +| tst.go:16:7:16:11 | value | tst.go:16:15:16:33 | ...*... | +| tst.go:16:7:16:33 | ...<... | tst.go:16:7:16:33 | case ...<... | +| tst.go:16:7:16:33 | case ...<... | tst.go:16:33:16:33 | ...<... is false | +| tst.go:16:7:16:33 | case ...<... | tst.go:16:33:16:33 | ...<... is true | +| tst.go:16:15:16:33 | ...*... | tst.go:16:7:16:33 | ...<... | +| tst.go:16:33:16:33 | ...<... is false | tst.go:18:7:18:11 | value | +| tst.go:16:33:16:33 | ...<... is true | tst.go:16:2:16:34 | skip | +| tst.go:18:2:18:39 | skip | tst.go:21:1:21:1 | exit | +| tst.go:18:7:18:11 | value | tst.go:18:15:18:38 | ...*... | +| tst.go:18:7:18:38 | ...<... | tst.go:18:7:18:38 | case ...<... | +| tst.go:18:7:18:38 | case ...<... | tst.go:18:38:18:38 | ...<... is false | +| tst.go:18:7:18:38 | case ...<... | tst.go:18:38:18:38 | ...<... is true | +| tst.go:18:15:18:38 | ...*... | tst.go:18:7:18:38 | ...<... | +| tst.go:18:38:18:38 | ...<... is false | tst.go:21:1:21:1 | exit | +| tst.go:18:38:18:38 | ...<... is true | tst.go:18:2:18:39 | skip | +| tst.go:23:1:23:1 | entry | tst.go:24:2:24:2 | true | +| tst.go:23:1:26:1 | function declaration | tst.go:28:6:28:11 | skip | +| tst.go:23:6:23:11 | skip | tst.go:23:1:26:1 | function declaration | +| tst.go:24:2:24:2 | true | tst.go:26:1:26:1 | exit | +| tst.go:28:1:28:1 | entry | tst.go:29:2:29:2 | true | +| tst.go:28:1:32:1 | function declaration | tst.go:0:0:0:0 | exit | +| tst.go:28:6:28:11 | skip | tst.go:28:1:32:1 | function declaration | +| tst.go:29:2:29:2 | true | tst.go:30:2:30:9 | skip | +| tst.go:30:2:30:9 | skip | tst.go:32:1:32:1 | exit | #select | | diff --git a/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CFG.ql b/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CFG.ql index 144a01f2aa5..3f0afd67cae 100644 --- a/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CFG.ql +++ b/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CFG.ql @@ -1,10 +1,9 @@ import go -query predicate nodes(ControlFlow::Node nd) { none() } - query predicate edges(ControlFlow::Node pred, ControlFlow::Node succ) { - none() - // succ = pred.getASuccessor() + not succ.getFile().hasBuildConstraints() and + not pred.getFile().hasBuildConstraints() and + succ = pred.getASuccessor() } select "" diff --git a/upgrades/b37faf5d62cccefad9fcfd8f5c026620097b2355/go.dbscheme b/upgrades/b37faf5d62cccefad9fcfd8f5c026620097b2355/go.dbscheme new file mode 100644 index 00000000000..2842941c6f9 --- /dev/null +++ b/upgrades/b37faf5d62cccefad9fcfd8f5c026620097b2355/go.dbscheme @@ -0,0 +1,528 @@ +/** Auto-generated dbscheme; do not edit. */ + + +/** Duplicate code **/ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity; + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/** External data **/ + +externalData( + int id : @externalDataElement, + varchar(900) path : string ref, + int column: int ref, + varchar(900) value : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + + +/* + * XML Files + */ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +compilations(unique int id: @compilation, string cwd: string ref); + +#keyset[id, num] +compilation_args(int id: @compilation ref, int num: int ref, string arg: string ref); + +#keyset[id, num, kind] +compilation_time(int id: @compilation ref, int num: int ref, int kind: int ref, float secs: float ref); + +diagnostic_for(unique int diagnostic: @diagnostic ref, int compilation: @compilation ref, int file_number: int ref, int file_number_diagnostic_number: int ref); + +compilation_finished(unique int id: @compilation ref, float cpu_seconds: float ref, float elapsed_seconds: float ref); + +#keyset[id, num] +compilation_compiling_files(int id: @compilation ref, int num: int ref, int file: @file ref); + +diagnostics(unique int id: @diagnostic, int severity: int ref, string error_tag: string ref, string error_message: string ref, + string full_error_message: string ref, int location: @location ref); + +locations_default(unique int id: @location_default, int file: @file ref, int beginLine: int ref, int beginColumn: int ref, + int endLine: int ref, int endColumn: int ref); + +numlines(int element_id: @sourceline ref, int num_lines: int ref, int num_code: int ref, int num_comment: int ref); + +files(unique int id: @file, string name: string ref); + +folders(unique int id: @folder, string name: string ref); + +containerparent(int parent: @container ref, unique int child: @container ref); + +has_location(unique int locatable: @locatable ref, int location: @location ref); + +#keyset[parent, idx] +comment_groups(unique int id: @comment_group, int parent: @file ref, int idx: int ref); + +comments(unique int id: @comment, int kind: int ref, int parent: @comment_group ref, int idx: int ref, string text: string ref); + +doc_comments(unique int node: @documentable ref, int comment: @comment_group ref); + +#keyset[parent, idx] +exprs(unique int id: @expr, int kind: int ref, int parent: @exprparent ref, int idx: int ref); + +literals(unique int expr: @expr ref, string value: string ref, string raw: string ref); + +constvalues(unique int expr: @expr ref, string value: string ref, string exact: string ref); + +fields(unique int id: @field, int parent: @fieldparent ref, int idx: int ref); + +#keyset[parent, idx] +stmts(unique int id: @stmt, int kind: int ref, int parent: @stmtparent ref, int idx: int ref); + +#keyset[parent, idx] +decls(unique int id: @decl, int kind: int ref, int parent: @declparent ref, int idx: int ref); + +#keyset[parent, idx] +specs(unique int id: @spec, int kind: int ref, int parent: @gendecl ref, int idx: int ref); + +scopes(unique int id: @scope, int kind: int ref); + +scopenesting(unique int inner: @scope ref, int outer: @scope ref); + +scopenodes(unique int node: @scopenode ref, int scope: @localscope ref); + +objects(unique int id: @object, int kind: int ref, string name: string ref); + +objectscopes(unique int object: @object ref, int scope: @scope ref); + +objecttypes(unique int object: @object ref, int tp: @type ref); + +methodreceivers(unique int method: @object ref, int receiver: @object ref); + +fieldstructs(unique int field: @object ref, int struct: @structtype ref); + +methodhosts(int method: @object ref, int host: @namedtype ref); + +defs(int ident: @ident ref, int object: @object ref); + +uses(int ident: @ident ref, int object: @object ref); + +types(unique int id: @type, int kind: int ref); + +type_of(unique int expr: @expr ref, int tp: @type ref); + +typename(unique int tp: @type ref, string name: string ref); + +key_type(unique int map: @maptype ref, int tp: @type ref); + +element_type(unique int container: @containertype ref, int tp: @type ref); + +base_type(unique int ptr: @pointertype ref, int tp: @type ref); + +underlying_type(unique int named: @namedtype ref, int tp: @type ref); + +#keyset[parent, index] +component_types(int parent: @compositetype ref, int index: int ref, string name: string ref, int tp: @type ref); + +array_length(unique int tp: @arraytype ref, string len: string ref); + +type_objects(unique int tp: @type ref, int object: @object ref); + +packages(unique int id: @package, string name: string ref, string path: string ref, int scope: @packagescope ref); + +#keyset[parent, idx] +modexprs(unique int id: @modexpr, int kind: int ref, int parent: @modexprparent ref, int idx: int ref); + +#keyset[parent, idx] +modtokens(string token: string ref, int parent: @modexpr ref, int idx: int ref); + +#keyset[package, idx] +errors(unique int id: @error, int kind: int ref, string msg: string ref, string rawpos: string ref, + string file: string ref, int line: int ref, int col: int ref, int package: @package ref, int idx: int ref); + +has_ellipsis(int id: @callorconversionexpr ref); + +@container = @file | @folder; + +@locatable = @xmllocatable | @node | @localscope; + +@node = @documentable | @exprparent | @modexprparent | @fieldparent | @stmtparent | @declparent | @scopenode + | @comment_group | @comment; + +@documentable = @file | @field | @spec | @gendecl | @funcdecl | @modexpr; + +@exprparent = @funcdef | @file | @expr | @field | @stmt | @decl | @spec; + +@modexprparent = @file | @modexpr; + +@fieldparent = @decl | @structtypeexpr | @functypeexpr | @interfacetypeexpr; + +@stmtparent = @funcdef | @stmt | @decl; + +@declparent = @file | @declstmt; + +@funcdef = @funclit | @funcdecl; + +@scopenode = @file | @functypeexpr | @blockstmt | @ifstmt | @caseclause | @switchstmt | @commclause | @loopstmt; + +@location = @location_default; + +@sourceline = @locatable; + +case @comment.kind of + 0 = @slashslashcomment +| 1 = @slashstarcomment; + +case @expr.kind of + 0 = @badexpr +| 1 = @ident +| 2 = @ellipsis +| 3 = @intlit +| 4 = @floatlit +| 5 = @imaglit +| 6 = @charlit +| 7 = @stringlit +| 8 = @funclit +| 9 = @compositelit +| 10 = @parenexpr +| 11 = @selectorexpr +| 12 = @indexexpr +| 13 = @sliceexpr +| 14 = @typeassertexpr +| 15 = @callorconversionexpr +| 16 = @starexpr +| 17 = @keyvalueexpr +| 18 = @arraytypeexpr +| 19 = @structtypeexpr +| 20 = @functypeexpr +| 21 = @interfacetypeexpr +| 22 = @maptypeexpr +| 23 = @plusexpr +| 24 = @minusexpr +| 25 = @notexpr +| 26 = @complementexpr +| 27 = @derefexpr +| 28 = @addressexpr +| 29 = @arrowexpr +| 30 = @lorexpr +| 31 = @landexpr +| 32 = @eqlexpr +| 33 = @neqexpr +| 34 = @lssexpr +| 35 = @leqexpr +| 36 = @gtrexpr +| 37 = @geqexpr +| 38 = @addexpr +| 39 = @subexpr +| 40 = @orexpr +| 41 = @xorexpr +| 42 = @mulexpr +| 43 = @quoexpr +| 44 = @remexpr +| 45 = @shlexpr +| 46 = @shrexpr +| 47 = @andexpr +| 48 = @andnotexpr +| 49 = @sendchantypeexpr +| 50 = @recvchantypeexpr +| 51 = @sendrcvchantypeexpr; + +@basiclit = @intlit | @floatlit | @imaglit | @charlit | @stringlit; + +@operatorexpr = @logicalexpr | @arithmeticexpr | @bitwiseexpr | @unaryexpr | @binaryexpr; + +@logicalexpr = @logicalunaryexpr | @logicalbinaryexpr; + +@arithmeticexpr = @arithmeticunaryexpr | @arithmeticbinaryexpr; + +@bitwiseexpr = @bitwiseunaryexpr | @bitwisebinaryexpr; + +@unaryexpr = @logicalunaryexpr | @bitwiseunaryexpr | @arithmeticunaryexpr | @derefexpr | @addressexpr | @arrowexpr; + +@logicalunaryexpr = @notexpr; + +@bitwiseunaryexpr = @complementexpr; + +@arithmeticunaryexpr = @plusexpr | @minusexpr; + +@binaryexpr = @logicalbinaryexpr | @bitwisebinaryexpr | @arithmeticbinaryexpr | @comparison; + +@logicalbinaryexpr = @lorexpr | @landexpr; + +@bitwisebinaryexpr = @shiftexpr | @orexpr | @xorexpr | @andexpr | @andnotexpr; + +@arithmeticbinaryexpr = @addexpr | @subexpr | @mulexpr | @quoexpr | @remexpr; + +@shiftexpr = @shlexpr | @shrexpr; + +@comparison = @equalitytest | @relationalcomparison; + +@equalitytest = @eqlexpr | @neqexpr; + +@relationalcomparison = @lssexpr | @leqexpr | @gtrexpr | @geqexpr; + +@chantypeexpr = @sendchantypeexpr | @recvchantypeexpr | @sendrcvchantypeexpr; + +case @stmt.kind of + 0 = @badstmt +| 1 = @declstmt +| 2 = @emptystmt +| 3 = @labeledstmt +| 4 = @exprstmt +| 5 = @sendstmt +| 6 = @incstmt +| 7 = @decstmt +| 8 = @gostmt +| 9 = @deferstmt +| 10 = @returnstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @gotostmt +| 14 = @fallthroughstmt +| 15 = @blockstmt +| 16 = @ifstmt +| 17 = @caseclause +| 18 = @exprswitchstmt +| 19 = @typeswitchstmt +| 20 = @commclause +| 21 = @selectstmt +| 22 = @forstmt +| 23 = @rangestmt +| 24 = @assignstmt +| 25 = @definestmt +| 26 = @addassignstmt +| 27 = @subassignstmt +| 28 = @mulassignstmt +| 29 = @quoassignstmt +| 30 = @remassignstmt +| 31 = @andassignstmt +| 32 = @orassignstmt +| 33 = @xorassignstmt +| 34 = @shlassignstmt +| 35 = @shrassignstmt +| 36 = @andnotassignstmt; + +@incdecstmt = @incstmt | @decstmt; + +@assignment = @simpleassignstmt | @compoundassignstmt; + +@simpleassignstmt = @assignstmt | @definestmt; + +@compoundassignstmt = @addassignstmt | @subassignstmt | @mulassignstmt | @quoassignstmt | @remassignstmt + | @andassignstmt | @orassignstmt | @xorassignstmt | @shlassignstmt | @shrassignstmt | @andnotassignstmt; + +@branchstmt = @breakstmt | @continuestmt | @gotostmt | @fallthroughstmt; + +@switchstmt = @exprswitchstmt | @typeswitchstmt; + +@loopstmt = @forstmt | @rangestmt; + +case @decl.kind of + 0 = @baddecl +| 1 = @importdecl +| 2 = @constdecl +| 3 = @typedecl +| 4 = @vardecl +| 5 = @funcdecl; + +@gendecl = @importdecl | @constdecl | @typedecl | @vardecl; + +case @spec.kind of + 0 = @importspec +| 1 = @valuespec +| 2 = @typedefspec +| 3 = @aliasspec; + +@typespec = @typedefspec | @aliasspec; + +case @object.kind of + 0 = @pkgobject +| 1 = @decltypeobject +| 2 = @builtintypeobject +| 3 = @declconstobject +| 4 = @builtinconstobject +| 5 = @declvarobject +| 6 = @declfunctionobject +| 7 = @builtinfunctionobject +| 8 = @labelobject; + +@declobject = @decltypeobject | @declconstobject | @declvarobject | @declfunctionobject; + +@builtinobject = @builtintypeobject | @builtinconstobject | @builtinfunctionobject; + +@typeobject = @decltypeobject | @builtintypeobject; + +@valueobject = @constobject | @varobject | @functionobject; + +@constobject = @declconstobject | @builtinconstobject; + +@varobject = @declvarobject; + +@functionobject = @declfunctionobject | @builtinfunctionobject; + +case @scope.kind of + 0 = @universescope +| 1 = @packagescope +| 2 = @localscope; + +case @type.kind of + 0 = @invalidtype +| 1 = @boolexprtype +| 2 = @inttype +| 3 = @int8type +| 4 = @int16type +| 5 = @int32type +| 6 = @int64type +| 7 = @uinttype +| 8 = @uint8type +| 9 = @uint16type +| 10 = @uint32type +| 11 = @uint64type +| 12 = @uintptrtype +| 13 = @float32type +| 14 = @float64type +| 15 = @complex64type +| 16 = @complex128type +| 17 = @stringexprtype +| 18 = @unsafepointertype +| 19 = @boolliteraltype +| 20 = @intliteraltype +| 21 = @runeliteraltype +| 22 = @floatliteraltype +| 23 = @complexliteraltype +| 24 = @stringliteraltype +| 25 = @nilliteraltype +| 26 = @arraytype +| 27 = @slicetype +| 28 = @structtype +| 29 = @pointertype +| 30 = @interfacetype +| 31 = @tupletype +| 32 = @signaturetype +| 33 = @maptype +| 34 = @sendchantype +| 35 = @recvchantype +| 36 = @sendrcvchantype +| 37 = @namedtype; + +@basictype = @booltype | @numerictype | @stringtype | @literaltype | @invalidtype | @unsafepointertype; + +@booltype = @boolexprtype | @boolliteraltype; + +@numerictype = @integertype | @floattype | @complextype; + +@integertype = @signedintegertype | @unsignedintegertype; + +@signedintegertype = @inttype | @int8type | @int16type | @int32type | @int64type | @intliteraltype | @runeliteraltype; + +@unsignedintegertype = @uinttype | @uint8type | @uint16type | @uint32type | @uint64type | @uintptrtype; + +@floattype = @float32type | @float64type | @floatliteraltype; + +@complextype = @complex64type | @complex128type | @complexliteraltype; + +@stringtype = @stringexprtype | @stringliteraltype; + +@literaltype = @boolliteraltype | @intliteraltype | @runeliteraltype | @floatliteraltype | @complexliteraltype + | @stringliteraltype | @nilliteraltype; + +@compositetype = @containertype | @structtype | @pointertype | @interfacetype | @tupletype | @signaturetype | @namedtype; + +@containertype = @arraytype | @slicetype | @maptype | @chantype; + +@chantype = @sendchantype | @recvchantype | @sendrcvchantype; + +case @modexpr.kind of + 0 = @modcommentblock +| 1 = @modline +| 2 = @modlineblock +| 3 = @modlparen +| 4 = @modrparen; + +case @error.kind of + 0 = @unknownerror +| 1 = @listerror +| 2 = @parseerror +| 3 = @typeerror; + diff --git a/upgrades/b37faf5d62cccefad9fcfd8f5c026620097b2355/old.dbscheme b/upgrades/b37faf5d62cccefad9fcfd8f5c026620097b2355/old.dbscheme new file mode 100644 index 00000000000..b37faf5d62c --- /dev/null +++ b/upgrades/b37faf5d62cccefad9fcfd8f5c026620097b2355/old.dbscheme @@ -0,0 +1,528 @@ +/** Auto-generated dbscheme; do not edit. */ + + +/** Duplicate code **/ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity; + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/** External data **/ + +externalData( + int id : @externalDataElement, + varchar(900) path : string ref, + int column: int ref, + varchar(900) value : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + + +/* + * XML Files + */ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +compilations(unique int id: @compilation, string cwd: string ref); + +#keyset[id, num] +compilation_args(int id: @compilation ref, int num: int ref, string arg: string ref); + +#keyset[id, num, kind] +compilation_time(int id: @compilation ref, int num: int ref, int kind: int ref, float secs: float ref); + +diagnostic_for(unique int diagnostic: @diagnostic ref, int compilation: @compilation ref, int file_number: int ref, int file_number_diagnostic_number: int ref); + +compilation_finished(unique int id: @compilation ref, float cpu_seconds: float ref, float elapsed_seconds: float ref); + +#keyset[id, num] +compilation_compiling_files(int id: @compilation ref, int num: int ref, int file: @file ref); + +diagnostics(unique int id: @diagnostic, int severity: int ref, string error_tag: string ref, string error_message: string ref, + string full_error_message: string ref, int location: @location ref); + +locations_default(unique int id: @location_default, int file: @file ref, int beginLine: int ref, int beginColumn: int ref, + int endLine: int ref, int endColumn: int ref); + +numlines(int element_id: @sourceline ref, int num_lines: int ref, int num_code: int ref, int num_comment: int ref); + +files(unique int id: @file, string name: string ref, string simple: string ref, string ext: string ref, int fromSource: int ref); + +folders(unique int id: @folder, string name: string ref, string simple: string ref); + +containerparent(int parent: @container ref, unique int child: @container ref); + +has_location(unique int locatable: @locatable ref, int location: @location ref); + +#keyset[parent, idx] +comment_groups(unique int id: @comment_group, int parent: @file ref, int idx: int ref); + +comments(unique int id: @comment, int kind: int ref, int parent: @comment_group ref, int idx: int ref, string text: string ref); + +doc_comments(unique int node: @documentable ref, int comment: @comment_group ref); + +#keyset[parent, idx] +exprs(unique int id: @expr, int kind: int ref, int parent: @exprparent ref, int idx: int ref); + +literals(unique int expr: @expr ref, string value: string ref, string raw: string ref); + +constvalues(unique int expr: @expr ref, string value: string ref, string exact: string ref); + +fields(unique int id: @field, int parent: @fieldparent ref, int idx: int ref); + +#keyset[parent, idx] +stmts(unique int id: @stmt, int kind: int ref, int parent: @stmtparent ref, int idx: int ref); + +#keyset[parent, idx] +decls(unique int id: @decl, int kind: int ref, int parent: @declparent ref, int idx: int ref); + +#keyset[parent, idx] +specs(unique int id: @spec, int kind: int ref, int parent: @gendecl ref, int idx: int ref); + +scopes(unique int id: @scope, int kind: int ref); + +scopenesting(unique int inner: @scope ref, int outer: @scope ref); + +scopenodes(unique int node: @scopenode ref, int scope: @localscope ref); + +objects(unique int id: @object, int kind: int ref, string name: string ref); + +objectscopes(unique int object: @object ref, int scope: @scope ref); + +objecttypes(unique int object: @object ref, int tp: @type ref); + +methodreceivers(unique int method: @object ref, int receiver: @object ref); + +fieldstructs(unique int field: @object ref, int struct: @structtype ref); + +methodhosts(int method: @object ref, int host: @namedtype ref); + +defs(int ident: @ident ref, int object: @object ref); + +uses(int ident: @ident ref, int object: @object ref); + +types(unique int id: @type, int kind: int ref); + +type_of(unique int expr: @expr ref, int tp: @type ref); + +typename(unique int tp: @type ref, string name: string ref); + +key_type(unique int map: @maptype ref, int tp: @type ref); + +element_type(unique int container: @containertype ref, int tp: @type ref); + +base_type(unique int ptr: @pointertype ref, int tp: @type ref); + +underlying_type(unique int named: @namedtype ref, int tp: @type ref); + +#keyset[parent, index] +component_types(int parent: @compositetype ref, int index: int ref, string name: string ref, int tp: @type ref); + +array_length(unique int tp: @arraytype ref, string len: string ref); + +type_objects(unique int tp: @type ref, int object: @object ref); + +packages(unique int id: @package, string name: string ref, string path: string ref, int scope: @packagescope ref); + +#keyset[parent, idx] +modexprs(unique int id: @modexpr, int kind: int ref, int parent: @modexprparent ref, int idx: int ref); + +#keyset[parent, idx] +modtokens(string token: string ref, int parent: @modexpr ref, int idx: int ref); + +#keyset[package, idx] +errors(unique int id: @error, int kind: int ref, string msg: string ref, string rawpos: string ref, + string file: string ref, int line: int ref, int col: int ref, int package: @package ref, int idx: int ref); + +has_ellipsis(int id: @callorconversionexpr ref); + +@container = @file | @folder; + +@locatable = @xmllocatable | @node | @localscope; + +@node = @documentable | @exprparent | @modexprparent | @fieldparent | @stmtparent | @declparent | @scopenode + | @comment_group | @comment; + +@documentable = @file | @field | @spec | @gendecl | @funcdecl | @modexpr; + +@exprparent = @funcdef | @file | @expr | @field | @stmt | @decl | @spec; + +@modexprparent = @file | @modexpr; + +@fieldparent = @decl | @structtypeexpr | @functypeexpr | @interfacetypeexpr; + +@stmtparent = @funcdef | @stmt | @decl; + +@declparent = @file | @declstmt; + +@funcdef = @funclit | @funcdecl; + +@scopenode = @file | @functypeexpr | @blockstmt | @ifstmt | @caseclause | @switchstmt | @commclause | @loopstmt; + +@location = @location_default; + +@sourceline = @locatable; + +case @comment.kind of + 0 = @slashslashcomment +| 1 = @slashstarcomment; + +case @expr.kind of + 0 = @badexpr +| 1 = @ident +| 2 = @ellipsis +| 3 = @intlit +| 4 = @floatlit +| 5 = @imaglit +| 6 = @charlit +| 7 = @stringlit +| 8 = @funclit +| 9 = @compositelit +| 10 = @parenexpr +| 11 = @selectorexpr +| 12 = @indexexpr +| 13 = @sliceexpr +| 14 = @typeassertexpr +| 15 = @callorconversionexpr +| 16 = @starexpr +| 17 = @keyvalueexpr +| 18 = @arraytypeexpr +| 19 = @structtypeexpr +| 20 = @functypeexpr +| 21 = @interfacetypeexpr +| 22 = @maptypeexpr +| 23 = @plusexpr +| 24 = @minusexpr +| 25 = @notexpr +| 26 = @complementexpr +| 27 = @derefexpr +| 28 = @addressexpr +| 29 = @arrowexpr +| 30 = @lorexpr +| 31 = @landexpr +| 32 = @eqlexpr +| 33 = @neqexpr +| 34 = @lssexpr +| 35 = @leqexpr +| 36 = @gtrexpr +| 37 = @geqexpr +| 38 = @addexpr +| 39 = @subexpr +| 40 = @orexpr +| 41 = @xorexpr +| 42 = @mulexpr +| 43 = @quoexpr +| 44 = @remexpr +| 45 = @shlexpr +| 46 = @shrexpr +| 47 = @andexpr +| 48 = @andnotexpr +| 49 = @sendchantypeexpr +| 50 = @recvchantypeexpr +| 51 = @sendrcvchantypeexpr; + +@basiclit = @intlit | @floatlit | @imaglit | @charlit | @stringlit; + +@operatorexpr = @logicalexpr | @arithmeticexpr | @bitwiseexpr | @unaryexpr | @binaryexpr; + +@logicalexpr = @logicalunaryexpr | @logicalbinaryexpr; + +@arithmeticexpr = @arithmeticunaryexpr | @arithmeticbinaryexpr; + +@bitwiseexpr = @bitwiseunaryexpr | @bitwisebinaryexpr; + +@unaryexpr = @logicalunaryexpr | @bitwiseunaryexpr | @arithmeticunaryexpr | @derefexpr | @addressexpr | @arrowexpr; + +@logicalunaryexpr = @notexpr; + +@bitwiseunaryexpr = @complementexpr; + +@arithmeticunaryexpr = @plusexpr | @minusexpr; + +@binaryexpr = @logicalbinaryexpr | @bitwisebinaryexpr | @arithmeticbinaryexpr | @comparison; + +@logicalbinaryexpr = @lorexpr | @landexpr; + +@bitwisebinaryexpr = @shiftexpr | @orexpr | @xorexpr | @andexpr | @andnotexpr; + +@arithmeticbinaryexpr = @addexpr | @subexpr | @mulexpr | @quoexpr | @remexpr; + +@shiftexpr = @shlexpr | @shrexpr; + +@comparison = @equalitytest | @relationalcomparison; + +@equalitytest = @eqlexpr | @neqexpr; + +@relationalcomparison = @lssexpr | @leqexpr | @gtrexpr | @geqexpr; + +@chantypeexpr = @sendchantypeexpr | @recvchantypeexpr | @sendrcvchantypeexpr; + +case @stmt.kind of + 0 = @badstmt +| 1 = @declstmt +| 2 = @emptystmt +| 3 = @labeledstmt +| 4 = @exprstmt +| 5 = @sendstmt +| 6 = @incstmt +| 7 = @decstmt +| 8 = @gostmt +| 9 = @deferstmt +| 10 = @returnstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @gotostmt +| 14 = @fallthroughstmt +| 15 = @blockstmt +| 16 = @ifstmt +| 17 = @caseclause +| 18 = @exprswitchstmt +| 19 = @typeswitchstmt +| 20 = @commclause +| 21 = @selectstmt +| 22 = @forstmt +| 23 = @rangestmt +| 24 = @assignstmt +| 25 = @definestmt +| 26 = @addassignstmt +| 27 = @subassignstmt +| 28 = @mulassignstmt +| 29 = @quoassignstmt +| 30 = @remassignstmt +| 31 = @andassignstmt +| 32 = @orassignstmt +| 33 = @xorassignstmt +| 34 = @shlassignstmt +| 35 = @shrassignstmt +| 36 = @andnotassignstmt; + +@incdecstmt = @incstmt | @decstmt; + +@assignment = @simpleassignstmt | @compoundassignstmt; + +@simpleassignstmt = @assignstmt | @definestmt; + +@compoundassignstmt = @addassignstmt | @subassignstmt | @mulassignstmt | @quoassignstmt | @remassignstmt + | @andassignstmt | @orassignstmt | @xorassignstmt | @shlassignstmt | @shrassignstmt | @andnotassignstmt; + +@branchstmt = @breakstmt | @continuestmt | @gotostmt | @fallthroughstmt; + +@switchstmt = @exprswitchstmt | @typeswitchstmt; + +@loopstmt = @forstmt | @rangestmt; + +case @decl.kind of + 0 = @baddecl +| 1 = @importdecl +| 2 = @constdecl +| 3 = @typedecl +| 4 = @vardecl +| 5 = @funcdecl; + +@gendecl = @importdecl | @constdecl | @typedecl | @vardecl; + +case @spec.kind of + 0 = @importspec +| 1 = @valuespec +| 2 = @typedefspec +| 3 = @aliasspec; + +@typespec = @typedefspec | @aliasspec; + +case @object.kind of + 0 = @pkgobject +| 1 = @decltypeobject +| 2 = @builtintypeobject +| 3 = @declconstobject +| 4 = @builtinconstobject +| 5 = @declvarobject +| 6 = @declfunctionobject +| 7 = @builtinfunctionobject +| 8 = @labelobject; + +@declobject = @decltypeobject | @declconstobject | @declvarobject | @declfunctionobject; + +@builtinobject = @builtintypeobject | @builtinconstobject | @builtinfunctionobject; + +@typeobject = @decltypeobject | @builtintypeobject; + +@valueobject = @constobject | @varobject | @functionobject; + +@constobject = @declconstobject | @builtinconstobject; + +@varobject = @declvarobject; + +@functionobject = @declfunctionobject | @builtinfunctionobject; + +case @scope.kind of + 0 = @universescope +| 1 = @packagescope +| 2 = @localscope; + +case @type.kind of + 0 = @invalidtype +| 1 = @boolexprtype +| 2 = @inttype +| 3 = @int8type +| 4 = @int16type +| 5 = @int32type +| 6 = @int64type +| 7 = @uinttype +| 8 = @uint8type +| 9 = @uint16type +| 10 = @uint32type +| 11 = @uint64type +| 12 = @uintptrtype +| 13 = @float32type +| 14 = @float64type +| 15 = @complex64type +| 16 = @complex128type +| 17 = @stringexprtype +| 18 = @unsafepointertype +| 19 = @boolliteraltype +| 20 = @intliteraltype +| 21 = @runeliteraltype +| 22 = @floatliteraltype +| 23 = @complexliteraltype +| 24 = @stringliteraltype +| 25 = @nilliteraltype +| 26 = @arraytype +| 27 = @slicetype +| 28 = @structtype +| 29 = @pointertype +| 30 = @interfacetype +| 31 = @tupletype +| 32 = @signaturetype +| 33 = @maptype +| 34 = @sendchantype +| 35 = @recvchantype +| 36 = @sendrcvchantype +| 37 = @namedtype; + +@basictype = @booltype | @numerictype | @stringtype | @literaltype | @invalidtype | @unsafepointertype; + +@booltype = @boolexprtype | @boolliteraltype; + +@numerictype = @integertype | @floattype | @complextype; + +@integertype = @signedintegertype | @unsignedintegertype; + +@signedintegertype = @inttype | @int8type | @int16type | @int32type | @int64type | @intliteraltype | @runeliteraltype; + +@unsignedintegertype = @uinttype | @uint8type | @uint16type | @uint32type | @uint64type | @uintptrtype; + +@floattype = @float32type | @float64type | @floatliteraltype; + +@complextype = @complex64type | @complex128type | @complexliteraltype; + +@stringtype = @stringexprtype | @stringliteraltype; + +@literaltype = @boolliteraltype | @intliteraltype | @runeliteraltype | @floatliteraltype | @complexliteraltype + | @stringliteraltype | @nilliteraltype; + +@compositetype = @containertype | @structtype | @pointertype | @interfacetype | @tupletype | @signaturetype | @namedtype; + +@containertype = @arraytype | @slicetype | @maptype | @chantype; + +@chantype = @sendchantype | @recvchantype | @sendrcvchantype; + +case @modexpr.kind of + 0 = @modcommentblock +| 1 = @modline +| 2 = @modlineblock +| 3 = @modlparen +| 4 = @modrparen; + +case @error.kind of + 0 = @unknownerror +| 1 = @listerror +| 2 = @parseerror +| 3 = @typeerror; + diff --git a/upgrades/b37faf5d62cccefad9fcfd8f5c026620097b2355/upgrade.properties b/upgrades/b37faf5d62cccefad9fcfd8f5c026620097b2355/upgrade.properties new file mode 100644 index 00000000000..71f3ee178e5 --- /dev/null +++ b/upgrades/b37faf5d62cccefad9fcfd8f5c026620097b2355/upgrade.properties @@ -0,0 +1,4 @@ +description: Removed unused column from the `folders` and `files` relations +compatibility: full +files.rel: reorder files.rel (int id, string name, string simple, string ext, int fromSource) id name +folders.rel: reorder folders.rel (int id, string name, string simple) id name