Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Constructing case object with discriminator of field of other object fails with the field(s) 'g' are in conflict with this value #23762

Open
tersec opened this issue Jun 26, 2024 · 5 comments

Comments

@tersec
Copy link
Contributor

tersec commented Jun 26, 2024

Description

type U = object
  h: bool

type K = object
  case h: bool
  of true, false: g: int

let x = default(U)

block:
  # This does build
  let v = x.h
  case v
  of true, false: discard K(h: v, g: 0)

# This does not build
case x.h
of true, false: discard K(h: x.h, g: 0)

With the let v = x.h helper, it does figure out that the K case object can be constructed, but not when directly accessing both as x.h.

Nim Version

Nim Compiler Version 2.0.6 [Linux: amd64]
Compiled at 2024-06-26
Copyright (c) 2006-2023 by Andreas Rumpf

git hash: c00e8e71e0c8465b5a5257c76c674b803273b222
active boot switches: -d:release
Nim Compiler Version 2.1.1 [Linux: amd64]
Compiled at 2024-06-26
Copyright (c) 2006-2024 by Andreas Rumpf

git hash: 8096fa45bdf5367f0d89ffe22ba5776ad1abf097
active boot switches: -d:release

Current Output

c.nim(17, 26) Error: a case selecting discriminator 'h' with value 'x.h' appears in the object construction, but the field(s) 'g' are in conflict with this value.

Expected Output

Builds

Possible Solution

No response

Additional Information

No response

@juancarlospaco
Copy link
Collaborator

!nim c

type U = object
  h: bool

type K = object
  case h: bool
  of true, false: g: int

let x = default(U)

block:
  let v = x.h
  case v
  of true, false: discard K(h: v, g: 0)

case x.h
of true, false: discard K(h: x.h, g: 0)

Copy link
Contributor

🐧 Linux bisect by @juancarlospaco (collaborator)
devel 👎 FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim
/home/runner/work/Nim/Nim/temp.nim(12, 26) Error: a case selecting discriminator 'h' with value 'x.h' appears in the object construction, but the field(s) 'g' are in conflict with this value.
assertions.nim(34)       raiseAssert
Error: unhandled exception: errGenerated [AssertionDefect]

IR

Compiled filesize 0 (0 bytes)

Stats

  • Started 2024-06-26T14:17:26
  • Finished 2024-06-26T14:17:26
  • Duration

AST

nnkStmtList.newTree(
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      newIdentNode("U"),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        newEmptyNode(),
        nnkRecList.newTree(
          nnkIdentDefs.newTree(
            newIdentNode("h"),
            newIdentNode("bool"),
            newEmptyNode()
          )
        )
      )
    )
  ),
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      newIdentNode("K"),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        newEmptyNode(),
        nnkRecList.newTree(
          nnkRecCase.newTree(
            nnkIdentDefs.newTree(
              newIdentNode("h"),
              newIdentNode("bool"),
              newEmptyNode()
            ),
            nnkOfBranch.newTree(
              newIdentNode("true"),
              newIdentNode("false"),
              nnkIdentDefs.newTree(
                newIdentNode("g"),
                newIdentNode("int"),
                newEmptyNode()
              )
            )
          )
        )
      )
    )
  ),
  nnkLetSection.newTree(
    nnkIdentDefs.newTree(
      newIdentNode("x"),
      newEmptyNode(),
      nnkCall.newTree(
        newIdentNode("default"),
        newIdentNode("U")
      )
    )
  ),
  nnkBlockStmt.newTree(
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkLetSection.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("v"),
          newEmptyNode(),
          nnkDotExpr.newTree(
            newIdentNode("x"),
            newIdentNode("h")
          )
        )
      ),
      nnkCaseStmt.newTree(
        newIdentNode("v"),
        nnkOfBranch.newTree(
          newIdentNode("true"),
          newIdentNode("false"),
          nnkStmtList.newTree(
            nnkDiscardStmt.newTree(
              nnkObjConstr.newTree(
                newIdentNode("K"),
                nnkExprColonExpr.newTree(
                  newIdentNode("h"),
                  newIdentNode("v")
                ),
                nnkExprColonExpr.newTree(
                  newIdentNode("g"),
                  newLit(0)
                )
              )
            )
          )
        )
      )
    )
  ),
  nnkCaseStmt.newTree(
    nnkDotExpr.newTree(
      newIdentNode("x"),
      newIdentNode("h")
    ),
    nnkOfBranch.newTree(
      newIdentNode("true"),
      newIdentNode("false"),
      nnkStmtList.newTree(
        nnkDiscardStmt.newTree(
          nnkObjConstr.newTree(
            newIdentNode("K"),
            nnkExprColonExpr.newTree(
              newIdentNode("h"),
              nnkDotExpr.newTree(
                newIdentNode("x"),
                newIdentNode("h")
              )
            ),
            nnkExprColonExpr.newTree(
              newIdentNode("g"),
              newLit(0)
            )
          )
        )
      )
    )
  )
)
stable 👎 FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim
/home/runner/work/Nim/Nim/temp.nim(12, 26) Error: a case selecting discriminator 'h' with value 'x.h' appears in the object construction, but the field(s) 'g' are in conflict with this value.
assertions.nim(34)       raiseAssert
Error: unhandled exception: options.nim(682, 5) `false` errGenerated [AssertionDefect]

IR

Compiled filesize 0 (0 bytes)

Stats

  • Started 2024-06-26T14:17:27
  • Finished 2024-06-26T14:17:27
  • Duration

AST

nnkStmtList.newTree(
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      newIdentNode("U"),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        newEmptyNode(),
        nnkRecList.newTree(
          nnkIdentDefs.newTree(
            newIdentNode("h"),
            newIdentNode("bool"),
            newEmptyNode()
          )
        )
      )
    )
  ),
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      newIdentNode("K"),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        newEmptyNode(),
        nnkRecList.newTree(
          nnkRecCase.newTree(
            nnkIdentDefs.newTree(
              newIdentNode("h"),
              newIdentNode("bool"),
              newEmptyNode()
            ),
            nnkOfBranch.newTree(
              newIdentNode("true"),
              newIdentNode("false"),
              nnkIdentDefs.newTree(
                newIdentNode("g"),
                newIdentNode("int"),
                newEmptyNode()
              )
            )
          )
        )
      )
    )
  ),
  nnkLetSection.newTree(
    nnkIdentDefs.newTree(
      newIdentNode("x"),
      newEmptyNode(),
      nnkCall.newTree(
        newIdentNode("default"),
        newIdentNode("U")
      )
    )
  ),
  nnkBlockStmt.newTree(
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkLetSection.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("v"),
          newEmptyNode(),
          nnkDotExpr.newTree(
            newIdentNode("x"),
            newIdentNode("h")
          )
        )
      ),
      nnkCaseStmt.newTree(
        newIdentNode("v"),
        nnkOfBranch.newTree(
          newIdentNode("true"),
          newIdentNode("false"),
          nnkStmtList.newTree(
            nnkDiscardStmt.newTree(
              nnkObjConstr.newTree(
                newIdentNode("K"),
                nnkExprColonExpr.newTree(
                  newIdentNode("h"),
                  newIdentNode("v")
                ),
                nnkExprColonExpr.newTree(
                  newIdentNode("g"),
                  newLit(0)
                )
              )
            )
          )
        )
      )
    )
  ),
  nnkCaseStmt.newTree(
    nnkDotExpr.newTree(
      newIdentNode("x"),
      newIdentNode("h")
    ),
    nnkOfBranch.newTree(
      newIdentNode("true"),
      newIdentNode("false"),
      nnkStmtList.newTree(
        nnkDiscardStmt.newTree(
          nnkObjConstr.newTree(
            newIdentNode("K"),
            nnkExprColonExpr.newTree(
              newIdentNode("h"),
              nnkDotExpr.newTree(
                newIdentNode("x"),
                newIdentNode("h")
              )
            ),
            nnkExprColonExpr.newTree(
              newIdentNode("g"),
              newLit(0)
            )
          )
        )
      )
    )
  )
)
2.0.4 👎 FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim
/home/runner/work/Nim/Nim/temp.nim(12, 26) Error: a case selecting discriminator 'h' with value 'x.h' appears in the object construction, but the field(s) 'g' are in conflict with this value.
assertions.nim(34)       raiseAssert
Error: unhandled exception: options.nim(681, 5) `false` errGenerated [AssertionDefect]

IR

Compiled filesize 0 (0 bytes)

Stats

  • Started 2024-06-26T14:17:30
  • Finished 2024-06-26T14:17:30
  • Duration

AST

nnkStmtList.newTree(
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      newIdentNode("U"),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        newEmptyNode(),
        nnkRecList.newTree(
          nnkIdentDefs.newTree(
            newIdentNode("h"),
            newIdentNode("bool"),
            newEmptyNode()
          )
        )
      )
    )
  ),
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      newIdentNode("K"),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        newEmptyNode(),
        nnkRecList.newTree(
          nnkRecCase.newTree(
            nnkIdentDefs.newTree(
              newIdentNode("h"),
              newIdentNode("bool"),
              newEmptyNode()
            ),
            nnkOfBranch.newTree(
              newIdentNode("true"),
              newIdentNode("false"),
              nnkIdentDefs.newTree(
                newIdentNode("g"),
                newIdentNode("int"),
                newEmptyNode()
              )
            )
          )
        )
      )
    )
  ),
  nnkLetSection.newTree(
    nnkIdentDefs.newTree(
      newIdentNode("x"),
      newEmptyNode(),
      nnkCall.newTree(
        newIdentNode("default"),
        newIdentNode("U")
      )
    )
  ),
  nnkBlockStmt.newTree(
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkLetSection.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("v"),
          newEmptyNode(),
          nnkDotExpr.newTree(
            newIdentNode("x"),
            newIdentNode("h")
          )
        )
      ),
      nnkCaseStmt.newTree(
        newIdentNode("v"),
        nnkOfBranch.newTree(
          newIdentNode("true"),
          newIdentNode("false"),
          nnkStmtList.newTree(
            nnkDiscardStmt.newTree(
              nnkObjConstr.newTree(
                newIdentNode("K"),
                nnkExprColonExpr.newTree(
                  newIdentNode("h"),
                  newIdentNode("v")
                ),
                nnkExprColonExpr.newTree(
                  newIdentNode("g"),
                  newLit(0)
                )
              )
            )
          )
        )
      )
    )
  ),
  nnkCaseStmt.newTree(
    nnkDotExpr.newTree(
      newIdentNode("x"),
      newIdentNode("h")
    ),
    nnkOfBranch.newTree(
      newIdentNode("true"),
      newIdentNode("false"),
      nnkStmtList.newTree(
        nnkDiscardStmt.newTree(
          nnkObjConstr.newTree(
            newIdentNode("K"),
            nnkExprColonExpr.newTree(
              newIdentNode("h"),
              nnkDotExpr.newTree(
                newIdentNode("x"),
                newIdentNode("h")
              )
            ),
            nnkExprColonExpr.newTree(
              newIdentNode("g"),
              newLit(0)
            )
          )
        )
      )
    )
  )
)
2.0.0 👎 FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim
/home/runner/work/Nim/Nim/temp.nim(12, 26) Error: a case selecting discriminator 'h' with value 'x.h' appears in the object construction, but the field(s) 'g' are in conflict with this value.
assertions.nim(34)       raiseAssert
Error: unhandled exception: options.nim(664, 5) `false` errGenerated [AssertionDefect]

IR

Compiled filesize 0 (0 bytes)

Stats

  • Started 2024-06-26T14:17:33
  • Finished 2024-06-26T14:17:34
  • Duration

AST

nnkStmtList.newTree(
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      newIdentNode("U"),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        newEmptyNode(),
        nnkRecList.newTree(
          nnkIdentDefs.newTree(
            newIdentNode("h"),
            newIdentNode("bool"),
            newEmptyNode()
          )
        )
      )
    )
  ),
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      newIdentNode("K"),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        newEmptyNode(),
        nnkRecList.newTree(
          nnkRecCase.newTree(
            nnkIdentDefs.newTree(
              newIdentNode("h"),
              newIdentNode("bool"),
              newEmptyNode()
            ),
            nnkOfBranch.newTree(
              newIdentNode("true"),
              newIdentNode("false"),
              nnkIdentDefs.newTree(
                newIdentNode("g"),
                newIdentNode("int"),
                newEmptyNode()
              )
            )
          )
        )
      )
    )
  ),
  nnkLetSection.newTree(
    nnkIdentDefs.newTree(
      newIdentNode("x"),
      newEmptyNode(),
      nnkCall.newTree(
        newIdentNode("default"),
        newIdentNode("U")
      )
    )
  ),
  nnkBlockStmt.newTree(
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkLetSection.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("v"),
          newEmptyNode(),
          nnkDotExpr.newTree(
            newIdentNode("x"),
            newIdentNode("h")
          )
        )
      ),
      nnkCaseStmt.newTree(
        newIdentNode("v"),
        nnkOfBranch.newTree(
          newIdentNode("true"),
          newIdentNode("false"),
          nnkStmtList.newTree(
            nnkDiscardStmt.newTree(
              nnkObjConstr.newTree(
                newIdentNode("K"),
                nnkExprColonExpr.newTree(
                  newIdentNode("h"),
                  newIdentNode("v")
                ),
                nnkExprColonExpr.newTree(
                  newIdentNode("g"),
                  newLit(0)
                )
              )
            )
          )
        )
      )
    )
  ),
  nnkCaseStmt.newTree(
    nnkDotExpr.newTree(
      newIdentNode("x"),
      newIdentNode("h")
    ),
    nnkOfBranch.newTree(
      newIdentNode("true"),
      newIdentNode("false"),
      nnkStmtList.newTree(
        nnkDiscardStmt.newTree(
          nnkObjConstr.newTree(
            newIdentNode("K"),
            nnkExprColonExpr.newTree(
              newIdentNode("h"),
              nnkDotExpr.newTree(
                newIdentNode("x"),
                newIdentNode("h")
              )
            ),
            nnkExprColonExpr.newTree(
              newIdentNode("g"),
              newLit(0)
            )
          )
        )
      )
    )
  )
)
1.6.20 👎 FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim
/home/runner/work/Nim/Nim/temp.nim(12, 26) Error: a case selecting discriminator 'h' with value 'x.h' appears in the object construction, but the field(s) 'g' are in conflict with this value.
fatal.nim(54)            sysFatal
Error: unhandled exception: options.nim(662, 14) `false` errGenerated [AssertionDefect]

IR

Compiled filesize 0 (0 bytes)

Stats

  • Started 2024-06-26T14:17:36
  • Finished 2024-06-26T14:17:37
  • Duration

AST

nnkStmtList.newTree(
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      newIdentNode("U"),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        newEmptyNode(),
        nnkRecList.newTree(
          nnkIdentDefs.newTree(
            newIdentNode("h"),
            newIdentNode("bool"),
            newEmptyNode()
          )
        )
      )
    )
  ),
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      newIdentNode("K"),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        newEmptyNode(),
        nnkRecList.newTree(
          nnkRecCase.newTree(
            nnkIdentDefs.newTree(
              newIdentNode("h"),
              newIdentNode("bool"),
              newEmptyNode()
            ),
            nnkOfBranch.newTree(
              newIdentNode("true"),
              newIdentNode("false"),
              nnkIdentDefs.newTree(
                newIdentNode("g"),
                newIdentNode("int"),
                newEmptyNode()
              )
            )
          )
        )
      )
    )
  ),
  nnkLetSection.newTree(
    nnkIdentDefs.newTree(
      newIdentNode("x"),
      newEmptyNode(),
      nnkCall.newTree(
        newIdentNode("default"),
        newIdentNode("U")
      )
    )
  ),
  nnkBlockStmt.newTree(
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkLetSection.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("v"),
          newEmptyNode(),
          nnkDotExpr.newTree(
            newIdentNode("x"),
            newIdentNode("h")
          )
        )
      ),
      nnkCaseStmt.newTree(
        newIdentNode("v"),
        nnkOfBranch.newTree(
          newIdentNode("true"),
          newIdentNode("false"),
          nnkStmtList.newTree(
            nnkDiscardStmt.newTree(
              nnkObjConstr.newTree(
                newIdentNode("K"),
                nnkExprColonExpr.newTree(
                  newIdentNode("h"),
                  newIdentNode("v")
                ),
                nnkExprColonExpr.newTree(
                  newIdentNode("g"),
                  newLit(0)
                )
              )
            )
          )
        )
      )
    )
  ),
  nnkCaseStmt.newTree(
    nnkDotExpr.newTree(
      newIdentNode("x"),
      newIdentNode("h")
    ),
    nnkOfBranch.newTree(
      newIdentNode("true"),
      newIdentNode("false"),
      nnkStmtList.newTree(
        nnkDiscardStmt.newTree(
          nnkObjConstr.newTree(
            newIdentNode("K"),
            nnkExprColonExpr.newTree(
              newIdentNode("h"),
              nnkDotExpr.newTree(
                newIdentNode("x"),
                newIdentNode("h")
              )
            ),
            nnkExprColonExpr.newTree(
              newIdentNode("g"),
              newLit(0)
            )
          )
        )
      )
    )
  )
)
1.4.8 👎 FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim
/home/runner/work/Nim/Nim/temp.nim(12, 26) Error: a case selecting discriminator 'h' with value 'x.h' appears in the object construction, but the field(s) 'g' are in conflict with this value.

IR

Compiled filesize 0 (0 bytes)

Stats

  • Started 2024-06-26T14:17:39
  • Finished 2024-06-26T14:17:39
  • Duration

AST

nnkStmtList.newTree(
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      newIdentNode("U"),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        newEmptyNode(),
        nnkRecList.newTree(
          nnkIdentDefs.newTree(
            newIdentNode("h"),
            newIdentNode("bool"),
            newEmptyNode()
          )
        )
      )
    )
  ),
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      newIdentNode("K"),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        newEmptyNode(),
        nnkRecList.newTree(
          nnkRecCase.newTree(
            nnkIdentDefs.newTree(
              newIdentNode("h"),
              newIdentNode("bool"),
              newEmptyNode()
            ),
            nnkOfBranch.newTree(
              newIdentNode("true"),
              newIdentNode("false"),
              nnkIdentDefs.newTree(
                newIdentNode("g"),
                newIdentNode("int"),
                newEmptyNode()
              )
            )
          )
        )
      )
    )
  ),
  nnkLetSection.newTree(
    nnkIdentDefs.newTree(
      newIdentNode("x"),
      newEmptyNode(),
      nnkCall.newTree(
        newIdentNode("default"),
        newIdentNode("U")
      )
    )
  ),
  nnkBlockStmt.newTree(
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkLetSection.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("v"),
          newEmptyNode(),
          nnkDotExpr.newTree(
            newIdentNode("x"),
            newIdentNode("h")
          )
        )
      ),
      nnkCaseStmt.newTree(
        newIdentNode("v"),
        nnkOfBranch.newTree(
          newIdentNode("true"),
          newIdentNode("false"),
          nnkStmtList.newTree(
            nnkDiscardStmt.newTree(
              nnkObjConstr.newTree(
                newIdentNode("K"),
                nnkExprColonExpr.newTree(
                  newIdentNode("h"),
                  newIdentNode("v")
                ),
                nnkExprColonExpr.newTree(
                  newIdentNode("g"),
                  newLit(0)
                )
              )
            )
          )
        )
      )
    )
  ),
  nnkCaseStmt.newTree(
    nnkDotExpr.newTree(
      newIdentNode("x"),
      newIdentNode("h")
    ),
    nnkOfBranch.newTree(
      newIdentNode("true"),
      newIdentNode("false"),
      nnkStmtList.newTree(
        nnkDiscardStmt.newTree(
          nnkObjConstr.newTree(
            newIdentNode("K"),
            nnkExprColonExpr.newTree(
              newIdentNode("h"),
              nnkDotExpr.newTree(
                newIdentNode("x"),
                newIdentNode("h")
              )
            ),
            nnkExprColonExpr.newTree(
              newIdentNode("g"),
              newLit(0)
            )
          )
        )
      )
    )
  )
)
1.2.18 👎 FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim
/home/runner/work/Nim/Nim/temp.nim(12, 26) Error: a case selecting discriminator 'h' with value 'x.h' appears in the object construction, but the field(s) 'g' are in conflict with this value.

IR

Compiled filesize 0 (0 bytes)

Stats

  • Started 2024-06-26T14:17:42
  • Finished 2024-06-26T14:17:42
  • Duration

AST

nnkStmtList.newTree(
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      newIdentNode("U"),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        newEmptyNode(),
        nnkRecList.newTree(
          nnkIdentDefs.newTree(
            newIdentNode("h"),
            newIdentNode("bool"),
            newEmptyNode()
          )
        )
      )
    )
  ),
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      newIdentNode("K"),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        newEmptyNode(),
        nnkRecList.newTree(
          nnkRecCase.newTree(
            nnkIdentDefs.newTree(
              newIdentNode("h"),
              newIdentNode("bool"),
              newEmptyNode()
            ),
            nnkOfBranch.newTree(
              newIdentNode("true"),
              newIdentNode("false"),
              nnkIdentDefs.newTree(
                newIdentNode("g"),
                newIdentNode("int"),
                newEmptyNode()
              )
            )
          )
        )
      )
    )
  ),
  nnkLetSection.newTree(
    nnkIdentDefs.newTree(
      newIdentNode("x"),
      newEmptyNode(),
      nnkCall.newTree(
        newIdentNode("default"),
        newIdentNode("U")
      )
    )
  ),
  nnkBlockStmt.newTree(
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkLetSection.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("v"),
          newEmptyNode(),
          nnkDotExpr.newTree(
            newIdentNode("x"),
            newIdentNode("h")
          )
        )
      ),
      nnkCaseStmt.newTree(
        newIdentNode("v"),
        nnkOfBranch.newTree(
          newIdentNode("true"),
          newIdentNode("false"),
          nnkStmtList.newTree(
            nnkDiscardStmt.newTree(
              nnkObjConstr.newTree(
                newIdentNode("K"),
                nnkExprColonExpr.newTree(
                  newIdentNode("h"),
                  newIdentNode("v")
                ),
                nnkExprColonExpr.newTree(
                  newIdentNode("g"),
                  newLit(0)
                )
              )
            )
          )
        )
      )
    )
  ),
  nnkCaseStmt.newTree(
    nnkDotExpr.newTree(
      newIdentNode("x"),
      newIdentNode("h")
    ),
    nnkOfBranch.newTree(
      newIdentNode("true"),
      newIdentNode("false"),
      nnkStmtList.newTree(
        nnkDiscardStmt.newTree(
          nnkObjConstr.newTree(
            newIdentNode("K"),
            nnkExprColonExpr.newTree(
              newIdentNode("h"),
              nnkDotExpr.newTree(
                newIdentNode("x"),
                newIdentNode("h")
              )
            ),
            nnkExprColonExpr.newTree(
              newIdentNode("g"),
              newLit(0)
            )
          )
        )
      )
    )
  )
)
1.0.10 👎 FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim
/home/runner/work/Nim/Nim/temp.nim(12, 26) Error: a case selecting discriminator 'h' with value 'x.h' appears in the object construction, but the field(s) 'g' are in conflict with this value.

IR

Compiled filesize 0 (0 bytes)

Stats

  • Started 2024-06-26T14:17:45
  • Finished 2024-06-26T14:17:45
  • Duration

AST

nnkStmtList.newTree(
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      newIdentNode("U"),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        newEmptyNode(),
        nnkRecList.newTree(
          nnkIdentDefs.newTree(
            newIdentNode("h"),
            newIdentNode("bool"),
            newEmptyNode()
          )
        )
      )
    )
  ),
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      newIdentNode("K"),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        newEmptyNode(),
        nnkRecList.newTree(
          nnkRecCase.newTree(
            nnkIdentDefs.newTree(
              newIdentNode("h"),
              newIdentNode("bool"),
              newEmptyNode()
            ),
            nnkOfBranch.newTree(
              newIdentNode("true"),
              newIdentNode("false"),
              nnkIdentDefs.newTree(
                newIdentNode("g"),
                newIdentNode("int"),
                newEmptyNode()
              )
            )
          )
        )
      )
    )
  ),
  nnkLetSection.newTree(
    nnkIdentDefs.newTree(
      newIdentNode("x"),
      newEmptyNode(),
      nnkCall.newTree(
        newIdentNode("default"),
        newIdentNode("U")
      )
    )
  ),
  nnkBlockStmt.newTree(
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkLetSection.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("v"),
          newEmptyNode(),
          nnkDotExpr.newTree(
            newIdentNode("x"),
            newIdentNode("h")
          )
        )
      ),
      nnkCaseStmt.newTree(
        newIdentNode("v"),
        nnkOfBranch.newTree(
          newIdentNode("true"),
          newIdentNode("false"),
          nnkStmtList.newTree(
            nnkDiscardStmt.newTree(
              nnkObjConstr.newTree(
                newIdentNode("K"),
                nnkExprColonExpr.newTree(
                  newIdentNode("h"),
                  newIdentNode("v")
                ),
                nnkExprColonExpr.newTree(
                  newIdentNode("g"),
                  newLit(0)
                )
              )
            )
          )
        )
      )
    )
  ),
  nnkCaseStmt.newTree(
    nnkDotExpr.newTree(
      newIdentNode("x"),
      newIdentNode("h")
    ),
    nnkOfBranch.newTree(
      newIdentNode("true"),
      newIdentNode("false"),
      nnkStmtList.newTree(
        nnkDiscardStmt.newTree(
          nnkObjConstr.newTree(
            newIdentNode("K"),
            nnkExprColonExpr.newTree(
              newIdentNode("h"),
              nnkDotExpr.newTree(
                newIdentNode("x"),
                newIdentNode("h")
              )
            ),
            nnkExprColonExpr.newTree(
              newIdentNode("g"),
              newLit(0)
            )
          )
        )
      )
    )
  )
)
Stats
  • GCC 11.4.0
  • Clang 14.0.0
  • NodeJS 20.3
  • Created 2024-06-26T14:10:59Z
  • Comments 1
  • Commands nim c --run -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim

🤖 Bug found in 22 minutes bisecting 8 commits at 0 commits per second

@metagn
Copy link
Collaborator

metagn commented Jun 26, 2024

The analysis of the variable version is special cased in the compiler

@Araq
Copy link
Member

Araq commented Jun 26, 2024

Why does it compile in either version ... It shouldn't.

@ringabout
Copy link
Member

The smart variant object construction has been documented in the manual

As a special rule, the discriminator kind can also be bounded using a case
statement. If possible values of the discriminator variable in a
case statement branch are a subset of discriminator values for the selected
object branch, the initialization is considered valid. This analysis only works
for immutable discriminators of an ordinal type and disregards elif
branches. For discriminator values with a range type, the compiler
checks if the entire range of possible values for the discriminator value is
valid for the chosen object branch.

ref #11273

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants