Skip to content

CompileTime proc called from template results in undefined reference #711

@BitPuffin

Description

@BitPuffin

Yo

type
  TVector*[T; I] = array[I, T]

const
  xSwizzleChars = {'x', 'X', 'r', 'R', 's', 'S'}
  ySwizzleChars = {'y', 'Y', 'g', 'G', 't', 'T'}
  zSwizzleChars = {'z', 'Z', 'b', 'B', 'p', 'P'}
  wSwizzleChars = {'w', 'W', 'a', 'A', 'q', 'Q'}
  swizzleChars = xSwizzleChars + ySwizzleChars + zSwizzleChars + wSwizzleChars

proc swizzleImpl[I](str: string): array[I, int] {.compileTime.} =
  for i, ch in str:
    if ch in xSwizzleChars:
      result[i] = 0
    elif ch in ySwizzleChars:
      result[i] = 1
    elif ch in zSwizzleChars:
      result[i] = 2
    elif ch in wSwizzleChars:
      result[i] = 3

from strutils import contains

template `{}`*[T, I](vec: TVector[T, I], str: string{lit}): expr {.deprecated.} =
  when str.contains({char(0)..char(255)} - swizzleChars):
    {.fatal: "Valid swizzle characters: " & $swizzleChars & ". Got: " & str.}

  when str.len == 0:
    {.fatal: "Cannot swizzle zero components".}

  var result: TVector[vec[0].type, range[0.. <str.len]]
  for i, component in swizzleImpl[0.. <str.len](str):
    assert component < vec.len, "Invalid swizzle character found for " & $vec.len &
      "-dimensional vector. Got: " & str
    result[i] = vec[component]
  result

var vec3: TVector[int, range[0..2]] = [1, 3, 37]
assert vec3{"rgbbg"} == [1, 3, 37, 37, 3]

nimrod c -p:. -r linagl/anus.nim
anus.nim(39, 11) Warning: '{}' is deprecated [Deprecated]
anus.nim(39, 11) Warning: '{}' is deprecated [Deprecated]
gcc -c -w -I/home/isak/src/softlib/Nimrod/lib -o /home/isak/src/nim/linagl/src/linagl/nimcache/linagl_anus.o /home/isak/src/nim/linagl/src/linagl/nimcache/linagl_anus.c
gcc -c -w -I/home/isak/src/softlib/Nimrod/lib -o /home/isak/src/nim/linagl/src/linagl/nimcache/pure_strutils.o /home/isak/src/nim/linagl/src/linagl/nimcache/pure_strutils.c
gcc -c -w -I/home/isak/src/softlib/Nimrod/lib -o /home/isak/src/nim/linagl/src/linagl/nimcache/pure_parseutils.o /home/isak/src/nim/linagl/src/linagl/nimcache/pure_parseutils.c
gcc -o /home/isak/src/nim/linagl/src/linagl/anus /home/isak/src/nim/linagl/src/linagl/nimcache/pure_parseutils.o /home/isak/src/nim/linagl/src/linagl/nimcache/pure_strutils.o /home/isak/src/nim/linagl/src/linagl/nimcache/Nimrod_system.o /home/isak/src/nim/linagl/src/linagl/nimcache/linagl_anus.o -ldl
/home/isak/src/nim/linagl/src/linagl/nimcache/linagl_anus.o: In function anusInit': linagl_anus.c:(.text+0x23d): undefined reference toswizzleimpl_85427'
collect2: error: ld returned 1 exit status
Error: execution of an external program failed

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions