Diff of the two buildlogs: -- --- b1/build.log 2024-06-14 14:19:33.120673896 +0000 +++ b2/build.log 2024-06-14 11:53:00.955287070 +0000 @@ -1,6 +1,6 @@ I: pbuilder: network access will be disabled during build -I: Current time: Thu Jun 13 23:53:03 -12 2024 -I: pbuilder-time-stamp: 1718365983 +I: Current time: Fri Jul 18 06:43:35 +14 2025 +I: pbuilder-time-stamp: 1752770615 I: Building the build Environment I: extracting base tarball [/var/cache/pbuilder/trixie-reproducible-base.tgz] I: copying local configuration @@ -30,52 +30,84 @@ dpkg-source: info: applying update-packaged-javascript-links.patch I: Not using root during the build. I: Installing the build-deps -I: user script /srv/workspace/pbuilder/4145843/tmp/hooks/D02_print_environment starting +I: user script /srv/workspace/pbuilder/667784/tmp/hooks/D01_modify_environment starting +debug: Running on ionos15-amd64. +I: Changing host+domainname to test build reproducibility +I: Adding a custom variable just for the fun of it... +I: Changing /bin/sh to bash +'/bin/sh' -> '/bin/bash' +lrwxrwxrwx 1 root root 9 Jul 17 16:43 /bin/sh -> /bin/bash +I: Setting pbuilder2's login shell to /bin/bash +I: Setting pbuilder2's GECOS to second user,second room,second work-phone,second home-phone,second other +I: user script /srv/workspace/pbuilder/667784/tmp/hooks/D01_modify_environment finished +I: user script /srv/workspace/pbuilder/667784/tmp/hooks/D02_print_environment starting I: set - BUILDDIR='/build/reproducible-path' - BUILDUSERGECOS='first user,first room,first work-phone,first home-phone,first other' - BUILDUSERNAME='pbuilder1' - BUILD_ARCH='amd64' - DEBIAN_FRONTEND='noninteractive' - DEB_BUILD_OPTIONS='buildinfo=+all reproducible=+all parallel=20 ' - DISTRIBUTION='trixie' - HOME='/root' - HOST_ARCH='amd64' + BASH=/bin/sh + BASHOPTS=checkwinsize:cmdhist:complete_fullquote:extquote:force_fignore:globasciiranges:globskipdots:hostcomplete:interactive_comments:patsub_replacement:progcomp:promptvars:sourcepath + BASH_ALIASES=() + BASH_ARGC=() + BASH_ARGV=() + BASH_CMDS=() + BASH_LINENO=([0]="12" [1]="0") + BASH_LOADABLES_PATH=/usr/local/lib/bash:/usr/lib/bash:/opt/local/lib/bash:/usr/pkg/lib/bash:/opt/pkg/lib/bash:. + BASH_SOURCE=([0]="/tmp/hooks/D02_print_environment" [1]="/tmp/hooks/D02_print_environment") + BASH_VERSINFO=([0]="5" [1]="2" [2]="21" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu") + BASH_VERSION='5.2.21(1)-release' + BUILDDIR=/build/reproducible-path + BUILDUSERGECOS='second user,second room,second work-phone,second home-phone,second other' + BUILDUSERNAME=pbuilder2 + BUILD_ARCH=amd64 + DEBIAN_FRONTEND=noninteractive + DEB_BUILD_OPTIONS='buildinfo=+all reproducible=+all parallel=42 ' + DIRSTACK=() + DISTRIBUTION=trixie + EUID=0 + FUNCNAME=([0]="Echo" [1]="main") + GROUPS=() + HOME=/root + HOSTNAME=i-capture-the-hostname + HOSTTYPE=x86_64 + HOST_ARCH=amd64 IFS=' ' - INVOCATION_ID='53086c74eee64a9bafa393683f813f3b' - LANG='C' - LANGUAGE='en_US:en' - LC_ALL='C' - MAIL='/var/mail/root' - OPTIND='1' - PATH='/usr/sbin:/usr/bin:/sbin:/bin:/usr/games' - PBCURRENTCOMMANDLINEOPERATION='build' - PBUILDER_OPERATION='build' - PBUILDER_PKGDATADIR='/usr/share/pbuilder' - PBUILDER_PKGLIBDIR='/usr/lib/pbuilder' - PBUILDER_SYSCONFDIR='/etc' - PPID='4145843' - PS1='# ' - PS2='> ' + INVOCATION_ID=204ca5bfd66243468fe340bf80626896 + LANG=C + LANGUAGE=et_EE:et + LC_ALL=C + MACHTYPE=x86_64-pc-linux-gnu + MAIL=/var/mail/root + OPTERR=1 + OPTIND=1 + OSTYPE=linux-gnu + PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/i/capture/the/path + PBCURRENTCOMMANDLINEOPERATION=build + PBUILDER_OPERATION=build + PBUILDER_PKGDATADIR=/usr/share/pbuilder + PBUILDER_PKGLIBDIR=/usr/lib/pbuilder + PBUILDER_SYSCONFDIR=/etc + PIPESTATUS=([0]="0") + POSIXLY_CORRECT=y + PPID=667784 PS4='+ ' - PWD='/' - SHELL='/bin/bash' - SHLVL='2' - SUDO_COMMAND='/usr/bin/timeout -k 18.1h 18h /usr/bin/ionice -c 3 /usr/bin/nice /usr/sbin/pbuilder --build --configfile /srv/reproducible-results/rbuild-debian/r-b-build.tXQjwX0d/pbuilderrc_X1Yi --distribution trixie --hookdir /etc/pbuilder/first-build-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/trixie-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.tXQjwX0d/b1 --logfile b1/build.log crystal_1.12.1+dfsg-1.dsc' - SUDO_GID='111' - SUDO_UID='106' - SUDO_USER='jenkins' - TERM='unknown' - TZ='/usr/share/zoneinfo/Etc/GMT+12' - USER='root' - _='/usr/bin/systemd-run' - http_proxy='http://46.16.76.132:3128' + PWD=/ + SHELL=/bin/bash + SHELLOPTS=braceexpand:errexit:hashall:interactive-comments:posix + SHLVL=3 + SUDO_COMMAND='/usr/bin/timeout -k 24.1h 24h /usr/bin/ionice -c 3 /usr/bin/nice -n 11 /usr/bin/unshare --uts -- /usr/sbin/pbuilder --build --configfile /srv/reproducible-results/rbuild-debian/r-b-build.tXQjwX0d/pbuilderrc_6Kws --distribution trixie --hookdir /etc/pbuilder/rebuild-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/trixie-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.tXQjwX0d/b2 --logfile b2/build.log crystal_1.12.1+dfsg-1.dsc' + SUDO_GID=111 + SUDO_UID=106 + SUDO_USER=jenkins + TERM=unknown + TZ=/usr/share/zoneinfo/Etc/GMT-14 + UID=0 + USER=root + _='I: set' + http_proxy=http://213.165.73.152:3128 I: uname -a - Linux ionos11-amd64 6.1.0-21-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.90-1 (2024-05-03) x86_64 GNU/Linux + Linux i-capture-the-hostname 6.7.12+bpo-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.7.12-1~bpo12+1 (2024-05-06) x86_64 GNU/Linux I: ls -l /bin - lrwxrwxrwx 1 root root 7 Jun 13 11:24 /bin -> usr/bin -I: user script /srv/workspace/pbuilder/4145843/tmp/hooks/D02_print_environment finished + lrwxrwxrwx 1 root root 7 Jul 15 17:46 /bin -> usr/bin +I: user script /srv/workspace/pbuilder/667784/tmp/hooks/D02_print_environment finished -> Attempting to satisfy build-dependencies -> Creating pbuilder-satisfydepends-dummy package Package: pbuilder-satisfydepends-dummy @@ -253,7 +285,7 @@ Get: 108 http://deb.debian.org/debian trixie/main amd64 llvm-17-tools amd64 1:17.0.6-12 [489 kB] Get: 109 http://deb.debian.org/debian trixie/main amd64 llvm-17-dev amd64 1:17.0.6-12 [38.8 MB] Get: 110 http://deb.debian.org/debian trixie/main amd64 zlib1g-dev amd64 1:1.3.dfsg+really1.3.1-1 [919 kB] -Fetched 171 MB in 4s (42.3 MB/s) +Fetched 171 MB in 4s (44.0 MB/s) debconf: delaying package configuration, since apt-utils is not installed Selecting previously unselected package libpython3.11-minimal:amd64. (Reading database ... (Reading database ... 5% (Reading database ... 10% (Reading database ... 15% (Reading database ... 20% (Reading database ... 25% (Reading database ... 30% (Reading database ... 35% (Reading database ... 40% (Reading database ... 45% (Reading database ... 50% (Reading database ... 55% (Reading database ... 60% (Reading database ... 65% (Reading database ... 70% (Reading database ... 75% (Reading database ... 80% (Reading database ... 85% (Reading database ... 90% (Reading database ... 95% (Reading database ... 100% (Reading database ... 19696 files and directories currently installed.) @@ -622,8 +654,8 @@ Setting up tzdata (2024a-4) ... Current default time zone: 'Etc/UTC' -Local time is now: Fri Jun 14 11:54:40 UTC 2024. -Universal Time is now: Fri Jun 14 11:54:40 UTC 2024. +Local time is now: Thu Jul 17 16:44:36 UTC 2025. +Universal Time is now: Thu Jul 17 16:44:36 UTC 2025. Run 'dpkg-reconfigure tzdata' if you wish to change it. Setting up liberror-perl (0.17029-2) ... @@ -720,7 +752,11 @@ Building tag database... -> Finished parsing the build-deps I: Building the package -I: Running cd /build/reproducible-path/crystal-1.12.1+dfsg/ && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" HOME="/nonexistent/first-build" dpkg-buildpackage -us -uc -b && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" HOME="/nonexistent/first-build" dpkg-genchanges -S > ../crystal_1.12.1+dfsg-1_source.changes +I: user script /srv/workspace/pbuilder/667784/tmp/hooks/A99_set_merged_usr starting +Not re-configuring usrmerge for trixie +I: user script /srv/workspace/pbuilder/667784/tmp/hooks/A99_set_merged_usr finished +hostname: Name or service not known +I: Running cd /build/reproducible-path/crystal-1.12.1+dfsg/ && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/i/capture/the/path" HOME="/nonexistent/second-build" dpkg-buildpackage -us -uc -b && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/i/capture/the/path" HOME="/nonexistent/second-build" dpkg-genchanges -S > ../crystal_1.12.1+dfsg-1_source.changes dpkg-buildpackage: info: source package crystal dpkg-buildpackage: info: source version 1.12.1+dfsg-1 dpkg-buildpackage: info: source distribution unstable @@ -730,7 +766,7 @@ debian/rules clean dh clean dh_auto_clean - make -j20 clean + make -j42 clean make[1]: Entering directory '/build/reproducible-path/crystal-1.12.1+dfsg' rm -rf .build rm -rf ./docs @@ -749,20 +785,20 @@ dh_auto_configure debian/rules override_dh_auto_build make[1]: Entering directory '/build/reproducible-path/crystal-1.12.1+dfsg' -dh_auto_build -- release=1 verbose=1 progress=1 threads=20 CRYSTAL_CONFIG_PATH="lib:/usr/lib/crystal/lib" CRYSTAL_CACHE_DIR="/tmp/crystal" interpreter=1 - make -j20 "INSTALL=install --strip-program=true" release=1 verbose=1 progress=1 threads=20 CRYSTAL_CONFIG_PATH=lib:/usr/lib/crystal/lib CRYSTAL_CACHE_DIR=/tmp/crystal interpreter=1 +dh_auto_build -- release=1 verbose=1 progress=1 threads=42 CRYSTAL_CONFIG_PATH="lib:/usr/lib/crystal/lib" CRYSTAL_CACHE_DIR="/tmp/crystal" interpreter=1 + make -j42 "INSTALL=install --strip-program=true" release=1 verbose=1 progress=1 threads=42 CRYSTAL_CONFIG_PATH=lib:/usr/lib/crystal/lib CRYSTAL_CACHE_DIR=/tmp/crystal interpreter=1 make[2]: Entering directory '/build/reproducible-path/crystal-1.12.1+dfsg' Using /usr/bin/llvm-config-17 [version=17.0.6] g++ -c -g -O2 -ffile-prefix-map=/build/reproducible-path/crystal-1.12.1+dfsg=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -o src/llvm/ext/llvm_ext.o src/llvm/ext/llvm_ext.cc -I/usr/lib/llvm-17/include -std=c++17 -fno-exceptions -funwind-tables -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -CRYSTAL_CONFIG_BUILD_COMMIT="" CRYSTAL_CONFIG_PATH=lib:/usr/lib/crystal/lib SOURCE_DATE_EPOCH="1715970619" CRYSTAL_CONFIG_LIBRARY_PATH='$ORIGIN/../lib/crystal' ./bin/crystal build -D strict_multi_assign -D preview_overload_order --release --progress --threads 20 --link-flags="-Wl,-z,relro" -o .build/crystal src/compiler/crystal.cr -D without_openssl -D without_zlib -D use_pcre2 +CRYSTAL_CONFIG_BUILD_COMMIT="" CRYSTAL_CONFIG_PATH=lib:/usr/lib/crystal/lib SOURCE_DATE_EPOCH="1715970619" CRYSTAL_CONFIG_LIBRARY_PATH='$ORIGIN/../lib/crystal' ./bin/crystal build -D strict_multi_assign -D preview_overload_order --release --progress --threads 42 --link-flags="-Wl,-z,relro" -o .build/crystal src/compiler/crystal.cr -D without_openssl -D without_zlib -D use_pcre2 [1/13] Parse [1/13] Parse [2/13] Semantic (top level) [2/13] Semantic (top level) [3/13] Semantic (new) [3/13] Semantic (new) [4/13] Semantic (type declarations) [4/13] Semantic (type declarations) [5/13] Semantic (abstract def check) [5/13] Semantic (abstract def check) [6/13] Semantic (restrictions augmenter) [6/13] Semantic (restrictions augmenter) [7/13] Semantic (ivars initializers) [7/13] Semantic (ivars initializers) [8/13] Semantic (cvars initializers) [8/13] Semantic (cvars initializers) [9/13] Semantic (main) [9/13] Semantic (main) [10/13] Semantic (cleanup) [10/13] Semantic (cleanup) [11/13] Semantic (recursive struct check) [11/13] Semantic (recursive struct check) [12/13] Codegen (crystal) [12/13] Codegen (crystal) [13/13] Codegen (bc+obj) [13/13] [0/1] Codegen (bc+obj) [13/13] [0/1] Codegen (bc+obj) [14/13] Codegen (linking) [14/13] Codegen (linking) make[2]: Leaving directory '/build/reproducible-path/crystal-1.12.1+dfsg' make[1]: Leaving directory '/build/reproducible-path/crystal-1.12.1+dfsg' debian/rules override_dh_auto_test make[1]: Entering directory '/build/reproducible-path/crystal-1.12.1+dfsg' -make release=1 verbose=1 progress=1 threads=20 CRYSTAL_CONFIG_PATH="lib:/usr/lib/crystal/lib" CRYSTAL_CACHE_DIR="/tmp/crystal" interpreter=1 compiler_spec +make release=1 verbose=1 progress=1 threads=42 CRYSTAL_CONFIG_PATH="lib:/usr/lib/crystal/lib" CRYSTAL_CACHE_DIR="/tmp/crystal" interpreter=1 compiler_spec make[2]: Entering directory '/build/reproducible-path/crystal-1.12.1+dfsg' Using /usr/bin/llvm-config-17 [version=17.0.6] -CRYSTAL_CONFIG_BUILD_COMMIT="" CRYSTAL_CONFIG_PATH=lib:/usr/lib/crystal/lib SOURCE_DATE_EPOCH="1715970619" ./bin/crystal build -D strict_multi_assign -D preview_overload_order --release --progress --threads 20 --link-flags="-Wl,-z,relro" --exclude-warnings spec/std --exclude-warnings spec/compiler --exclude-warnings spec/primitives -o .build/compiler_spec spec/compiler_spec.cr --release +CRYSTAL_CONFIG_BUILD_COMMIT="" CRYSTAL_CONFIG_PATH=lib:/usr/lib/crystal/lib SOURCE_DATE_EPOCH="1715970619" ./bin/crystal build -D strict_multi_assign -D preview_overload_order --release --progress --threads 42 --link-flags="-Wl,-z,relro" --exclude-warnings spec/std --exclude-warnings spec/compiler --exclude-warnings spec/primitives -o .build/compiler_spec spec/compiler_spec.cr --release Using compiled compiler at .build/crystal In lib/markd/src/markd/renderers/html_renderer.cr:238:7 @@ -771,7 +807,7 @@ Warning: expanding macro -There was a problem expanding macro 'macro_139807320939136' +There was a problem expanding macro 'macro_140292385211712' Called macro defined in lib/markd/src/markd/renderers/html_renderer.cr:238:7 @@ -787,13251 +823,14499 @@ A total of 1 warnings were found. [1/13] Parse [1/13] Parse [2/13] Semantic (top level) [2/13] Semantic (top level) [3/13] Semantic (new) [3/13] Semantic (new) [4/13] Semantic (type declarations) [4/13] Semantic (type declarations) [5/13] Semantic (abstract def check) [5/13] Semantic (abstract def check) [6/13] Semantic (restrictions augmenter) [6/13] Semantic (restrictions augmenter) [7/13] Semantic (ivars initializers) [7/13] Semantic (ivars initializers) [8/13] Semantic (cvars initializers) [8/13] Semantic (cvars initializers) [9/13] Semantic (main) [9/13] Semantic (main) [10/13] Semantic (cleanup) [10/13] Semantic (cleanup) [11/13] Semantic (recursive struct check) [11/13] Semantic (recursive struct check) [12/13] Codegen (crystal) [12/13] Codegen (crystal) [13/13] Codegen (bc+obj) [13/13] [0/1] Codegen (bc+obj) [13/13] [0/1] Codegen (bc+obj) [14/13] Codegen (linking) [14/13] Codegen (linking) .build/compiler_spec -v --order=random -Randomized with seed: 27853 -Codegen: until - codegens until codegens until -Code gen: ssa - codegens a var that is re-assigned in a block (2) codegens a var that is re-assigned in a block (2) - codegens a var that is re-assigned in a block codegens a var that is re-assigned in a block - codegens ssa bug (2) codegens ssa bug (2) - codegens declaration of var inside then when false codegens declaration of var inside then when false - codegens a var that is re-assigned in a block (1) codegens a var that is re-assigned in a block (1) - codegens a var that is declared in a block (1) codegens a var that is declared in a block (1) - codegens a redefined var inside method with argument codegens a redefined var inside method with argument - codegens ssa bug (1) codegens ssa bug (1) - codegens a redefined var codegens a redefined var - codegens ssa bug with if/else on var codegens ssa bug with if/else on var - codegens declaration of var inside then when true codegens declaration of var inside then when true - codegens a redefined var inside method codegens a redefined var inside method - codegens a var that is declared in a block (2) codegens a var that is declared in a block (2) -read_file? - with absolute path - reads file (doesn't exist) reads file (doesn't exist) - with relative path - reads file (doesn't exist) reads file (doesn't exist) -Crystal::Repl::Interpreter - multidispatch - passes self as pointer when doing multidispatch (2) passes self as pointer when doing multidispatch (2) - does multidispatch with mandatory named arguments does multidispatch with mandatory named arguments - doesn't compile block if it's not used (no yield) doesn't compile block if it's not used (no yield) - does dispatch on one argument inside module with implicit self does dispatch on one argument inside module with implicit self - does dispatch on one argument inside module with explicit receiver does dispatch on one argument inside module with explicit receiver - does dispatch on virtual type does dispatch on virtual type - does multidispatch with captured block (#12217) does multidispatch with captured block (#12217) - does dispatch on one argument with struct receiver, and modifies it does dispatch on one argument with struct receiver, and modifies it - does dispatch on receiver type and argument type does dispatch on receiver type and argument type - downcasts self from union to struct (pass pointer to self) downcasts self from union to struct (pass pointer to self) - does dispatch on receiver type does dispatch on receiver type - casts multidispatch argument to the def's arg type casts multidispatch argument to the def's arg type - passes self as pointer when doing multidispatch passes self as pointer when doing multidispatch - does multidispatch on virtual metaclass type (1) does multidispatch on virtual metaclass type (1) - does dispatch on one argument does dispatch on one argument - initialize multidispatch initialize multidispatch - does multidispatch on virtual metaclass type (2) does multidispatch on virtual metaclass type (2) - does dispatch on one argument with block does dispatch on one argument with block - does dispatch on receiver type and argument type, multiple times does dispatch on receiver type and argument type, multiple times +Randomized with seed: 81207 +Semantic: NoReturn + types union of NoReturns types union of NoReturns + computes NoReturn in a lazy way inside if then (#314) (2) computes NoReturn in a lazy way inside if then (#314) (2) + assumes if condition's type filters when else is no return assumes if condition's type filters when else is no return + computes NoReturn in a lazy way inside if then (#314) (5) computes NoReturn in a lazy way inside if then (#314) (5) + computes NoReturn in a lazy way inside if else (#314) (4) computes NoReturn in a lazy way inside if else (#314) (4) + types union of NoReturn and something else types union of NoReturn and something else + types call to LibC.exit as NoReturn types call to LibC.exit as NoReturn + computes NoReturn in a lazy way inside if else (#314) (2) computes NoReturn in a lazy way inside if else (#314) (2) + types as NoReturn even if Nil return type is forced (#3096) types as NoReturn even if Nil return type is forced (#3096) + types exception handler as NoReturn if ensure is NoReturn types exception handler as NoReturn if ensure is NoReturn + computes NoReturn in a lazy way inside if then (#314) (4) computes NoReturn in a lazy way inside if then (#314) (4) + computes NoReturn in a lazy way inside if else (#314) (3) computes NoReturn in a lazy way inside if else (#314) (3) + computes NoReturn in a lazy way inside if then (#314) (1) computes NoReturn in a lazy way inside if then (#314) (1) + types with no return even if code follows types with no return even if code follows + types raise as NoReturn types raise as NoReturn + types as NoReturn if typeof(exp)'s exp is NoReturn types as NoReturn if typeof(exp)'s exp is NoReturn + computes NoReturn in a lazy way inside if then (#314) (3) computes NoReturn in a lazy way inside if then (#314) (3) + computes NoReturn in a lazy way inside if else (#314) (5) computes NoReturn in a lazy way inside if else (#314) (5) + computes NoReturn in a lazy way inside if else (#314) (1) computes NoReturn in a lazy way inside if else (#314) (1) +Crystal::Playground::Session + assert assert +Semantic: require + file not found + wildcard wildcard + relative require relative require + require require + relative wildcard relative wildcard +Compiler + treats all arguments post-filename as program arguments treats all arguments post-filename as program arguments + compiles a file compiles a file compiles a file compiles a file compiles a file compiles a file compiles a file compiles a file compiles a file compiles a file + runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename + has a valid version has a valid version Crystal::Repl::Interpreter - tuple - interprets tuple literal and access by known index interprets tuple literal and access by known index - interprets tuple literal of different types (2) interprets tuple literal of different types (2) - interprets tuple metaclass range indexer interprets tuple metaclass range indexer - discards tuple access discards tuple access - extends sign when doing to_i32 extends sign when doing to_i32 - discards tuple (#12383) discards tuple (#12383) - interprets tuple self interprets tuple self - interprets tuple literal of different types (1) interprets tuple literal of different types (1) - does tuple indexer on union does tuple indexer on union - unpacks tuple in block arguments unpacks tuple in block arguments - interprets tuple metaclass indexer interprets tuple metaclass indexer - interprets tuple range indexer (2) interprets tuple range indexer (2) - interprets tuple range indexer interprets tuple range indexer -Code gen: def - puts union before single type in matches preferences puts union before single type in matches preferences - can match N type argument of static array (#1203) can match N type argument of static array (#1203) - uses previous argument in default value (#1062) uses previous argument in default value (#1062) - codegens dispatch without obj, bug 1 codegens dispatch without obj, bug 1 - codegens empty def codegens empty def - codegens dispatch with nilable reference union type codegens dispatch with nilable reference union type - codegens return nil when nilable type (1) codegens return nil when nilable type (1) - unifies all calls to same def unifies all calls to same def unifies all calls to same def unifies all calls to same def unifies all calls to same def unifies all calls to same def unifies all calls to same def unifies all calls to same def unifies all calls to same def unifies all calls to same def - codegens dispatch with single def when discarding unallocated ones (2) codegens dispatch with single def when discarding unallocated ones (2) - runs empty def runs empty def - call functions defined in any order call functions defined in any order - use target def type as return type use target def type as return type use target def type as return type use target def type as return type use target def type as return type use target def type as return type use target def type as return type use target def type as return type use target def type as return type use target def type as return type - codegens call with args codegens call with args - codegens with related types codegens with related types - codegens with interesting default argument codegens with interesting default argument - codegens bug #119 codegens bug #119 codegens bug #119 codegens bug #119 codegens bug #119 codegens bug #119 codegens bug #119 codegens bug #119 codegens bug #119 codegens bug #119 - uses var after external uses var after external - codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation - codegens return nil when nilable type (2) codegens return nil when nilable type (2) - codegens dispatch with single def when discarding unallocated ones (1) codegens dispatch with single def when discarding unallocated ones (1) - codegens dispatch without obj, bug 1 codegens dispatch without obj, bug 1 - codegens with and without default arguments codegens with and without default arguments - uses dispatch call type for phi (#3529) uses dispatch call type for phi (#3529) - builds infinite recursive function builds infinite recursive function - doesn't crash on private def as last expression doesn't crash on private def as last expression - codegens dispatch on static method codegens dispatch on static method - looks up matches in super classes and merges them with subclasses looks up matches in super classes and merges them with subclasses - codegens with and without many default arguments codegens with and without many default arguments - codegens yield with destructing tuple having unreachable element codegens yield with destructing tuple having unreachable element - call external function 'putchar' call external function 'putchar' - codegens union to union assignment of mutable arg (#3691) codegens union to union assignment of mutable arg (#3691) - codegens recursive nasty code codegens recursive nasty code - codegens def which changes type of arg codegens def which changes type of arg - codegens recursive type with union codegens recursive type with union - fixes #230: include original owner in mangled def fixes #230: include original owner in mangled def - dispatches on virtual type implementing generic module (related to bug #165) dispatches on virtual type implementing generic module (related to bug #165) - allows to change argument values allows to change argument values - uses self uses self - codegens call without args codegens call without args -Code gen: C ABI - passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) - accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) - returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) - promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) - promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) - returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) - passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) - promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) - promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) - passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) - passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) - promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) - passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) - returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret -Code gen: hooks - fixes empty types in hooks (#3946) fixes empty types in hooks (#3946) - does added method macro does added method macro - does extended macro does extended macro - does inherited macro before class body does inherited macro before class body does inherited macro before class body does inherited macro before class body does inherited macro before class body does inherited macro before class body does inherited macro before class body does inherited macro before class body does inherited macro before class body does inherited macro before class body - does finished does finished - does inherited macro does inherited macro - does inherited macro recursively does inherited macro recursively - does included macro does included macro -Semantic: virtual metaclass - allows allocating virtual type when base class is abstract allows allocating virtual type when base class is abstract - yields virtual type in block arg if class is abstract yields virtual type in block arg if class is abstract - allows passing metaclass to virtual metaclass restriction allows passing metaclass to virtual metaclass restriction - restricts virtual metaclass to Class (#11376) restricts virtual metaclass to Class (#11376) - types virtual metaclass method types virtual metaclass method - types virtual metaclass types virtual metaclass - merges metaclass types merges metaclass types - allows passing metaclass to virtual metaclass restriction allows passing metaclass to virtual metaclass restriction - types metaclass node types metaclass node - merges metaclass types with 3 types merges metaclass types with 3 types -Codegen: super - codegens super without arguments codegens super without arguments - codegens super that calls subclass method 4 codegens super that calls subclass method 4 - calls super in module method (#556) calls super in module method (#556) - codegens super that calls subclass method codegens super that calls subclass method - codegens super inside closure codegens super inside closure - codegens super that calls subclass method 3 codegens super that calls subclass method 3 - doesn't invoke super twice in inherited generic types (#942) doesn't invoke super twice in inherited generic types (#942) - build super on generic class (bug) build super on generic class (bug) - calls super on an object (#10004) calls super on an object (#10004) - codegens super that calls subclass method 2 codegens super that calls subclass method 2 - codegens super without arguments but parent has arguments codegens super without arguments but parent has arguments - codegens super that calls subclass method 5 codegens super that calls subclass method 5 - calls super in metaclass (#1522) calls super in metaclass (#1522) calls super in metaclass (#1522) calls super in metaclass (#1522) calls super in metaclass (#1522) calls super in metaclass (#1522) calls super in metaclass (#1522) calls super in metaclass (#1522) calls super in metaclass (#1522) calls super in metaclass (#1522) - calls super with dispatch (#2318) calls super with dispatch (#2318) - calls super from virtual metaclass type (#2841) calls super from virtual metaclass type (#2841) - calls super in generic module method calls super in generic module method - does super in virtual type including module does super in virtual type including module - codegens super that calls subclass method 6 codegens super that calls subclass method 6 - codegens super without arguments and instance variable codegens super without arguments and instance variable - codegens super inside closure forwarding args codegens super inside closure forwarding args -Semantic: enum - errors if reopening enum with different base type (2) errors if reopening enum with different base type (2) - errors if enum value is too big for type (#678) errors if enum value is too big for type (#678) - reopens enum with same base type (2) reopens enum with same base type (2) - errors if reopen and tries to define constant errors if reopen and tries to define constant - errors if declaring type inside enum, nested (#3127) errors if declaring type inside enum, nested (#3127) - errors if using instance var inside enum (#991) errors if using instance var inside enum (#991) - errors if defining initialize in Enum (#7238) errors if defining initialize in Enum (#7238) - gives error on flags enum overflow gives error on flags enum overflow - has All value when defined as @[Flags] has All value when defined as @[Flags] - disallows redefining None to non-0 for @[Flags] enum disallows redefining None to non-0 for @[Flags] enum - marks as flags with base type (#2185) marks as flags with base type (#2185) - gives error on unsigned flags enum overflow after a member with value gives error on unsigned flags enum overflow after a member with value - allows class vars in enum allows class vars in enum - finds class method in enum type finds class method in enum type - attaches annotation to enum method (#6690) attaches annotation to enum method (#6690) - reopens enum without base type (2) reopens enum without base type (2) - gives error on signed flags enum overflow after a member with value gives error on signed flags enum overflow after a member with value - gives error on enum overflow gives error on enum overflow - types enum types enum - errors if using a name twice errors if using a name twice - allows redefining None to 0 for @[Flags] enum allows redefining None to 0 for @[Flags] enum - errors if reopen but not enum errors if reopen but not enum - doesn't overflow on flags member (#7877) doesn't overflow on flags member (#7877) - types enum value types enum value - doesn't overflow when going from negative to zero (#7874) doesn't overflow when going from negative to zero (#7874) - has None value when defined as @[Flags] has None value when defined as @[Flags] - disallows implicit conversion of int to enum disallows implicit conversion of int to enum - disallows All value for @[Flags] enum disallows All value for @[Flags] enum - errors on enum without members (#3447) errors on enum without members (#3447) - doesn't error when defining a method for an enum with flags doesn't error when defining a method for an enum with flags - can use macro expression inside enum can use macro expression inside enum - reopens enum with same base type (1) reopens enum with same base type (1) - doesn't error when defining a flags enum in a lib with None or All doesn't error when defining a flags enum in a lib with None or All - gives error on enum overflow after a member with value gives error on enum overflow after a member with value - creates enum from value creates enum from value - reopens enum without base type (1) reopens enum without base type (1) - reopens an enum reopens an enum - can use macro for inside enum can use macro for inside enum - doesn't error when defining a non-flags enum with None or All doesn't error when defining a non-flags enum with None or All - errors if invoking private enum method errors if invoking private enum method - defines method on enum defines method on enum - errors if reopening enum with different base type (1) errors if reopening enum with different base type (1) - defines class method on enum defines class method on enum - can redefine Enum.new can redefine Enum.new - errors if declaring type inside enum (#3127) errors if declaring type inside enum (#3127) - finds method in enum type finds method in enum type - errors if inheriting Enum (#3592) errors if inheriting Enum (#3592) - doesn't break assigned values in enum flags when a member has value 0 (#5767) doesn't break assigned values in enum flags when a member has value 0 (#5767) - doesn't visit enum members generated by macros twice (#10104) doesn't visit enum members generated by macros twice (#10104) -Code gen: nilable cast - does cast to nil (2) does cast to nil (2) - does nilable cast (false) does nilable cast (false) - types as? with wrong type (#2775) types as? with wrong type (#2775) - casts with block var that changes type (#3341) casts with block var that changes type (#3341) - codegens with NoReturn codegens with NoReturn - upcasts type to virtual (#3304) upcasts type to virtual (#3304) - does nilable cast (always true) does nilable cast (always true) - casts union type to nilable type (#9342) casts union type to nilable type (#9342) - does upcast does upcast - does cast to nil (1) does cast to nil (1) - does nilable cast (true) does nilable cast (true) - upcasts type to virtual (2) (#3304) upcasts type to virtual (2) (#3304) -Semantic: metaclass - types Object and Class metaclasses types Object and Class metaclasses - types Class class types Class class - types Reference metaclass types Reference metaclass - types generic module metaclass types generic module metaclass - types metaclass superclass types metaclass superclass - can't reopen as module can't reopen as module - types generic class metaclass types generic class metaclass - types generic metaclass superclass types generic metaclass superclass - can't reopen as struct can't reopen as struct - subtyping relations between metaclasses - non-generic modules non-generic modules - generic modules (3) generic modules (3) - generic classes (3) generic classes (3) - virtual metaclass type with virtual type (#12628) virtual metaclass type with virtual type (#12628) - generic modules (2) generic modules (2) - generic classes (2) generic classes (2) - generic modules (1) generic modules (1) - generic classes (1) generic classes (1) - non-generic classes non-generic classes - types Object class types Object class - types generic instance metaclass superclass types generic instance metaclass superclass + closures + does nested closure inside proc does nested closure inside proc + sets ivar of self closured struct (#12341) sets ivar of self closured struct (#12341) + closures self in proc literal (implicit self) closures self in proc literal (implicit self) + does nested closure inside captured blocks does nested closure inside captured blocks + does closure inside proc, capture proc argument does closure inside proc, capture proc argument + closures struct and calls method on it closures struct and calls method on it + does closure inside block does closure inside block + closures block args after 8 bytes (the closure var) closures block args after 8 bytes (the closure var) + does closure without args that captures and modifies two local variables does closure without args that captures and modifies two local variables + does closure without args that captures and modifies one local variable does closure without args that captures and modifies one local variable + does closure inside const does closure inside const + does closure inside def does closure inside def + does closure with two args that captures and modifies two local variables does closure with two args that captures and modifies two local variables + does closure with pointerof local var does closure with pointerof local var + does closure and accesses it inside block does closure and accesses it inside block + closures self in proc literal closures self in proc literal + closures closured block arg closures closured block arg + passes closured struct instance var as self passes closured struct instance var as self + does closure inside block, capture block arg does closure inside block, capture block arg + does closure inside proc does closure inside proc + closures def arguments closures def arguments + does closure inside class variable initializer does closure inside class variable initializer + closures self and modifies instance var closures self and modifies instance var + reads self closured struct (#12341) reads self closured struct (#12341) + gets ivar of self closured struct (#12341) gets ivar of self closured struct (#12341) + does next inside captured block (#12226) does next inside captured block (#12226) + doesn't mix local vars with closured vars doesn't mix local vars with closured vars + does nested closure inside methods and blocks does nested closure inside methods and blocks +Parser warnings + warns on missing space before colon + in type declaration in type declaration + in return type restriction in return type restriction + in anonymous block param type restriction in anonymous block param type restriction + in block param type restriction in block param type restriction + warns on suffix-less UInt64 literals > Int64::MAX warns on suffix-less UInt64 literals > Int64::MAX +Code gen: offsetof + returns offset allowing manual access of tuple items returns offset allowing manual access of tuple items + returns offset allowing manual access of class field that isn't first returns offset allowing manual access of class field that isn't first + returns offset of extern union returns offset of extern union + returns offset of `StaticArray#@buffer` returns offset of `StaticArray#@buffer` + returns offset allowing manual access of struct field that isn't first returns offset allowing manual access of struct field that isn't first + returns offset allowing manual access of first class field returns offset allowing manual access of first class field + returns offset allowing manual access of first struct field returns offset allowing manual access of first struct field Code gen: lib - doesn't crash when casting -1 to UInt32 (#3594) doesn't crash when casting -1 to UInt32 (#3594) + casts C fun to Crystal proc when accessing instance var (#2515) casts C fun to Crystal proc when accessing instance var (#2515) refers to lib type (#960) refers to lib type (#960) - allows setting/getting external variable as function pointer allows setting/getting external variable as function pointer - allows invoking out with underscore allows invoking out with underscore - codegens lib var set and get codegens lib var set and get doesn't crash with nil and varargs (#4414) doesn't crash with nil and varargs (#4414) - casts C fun to Crystal proc when accessing instance var (#2515) casts C fun to Crystal proc when accessing instance var (#2515) - passes int as another float type in literal passes int as another float type in literal - get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) + codegens lib var set and get codegens lib var set and get + allows passing type to LibC if it has a converter with to_unsafe (bug) allows passing type to LibC if it has a converter with to_unsafe (bug) + can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use enum as fun return can use enum as fun return - get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) + allows invoking out with underscore allows invoking out with underscore uses static array in lib extern (#5688) uses static array in lib extern (#5688) - can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return - can use enum as fun argument can use enum as fun argument + doesn't crash when casting -1 to UInt32 (#3594) doesn't crash when casting -1 to UInt32 (#3594) + passes int as another float type in literal passes int as another float type in literal + get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) + allows passing type to LibC if it has a converter with to_unsafe allows passing type to LibC if it has a converter with to_unsafe call to void function call to void function + can use enum as fun argument can use enum as fun argument passes nil to varargs (#1570) passes nil to varargs (#1570) - allows passing type to LibC if it has a converter with to_unsafe (bug) allows passing type to LibC if it has a converter with to_unsafe (bug) - allows passing type to LibC if it has a converter with to_unsafe allows passing type to LibC if it has a converter with to_unsafe + allows setting/getting external variable as function pointer allows setting/getting external variable as function pointer + get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) +Semantic: instance var + uses virtual types in self uses virtual types in self + doesn't consider instance var as nilable if assigned before self access (#4981) doesn't consider instance var as nilable if assigned before self access (#4981) + errors on undefined instance var and subclass calling super errors on undefined instance var and subclass calling super + infers from another instance var infers from another instance var + instance variables initializers are used in class variables initialized objects (#3988) instance variables initializers are used in class variables initialized objects (#3988) + errors if adds instance variable to Object via guess errors if adds instance variable to Object via guess + doesn't error if not initializes in all initialize because declared as nilable doesn't error if not initializes in all initialize because declared as nilable + infers type from number literal infers type from number literal + infers from another instance var in generic type with type declaration infers from another instance var in generic type with type declaration + errors if declaring instance var and turns out to be nilable, in generic type errors if declaring instance var and turns out to be nilable, in generic type + declares instance var of generic type, with no type parameter declares instance var of generic type, with no type parameter + guesses from array literal with of, with subclass guesses from array literal with of, with subclass + infers type from range literal infers type from range literal + guesses inside macro for guesses inside macro for + infers type to be nilable if self is used before assigning to a variable infers type to be nilable if self is used before assigning to a variable + doesn't solve instance var initializer in instance context (2) (#5876) doesn't solve instance var initializer in instance context (2) (#5876) + cannot guess the type from double-splat argument with not double-splatted type cannot guess the type from double-splat argument with not double-splatted type + infers type from included module, outside def infers type from included module, outside def + infers type for generic class, with assign (2) infers type for generic class, with assign (2) + errors when overriding inherited instance variable with incompatible type errors when overriding inherited instance variable with incompatible type + declares instance var of generic type, with metaclass declares instance var of generic type, with metaclass + guesses virtual array type (3) (#5342) guesses virtual array type (3) (#5342) + guesses inside macro if guesses inside macro if + infers type from proc literal with return type infers type from proc literal with return type + errors when redeclaring subclass variable with a different type errors when redeclaring subclass variable with a different type + infers type from assign (1) infers type from assign (1) + errors if declaring generic type without type vars errors if declaring generic type without type vars + infers from restriction using virtual type infers from restriction using virtual type + doesn't error if not initializing nilable var in subclass doesn't error if not initializing nilable var in subclass + errors if declaring var in Enum errors if declaring var in Enum + infers type for generic class, with if infers type for generic class, with if + infers type from array literal in generic type infers type from array literal in generic type + declares instance var of generic type, with static array declares instance var of generic type, with static array + infers type from path that is a constant infers type from path that is a constant + infers type from regex literal with interpolation infers type from regex literal with interpolation + errors if declaring var in Reference errors if declaring var in Reference + infers type from lib fun call infers type from lib fun call + can type ivar from class inherited by generic class (#5281) can type ivar from class inherited by generic class (#5281) + infers from class method that invokes new infers from class method that invokes new + declares instance var of generic class declares instance var of generic class + guesses from hash literal with of, with subclass guesses from hash literal with of, with subclass + says can't infer (#2536) says can't infer (#2536) + infers from assign to local var (#2467) infers from assign to local var (#2467) + infers type from custom generic hash literal infers type from custom generic hash literal + declares instance var with initial value declares instance var with initial value + infers type from as infers type from as + doesn't infer unbound generic type on generic method called from generic's subclass doesn't infer unbound generic type on generic method called from generic's subclass + guesses virtual array type (1) (#5342) guesses virtual array type (1) (#5342) + infer from class method where new is redefined infer from class method where new is redefined + errors if declaring var in Int32 errors if declaring var in Int32 + declares instance var multiple times, last one wins declares instance var multiple times, last one wins + cannot guess type from argument assigned in body cannot guess type from argument assigned in body + doesn't solve instance var initializer in instance context (3) (#5876) doesn't solve instance var initializer in instance context (3) (#5876) + is more permissive with macro def initialize, bug with named args is more permissive with macro def initialize, bug with named args + allows nil instance var because it's a generic type allows nil instance var because it's a generic type + declares instance var of generic module declares instance var of generic module + infers type for generic class, with begin infers type for generic class, with begin + infers type from lib out (2) infers type from lib out (2) + infers from Pointer.malloc in generic type infers from Pointer.malloc in generic type + is more permissive with macro def initialize is more permissive with macro def initialize + infers type from all call matches infers type from all call matches + considers var as assigned in multi-assign considers var as assigned in multi-assign + infers type for generic class, with T.new and literal infers type for generic class, with T.new and literal + guesses from as.(typeof(...)) guesses from as.(typeof(...)) + guesses from splat (#3149) guesses from splat (#3149) + errors with macro def but another def doesn't initialize all errors with macro def but another def doesn't initialize all + infers type from argument default value infers type from argument default value + says undefined instance variable on read says undefined instance variable on read + infers from new with return type in generic type infers from new with return type in generic type + infers type from as? infers type from as? + infers type from responds_to? infers type from responds_to? + transfers initializer from generic module to class transfers initializer from generic module to class + guesses virtual array type (3) (#5342) guesses virtual array type (3) (#5342) + infers type from string interpolation infers type from string interpolation + errors if unknown ivar through macro (#4050) errors if unknown ivar through macro (#4050) + uses virtual types in union uses virtual types in union + infers type from char literal infers type from char literal + infers type to be non-nilable if initialized in all initialize infers type to be non-nilable if initialized in all initialize + doesn't infer from class method with multiple statements and return, on non-easy return (2) doesn't infer from class method with multiple statements and return, on non-easy return (2) + infers type in multi assign infers type in multi assign + can guess the type from double-splat argument with double-splatted type variable can guess the type from double-splat argument with double-splatted type variable + errors if declaring var in NamedTuple(T) errors if declaring var in NamedTuple(T) + errors if not initializing super variables (3) errors if not initializing super variables (3) + infers from Pointer.null in generic type infers from Pointer.null in generic type + infers type from ||= inside another assignment infers type from ||= inside another assignment + ignores redefined initialize (#456) ignores redefined initialize (#456) + is more permissive with macro def initialize, other initialize is more permissive with macro def initialize, other initialize + infers type by removing nil from || left side infers type by removing nil from || left side + can declare type even if included module has a guessed var can declare type even if included module has a guessed var + infers type from is_a? infers type from is_a? + infers type from case infers type from case + infers type from argument with restriction, in generic infers type from argument with restriction, in generic + errors if declaring var in Int errors if declaring var in Int + infers type from array literal with literals in generic type infers type from array literal with literals in generic type + doesn't error if initializing var in superclass, and then empty initialize doesn't error if initializing var in superclass, and then empty initialize + infers type from regex literal infers type from regex literal + errors if declaring var in StaticArray(T, N) errors if declaring var in StaticArray(T, N) + guesses virtual hash type (2) (#5342) guesses virtual hash type (2) (#5342) + doesn't error if calling initialize from another initialize (1) doesn't error if calling initialize from another initialize (1) + infers type from named tuple literal infers type from named tuple literal + doesn't error when redeclaring subclass variable with the same type doesn't error when redeclaring subclass variable with the same type + doesn't error if not calling super but initializing all variables doesn't error if not calling super but initializing all variables + looks up return type restriction in defining type, not instantiated type (#11961) looks up return type restriction in defining type, not instantiated type (#11961) + doesn't infer from class method with multiple statements and return, on non-easy return doesn't infer from class method with multiple statements and return, on non-easy return + errors if declaring instance var and turns out to be nilable, in generic module type in generic type errors if declaring instance var and turns out to be nilable, in generic module type in generic type + is more permissive with macro def initialize, multiple is more permissive with macro def initialize, multiple + declares instance var in module, inherits to type declares instance var in module, inherits to type + infers in multiple assign for tuple type (1) infers in multiple assign for tuple type (1) + infers type from lib out (1) infers type from lib out (1) + doesn't error if not initializing variables but calling super for generic module doesn't error if not initializing variables but calling super for generic module + infers from generic class method that has type annotation infers from generic class method that has type annotation + inferrs Proc(Void) to Proc(Nil) inferrs Proc(Void) to Proc(Nil) + doesn't infer unbound generic type on generic method called from generic's subclass, metaclass context doesn't infer unbound generic type on generic method called from generic's subclass, metaclass context + infers type from two literals infers type from two literals + can guess the type from splat argument with splatted type can guess the type from splat argument with splatted type + infers type from || infers type from || + infers from another instance var with type declaration infers from another instance var with type declaration + doesn't complain if declared type is recursive alias that's nilable doesn't complain if declared type is recursive alias that's nilable + allow usage of instance variable initializer from instance variable initializer allow usage of instance variable initializer from instance variable initializer + can't infer type from initializer in non-generic module can't infer type from initializer in non-generic module + infers type for generic class, with assign (1) infers type for generic class, with assign (1) + doesn't find T in generic type that's not the current type (#4460) doesn't find T in generic type that's not the current type (#4460) + errors on undefined constant errors on undefined constant + doesn't error if not initializing variables but calling super in parent parent doesn't error if not initializing variables but calling super in parent parent + doesn't crash on #3580 doesn't crash on #3580 + infers type from custom array literal infers type from custom array literal + declares instance var of generic type, with proc declares instance var of generic type, with proc + obeys super module initialize (#456) obeys super module initialize (#456) + guesses inside macro expression guesses inside macro expression + errors when typing an instance variable inside a method errors when typing an instance variable inside a method + infers type from included module recursively infers type from included module recursively + says can't infer type if only nil was assigned, in generic type says can't infer type if only nil was assigned, in generic type + infers type from block argument infers type from block argument + infers from class method that has type annotation infers from class method that has type annotation + infers type from offsetof infers type from offsetof + declares instance var of generic type, with tuple declares instance var of generic type, with tuple + declares instance var of generic type declares instance var of generic type + doesn't infer for subclass if assigns another type (1) doesn't infer for subclass if assigns another type (1) + doesn't check call of non-self instance (#4830) doesn't check call of non-self instance (#4830) + doesn't consider var as nilable if conditionally assigned inside initialize, but has initializer (#3669) doesn't consider var as nilable if conditionally assigned inside initialize, but has initializer (#3669) + doesn't error when using generic in generic type because guessed elsewhere doesn't error when using generic in generic type because guessed elsewhere + infers type from ||= infers type from ||= + says undefined instance variable on assign says undefined instance variable on assign + declares instance var of generic type, with virtual metaclass declares instance var of generic type, with virtual metaclass + infers type for generic module infers type for generic module + declares instance var with self, on generic declares instance var with self, on generic + infers from new with return type infers from new with return type + infers type from custom generic array literal infers type from custom generic array literal + declares instance var of generic type subclass declares instance var of generic type subclass + infers type for generic class, with && infers type for generic class, with && + infers type from hash literal from elements infers type from hash literal from elements + infers type from self as virtual type (#2575) infers type from self as virtual type (#2575) + declares instance var with union type with a virtual member declares instance var with union type with a virtual member + declares instance var with initial value, with subclass declares instance var with initial value, with subclass + infers type from string literal infers type from string literal + infers type from unless infers type from unless + infers type from hash literal with of infers type from hash literal with of + ignores super module initialize (#456) ignores super module initialize (#456) + infers type from new expression infers type from new expression + declares instance var in module, inherits to type recursively declares instance var in module, inherits to type recursively + can guess the type from splat argument with splatted type variable can guess the type from splat argument with splatted type variable + errors if declaring instance var and turns out to be nilable, in generic module type errors if declaring instance var and turns out to be nilable, in generic module type + infers type from redefined method if calls previous_def infers type from redefined method if calls previous_def + looks up self restriction in instantiated type, not defined type looks up self restriction in instantiated type, not defined type + infers type from && infers type from && + errors if not initialized in all initialize errors if not initialized in all initialize + guesses from new on abstract class guesses from new on abstract class + infers from Pointer.null infers from Pointer.null + infers from Pointer.malloc with two arguments infers from Pointer.malloc with two arguments + doesn't duplicate instance var in subclass doesn't duplicate instance var in subclass + infers type from bool literal infers type from bool literal + infers type from array literal from its literals infers type from array literal from its literals + declares instance var of generic type, with union declares instance var of generic type, with union + errors if declaring instance variable in module included in Object errors if declaring instance variable in module included in Object + infers type from uninitialized infers type from uninitialized + declares instance var of generic type, with splat declares instance var of generic type, with splat + errors when using Class in generic type errors when using Class in generic type + infers type from custom array literal in generic infers type from custom array literal in generic + errors if not initializing super variables (2) errors if not initializing super variables (2) + instance variable inherited from multiple parents + with incompatible type + module and class, with declarations module and class, with declarations + module and class, with definitions module and class, with definitions + errors module and module, with declarations errors module and module, with declarations + errors module and module, with definitions errors module and module, with definitions + with compatible type + accepts module and module, with declarations accepts module and module, with declarations + module and class, with declarations (3) module and class, with declarations (3) + module and class, with definitions module and class, with definitions + accepts module and module, with definitions accepts module and module, with definitions + module and class, with declarations module and class, with declarations + module and class, with declarations (2) module and class, with declarations (2) + doesn't error when using Class but specifying type doesn't error when using Class but specifying type + infers type for generic class, with T.new infers type for generic class, with T.new + infers type from symbol literal infers type from symbol literal + infers type from lib variable infers type from lib variable + doesn't infer type to be nilable if using self.class doesn't infer type to be nilable if using self.class + infers type for non-generic class, with assign infers type for non-generic class, with assign + infers type from argument restriction infers type from argument restriction + declares instance var of generic type, with splat inside Tuple declares instance var of generic type, with splat inside Tuple + infers type from hash literal with literals in generic type infers type from hash literal with literals in generic type + errors if declaring var in Object errors if declaring var in Object + errors if can't find lib call, before erroring on instance var (#2579) errors if can't find lib call, before erroring on instance var (#2579) + cannot guess the type from splat argument with not splatted type cannot guess the type from splat argument with not splatted type + infers from assign to local var in generic type (#2467) infers from assign to local var in generic type (#2467) + doesn't error if initializes via super in macro def doesn't error if initializes via super in macro def + guesses virtual hash type (1) (#5342) guesses virtual hash type (1) (#5342) + doesn't combine union of Number and Number subclass (#5073) doesn't combine union of Number and Number subclass (#5073) + infers nilable instance var of generic type infers nilable instance var of generic type + infers type for generic class, with literal infers type for generic class, with literal + infers type from hash literal in generic type infers type from hash literal in generic type + errors if declaring var in Number errors if declaring var in Number + can't infer type of generic method that returns self (#5383) can't infer type of generic method that returns self (#5383) + errors when assigning instance variable at top level block errors when assigning instance variable at top level block + errors if adds instance variable to Object via guess via included module errors if adds instance variable to Object via guess via included module + errors when using Class (#2605) errors when using Class (#2605) + can't infer type from initializer in generic class type can't infer type from initializer in generic class type + infers type from literal outside def infers type from literal outside def + gives correct error when trying to use Int as an instance variable type gives correct error when trying to use Int as an instance variable type + guesses virtual array type (2) (#5342) guesses virtual array type (2) (#5342) + infers from method on integer literal, with type annotation infers from method on integer literal, with type annotation + guesses from as.(typeof(...)) in generic type guesses from as.(typeof(...)) in generic type + can't infer type from initializer can't infer type from initializer + declares instance var of generic class after reopen declares instance var of generic class after reopen + accepts overriding inherited instance variable with compatible type accepts overriding inherited instance variable with compatible type + declares instance var of generic type, with splat inside Proc declares instance var of generic type, with splat inside Proc + errors when assigning instance variable at top level control block errors when assigning instance variable at top level control block + infers type from begin infers type from begin + infers type from assign (2) infers type from assign (2) + errors when assigning instance variable inside nested expression errors when assigning instance variable inside nested expression + doesn't error if not initializing variables but calling super and previous_def doesn't error if not initializing variables but calling super and previous_def + errors if declaring var in Tuple(*T) errors if declaring var in Tuple(*T) + can type ivar from module included by generic class (#5281) can type ivar from module included by generic class (#5281) + errors if declaring var in Union(*T) errors if declaring var in Union(*T) + declares instance var of generic module from non-generic module declares instance var of generic module from non-generic module + shouldn't error when accessing instance var in initialized that's always initialized (#2953) shouldn't error when accessing instance var in initialized that's always initialized (#2953) + infers from class method that has type annotation, with overload infers from class method that has type annotation, with overload + declares with `self` declares with `self` + doesn't consider self.initialize as initializer (#3239) doesn't consider self.initialize as initializer (#3239) + errors if not initializing super variable in generic errors if not initializing super variable in generic + infers type from enum member infers type from enum member + doesn't infer type to be nilable if using self.class in call in assign doesn't infer type to be nilable if using self.class in call in assign + doesn't error if inheriting generic instance (#3635) doesn't error if inheriting generic instance (#3635) + solves instance var initializer in metaclass context (#5876) solves instance var initializer in metaclass context (#5876) + infers from another instance var in generic type infers from another instance var in generic type + infers type from literal outside def with initialize and type restriction infers type from literal outside def with initialize and type restriction + declares as named tuple declares as named tuple + infers from method in generic type, with type annotation infers from method in generic type, with type annotation + infers from new with return type returning generic infers from new with return type returning generic + can't infer type from initializer in generic module type can't infer type from initializer in generic module type + errors if declaring var in Value errors if declaring var in Value + infers type from array literal with of metaclass infers type from array literal with of metaclass + doesn't error if calling initialize from another initialize (2) doesn't error if calling initialize from another initialize (2) + infers type from instance_sizeof infers type from instance_sizeof + infers from Pointer.malloc with two arguments in generic type infers from Pointer.malloc with two arguments in generic type + infers type from included module infers type from included module + doesn't error if uses typeof(@var) doesn't error if uses typeof(@var) + errors if declaring var in Float errors if declaring var in Float + errors if not initializing super variables errors if not initializing super variables + declares instance var of generic type through module declares instance var of generic type through module + can guess the type from double-splat argument with double-splatted type can guess the type from double-splat argument with double-splatted type + doesn't complain if not initialized in one initialize, but has initializer (#2465) doesn't complain if not initialized in one initialize, but has initializer (#2465) + doesn't crash when inferring from new without matches (#2538) doesn't crash when inferring from new without matches (#2538) + declares instance var declares instance var + infers type from array literal with of infers type from array literal with of + types generic instance as virtual type if generic type has subclasses (#3805) types generic instance as virtual type if generic type has subclasses (#3805) + infers type to be nilable if self is used in same assign infers type to be nilable if self is used in same assign + declares instance var of generic type, with generic type declares instance var of generic type, with generic type + errors if declaring instance var and turns out to be nilable errors if declaring instance var and turns out to be nilable + infers type from ! infers type from ! + errors if finally not initialized in macro def errors if finally not initialized in macro def + doesn't error if not initializing variables but calling previous_def (#3210) doesn't error if not initializing variables but calling previous_def (#3210) + doesn't error if not initializing variables but calling super for module doesn't error if not initializing variables but calling super for module + doesn't complain in second part of #2575 doesn't complain in second part of #2575 + doesn't error when using generic because guessed elsewhere doesn't error when using generic because guessed elsewhere + infers from generic class method that has type annotation, without instantiating infers from generic class method that has type annotation, without instantiating + guesses from splat (2) (#3149) guesses from splat (2) (#3149) + infers type from tuple literal infers type from tuple literal + doesn't infer type from redefined method doesn't infer type from redefined method + infers type from custom hash literal in generic infers type from custom hash literal in generic + infers type from path that is a type infers type from path that is a type + uses virtual types in fun uses virtual types in fun + infers from class method that has type annotation, in generic class infers from class method that has type annotation, in generic class + infers type for generic class, with case infers type for generic class, with case + says can't infer type if only nil was assigned says can't infer type if only nil was assigned + infers type from if infers type from if + infer from class method with multiple statements and return infer from class method with multiple statements and return + infers type to be nilable if not initialized infers type to be nilable if not initialized + infers type from custom hash literal infers type from custom hash literal + infers type from block argument without restriction infers type from block argument without restriction + infers from class method that has number literal infers from class method that has number literal + errors if declaring var in Class errors if declaring var in Class + declares instance var of generic module (2) declares instance var of generic module (2) + errors if declaring variable with number errors if declaring variable with number + infers type from lib out (3) infers type from lib out (3) + doesn't infer unbound generic type on non-generic call (#6390) doesn't infer unbound generic type on non-generic call (#6390) + infers nilable instance var of generic module infers nilable instance var of generic module + doesn't error if not initialized in macro def but outside it doesn't error if not initialized in macro def but outside it + doesn't crash on missing var on subclass, with superclass not specifying a type doesn't crash on missing var on subclass, with superclass not specifying a type + infers from Pointer.malloc infers from Pointer.malloc + doesn't crash on recursive method call doesn't crash on recursive method call + errors if declaring var in Proc(*T, R) errors if declaring var in Proc(*T, R) + doesn't infer for subclass if assigns another type (2) doesn't infer for subclass if assigns another type (2) + doesn't error if not initializing variables but calling previous_def (2) (#3210) doesn't error if not initializing variables but calling previous_def (2) (#3210) + uses T.new (#4291) uses T.new (#4291) + transfers initializer from module to generic class transfers initializer from module to generic class + doesn't error if declaring instance var and doesn't out to be nilable, in generic module type doesn't error if declaring instance var and doesn't out to be nilable, in generic module type + doesn't solve instance var initializer in instance context (1) (#5876) doesn't solve instance var initializer in instance context (1) (#5876) + can't infer type when using operation on const (#4054) can't infer type when using operation on const (#4054) + doesn't infer generic type without type argument inside generic doesn't infer generic type without type argument inside generic + doesn't if declaring nilable instance var and turns out to be nilable doesn't if declaring nilable instance var and turns out to be nilable + infers from class method that has type annotation, with multiple overloads matching, all with the same type infers from class method that has type annotation, with multiple overloads matching, all with the same type + declares instance var which appears in initialize declares instance var which appears in initialize + errors if declaring var in Pointer(T) errors if declaring var in Pointer(T) + infers type from sizeof infers type from sizeof + doesn't error if not initializing variables but calling super doesn't error if not initializing variables but calling super + infers type for generic class, with lib call infers type for generic class, with lib call + infers type from self (#2575) infers type from self (#2575) + infers from class method that refers to constant infers from class method that refers to constant +Semantic: ReferenceStorage + errors if T is a nilable type errors if T is a nilable type + errors if T is a value type errors if T is a value type + allows a different name allows a different name + errors if T is a union type errors if T is a union type + errors if T is a struct type errors if T is a struct type +Normalize: hash literal + hoists complex element expressions hoists complex element expressions + normalizes empty with of normalizes empty with of + normalizes non-empty without of normalizes non-empty without of + hoists complex element expressions, hash-like generic hoists complex element expressions, hash-like generic + hoists complex element expressions, hash-like hoists complex element expressions, hash-like + normalizes non-empty with of normalizes non-empty with of +Code gen: next + codegens next with break (2) codegens next with break (2) + codegens next with break (1) codegens next with break (1) + codegens next with while inside block codegens next with while inside block + codegens next with break (3) codegens next with break (3) + codegens next conditionally codegens next conditionally + codegens next codegens next + codegens next conditionally with int type (2) codegens next conditionally with int type (2) + codegens next without expressions codegens next without expressions +Code gen: union type + codegens union type when obj union but arg is not codegens union type when obj union but arg is not + codegens union type as return value codegens union type as return value + codegens union type when no obj codegens union type when no obj + assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 + codegens if with same nested union codegens if with same nested union + assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 + codegens union type when no obj and restrictions codegens union type when no obj and restrictions + assigns union to larger union assigns union to larger union assigns union to larger union assigns union to larger union assigns union to larger union assigns union to larger union assigns union to larger union assigns union to larger union assigns union to larger union assigns union to larger union + provides T as a tuple literal provides T as a tuple literal + codegens union to_s codegens union to_s codegens union to_s codegens union to_s codegens union to_s codegens union to_s codegens union to_s codegens union to_s codegens union to_s codegens union to_s + sorts restrictions when there are unions sorts restrictions when there are unions + codegens union type when obj is union and no args codegens union type when obj is union and no args + assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union + codegens union type when obj is not union but arg is codegens union type when obj is not union but arg is + codegens union type for instance var codegens union type for instance var + codegens union type when obj is union and arg is union codegens union type when obj is union and arg is union + dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable +Normalize: def + expands a def with double splat and no args expands a def with double splat and no args + expands a def on request with default arguments that yields expands a def on request with default arguments that yields + expands with magic constant with named arg with yield expands with magic constant with named arg with yield + expands a def with external names (1) expands a def with external names (1) + expands a def on request with default arguments (external names) expands a def on request with default arguments (external names) + expands with magic constant specifying one when all are magic expands with magic constant specifying one when all are magic + expands a def on request with default arguments (2) expands a def on request with default arguments (2) + expands with named argument and yield expands with named argument and yield + expands a def with external names (2) expands a def with external names (2) + expands default value after splat index expands default value after splat index + expands with magic constant expands with magic constant + expands with splat with one arg before expands with splat with one arg before + expands a def on request with default arguments that yields (2) expands a def on request with default arguments that yields (2) + expands with one named arg that is the only one (1) expands with one named arg that is the only one (1) + expands a def on request with default arguments and type restrictions expands a def on request with default arguments and type restrictions + expands with splat and default argument expands with splat and default argument + expands a def with double splat and two named args expands a def with double splat and two named args + expands with magic constant with named arg expands with magic constant with named arg + expands with more named arg which come in the correct order expands with more named arg which come in the correct order + expands a def with double splat and two named args and regular args expands a def with double splat and two named args and regular args + uses bare * uses bare * + expands with splat expands with splat + expands with one named arg that is the only one (2) expands with one named arg that is the only one (2) + expands arg with default value after splat expands arg with default value after splat + expands with two named argument expands with two named argument + expands with named argument expands with named argument + expands with two named argument and one not expands with two named argument and one not + gives correct body location with + splat arg, without body splat arg, without body + splat arg, with body splat arg, with body + default arg with restriction, without body default arg with restriction, without body + default arg, without body default arg, without body + default arg with restriction, with body default arg with restriction, with body + block instance var arg, without body block instance var arg, without body + default arg, with body default arg, with body + block instance var arg, with body block instance var arg, with body + expands a def on request with default arguments that yields (external names) expands a def on request with default arguments that yields (external names) + expands def with reserved external name (#6559) expands def with reserved external name (#6559) + expands a def on request with default arguments expands a def on request with default arguments + expands a def with splat and double splat expands a def with splat and double splat + expands a new def with double splat and two named args and regular args expands a new def with double splat and two named args and regular args + expands a def on request with default arguments and type restrictions (2) expands a def on request with default arguments and type restrictions (2) + expands with splat and zero expands with splat and zero + expands with magic constant specifying one when not all are magic expands with magic constant specifying one when not all are magic Code gen: proc - doesn't crash on #2196 doesn't crash on #2196 - codegens nilable proc type (1) codegens nilable proc type (1) + codegens proc with another var codegens proc with another var + allows redefining fun allows redefining fun + call simple proc literal with return call simple proc literal with return + assigns nil and proc to nilable proc type assigns nil and proc to nilable proc type + allows invoking a function with a subtype allows invoking a function with a subtype + saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` + allows proc pointer where self is a class allows proc pointer where self is a class + call proc literal with return type call proc literal with return type + does new on proc type does new on proc type + call proc literal with arguments call proc literal with arguments + calls function pointer calls function pointer calls function pointer calls function pointer calls function pointer calls function pointer calls function pointer calls function pointer calls function pointer calls function pointer + passes proc as &->expr to method that yields passes proc as &->expr to method that yields + mangles strings in such a way they don't conflict with funs (#1006) mangles strings in such a way they don't conflict with funs (#1006) + codegens proc that references struct (bug) codegens proc that references struct (bug) + calls proc pointer with union (passed by value) arg calls proc pointer with union (passed by value) arg + codegens nilable proc type dispatch (1) codegens nilable proc type dispatch (1) casts from function pointer to proc casts from function pointer to proc - codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type - can assign proc that returns anything to proc that returns nil, using union type (#3655) can assign proc that returns anything to proc that returns nil, using union type (#3655) - binds function pointer to associated call binds function pointer to associated call - gets proc pointer using virtual type (#1337) gets proc pointer using virtual type (#1337) - codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) - codegens nilable proc type (2) codegens nilable proc type (2) + codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct + codegens nilable proc type dispatch (2) codegens nilable proc type dispatch (2) + codegens captured block that returns tuple codegens captured block that returns tuple + codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) + builds proc type from fun builds proc type from fun + codegens proc that accepts a union and is called with a single type codegens proc that accepts a union and is called with a single type + call simple proc literal call simple proc literal + codegens proc in instance var initialize (#3016) codegens proc in instance var initialize (#3016) + takes pointerof function pointer takes pointerof function pointer + passes block to another function (bug: mangling of both methods was the same) passes block to another function (bug: mangling of both methods was the same) + allows proc type of enum type allows proc type of enum type + allows using proc arg name shadowing local variable allows using proc arg name shadowing local variable doesn't crash when taking a proc pointer that multidispatches on a module (#3822) doesn't crash when taking a proc pointer that multidispatches on a module (#3822) - codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct allows invoking a function with a subtype when defined as block spec allows invoking a function with a subtype when defined as block spec - takes pointerof function pointer takes pointerof function pointer - codegens proc that accepts a union and is called with a single type codegens proc that accepts a union and is called with a single type closures var on ->var.call (#8584) closures var on ->var.call (#8584) - automatically casts proc that returns something to proc that returns void automatically casts proc that returns something to proc that returns void - can assign proc that returns anything to proc that returns nil (#3655) can assign proc that returns anything to proc that returns nil (#3655) - codegens captured block that returns tuple codegens captured block that returns tuple - call proc literal with return type call proc literal with return type - codegens proc that references struct (bug) codegens proc that references struct (bug) - does new on proc type does new on proc type - allows proc type of enum type allows proc type of enum type - codegens proc that returns a virtual type codegens proc that returns a virtual type + gets proc to lib fun (#504) gets proc to lib fun (#504) + saves receiver value of proc pointer `->var.foo` saves receiver value of proc pointer `->var.foo` + codegens nilable proc type (1) codegens nilable proc type (1) + can pass Proc(T) to Proc(Nil) in type restriction (#8964) can pass Proc(T) to Proc(Nil) in type restriction (#8964) executes proc pointer on primitive executes proc pointer on primitive - passes block to another function (bug: mangling of both methods was the same) passes block to another function (bug: mangling of both methods was the same) - calls proc pointer with union (passed by value) arg calls proc pointer with union (passed by value) arg - call proc pointer with args call proc pointer with args - codegens proc with another var codegens proc with another var - codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) - call proc literal with arguments call proc literal with arguments + uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) + builds nilable proc type from fun builds nilable proc type from fun + call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method call proc pointer of instance method - calls function pointer calls function pointer calls function pointer calls function pointer calls function pointer calls function pointer calls function pointer calls function pointer calls function pointer calls function pointer - assigns nil and proc to nilable proc type assigns nil and proc to nilable proc type + doesn't crash when taking a proc pointer that multidispatches on the top-level (#3822) doesn't crash when taking a proc pointer that multidispatches on the top-level (#3822) + can assign proc that returns anything to proc that returns nil, using union type (#3655) can assign proc that returns anything to proc that returns nil, using union type (#3655) + codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type + gets proc pointer using virtual type (#1337) gets proc pointer using virtual type (#1337) + doesn't crash on #2196 doesn't crash on #2196 + call proc pointer with args call proc pointer with args call proc pointer call proc pointer - saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` - saves receiver value of proc pointer `->@ivar.foo` saves receiver value of proc pointer `->@ivar.foo` - codegens proc in instance var initialize (#3016) codegens proc in instance var initialize (#3016) - gets proc to lib fun (#504) gets proc to lib fun (#504) - can pass Proc(T) to Proc(Nil) in type restriction (#8964) can pass Proc(T) to Proc(Nil) in type restriction (#8964) accesses T in macros as a TupleLiteral accesses T in macros as a TupleLiteral - saves receiver value of proc pointer `->var.foo` saves receiver value of proc pointer `->var.foo` - allows proc pointer where self is a class allows proc pointer where self is a class + codegens proc that returns a virtual type codegens proc that returns a virtual type + doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) + saves receiver value of proc pointer `->@ivar.foo` saves receiver value of proc pointer `->@ivar.foo` codegens proc of generic type codegens proc of generic type - passes proc as &->expr to method that yields passes proc as &->expr to method that yields + allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically + binds function pointer to associated call binds function pointer to associated call + makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference + automatically casts proc that returns something to proc that returns void automatically casts proc that returns something to proc that returns void + codegens proc with union type that returns itself codegens proc with union type that returns itself allows proc type of enum type with base type allows proc type of enum type with base type - allows invoking a function with a subtype allows invoking a function with a subtype - builds proc type from fun builds proc type from fun - makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference - allows redefining fun allows redefining fun - uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) - call simple proc literal with return call simple proc literal with return - call simple proc literal call simple proc literal - call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises - codegens nilable proc type dispatch (2) codegens nilable proc type dispatch (2) - mangles strings in such a way they don't conflict with funs (#1006) mangles strings in such a way they don't conflict with funs (#1006) + can assign proc that returns anything to proc that returns nil (#3655) can assign proc that returns anything to proc that returns nil (#3655) allows invoking proc literal with smaller type allows invoking proc literal with smaller type - doesn't crash when taking a proc pointer that multidispatches on the top-level (#3822) doesn't crash when taking a proc pointer that multidispatches on the top-level (#3822) - codegens nilable proc type dispatch (1) codegens nilable proc type dispatch (1) - builds nilable proc type from fun builds nilable proc type from fun - allows using proc arg name shadowing local variable allows using proc arg name shadowing local variable - allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically - codegens proc with union type that returns itself codegens proc with union type that returns itself - doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) -Semantic: offsetof - gives error if using offsetof on something that's neither a class, a struct nor a Tuple gives error if using offsetof on something that's neither a class, a struct nor a Tuple - gives error if using offsetof on something that can't have instance variables gives error if using offsetof on something that can't have instance variables - errors on undefined instance variable errors on undefined instance variable - types offsetof types offsetof - can be used with generic types can be used with generic types - gives error if using offsetof on Tuples with indexes greater than tuple size gives error if using offsetof on Tuples with indexes greater than tuple size - can be used with classes can be used with classes - errors on typeof inside offsetof expression errors on typeof inside offsetof expression - gives error if using offsetof on Tuples with instance variables gives error if using offsetof on Tuples with instance variables - gives error if using offsetof on Tuples with negative indexes gives error if using offsetof on Tuples with negative indexes - gives error if using offsetof on non-Tuples with an index gives error if using offsetof on non-Tuples with an index - errors on offsetof element of uninstantiated generic type errors on offsetof element of uninstantiated generic type -Crystal::Init::InitProject - correctly uses git config correctly uses git config - has proper contents has proper contents -Semantic: concrete_types - UnionType of structs UnionType of structs - VirtualMetaclassType with concrete base VirtualMetaclassType with concrete base - ModuleType ModuleType - VirtualType with concrete base VirtualType with concrete base - VirtualType with abstract base VirtualType with abstract base - GenericModuleInstanceType GenericModuleInstanceType - VirtualMetaclassType with abstract base VirtualMetaclassType with abstract base -Semantic: yield with scope - infer type of block body with yield scope infer type of block body with yield scope - passes #229 passes #229 - finds macro finds macro - uses instance variable of enclosing scope uses instance variable of enclosing scope - infer type of empty block body infer type of empty block body - infer type of block body infer type of block body - infer type of block body with yield scope and arguments infer type of block body with yield scope and arguments - invokes nested calls invokes nested calls - errors if using instance variable at top level errors if using instance variable at top level - mentions with yield scope and current scope in error mentions with yield scope and current scope in error - uses method of enclosing scope uses method of enclosing scope + codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) + codegens nilable proc type (2) codegens nilable proc type (2) +Codegen: responds_to? + codegens responds_to? with nilable gives false because other type 2 codegens responds_to? with nilable gives false because other type 2 + codegens responds_to? false for simple type codegens responds_to? false for simple type + works with generic virtual module (2) (#8334) works with generic virtual module (2) (#8334) + works with generic virtual superclass (1) works with generic virtual superclass (1) + codegens responds_to? with nilable gives true codegens responds_to? with nilable gives true + works with virtual class type (1) (#1926) works with virtual class type (1) (#1926) + codegens responds_to? with generic class (1) codegens responds_to? with generic class (1) + works with virtual class type (2) (#1926) works with virtual class type (2) (#1926) + doesn't error if result is discarded (#14113) doesn't error if result is discarded (#14113) + codegens responds_to? true for simple type codegens responds_to? true for simple type + codegens responds_to? with union gives true codegens responds_to? with union gives true + does for generic instance type metaclass (#4353) does for generic instance type metaclass (#4353) + works with generic virtual module (1) works with generic virtual module (1) + codegens responds_to? with union gives false codegens responds_to? with union gives false + works with virtual type works with virtual type + codegens responds_to? with generic class (2) codegens responds_to? with generic class (2) + works with module works with module + works with generic virtual superclass (2) works with generic virtual superclass (2) + codegens responds_to? with nilable gives false because other type 1 codegens responds_to? with nilable gives false because other type 1 + works with two virtual types works with two virtual types Crystal::Repl::Interpreter - structs - does class instance var initializer inheritance does class instance var initializer inheritance - does complex class instance var initializer does complex class instance var initializer - does call receiver by value from VirtualType abstract struct to union does call receiver by value from VirtualType abstract struct to union - inlines struct method that returns self (#12253) inlines struct method that returns self (#12253) - does simple struct instance var initializer does simple struct instance var initializer - does constructor does constructor - sets multiple instance vars in virtual abstract struct call (#12187) sets multiple instance vars in virtual abstract struct call (#12187) - interprets read instance var of struct interprets read instance var of struct - casts def body to def type casts def body to def type - mutates struct inside union mutates struct inside union - does call receiver by value from VirtualType abstract struct to concrete struct (#12190) does call receiver by value from VirtualType abstract struct to concrete struct (#12190) - does simple class instance var initializer does simple class instance var initializer - discards allocate discards allocate - mutates struct stored in class var mutates struct stored in class var - does allocate, set instance var and get instance var does allocate, set instance var and get instance var + enum + does enum new does enum new + does enum value does enum value +Crystal::Repl::Interpreter + responds_to? + does responds_to? does responds_to? + doesn't crash if def body ends up with no type (#12219) doesn't crash if def body ends up with no type (#12219) +Semantic: cast + should error if can't cast even if not instantiated should error if can't cast even if not instantiated + allows casting NoReturn to any type (#2132) allows casting NoReturn to any type (#2132) + doesn't cast to unbound generic type (as?) (#5927) doesn't cast to unbound generic type (as?) (#5927) + allows casting reference union to void pointer allows casting reference union to void pointer + casts to bigger union casts to bigger union + disallows casting to Reference disallows casting to Reference + doesn't allow upcast of generic type var (#996) doesn't allow upcast of generic type var (#996) + disallows casting int to pointer disallows casting int to pointer + errors if casting nil to Object inside typeof (#2403) errors if casting nil to Object inside typeof (#2403) + doesn't cast to virtual primitive (bug) doesn't cast to virtual primitive (bug) + can cast to metaclass (bug) can cast to metaclass (bug) + casts to base class making it virtual (2) casts to base class making it virtual (2) + casts uninstantiated generic class to itself (#10882) casts uninstantiated generic class to itself (#10882) + casts to compatible type and use it casts to compatible type and use it + casts to module casts to module + doesn't crash with typeof no-type (#7441) doesn't crash with typeof no-type (#7441) + doesn't eagerly try to check cast type (#12268) doesn't eagerly try to check cast type (#12268) + disallows casting to Object (#815) disallows casting to Object (#815) + casts from union to compatible union casts from union to compatible union + disallows casting to Class disallows casting to Class + considers else to be unreachable (#9658) considers else to be unreachable (#9658) + casts to generic virtual type casts to generic virtual type + casts to target type even if can't infer casted value type (obsolete) casts to target type even if can't infer casted value type (obsolete) + casts pointer of one type to another type casts pointer of one type to another type + casts to incompatible type gives error casts to incompatible type gives error + allows casting object to void pointer allows casting object to void pointer + doesn't error if casting to a generic type doesn't error if casting to a generic type + casts to same type is ok casts to same type is ok + can cast to metaclass (2) (#11121) can cast to metaclass (2) (#11121) + can cast from Void* to virtual type (#3014) can cast from Void* to virtual type (#3014) + casts from union to incompatible union gives error casts from union to incompatible union gives error + casts to base class making it virtual (1) casts to base class making it virtual (1) + disallows casting fun to pointer disallows casting fun to pointer + doesn't cast to unbound generic type (as) (#5927) doesn't cast to unbound generic type (as) (#5927) + casts pointer to another type casts pointer to another type + disallows casting pointer to fun disallows casting pointer to fun + casts from pointer to generic class gives error casts from pointer to generic class gives error + errors on cast inside a call that can't be instantiated errors on cast inside a call that can't be instantiated +Code gen: cast + allows casting object to pointer and back allows casting object to pointer and back + casts with block var that changes type (#3341) casts with block var that changes type (#3341) + can cast to metaclass (#11121) can cast to metaclass (#11121) + downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment + casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int + codegens class method when type id is available but not a virtual type (#3490) codegens class method when type id is available but not a virtual type (#3490) + casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError + casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type + allows casting nilable type to Void* (1) allows casting nilable type to Void* (1) + casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type + can cast from Void* to virtual type (#3014) can cast from Void* to virtual type (#3014) + allows casting nil to Void* allows casting nil to Void* + casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union + casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError + upcasts type to virtual (#3304) upcasts type to virtual (#3304) + sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment + casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError + casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer + cast virtual metaclass type to nilable virtual instance type (#12628) cast virtual metaclass type to nilable virtual instance type (#12628) + casts to module casts to module casts to module casts to module casts to module casts to module casts to module casts to module casts to module casts to module + upcasts from non-generic to generic upcasts from non-generic to generic + allows casting nilable type to Void* (2) allows casting nilable type to Void* (2) + allows casting nilable type to Void* (3) allows casting nilable type to Void* (3) + casts to bigger union casts to bigger union + doesn't corrupt stack when downcasting union to union with different alignment (#14285) doesn't corrupt stack when downcasting union to union with different alignment (#14285) + casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) + casts to base class making it virtual casts to base class making it virtual + casts between union types, where union has a tuple type (#3377) casts between union types, where union has a tuple type (#3377) + casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError + upcasts type to virtual (2) (#3304) upcasts type to virtual (2) (#3304) + upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment + casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil + casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) +Semantic: pointer + can't do Pointer.malloc without type var can't do Pointer.malloc without type var + detects recursive pointerof expansion (#551) (#553) detects recursive pointerof expansion (#551) (#553) + types int pointer types int pointer + doesn't crash if pointerof expansion type has generic splat parameter (#11808) doesn't crash if pointerof expansion type has generic splat parameter (#11808) + types pointer of constant types pointer of constant + errors if doing Pointer.allocate errors if doing Pointer.allocate + errors with non-matching generic value with value=, generic type (#10211) errors with non-matching generic value with value=, generic type (#10211) + types pointer value types pointer value + type pointer casting type pointer casting + pointer malloc creates new type pointer malloc creates new type + can assign pointerof virtual type (#8216) can assign pointerof virtual type (#8216) + types realloc types realloc + types pointer value on typedef types pointer value on typedef + create pointer by address create pointer by address + types pointer diff types pointer diff + takes pointerof lib external var takes pointerof lib external var + detects recursive pointerof expansion (4) detects recursive pointerof expansion (4) + can pass any pointer to something expecting void* in lib call, with to_unsafe can pass any pointer to something expecting void* in lib call, with to_unsafe + errors with non-matching generic value with value= (#10211) errors with non-matching generic value with value= (#10211) + can assign nil to void pointer can assign nil to void pointer + types pointer add types pointer add + can pass any pointer to something expecting void* in lib call can pass any pointer to something expecting void* in lib call + pointer of class raises error pointer of class raises error + type pointer casting of object type type pointer casting of object type + detects recursive pointerof expansion (2) (#1654) detects recursive pointerof expansion (2) (#1654) + detects recursive pointerof expansion (3) detects recursive pointerof expansion (3) + types Pointer.malloc types Pointer.malloc + errors with non-matching generic value with value=, union of generic types (#10544) errors with non-matching generic value with value=, union of generic types (#10544) + says undefined variable (#7556) says undefined variable (#7556) + allows using pointer with subclass allows using pointer with subclass + pointer of value error pointer of value error +Normalize: case + normalizes select with else normalizes select with else + normalizes select with assign normalizes select with assign + normalizes select with assign and bang method normalizes select with assign and bang method + normalizes select with call normalizes select with call + normalizes select with assign and question method normalizes select with assign and question method +Normalize: op assign + normalizes var &+= normalizes var &+= + normalizes var += normalizes var += + normalizes var &-= normalizes var &-= + normalizes var &&= normalizes var &&= + normalizes exp[0] += normalizes exp[0] += + normalizes var *= normalizes var *= + normalizes var[0] += normalizes var[0] += + normalizes @@var.value += normalizes @@var.value += + normalizes @var[0] += normalizes @var[0] += + normalizes exp.value ||= normalizes exp.value ||= + normalizes var.value += normalizes var.value += + normalizes @@var[0] += normalizes @@var[0] += + normalizes var -= normalizes var -= + normalizes @var.value += normalizes @var.value += + normalizes exp[value] ||= normalizes exp[value] ||= + normalizes exp[value] &&= normalizes exp[value] &&= + normalizes var ||= normalizes var ||= + normalizes exp[value] += normalizes exp[value] += + normalizes var &*= normalizes var &*= + normalizes exp.value &&= normalizes exp.value &&= + normalizes exp.value += normalizes exp.value += +Code gen: macro + expands macro with default arg and splat (2) (#784) expands macro with default arg and splat (2) (#784) + uses invocation context uses invocation context + expands macro expands macro + gets enum members as constants gets enum members as constants + passes #826 passes #826 + keeps line number with no block keeps line number with no block + fixes empty types of macro expansions (#1379) fixes empty types of macro expansions (#1379) + can use constants can use constants + doesn't reuse macro nodes (bug) doesn't reuse macro nodes (bug) + can iterate union types can iterate union types + codegens macro def with splat (#496) codegens macro def with splat (#496) + resolves alias in macro resolves alias in macro + keeps heredoc contents inside macro keeps heredoc contents inside macro + expands def macro with @type.name with virtual expands def macro with @type.name with virtual + recalculates method when virtual metaclass type is added recalculates method when virtual metaclass type is added recalculates method when virtual metaclass type is added recalculates method when virtual metaclass type is added recalculates method when virtual metaclass type is added recalculates method when virtual metaclass type is added recalculates method when virtual metaclass type is added recalculates method when virtual metaclass type is added recalculates method when virtual metaclass type is added recalculates method when virtual metaclass type is added + errors if dynamic constant assignment after macro expansion errors if dynamic constant assignment after macro expansion + forwards file location forwards file location + expands macro and resolves type correctly expands macro and resolves type correctly + runs macro with splat runs macro with splat + runs macro with arg and splat runs macro with arg and splat + expands def macro with @type.name expands def macro with @type.name + expands inline macro for expands inline macro for + doesn't replace %s in string (#2178) doesn't replace %s in string (#2178) + executes subclasses executes subclasses + determines if overrides, with macro method (false) determines if overrides, with macro method (false) + can access type variables of a module can access type variables of a module + doesn't skip abstract classes when defining macro methods doesn't skip abstract classes when defining macro methods + gets default value of instance variable of inherited type that also includes module gets default value of instance variable of inherited type that also includes module + can refer to types can refer to types + executes with named arguments executes with named arguments + can refer to abstract (1) can refer to abstract (1) + uses tuple T in method with free vars uses tuple T in method with free vars + expands macro defined in class expands macro defined in class + expands macro with op assign inside assign (#5568) expands macro with op assign inside assign (#5568) expands macro with op assign inside assign (#5568) expands macro with op assign inside assign (#5568) expands macro with op assign inside assign (#5568) expands macro with op assign inside assign (#5568) expands macro with op assign inside assign (#5568) expands macro with op assign inside assign (#5568) expands macro with op assign inside assign (#5568) expands macro with op assign inside assign (#5568) + determines if overrides, through another class (true) determines if overrides, through another class (true) + gets constant gets constant + gets default value of instance variable of generic type gets default value of instance variable of generic type gets default value of instance variable of generic type gets default value of instance variable of generic type gets default value of instance variable of generic type gets default value of instance variable of generic type gets default value of instance variable of generic type gets default value of instance variable of generic type gets default value of instance variable of generic type gets default value of instance variable of generic type + expands @type.name in virtual metaclass (1) expands @type.name in virtual metaclass (1) + determines if method exists (false) determines if method exists (false) + declares constant in macro (#838) declares constant in macro (#838) + executes with named arguments for positional arg (2) executes with named arguments for positional arg (2) + expands def macro with @type.instance_vars expands def macro with @type.instance_vars + expands def macro expands def macro + can refer to abstract (2) can refer to abstract (2) + expands inline macro if (true) expands inline macro if (true) + expands def macro with @type.name with virtual (2) expands def macro with @type.name with virtual (2) + expands @def in inline macro expands @def in inline macro + determines if overrides (true) determines if overrides (true) + expands @def in macro expands @def in macro + can access type variables of a tuple can access type variables of a tuple + expands macro with arguments expands macro with arguments + executes with named arguments for positional arg (3) executes with named arguments for positional arg (3) + replaces %s inside string inside interpolation (#2178) replaces %s inside string inside interpolation (#2178) replaces %s inside string inside interpolation (#2178) replaces %s inside string inside interpolation (#2178) replaces %s inside string inside interpolation (#2178) replaces %s inside string inside interpolation (#2178) replaces %s inside string inside interpolation (#2178) replaces %s inside string inside interpolation (#2178) replaces %s inside string inside interpolation (#2178) replaces %s inside string inside interpolation (#2178) + checks if macro expansion returns (#821) checks if macro expansion returns (#821) + initializes class var in macro initializes class var in macro + gets default value of instance variable gets default value of instance variable + can access type variables can access type variables + expands macro def with return (#1040) expands macro def with return (#1040) + gets methods gets methods + expands def macro with @type.instance_vars with virtual expands def macro with @type.instance_vars with virtual + stringifies type without virtual marker stringifies type without virtual marker + expands macro as class method and accesses @type expands macro as class method and accesses @type + surrounds {{yield}} with begin/end surrounds {{yield}} with begin/end + expands macro with escaped quotes (#895) expands macro with escaped quotes (#895) + expands def macro with @type.instance_vars with subclass expands def macro with @type.instance_vars with subclass + expands inline macro expands inline macro + uses indexed macro variable uses indexed macro variable + uses indexed macro variable with many keys uses indexed macro variable with many keys + correctly resolves constant inside block in macro def correctly resolves constant inside block in macro def + executes with named arguments for positional arg (1) executes with named arguments for positional arg (1) + forwards line number forwards line number + can refer to @type can refer to @type + can refer to union (1) can refer to union (1) + expands macro that invokes another macro expands macro that invokes another macro + responds correctly to has_constant? with @top_level responds correctly to has_constant? with @top_level + allows overriding macro definition when redefining base class allows overriding macro definition when redefining base class + allows macro with default arguments allows macro with default arguments + expands macro with default arg and splat (3) (#784) expands macro with default arg and splat (3) (#784) + expands macro defined in base class expands macro defined in base class + gets correct class name when there are classes in the middle gets correct class name when there are classes in the middle + says that enum has Flags annotation says that enum has Flags annotation + replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) + retains original yield expression (#2923) retains original yield expression (#2923) + correctly recomputes call (bug) correctly recomputes call (bug) + says that enum doesn't have Flags annotation says that enum doesn't have Flags annotation + codegens macro def with default arg (similar to #496) codegens macro def with default arg (similar to #496) + gets enum members with @type.constants gets enum members with @type.constants + can use macro inside array literal can use macro inside array literal can use macro inside array literal can use macro inside array literal can use macro inside array literal can use macro inside array literal can use macro inside array literal can use macro inside array literal can use macro inside array literal can use macro inside array literal + transforms hooks (bug) transforms hooks (bug) + can access free variables can access free variables + doesn't override local variable when using macro variable (2) doesn't override local variable when using macro variable (2) + keeps line number with a block keeps line number with a block + forwards dir location forwards dir location + finds macro in class finds macro in class + expands def macro with instance var and method call (bug) expands def macro with instance var and method call (bug) + expands @type.name in virtual metaclass (2) expands @type.name in virtual metaclass (2) + expands macro as class method expands macro as class method + copies base macro def to sub-subtype even after it was copied to a subtype (#448) copies base macro def to sub-subtype even after it was copied to a subtype (#448) + can use macro inside hash literal can use macro inside hash literal can use macro inside hash literal can use macro inside hash literal can use macro inside hash literal can use macro inside hash literal can use macro inside hash literal can use macro inside hash literal can use macro inside hash literal can use macro inside hash literal + receives &block receives &block + determines if overrides, through module (true) determines if overrides, through module (true) + doesn't override local variable when using macro variable doesn't override local variable when using macro variable + determines if method exists (true) determines if method exists (true) + types macro expansion bug (#1734) types macro expansion bug (#1734) + implicitly marks method as macro def when using @type implicitly marks method as macro def when using @type + expands macro that yields expands macro that yields + can access type variables that are not types can access type variables that are not types + devirtualizes @type devirtualizes @type + initializes instance var in macro initializes instance var in macro + finds macro from virtual type finds macro from virtual type + access to the program with @top_level access to the program with @top_level + determines if overrides (false) determines if overrides (false) + determines if variable has default value determines if variable has default value + expands inline macro if (false) expands inline macro if (false) + keeps heredoc contents with interpolation inside macro keeps heredoc contents with interpolation inside macro keeps heredoc contents with interpolation inside macro keeps heredoc contents with interpolation inside macro keeps heredoc contents with interpolation inside macro keeps heredoc contents with interpolation inside macro keeps heredoc contents with interpolation inside macro keeps heredoc contents with interpolation inside macro keeps heredoc contents with interpolation inside macro keeps heredoc contents with interpolation inside macro + can access type variables of a generic type can access type variables of a generic type + expands macro with default arg and splat (#784) expands macro with default arg and splat (#784) + expands Path with resolve method expands Path with resolve method + can refer to union (2) can refer to union (2) + codegens macro with comment (bug) (#1396) codegens macro with comment (bug) (#1396) + does block unpacking inside macro expression (#13707) does block unpacking inside macro expression (#13707) + expands def macro with var expands def macro with var + doesn't replace %q() (#2178) doesn't replace %q() (#2178) + executes all_subclasses executes all_subclasses +Semantic: did you mean + suggests a better alternative to logical operators (#2715) suggests a better alternative to logical operators (#2715) + says did you mean for instance var says did you mean for instance var + says did you mean finds most similar in type says did you mean finds most similar in type + says did you mean for global method without parenthesis says did you mean for global method without parenthesis + says did you mean for two mistakes in long word in instance method says did you mean for two mistakes in long word in instance method + says did you mean for one mistake in short word in instance method says did you mean for one mistake in short word in instance method + doesn't suggest when declaring var inside macro (#466) doesn't suggest when declaring var inside macro (#466) + suggests for class variable suggests for class variable + doesn't suggest for operator doesn't suggest for operator + suggest that there might be a typo for an initialize method with overload suggest that there might be a typo for an initialize method with overload + doesn't suggest when declaring var with suffix if and using it (#946) doesn't suggest when declaring var with suffix if and using it (#946) + says did you mean in instance var declaration says did you mean in instance var declaration + says did you mean for named argument says did you mean for named argument + suggest that there might be a typo for an initialize method suggest that there might be a typo for an initialize method + says did you mean for nested class says did you mean for nested class + says did you mean finds most similar in def says did you mean finds most similar in def + says did you mean for instance var in subclass says did you mean for instance var in subclass + says did you mean for global method with parenthesis says did you mean for global method with parenthesis + says did you mean for class says did you mean for class + suggest that there might be a typo for an initialize method in inherited class suggest that there might be a typo for an initialize method in inherited class + says did you mean for variable says did you mean for variable +Crystal::Repl::Interpreter + pointers + interprets pointerof and mutates memory (there are more variables) interprets pointerof and mutates memory (there are more variables) + discards pointer get discards pointer get + interprets pointer set and get (union type, setter value) interprets pointer set and get (union type, setter value) + interprets pointer set and get (clear stack) interprets pointer set and get (clear stack) + discards pointer set discards pointer set + interprets pointer new and pointer address interprets pointer new and pointer address + interprets pointer realloc interprets pointer realloc + discards pointer diff discards pointer diff + interprets nilable pointer truthiness interprets nilable pointer truthiness + discards pointer new discards pointer new + interprets pointer add interprets pointer add + pointerof read `StaticArray#@buffer` (1) pointerof read `StaticArray#@buffer` (1) + interprets pointer set and get (int) interprets pointer set and get (int) + discards pointer realloc discards pointer realloc + discards pointer malloc discards pointer malloc + pointerof read instance var pointerof read instance var + discards pointer add discards pointer add + discards pointerof discards pointerof + interprets pointerof, mutates pointer, read var interprets pointerof, mutates pointer, read var + interprets pointer diff interprets pointer diff + pointerof instance var pointerof instance var + interprets pointer set and get (union type) interprets pointer set and get (union type) + pointerof class var pointerof class var + pointerof read `StaticArray#@buffer` (2) pointerof read `StaticArray#@buffer` (2) + interprets pointerof, mutates var, read pointer interprets pointerof, mutates var, read pointer + interprets pointer set and get (bool) interprets pointer set and get (bool) + interprets pointer diff, negative interprets pointer diff, negative + interprets pointer realloc wrapper interprets pointer realloc wrapper Lexer: location - uses two consecutive loc pragma uses two consecutive loc pragma - pushes and pops its location pushes and pops its location assigns correct loc location to node assigns correct loc location to node - parses var/call right after loc (#491) parses var/call right after loc (#491) - locations in same files are comparable based on line locations in same files are comparable based on line - locations in different files have no order locations in different files have no order + uses two consecutive loc pragma uses two consecutive loc pragma + locations with virtual files should be comparable locations with virtual files should be comparable + overrides location with pragma overrides location with pragma stores column numbers stores column numbers + locations in same files are comparable based on line locations in same files are comparable based on line Location.parse - parses location from string parses location from string - raises ArgumentError if missing part raises ArgumentError if missing part - raises ArgumentError if column number is invalid raises ArgumentError if column number is invalid raises ArgumentError if line number is invalid raises ArgumentError if line number is invalid raises ArgumentError if missing colon raises ArgumentError if missing colon + raises ArgumentError if missing part raises ArgumentError if missing part + parses location from string parses location from string + raises ArgumentError if column number is invalid raises ArgumentError if column number is invalid stores line numbers stores line numbers - locations with virtual files should be comparable locations with virtual files should be comparable - overrides location with pragma overrides location with pragma -Codegen: is_a? - codegens is_a? with union gives false codegens is_a? with union gives false - does is_a? with more strict virtual type does is_a? with more strict virtual type - codegens is_a? casts union to nilable in method codegens is_a? casts union to nilable in method - doesn't skip assignment when used in combination with .is_a? (true case, else) (#1121) doesn't skip assignment when used in combination with .is_a? (true case, else) (#1121) - doesn't type merge (2) (#548) doesn't type merge (2) (#548) - evaluates method on filtered union type 2 evaluates method on filtered union type 2 - evaluate method on filtered type nilable type not-nil evaluate method on filtered type nilable type not-nil - codegens is_a? on right side of and codegens is_a? on right side of and - codegens untyped var (#4009) codegens untyped var (#4009) - restricts union with union restricts union with union - transforms else if condition is always falsey transforms else if condition is always falsey - does is_a?(generic type) for nested generic inheritance (2) does is_a?(generic type) for nested generic inheritance (2) - codegens is_a? from virtual type to module codegens is_a? from virtual type to module - evaluates method on filtered union type 3 evaluates method on filtered union type 3 evaluates method on filtered union type 3 evaluates method on filtered union type 3 evaluates method on filtered union type 3 evaluates method on filtered union type 3 evaluates method on filtered union type 3 evaluates method on filtered union type 3 evaluates method on filtered union type 3 evaluates method on filtered union type 3 - restricts metaclass against virtual metaclass type restricts metaclass against virtual metaclass type - codegens is_a? with union gives true codegens is_a? with union gives true - codegens is_a? with virtual and nil codegens is_a? with virtual and nil - does is_a? with generic class metaclass does is_a? with generic class metaclass - codegens is_a? with nilable gives false because other type 2 codegens is_a? with nilable gives false because other type 2 - does is_a?/responds_to? twice (#1451) does is_a?/responds_to? twice (#1451) - doesn't type merge (1) (#548) doesn't type merge (1) (#548) - restricts union metaclass to metaclass (#12295) restricts union metaclass to metaclass (#12295) - evaluates method on filtered union type evaluates method on filtered union type - doesn't error if result is discarded (#14113) doesn't error if result is discarded (#14113) - doesn't consider generic type to be a generic type of a recursive alias (#3524) doesn't consider generic type to be a generic type of a recursive alias (#3524) - says false for value.is_a?(Class) says false for value.is_a?(Class) - does is_a? with union type as Union(X, Y), don't resolve to virtual type (#10244) does is_a? with union type as Union(X, Y), don't resolve to virtual type (#10244) - virtual metaclass type is not virtual instance type (#12628) virtual metaclass type is not virtual instance type (#12628) - resets truthy state after visiting nodes (bug) resets truthy state after visiting nodes (bug) - does is_a? for generic type against generic class instance type (#12304) does is_a? for generic type against generic class instance type (#12304) does is_a? for generic type against generic class instance type (#12304) does is_a? for generic type against generic class instance type (#12304) does is_a? for generic type against generic class instance type (#12304) does is_a? for generic type against generic class instance type (#12304) does is_a? for generic type against generic class instance type (#12304) does is_a? for generic type against generic class instance type (#12304) does is_a? for generic type against generic class instance type (#12304) does is_a? for generic type against generic class instance type (#12304) - codegens is_a? false for simple type codegens is_a? false for simple type - codegens is_a? with union gives false codegens is_a? with union gives false - passes is_a? with generic module type on virtual type (#10302) passes is_a? with generic module type on virtual type (#10302) - does is_a? for union of module and type does is_a? for union of module and type - says true for Class.is_a?(Class.class) (#4374) says true for Class.is_a?(Class.class) (#4374) - doesn't skip assignment when used in combination with .is_a? (true case, then) (#1121) doesn't skip assignment when used in combination with .is_a? (true case, then) (#1121) - restricts simple type with union restricts simple type with union - codegens is_a? from nilable reference union type to type codegens is_a? from nilable reference union type to type - codegens is_a? with a Const does comparison and gives true codegens is_a? with a Const does comparison and gives true codegens is_a? with a Const does comparison and gives true codegens is_a? with a Const does comparison and gives true codegens is_a? with a Const does comparison and gives true codegens is_a? with a Const does comparison and gives true codegens is_a? with a Const does comparison and gives true codegens is_a? with a Const does comparison and gives true codegens is_a? with a Const does comparison and gives true codegens is_a? with a Const does comparison and gives true - codegens is_a? from nilable reference union type to nil codegens is_a? from nilable reference union type to nil - codegens is_a? true for simple type codegens is_a? true for simple type - visits 1.to_s twice, may trigger enclosing_call (#4364) visits 1.to_s twice, may trigger enclosing_call (#4364) visits 1.to_s twice, may trigger enclosing_call (#4364) visits 1.to_s twice, may trigger enclosing_call (#4364) visits 1.to_s twice, may trigger enclosing_call (#4364) visits 1.to_s twice, may trigger enclosing_call (#4364) visits 1.to_s twice, may trigger enclosing_call (#4364) visits 1.to_s twice, may trigger enclosing_call (#4364) visits 1.to_s twice, may trigger enclosing_call (#4364) visits 1.to_s twice, may trigger enclosing_call (#4364) - doesn't skip assignment when used in combination with .is_a? (false case) (#1121) doesn't skip assignment when used in combination with .is_a? (false case) (#1121) - does is_a? with union type, don't resolve to virtual type (#10244) does is_a? with union type, don't resolve to virtual type (#10244) - codegens is_a? with virtual codegens is_a? with virtual - works with inherited generic class against an instantiation works with inherited generic class against an instantiation - codegens is_a? with nilable gives false because other type 1 codegens is_a? with nilable gives false because other type 1 - codegens is_a? casts union to nilable codegens is_a? casts union to nilable - transforms then if condition is always truthy transforms then if condition is always truthy - codegens is_a? with a Const does comparison and gives false codegens is_a? with a Const does comparison and gives false codegens is_a? with a Const does comparison and gives false codegens is_a? with a Const does comparison and gives false codegens is_a? with a Const does comparison and gives false codegens is_a? with a Const does comparison and gives false codegens is_a? with a Const does comparison and gives false codegens is_a? with a Const does comparison and gives false codegens is_a? with a Const does comparison and gives false codegens is_a? with a Const does comparison and gives false - does is_a? for virtual generic instance type against generic does is_a? for virtual generic instance type against generic - restricts type in else but lazily restricts type in else but lazily - codegens is_a? with union gives true codegens is_a? with union gives true - evaluate method on filtered type evaluate method on filtered type - says true for Class.is_a?(Class.class.class) (#4374) says true for Class.is_a?(Class.class.class) (#4374) - does is_a?(generic type) for nested generic inheritance (1) (#9660) does is_a?(generic type) for nested generic inheritance (1) (#9660) - codegens when is_a? is always false but properties are used codegens when is_a? is always false but properties are used codegens when is_a? is always false but properties are used codegens when is_a? is always false but properties are used codegens when is_a? is always false but properties are used codegens when is_a? is always false but properties are used codegens when is_a? is always false but properties are used codegens when is_a? is always false but properties are used codegens when is_a? is always false but properties are used codegens when is_a? is always false but properties are used - says false for GenericChild(Base).is_a?(GenericBase(Child)) (#1294) says false for GenericChild(Base).is_a?(GenericBase(Child)) (#1294) - works with inherited generic class against an instantiation (3) works with inherited generic class against an instantiation (3) - gives false if generic type doesn't match exactly gives false if generic type doesn't match exactly - restricts virtual metaclass against virtual metaclass type restricts virtual metaclass against virtual metaclass type - codegens is_a? with nilable gives true codegens is_a? with nilable gives true - codegens is_a? with virtual and module codegens is_a? with virtual and module - doesn't skip assignment when used in combination with .is_a? and && (#1121) doesn't skip assignment when used in combination with .is_a? and && (#1121) - does is_a?(generic type) for nested generic inheritance, through upcast (1) does is_a?(generic type) for nested generic inheritance, through upcast (1) - does is_a? with && and true condition does is_a? with && and true condition - codegens is_a? with nilable gives false because no type codegens is_a? with nilable gives false because no type - evaluate method on filtered type nilable type nil evaluate method on filtered type nilable type nil - doesn't work with inherited generic class against an instantiation (2) doesn't work with inherited generic class against an instantiation (2) - does is_a?(generic type) for nested generic inheritance, through upcast (2) does is_a?(generic type) for nested generic inheritance, through upcast (2) - codegens is_a? with nilable gives false because no type codegens is_a? with nilable gives false because no type -Crystal::Playground::Session - assert assert -Semantic: previous_def - types previous def types previous def - errors if there's no previous def errors if there's no previous def - types previous def with explicit arguments types previous def with explicit arguments - types previous def with restrictions types previous def with restrictions - types previous def with forwarded arguments, different internal names (#8895) types previous def with forwarded arguments, different internal names (#8895) - types previous def with forwarded arguments, def has parameters types previous def with forwarded arguments, def has parameters - types previous def when inside fun and forwards args types previous def when inside fun and forwards args - types previous def with named arguments, def has bare splat parameter (2) (#8895) types previous def with named arguments, def has bare splat parameter (2) (#8895) - types previous def in generic class types previous def in generic class - types previous def with named arguments, def has bare splat parameter (#8895) types previous def with named arguments, def has bare splat parameter (#8895) - types previous def with forwarded arguments, def has bare splat parameter (#8895) types previous def with forwarded arguments, def has bare splat parameter (#8895) - types previous def with named arguments, def has double splat parameter (#8895) types previous def with named arguments, def has double splat parameter (#8895) - says wrong number of arguments for previous_def (#1223) says wrong number of arguments for previous_def (#1223) - types previous def when inside fun types previous def when inside fun -Code gen: void - codegens void assignment in case codegens void assignment in case codegens void assignment in case codegens void assignment in case codegens void assignment in case codegens void assignment in case codegens void assignment in case codegens void assignment in case codegens void assignment in case codegens void assignment in case - codegens void assignment codegens void assignment - codegens no return assignment codegens no return assignment - allows passing void as argument to method allows passing void as argument to method - codegens void assignment in case with local variable codegens void assignment in case with local variable codegens void assignment in case with local variable codegens void assignment in case with local variable codegens void assignment in case with local variable codegens void assignment in case with local variable codegens void assignment in case with local variable codegens void assignment in case with local variable codegens void assignment in case with local variable codegens void assignment in case with local variable - returns void from nil functions, doesn't crash when passing value returns void from nil functions, doesn't crash when passing value - codegens unreachable code codegens unreachable code + pushes and pops its location pushes and pops its location + locations in different files have no order locations in different files have no order + parses var/call right after loc (#491) parses var/call right after loc (#491) +Normalize: return next break + removes nodes after return removes nodes after return + removes nodes after if that returns in both branches removes nodes after if that returns in both branches + doesn't remove nodes after if that returns in one branch doesn't remove nodes after if that returns in one branch + doesn't remove after return when there's an unless doesn't remove after return when there's an unless + removes nodes after break removes nodes after break + removes nodes after next removes nodes after next +Semantic: new + evaluates initialize default value at the instance scope (6) (#731) evaluates initialize default value at the instance scope (6) (#731) + evaluates initialize default value at the instance scope (3) (#731) evaluates initialize default value at the instance scope (3) (#731) + doesn't have default new for inherited class from generic type doesn't have default new for inherited class from generic type + uses correct receiver for `initialize` in namespaced generic classes (#4086) uses correct receiver for `initialize` in namespaced generic classes (#4086) + doesn't incorrectly redefines new for generic class doesn't incorrectly redefines new for generic class + evaluates initialize default value at the instance scope (5) (#731) evaluates initialize default value at the instance scope (5) (#731) + evaluates initialize default value at the instance scope (2) (#731) evaluates initialize default value at the instance scope (2) (#731) + evaluates initialize default value at the instance scope (1) (#731) evaluates initialize default value at the instance scope (1) (#731) + evaluates initialize default value at the instance scope (4) (#731) evaluates initialize default value at the instance scope (4) (#731) + errors if using self call in default argument (3) errors if using self call in default argument (3) + errors if using self call in default argument (1) errors if using self call in default argument (1) + inherits initialize and new methods if doesn't define new (#3238) inherits initialize and new methods if doesn't define new (#3238) + errors if using self call in default argument (2) errors if using self call in default argument (2) +types to_s of + nilable value type nilable value type + nilable type with more than two elements, Nil at the end nilable type with more than two elements, Nil at the end + does for type contained in generic module does for type contained in generic module + union of simple types union of simple types + union types + should not have extra parens + in arrays in arrays + in pointers in pointers + in tuples in tuples + should have parens + as return type as return type + as arg type as arg type + named tuple named tuple + array of simple types array of simple types + non-instantiated array non-instantiated array + nilable reference type nilable reference type + does for type contained in generic class does for type contained in generic class +Semantic: tuples + errors if non-tuple is splatted inside tuple errors if non-tuple is splatted inside tuple + #[](RangeLiteral) + types, inbound begin, nilable types, inbound begin, nilable + types, begin-less, end-less types, begin-less, end-less + types, metaclass index types, metaclass index + gives error when begin index is out of range gives error when begin index is out of range + types, exclusive range types, exclusive range + types, inbound begin types, inbound begin + types, inbound begin, end-less types, inbound begin, end-less + types, begin-less types, begin-less + types, out of bound begin, nilable types, out of bound begin, nilable + accept tuple in type restriction accept tuple in type restriction + doesn't crash on tuple in not executed block (#6718) doesn't crash on tuple in not executed block (#6718) + errors on tuple too big (#3816) errors on tuple too big (#3816) + errors if non-tuple is splatted inside tuple (2) errors if non-tuple is splatted inside tuple (2) + matches tuple with splat (2) (#2932) matches tuple with splat (2) (#2932) + types T as a tuple of metaclasses types T as a tuple of metaclasses + #[](Path) + works for named tuple indexer works for named tuple indexer + works for tuple indexer works for tuple indexer + gives error when using named args on Tuple gives error when using named args on Tuple + can name a tuple type can name a tuple type + types tuple of one element and then two elements types tuple of one element and then two elements + types tuple of three elements types tuple of three elements + matches tuple with splat (#2932) matches tuple with splat (#2932) + types tuple with splats inside types tuple with splats inside + types tuple of one element types tuple of one element + errors on recursive splat expansion (1) (#361) errors on recursive splat expansion (1) (#361) + errors on named tuple too big errors on named tuple too big + errors on recursive splat expansion (#218) errors on recursive splat expansion (#218) + can iterate T can iterate T + can call [] on T can call [] on T + accepts tuple covariance in array accepts tuple covariance in array + doesn't error if Tuple has no args doesn't error if Tuple has no args + merges two tuple types of same size merges two tuple types of same size + doesn't unify tuple metaclasses (#5384) doesn't unify tuple metaclasses (#5384) + doesn't trigger recursive splat expansion error (#7164) doesn't trigger recursive splat expansion error (#7164) + errors if using two splat indices on restriction errors if using two splat indices on restriction + allows tuple covariance allows tuple covariance + #[](NumberLiteral) + gives error when indexing out of range gives error when indexing out of range + types, out of bound, nilable types, out of bound, nilable + types, metaclass index types, metaclass index + gives error when indexing out of range on empty tuple gives error when indexing out of range on empty tuple + types, inbound index, nilable types, inbound index, nilable + types, inbound index types, inbound index + errors on recursive splat expansion (2) (#361) errors on recursive splat expansion (2) (#361) +Crystal::Repl::Interpreter + typeof + interprets typeof virtual type interprets typeof virtual type + interprets typeof metaclass type interprets typeof metaclass type + interprets typeof instance type interprets typeof instance type Code gen: virtual type - call overwritten method call overwritten method - casts virtual type to union casts virtual type to union - dispatch call with virtual type argument dispatch call with virtual type argument - initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated - codegens allocate for virtual type with custom new codegens allocate for virtual type with custom new - codegens new for simple type, then for virtual codegens new for simple type, then for virtual + dispatches on virtual metaclass (3) dispatches on virtual metaclass (3) + dispatches on virtual metaclass (2) dispatches on virtual metaclass (2) + assign instance variable in virtual type assign instance variable in virtual type call base overwritten method call base overwritten method - calls class method 3 calls class method 3 + casts union to virtual casts union to virtual + codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type + doesn't lookup in Value+ when virtual type is Object+ doesn't lookup in Value+ when virtual type is Object+ + codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type + codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens virtual method of abstract metaclass codegens virtual method of abstract metaclass - dispatch call with nilable virtual arg dispatch call with nilable virtual arg - lookup instance variables in parent types lookup instance variables in parent types - casts virtual type to base virtual type casts virtual type to base virtual type - calls class method 2 calls class method 2 - dispatches on virtual metaclass (1) dispatches on virtual metaclass (1) + dispatch call with virtual type argument dispatch call with virtual type argument + codegens new for simple type, then for virtual codegens new for simple type, then for virtual codegens virtual call with explicit self and nilable type codegens virtual call with explicit self and nilable type - codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types - call base method call base method - dispatches on virtual metaclass (2) dispatches on virtual metaclass (2) - codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type - doesn't lookup in Value+ when virtual type is Object+ doesn't lookup in Value+ when virtual type is Object+ - calls class method 1 calls class method 1 - assign instance variable in virtual type assign instance variable in virtual type + correctly dispatch call with block when the obj is a virtual type correctly dispatch call with block when the obj is a virtual type + returns type with virtual type def type returns type with virtual type def type + casts metaclass union type to virtual metaclass type (#6298) casts metaclass union type to virtual metaclass type (#6298) codegens virtual call with explicit self codegens virtual call with explicit self + calls class method 2 calls class method 2 + calls class method 1 calls class method 1 codegens new twice for virtual codegens new twice for virtual - casts union to virtual casts union to virtual - casts metaclass union type to virtual metaclass type (#6298) casts metaclass union type to virtual metaclass type (#6298) - can belong to union can belong to union - codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type - dispatches on virtual metaclass (3) dispatches on virtual metaclass (3) - codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type + lookup instance variables in parent types lookup instance variables in parent types + dispatch call with nilable virtual arg dispatch call with nilable virtual arg + dispatches on virtual metaclass (1) dispatches on virtual metaclass (1) codegens non-virtual call that calls virtual call to another virtual call codegens non-virtual call that calls virtual call to another virtual call - correctly dispatch call with block when the obj is a virtual type correctly dispatch call with block when the obj is a virtual type - returns type with virtual type def type returns type with virtual type def type - codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) -Semantic: external/internal - can call positionally can call positionally - overloads based on external name (#2610) overloads based on external name (#2610) - can call with external name and use with internal can call with external name and use with internal - macros - can call with external name and use with internal can call with external name and use with internal - can call with external name and use with internal, after splat can call with external name and use with internal, after splat - can call positionally can call positionally - can call with external name and use with internal, after splat can call with external name and use with internal, after splat -Codegen: class var - codegens class var with begin and vars codegens class var with begin and vars - initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal - gets pointerof class var gets pointerof class var - declares var as uninitialized and initializes it unsafely declares var as uninitialized and initializes it unsafely - codegens class var as nil codegens class var as nil - declares and initializes declares and initializes - initializes class var of union with single type initializes class var of union with single type - inline initialization of simple class var inline initialization of simple class var - doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module - initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var - catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer - codegens class var codegens class var - codegens class var inside module codegens class var inside module - initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it - reads simple class var before another complex one reads simple class var before another complex one - runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) - doesn't inherit class var value in subclass doesn't inherit class var value in subclass - codegens second class var initializer codegens second class var initializer - codegens generic class with class var codegens generic class with class var - uses var in class var initializer uses var in class var initializer - doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) - doesn't use nilable type for initializer doesn't use nilable type for initializer - gets pointerof class var complex constant gets pointerof class var complex constant - reads class var from virtual type reads class var from virtual type - codegens class var as nil if assigned for the first time inside method codegens class var as nil if assigned for the first time inside method - reads class var from virtual type metaclass reads class var from virtual type metaclass - writes class var from virtual type writes class var from virtual type - codegens class var inside instance method codegens class var inside instance method - codegens class var with nilable reference type codegens class var with nilable reference type - codegens class var with type declaration begin and vars codegens class var with type declaration begin and vars - accesses class var from proc literal accesses class var from proc literal - reads class var before initializing it (hoisting) reads class var before initializing it (hoisting) - doesn't inherit class var value in module doesn't inherit class var value in module -Semantic: special vars - infers $? infers $? - types $~ when not defined as no return types $~ when not defined as no return - errors if assigning $~ at top level errors if assigning $~ at top level - infers when assigning inside block infers when assigning inside block - infers in block infers in block - types $? when not defined as no return (2) types $? when not defined as no return (2) - infers in block with nested block infers in block with nested block - types $~ when not defined as no return (2) types $~ when not defined as no return (2) - infers $~ infers $~ - types $? when not defined as no return types $? when not defined as no return - errors if assigning $? at top level errors if assigning $? at top level - infers after block infers after block + initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated + codegens allocate for virtual type with custom new codegens allocate for virtual type with custom new + codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) + call overwritten method call overwritten method + calls class method 3 calls class method 3 + call base method call base method + codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types + casts virtual type to union casts virtual type to union + can belong to union can belong to union + casts virtual type to base virtual type casts virtual type to base virtual type +Lexer macro + lexes macro with semicolon before end lexes macro with semicolon before end + lexes macro with nested abstract def lexes macro with nested abstract def + lexes macro with curly escape in comment lexes macro with curly escape in comment + lexes macro with slash not followed by curly lexes macro with slash not followed by curly + lexes macro with nested lib lexes macro with nested lib + keeps correct column and line numbers keeps correct column and line numbers + skips whitespace skips whitespace + lexes macro var lexes macro var + lexes macro with expression lexes macro with expression + lexes macro with embedded char and sharp lexes macro with embedded char and sharp + lexes macro with nested select lexes macro with nested select + lexes macro with embedded string with %< lexes macro with embedded string with %< + lexes macro with embedded string and expression lexes macro with embedded string and expression + lexes macro without nested if lexes macro without nested if + lexes macro with comments lexes macro with comments + lexes macro with if after assign lexes macro with if after assign + lexes macro with nested case lexes macro with nested case + lexes escaped quote inside string (#895) lexes escaped quote inside string (#895) + lexes macro with nested struct lexes macro with nested struct + lexes macro with nested do lexes macro with nested do + lexes macro with embedded string and backslash lexes macro with embedded string and backslash + lexes macro with embedded string with %( lexes macro with embedded string with %( + lexes macro with nested embedded string with %( lexes macro with nested embedded string with %( + lexes macro with nested if lexes macro with nested if + lexes macro with nested while lexes macro with nested while + lexes simple macro lexes simple macro + doesn't lex macro var if escaped doesn't lex macro var if escaped + lexes macro with nested macro lexes macro with nested macro + lexes macro with nested union lexes macro with nested union + lexes macro with if as suffix after return lexes macro with if as suffix after return + lexes macro with embedded string with %( ignores begin lexes macro with embedded string with %( ignores begin + lexes macro with curly escape lexes macro with curly escape + lexes macro with nested fun lexes macro with nested fun + lexes macro with embedded string with %< ignores begin lexes macro with embedded string with %< ignores begin + lexes macro with nested enum lexes macro with nested enum + lexes macro with string interpolation and double curly brace lexes macro with string interpolation and double curly brace + lexes macro with embedded string lexes macro with embedded string + lexes bug #654 lexes bug #654 + lexes macro with nested def lexes macro with nested def + lexes macro with nested begin lexes macro with nested begin + lexes macro with comments and expressions lexes macro with comments and expressions + lexes macro with nested until lexes macro with nested until + lexes with for inside escaped macro (#1029) lexes with for inside escaped macro (#1029) + lexes macro with nested annotation lexes macro with nested annotation + lexes macro with nested class lexes macro with nested class + lexes macro with nested abstract class lexes macro with nested abstract class + lexes macro with nested unless lexes macro with nested unless + lexes begin end lexes begin end + reaches end reaches end + lexes with if/end inside escaped macro (#1029) lexes with if/end inside escaped macro (#1029) + lexes macro with control lexes macro with control + lexes macro with nested module lexes macro with nested module + keeps correct line number after lexes the part of keyword and newline (#4656) keeps correct line number after lexes the part of keyword and newline (#4656) + lexes macro with embedded string with %[ lexes macro with embedded string with %[ + lexes macro with nested abstract struct lexes macro with nested abstract struct + lexes with unless inside escaped macro (#5664) lexes with unless inside escaped macro (#5664) + lexes macro with if as suffix lexes macro with if as suffix + lexes macro with embedded string with %[ ignores begin lexes macro with embedded string with %[ ignores begin +Codegen: extern struct + codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret + sets callback on extern struct sets callback on extern struct sets callback on extern struct sets callback on extern struct sets callback on extern struct sets callback on extern struct sets callback on extern struct sets callback on extern struct sets callback on extern struct sets callback on extern struct + declares extern union, sets and gets instance var declares extern union, sets and gets instance var + declares extern struct with no constructor declares extern struct with no constructor + declares extern struct, sets and gets instance var declares extern struct, sets and gets instance var + invokes proc with extern struct with sret invokes proc with extern struct with sret + codegens proc that takes an extern struct with C ABI codegens proc that takes an extern struct with C ABI codegens proc that takes an extern struct with C ABI codegens proc that takes an extern struct with C ABI codegens proc that takes an extern struct with C ABI codegens proc that takes an extern struct with C ABI codegens proc that takes an extern struct with C ABI codegens proc that takes an extern struct with C ABI codegens proc that takes an extern struct with C ABI codegens proc that takes an extern struct with C ABI + codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI + codegens extern proc call twice (#4982) codegens extern proc call twice (#4982) + codegens proc that takes and returns large extern struct by value codegens proc that takes and returns large extern struct by value + codegens proc that takes an extern struct with C ABI (2) codegens proc that takes an extern struct with C ABI (2) codegens proc that takes an extern struct with C ABI (2) codegens proc that takes an extern struct with C ABI (2) codegens proc that takes an extern struct with C ABI (2) codegens proc that takes an extern struct with C ABI (2) codegens proc that takes an extern struct with C ABI (2) codegens proc that takes an extern struct with C ABI (2) codegens proc that takes an extern struct with C ABI (2) codegens proc that takes an extern struct with C ABI (2) + sets callback on extern union sets callback on extern union sets callback on extern union sets callback on extern union sets callback on extern union sets callback on extern union sets callback on extern union sets callback on extern union sets callback on extern union sets callback on extern union + declares extern union with no constructor declares extern union with no constructor + invokes proc with extern struct invokes proc with extern struct + codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI + codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil + declares extern struct with no constructor, assigns var declares extern struct with no constructor, assigns var + doesn't crash with proc with extern struct that's a closure doesn't crash with proc with extern struct that's a closure +Semantic: generic class + errors if invoking new on private new in generic type (#3485) errors if invoking new on private new in generic type (#3485) + errors if inheriting from generic when it is non-generic errors if inheriting from generic when it is non-generic + splats generic type var splats generic type var + doesn't crash when matching restriction against number literal (2) (#3157) doesn't crash when matching restriction against number literal (2) (#3157) + inherits from generic with forwarding (1) inherits from generic with forwarding (1) + inherits class methods from generic class inherits class methods from generic class + can use virtual type for generic class can use virtual type for generic class + errors if using Value in a generic type errors if using Value in a generic type + errors if using Number in a generic type errors if using Number in a generic type + subclasses twice with same generic class (#3423) subclasses twice with same generic class (#3423) + errors if using Float in a generic type errors if using Float in a generic type + restricts non-generic to generic restricts non-generic to generic + errors if splatting a non-tuple (#9853) errors if splatting a non-tuple (#9853) + inherits non-generic to generic (1) inherits non-generic to generic (1) + errors if using Proc in a generic type errors if using Proc in a generic type + allows T::Type with T a generic type allows T::Type with T a generic type + gives helpful error message when generic type var is missing (#1526) gives helpful error message when generic type var is missing (#1526) + errors if using Tuple in a generic type errors if using Tuple in a generic type + errors if passing integer literal to Proc as generic argument (#1120) errors if passing integer literal to Proc as generic argument (#1120) + never types Path as virtual outside generic type parameter (#3989) never types Path as virtual outside generic type parameter (#3989) + disallow using a non-instantiated generic type as a generic type argument disallow using a non-instantiated generic type as a generic type argument + errors if using Class in a generic type errors if using Class in a generic type + unifies generic metaclass types unifies generic metaclass types + can use type var that resolves to number in restriction (#6502) can use type var that resolves to number in restriction (#6502) + doesn't find T type parameter of current type in superclass (#4604) doesn't find T type parameter of current type in superclass (#4604) + replaces type parameters in virtual metaclasses (#10691) replaces type parameters in virtual metaclasses (#10691) + can define instance var forward declared (#962) can define instance var forward declared (#962) + replaces type parameters for virtual types (#3235) replaces type parameters for virtual types (#3235) + errors if using Number in alias errors if using Number in alias + finds generic type argument from method with default value finds generic type argument from method with default value + errors if using Enum in a generic type errors if using Enum in a generic type + initializes instance variable of generic type using type var (#961) initializes instance variable of generic type using type var (#961) + inherits non-generic to generic (2) inherits non-generic to generic (2) + errors if using Reference in a generic type errors if using Reference in a generic type + creates pointer of generic type and uses it creates pointer of generic type and uses it + doesn't crash when matching restriction against number literal (#3157) doesn't crash when matching restriction against number literal (#3157) + allows initializing instance variable (#665) allows initializing instance variable (#665) + restricts virtual generic instance type against generic (#3351) restricts virtual generic instance type against generic (#3351) + inherits instance var type annotation from generic to concrete inherits instance var type annotation from generic to concrete + doesn't allow union of generic class with module to be assigned to a generic class with module (#2425) doesn't allow union of generic class with module to be assigned to a generic class with module (#2425) + instantiates generic variadic class, accesses T from instance method through superclass, more args instantiates generic variadic class, accesses T from instance method through superclass, more args + inherits from generic with forwarding (2) inherits from generic with forwarding (2) + instantiates generic class with default argument in initialize (#394) instantiates generic class with default argument in initialize (#394) + instantiates generic variadic class, accesses T from class method through superclass instantiates generic variadic class, accesses T from class method through superclass + errors if passing integer literal to Tuple as generic argument (#1120) errors if passing integer literal to Tuple as generic argument (#1120) + virtual metaclass type implements super virtual metaclass type (#3007) virtual metaclass type implements super virtual metaclass type (#3007) + doesn't consider unbound generic instantiations as concrete (#7200) doesn't consider unbound generic instantiations as concrete (#7200) + error on T::Type with T a generic type that's a union error on T::Type with T a generic type that's a union + disallow using a non-instantiated module type as a generic type argument disallow using a non-instantiated module type as a generic type argument + inherits instance var type annotation from generic to generic to concrete inherits instance var type annotation from generic to generic to concrete + instantiates generic variadic class, accesses T from instance method through superclass instantiates generic variadic class, accesses T from instance method through superclass + creates pointer of generic type and uses it (2) creates pointer of generic type and uses it (2) + instantiates generic variadic class, accesses T from instance method instantiates generic variadic class, accesses T from instance method + instantiates generic variadic class, accesses T from class method instantiates generic variadic class, accesses T from class method + errors if using Object in a generic type errors if using Object in a generic type + calls super on generic type when superclass has no initialize (#933) calls super on generic type when superclass has no initialize (#933) + restricts non-generic to generic with free var restricts non-generic to generic with free var + errors if using Number | String in a generic type errors if using Number | String in a generic type + errors if using Struct in a generic type errors if using Struct in a generic type + errors if using Pointer in a generic type errors if using Pointer in a generic type + recomputes on new subclass recomputes on new subclass + doesn't duplicate overload on generic class with class method (#2385) doesn't duplicate overload on generic class with class method (#2385) + errors if using StaticArray in a generic type errors if using StaticArray in a generic type + instantiates generic variadic class, accesses T from instance method, more args instantiates generic variadic class, accesses T from instance method, more args + restricts generic to generic with free var restricts generic to generic with free var + errors if passing integer literal to Union as generic argument errors if passing integer literal to Union as generic argument + allows initializing instance variable in inherited generic type allows initializing instance variable in inherited generic type + doesn't compute generic instance var initializers in formal superclass's context (#4753) doesn't compute generic instance var initializers in formal superclass's context (#4753) + restricts generic type argument through alias in a non-strict way restricts generic type argument through alias in a non-strict way + shows error due to generic instantiation (#7083) shows error due to generic instantiation (#7083) + doesn't find unbound type parameter in main code inside generic type (#6168) doesn't find unbound type parameter in main code inside generic type (#6168) + errors if inheriting from generic and incorrect number of type vars errors if inheriting from generic and incorrect number of type vars + errors if inheriting generic type and not specifying type vars (#460) errors if inheriting generic type and not specifying type vars (#460) + errors on too nested tuple instance errors on too nested tuple instance + errors if using Number in recursive alias errors if using Number in recursive alias + types macro def with generic instance types macro def with generic instance + inherits twice inherits twice + inherits from generic with instantiation with instance var inherits from generic with instantiation with instance var + resolves T through metaclass inheritance (#7914) resolves T through metaclass inheritance (#7914) + instantiates generic variadic class, accesses T from instance method, more args (2) instantiates generic variadic class, accesses T from instance method, more args (2) + nests generics with the same type var (#3297) nests generics with the same type var (#3297) + errors if using Int in a generic type errors if using Int in a generic type + can use type var that resolves to number in restriction using Int128 can use type var that resolves to number in restriction using Int128 + errors on too nested generic instance, with union type errors on too nested generic instance, with union type + never types Generic as virtual outside generic type parameter (#3989) never types Generic as virtual outside generic type parameter (#3989) + inherits instance var type annotation from generic to concrete with T inherits instance var type annotation from generic to concrete with T + errors on too nested generic instance errors on too nested generic instance + gives helpful error message when generic type var is missing in block spec (#1526) gives helpful error message when generic type var is missing in block spec (#1526) + defines empty initialize on inherited generic class defines empty initialize on inherited generic class + correctly checks argument count when target type has a splat (#9855) correctly checks argument count when target type has a splat (#9855) + inherits from generic with instantiation inherits from generic with instantiation +Crystal::Doc::ProjectInfo + .read_shard_properties + without name and version properties without name and version properties + strip whitespace strip whitespace + name and version name and version + empty properties empty properties + only name only name + no shard.yml no shard.yml + strip quotes strip quotes + ignores comments ignores comments + duplicate properties uses first one duplicate properties uses first one + indented properties indented properties + #fill_with_defaults + empty folder empty folder + no shard.yml, but git tagged version no shard.yml, but git tagged version + with shard.yml + git untracked file doesn't prevent detection git untracked file doesn't prevent detection + git tagged version dirty git tagged version dirty + git non-tagged commit git non-tagged commit + git tagged version git tagged version + not in a git folder not in a git folder + git non-tagged commit dirty git non-tagged commit dirty + git with remote git with remote + git but no commit git but no commit + git missing git missing + #source_url + fails if refname is missing fails if refname is missing + fails if pattern is missing fails if pattern is missing + returns nil for empty pattern returns nil for empty pattern + fails if pattern is missing fails if pattern is missing + builds url builds url + builds url builds url + .find_git_version .find_git_version + .find_source_url_pattern .find_source_url_pattern + .git_remote + simple origin simple origin + no origin remote no origin remote + origin plus other origin plus other + no remote no remote + no git workdir no git workdir +Code gen: array literal spec + creates custom non-generic array creates custom non-generic array + assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works + assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works + creates custom generic array, with splats creates custom generic array, with splats + creates typed array creates typed array creates typed array creates typed array creates typed array creates typed array creates typed array creates typed array creates typed array creates typed array + creates custom generic array with type var creates custom generic array with type var + creates custom generic array via alias (2) creates custom generic array via alias (2) + creates custom generic array in module (#5684) creates custom generic array in module (#5684) + creates custom generic array creates custom generic array + creates custom generic array via alias creates custom generic array via alias + creates custom non-generic array in module creates custom non-generic array in module + creates custom non-generic array in nested module creates custom non-generic array in nested module + creates custom non-generic array, with splats creates custom non-generic array, with splats +Codegen: while + doesn't crash on #2767 (3) doesn't crash on #2767 (3) + endless break with value endless break with value + codegens def with while codegens def with while + doesn't crash on a = NoReturn doesn't crash on a = NoReturn + codegens while with false codegens while with false + break with value, condition fails break with value, condition fails + doesn't crash on #2767 (2) doesn't crash on #2767 (2) + codegens endless while codegens endless while + codegens while with declared var 2 codegens while with declared var 2 + break with value break with value + endless conditional break with value endless conditional break with value + break without value break without value + skip block with next skip block with next + codegens while with declared var 1 codegens while with declared var 1 + doesn't crash on #2767 doesn't crash on #2767 + doesn't crash on while true begin break rescue (#7786) doesn't crash on while true begin break rescue (#7786) + conditional break without value conditional break without value + codegens while with non-false condition codegens while with non-false condition + codegens while with declared var 3 codegens while with declared var 3 + conditional break with value conditional break with value + doesn't crash on #2767 (4) doesn't crash on #2767 (4) +error reporting + reports wrong number of arguments, with optional parameters reports wrong number of arguments, with optional parameters + reports wrong number of arguments reports wrong number of arguments + reports unexpected named argument (2) reports unexpected named argument (2) + uses correct name for top-level macro methods uses correct name for top-level macro methods + reports missing block reports missing block + reports unexpected block reports unexpected block + reports unexpected named argument reports unexpected named argument +Semantic: macro + errors if using macro that is defined later errors if using macro that is defined later + errors if macro def type doesn't match found errors if macro def type doesn't match found + solves named macro expression arguments before macro expansion (type) (#2423) solves named macro expression arguments before macro expansion (type) (#2423) + gets named arguments in double splat gets named arguments in double splat + looks up argument types in macro owner, not in subclass (#2395) looks up argument types in macro owner, not in subclass (#2395) + errors if find macros but wrong arguments errors if find macros but wrong arguments + gives correct error when method is invoked but macro exists at the same scope gives correct error when method is invoked but macro exists at the same scope + expands macro with block expands macro with block + can use macro in instance var initializer (#7666) can use macro in instance var initializer (#7666) + show macro trace in errors (1) show macro trace in errors (1) + errors if macro uses undefined variable errors if macro uses undefined variable + solves macro expression arguments before macro expansion (type) solves macro expression arguments before macro expansion (type) + declares multi-assign vars for macro declares multi-assign vars for macro + finds generic in macro code finds generic in macro code + errors if declares macro inside if errors if declares macro inside if + can access variable inside macro expansion (#2057) can access variable inside macro expansion (#2057) + finds macro in inherited generic class finds macro in inherited generic class + uses bare * uses bare * + can define constant via macro included can define constant via macro included + executes OpAssign (#9356) executes OpAssign (#9356) + finds macro and method at the same scope inside included module finds macro and method at the same scope inside included module + expands macro with break inside while (#1852) expands macro with break inside while (#1852) + finds macro in included generic module finds macro in included generic module + expands multiline macro expression in verbatim (#6643) expands multiline macro expression in verbatim (#6643) + errors if requires inside if through macro expansion errors if requires inside if through macro expansion + doesn't include parameters with default values in missing arguments error doesn't include parameters with default values in missing arguments error + types macro def types macro def + allows generic return types for macro def allows generic return types for macro def + types macro def that calls another method inside a class types macro def that calls another method inside a class + finds generic type argument of included module finds generic type argument of included module + expands macro with block and argument to yield expands macro with block and argument to yield + allows return values that include the return type of the macro def allows return values that include the return type of the macro def + declares variable for macro with out declares variable for macro with out + finds macro through alias (#2706) finds macro through alias (#2706) + allows specifying self as macro def return type (2) allows specifying self as macro def return type (2) + uses bare *, doesn't let more args uses bare *, doesn't let more args + uses uninitialized variable with macros uses uninitialized variable with macros + uses bare *, doesn't let more args uses bare *, doesn't let more args + unpacks block parameters inside macros (#13742) unpacks block parameters inside macros (#13742) + allows named args after splat allows named args after splat + says missing argument because positional args don't match past splat says missing argument because positional args don't match past splat + finds metaclass instance of instance method (#4639) finds metaclass instance of instance method (#4639) + raise + inside method + without node + renders both frames (#7147) renders both frames (#7147) + inside macro + with node + points to caller when missing node location information (#7147) points to caller when missing node location information (#7147) + pointing at the correct node in complex/nested macro (#7147) pointing at the correct node in complex/nested macro (#7147) + renders both frames (#7147) renders both frames (#7147) + contains the message and not `expanding macro` (#5669) contains the message and not `expanding macro` (#5669) + without node + supports an empty message (#8631) supports an empty message (#8631) + renders both frames (#7147) renders both frames (#7147) + does not contain `expanding macro` does not contain `expanding macro` + finds free type vars finds free type vars + double splat and regular args double splat and regular args + allows declaring class with inline macro expression (#1333) allows declaring class with inline macro expression (#1333) + can't define new variables (#466) can't define new variables (#466) + gives precise location info when doing yield inside macro gives precise location info when doing yield inside macro + allows declaring class with macro if allows declaring class with macro if + allows union return types for macro def allows union return types for macro def + solves named macro expression arguments before macro expansion (constant) (#2423) solves named macro expression arguments before macro expansion (constant) (#2423) + types macro def that calls another method types macro def that calls another method + evaluates yield expression (#2924) evaluates yield expression (#2924) + can use macro in instance var initializer (just assignment) (#7666) can use macro in instance var initializer (just assignment) (#7666) + can return class type in macro def can return class type in macro def + can override macro (#2773) can override macro (#2773) + can lookup type parameter when macro is called inside class (#5343) can lookup type parameter when macro is called inside class (#5343) + does macro verbatim outside macro does macro verbatim outside macro + types macro def that calls another method inside a class types macro def that calls another method inside a class + types macro types macro + does macro verbatim inside macro does macro verbatim inside macro + finds macro in included module at class level (#4639) finds macro in included module at class level (#4639) + allows specifying self as macro def return type allows specifying self as macro def return type + finds var in proc for macros finds var in proc for macros + works inside proc literal (#2984) works inside proc literal (#2984) + errors if requires inside class through macro expansion errors if requires inside class through macro expansion + types macro def with argument types macro def with argument + errors if applying protected modifier to macro errors if applying protected modifier to macro + doesn't die on && inside if (bug) doesn't die on && inside if (bug) + declares rescue variable inside for macro declares rescue variable inside for macro + matches with default value after splat matches with default value after splat + can specify tuple as return type can specify tuple as return type + cannot lookup type defined in caller class cannot lookup type defined in caller class + can return virtual class type in macro def can return virtual class type in macro def + errors if missing one argument errors if missing one argument + errors if named arg matches splat parameter errors if named arg matches splat parameter + errors if missing two arguments errors if missing two arguments + finds method before macro (#236) finds method before macro (#236) + shows correct error message in macro expansion (#7083) shows correct error message in macro expansion (#7083) + doesn't affect self restrictions outside the macro def being instantiated in subtypes doesn't affect self restrictions outside the macro def being instantiated in subtypes + @caller + provides access to the `Call` information provides access to the `Call` information + returns an array of each call returns an array of each call + returns nil if no stack is available returns nil if no stack is available + finds generic in macro code using free var finds generic in macro code using free var + finds type for global path shared with free var finds type for global path shared with free var + checks if macro expansion returns (#821) checks if macro expansion returns (#821) + errors if named arg matches single splat parameter errors if named arg matches single splat parameter + executes MultiAssign executes MultiAssign + preserves correct self in restriction when macro def is to be instantiated in subtypes (#5044) preserves correct self in restriction when macro def is to be instantiated in subtypes (#5044) + show macro trace in errors (2) show macro trace in errors (2) + allows declaring class with macro for allows declaring class with macro for + clones default value before expanding clones default value before expanding + executes MultiAssign with ArrayLiteral value executes MultiAssign with ArrayLiteral value + allows subclasses of return type for macro def allows subclasses of return type for macro def + transforms with {{yield}} and call transforms with {{yield}} and call + finds generic type argument of included module with self finds generic type argument of included module with self + errors if find macros but missing argument errors if find macros but missing argument + finds metaclass instance of instance method (#4739) finds metaclass instance of instance method (#4739) + doesn't error when adding macro call to constant (#2457) doesn't error when adding macro call to constant (#2457) + solves macro expression arguments before macro expansion (constant) solves macro expression arguments before macro expansion (constant) + doesn't crash on syntax error inside macro (regression, #8038) doesn't crash on syntax error inside macro (regression, #8038) + uses splat and double splat uses splat and double splat + errors if non-existent named arg errors if non-existent named arg + skip_file macro directive + skips expanding the rest of the current file skips expanding the rest of the current file + skips file inside an if macro expression skips file inside an if macro expression + finds macro and method at the same scope finds macro and method at the same scope + errors if named arg already specified errors if named arg already specified + applies visibility modifier only to first level applies visibility modifier only to first level + errors if macro def type not found errors if macro def type not found + errors when trying to define def inside def with macro expansion errors when trying to define def inside def with macro expansion + finds macro in included module finds macro in included module + finds macro in module in Object finds macro in module in Object + has correct location after expanding assignment after instance var has correct location after expanding assignment after instance var +Code gen: ssa + codegens a redefined var codegens a redefined var + codegens ssa bug (2) codegens ssa bug (2) + codegens declaration of var inside then when true codegens declaration of var inside then when true + codegens a var that is declared in a block (1) codegens a var that is declared in a block (1) + codegens a var that is re-assigned in a block (2) codegens a var that is re-assigned in a block (2) + codegens a redefined var inside method with argument codegens a redefined var inside method with argument + codegens a redefined var inside method codegens a redefined var inside method + codegens declaration of var inside then when false codegens declaration of var inside then when false + codegens a var that is declared in a block (2) codegens a var that is declared in a block (2) + codegens ssa bug with if/else on var codegens ssa bug with if/else on var + codegens ssa bug (1) codegens ssa bug (1) + codegens a var that is re-assigned in a block codegens a var that is re-assigned in a block + codegens a var that is re-assigned in a block (1) codegens a var that is re-assigned in a block (1) +Crystal::TextHierarchyPrinter + shows correct size for Proc inside extern struct shows correct size for Proc inside extern struct + shows correct total size of generic class if known shows correct total size of generic class if known + shows correct size for members with bound types shows correct size for members with bound types + works works + shows correct size for Bool member shows correct size for Bool member +Crystal::Repl + can parse and evaluate snippets can parse and evaluate snippets +Code gen: pointer + can dereference pointer to func can dereference pointer to func + codegens nilable pointer type (1) codegens nilable pointer type (1) + passes arguments correctly for typedef metaclass (#8544) passes arguments correctly for typedef metaclass (#8544) + codegens pointer as if condition codegens pointer as if condition + compares pointers through typedef compares pointers through typedef + does pointerof class variable with class does pointerof class variable with class + codegens nilable pointer type dispatch (2) codegens nilable pointer type dispatch (2) + increments pointer increments pointer + codegens pointer cast codegens pointer cast + set pointer value set pointer value + can pass any pointer to something expecting void* in lib call, with to_unsafe can pass any pointer to something expecting void* in lib call, with to_unsafe + sets value of pointer to union sets value of pointer to union + codegens malloc codegens malloc + codegens realloc codegens realloc + passes pointer of pointer to method passes pointer of pointer to method + gets pointer of argument that is never assigned to gets pointer of argument that is never assigned to + gets pointer of instance variable in virtual type gets pointer of instance variable in virtual type + assigns nil and pointer to nilable pointer type assigns nil and pointer to nilable pointer type + generates correct code for Pointer.malloc(0) (#2905) generates correct code for Pointer.malloc(0) (#2905) + get pointer and value of it get pointer and value of it + can pass any pointer to something expecting void* in lib call can pass any pointer to something expecting void* in lib call + calculates pointer diff calculates pointer diff + codegens pointer as if condition inside union (1) codegens pointer as if condition inside union (1) + gets pointer to constant gets pointer to constant gets pointer to constant gets pointer to constant gets pointer to constant gets pointer to constant gets pointer to constant gets pointer to constant gets pointer to constant gets pointer to constant + changes through var and reads from pointer changes through var and reads from pointer + codegens nilable pointer type dispatch (1) codegens nilable pointer type dispatch (1) + codegens pointer cast to Nil (#8015) codegens pointer cast to Nil (#8015) + codegens nilable pointer type (2) codegens nilable pointer type (2) + codegens pointer as if condition inside union (2) codegens pointer as if condition inside union (2) + does pointerof class variable does pointerof class variable + sets value of pointer to struct sets value of pointer to struct + codegens null pointer as if condition codegens null pointer as if condition + creates pointer by address creates pointer by address + get pointer of instance var get pointer of instance var + can assign nil to void pointer can assign nil to void pointer + get value of pointer to union get value of pointer to union + can use typedef pointer value get and set (#630) can use typedef pointer value get and set (#630) + takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var + uses correct llvm module for typedef metaclass (#2877) uses correct llvm module for typedef metaclass (#2877) + does pointerof read variable does pointerof read variable +Code gen: sizeof + instance_alignof + gets instance_alignof class gets instance_alignof class + gets instance_alignof a generic type with type vars gets instance_alignof a generic type with type vars + gets sizeof Bool (#8272) gets sizeof Bool (#8272) + alignof + gets alignof union gets alignof union + alignof mixed union is not less than alignof its variant types alignof mixed union is not less than alignof its variant types + gets alignof struct gets alignof struct + gets alignof primitive types gets alignof primitive types + gets alignof class gets alignof class + gets sizeof struct gets sizeof struct + can use instance_sizeof in type argument can use instance_sizeof in type argument + doesn't precompute sizeof of module (#7741) doesn't precompute sizeof of module (#7741) + can use sizeof in type argument (2) can use sizeof in type argument (2) + returns correct sizeof for abstract struct (#4319) returns correct sizeof for abstract struct (#4319) + doesn't precompute sizeof of abstract struct (#7741) doesn't precompute sizeof of abstract struct (#7741) + can use sizeof in type argument (1) can use sizeof in type argument (1) + gets sizeof class gets sizeof class + can use instance_sizeof of virtual type can use instance_sizeof of virtual type + gets instance_sizeof class gets instance_sizeof class + gets instance_sizeof a generic type with type vars gets instance_sizeof a generic type with type vars + gets sizeof union gets sizeof union + gets sizeof Nil (#7644) gets sizeof Nil (#7644) + gets sizeof NoReturn gets sizeof NoReturn + gets sizeof Void gets sizeof Void + gets sizeof int gets sizeof int + can use sizeof of virtual type can use sizeof of virtual type +implementations + find implementation in generic class find implementation in generic class + find class defined by macro find class defined by macro + find implementors of different classes find implementors of different classes + find method calls inside while find method calls inside while + can display json output can display json output + find implementation in class methods find implementation in class methods + find method calls inside if find method calls inside if + find implementation inside a module class find implementation inside a module class + find struct implementation find struct implementation + find method calls inside rescue find method calls inside rescue + find implementation inside contained file private class' class method find implementation inside contained file private class' class method + find method calls inside trailing if find method calls inside trailing if + find implementation inside contained class' class method find implementation inside contained class' class method + find enum value implementation find enum value implementation + find enum implementation find enum implementation + find const implementation find const implementation + find class implementation find class implementation + find module implementation find module implementation + find open class implementation find open class implementation + find implementation inside contained file private method find implementation inside contained file private method + find implementation from macro expansions find implementation from macro expansions + find alias implementation find alias implementation + find full trace for macro expansions find full trace for macro expansions + can display text output can display text output + find class inside method find class inside method + find implementors of classes that are only used find implementors of classes that are only used + find method calls inside while cond find method calls inside while cond + find implementation in generic class methods find implementation in generic class methods + find top level method calls find top level method calls +Code gen: alias + doesn't crash on cast to as recursive alias (#639) doesn't crash on cast to as recursive alias (#639) + doesn't break with alias for link attributes doesn't break with alias for link attributes + overloads alias against generic (1) (#3261) overloads alias against generic (1) (#3261) + casts to recursive alias casts to recursive alias casts to recursive alias casts to recursive alias casts to recursive alias casts to recursive alias casts to recursive alias casts to recursive alias casts to recursive alias casts to recursive alias + codegens cast to alias that includes bool codegens cast to alias that includes bool + overloads alias against generic (2) (#3261) overloads alias against generic (2) (#3261) + lazily solves aliases (#1346) lazily solves aliases (#1346) + invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) + invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) + invokes methods on empty array of recursive alias (3) invokes methods on empty array of recursive alias (3) invokes methods on empty array of recursive alias (3) invokes methods on empty array of recursive alias (3) invokes methods on empty array of recursive alias (3) invokes methods on empty array of recursive alias (3) invokes methods on empty array of recursive alias (3) invokes methods on empty array of recursive alias (3) invokes methods on empty array of recursive alias (3) invokes methods on empty array of recursive alias (3) + casts to recursive alias casts to recursive alias +Crystal::Repl::Interpreter + casts + casts from nilable type to mixed union type (2) casts from nilable type to mixed union type (2) + casts from reference to nilable reference casts from reference to nilable reference + puts tuple type inside union of different tuple type (#12243) puts tuple type inside union of different tuple type (#12243) + casts to filtered type, not type in as(...) casts to filtered type, not type in as(...) + upcasts mixed union with tuple to mixed union with compatible tuple (2) (#12331) upcasts mixed union with tuple to mixed union with compatible tuple (2) (#12331) + upcasts between tuple types, respects alignment (#14036) upcasts between tuple types, respects alignment (#14036) + does is_a? with virtual type (struct) does is_a? with virtual type (struct) + casts nilable from mixed union type to primitive type (non-nil case) casts nilable from mixed union type to primitive type (non-nil case) + puts named tuple type inside union of different named tuple type (#12243) puts named tuple type inside union of different named tuple type (#12243) + casts from nilable type to mixed union type casts from nilable type to mixed union type + does as? with a type that can't match (#12346) does as? with a type that can't match (#12346) + upcasts virtual type to union upcasts virtual type to union + casts from mixed union type to nilable proc type (#12283) casts from mixed union type to nilable proc type (#12283) + upcasts mixed union with tuple to mixed union with compatible tuple (3) (#12331) upcasts mixed union with tuple to mixed union with compatible tuple (3) (#12331) + upcasts GenericClassInstanceMetaclassType to VirtualMetaclassType upcasts GenericClassInstanceMetaclassType to VirtualMetaclassType + casts nil to Void* casts nil to Void* + casts from mixed union type to primitive type casts from mixed union type to primitive type + upcasts to module type upcasts to module type + upcasts between tuple types upcasts between tuple types + casts nilable from mixed union type to primitive type (nil case) casts nilable from mixed union type to primitive type (nil case) + does is_a? with virtual metaclass does is_a? with virtual metaclass + raises when as fails raises when as fails + does as? with no resulting type, not from nil (#12327) does as? with no resulting type, not from nil (#12327) + discards cast discards cast + casts from mixed union type to another mixed union type for caller casts from mixed union type to another mixed union type for caller + upcasts between named tuple types, respects alignment (#14036) upcasts between named tuple types, respects alignment (#14036) + does as? with no resulting type (#12327) does as? with no resulting type (#12327) + upcasts mixed union with tuple to mixed union with compatible tuple (1) (#12331) upcasts mixed union with tuple to mixed union with compatible tuple (1) (#12331) + upcasts in nilable cast (#12532) upcasts in nilable cast (#12532) + upcasts between named tuple types, different order upcasts between named tuple types, different order + puts virtual metaclass into union (#12162) puts virtual metaclass into union (#12162) + upcasts between named tuple types, same order upcasts between named tuple types, same order + casts from reference to pointer and back casts from reference to pointer and back Crystal::Repl::Interpreter - inlines instance var access from virtual type with a single type (#39520) inlines instance var access from virtual type with a single type (#39520) - downcasts virtual type to its only type (#12351) downcasts virtual type to its only type (#12351) classes discards allocate discards allocate - calls explicit struct self method calls explicit struct self method does allocate, set instance var and get instance var does allocate, set instance var and get instance var - calls implicit struct self method calls implicit struct self method - interprets read instance var interprets read instance var does object_id does object_id - does constructor does constructor calls implicit class self method calls implicit class self method -Crystal::Config - .host_target .host_target - .linux_runtime_libc .linux_runtime_libc -Semantic: virtual - checks cover in every concrete subclass checks cover in every concrete subclass - automatically does virtual for generic type if there are subclasses automatically does virtual for generic type if there are subclasses - finds overloads of union of virtual, class and nil with abstract class finds overloads of union of virtual, class and nil with abstract class - restricts with union and doesn't merge to super type restricts with union and doesn't merge to super type - types two classes without a shared virtual types two classes without a shared virtual - types method call of virtual type with override types method call of virtual type with override - doesn't check cover for abstract classes doesn't check cover for abstract classes - reports undefined method in subclass of abstract class reports undefined method in subclass of abstract class - checks cover in every concrete subclass 2 checks cover in every concrete subclass 2 - doesn't check cover for subclasses doesn't check cover for subclasses - doesn't check methods on abstract classes doesn't check methods on abstract classes - works with restriction alpha works with restriction alpha - dispatches virtual method dispatches virtual method - types class and two subclasses types class and two subclasses - doesn't check methods on abstract classes 2 doesn't check methods on abstract classes 2 + calls explicit struct self method calls explicit struct self method + does constructor does constructor + calls implicit struct self method calls implicit struct self method + interprets read instance var interprets read instance var + inlines instance var access from virtual type with a single type (#39520) inlines instance var access from virtual type with a single type (#39520) + downcasts virtual type to its only type (#12351) downcasts virtual type to its only type (#12351) +Crystal::Doc::Macro + args_to_s + shows simple arg and double splat arg shows simple arg and double splat arg + shows block arg shows block arg + shows simple arg and splat arg shows simple arg and splat arg + shows default value with highlighting shows default value with highlighting + shows simple args shows simple args + shows splat arg shows splat arg + shows double splat arg shows double splat arg + shows external name of arg shows external name of arg + shows external name of arg with quotes and escaping shows external name of arg with quotes and escaping + shows double splat arg shows double splat arg + shows simple arg and block arg shows simple arg and block arg +Code gen: generic class type + recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) + declares instance var with virtual T (#1675) declares instance var with virtual T (#1675) + uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) + allows initializing instance variable in inherited generic type allows initializing instance variable in inherited generic type + doesn't consider abstract generic instantiation when restricting type (#5190) doesn't consider abstract generic instantiation when restricting type (#5190) + codegens static array size after instantiating codegens static array size after instantiating + allows initializing instance variable (#665) allows initializing instance variable (#665) + runs generic instance var initializers in superclass's metaclass context (2) (#6482) runs generic instance var initializers in superclass's metaclass context (2) (#6482) + codegens inherited generic class instance var codegens inherited generic class instance var + instantiates generic class with default argument in initialize (#394) instantiates generic class with default argument in initialize (#394) + inherited instance var initialize from generic to concrete (#2128) inherited instance var initialize from generic to concrete (#2128) + doesn't run generic instance var initializers in formal superclass's context (#4753) doesn't run generic instance var initializers in formal superclass's context (#4753) + doesn't crash on generic type restriction with no subtypes (#7583) doesn't crash on generic type restriction with no subtypes (#7583) + doesn't use virtual + in type arguments (#2839) doesn't use virtual + in type arguments (#2839) + inherited instance var initialize from generic to generic to concrete (#2128) inherited instance var initialize from generic to generic to concrete (#2128) + doesn't override guessed instance var in generic type if already declared in superclass (#9431) doesn't override guessed instance var in generic type if already declared in superclass (#9431) + codegens virtual generic metaclass macro method call codegens virtual generic metaclass macro method call + codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 + doesn't crash on generic type restriction with initially no subtypes (#8411) doesn't crash on generic type restriction with initially no subtypes (#8411) + invokes super in generic class (#2354) invokes super in generic class (#2354) + runs generic instance var initializers in superclass's metaclass context (#4753) runs generic instance var initializers in superclass's metaclass context (#4753) + doesn't consider abstract types for including types (#7200) doesn't consider abstract types for including types (#7200) + doesn't use virtual + in type arguments for Tuple (#2839) doesn't use virtual + in type arguments for Tuple (#2839) + doesn't use virtual + in type arguments for NamedTuple (#2839) doesn't use virtual + in type arguments for NamedTuple (#2839) +Semantic: static array + errors on negative static array size errors on negative static array size + doesn't crash on restriction (#584) doesn't crash on restriction (#584) + allows instantiating static array instance var in initialize of generic type allows instantiating static array instance var in initialize of generic type + doesn't crash on sizeof (#8858) doesn't crash on sizeof (#8858) + types static array new with size being a computed constant types static array new with size being a computed constant + types static array new with size being a constant types static array new with size being a constant + can match number type argument of static array (#1203) can match number type argument of static array (#1203) + errors if trying to instantiate static array with N not an integer errors if trying to instantiate static array with N not an integer + types static array with type as size types static array with type as size + can match N type argument of static array (#1203) can match N type argument of static array (#1203) + types static array with var declaration types static array with var declaration + types static array new with size being a computed constant, and use N (bug) types static array new with size being a computed constant, and use N (bug) + doesn't match other number type argument of static array (#1203) doesn't match other number type argument of static array (#1203) + doesn't crash on instance_sizeof (#8858) doesn't crash on instance_sizeof (#8858) + doesn't crash on offsetof (#8858) doesn't crash on offsetof (#8858) + types static array new with size being a nested constant inside type declaration (#5426) types static array new with size being a nested constant inside type declaration (#5426) + types static array new types static array new +Crystal::FFI::CallInterface + .variadic + validates args size validates args size + zero varargs zero varargs + basic basic + .new + all primitive arg types all primitive arg types + with args with args + sum struct sum struct + make struct make struct + simple call simple call + array array +Lexer string array + lexes string array with new line gives correct column for next token lexes string array with new line gives correct column for next token + lexes string array with new line lexes string array with new line + lexes simple string array lexes simple string array + using < as delimiter + lexes simple string array lexes simple string array + using { as delimiter + lexes simple string array lexes simple string array + using | as delimiter + lexes simple string array lexes simple string array + using [ as delimiter + lexes simple string array lexes simple string array +Code gen: block + codegens block with nilable type with return (1) codegens block with nilable type with return (1) + doesn't crash on untyped array to_s doesn't crash on untyped array to_s doesn't crash on untyped array to_s doesn't crash on untyped array to_s doesn't crash on untyped array to_s doesn't crash on untyped array to_s doesn't crash on untyped array to_s doesn't crash on untyped array to_s doesn't crash on untyped array to_s doesn't crash on untyped array to_s + can use self inside a block called from dispatch can use self inside a block called from dispatch + nexts in var assignment (#3364) nexts in var assignment (#3364) + codegens bug with block and arg and var codegens bug with block and arg and var + return from block that always returns from function that conditionally yields return from block that always returns from function that conditionally yields + can access instance vars from yielder function can access instance vars from yielder function + uses block var with same name as local var uses block var with same name as local var + codegens captured block that returns union, but proc only returns a single type codegens captured block that returns union, but proc only returns a single type + union value of yielder function union value of yielder function + codegens block call when argument type changes codegens block call when argument type changes + return from yielder function (2) return from yielder function (2) + codegens block with repeated underscore and different types (#4711) codegens block with repeated underscore and different types (#4711) + allows modifying yielded value (with literal) allows modifying yielded value (with literal) + allows modifying yielded value (with variable) allows modifying yielded value (with variable) + break from block returns from yielder break from block returns from yielder + codegens block with union arg (1) codegens block with union arg (1) + codegens bug with yield not_nil! that is never not nil codegens bug with yield not_nil! that is never not nil + returns from block with value returns from block with value returns from block with value returns from block with value returns from block with value returns from block with value returns from block with value returns from block with value returns from block with value returns from block with value + doesn't crash on yield exp without a type (#8100) doesn't crash on yield exp without a type (#8100) + uses block splat argument with union types uses block splat argument with union types + codegens while/break inside block codegens while/break inside block + codegens nested return codegens nested return + + nested yields nested yields + codegens captured block with next inside yielded block (#2097) codegens captured block with next inside yielded block (#2097) + uses splat in block argument uses splat in block argument + uses splat in block argument, many args uses splat in block argument, many args + codegens block with multiple underscores (#3054) codegens block with multiple underscores (#3054) + codegens nested break codegens nested break + codegens if with call with block (ssa issue) codegens if with call with block (ssa issue) + block with nilable type block with nilable type + breaks from while in function called from block breaks from while in function called from block + can call methods from block when yielder is an instance method can call methods from block when yielder is an instance method + return from block called from dispatch return from block called from dispatch + pass arguments to yielder function pass arguments to yielder function + return from block return from block + assigns yield to argument assigns yield to argument + allows access to local variables allows access to local variables + can set instance vars from yielder function can set instance vars from yielder function + codegens call with block with call with arg that yields codegens call with block with call with arg that yields + doesn't crash if yield exp has no type (#12670) doesn't crash if yield exp has no type (#12670) + doesn't codegen after while that always yields and breaks doesn't codegen after while that always yields and breaks + codegens block with nilable type with return (2) codegens block with nilable type with return (2) + yields more exps than block arg, through splat yields more exps than block arg, through splat + doesn't codegen call if arg yields and always breaks doesn't codegen call if arg yields and always breaks + allow return from function called from yielder function allow return from function called from yielder function + pass self and arguments to yielder function pass self and arguments to yielder function + it yields nil from another call it yields nil from another call + break without value returns nil break without value returns nil + returns from proc literal returns from proc literal + allows initialize with yield (#224) allows initialize with yield (#224) + yields splat yields splat + allows using var as block arg with outer var allows using var as block arg with outer var + codegens block with virtual type arg codegens block with virtual type arg + passes yield arguments passes yield arguments + pass self to yielder function pass self to yielder function + (bug) doesn't set needs_value to true on every yield (#12442) (bug) doesn't set needs_value to true on every yield (#12442) + call block from dispatch and use local vars call block from dispatch and use local vars call block from dispatch and use local vars call block from dispatch and use local vars call block from dispatch and use local vars call block from dispatch and use local vars call block from dispatch and use local vars call block from dispatch and use local vars call block from dispatch and use local vars call block from dispatch and use local vars + allows yield from dispatch call allows yield from dispatch call + break from block with value break from block with value break from block with value break from block with value break from block with value break from block with value break from block with value break from block with value break from block with value break from block with value + return from block that always returns from function that always yields inside if block return from block that always returns from function that always yields inside if block + uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) + generate inline generate inline + codegens block bug with conditional next and unconditional break (3) codegens block bug with conditional next and unconditional break (3) + codegens block bug with conditional next and unconditional break (1) codegens block bug with conditional next and unconditional break (1) + break from block with value break from block with value + does next from captured block does next from captured block + unpacks tuple but doesn't override local variables unpacks tuple but doesn't override local variables + yields inside yield (#682) yields inside yield (#682) + can break without value from yielder that returns nilable (1) can break without value from yielder that returns nilable (1) + codegens block with return and yield and no return codegens block with return and yield and no return + dispatches with captured and non-captured block (#3969) dispatches with captured and non-captured block (#3969) + executes yield expression if no arg is given for block executes yield expression if no arg is given for block + clears nilable var before inlining block method (#10087) clears nilable var before inlining block method (#10087) + breaks in var assignment (#3364) breaks in var assignment (#3364) + can break without value from yielder that returns nilable (2) can break without value from yielder that returns nilable (2) + codegens call with blocks of different type without args codegens call with blocks of different type without args + call block from dispatch call block from dispatch + can use global constant can use global constant + can use instance methods from yielder function can use instance methods from yielder function + block with nilable type 2 block with nilable type 2 + codegens block bug with conditional next and unconditional break (2) codegens block bug with conditional next and unconditional break (2) + codegens block bug with conditional next and unconditional break (4) codegens block bug with conditional next and unconditional break (4) + returns void when called with block returns void when called with block + codegens block which always breaks but never enters (#494) codegens block which always breaks but never enters (#494) + break with value from yielder that returns a nilable break with value from yielder that returns a nilable + codegens dispatch with block and break (2) codegens dispatch with block and break (2) codegens dispatch with block and break (2) codegens dispatch with block and break (2) codegens dispatch with block and break (2) codegens dispatch with block and break (2) codegens dispatch with block and break (2) codegens dispatch with block and break (2) codegens dispatch with block and break (2) codegens dispatch with block and break (2) + codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) + auto-unpacks tuple auto-unpacks tuple + break block with yielder inside while break block with yielder inside while break block with yielder inside while break block with yielder inside while break block with yielder inside while break block with yielder inside while break block with yielder inside while break block with yielder inside while break block with yielder inside while break block with yielder inside while + codegens block with union arg (2) codegens block with union arg (2) + codegens method invocation on a object of a captured block with a type that was never instantiated (2) codegens method invocation on a object of a captured block with a type that was never instantiated (2) + codegens method invocation on a object of a captured block with a type that was never instantiated codegens method invocation on a object of a captured block with a type that was never instantiated + return from yielder function return from yielder function + codegens block with union with return codegens block with union with return +Semantic: array + types array literal size correctly types array literal size correctly + types non-empty typed array literal of int types non-empty typed array literal of int + types array literal of union types array literal of union + types non-empty typed array literal of int types non-empty typed array literal of int + types empty typed array literal of int32 types empty typed array literal of int32 + types array literal with splats types array literal with splats + types array literal of int with splats types array literal of int with splats + types array literal with splats (2) types array literal with splats (2) + types array literal of int types array literal of int + assignment in array literal works (#3195) assignment in array literal works (#3195) +Semantic: class + allows instantiating generic class with number allows instantiating generic class with number + types as no return if calling method on abstract generic class (#6996) types as no return if calling method on abstract generic class (#6996) + reports undefined instance method reports undefined instance method + errors on no method found on abstract class, class method (#2241) errors on no method found on abstract class, class method (#2241) + reports superclass mismatch reports superclass mismatch + errors when wrong arguments for new errors when wrong arguments for new + doesn't crash on instance variable assigned a proc, and never instantiated (#923) doesn't crash on instance variable assigned a proc, and never instantiated (#923) + uses number type var in class method uses number type var in class method + can't use implicit initialize if defined in parent can't use implicit initialize if defined in parent + types recursive type types recursive type + doesn't crash with top-level initialize (#2601) doesn't crash with top-level initialize (#2601) + types as no return if calling method on generic class with subclasses (#6996) types as no return if calling method on generic class with subclasses (#6996) + doesn't error on new on abstract virtual type class doesn't error on new on abstract virtual type class + errors if inherits from module errors if inherits from module + errors if reopening non-generic class as generic errors if reopening non-generic class as generic + can invoke method on abstract generic type with subclasses but no instances can invoke method on abstract generic type with subclasses but no instances + says no overload matches for class new says no overload matches for class new + errors if reopening generic class with different type vars errors if reopening generic class with different type vars + types as no return if calling method on abstract class with all abstract subclasses (#6996) types as no return if calling method on abstract class with all abstract subclasses (#6996) + reports wrong number of arguments for initialize reports wrong number of arguments for initialize + types class inside class types class inside class + errors if reopening generic class with different type vars (2) errors if reopening generic class with different type vars (2) types class and subclass as one type types class and subclass as one type - removes instance var from subclasses removes instance var from subclasses - types inspect types inspect - uses virtual type as generic type if class is abstract even in union uses virtual type as generic type if class is abstract even in union - types two subclasses types two subclasses - dispatches virtual method with overload dispatches virtual method with overload - types method call of virtual type types method call of virtual type - reports no matches for virtual type reports no matches for virtual type - finds overloads of union of virtual, class and nil finds overloads of union of virtual, class and nil - reports missing cover for subclass of abstract class reports missing cover for subclass of abstract class - types instance var as virtual when using type declaration and has subclasses types instance var as virtual when using type declaration and has subclasses - checks method in every concrete subclass but method in Object checks method in every concrete subclass but method in Object - uses virtual type as generic type if class is abstract uses virtual type as generic type if class is abstract - checks cover in every concrete subclass 3 checks cover in every concrete subclass 3 -Code gen: closure - codegens closure with instance var codegens closure with instance var + says wrong number of arguments for abstract class new says wrong number of arguments for abstract class new + types type var union types type var union + reports unknown class when extending reports unknown class when extending + inherits Gen(self) (#2890) inherits Gen(self) (#2890) + errors if using underscore in generic class errors if using underscore in generic class + finds in global scope if includes module finds in global scope if includes module + errors when creating Number errors when creating Number + types instance variable types instance variable + errors if reopening generic class with different splat index errors if reopening generic class with different splat index + allows declaring a variable in an initialize and using it allows declaring a variable in an initialize and using it + types class and subclass as one type types class and subclass as one type + preserves order of instance vars (#3050) preserves order of instance vars (#3050) + errors if declares class inside if errors if declares class inside if + types bug #168 (it inherits instance var even if not mentioned in initialize) types bug #168 (it inherits instance var even if not mentioned in initialize) + errors if inheriting Gen(self) and there's no self (#2890) errors if inheriting Gen(self) and there's no self (#2890) + can use short name for top-level type can use short name for top-level type + says wrong number of arguments for abstract class new (2) says wrong number of arguments for abstract class new (2) + types instance variable on getter types instance variable on getter + reports can't instantiate abstract class on allocate reports can't instantiate abstract class on allocate + types class and subclass as one type types class and subclass as one type + uses self as type var uses self as type var + hoists instance variable initializer hoists instance variable initializer + does automatic inference of new for generic types does automatic inference of new for generic types + can invoke method on abstract type without subclasses nor instances can invoke method on abstract type without subclasses nor instances + doesn't mix classes on definition (#2352) doesn't mix classes on definition (#2352) + reports uninitialized constant reports uninitialized constant + doesn't lookup new in supermetaclass doesn't lookup new in supermetaclass + errors if reopening generic class with different splat index (3) errors if reopening generic class with different splat index (3) + can't reopen as struct can't reopen as struct + types virtual method of generic class types virtual method of generic class + types Const#new#method types Const#new#method + types instance variable types instance variable + infers generic type after instance was created with explicit type infers generic type after instance was created with explicit type + doesn't use initialize from base class doesn't use initialize from base class + errors when creating Value errors when creating Value + types Const#new types Const#new + allows using self in class scope allows using self in class scope + types as no return if calling method on abstract class with generic subclasses but no instances (#6996) types as no return if calling method on abstract class with generic subclasses but no instances (#6996) + types Const#allocate types Const#allocate + errors if reading non-existent ivar errors if reading non-existent ivar + reads an object instance var reads an object instance var + can mark initialize as private can mark initialize as private + errors if creating instance before typing instance variable errors if creating instance before typing instance variable + does automatic type inference of new for generic types 2 does automatic type inference of new for generic types 2 + correctly types #680 correctly types #680 + reports can't instantiate abstract class on new reports can't instantiate abstract class on new + errors if using read-instance-var with non-typed variable errors if using read-instance-var with non-typed variable + doesn't mark instance variable as nilable if calling another initialize doesn't mark instance variable as nilable if calling another initialize + errors if assigning superclass to declared instance var errors if assigning superclass to declared instance var + does automatic type inference of new for nested generic type does automatic type inference of new for nested generic type + allows defining classes inside modules or classes with :: allows defining classes inside modules or classes with :: + errors if inherits from metaclass errors if inherits from metaclass + inherits self twice (#5495) inherits self twice (#5495) + inherits self (#2890) inherits self (#2890) + reads a virtual type instance var reads a virtual type instance var + can invoke method on abstract generic type without subclasses nor instances can invoke method on abstract generic type without subclasses nor instances + doesn't use initialize from base class with virtual type doesn't use initialize from base class with virtual type + can't reopen as module can't reopen as module + reports undefined method when method inside a class reports undefined method when method inside a class + reads an object instance var from a union type reads an object instance var from a union type + errors if reopening generic class with different splat index (2) errors if reopening generic class with different splat index (2) + types self inside method call without obj types self inside method call without obj + correctly types #680 (2) correctly types #680 (2) + uses self as type var uses self as type var + types generic of generic type types generic of generic type + doesn't lookup type in parents' namespaces, and lookups and in program doesn't lookup type in parents' namespaces, and lookups and in program + says that instance vars are not allowed in metaclass says that instance vars are not allowed in metaclass + errors if reading ivar from non-ivar container errors if reading ivar from non-ivar container +Code gen: automatic cast + casts Int32 -> Int64 in arg restriction casts Int32 -> Int64 in arg restriction + casts Int32 to Int64 in ivar assignment casts Int32 to Int64 in ivar assignment + casts literal integer (Int32 -> Float32) casts literal integer (Int32 -> Float32) + casts literal float (Float32 -> Float64) casts literal float (Float32 -> Float64) + casts Int32 to Int64 in cvar type declaration casts Int32 to Int64 in cvar type declaration + casts Int32 to Int64 in ivar type declaration in generic casts Int32 to Int64 in ivar type declaration in generic + does multidispatch with automatic casting (2) (#8217) does multidispatch with automatic casting (2) (#8217) + casts literal integer (Int32 -> Float64) casts literal integer (Int32 -> Float64) + casts Symbol to Enum in ivar type declaration casts Symbol to Enum in ivar type declaration + casts integer variable to larger type (#9565) casts integer variable to larger type (#9565) + doesn't autocast number on union (#8655) doesn't autocast number on union (#8655) + casts literal integer (Int32 -> Int64) casts literal integer (Int32 -> Int64) + casts literal float (Float64 -> Float32) casts literal float (Float64 -> Float32) + casts Int32 to Int64 in lvar assignment casts Int32 to Int64 in lvar assignment + casts Int32 to Int64 in cvar assignment casts Int32 to Int64 in cvar assignment + casts Symbol to Enum in ivar assignment casts Symbol to Enum in ivar assignment + casts Int32 to Int64 in ivar type declaration casts Int32 to Int64 in ivar type declaration + does multidispatch with automatic casting (3) does multidispatch with automatic casting (3) + casts literal integer (Int64 -> Int32, ok) casts literal integer (Int64 -> Int32, ok) + casts symbol literal to enum casts symbol literal to enum + does multidispatch with automatic casting (1) (#8217) does multidispatch with automatic casting (1) (#8217) +Semantic: closure + marks method as self closured if used inside a block marks method as self closured if used inside a block + is considered as closure if assigned once but comes from a method arg is considered as closure if assigned once but comes from a method arg + marks variable as closured in program marks variable as closured in program + marks variable as closured in def marks variable as closured in def + errors if sending closured proc literal to C errors if sending closured proc literal to C + does assign all types to metavar if closured but only assigned to once in a loop through block does assign all types to metavar if closured but only assigned to once in a loop through block + doesn't crash for non-existing variable (#3789) doesn't crash for non-existing variable (#3789) + lookups return type in correct scope lookups return type in correct scope + gives error when doing yield inside proc literal gives error when doing yield inside proc literal + errors if sending closured proc pointer to C (1.2) errors if sending closured proc pointer to C (1.2) + marks outer fun inside a block as closured marks outer fun inside a block as closured + correctly detects previous var as closured (#5609) correctly detects previous var as closured (#5609) + unifies types of closured var (2) unifies types of closured var (2) + doesn't mark var as closured if only used in two block doesn't mark var as closured if only used in two block + transforms block to proc literal with free var transforms block to proc literal with free var + marks method as self closured if instance var is read marks method as self closured if instance var is read + doesn't closure typeof instance var (#9479) doesn't closure typeof instance var (#9479) + errors if forwarding block param doesn't match input type errors if forwarding block param doesn't match input type + doesn't assign all types to metavar if closured but declared inside block and re-assigned inside the same context before the closure doesn't assign all types to metavar if closured but declared inside block and re-assigned inside the same context before the closure + marks method as self closured if instance var is written marks method as self closured if instance var is written + doesn't mark self var as closured, but marks method as self closured doesn't mark self var as closured, but marks method as self closured + doesn't closure typeof local var doesn't closure typeof local var + marks variable as closured in program on assign marks variable as closured in program on assign + allows passing block as proc literal to new and to initialize allows passing block as proc literal to new and to initialize + doesn't mark var as closured if only used in block doesn't mark var as closured if only used in block + can use fun typedef as block type can use fun typedef as block type allows giving less block args when transforming block to proc literal allows giving less block args when transforming block to proc literal - codegens simple closure in block codegens simple closure in block - codegens closure with nested context without new closured vars codegens closure with nested context without new closured vars - allows passing an external function along (2) allows passing an external function along (2) - codegens proc literal with struct codegens proc literal with struct - doesn't incorrectly consider local as closured (#4948) doesn't incorrectly consider local as closured (#4948) - codegens simple closure in function with argument codegens simple closure in function with argument - codegens closure with struct codegens closure with struct - codegens nested closure with block (2) codegens nested closure with block (2) - closures struct self closures struct self - codegens nested closure that mentions var in both contexts codegens nested closure that mentions var in both contexts - codegens simple closure in function codegens simple closure in function - codegens nested closure codegens nested closure - codegens multiple nested blocks codegens multiple nested blocks - codegens closure with instance var and block codegens closure with instance var and block - codegens closure with nested context without new closured vars codegens closure with nested context without new closured vars - codegens closured nested in block with a call with a closure with same names codegens closured nested in block with a call with a closure with same names - codegens closure with self and var codegens closure with self and var - codegens closure with block that declares same var codegens closure with block that declares same var - doesn't free closure memory (bug) doesn't free closure memory (bug) doesn't free closure memory (bug) doesn't free closure memory (bug) doesn't free closure memory (bug) doesn't free closure memory (bug) doesn't free closure memory (bug) doesn't free closure memory (bug) doesn't free closure memory (bug) doesn't free closure memory (bug) - allows passing an external function along allows passing an external function along - codegens closure with block codegens closure with block - codegens nested closure with block (1) codegens nested closure with block (1) - codegens closure inside initialize inside block with self codegens closure inside initialize inside block with self - codegens closure with def that has an if codegens closure with def that has an if - codegens closure with nested context without new closured vars but with block arg codegens closure with nested context without new closured vars but with block arg - codegens closure with instance var and var codegens closure with instance var and var - codegens closured self in block (#3388) codegens closured self in block (#3388) + errors if sending closured proc pointer to C (3) errors if sending closured proc pointer to C (3) + errors if forwarding block param doesn't match input type size errors if forwarding block param doesn't match input type size + doesn't assign all types to metavar if closured but declared inside block and never re-assigned doesn't assign all types to metavar if closured but declared inside block and never re-assigned + considers var as closure-readonly if it was assigned multiple times before it was closured considers var as closure-readonly if it was assigned multiple times before it was closured + marks method as self closured if implicit self call is made marks method as self closured if implicit self call is made + marks outer fun as closured when using self marks outer fun as closured when using self + says can't send closure to C with captured block says can't send closure to C with captured block + gives error when doing yield inside proc literal gives error when doing yield inside proc literal + marks method as self closured if explicit self call is made marks method as self closured if explicit self call is made + errors when transforming block to proc literal if type mismatch errors when transforming block to proc literal if type mismatch + correctly captures type of closured block arg correctly captures type of closured block arg transforms block to proc literal transforms block to proc literal - codegens super nested closure codegens super nested closure - allows passing block as proc literal to new and to initialize allows passing block as proc literal to new and to initialize - captures block and accesses local variable (#2050) captures block and accesses local variable (#2050) captures block and accesses local variable (#2050) captures block and accesses local variable (#2050) captures block and accesses local variable (#2050) captures block and accesses local variable (#2050) captures block and accesses local variable (#2050) captures block and accesses local variable (#2050) captures block and accesses local variable (#2050) captures block and accesses local variable (#2050) - codegens closured nested in block codegens closured nested in block - unifies types of closured var unifies types of closured var - doesn't form a closure if invoking class method doesn't form a closure if invoking class method doesn't form a closure if invoking class method doesn't form a closure if invoking class method doesn't form a closure if invoking class method doesn't form a closure if invoking class method doesn't form a closure if invoking class method doesn't form a closure if invoking class method doesn't form a closure if invoking class method doesn't form a closure if invoking class method - transforms block to proc literal with free var transforms block to proc literal with free var - codegens simple closure at global scope codegens simple closure at global scope - allows mixing yield and block.call allows mixing yield and block.call - ensures it can raise from the closure check ensures it can raise from the closure check - codegens closure with self and arguments codegens closure with self and arguments - codegens nested closure with nested closured variable codegens nested closure with nested closured variable - codegens closure with implicit self and var codegens closure with implicit self and var - codegen closure in instance method without self closured codegen closure in instance method without self closured - allows passing proc literal to def that captures block with & allows passing proc literal to def that captures block with & - codegens super nested closure with nested closured variable codegens super nested closure with nested closured variable - doesn't form a closure if invoking class method with self doesn't form a closure if invoking class method with self doesn't form a closure if invoking class method with self doesn't form a closure if invoking class method with self doesn't form a closure if invoking class method with self doesn't form a closure if invoking class method with self doesn't form a closure if invoking class method with self doesn't form a closure if invoking class method with self doesn't form a closure if invoking class method with self doesn't form a closure if invoking class method with self -Lexer - lexes "0b1111111111111111111111111111111" lexes "0b1111111111111111111111111111111" - lexes "\x12" lexes "\x12" - lexes "unless" lexes "unless" - says syntax error on "-11111111111111111111" says syntax error on "-11111111111111111111" - lexes "{" lexes "{" - lexes "0x00ffffffffffffffff" lexes "0x00ffffffffffffffff" - lexes "union" lexes "union" - lexes "break?" lexes "break?" - lexes "170141183460469231731687303715884105727_i128" lexes "170141183460469231731687303715884105727_i128" - lexes "1e23f64" lexes "1e23f64" - lexes "-0" lexes "-0" - lexes ">=" lexes ">=" - lexes "-1_i64" lexes "-1_i64" - says syntax error on "0xfffffffffffffffff_u64" says syntax error on "0xfffffffffffffffff_u64" - lexes "if!" lexes "if!" - lexes "..." lexes "..." - lexes != after identifier (#4815) lexes != after identifier (#4815) - lexes "unless?" lexes "unless?" - lexes "1.0" lexes "1.0" - lexes "enum" lexes "enum" - lexes "||" lexes "||" - lexes ":**" lexes ":**" - lexes "of" lexes "of" - lexes "sizeof" lexes "sizeof" - lexes ":=~" lexes ":=~" - lexes "class!" lexes "class!" - lexes "self" lexes "self" - lexes "verbatim" lexes "verbatim" - says syntax error on "2e+-2" says syntax error on "2e+-2" - lexes "rescue" lexes "rescue" - says syntax error on "0x1afafafafafafafafafafaf" says syntax error on "0x1afafafafafafafafafafaf" - lexes "1_u32" lexes "1_u32" - lexes "&=" lexes "&=" - lexes "&+=" lexes "&+=" - lexes "elsif" lexes "elsif" - says syntax error on "340282366920938463463374607431768211456" says syntax error on "340282366920938463463374607431768211456" - lexes "alias" lexes "alias" - lexes "\10" lexes "\10" - lexes "true?" lexes "true?" - lexes "*=" lexes "*=" - says syntax error on "-0x80000000000000000000000000000001" says syntax error on "-0x80000000000000000000000000000001" - says syntax error on "4i65" says syntax error on "4i65" - lexes "&&" lexes "&&" - lexes "-@foo" lexes "-@foo" - lexes "nil!" lexes "nil!" - says syntax error on "-1_u8" says syntax error on "-1_u8" - lexes "1_i128" lexes "1_i128" - lexes '\0' lexes '\0' - lexes "/" lexes "/" - lexes "0x3fffffffffffffff" lexes "0x3fffffffffffffff" - lexes "|=" lexes "|=" - lexes "elsif!" lexes "elsif!" - lexes ">>=" lexes ">>=" - lexes "<<" lexes "<<" - says syntax error on "'\\" says syntax error on "'\\" - lexes "1f64" lexes "1f64" - lexes not instance var lexes not instance var - lexes "do!" lexes "do!" - lexes "1i32" lexes "1i32" - lexes "$10" lexes "$10" - lexes "struct" lexes "struct" - lexes "extend" lexes "extend" - lexes "-1234" lexes "-1234" - lexes "1u8" lexes "1u8" - lexes "-0x80000001" lexes "-0x80000001" - lexes "0x1_i64" lexes "0x1_i64" - says syntax error on "0b100000000000000000000000000000000000000000000000000000000000000000u64" says syntax error on "0b100000000000000000000000000000000000000000000000000000000000000000u64" - says syntax error on "'\\u{110000}'" says syntax error on "'\\u{110000}'" - says syntax error on "9223372036854775808_i64" says syntax error on "9223372036854775808_i64" - says syntax error on "'\\u{D800}'" says syntax error on "'\\u{D800}'" - says syntax error on "0o200000_00000000_00000000" says syntax error on "0o200000_00000000_00000000" - says syntax error on "18446744073709551616_u64" says syntax error on "18446744073709551616_u64" - lexes "0xFFFF" lexes "0xFFFF" - lexes "when" lexes "when" - says syntax error on "-9999999999999999999" says syntax error on "-9999999999999999999" - lexes "something" lexes "something" - lexes "1e+23" lexes "1e+23" - lexes "1i64" lexes "1i64" - says syntax error on "4i22" says syntax error on "4i22" - says syntax error on "01_i64" says syntax error on "01_i64" - lexes "1u16" lexes "1u16" - lexes "||=" lexes "||=" - lexes "}" lexes "}" - lexes "1.0f64" lexes "1.0f64" - lexes "0_f32" lexes "0_f32" - lexes "+1_i128" lexes "+1_i128" - lexes "pointerof" lexes "pointerof" - lexes "@foo" lexes "@foo" - lexes "=>" lexes "=>" - lexes "118446744073709551616_u128" lexes "118446744073709551616_u128" - lexes "1_i32" lexes "1_i32" - says syntax error on "-2147483649_i32" says syntax error on "-2147483649_i32" - lexes char with unicode codepoint lexes char with unicode codepoint - lexes "1_u8" lexes "1_u8" - lexes "0o777777777777777777777" lexes "0o777777777777777777777" - lexes "return!" lexes "return!" - lexes "\1" lexes "\1" - lexes "private" lexes "private" - lexes "0o001777777777777777777777" lexes "0o001777777777777777777777" - lexes ":~" lexes ":~" - lexes "1_i8" lexes "1_i8" - says syntax error on "0F32" says syntax error on "0F32" - lexes "for" lexes "for" - lexes "Foo" lexes "Foo" - lexes "<<=" lexes "<<=" - lexes "&-=" lexes "&-=" - lexes "unless!" lexes "unless!" - lexes "0o123" lexes "0o123" - lexes "elsif?" lexes "elsif?" - lexes "0xFFFF_u64" lexes "0xFFFF_u64" - lexes "+1234" lexes "+1234" - lexes float then zero (bug) lexes float then zero (bug) - lexes "break" lexes "break" - lexes ".." lexes ".." - lexes "0x7fffffff" lexes "0x7fffffff" - lexes "0b11111111_11111111_11111111_11111111_11111111_11111111_11111111_11111111" lexes "0b11111111_11111111_11111111_11111111_11111111_11111111_11111111_11111111" - lexes "0b111111111111111111111111111111111111111111111111111111111111111" lexes "0b111111111111111111111111111111111111111111111111111111111111111" - lexes "." lexes "." - lexes "0xFFFFFFFF" lexes "0xFFFFFFFF" - lexes "~" lexes "~" - lexes ":^" lexes ":^" - lexes utf-8 multibyte char lexes utf-8 multibyte char - lexes char with unicode codepoint and curly with six hex digits lexes char with unicode codepoint and curly with six hex digits - lexes "ident" lexes "ident" - lexes '\b' lexes '\b' - lexes "2147483648.foo" lexes "2147483648.foo" - lexes "def?" lexes "def?" - lexes "0x100000000" lexes "0x100000000" - lexes "+@foo" lexes "+@foo" - says syntax error on "'\\1'" says syntax error on "'\\1'" - says syntax error on "0o1234567123456712345671234567u64" says syntax error on "0o1234567123456712345671234567u64" - lexes "=" lexes "=" - lexes "super" lexes "super" - lexes "0xffffffff" lexes "0xffffffff" - lexes "+0o123" lexes "+0o123" - says syntax error on "0x1afafafafafafafafafafafu64" says syntax error on "0x1afafafafafafafafafafafu64" - says syntax error on "2e+" says syntax error on "2e+" - lexes "return?" lexes "return?" - lexes "\4" lexes "\4" - lexes "170141183460469231731687303715884105728_u128" lexes "170141183460469231731687303715884105728_u128" - says syntax error on "-1_u64" says syntax error on "-1_u64" - lexes ":foo" lexes ":foo" - lexes "with_1" lexes "with_1" - says syntax error on "0o7777777777777777777777777777777777777777777777777" says syntax error on "0o7777777777777777777777777777777777777777777777777" - says syntax error on "256_u8" says syntax error on "256_u8" - lexes '\n' lexes '\n' - lexes "out" lexes "out" - lexes dot and ident lexes dot and ident - lexes "$foo123" lexes "$foo123" - lexes ";" lexes ";" - lexes ":|" lexes ":|" - says syntax error on "2147483648_i32" says syntax error on "2147483648_i32" - lexes "module" lexes "module" - lexes "0x8000000000000000" lexes "0x8000000000000000" - lexes "type" lexes "type" - says syntax error on "0b100000000000000000000000000000000i32" says syntax error on "0b100000000000000000000000000000000i32" - lexes ")" lexes ")" - lexes "^" lexes "^" - lexes "-0.5" lexes "-0.5" - lexes '\a' lexes '\a' - lexes "^=" lexes "^=" - says syntax error on "-0_u64" says syntax error on "-0_u64" - lexes "0🔮" lexes "0🔮" - says syntax error on "0x10000_0000_0000_0000_u64" says syntax error on "0x10000_0000_0000_0000_u64" - lexes __FILE__ lexes __FILE__ - lexes "1.2e+23" lexes "1.2e+23" - lexes '\f' lexes '\f' - says syntax error on ".42" says syntax error on ".42" - lexes "[]" lexes "[]" - says syntax error on "65536_u16" says syntax error on "65536_u16" - lexes "0x3🔮" lexes "0x3🔮" - lexes ":+" lexes ":+" - lexes ":&-" lexes ":&-" - lexes "&-@foo" lexes "&-@foo" - lexes "**=" lexes "**=" - says syntax error on "4F32" says syntax error on "4F32" - says syntax error on "0o200000_00000000_00000000_u64" says syntax error on "0o200000_00000000_00000000_u64" - lexes "fun" lexes "fun" - says syntax error on "18446744073709551616" says syntax error on "18446744073709551616" - lexes "0o700000000000000000000" lexes "0o700000000000000000000" - lexes "-0b1010" lexes "-0b1010" - lexes "0xffff_ffff_ffff_ffff" lexes "0xffff_ffff_ffff_ffff" - lexes utf-8 char lexes utf-8 char - says syntax error on "0123" says syntax error on "0123" - lexes "begin" lexes "begin" - lexes "responds_to?" lexes "responds_to?" - lexes "340282366920938463463374607431768211455_u128" lexes "340282366920938463463374607431768211455_u128" - says syntax error on "-9223372036854775809_i64" says syntax error on "-9223372036854775809_i64" - lexes "@[" lexes "@[" - says syntax error on "-1_u32" says syntax error on "-1_u32" - lexes "then" lexes "then" - lexes ":&" lexes ":&" - lexes "$_foo" lexes "$_foo" - says syntax error on "18446744073709551616_i32" says syntax error on "18446744073709551616_i32" - lexes ":[]" lexes ":[]" - lexes "with_underscores" lexes "with_underscores" - says syntax error on "-1_u128" says syntax error on "-1_u128" - lexes "-1" lexes "-1" - says syntax error on "4f22" says syntax error on "4f22" - lexes "<=>" lexes "<=>" - lexes "else!" lexes "else!" - lexes "false!" lexes "false!" - says syntax error on "0x1afafafafafafafafafafafi32" says syntax error on "0x1afafafafafafafafafafafi32" - lexes "+0xFFFF" lexes "+0xFFFF" - lexes "==" lexes "==" - says syntax error on "\"\\400\"" says syntax error on "\"\\400\"" - lexes "$foo" lexes "$foo" - lexes "1.0f32" lexes "1.0f32" - lexes "is_a?" lexes "is_a?" - says syntax error on "9999999999999999999_i32" says syntax error on "9999999999999999999_i32" - says syntax error on "0b_10" says syntax error on "0b_10" - says syntax error on "\"\\x1z\"" says syntax error on "\"\\x1z\"" - says syntax error on "-0x80000000000000000000000000000000" says syntax error on "-0x80000000000000000000000000000000" - lexes ":[]?" lexes ":[]?" - says syntax error on "2ef32" says syntax error on "2ef32" - lexes "0i8" lexes "0i8" - says syntax error on "2e+e" says syntax error on "2e+e" - says syntax error on "$0?" says syntax error on "$0?" - lexes ":&*" lexes ":&*" - lexes "def" lexes "def" - lexes "case" lexes "case" - lexes ":!~" lexes ":!~" - lexes char with unicode codepoint and curly lexes char with unicode codepoint and curly - lexes ":>=" lexes ":>=" - says syntax error on "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" says syntax error on "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" - says syntax error on "0b100000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000" says syntax error on "0b100000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000" - lexes regex after \n lexes regex after \n - lexes "require" lexes "require" - lexes "14146167139683460000" lexes "14146167139683460000" - lexes "+0.5" lexes "+0.5" - lexes "1.foo" lexes "1.foo" - lexes "1_u128" lexes "1_u128" - lexes "1_i16" lexes "1_i16" - lexes "1u32" lexes "1u32" - says syntax error on "2e8i8" says syntax error on "2e8i8" - lexes "break!" lexes "break!" - lexes "<" lexes "<" - lexes "18446744073709551615" lexes "18446744073709551615" - lexes "1E40" lexes "1E40" - lexes "12341234🔮" lexes "12341234🔮" - lexes "&+@foo" lexes "&+@foo" - says syntax error on "0x10000_0000_0000_0000" says syntax error on "0x10000_0000_0000_0000" - lexes "0xffffffffffffffff" lexes "0xffffffffffffffff" - lexes "1e+23_f32" lexes "1e+23_f32" - says syntax error on "4i12" says syntax error on "4i12" - lexes "0b1000000000000000000000000000000000000000000000000000000000000000" lexes "0b1000000000000000000000000000000000000000000000000000000000000000" - says syntax error on "'\\uD800'" says syntax error on "'\\uD800'" - says syntax error on "-3_" says syntax error on "-3_" - lexes "===" lexes "===" - says syntax error on "'\\uFEDZ'" says syntax error on "'\\uFEDZ'" - lexes ":-" lexes ":-" - lexes "2147483648" lexes "2147483648" - lexes ":/" lexes ":/" - lexes heredoc start lexes heredoc start - lexes "select" lexes "select" - says syntax error on "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" says syntax error on "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" - lexes "1.0f32" lexes "1.0f32" - says syntax error on "/foo" says syntax error on "/foo" - says syntax error on "-170141183460469231731687303715884105729" says syntax error on "-170141183460469231731687303715884105729" - lexes "9223372036854775808" lexes "9223372036854775808" - lexes __DIR__ lexes __DIR__ - lexes "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF_u128" lexes "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF_u128" - lexes "!=" lexes "!=" - lexes "@@foo" lexes "@@foo" - lexes ":==" lexes ":==" - lexes "include" lexes "include" - lexes "0o177777_77777777_77777777" lexes "0o177777_77777777_77777777" - lexes "0b001111111111111111111111111111111111111111111111111111111111111111" lexes "0b001111111111111111111111111111111111111111111111111111111111111111" - lexes "-2147483649" lexes "-2147483649" - lexes "0x7fffffff_i32" lexes "0x7fffffff_i32" - says syntax error on "4u65" says syntax error on "4u65" - says syntax error on "00" says syntax error on "00" - lexes "next" lexes "next" - lexes ":foo=" lexes ":foo=" - says syntax error on "0o200_i8" says syntax error on "0o200_i8" - lexes "[]?" lexes "[]?" - lexes symbol with quote lexes symbol with quote - says syntax error on "0x8000000000000000i64" says syntax error on "0x8000000000000000i64" - lexes symbol followed by === lexes symbol followed by === - says syntax error on "0b11_f32" says syntax error on "0b11_f32" - lexes "!" lexes "!" - says syntax error on "0b🔮" says syntax error on "0b🔮" - lexes "\t" lexes "\t" - says syntax error on "0b1000000000000000000000000000000000000000000000000000000000000000i64" says syntax error on "0b1000000000000000000000000000000000000000000000000000000000000000i64" - says syntax error on "1_.1" says syntax error on "1_.1" - lexes "instance_sizeof" lexes "instance_sizeof" - says syntax error on "4294967296_u32" says syntax error on "4294967296_u32" - lexes "!~" lexes "!~" - lexes "1.2e+23_f32" lexes "1.2e+23_f32" - says syntax error on "\"\\xz\"" says syntax error on "\"\\xz\"" - lexes "yield" lexes "yield" - lexes "1234" lexes "1234" - lexes "1_000" lexes "1_000" - says syntax error on "4u33" says syntax error on "4u33" - lexes "%}" lexes "%}" - says syntax error on "4i3" says syntax error on "4i3" - lexes "://" lexes "://" - lexes "0b1010" lexes "0b1010" - lexes "-0x80000000000000000000000000000000_i128" lexes "-0x80000000000000000000000000000000_i128" - lexes comment at the end lexes comment at the end - lexes "def!" lexes "def!" - lexes "&**" lexes "&**" - lexes ":>>" lexes ":>>" - says syntax error on "-129_i8" says syntax error on "-129_i8" - says syntax error on "0o1234567123456712345671234567" says syntax error on "0o1234567123456712345671234567" - lexes ":[]=" lexes ":[]=" - lexes "false" lexes "false" - lexes "[]=" lexes "[]=" - lexes "?" lexes "?" - lexes "end" lexes "end" - lexes regex after \r\n lexes regex after \r\n - says syntax error on "'\\uDFFF'" says syntax error on "'\\uDFFF'" - lexes "0b100000000000000000000000000000000" lexes "0b100000000000000000000000000000000" - lexes "+1.0f32" lexes "+1.0f32" - lexes "1.0f32hello" lexes "1.0f32hello" - lexes "0" lexes "0" - lexes "-0xFFFFFFFF" lexes "-0xFFFFFFFF" - lexes "else?" lexes "else?" - lexes "bar!" lexes "bar!" - says syntax error on "-9223372036854775809" says syntax error on "-9223372036854775809" - lexes "-0x8000000000000000_i64" lexes "-0x8000000000000000_i64" - lexes "1_i64" lexes "1_i64" - lexes "if" lexes "if" - says syntax error on "10e_10" says syntax error on "10e_10" - lexes "&&=" lexes "&&=" - lexes ":&+" lexes ":&+" - lexes "-0.0f32" lexes "-0.0f32" - lexes "//" lexes "//" - says syntax error on "\r1" says syntax error on "\r1" - lexes "&+" lexes "&+" - lexes ":<=>" lexes ":<=>" - lexes "1" lexes "1" - lexes "1e23" lexes "1e23" - says syntax error on "0b100000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000_u64" says syntax error on "0b100000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000_u64" - lexes space after char lexes space after char - lexes "1i64" lexes "1i64" - lexes "annotation" lexes "annotation" - lexes "1_u16" lexes "1_u16" - lexes '\\' lexes '\\' - lexes symbol followed by != lexes symbol followed by != - lexes "|" lexes "|" - lexes "+=" lexes "+=" - says syntax error on ":+1" says syntax error on ":+1" - lexes "0o17777777777_i32" lexes "0o17777777777_i32" - says syntax error on "0b100000000000000000000000000000000000000000000000000000000000000000" says syntax error on "0b100000000000000000000000000000000000000000000000000000000000000000" - lexes symbol with backslash (#2187) lexes symbol with backslash (#2187) - says syntax error on "-99999999999999999999" says syntax error on "-99999999999999999999" - lexes "{{" lexes "{{" - says syntax error on "'\\u{}'" says syntax error on "'\\u{}'" - lexes "1_234.567_890_f32" lexes "1_234.567_890_f32" - says syntax error on "-0e_12" says syntax error on "-0e_12" - lexes "0x7fffffffffffffff" lexes "0x7fffffffffffffff" - lexes "1f32" lexes "1f32" - lexes "0_i32" lexes "0_i32" - lexes "return" lexes "return" - lexes "100_000" lexes "100_000" - says syntax error on "$01" says syntax error on "$01" - lexes ":かたな" lexes ":かたな" - lexes "0x10000_0000_0000_0000_i128" lexes "0x10000_0000_0000_0000_i128" - lexes "0b11111111111111111111111111111111" lexes "0b11111111111111111111111111111111" - lexes "1u128" lexes "1u128" - lexes "0f32" lexes "0f32" - says syntax error on "4u3" says syntax error on "4u3" - lexes ":!" lexes ":!" - says syntax error on "4f33" says syntax error on "4f33" - lexes "1_u64" lexes "1_u64" - says syntax error on "-0u64" says syntax error on "-0u64" - lexes "$10?" lexes "$10?" - says syntax error on "-999999999999999999999999999999999999999" says syntax error on "-999999999999999999999999999999999999999" - lexes "fooBar" lexes "fooBar" - lexes "" lexes "" - lexes "+1.0" lexes "+1.0" - lexes "1i128" lexes "1i128" - lexes "&*" lexes "&*" - lexes "in" lexes "in" - lexes "class?" lexes "class?" - lexes "-1.0" lexes "-1.0" - lexes "->" lexes "->" - lexes "while!" lexes "while!" - lexes "$~" lexes "$~" - lexes "1_234.567_890" lexes "1_234.567_890" - lexes "\110" lexes "\110" - lexes ":===" lexes ":===" - lexes "❨╯°□°❩╯︵┻━┻" lexes "❨╯°□°❩╯︵┻━┻" - lexes "/=" lexes "/=" - lexes "**" lexes "**" - lexes "-1.0f32" lexes "-1.0f32" - lexes ":foo?" lexes ":foo?" - says syntax error on "32768_i16" says syntax error on "32768_i16" - lexes "$1?" lexes "$1?" - lexes "-1_i128" lexes "-1_i128" - lexes "-0o123" lexes "-0o123" - lexes "next?" lexes "next?" - lexes char with unicode codepoint and curly with zeros lexes char with unicode codepoint and curly with zeros - lexes "0i32" lexes "0i32" - lexes space after keyword lexes space after keyword - lexes ":>" lexes ":>" - lexes "0o1000000000000000000000" lexes "0o1000000000000000000000" - lexes "$?" lexes "$?" - lexes "]" lexes "]" - lexes "2e01" lexes "2e01" - lexes "with" lexes "with" - says syntax error on "0o40000000000i32" says syntax error on "0o40000000000i32" - lexes "0o1000000000000000000000" lexes "0o1000000000000000000000" - says syntax error on "2e+_2" says syntax error on "2e+_2" - lexes ":\"foo\"" lexes ":\"foo\"" - lexes ":foo!" lexes ":foo!" - lexes "uninitialized" lexes "uninitialized" - lexes 'a' lexes 'a' - lexes "foo?" lexes "foo?" - lexes ">" lexes ">" - lexes '\v' lexes '\v' - says syntax error on "1__1" says syntax error on "1__1" - lexes "end?" lexes "end?" - lexes "$FOO" lexes "$FOO" - lexes "%=" lexes "%=" - lexes "1.2e+23_f64" lexes "1.2e+23_f64" - lexes "true" lexes "true" - says syntax error on "4i33" says syntax error on "4i33" - lexes "while" lexes "while" - lexes "true!" lexes "true!" - lexes "0x80000001" lexes "0x80000001" - lexes "typeof" lexes "typeof" - lexes "+" lexes "+" - lexes "\xFF" lexes "\xFF" - lexes "[" lexes "[" - says syntax error on "0_12" says syntax error on "0_12" - lexes ":<=" lexes ":<=" - says syntax error on "2e" says syntax error on "2e" - lexes "::" lexes "::" - says syntax error on "0o12345671234567_12345671234567_i8" says syntax error on "0o12345671234567_12345671234567_i8" - says syntax error on "/\\" says syntax error on "/\\" - lexes "$1" lexes "$1" - lexes "until" lexes "until" - lexes "0o123_i64" lexes "0o123_i64" - lexes "+1_i64" lexes "+1_i64" - lexes ":<" lexes ":<" - lexes "end!" lexes "end!" - lexes "if?" lexes "if?" - lexes "0o40000000000" lexes "0o40000000000" - lexes "-0xFFFF" lexes "-0xFFFF" - lexes "1e-23" lexes "1e-23" - says syntax error on "-.42" says syntax error on "-.42" - lexes "while?" lexes "while?" - lexes "0xabcdef" lexes "0xabcdef" - lexes "nil" lexes "nil" - lexes "1i64hello" lexes "1i64hello" - lexes ":<<" lexes ":<<" - lexes "macro" lexes "macro" - says syntax error on "0x100000000i32" says syntax error on "0x100000000i32" - lexes '\r' lexes '\r' - lexes "9223372036854775808_i128" lexes "9223372036854775808_i128" - says syntax error on "118446744073709551616_u64" says syntax error on "118446744073709551616_u64" - says syntax error on "0o73_f64" says syntax error on "0o73_f64" - lexes "begin?" lexes "begin?" - lexes "10000000000000000000_u64" lexes "10000000000000000000_u64" - lexes "{%" lexes "{%" - lexes "0.5" lexes "0.5" - lexes '\'' lexes '\'' - lexes "as" lexes "as" - lexes "%" lexes "%" - says syntax error on "2e+@foo" says syntax error on "2e+@foo" - lexes "-=" lexes "-=" - lexes "-" lexes "-" - lexes "+1" lexes "+1" - lexes "," lexes "," - says syntax error on "4u22" says syntax error on "4u22" - lexes symbol followed by == lexes symbol followed by == - lexes '\0' lexes '\0' - lexes "-9223372036854775809_i128" lexes "-9223372036854775809_i128" - lexes "_" lexes "_" - says syntax error on "0b10000000_i8" says syntax error on "0b10000000_i8" - lexes "0e40" lexes "0e40" - lexes "as?" lexes "as?" - lexes "else" lexes "else" - lexes "9223372036854775807" lexes "9223372036854775807" - lexes "0b1_i64" lexes "0b1_i64" - lexes "&*=" lexes "&*=" - says syntax error on "4F64" says syntax error on "4F64" - lexes ":" lexes ":" - says syntax error on "'" says syntax error on "'" - says syntax error on ":\"foo" says syntax error on ":\"foo" - lexes "+0b1010" lexes "+0b1010" - lexes "&-" lexes "&-" - lexes "1i8" lexes "1i8" - says syntax error on "0o1000000000000000000000i64" says syntax error on "0o1000000000000000000000i64" - lexes "(" lexes "(" - lexes "\8" lexes "\8" - lexes "=~" lexes "=~" - lexes "1u64" lexes "1u64" - lexes "$23?" lexes "$23?" - says syntax error on "-32769_i16" says syntax error on "-32769_i16" - lexes "2_e2" lexes "2_e2" - lexes "0o17777777777" lexes "0o17777777777" - lexes ":!=" lexes ":!=" - lexes "class" lexes "class" - lexes "\n" lexes "\n" - says syntax error on "-0o7777777777777777777777777777777777777777777777777" says syntax error on "-0o7777777777777777777777777777777777777777777777777" - lexes "nil?" lexes "nil?" - lexes '\t' lexes '\t' - lexes "ensure" lexes "ensure" - lexes comment and token lexes comment and token - lexes "//=" lexes "//=" - lexes "do?" lexes "do?" - lexes "-9223372036854775808" lexes "-9223372036854775808" - lexes "false?" lexes "false?" - lexes "0o37777777777" lexes "0o37777777777" - lexes "0b0_1" lexes "0b0_1" - lexes "+0" lexes "+0" - says syntax error on "\"hi\\" says syntax error on "\"hi\\" - says syntax error on "128_i8" says syntax error on "128_i8" - lexes "1_i64" lexes "1_i64" - lexes ":%" lexes ":%" - lexes "|" lexes "|" - lexes "*" lexes "*" - says syntax error on "4f65" says syntax error on "4f65" - lexes "yield?" lexes "yield?" - lexes "18446744073709551616_u128" lexes "18446744073709551616_u128" - lexes "lib" lexes "lib" - lexes "do" lexes "do" - says syntax error on "118446744073709551616" says syntax error on "118446744073709551616" - says syntax error on "'\\u{DFFF}'" says syntax error on "'\\u{DFFF}'" - lexes " " lexes " " - lexes "\n\n\n" lexes "\n\n\n" - says syntax error on "2e+f32" says syntax error on "2e+f32" - lexes ":&**" lexes ":&**" - lexes "1.0hello" lexes "1.0hello" - lexes "1hello" lexes "1hello" - says syntax error on "0xFF_i8" says syntax error on "0xFF_i8" - lexes "<=" lexes "<=" - lexes "asm" lexes "asm" - says syntax error on "-1_u16" says syntax error on "-1_u16" - lexes "offsetof" lexes "offsetof" - lexes "&" lexes "&" - lexes ">>" lexes ">>" - lexes "!@foo" lexes "!@foo" - lexes "begin!" lexes "begin!" - lexes __LINE__ lexes __LINE__ - lexes "0b1111111111111111111111111111111_i32" lexes "0b1111111111111111111111111111111_i32" - lexes "abstract" lexes "abstract" - lexes "yield!" lexes "yield!" - lexes "next!" lexes "next!" - doesn't raise if many slash r with slash n doesn't raise if many slash r with slash n - doesn't raise if slash r with slash n doesn't raise if slash r with slash n - lexes "1i16" lexes "1i16" - lexes "protected" lexes "protected" - lexes ":*" lexes ":*" - says syntax error on "4.0_u32" says syntax error on "4.0_u32" - says syntax error on "4u12" says syntax error on "4u12" - lexes "1i128hello" lexes "1i128hello" -Codegen: const - gets pointerof complex constant gets pointerof complex constant gets pointerof complex constant gets pointerof complex constant gets pointerof complex constant gets pointerof complex constant gets pointerof complex constant gets pointerof complex constant gets pointerof complex constant gets pointerof complex constant - supports closured vars inside initializers (#10474) supports closured vars inside initializers (#10474) - codegens variable assignment in const codegens variable assignment in const codegens variable assignment in const codegens variable assignment in const codegens variable assignment in const codegens variable assignment in const codegens variable assignment in const codegens variable assignment in const codegens variable assignment in const codegens variable assignment in const - inlines bool const inlines bool const - supports storing function returning nil supports storing function returning nil - codegens two consts with same variable name codegens two consts with same variable name codegens two consts with same variable name codegens two consts with same variable name codegens two consts with same variable name codegens two consts with same variable name codegens two consts with same variable name codegens two consts with same variable name codegens two consts with same variable name codegens two consts with same variable name - gets pointerof constant gets pointerof constant gets pointerof constant gets pointerof constant gets pointerof constant gets pointerof constant gets pointerof constant gets pointerof constant gets pointerof constant gets pointerof constant - initializes ARGC_UNSAFE initializes ARGC_UNSAFE - allows implicit self in constant, called from another class (bug) allows implicit self in constant, called from another class (bug) allows implicit self in constant, called from another class (bug) allows implicit self in constant, called from another class (bug) allows implicit self in constant, called from another class (bug) allows implicit self in constant, called from another class (bug) allows implicit self in constant, called from another class (bug) allows implicit self in constant, called from another class (bug) allows implicit self in constant, called from another class (bug) allows implicit self in constant, called from another class (bug) - invokes block in const invokes block in const invokes block in const invokes block in const invokes block in const invokes block in const invokes block in const invokes block in const invokes block in const invokes block in const - initializes simple const via another const initializes simple const via another const - constants with expression constants with expression - inlines const with math inlines const with math - define a constant define a constant - finds nearest constant first finds nearest constant first - works with variable declared inside if works with variable declared inside if works with variable declared inside if works with variable declared inside if works with variable declared inside if works with variable declared inside if works with variable declared inside if works with variable declared inside if works with variable declared inside if works with variable declared inside if - gets pointerof constant inside class gets pointerof constant inside class gets pointerof constant inside class gets pointerof constant inside class gets pointerof constant inside class gets pointerof constant inside class gets pointerof constant inside class gets pointerof constant inside class gets pointerof constant inside class gets pointerof constant inside class - inlines simple const inlines simple const - initialize const that might raise an exception initialize const that might raise an exception initialize const that might raise an exception initialize const that might raise an exception initialize const that might raise an exception initialize const that might raise an exception initialize const that might raise an exception initialize const that might raise an exception initialize const that might raise an exception initialize const that might raise an exception - uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) - inlines enum value inlines enum value - codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct - support nested constant support nested constant - uses correct types lookup uses correct types lookup uses correct types lookup uses correct types lookup uses correct types lookup uses correct types lookup uses correct types lookup uses correct types lookup uses correct types lookup uses correct types lookup - support constant inside a def support constant inside a def - codegens constant that is declared later because of virtual dispatch codegens constant that is declared later because of virtual dispatch - doesn't crash if constant is used, but class is never instantiated (#1106) doesn't crash if constant is used, but class is never instantiated (#1106) - finds global constant finds global constant - initializes simple const initializes simple const - allows constants with same name allows constants with same name - define a constant in lib define a constant in lib - inlines const referencing another const inlines const referencing another const - declaring var declaring var declaring var declaring var declaring var declaring var declaring var declaring var declaring var declaring var - declare constants in right order declare constants in right order declare constants in right order declare constants in right order declare constants in right order declare constants in right order declare constants in right order declare constants in right order declare constants in right order declare constants in right order - runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) - synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants - inlines char const inlines char const - uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module + says can't send closure to C with new notation says can't send closure to C with new notation + errors if giving more block args when transforming block to proc literal errors if giving more block args when transforming block to proc literal + transforms block to proc literal without parameters transforms block to proc literal without parameters + errors if sending closured proc pointer to C (1) errors if sending closured proc pointer to C (1) + unifies types of closured var (1) unifies types of closured var (1) + doesn't assign all types to metavar if closured but only assigned to once doesn't assign all types to metavar if closured but only assigned to once + transforms block to proc literal with void type transforms block to proc literal with void type + errors if sending closured proc pointer to C (2) errors if sending closured proc pointer to C (2) + marks variable as closured in block marks variable as closured in block + does assign all types to metavar if closured but only assigned to once in a loop through captured block does assign all types to metavar if closured but only assigned to once in a loop through captured block + does assign all types to metavar if closured but only assigned to once in a loop does assign all types to metavar if closured but only assigned to once in a loop + marks variable as closured inside block in fun marks variable as closured inside block in fun + passes #227 passes #227 +file_exists? + with absolute path + returns true if file exists returns true if file exists + returns false if file doesn't exist returns false if file doesn't exist + with relative path + reads file (exists) reads file (exists) + reads file (doesn't exist) reads file (doesn't exist) +Semantic: ssa + types if with return in both branches types if with return in both branches + types a var inside an if without change in then types a var inside an if without change in then + types a var inside an if without definition in then types a var inside an if without definition in then + doesn't change type to nilable inside if doesn't change type to nilable inside if + types a var that is declared in a while condition with break before re-assignment types a var that is declared in a while condition with break before re-assignment + types a var that is declared in a while condition types a var that is declared in a while condition + types a var with an if with nested if types a var with an if with nested if + types a var that is re-assigned in a while in next and used in condition types a var that is re-assigned in a while in next and used in condition + types block with break doesn't infect initial vars types block with break doesn't infect initial vars + types a var inside an if without definition in else types a var inside an if without definition in else + types a var that is declared in a while with out types a var that is declared in a while with out + types if with unreachable in then types if with unreachable in then + types if with break in then types if with break in then + doesn't error if same variable is used in multiple arguments of same typeof doesn't error if same variable is used in multiple arguments of same typeof + types a var after begin ensure as having last type (2) types a var after begin ensure as having last type (2) + types a var with an if but without change types a var with an if but without change + preserves type filters after block (bug) preserves type filters after block (bug) + types a var inside an if with previous definition types a var inside an if with previous definition + types if with restricted type in else types if with restricted type in else + types if with return in else with assign types if with return in else with assign + types a var that is declared in a while condition with break after re-assignment types a var that is declared in a while condition with break after re-assignment + types while with break types while with break + types a var that is re-assigned in a while condition types a var that is re-assigned in a while condition + types block with next types block with next + types re-assign inside while (bug) types re-assign inside while (bug) + types if with restricted type in then types if with restricted type in then + types a var that is declared in a while types a var that is declared in a while + types a redefined variable types a redefined variable + types a var after begin ensure as having last type types a var after begin ensure as having last type + types a var inside an if without previous definition types a var inside an if without previous definition + errors if accessing variable declared inside typeof errors if accessing variable declared inside typeof + types while with break doesn't infect initial vars types while with break doesn't infect initial vars + doesn't error if same variable is declared in multiple typeofs doesn't error if same variable is declared in multiple typeofs + types a var that is re-assigned in a while types a var that is re-assigned in a while + types re-assign inside if (bug) types re-assign inside if (bug) + types while with next types while with next + types if with return in then with assign types if with return in then with assign + types a var that is re-assigned in a block types a var that is re-assigned in a block + types while with break with new var types while with break with new var + types if with return in else types if with return in else + types if with return in then types if with return in then + types block with break types block with break + types if/else with var (bug) types if/else with var (bug) + types if with next in then types if with next in then + types a var inside an if without change in else types a var inside an if without change in else + types a var that is re-assigned in a while and used in condition types a var that is re-assigned in a while and used in condition Crystal::Repl::Interpreter bugs - does leading zeros does leading zeros doesn't override local variable value with block var with the same name doesn't override local variable value with block var with the same name - doesn't incorrectly consider a non-closure as closure doesn't incorrectly consider a non-closure as closure + doesn't pass self to top-level method (FileNode) doesn't pass self to top-level method (FileNode) + does multidispatch on virtual struct does multidispatch on virtual struct does multidispatch on virtual struct union nil does multidispatch on virtual struct union nil breaks from current block, not from outer block breaks from current block, not from outer block correctly puts virtual metaclass type in union correctly puts virtual metaclass type in union - does multidispatch on virtual struct does multidispatch on virtual struct doesn't pass self to top-level method doesn't pass self to top-level method - doesn't pass self to top-level method (FileNode) doesn't pass self to top-level method (FileNode) -Code gen: method_missing - does method_missing macro with virtual type (6) does method_missing macro with virtual type (6) - does method_missing macro without args (with call) does method_missing macro without args (with call) - does method_missing with assignment (bug) does method_missing with assignment (bug) - does method_missing macro with virtual type (7) does method_missing macro with virtual type (7) - does method_missing macro with block but not using it does method_missing macro with block but not using it - does method_missing macro without args does method_missing macro without args - does method_missing macro with virtual type (5) does method_missing macro with virtual type (5) - does method_missing macro with args (with call) does method_missing macro with args (with call) - does method_missing macro with included module does method_missing macro with included module - forwards forwards - does method_missing macro with block does method_missing macro with block - does method_missing macro with virtual type (4) does method_missing macro with virtual type (4) - works with named arguments that aren't legal variable names (#10381) works with named arguments that aren't legal variable names (#10381) - does method_missing macro with args does method_missing macro with args - does method_missing macro with top level method involved does method_missing macro with top level method involved - does method_missing macro with module involved does method_missing macro with module involved - does method_missing macro with virtual type (1) does method_missing macro with virtual type (1) - does method_missing with assignment (2) (bug) does method_missing with assignment (2) (bug) - finds method_missing with 'with ... yield' finds method_missing with 'with ... yield' - does method_missing macro with virtual type (3) does method_missing macro with virtual type (3) - does method_missing macro with virtual type (2) does method_missing macro with virtual type (2) - works with named arguments (#3654) works with named arguments (#3654) - does method_missing generating method does method_missing generating method - does method_missing macro with virtual type (8) does method_missing macro with virtual type (8) -Code gen: regex literal spec - works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) -Code gen: debug - correctly restores debug location after fun change (#4254) correctly restores debug location after fun change (#4254) - stores and restores debug location after jumping to main (3) stores and restores debug location after jumping to main (3) - doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals - doesn't fail on constant read calls (#11416) doesn't fail on constant read calls (#11416) - stores and restores debug location after jumping to main (2) stores and restores debug location after jumping to main (2) - codegens correct debug info for new with custom allocate (#3945) codegens correct debug info for new with custom allocate (#3945) - codegens lib union (#7335) codegens lib union (#7335) - codegens extern union (#7335) codegens extern union (#7335) - doesn't emit debug info for unused variable declarations (#9882) doesn't emit debug info for unused variable declarations (#9882) - codegens correct debug info for untyped expression (#4007 and #4008) codegens correct debug info for untyped expression (#4007 and #4008) - stores and restores debug location after jumping to main (#6920) stores and restores debug location after jumping to main (#6920) - inlines instance var access through getter in debug mode inlines instance var access through getter in debug mode - doesn't emit incorrect debug info for closured self doesn't emit incorrect debug info for closured self - has correct debug location after constant initialization in call with block (#4719) has correct debug location after constant initialization in call with block (#4719) - codegens abstract struct (#3578) codegens abstract struct (#3578) - has debug info in closure inside if (#5593) has debug info in closure inside if (#5593) -Semantic: module - extends a module extends a module - works with int including enumerable works with int including enumerable - includes generic module with self (check argument superclass type, success) includes generic module with self (check argument superclass type, success) - instantiates generic variadic module, accesses T from instance method, more args instantiates generic variadic module, accesses T from instance method, more args - includes module with Union(T*) includes module with Union(T*) - errors when extending self and self defines instance vars (3) (#9568) errors when extending self and self defines instance vars (3) (#9568) - correctly types type var in included module, with a restriction with a free var (bug) correctly types type var in included module, with a restriction with a free var (bug) - can use generic module as instance variable type can use generic module as instance variable type - doesn't lookup type in ancestor when matches in current type (#2982) doesn't lookup type in ancestor when matches in current type (#2982) - errors if reopening generic module with different splat index errors if reopening generic module with different splat index - types pointer of module types pointer of module - extends generic module from generic class and calls class method (#7167) extends generic module from generic class and calls class method (#7167) - works with range and map works with range and map - extends generic module from generic module and calls class method (#7167) extends generic module from generic module and calls class method (#7167) - gives error when including self gives error when including self - includes module in a module includes module in a module - includes generic module with self (check return subclass type, success) includes generic module with self (check return subclass type, success) - gives helpful error message when generic type var is missing gives helpful error message when generic type var is missing - includes generic module explicitly includes generic module explicitly - inherits instance var type annotation from generic to generic to concrete inherits instance var type annotation from generic to generic to concrete - finds class method in block finds class method in block - includes generic module with self includes generic module with self - errors when extending generic module that defines instance vars (2) errors when extending generic module that defines instance vars (2) - uses :Module name for modules in errors uses :Module name for modules in errors - errors when extending module that defines instance vars (2) (#4065) errors when extending module that defines instance vars (2) (#4065) - includes generic module with self, and inherits it includes generic module with self, and inherits it - errors when extending module that defines instance vars (#4065) errors when extending module that defines instance vars (#4065) - finds nested type inside method in block inside module finds nested type inside method in block inside module - errors when extending self and self defines instance vars (#9568) errors when extending self and self defines instance vars (#9568) - declares module automatically if not previously declared when declaring a class declares module automatically if not previously declared when declaring a class - errors if reopening generic module with different type vars (2) errors if reopening generic module with different type vars (2) - finds types close to included module finds types close to included module - includes generic module explicitly and errors includes generic module explicitly and errors - gives error with cyclic include gives error with cyclic include - errors if declares module inside if errors if declares module inside if - initializes variable in module, recursive initializes variable in module, recursive - types pointer of module with generic type types pointer of module with generic type - includes generic module with self (check return type, success) includes generic module with self (check return type, success) - declares module automatically if not previously declared when declaring a module declares module automatically if not previously declared when declaring a module - calls super on included generic module and finds type var calls super on included generic module and finds type var - instantiates generic variadic module, accesses T from instance method through generic include instantiates generic variadic module, accesses T from instance method through generic include - gives error when including self, generic module gives error when including self, generic module - can restrict module with module (#3029) can restrict module with module (#3029) - types union of module and class that includes it types union of module and class that includes it - errors if including generic module and not specifying type vars errors if including generic module and not specifying type vars - calls super on included generic module calls super on included generic module - types pointer of module with generic type types pointer of module with generic type - instantiates generic variadic module, accesses T from instance method instantiates generic variadic module, accesses T from instance method - includes generic module with type includes generic module with type - errors if reopening generic module with different splat index (3) errors if reopening generic module with different splat index (3) - instantiates generic variadic module, accesses T from class method through generic extend instantiates generic variadic module, accesses T from class method through generic extend - types proc of module after type changes types proc of module after type changes - includes generic module with another generic type includes generic module with another generic type - allows overloading with included generic module allows overloading with included generic module - finds inner class from inherited one (#476) finds inner class from inherited one (#476) - uses type declaration inside module, recursive, and gives error uses type declaration inside module, recursive, and gives error - types pointer of module with method types pointer of module with method - includes generic module with self (check return subclass type, error) includes generic module with self (check return subclass type, error) - can't reopen as struct can't reopen as struct - includes module but wrong number of arguments includes module but wrong number of arguments - uses type declaration inside module and gives error uses type declaration inside module and gives error - errors if reopening generic module with different splat index (2) errors if reopening generic module with different splat index (2) - gives error when trying to instantiate with allocate gives error when trying to instantiate with allocate - can use generic module as instance variable type (2) can use generic module as instance variable type (2) - instantiates generic variadic module, accesses T from instance method through generic include, more args instantiates generic variadic module, accesses T from instance method through generic include, more args - errors when recursively extending module that defines instance vars (2) errors when recursively extending module that defines instance vars (2) - can't pass module class to virtual metaclass (#6113) can't pass module class to virtual metaclass (#6113) - gives helpful error message when generic type var is missing in block spec gives helpful error message when generic type var is missing in block spec - uses type declaration inside module uses type declaration inside module - includes generic module with self (check argument superclass type, success) includes generic module with self (check argument superclass type, success) - can't reopen as class can't reopen as class - includes generic module with self (check argument type, success) includes generic module with self (check argument type, success) - doesn't look up initialize past module that defines initialize (#7007) doesn't look up initialize past module that defines initialize (#7007) - types pointer of module with method with two including types types pointer of module with method with two including types - errors if reopening generic module with different type vars errors if reopening generic module with different type vars - errors when extending self and self defines instance vars (2) (#9568) errors when extending self and self defines instance vars (2) (#9568) - calls super on included generic module and finds type var (2) calls super on included generic module and finds type var (2) - extends module from generic class and calls class method (#7167) extends module from generic class and calls class method (#7167) - gives error when trying to instantiate with new gives error when trying to instantiate with new - errors when recursively extending module that defines instance vars errors when recursively extending module that defines instance vars - includes module but can't access metaclass methods includes module but can't access metaclass methods - errors when extending generic module that defines instance vars errors when extending generic module that defines instance vars - initializes variable in module initializes variable in module - includes generic module with self (check argument type, error) includes generic module with self (check argument type, error) - finds in module when included finds in module when included - inherits instance var type annotation from generic to concrete with T inherits instance var type annotation from generic to concrete with T - includes module but not generic includes module but not generic - instantiates generic variadic module, accesses T from class method instantiates generic variadic module, accesses T from class method - gives error with cyclic include between non-generic and generic module gives error with cyclic include between non-generic and generic module - can instantiate generic module can instantiate generic module - includes but not a module includes but not a module - errors if reopening non-generic module as generic errors if reopening non-generic module as generic - reports can't use instance variables inside module reports can't use instance variables inside module - finds constant in generic module included in another module finds constant in generic module included in another module - works ok in a case where a typed-def type has an underlying type that has an included generic module (bug) works ok in a case where a typed-def type has an underlying type that has an included generic module (bug) - includes generic module with self (check return type, error) includes generic module with self (check return type, error) - gives error with cyclic include, generic module gives error with cyclic include, generic module - includes module in a class includes module in a class - gives error with cyclic include between non-generic and generic module (2) gives error with cyclic include between non-generic and generic module (2) - extends self extends self - gives error when including instantiation of self, generic module gives error when including instantiation of self, generic module - types proc of module with generic class types proc of module with generic class - includes generic module and errors in call includes generic module and errors in call - inherits instance var type annotation from generic to concrete inherits instance var type annotation from generic to concrete + doesn't incorrectly consider a non-closure as closure doesn't incorrectly consider a non-closure as closure + does leading zeros does leading zeros +Codegen: special vars + preserves special vars in macro expansion with call with default arguments (#824) preserves special vars in macro expansion with call with default arguments (#824) + codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) + allows with primitive allows with primitive + codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) + codegens after block 2 codegens after block 2 + codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) + codegens $~ codegens $~ + codegens after block codegens after block codegens after block codegens after block codegens after block codegens after block codegens after block codegens after block codegens after block codegens after block + codegens $~ two levels codegens $~ two levels + codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) + codegens with default argument codegens with default argument + works lazily works lazily works lazily works lazily works lazily works lazily works lazily works lazily works lazily works lazily + codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block + codegens $? codegens $? + codegens in block codegens in block codegens in block codegens in block codegens in block codegens in block codegens in block codegens in block codegens in block codegens in block + preserves special vars if initialized inside block (#2194) preserves special vars if initialized inside block (#2194) + allows with struct allows with struct +semantic: case + checks exhaustiveness of single type checks exhaustiveness of single type + checks exhaustiveness for tuple literal of 2 elements, first is bool checks exhaustiveness for tuple literal of 2 elements, first is bool + checks exhaustiveness of single type (generic) checks exhaustiveness of single type (generic) + checks exhaustiveness for tuple literal with bool and underscore at first position, partial match checks exhaustiveness for tuple literal with bool and underscore at first position, partial match + checks exhaustiveness of single type (Foo(T).class) checks exhaustiveness of single type (Foo(T).class) + checks exhaustiveness for tuple literal of 3 elements, all bool checks exhaustiveness for tuple literal of 3 elements, all bool + checks exhaustiveness of union type with virtual type checks exhaustiveness of union type with virtual type + checks exhaustiveness of enum combined with another type checks exhaustiveness of enum combined with another type + errors if casing against a constant errors if casing against a constant + doesn't check exhaustiveness when using 'when' doesn't check exhaustiveness when using 'when' + checks exhaustiveness for tuple literal with bool and underscore at second position, partial match checks exhaustiveness for tuple literal with bool and underscore at second position, partial match + can't prove case is exhaustive for @[Flags] enum can't prove case is exhaustive for @[Flags] enum + checks exhaustiveness of enum via question method checks exhaustiveness of enum via question method + checks exhaustiveness, covers in base type covers (generic type) checks exhaustiveness, covers in base type covers (generic type) + can't prove case is exhaustive for @[Flags] enum, tuple case can't prove case is exhaustive for @[Flags] enum, tuple case + checks exhaustiveness for tuple literal with bool and underscore at first position checks exhaustiveness for tuple literal with bool and underscore at first position + checks exhaustiveness for tuple literal with types and underscore at second position checks exhaustiveness for tuple literal with types and underscore at second position + checks exhaustiveness of bool type (missing false) checks exhaustiveness of bool type (missing false) + checks exhaustiveness of enum through method (all cases covered) checks exhaustiveness of enum through method (all cases covered) + checks exhaustiveness, covers in base type covers checks exhaustiveness, covers in base type covers + checks exhaustiveness of bool type (missing true) checks exhaustiveness of bool type (missing true) + checks exhaustiveness of enum (all cases covered) checks exhaustiveness of enum (all cases covered) + checks exhaustiveness of bool type with other types checks exhaustiveness of bool type with other types + checks exhaustiveness of nil type with nil literal checks exhaustiveness of nil type with nil literal + checks exhaustiveness of single type (T.class) checks exhaustiveness of single type (T.class) + checks exhaustiveness of nilable type with nil literal checks exhaustiveness of nilable type with nil literal + checks exhaustiveness of union with bool checks exhaustiveness of union with bool + checks exhaustiveness for tuple literal with bool and underscore at second position checks exhaustiveness for tuple literal with bool and underscore at second position + can prove case is exhaustive for @[Flags] enum when matching type can prove case is exhaustive for @[Flags] enum when matching type + checks exhaustiveness for tuple literal, and passes checks exhaustiveness for tuple literal, and passes + checks exhaustiveness of enum via const checks exhaustiveness of enum via const + checks exhaustiveness for tuple literal of 3 elements, and warns checks exhaustiveness for tuple literal of 3 elements, and warns + checks exhaustiveness for tuple literal, with call checks exhaustiveness for tuple literal, with call + checks exhaustiveness for tuple literal of 2 elements, and warns checks exhaustiveness for tuple literal of 2 elements, and warns + checks exhaustiveness for tuple literal with types and underscore at first position checks exhaustiveness for tuple literal with types and underscore at first position + checks exhaustiveness for tuple literal of 2 elements, first is enum checks exhaustiveness for tuple literal of 2 elements, first is enum + checks exhaustiveness for tuple literal with bool and underscore at second position, with partial match checks exhaustiveness for tuple literal with bool and underscore at second position, with partial match + checks exhaustiveness for tuple literal with bool and underscore at first position checks exhaustiveness for tuple literal with bool and underscore at first position + checks exhaustiveness for tuple literal with bool and underscore at first position, with partial match checks exhaustiveness for tuple literal with bool and underscore at first position, with partial match + checks exhaustiveness for tuple literal with bool and underscore at second position checks exhaustiveness for tuple literal with bool and underscore at second position + covers all types covers all types + checks exhaustiveness for tuple literal of 3 elements, all enums checks exhaustiveness for tuple literal of 3 elements, all enums +Crystal::Repl::Interpreter + sizeof + interprets sizeof typeof interprets sizeof typeof + alignof + interprets alignof typeof interprets alignof typeof + instance_alignof + interprets instance_alignof typeof interprets instance_alignof typeof + instance_sizeof + interprets instance_sizeof typeof interprets instance_sizeof typeof +Crystal::Loader + .read_ld_conf + basic basic + with include with include + .parse + parses directory paths parses directory paths + parses static parses static + parses file paths parses file paths + prepends directory paths before default search paths prepends directory paths before default search paths + parses library names parses library names + .default_search_paths + DYLD_LIBRARY_PATH DYLD_LIBRARY_PATH + LD_LIBRARY_PATH LD_LIBRARY_PATH + dynlib + #load_file? + finds function symbol finds function symbol + #load_library? + lookup in order lookup in order + full path full path + library name library name + does not implicitly find dependencies does not implicitly find dependencies + does not find global symbols does not find global symbols + validate that lib handles are properly closed validate that lib handles are properly closed +Semantic: concrete_types + VirtualMetaclassType with abstract base VirtualMetaclassType with abstract base + VirtualType with abstract base VirtualType with abstract base + VirtualMetaclassType with concrete base VirtualMetaclassType with concrete base + UnionType of structs UnionType of structs + ModuleType ModuleType + VirtualType with concrete base VirtualType with concrete base + GenericModuleInstanceType GenericModuleInstanceType +Semantic: enum + marks as flags with base type (#2185) marks as flags with base type (#2185) + can use macro expression inside enum can use macro expression inside enum + errors if using instance var inside enum (#991) errors if using instance var inside enum (#991) + errors if reopen and tries to define constant errors if reopen and tries to define constant + errors if invoking private enum method errors if invoking private enum method + disallows redefining None to non-0 for @[Flags] enum disallows redefining None to non-0 for @[Flags] enum + reopens enum with same base type (1) reopens enum with same base type (1) + gives error on unsigned flags enum overflow after a member with value gives error on unsigned flags enum overflow after a member with value + doesn't error when defining a non-flags enum with None or All doesn't error when defining a non-flags enum with None or All + errors if declaring type inside enum, nested (#3127) errors if declaring type inside enum, nested (#3127) + doesn't break assigned values in enum flags when a member has value 0 (#5767) doesn't break assigned values in enum flags when a member has value 0 (#5767) + gives error on flags enum overflow gives error on flags enum overflow + gives error on signed flags enum overflow after a member with value gives error on signed flags enum overflow after a member with value + gives error on enum overflow after a member with value gives error on enum overflow after a member with value + can use macro for inside enum can use macro for inside enum + reopens enum without base type (2) reopens enum without base type (2) + attaches annotation to enum method (#6690) attaches annotation to enum method (#6690) + doesn't overflow on flags member (#7877) doesn't overflow on flags member (#7877) + doesn't error when defining a method for an enum with flags doesn't error when defining a method for an enum with flags + disallows All value for @[Flags] enum disallows All value for @[Flags] enum + errors if enum value is too big for type (#678) errors if enum value is too big for type (#678) + types enum types enum + types enum value types enum value + errors on enum without members (#3447) errors on enum without members (#3447) + errors if declaring type inside enum (#3127) errors if declaring type inside enum (#3127) + finds class method in enum type finds class method in enum type + allows class vars in enum allows class vars in enum + creates enum from value creates enum from value + defines method on enum defines method on enum + doesn't overflow when going from negative to zero (#7874) doesn't overflow when going from negative to zero (#7874) + gives error on enum overflow gives error on enum overflow + disallows implicit conversion of int to enum disallows implicit conversion of int to enum + errors if reopening enum with different base type (1) errors if reopening enum with different base type (1) + errors if defining initialize in Enum (#7238) errors if defining initialize in Enum (#7238) + has All value when defined as @[Flags] has All value when defined as @[Flags] + errors if reopen but not enum errors if reopen but not enum + doesn't error when defining a flags enum in a lib with None or All doesn't error when defining a flags enum in a lib with None or All + allows redefining None to 0 for @[Flags] enum allows redefining None to 0 for @[Flags] enum + errors if inheriting Enum (#3592) errors if inheriting Enum (#3592) + defines class method on enum defines class method on enum + doesn't visit enum members generated by macros twice (#10104) doesn't visit enum members generated by macros twice (#10104) + finds method in enum type finds method in enum type + reopens enum with same base type (2) reopens enum with same base type (2) + reopens an enum reopens an enum + errors if using a name twice errors if using a name twice + reopens enum without base type (1) reopens enum without base type (1) + has None value when defined as @[Flags] has None value when defined as @[Flags] + can redefine Enum.new can redefine Enum.new + errors if reopening enum with different base type (2) errors if reopening enum with different base type (2) Code gen: tuple - codegens tuple [1..0]? codegens tuple [1..0]? - allows malloc pointer of tuple allows malloc pointer of tuple + codegens tuple metaclass [1..0] codegens tuple metaclass [1..0] + codegens union of tuple of float with tuple of tuple of float codegens union of tuple of float with tuple of tuple of float + downcasts union to mixed tuple type downcasts union to mixed tuple type + codegens tuple metaclass [0..0] codegens tuple metaclass [0..0] codegens tuple [0..1] codegens tuple [0..1] - codegens tuple [1] codegens tuple [1] + codegens tuple [0] codegens tuple [0] + assigns tuple inside union to union with compatible tuple assigns tuple inside union to union with compatible tuple + codegens tuple [1] (2) codegens tuple [1] (2) codegens tuple [2]? codegens tuple [2]? - codegens tuple [1..1]? codegens tuple [1..1]? - codegens splats inside tuples codegens splats inside tuples - provides T as a tuple literal provides T as a tuple literal - upcasts tuple union to compatible tuple upcasts tuple union to compatible tuple - assigns tuple to compatible tuple assigns tuple to compatible tuple - codegens tuple [0]? codegens tuple [0]? - codegens tuple [0..2]? codegens tuple [0..2]? - codegens tuple metaclass [0..1] codegens tuple metaclass [0..1] - merges two tuple types of same size (1) merges two tuple types of same size (1) - downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types codegens tuple [1..1] codegens tuple [1..1] - codegens tuple [0..0] codegens tuple [0..0] - codegens tuple metaclass [3..2]? codegens tuple metaclass [3..2]? + codegens tuple [0..0]? codegens tuple [0..0]? downcasts union inside tuple to value (#3907) downcasts union inside tuple to value (#3907) - codegens tuple class codegens tuple class + codegens tuple [2..2]? codegens tuple [2..2]? codegens tuple metaclass [2]? codegens tuple metaclass [2]? - downcasts union to mixed tuple type downcasts union to mixed tuple type - codegens tuple [0..1]? codegens tuple [0..1]? - assigns two same-size tuple types to a same var (#3132) assigns two same-size tuple types to a same var (#3132) + codegens splats inside tuples codegens splats inside tuples assigns tuple union to compatible tuple assigns tuple union to compatible tuple + codegens tuple metaclass [0..1] codegens tuple metaclass [0..1] + codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) + assigns two same-size tuple types to a same var (#3132) assigns two same-size tuple types to a same var (#3132) merges two tuple types of same size (2) merges two tuple types of same size (2) - codegens tuple [0] codegens tuple [0] - assigns tuple inside union to union with compatible tuple assigns tuple inside union to union with compatible tuple - codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) - codegens tuple [2..2]? codegens tuple [2..2]? codegens tuple [1..0] codegens tuple [1..0] - passed tuple to def passed tuple to def - codegens tuple metaclass [0..0] codegens tuple metaclass [0..0] - codegens union of tuple of float with tuple of tuple of float codegens union of tuple of float with tuple of tuple of float - codegens tuple [1]? codegens tuple [1]? + codegens tuple metaclass [0] codegens tuple metaclass [0] + codegens tuple [0..1]? codegens tuple [0..1]? + downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types codegens tuple [2..2] codegens tuple [2..2] - allows tuple covariance allows tuple covariance - passes empty tuple and empty named tuple to a method (#2852) passes empty tuple and empty named tuple to a method (#2852) - upcasts tuple inside union to union with compatible tuple upcasts tuple inside union to union with compatible tuple upcasts tuple inside compatible tuple upcasts tuple inside compatible tuple - gets size at compile time gets size at compile time - codegens tuple metaclass [1] codegens tuple metaclass [1] + passed tuple to def passed tuple to def + codegens tuple [1..0]? codegens tuple [1..0]? accesses T and creates instance from it accesses T and creates instance from it - codegens tuple [0..0]? codegens tuple [0..0]? + codegens tuple metaclass [3..2]? codegens tuple metaclass [3..2]? codegens tuple [0..2] codegens tuple [0..2] - codegens tuple metaclass [1..0] codegens tuple metaclass [1..0] - codegens tuple [1] (2) codegens tuple [1] (2) + codegens tuple [1]? codegens tuple [1]? + codegens tuple [1..1]? codegens tuple [1..1]? codegens tuple [3..2]? codegens tuple [3..2]? + upcasts tuple inside union to union with compatible tuple upcasts tuple inside union to union with compatible tuple + codegens tuple [1] codegens tuple [1] + codegens tuple class codegens tuple class + allows tuple covariance allows tuple covariance + provides T as a tuple literal provides T as a tuple literal + upcasts tuple union to compatible tuple upcasts tuple union to compatible tuple codegens tuple [-3..2]? codegens tuple [-3..2]? - codegens tuple metaclass [0] codegens tuple metaclass [0] -Semantic: def overload - dispatches with named arg dispatches with named arg - types a call with overload self in included module types a call with overload self in included module - doesn't crash on unknown metaclass doesn't crash on unknown metaclass - overloads on metaclass (#2916) overloads on metaclass (#2916) - types a call with overload matches virtual 2 types a call with overload matches virtual 2 - types a call with overload types a call with overload - matches a union argument with free var matches a union argument with free var - matches a generic module argument with free var matches a generic module argument with free var - gets free variable from union restriction gets free variable from union restriction - overloads on metaclass (2) (#2916) overloads on metaclass (2) (#2916) - matches tuple with underscore matches tuple with underscore - matches a union argument with free var, more types (2) matches a union argument with free var, more types (2) - says `no overload matches` instead of `can't instantiate abstract class` on wrong argument in new method says `no overload matches` instead of `can't instantiate abstract class` on wrong argument in new method - restricts on generic type with free type arg restricts on generic type with free type arg - uses method defined in base class if the restriction doesn't match uses method defined in base class if the restriction doesn't match - types a call with overload with yield after typing another call without yield types a call with overload with yield after typing another call without yield - matches a union argument with free var, more types (1) matches a union argument with free var, more types (1) - gives better error message with consecutive arguments sizes gives better error message with consecutive arguments sizes - reports no overload matches with correct method owner (#2083) reports no overload matches with correct method owner (#2083) - restricts union to generic class restricts union to generic class - types a call with overload type first overload types a call with overload type first overload - uses long name when no overload matches and name is the same (#1030) uses long name when no overload matches and name is the same (#1030) - matches generic class instance type with another one matches generic class instance type with another one - types a call with overload with yield types a call with overload with yield - overloads union against non-union (#2904) overloads union against non-union (#2904) - types a call with overload self other match types a call with overload self other match - doesn't match with wrong number of type arguments (#313) doesn't match with wrong number of type arguments (#313) - errors if no overload matches on union against named arg (#2640) errors if no overload matches on union against named arg (#2640) - prefers more specific overload than one with free variables prefers more specific overload than one with free variables - does not consider global paths as free variables (2) does not consider global paths as free variables (2) - errors when binding free variable to different types (2) errors when binding free variable to different types (2) - types a call with overload self types a call with overload self - matches types with free variables matches types with free variables - restrict virtual type with virtual type restrict virtual type with virtual type - treats single splats with same restriction as equivalent (#12579) treats single splats with same restriction as equivalent (#12579) - gives correct error message, looking up parent defs, when no overload matches gives correct error message, looking up parent defs, when no overload matches - errors when binding free variable to different types errors when binding free variable to different types - lookup matches in virtual type inside union lookup matches in virtual type inside union - matches a union metaclass argument with free var (#8071) matches a union metaclass argument with free var (#8071) - types a call with overload Object type first overload types a call with overload Object type first overload - errors if generic type doesn't match errors if generic type doesn't match - restricts on generic type without type arg restricts on generic type without type arg - errors if no overload matches on union against named arg with external param name (#10516) errors if no overload matches on union against named arg with external param name (#10516) - matches virtual type to union matches virtual type to union - types a call with overload self with inherited type types a call with overload self with inherited type - matches a generic module argument matches a generic module argument - dispatch call to def with restrictions dispatch call to def with restrictions - resets free vars after a partial match is rejected (#10270) resets free vars after a partial match is rejected (#10270) - treats single splats with same restriction as equivalent (2) (#12579) treats single splats with same restriction as equivalent (2) (#12579) - includes splat symbol in error message includes splat symbol in error message - can call overload with generic restriction can call overload with generic restriction - resets free vars after a partial match is rejected (2) (#10185) resets free vars after a partial match is rejected (2) (#10185) - single type restriction wins over union single type restriction wins over union - accepts overload with nilable type restriction accepts overload with nilable type restriction - does not consider global paths as free variables (1) does not consider global paths as free variables (1) - types a call with overload type second overload types a call with overload type second overload - compare_strictness - named parameters - double splat restriction vs double splat with stricter restriction double splat restriction vs double splat with stricter restriction - named parameter with stricter restriction vs double splat with restriction named parameter with stricter restriction vs double splat with restriction - named parameter with restriction vs double splat with stricter restriction named parameter with restriction vs double splat with stricter restriction - specificity specificity - double splat vs double splat with restriction double splat vs double splat with restriction - named parameter with restriction vs double splat (#5328) named parameter with restriction vs double splat (#5328) - named parameter vs double splat with restriction named parameter vs double splat with restriction - subsumption conflicts - positional vs named positional vs named - single splat vs double splat single splat vs double splat - named vs named named vs named - positional vs double splat positional vs double splat - single splat vs named single splat vs named - named vs double splat named vs double splat - positional vs positional positional vs positional - positional vs single splat positional vs single splat - specificity conflicts, named vs named - (required > optional) vs (required > optional) (required > optional) vs (required > optional) - (required > splat) vs (optional > splat) (required > splat) vs (optional > splat) - (required > optional) vs (optional > splat) (required > optional) vs (optional > splat) - (required > optional) vs (required > splat) (required > optional) vs (required > splat) - (optional > splat) vs (optional > splat) (optional > splat) vs (optional > splat) - (required > splat) vs (required > splat) (required > splat) vs (required > splat) - specificity conflicts, positional vs named - (required > splat) vs (required > splat) (required > splat) vs (required > splat) - (required > splat) vs (optional > splat) (required > splat) vs (optional > splat) - (required > splat) vs (required > optional) (required > splat) vs (required > optional) - (optional > splat) vs (optional > splat) (optional > splat) vs (optional > splat) - (optional > splat) vs (required > optional) (optional > splat) vs (required > optional) - (required > optional) vs (optional > splat) (required > optional) vs (optional > splat) - (required > optional) vs (required > splat) (required > optional) vs (required > splat) - (required > optional) vs (required > optional) (required > optional) vs (required > optional) - (optional > splat) vs (required > splat) (optional > splat) vs (required > splat) - subsumption has higher precedence over specificity - named vs (optional positional > single splat) named vs (optional positional > single splat) - positional vs (required positional > single splat) positional vs (required positional > single splat) - same named parameter, required > double splat same named parameter, required > double splat - double splat vs (required positional > single splat) double splat vs (required positional > single splat) - single splat vs (required named > double splat) single splat vs (required named > double splat) - positional vs (required named > optional named) positional vs (required named > optional named) - positional vs (optional named > double splat) positional vs (optional named > double splat) - double splat vs (required positional > optional positional) double splat vs (required positional > optional positional) - named vs (required named > optional named) named vs (required named > optional named) - same positional parameter, required > optional same positional parameter, required > optional - same positional parameter, optional > single splat same positional parameter, optional > single splat - same named parameter, required > optional same named parameter, required > optional - positional vs (required positional > optional positional) positional vs (required positional > optional positional) - positional vs (required named > double splat) positional vs (required named > double splat) - named vs (required positional > optional positional) named vs (required positional > optional positional) - positional vs (optional positional > single splat) positional vs (optional positional > single splat) - double splat vs (optional positional > single splat) double splat vs (optional positional > single splat) - named vs (required positional > single splat) named vs (required positional > single splat) - same positional parameter, required > single splat same positional parameter, required > single splat - named vs (optional named > double splat) named vs (optional named > double splat) - single splat vs (required named > optional named) single splat vs (required named > optional named) - single splat vs (optional named > double splat) single splat vs (optional named > double splat) - same named parameter, optional > double splat same named parameter, optional > double splat - named vs (required named > double splat) named vs (required named > double splat) - positional parameters - single splat vs single splat with restriction (#3134) single splat vs single splat with restriction (#3134) - positional parameter with stricter restriction vs single splat with restriction positional parameter with stricter restriction vs single splat with restriction - single splat restriction vs single splat with stricter restriction single splat restriction vs single splat with stricter restriction - positional parameter vs single splat with restriction positional parameter vs single splat with restriction - specificity specificity - positional parameter with restriction vs single splat positional parameter with restriction vs single splat - positional parameter with restriction vs single splat with stricter restriction positional parameter with restriction vs single splat with stricter restriction - considers NamedTuple in a module's including types (#10380) considers NamedTuple in a module's including types (#10380) - can call overload with aliased generic restriction can call overload with aliased generic restriction - overloads with named argument (#4465) overloads with named argument (#4465) - types a call with overload matches virtual 3 types a call with overload matches virtual 3 - finds method after including module in generic module (#1201) finds method after including module in generic module (#1201) - types a call with overload selecting the most restrictive 2 types a call with overload selecting the most restrictive 2 - compare self type with others compare self type with others - matches tuples and uses free var matches tuples and uses free var - types a call with overload selecting the most restrictive types a call with overload selecting the most restrictive - matches on partial union matches on partial union - gets free variable from union restriction without a union gets free variable from union restriction without a union - filter union type with virtual filter union type with virtual - dispatch call to def with restrictions dispatch call to def with restrictions - types a call with overload with yield the other way types a call with overload with yield the other way - types a call with overload matches virtual types a call with overload matches virtual - matches a generic module argument with free var (2) matches a generic module argument with free var (2) - restrict matches to minimum necessary 1 restrict matches to minimum necessary 1 - types a call with overload self in included module other type types a call with overload self in included module other type - doesn't match tuples of different sizes doesn't match tuples of different sizes - matches tuples of different sizes matches tuples of different sizes - errors if union restriction has multiple free vars (2) errors if union restriction has multiple free vars (2) - errors if union restriction has multiple free vars errors if union restriction has multiple free vars - gets free variable from union restriction (2) gets free variable from union restriction (2) - overloads on metaclass (3) (#2916) overloads on metaclass (3) (#2916) -Code gen: pointer - gets pointer of instance variable in virtual type gets pointer of instance variable in virtual type - gets pointer to constant gets pointer to constant gets pointer to constant gets pointer to constant gets pointer to constant gets pointer to constant gets pointer to constant gets pointer to constant gets pointer to constant gets pointer to constant - increments pointer increments pointer - creates pointer by address creates pointer by address - can pass any pointer to something expecting void* in lib call, with to_unsafe can pass any pointer to something expecting void* in lib call, with to_unsafe - sets value of pointer to struct sets value of pointer to struct - takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var - generates correct code for Pointer.malloc(0) (#2905) generates correct code for Pointer.malloc(0) (#2905) - compares pointers through typedef compares pointers through typedef - can pass any pointer to something expecting void* in lib call can pass any pointer to something expecting void* in lib call - does pointerof read variable does pointerof read variable - codegens realloc codegens realloc - codegens pointer cast codegens pointer cast - codegens nilable pointer type dispatch (2) codegens nilable pointer type dispatch (2) - can use typedef pointer value get and set (#630) can use typedef pointer value get and set (#630) - does pointerof class variable with class does pointerof class variable with class - does pointerof class variable does pointerof class variable - uses correct llvm module for typedef metaclass (#2877) uses correct llvm module for typedef metaclass (#2877) - gets pointer of argument that is never assigned to gets pointer of argument that is never assigned to - codegens pointer cast to Nil (#8015) codegens pointer cast to Nil (#8015) - passes pointer of pointer to method passes pointer of pointer to method - sets value of pointer to union sets value of pointer to union - get value of pointer to union get value of pointer to union - get pointer of instance var get pointer of instance var - can dereference pointer to func can dereference pointer to func - codegens nilable pointer type dispatch (1) codegens nilable pointer type dispatch (1) - get pointer and value of it get pointer and value of it - codegens nilable pointer type (2) codegens nilable pointer type (2) - passes arguments correctly for typedef metaclass (#8544) passes arguments correctly for typedef metaclass (#8544) - codegens nilable pointer type (1) codegens nilable pointer type (1) - codegens null pointer as if condition codegens null pointer as if condition - set pointer value set pointer value - calculates pointer diff calculates pointer diff - codegens malloc codegens malloc - assigns nil and pointer to nilable pointer type assigns nil and pointer to nilable pointer type - codegens pointer as if condition inside union (1) codegens pointer as if condition inside union (1) - can assign nil to void pointer can assign nil to void pointer - codegens pointer as if condition inside union (2) codegens pointer as if condition inside union (2) - codegens pointer as if condition codegens pointer as if condition - changes through var and reads from pointer changes through var and reads from pointer + gets size at compile time gets size at compile time + merges two tuple types of same size (1) merges two tuple types of same size (1) + codegens tuple metaclass [1] codegens tuple metaclass [1] + allows malloc pointer of tuple allows malloc pointer of tuple + codegens tuple [0]? codegens tuple [0]? + assigns tuple to compatible tuple assigns tuple to compatible tuple + codegens tuple [0..0] codegens tuple [0..0] + passes empty tuple and empty named tuple to a method (#2852) passes empty tuple and empty named tuple to a method (#2852) + codegens tuple [0..2]? codegens tuple [0..2]? +Code gen: def with default value + codegens def with one default value codegens def with one default value + resolves expanded call to current type, not to virtual type resolves expanded call to current type, not to virtual type + doesn't mix types of instance vars with initialize and new doesn't mix types of instance vars with initialize and new + codegens def new with one default value codegens def new with one default value + considers first the one with a restriction considers first the one with a restriction + considers first the one with more arguments considers first the one with more arguments +Codegen: double splat + double splats named argument into arguments (2) double splats named argument into arguments (2) + matches double splat on method with named args matches double splat on method with named args + matches double splat with regular splat matches double splat with regular splat + removes literal types in all matches (#6239) removes literal types in all matches (#6239) + matches double splat on method with named args and regular args matches double splat on method with named args and regular args + double splats named argument into arguments (1) double splats named argument into arguments (1) + double splats named argument with positional arguments double splats named argument with positional arguments + double splats named argument with named args (1) double splats named argument with named args (1) + evaluates double splat argument just once (#2677) evaluates double splat argument just once (#2677) + double splats named argument with named args (2) double splats named argument with named args (2) + double splats twice double splats twice +Code gen: C ABI x86_64 + passes struct bigger than128 bits with byval passes struct bigger than128 bits with byval + passes struct less than 64 bits as { i64 } in varargs passes struct less than 64 bits as { i64 } in varargs + passes struct less than 64 bits as { i64 } passes struct less than 64 bits as { i64 } + passes struct between 64 and 128 bits as { i64, i64 } (with multiple modules/contexts) passes struct between 64 and 128 bits as { i64, i64 } (with multiple modules/contexts) + passes struct between 64 and 128 bits as { i64, i64 } passes struct between 64 and 128 bits as { i64, i64 } + returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret + returns struct less than 64 bits as { i64 } returns struct less than 64 bits as { i64 } + returns struct between 64 and 128 bits as { i64, i64 } returns struct between 64 and 128 bits as { i64, i64 } +Code gen: class + never considers read instance var as closure (#12181) never considers read instance var as closure (#12181) + builds generic class bug builds generic class bug + codegens assignment of generic metaclasses, base is non-generic (2) (#10394) codegens assignment of generic metaclasses, base is non-generic (2) (#10394) + runs instance variable initializer at the class level runs instance variable initializer at the class level + reads a union type instance var (mixed union, second type) reads a union type instance var (mixed union, second type) + assigns type to reference union type assigns type to reference union type + codegens virtual call that calls another method codegens virtual call that calls another method + runs instance variable initializer at the class level, for generic type runs instance variable initializer at the class level, for generic type + allows initializing var with constant allows initializing var with constant + doesn't crash if not using undefined instance variable in superclass doesn't crash if not using undefined instance variable in superclass + reads other instance var reads other instance var + codegens assignment of generic metaclasses, base is non-generic (1) (#10394) codegens assignment of generic metaclasses, base is non-generic (1) (#10394) + doesn't crash on instance variable assigned a proc, and never instantiated (#923) doesn't crash on instance variable assigned a proc, and never instantiated (#923) + does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) + invokes class method inside instance method (#1119) invokes class method inside instance method (#1119) + makes .class always be a virtual type even if no subclasses makes .class always be a virtual type even if no subclasses + codegens recursive type codegens recursive type + doesn't crash on #1216 (reduced) doesn't crash on #1216 (reduced) + changes instance variable in method (ssa bug) changes instance variable in method (ssa bug) + codegens method call of instance var codegens method call of instance var + transfers initializer from generic module to non-generic class transfers initializer from generic module to non-generic class + codegens virtual metaclass union bug (#2597) codegens virtual metaclass union bug (#2597) + codegens new which calls initialize codegens new which calls initialize + works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) + can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) + codegens virtual class method codegens virtual class method + runs with nil instance var when inheriting runs with nil instance var when inheriting + reads a union type instance var (reference union, first type) reads a union type instance var (reference union, first type) + reads a union type instance var (reference union, second type) reads a union type instance var (reference union, second type) + allows using self in class scope allows using self in class scope + doesn't crash on #1216 with pointerof doesn't crash on #1216 with pointerof + doesn't crash on abstract class never instantiated (#2840) doesn't crash on abstract class never instantiated (#2840) + notifies superclass recursively on inheritance (#576) notifies superclass recursively on inheritance (#576) + codegens singleton (#718) codegens singleton (#718) + doesn't crash on #1216 doesn't crash on #1216 + codegens initialize with instance var codegens initialize with instance var + calls class method without self calls class method without self + calls class method without self (2) calls class method without self (2) + codegens class with recursive tuple to class (#4520) codegens class with recursive tuple to class (#4520) + doesn't skip false initializers (#3272) doesn't skip false initializers (#3272) + codegens class method codegens class method + reads a union type instance var (mixed union, first type) reads a union type instance var (mixed union, first type) + codegens method of class union including Int (#1476) codegens method of class union including Int (#1476) + codegens virtual generic class instance metaclass (#3819) codegens virtual generic class instance metaclass (#3819) + codegens bug #168 codegens bug #168 + can assign virtual metaclass to virtual metaclass (#3007) can assign virtual metaclass to virtual metaclass (#3007) + doesn't skip zero initializers (#3272) doesn't skip zero initializers (#3272) + codegens virtual method of generic class codegens virtual method of generic class + codegens assignment of generic metaclasses (4) (#10394) codegens assignment of generic metaclasses (4) (#10394) + codegens call to same instance codegens call to same instance + resolves type declaration when accessing instance var (#348) resolves type declaration when accessing instance var (#348) + codegens method from another method without obj and accesses instance vars codegens method from another method without obj and accesses instance vars + runs with nilable instance var runs with nilable instance var + gets class of virtual type gets class of virtual type + does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class + works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) + reads a virtual type instance var reads a virtual type instance var + transfers initializer from generic module to generic class transfers initializer from generic module to generic class + does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class + codegens assignment of generic metaclasses (1) (#10394) codegens assignment of generic metaclasses (1) (#10394) + codegens instance var codegens instance var + allows fixing an instance variable's type allows fixing an instance variable's type + allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope + does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) + uses number type var uses number type var + codegens assignment of generic metaclasses (3) (#10394) codegens assignment of generic metaclasses (3) (#10394) + does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) + codegens assignment of generic metaclasses (2) (#10394) codegens assignment of generic metaclasses (2) (#10394) + calls method on Class class calls method on Class class + transfers initializer from module to generic class transfers initializer from module to generic class +Crystal::Config + .host_target .host_target + .linux_runtime_libc .linux_runtime_libc +Code gen: no return + codegens no return variable declaration (#1508) codegens no return variable declaration (#1508) + codegens if with no return and variable used afterwards codegens if with no return and variable used afterwards + codegens no return instance variable declaration (#1508) codegens no return instance variable declaration (#1508) + codegen types exception handler as NoReturn if ensure is NoReturn codegen types exception handler as NoReturn if ensure is NoReturn + codegens Pointer(NoReturn).malloc codegens Pointer(NoReturn).malloc + codegens if with NoReturn on then and union on else codegens if with NoReturn on then and union on else + codegens untyped typeof (#5105) codegens untyped typeof (#5105) + codegens call with no return because of falsey if (#3661) codegens call with no return because of falsey if (#3661) +Crystal + normalize_path + assert assert + assert assert + assert assert + assert assert +Code gen: debug + codegens extern union (#7335) codegens extern union (#7335) + doesn't emit debug info for unused variable declarations (#9882) doesn't emit debug info for unused variable declarations (#9882) + codegens correct debug info for untyped expression (#4007 and #4008) codegens correct debug info for untyped expression (#4007 and #4008) + has debug info in closure inside if (#5593) has debug info in closure inside if (#5593) + stores and restores debug location after jumping to main (2) stores and restores debug location after jumping to main (2) + doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals + doesn't fail on constant read calls (#11416) doesn't fail on constant read calls (#11416) + stores and restores debug location after jumping to main (#6920) stores and restores debug location after jumping to main (#6920) + codegens abstract struct (#3578) codegens abstract struct (#3578) + stores and restores debug location after jumping to main (3) stores and restores debug location after jumping to main (3) + codegens lib union (#7335) codegens lib union (#7335) + doesn't emit incorrect debug info for closured self doesn't emit incorrect debug info for closured self + codegens correct debug info for new with custom allocate (#3945) codegens correct debug info for new with custom allocate (#3945) + inlines instance var access through getter in debug mode inlines instance var access through getter in debug mode + correctly restores debug location after fun change (#4254) correctly restores debug location after fun change (#4254) + has correct debug location after constant initialization in call with block (#4719) has correct debug location after constant initialization in call with block (#4719) +Code gen: C ABI + returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) + promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) + passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) + passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) + passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) + promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) + accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) + returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) + promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) + returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret + passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) + promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) + promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) + passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) +Crystal::Repl::Interpreter + special vars + does special var that's a reference when there are optional arguments does special var that's a reference when there are optional arguments + does special var that's a struct does special var that's a struct + sets special var inside call inside block (#12250) sets special var inside call inside block (#12250) + does special var that's a reference for multidispatch does special var that's a reference for multidispatch + does special var that's a reference inside block does special var that's a reference inside block + does special var that's a reference does special var that's a reference +Crystal::Doc::Generator + crystal repo + inserts pseudo methods inserts pseudo methods + generates sitemap generates sitemap + #collect_constants + returns empty array when constants are private returns empty array when constants are private + #formatted_summary + should generate the first sentence should generate the first sentence + should generate the first line should generate the first line + with a Experimental annotation, and docs + should generate both the docs and Experimental tag should generate both the docs and Experimental tag + with a Deprecated annotation, and no docs + should generate just the Deprecated tag should generate just the Deprecated tag + with a Deprecated annotation, and docs + should generate both the docs and Deprecated tag should generate both the docs and Deprecated tag + with a Experimental annotation, and no docs + should generate just the Experimental tag should generate just the Experimental tag + should exclude whitespace before the summary line should exclude whitespace before the summary line + with no annotation, and no docs + should generate nothing should generate nothing + #formatted_doc + with a Deprecated annotation, and docs + should generate both the docs and Deprecated tag should generate both the docs and Deprecated tag + with a Experimental annotation, and docs + should generate both the docs and Experimental tag should generate both the docs and Experimental tag + with a Deprecated annotation, and no docs + should generate just the Deprecated tag should generate just the Deprecated tag + should generate the full document should generate the full document + with a Experimental annotation, and no docs + should generate just the Experimental tag should generate just the Experimental tag + with no annotation, and no docs + should generate nothing should generate nothing + should generate the full document should generate the full document + #must_include_toplevel? + returns true if program has constant returns true if program has constant + returns false if program has nothing returns false if program has nothing + returns false if program has constant which is defined in other place returns false if program has constant which is defined in other place + returns false if program has macro which is defined in other place returns false if program has macro which is defined in other place + returns false if program has method which is defined in other place returns false if program has method which is defined in other place + returns true if program has macro returns true if program has macro + returns true if program has method returns true if program has method +Code gen: hooks + does included macro does included macro + does extended macro does extended macro + does inherited macro does inherited macro + fixes empty types in hooks (#3946) fixes empty types in hooks (#3946) + does inherited macro recursively does inherited macro recursively + does finished does finished + does added method macro does added method macro + does inherited macro before class body does inherited macro before class body does inherited macro before class body does inherited macro before class body does inherited macro before class body does inherited macro before class body does inherited macro before class body does inherited macro before class body does inherited macro before class body does inherited macro before class body +Semantic: union + treats void as nil in union treats void as nil in union + commutativity + uninstantiated generic super-metaclass v.s. uninstantiated generic sub-metaclass uninstantiated generic super-metaclass v.s. uninstantiated generic sub-metaclass + superclass v.s. uninstantiated generic subclass superclass v.s. uninstantiated generic subclass + generic module instance v.s. including module generic module instance v.s. including module + module v.s. extending generic module instance metaclass module v.s. extending generic module instance metaclass + module v.s. including generic module instance module v.s. including generic module instance + generic module instance v.s. extending generic module instance metaclass generic module instance v.s. extending generic module instance metaclass + generic module instance v.s. including generic module instance generic module instance v.s. including generic module instance + virtual metaclass v.s. generic subclass instance metaclass virtual metaclass v.s. generic subclass instance metaclass + module v.s. including module module v.s. including module + doesn't run virtual lookup on unbound unions (#9173) doesn't run virtual lookup on unbound unions (#9173) + errors if instantiates union errors if instantiates union + can reopen Union and access T can reopen Union and access T + supports macro if inside union supports macro if inside union + types union when arg is union types union when arg is union + doesn't virtualize union elements (#7814) doesn't virtualize union elements (#7814) + can reopen Union can reopen Union + types union when obj is union types union when obj is union + types union of same type types union of same type + finds method in Object finds method in Object + can iterate T can iterate T + types union types union + assigns to union and keeps new union type in call assigns to union and keeps new union type in call + doesn't crash with union of no-types (#5805) doesn't crash with union of no-types (#5805) + types union of classes types union of classes + looks up type in union type with free var looks up type in union type with free var + merges types in the same hierarchy with Union merges types in the same hierarchy with Union + can use Union in type restriction (#2988) can use Union in type restriction (#2988) + types union when both obj and arg are union types union when both obj and arg are union + finds method in Value finds method in Value +Crystal::Doc::Method + args_to_s + shows typeof restriction of arg with highlighting shows typeof restriction of arg with highlighting + shows block args shows block args + shows block args with underscore shows block args with underscore + shows return type restriction shows return type restriction + shows double splat args shows double splat args + shows block args if a def has `yield` shows block args if a def has `yield` + shows external name of arg with quotes and escaping shows external name of arg with quotes and escaping + shows splat args shows splat args + shows default value of arg with highlighting shows default value of arg with highlighting + shows simple args shows simple args + shows external name of arg shows external name of arg + shows underscore restriction shows underscore restriction + shows args and return type restriction shows args and return type restriction + doc + inherits doc from previous def (no extra comment) inherits doc from previous def (no extra comment) + trailing comment is not a doc comment trailing comment is not a doc comment + inherits doc from ancestor (no extra comment) inherits doc from ancestor (no extra comment) + trailing comment is not part of a doc comment trailing comment is not part of a doc comment + gets doc from underlying method gets doc from underlying method + inherits doc from ancestor (use :inherit: plus more content) inherits doc from ancestor (use :inherit: plus more content) + inherits doc from ancestor (use :inherit:) inherits doc from ancestor (use :inherit:) +Semantic: restrictions augmenter + augments Char | Int32 | String augments Char | Int32 | String + augments Char | Int32 | String augments Char | Int32 | String + doesn't augment if the no_restrictions_augmenter flag is present doesn't augment if the no_restrictions_augmenter flag is present + augments String augments String + augments Symbol augments Symbol + augments Char augments Char + doesn't augment if assigned inside if doesn't augment if assigned inside if + augments generic uninstantiated type augments generic uninstantiated type + augments StaticArray(Int32, 8) augments StaticArray(Int32, 8) + augments relative public type augments relative public type + augments for class var augments for class var + augments Tuple(Int32, Char) augments Tuple(Int32, Char) + augments relative private type augments relative private type + doesn't augment if assigned inside block doesn't augment if assigned inside block + augments NoReturn augments NoReturn + augments Array(Int32).class augments Array(Int32).class + augments typedef augments typedef + doesn't augment if assigned inside while doesn't augment if assigned inside while + augments Float32 augments Float32 + augments Int32 augments Int32 + augments Proc(Int32, Char) augments Proc(Int32, Char) + augments recursive alias type (#12134) augments recursive alias type (#12134) + augments Bool augments Bool + augments type splat augments type splat + augments Pointer(Void) augments Pointer(Void) + augments Enumerable(Int32).class augments Enumerable(Int32).class + augments NamedTuple(a: Int32, b: Char) augments NamedTuple(a: Int32, b: Char) + augments for Union(*T) (#12435) augments for Union(*T) (#12435) + augments Nil augments Nil + augments virtual type augments virtual type + augments Proc(Int32, Nil) augments Proc(Int32, Nil) + augments relative private type in same namespace augments relative private type in same namespace + augments Int32.class augments Int32.class + augments Array(String) augments Array(String) + doesn't crash on macro that yields and defines class (#12142) doesn't crash on macro that yields and defines class (#12142) + augments virtual metaclass type augments virtual metaclass type +Codegen: class var + doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) + accesses class var from proc literal accesses class var from proc literal + codegens class var as nil codegens class var as nil + codegens class var codegens class var + codegens class var with nilable reference type codegens class var with nilable reference type + doesn't use nilable type for initializer doesn't use nilable type for initializer + doesn't inherit class var value in module doesn't inherit class var value in module + codegens class var with begin and vars codegens class var with begin and vars + initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var + gets pointerof class var gets pointerof class var + reads class var from virtual type reads class var from virtual type + initializes class var of union with single type initializes class var of union with single type + codegens class var as nil if assigned for the first time inside method codegens class var as nil if assigned for the first time inside method + declares and initializes declares and initializes + gets pointerof class var complex constant gets pointerof class var complex constant + inline initialization of simple class var inline initialization of simple class var + codegens second class var initializer codegens second class var initializer + runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) + reads class var before initializing it (hoisting) reads class var before initializing it (hoisting) + doesn't inherit class var value in subclass doesn't inherit class var value in subclass + codegens class var inside module codegens class var inside module + initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it + doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module + catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer + codegens class var with type declaration begin and vars codegens class var with type declaration begin and vars + reads class var from virtual type metaclass reads class var from virtual type metaclass + codegens class var inside instance method codegens class var inside instance method + codegens generic class with class var codegens generic class with class var + reads simple class var before another complex one reads simple class var before another complex one + declares var as uninitialized and initializes it unsafely declares var as uninitialized and initializes it unsafely + uses var in class var initializer uses var in class var initializer + writes class var from virtual type writes class var from virtual type + initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal +immutability of returned container literals (#10818) + Annotation#args Annotation#args + When#conds When#conds + Generic#type_vars Generic#type_vars + MultiAssign#targets MultiAssign#targets + ProcPointer#args ProcPointer#args + StringInterpolation#expressions StringInterpolation#expressions + Union#types Union#types + MultiAssign#values MultiAssign#values + ProcNotation#inputs ProcNotation#inputs Crystal::Repl::Interpreter calls - does call on read instance var that's a struct, takes a pointer to instance var does call on read instance var that's a struct, takes a pointer to instance var - interprets self for primitive types interprets self for primitive types + inlines method that just reads an instance var (2) inlines method that just reads an instance var (2) + puts struct pointer after tuple indexer puts struct pointer after tuple indexer + mutates through pointer (1) mutates through pointer (1) + mutates through pointer (3) mutates through pointer (3) + does call on instance var that's a struct, from a struct does call on instance var that's a struct, from a struct mutates call argument mutates call argument - calls a top-level method with two arguments calls a top-level method with two arguments - inlines call that returns self (2) inlines call that returns self (2) - mutates through inlined instance var without receiver mutates through inlined instance var without receiver - does Assign var with wants_struct_pointer does Assign var with wants_struct_pointer + calls a top-level method without arguments and no local vars calls a top-level method without arguments and no local vars does call with struct as obj (2) does call with struct as obj (2) - interprets call with default values interprets call with default values - mutates through pointer (2) mutates through pointer (2) - does Assign class var with wants_struct_pointer does Assign class var with wants_struct_pointer - does call with struct as obj does call with struct as obj + does Assign var with wants_struct_pointer does Assign var with wants_struct_pointer discards call with struct as obj discards call with struct as obj - mutates through pointer (1) mutates through pointer (1) - inlines method that just reads an instance var inlines method that just reads an instance var + does call on ivar that's a struct, takes a pointer to instance var, inside if does call on ivar that's a struct, takes a pointer to instance var, inside if + does call on read instance var that's a struct, takes a pointer to instance var does call on read instance var that's a struct, takes a pointer to instance var + mutates through inlined instance var with receiver mutates through inlined instance var with receiver + inlines call that returns self inlines call that returns self + interprets self for primitive types interprets self for primitive types + interprets explicit self call for primitive types interprets explicit self call for primitive types + mutates through read instance var mutates through read instance var does call on constant that's a struct, takes a pointer to instance var, inside if does call on constant that's a struct, takes a pointer to instance var, inside if - calls a top-level method without arguments and no local vars calls a top-level method without arguments and no local vars - does call on Pointer#value that's a struct, takes a pointer to instance var does call on Pointer#value that's a struct, takes a pointer to instance var + inlines method that just reads an instance var, but produces side effects of args inlines method that just reads an instance var, but produces side effects of args + inlines method that just reads an instance var inlines method that just reads an instance var calls a top-level method without arguments but with local vars calls a top-level method without arguments but with local vars - mutates through pointer (3) mutates through pointer (3) - does call on ivar that's a struct, takes a pointer to instance var, inside if does call on ivar that's a struct, takes a pointer to instance var, inside if - puts struct pointer after tuple indexer puts struct pointer after tuple indexer + mutates through inlined instance var without receiver mutates through inlined instance var without receiver does Assign instance var with wants_struct_pointer does Assign instance var with wants_struct_pointer - does call on var that's a struct, takes a pointer to instance var, inside if does call on var that's a struct, takes a pointer to instance var, inside if does call on constant that's a struct, takes a pointer to instance var does call on constant that's a struct, takes a pointer to instance var - mutates through read instance var mutates through read instance var - inlines call that returns self inlines call that returns self - does call on instance var that's a struct, from a struct does call on instance var that's a struct, from a struct - does ReadInstanceVar with wants_struct_pointer does ReadInstanceVar with wants_struct_pointer + interprets call with default values interprets call with default values + does call on var that's a struct, takes a pointer to instance var, inside if does call on var that's a struct, takes a pointer to instance var, inside if + does call with struct as obj does call with struct as obj + does Assign class var with wants_struct_pointer does Assign class var with wants_struct_pointer + interprets implicit self call for pointer interprets implicit self call for pointer + interprets call with if interprets call with if + interprets call with named arguments interprets call with named arguments + calls a top-level method with two arguments calls a top-level method with two arguments does call on self that's a struct, takes a pointer to instance var, inside if does call on self that's a struct, takes a pointer to instance var, inside if + does call on Pointer#value that's a struct, takes a pointer to instance var does call on Pointer#value that's a struct, takes a pointer to instance var does call on instance var that's a struct, from a class does call on instance var that's a struct, from a class - inlines method that just reads an instance var, but produces side effects of args inlines method that just reads an instance var, but produces side effects of args - interprets explicit self call for primitive types interprets explicit self call for primitive types - mutates through inlined instance var with receiver mutates through inlined instance var with receiver - interprets call with named arguments interprets call with named arguments - interprets call with if interprets call with if - inlines method that just reads an instance var (2) inlines method that just reads an instance var (2) - interprets implicit self call for pointer interprets implicit self call for pointer -codegen: previous_def - correctly passes named arguments correctly passes named arguments - codegens previous def when inside fun with self codegens previous def when inside fun with self - codegens previous def when inside fun and forwards args codegens previous def when inside fun and forwards args - codegens previous def codegens previous def -Code gen: generic class type - allows initializing instance variable (#665) allows initializing instance variable (#665) - runs generic instance var initializers in superclass's metaclass context (#4753) runs generic instance var initializers in superclass's metaclass context (#4753) - uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) - doesn't consider abstract types for including types (#7200) doesn't consider abstract types for including types (#7200) - inherited instance var initialize from generic to concrete (#2128) inherited instance var initialize from generic to concrete (#2128) - codegens virtual generic metaclass macro method call codegens virtual generic metaclass macro method call - invokes super in generic class (#2354) invokes super in generic class (#2354) - codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 - codegens static array size after instantiating codegens static array size after instantiating - codegens inherited generic class instance var codegens inherited generic class instance var - doesn't crash on generic type restriction with initially no subtypes (#8411) doesn't crash on generic type restriction with initially no subtypes (#8411) - doesn't use virtual + in type arguments for Tuple (#2839) doesn't use virtual + in type arguments for Tuple (#2839) - doesn't use virtual + in type arguments (#2839) doesn't use virtual + in type arguments (#2839) - doesn't use virtual + in type arguments for NamedTuple (#2839) doesn't use virtual + in type arguments for NamedTuple (#2839) - allows initializing instance variable in inherited generic type allows initializing instance variable in inherited generic type - runs generic instance var initializers in superclass's metaclass context (2) (#6482) runs generic instance var initializers in superclass's metaclass context (2) (#6482) - declares instance var with virtual T (#1675) declares instance var with virtual T (#1675) - instantiates generic class with default argument in initialize (#394) instantiates generic class with default argument in initialize (#394) - inherited instance var initialize from generic to generic to concrete (#2128) inherited instance var initialize from generic to generic to concrete (#2128) - doesn't run generic instance var initializers in formal superclass's context (#4753) doesn't run generic instance var initializers in formal superclass's context (#4753) - recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) - doesn't override guessed instance var in generic type if already declared in superclass (#9431) doesn't override guessed instance var in generic type if already declared in superclass (#9431) - doesn't consider abstract generic instantiation when restricting type (#5190) doesn't consider abstract generic instantiation when restricting type (#5190) - doesn't crash on generic type restriction with no subtypes (#7583) doesn't crash on generic type restriction with no subtypes (#7583) -Crystal::Repl::Interpreter - closures - closures def arguments closures def arguments - does nested closure inside proc does nested closure inside proc - does closure with two args that captures and modifies two local variables does closure with two args that captures and modifies two local variables - does closure inside class variable initializer does closure inside class variable initializer - does closure inside proc, capture proc argument does closure inside proc, capture proc argument - gets ivar of self closured struct (#12341) gets ivar of self closured struct (#12341) - closures struct and calls method on it closures struct and calls method on it - sets ivar of self closured struct (#12341) sets ivar of self closured struct (#12341) - does nested closure inside captured blocks does nested closure inside captured blocks - does closure inside block does closure inside block - closures self in proc literal closures self in proc literal - does closure inside const does closure inside const - does closure with pointerof local var does closure with pointerof local var - does closure without args that captures and modifies two local variables does closure without args that captures and modifies two local variables - does closure and accesses it inside block does closure and accesses it inside block - closures self in proc literal (implicit self) closures self in proc literal (implicit self) - passes closured struct instance var as self passes closured struct instance var as self - reads self closured struct (#12341) reads self closured struct (#12341) - doesn't mix local vars with closured vars doesn't mix local vars with closured vars - does closure without args that captures and modifies one local variable does closure without args that captures and modifies one local variable - does closure inside proc does closure inside proc - closures self and modifies instance var closures self and modifies instance var - does nested closure inside methods and blocks does nested closure inside methods and blocks - does next inside captured block (#12226) does next inside captured block (#12226) - does closure inside block, capture block arg does closure inside block, capture block arg - does closure inside def does closure inside def - closures block args after 8 bytes (the closure var) closures block args after 8 bytes (the closure var) - closures closured block arg closures closured block arg -Semantic: class - errors if reopening generic class with different type vars errors if reopening generic class with different type vars - types class and subclass as one type types class and subclass as one type - correctly types #680 (2) correctly types #680 (2) - uses number type var in class method uses number type var in class method - errors if reopening generic class with different splat index errors if reopening generic class with different splat index - can't reopen as module can't reopen as module - types as no return if calling method on abstract generic class (#6996) types as no return if calling method on abstract generic class (#6996) - reports can't instantiate abstract class on allocate reports can't instantiate abstract class on allocate - can invoke method on abstract generic type with subclasses but no instances can invoke method on abstract generic type with subclasses but no instances - types virtual method of generic class types virtual method of generic class - can't reopen as struct can't reopen as struct - errors if reopening generic class with different splat index (3) errors if reopening generic class with different splat index (3) - reports wrong number of arguments for initialize reports wrong number of arguments for initialize - does automatic inference of new for generic types does automatic inference of new for generic types - inherits Gen(self) (#2890) inherits Gen(self) (#2890) - errors when wrong arguments for new errors when wrong arguments for new - types recursive type types recursive type - reports undefined method when method inside a class reports undefined method when method inside a class - does automatic type inference of new for nested generic type does automatic type inference of new for nested generic type - doesn't lookup new in supermetaclass doesn't lookup new in supermetaclass - errors if reopening generic class with different splat index (2) errors if reopening generic class with different splat index (2) - reads an object instance var reads an object instance var - types Const#new types Const#new - uses self as type var uses self as type var - errors when creating Number errors when creating Number - errors if reopening generic class with different type vars (2) errors if reopening generic class with different type vars (2) - errors if declares class inside if errors if declares class inside if - types Const#allocate types Const#allocate - types bug #168 (it inherits instance var even if not mentioned in initialize) types bug #168 (it inherits instance var even if not mentioned in initialize) - errors if inherits from module errors if inherits from module - doesn't mark instance variable as nilable if calling another initialize doesn't mark instance variable as nilable if calling another initialize - errors when creating Value errors when creating Value - errors if inherits from metaclass errors if inherits from metaclass - types as no return if calling method on generic class with subclasses (#6996) types as no return if calling method on generic class with subclasses (#6996) - types instance variable on getter types instance variable on getter - can invoke method on abstract generic type without subclasses nor instances can invoke method on abstract generic type without subclasses nor instances - types self inside method call without obj types self inside method call without obj - allows instantiating generic class with number allows instantiating generic class with number - can invoke method on abstract type without subclasses nor instances can invoke method on abstract type without subclasses nor instances - does automatic type inference of new for generic types 2 does automatic type inference of new for generic types 2 - types Const#new#method types Const#new#method - types instance variable types instance variable - types class and subclass as one type types class and subclass as one type - doesn't use initialize from base class with virtual type doesn't use initialize from base class with virtual type - errors if assigning superclass to declared instance var errors if assigning superclass to declared instance var - errors if reading ivar from non-ivar container errors if reading ivar from non-ivar container - preserves order of instance vars (#3050) preserves order of instance vars (#3050) - allows using self in class scope allows using self in class scope - doesn't lookup type in parents' namespaces, and lookups and in program doesn't lookup type in parents' namespaces, and lookups and in program - types as no return if calling method on abstract class with generic subclasses but no instances (#6996) types as no return if calling method on abstract class with generic subclasses but no instances (#6996) - inherits self (#2890) inherits self (#2890) - says no overload matches for class new says no overload matches for class new - says that instance vars are not allowed in metaclass says that instance vars are not allowed in metaclass - finds in global scope if includes module finds in global scope if includes module - types instance variable types instance variable - correctly types #680 correctly types #680 - can mark initialize as private can mark initialize as private - reads a virtual type instance var reads a virtual type instance var - errors if reading non-existent ivar errors if reading non-existent ivar - errors on no method found on abstract class, class method (#2241) errors on no method found on abstract class, class method (#2241) - reports can't instantiate abstract class on new reports can't instantiate abstract class on new - types as no return if calling method on abstract class with all abstract subclasses (#6996) types as no return if calling method on abstract class with all abstract subclasses (#6996) - reports undefined instance method reports undefined instance method - types generic of generic type types generic of generic type - doesn't use initialize from base class doesn't use initialize from base class - reports unknown class when extending reports unknown class when extending - errors if using read-instance-var with non-typed variable errors if using read-instance-var with non-typed variable - can't use implicit initialize if defined in parent can't use implicit initialize if defined in parent - allows defining classes inside modules or classes with :: allows defining classes inside modules or classes with :: - reports superclass mismatch reports superclass mismatch - types type var union types type var union - doesn't mix classes on definition (#2352) doesn't mix classes on definition (#2352) - can use short name for top-level type can use short name for top-level type - infers generic type after instance was created with explicit type infers generic type after instance was created with explicit type - allows declaring a variable in an initialize and using it allows declaring a variable in an initialize and using it - types class inside class types class inside class - errors if reopening non-generic class as generic errors if reopening non-generic class as generic - errors if inheriting Gen(self) and there's no self (#2890) errors if inheriting Gen(self) and there's no self (#2890) - says wrong number of arguments for abstract class new says wrong number of arguments for abstract class new - errors if using underscore in generic class errors if using underscore in generic class - uses self as type var uses self as type var - doesn't error on new on abstract virtual type class doesn't error on new on abstract virtual type class - says wrong number of arguments for abstract class new (2) says wrong number of arguments for abstract class new (2) - doesn't crash on instance variable assigned a proc, and never instantiated (#923) doesn't crash on instance variable assigned a proc, and never instantiated (#923) - reports uninitialized constant reports uninitialized constant - reads an object instance var from a union type reads an object instance var from a union type - errors if creating instance before typing instance variable errors if creating instance before typing instance variable - hoists instance variable initializer hoists instance variable initializer - types class and subclass as one type types class and subclass as one type - inherits self twice (#5495) inherits self twice (#5495) - doesn't crash with top-level initialize (#2601) doesn't crash with top-level initialize (#2601) -Normalize: regex literal - options - i i - imx imx - im im - empty empty - x x -Normalize: unless - normalizes unless normalizes unless -Crystal::Repl::Interpreter - casts proc call arguments to proc arg types (#12350) casts proc call arguments to proc arg types (#12350) - calls proc primitive on union of module that has no subtypes (#12954) calls proc primitive on union of module that has no subtypes (#12954) - does call without receiver inside closure does call without receiver inside closure - procs - discards proc call discards proc call - can downcast Proc(T) to Proc(Nil) can downcast Proc(T) to Proc(Nil) - interprets call inside Proc type interprets call inside Proc type - interprets no args proc literal interprets no args proc literal - interprets proc literal with args interprets proc literal with args - casts from nilable proc type to proc type casts from nilable proc type to proc type -Normalize: range literal - normalizes not exclusive normalizes not exclusive - normalizes exclusive normalizes exclusive -Parser - parses "def foo(x @case); end" parses "def foo(x @case); end" - parses "is_a?(Const)" parses "is_a?(Const)" - parses "foo /a/" parses "foo /a/" - parses "a = 1; b = 2; c = 3; a-b -c" parses "a = 1; b = 2; c = 3; a-b -c" - says syntax error on "\"hello\" foo" says syntax error on "\"hello\" foo" - says syntax error on "{1, ->do\n|x| x\end }" says syntax error on "{1, ->do\n|x| x\end }" - says syntax error on "next &* 1" says syntax error on "next &* 1" - parses "Foo(*T)" parses "Foo(*T)" - parses "foo { 1 }" parses "foo { 1 }" - parses "1.0_f32" parses "1.0_f32" - parses "case 1; when 1; 2; else; 3; end" parses "case 1; when 1; 2; else; 3; end" - parses "foo a: 1, b: 2" parses "foo a: 1, b: 2" - parses "def self.=~; end;" parses "def self.=~; end;" - parses "def /(); end;" parses "def /(); end;" - says syntax error on "foo[break]" says syntax error on "foo[break]" - says syntax error on "a = 1, b = 2" says syntax error on "a = 1, b = 2" - parses "Foo(x: U)" parses "Foo(x: U)" - parses "foo &block" parses "foo &block" - parses "\"\#{1\n}\"" parses "\"\#{1\n}\"" - parses "macro foo; bar class: 1; end" parses "macro foo; bar class: 1; end" - parses "def foo(x @alias); end" parses "def foo(x @alias); end" - parses "foo a, / /" parses "foo a, / /" - parses "1.[](2)" parses "1.[](2)" - says syntax error on "return < 1" says syntax error on "return < 1" - says syntax error on "def foo(lib); end" says syntax error on "def foo(lib); end" - parses "lib LibC\nfun getchar(...)\nend" parses "lib LibC\nfun getchar(...)\nend" - parses "%r(\\/)" parses "%r(\\/)" - parses "2**3**4" parses "2**3**4" - parses "begin; 1; rescue; 2; end" parses "begin; 1; rescue; 2; end" - says syntax error on "foo { |(return)| }" says syntax error on "foo { |(return)| }" - says syntax error on "break ... 1" says syntax error on "break ... 1" - says syntax error on "case 1\nin Int32; 2; else" says syntax error on "case 1\nin Int32; 2; else" - parses "foo [1]" parses "foo [1]" - parses "@a : Foo = 1" parses "@a : Foo = 1" - parses "def self.>(); end;" parses "def self.>(); end;" - parses "foo a: b(1) do\nend" parses "foo a: b(1) do\nend" - parses "{% begin %}%r|\\A|{% end %}" parses "{% begin %}%r|\\A|{% end %}" - parses "a = 1; a += 10 if a += 20" parses "a = 1; a += 10 if a += 20" - says syntax error on "unless return; end" says syntax error on "unless return; end" - parses "+1" parses "+1" - parses "true : Int32" parses "true : Int32" - parses "case 1\nin Int32; 2; end" parses "case 1\nin Int32; 2; end" - parses "def Foo::Bar.foo\n1\nend" parses "def Foo::Bar.foo\n1\nend" - parses "{% begin %}%i< %s >{% end %}" parses "{% begin %}%i< %s >{% end %}" - parses "def foo(var : self.class); end" parses "def foo(var : self.class); end" - parses "def self.&(); end;" parses "def self.&(); end;" - parses "T::U/1" parses "T::U/1" - parses "foo.<=(1, 2) { 3 }" parses "foo.<=(1, 2) { 3 }" - parses "@foo" parses "@foo" - parses "include Foo" parses "include Foo" - parses "n &- 2" parses "n &- 2" - parses "enum Foo; {% if 1 %}2{% end %}; end" parses "enum Foo; {% if 1 %}2{% end %}; end" - says syntax error on "next < 1" says syntax error on "next < 1" - parses "macro ~;end" parses "macro ~;end" - parses "a = 1; a/b" parses "a = 1; a/b" - says syntax error on "break >= 1" says syntax error on "break >= 1" - parses "def self.<; end;" parses "def self.<; end;" - parses "foo.!=" parses "foo.!=" - parses "a = 1; a &+=\n1" parses "a = 1; a &+=\n1" - parses "foo out @x; @x" parses "foo out @x; @x" - parses "->Foo.<=(Int32)" parses "->Foo.<=(Int32)" - parses "foo.!~(1, 2) { 3 }" parses "foo.!~(1, 2) { 3 }" - parses "def foo(x @while); end" parses "def foo(x @while); end" - parses ":/" parses ":/" - parses "def foo(@@offsetof); end" parses "def foo(@@offsetof); end" - parses "def self.^; end;" parses "def self.^; end;" - parses "1;-2" parses "1;-2" - says syntax error on "*a === 1" says syntax error on "*a === 1" - parses "->Foo.===(Int32)" parses "->Foo.===(Int32)" - parses "macro foo;if var;true;end;end" parses "macro foo;if var;true;end;end" - parses "foo(0, n >> 2)" parses "foo(0, n >> 2)" - parses "macro foo(@[Foo] **args);end" parses "macro foo(@[Foo] **args);end" - says syntax error on "a = return" says syntax error on "a = return" - parses "f.x = - 1" parses "f.x = - 1" - says syntax error on "Foo(T, x: U)" says syntax error on "Foo(T, x: U)" - says syntax error on "A = begin; B = 1; end" says syntax error on "A = begin; B = 1; end" - says syntax error on "def foo(**a foo); end" says syntax error on "def foo(**a foo); end" - parses "foo.bar(1).baz" parses "foo.bar(1).baz" - parses "def foo(@abstract); end" parses "def foo(@abstract); end" - says syntax error on "foo.||()" says syntax error on "foo.||()" - parses "case {1}\nin {true}; 2; end" parses "case {1}\nin {true}; 2; end" - says syntax error on "until return; end" says syntax error on "until return; end" - parses "def self.!=; end;" parses "def self.!=; end;" - parses "foo(z: 0, a: n | 2)" parses "foo(z: 0, a: n | 2)" - parses "a.b /=\n1" parses "a.b /=\n1" - parses "a()/3" parses "a()/3" - parses "foo.!= do end" parses "foo.!= do end" - parses "foo = 1; foo(+1)" parses "foo = 1; foo(+1)" - parses "lib LibC\n$errno : Int32\n$errno2 : Int32\nend" parses "lib LibC\n$errno : Int32\n$errno2 : Int32\nend" - parses "foo.<" parses "foo.<" - says syntax error on "{\"foo\" => 1, \"bar\": 2}" says syntax error on "{\"foo\" => 1, \"bar\": 2}" - parses "unless : Int32" parses "unless : Int32" - parses "@[Foo(1, foo: 2\n)]" parses "@[Foo(1, foo: 2\n)]" - parses "1 * -2" parses "1 * -2" - says syntax error on "foo { |private| }" says syntax error on "foo { |private| }" - says syntax error on "def foo\nalias\nend" says syntax error on "def foo\nalias\nend" - parses "def foo(@@return); end" parses "def foo(@@return); end" - says syntax error on "foo { |abstract| }" says syntax error on "foo { |abstract| }" - parses "def foo(@macro); end" parses "def foo(@macro); end" - parses "def foo(x = 1, **args)\n1\nend" parses "def foo(x = 1, **args)\n1\nend" - parses "foo -1.0, -2.0" parses "foo -1.0, -2.0" - parses "foo()" parses "foo()" - parses "lib LibC; fun foo(a : Int*); end" parses "lib LibC; fun foo(a : Int*); end" - parses ":^" parses ":^" - parses "{{ 1 // 2 }}" parses "{{ 1 // 2 }}" - parses "foo(&.!)" parses "foo(&.!)" - parses ":[]" parses ":[]" - parses "foo(a: n &+ 2)" parses "foo(a: n &+ 2)" - parses "puts %w{one two}" parses "puts %w{one two}" - parses "foo(n // 2)" parses "foo(n // 2)" - says syntax error on "macro foo x y; end" says syntax error on "macro foo x y; end" - parses "case 1\nwhen .foo\n2\nend" parses "case 1\nwhen .foo\n2\nend" - parses "foo.-" parses "foo.-" - says syntax error on "<<-HERE\n One\n \#{1}\n HERE" says syntax error on "<<-HERE\n One\n \#{1}\n HERE" - says syntax error on "foo { |(struct)| }" says syntax error on "foo { |(struct)| }" - parses "f.x >>= 2" parses "f.x >>= 2" - says syntax error on "enum Foo; A B; end" says syntax error on "enum Foo; A B; end" - parses "foo.== do end" parses "foo.== do end" - parses "property typeof : Int32" parses "property typeof : Int32" - says syntax error on "def foo(foo true); end" says syntax error on "def foo(foo true); end" - says syntax error on "next ... 1" says syntax error on "next ... 1" - parses "{1, 2, 3}" parses "{1, 2, 3}" - says syntax error on "foo { |(end)| }" says syntax error on "foo { |(end)| }" - parses "self" parses "self" - parses "1 < 2" parses "1 < 2" - parses "def foo(typeof foo); end" parses "def foo(typeof foo); end" - parses "def foo(a, @[Foo] &block); end" parses "def foo(a, @[Foo] &block); end" - parses "{[] of Foo, self.foo}" parses "{[] of Foo, self.foo}" - parses "sizeof : Int32" parses "sizeof : Int32" - parses "foo%x" parses "foo%x" - parses "def foo(pointerof foo); end" parses "def foo(pointerof foo); end" - says syntax error on "a, b.<=" says syntax error on "a, b.<=" - parses "foo.<= 1, 2" parses "foo.<= 1, 2" - parses "def *; end;" parses "def *; end;" - parses "foo.is_a? Const" parses "foo.is_a? Const" - parses "foo(n >> 2)" parses "foo(n >> 2)" - parses "break 1, 2" parses "break 1, 2" - parses "def foo(@@asm); end" parses "def foo(@@asm); end" - parses "/ /; / /" parses "/ /; / /" - parses "Foo({String, ->, ->})" parses "Foo({String, ->, ->})" - parses ":\"\\u{61}\"" parses ":\"\\u{61}\"" - parses "foo %r()" parses "foo %r()" - parses "/foo/x" parses "/foo/x" - parses "def self.-(); end;" parses "def self.-(); end;" - parses "1 >> 2" parses "1 >> 2" - says syntax error on "def foo(foo lib); end" says syntax error on "def foo(foo lib); end" - parses "foo(a: n =~ 2)" parses "foo(a: n =~ 2)" - parses "foo(*{1})" parses "foo(*{1})" - parses "def &(); end" parses "def &(); end" - parses "def foo(x @private); end" parses "def foo(x @private); end" - parses "def foo(a, @[Foo] var); end" parses "def foo(a, @[Foo] var); end" - parses "foo(n << 2)" parses "foo(n << 2)" - parses "def foo(**args : Foo)\n1\nend" parses "def foo(**args : Foo)\n1\nend" - parses "def foo(@with); end" parses "def foo(@with); end" - parses "foo(a: n < 2)" parses "foo(a: n < 2)" - parses "macro foo\n\"\\'\"\nend" parses "macro foo\n\"\\'\"\nend" - parses "x.foo(a: 1, b: 2)" parses "x.foo(a: 1, b: 2)" - parses "def foo(\"bar qux\" y); y; end" parses "def foo(\"bar qux\" y); y; end" - parses ":\"\\\"foo\\\"\"" parses ":\"\\\"foo\\\"\"" - parses "->Foo.>>(Int32)" parses "->Foo.>>(Int32)" - parses "-> do; 1; rescue; 2; end" parses "-> do; 1; rescue; 2; end" - says syntax error on "foo { |(with)| }" says syntax error on "foo { |(with)| }" - parses "foo(z: 0, a: n < 2)" parses "foo(z: 0, a: n < 2)" - parses ":\"\"" parses ":\"\"" - parses "enum Foo; {{1}}; end" parses "enum Foo; {{1}}; end" - parses ":==" parses ":==" - says syntax error on "def foo=(*args); end" says syntax error on "def foo=(*args); end" - parses "true" parses "true" - parses "property enum : Int32" parses "property enum : Int32" - parses "f.x += 2" parses "f.x += 2" - parses "->::Foo.foo!" parses "->::Foo.foo!" - parses "def foo(@@class); end" parses "def foo(@@class); end" - parses "def foo(@@module); end" parses "def foo(@@module); end" - says syntax error on "return.foo" says syntax error on "return.foo" - parses "def foo(x @@begin); end" parses "def foo(x @@begin); end" - parses "def foo(&\n); end" parses "def foo(&\n); end" - parses "def self.&; end;" parses "def self.&; end;" - parses "[1,\n 2,]" parses "[1,\n 2,]" - parses ":>>" parses ":>>" - parses "f.x = Foo.new" parses "f.x = Foo.new" - parses "<<-HERE\n One\n Zero\n HERE" parses "<<-HERE\n One\n Zero\n HERE" - says syntax error on "foo.responds_to?" says syntax error on "foo.responds_to?" - says syntax error on "def responds_to?; end" says syntax error on "def responds_to?; end" - parses "foo &.bar.baz" parses "foo &.bar.baz" - parses "a @b-1\nc" parses "a @b-1\nc" - parses "foo.>= do end" parses "foo.>= do end" - parses "def !=; end;" parses "def !=; end;" - parses "def foo(x @macro); end" parses "def foo(x @macro); end" - parses "foo.bar.as(Bar)" parses "foo.bar.as(Bar)" - parses "def foo(x @@include); end" parses "def foo(x @@include); end" - parses "..2" parses "..2" - says syntax error on "next << 1" says syntax error on "next << 1" - parses "def !=(other, file = 1); end" parses "def !=(other, file = 1); end" - parses "foo.< 1, 2" parses "foo.< 1, 2" - parses "Set {1, 2, 3}" parses "Set {1, 2, 3}" - says syntax error on "next | 1" says syntax error on "next | 1" - parses "foo.<(1, 2)" parses "foo.<(1, 2)" - parses "next 1" parses "next 1" - says syntax error on "foo[1] = next" says syntax error on "foo[1] = next" - parses "def foo(**args)\nargs\nend" parses "def foo(**args)\nargs\nend" - says syntax error on "1 as? Bar" says syntax error on "1 as? Bar" - says syntax error on "foo { |(select)| }" says syntax error on "foo { |(select)| }" - parses "a = 1; pointerof(a)" parses "a = 1; pointerof(a)" - says syntax error on "def foo(foo if); end" says syntax error on "def foo(foo if); end" - parses "a = 1; class Foo; @x = a; end" parses "a = 1; class Foo; @x = a; end" - parses ":\"foo\"" parses ":\"foo\"" - parses ":===" parses ":===" - parses "break 1 if true" parses "break 1 if true" - parses "def foo;bar(end: 1);end" parses "def foo;bar(end: 1);end" - parses "require \"foo\"; [1]" parses "require \"foo\"; [1]" - parses "1+2*3" parses "1+2*3" - parses "foo[*baz]" parses "foo[*baz]" - parses "a.b &*=\n1" parses "a.b &*=\n1" - parses "def foo(@begin); end" parses "def foo(@begin); end" - parses "->@@foo.foo?" parses "->@@foo.foo?" - parses "def <; end;" parses "def <; end;" - parses "foo.===(1, 2) { 3 }" parses "foo.===(1, 2) { 3 }" - parses "class Foo(Type); end" parses "class Foo(Type); end" - parses "break : Int32" parses "break : Int32" - parses "def foo(@protected); end" parses "def foo(@protected); end" - parses "def foo(a, &block : self -> self); end" parses "def foo(a, &block : self -> self); end" - parses "-> { }" parses "-> { }" - parses "->() : Int32 do end" parses "->() : Int32 do end" - parses "asm(\"nop\" :: \"b\"(1), \"c\"(2))" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2))" - parses "property if : Int32" parses "property if : Int32" - parses "property ensure : Int32" parses "property ensure : Int32" - says syntax error on "def foo(struct); end" says syntax error on "def foo(struct); end" - parses "macro [];end" parses "macro [];end" - parses "foo do; 1; end" parses "foo do; 1; end" - says syntax error on "def foo(_ y); y; end" says syntax error on "def foo(_ y); y; end" - parses "rescue : Int32" parses "rescue : Int32" - parses ":>" parses ":>" - parses "a = 1; a += 1" parses "a = 1; a += 1" - parses "def foo(var : self*); end" parses "def foo(var : self*); end" - parses "foo(&.as?(T).bar)" parses "foo(&.as?(T).bar)" - parses "1 ^ 2" parses "1 ^ 2" - parses "foo(z: 0, a: n &+ 2)" parses "foo(z: 0, a: n &+ 2)" - parses "a.b +=\n1" parses "a.b +=\n1" - says syntax error on "macro foo(**x, **y)" says syntax error on "macro foo(**x, **y)" - says syntax error on "{\n1 => 2\n3 => 4\n}" says syntax error on "{\n1 => 2\n3 => 4\n}" - parses "foo(bar:a, baz:b)" parses "foo(bar:a, baz:b)" - says syntax error on "fun foo(Int32); end" says syntax error on "fun foo(Int32); end" - parses "def foo(x @@lib); end" parses "def foo(x @@lib); end" - says syntax error on "def foo(var = 1 : Int32); end" says syntax error on "def foo(var = 1 : Int32); end" - parses "def foo(x @@end); end" parses "def foo(x @@end); end" - says syntax error on "break & 1" says syntax error on "break & 1" - parses "def []; end" parses "def []; end" - says syntax error on "next & 1" says syntax error on "next & 1" - parses "def <<(); end" parses "def <<(); end" - says syntax error on "foo { |break| }" says syntax error on "foo { |break| }" - says syntax error on "def foo\ndef\nend" says syntax error on "def foo\ndef\nend" - parses "foo result : Int32; result" parses "foo result : Int32; result" - parses "a ? 1\n : b" parses "a ? 1\n : b" - says syntax error on "foo { |x, x| }" says syntax error on "foo { |x, x| }" - parses "def foo(def foo); end" parses "def foo(def foo); end" - parses "def foo(x : U) : Int32 forall T, U; end" parses "def foo(x : U) : Int32 forall T, U; end" - parses "Foo(T, {x: X})" parses "Foo(T, {x: X})" - parses "def self.!~; end;" parses "def self.!~; end;" - parses "foo(n % 2)" parses "foo(n % 2)" - parses "__FILE__" parses "__FILE__" - parses "macro foo;bar{% for x in y %}body{% end %}baz;end" parses "macro foo;bar{% for x in y %}body{% end %}baz;end" - parses "select\nwhen foo\n2\nelse\n3\nend" parses "select\nwhen foo\n2\nelse\n3\nend" - parses "@[Foo(\"hello\")]" parses "@[Foo(\"hello\")]" - parses "a.b / 2" parses "a.b / 2" - parses "1.tap do; 1; rescue; 2; end" parses "1.tap do; 1; rescue; 2; end" - parses "if foo; 1; end" parses "if foo; 1; end" - parses "def self.%(); end;" parses "def self.%(); end;" - parses "1\n-2" parses "1\n-2" - parses "1 / 2" parses "1 / 2" - parses "def foo(@unless); end" parses "def foo(@unless); end" - says syntax error on "b? = 1" says syntax error on "b? = 1" - parses "def foo(@@macro); end" parses "def foo(@@macro); end" - says syntax error on "->() :Int32 { }" says syntax error on "->() :Int32 { }" - parses "x = 1; foo x do\nend" parses "x = 1; foo x do\nend" - parses "a, *b = 1" parses "a, *b = 1" - parses "def foo(self foo); end" parses "def foo(self foo); end" - parses "do : Int32" parses "do : Int32" - parses "def foo(struct foo); end" parses "def foo(struct foo); end" - parses "{\n1\n}" parses "{\n1\n}" - parses ":foo" parses ":foo" - parses "x : *T -> R" parses "x : *T -> R" - says syntax error on "{1 => 2, 3 => 4 5 => 6}" says syntax error on "{1 => 2, 3 => 4 5 => 6}" - says syntax error on "def foo\nstruct\nend" says syntax error on "def foo\nstruct\nend" - parses "foo(a: n > 2)" parses "foo(a: n > 2)" - parses "foo % r()" parses "foo % r()" - parses "def foo(x @@class); end" parses "def foo(x @@class); end" - parses "begin; 1; rescue ex; 2; end; ex" parses "begin; 1; rescue ex; 2; end; ex" - parses "def foo(x @@while); end" parses "def foo(x @@while); end" - parses "include : Int32" parses "include : Int32" - parses "{A::B}" parses "{A::B}" - parses "def foo(@return); end" parses "def foo(@return); end" - parses "next *1, 2" parses "next *1, 2" - parses "def <=(*args, **opts, &); end" parses "def <=(*args, **opts, &); end" - parses "case foo; end" parses "case foo; end" - parses "lib LibC\nfun getch = GetChar\nend" parses "lib LibC\nfun getch = GetChar\nend" - parses "foo.^ do end" parses "foo.^ do end" - parses "a\nwhile / /\n/ /\nend" parses "a\nwhile / /\n/ /\nend" - parses "def |(); end" parses "def |(); end" - parses "foo % Q()" parses "foo % Q()" - parses "def foo(var : Int -> Double); end" parses "def foo(var : Int -> Double); end" - parses "def >(); end" parses "def >(); end" - parses "-1" parses "-1" - parses "def foo(&); end" parses "def foo(&); end" - parses "case\nend" parses "case\nend" - says syntax error on "break[0]" says syntax error on "break[0]" - says syntax error on "foo[1] = break" says syntax error on "foo[1] = break" - parses "[\n1,2\n]" parses "[\n1,2\n]" - parses "def foo ; 1 ; end" parses "def foo ; 1 ; end" - parses "_, _ = 1, 2" parses "_, _ = 1, 2" - parses "macro foo\n <<-FOO\n %foo\n FOO\nend" parses "macro foo\n <<-FOO\n %foo\n FOO\nend" - parses "def foo(@@next); end" parses "def foo(@@next); end" - parses "1 ? a : b ? c : 3" parses "1 ? a : b ? c : 3" - parses "->@foo.foo" parses "->@foo.foo" - parses "!a && b" parses "!a && b" - parses "a = 1; a ||= 1" parses "a = 1; a ||= 1" - parses "Set() {1, 2, 3}" parses "Set() {1, 2, 3}" - says syntax error on "unless break; end" says syntax error on "unless break; end" - parses "1\n+2" parses "1\n+2" - parses "extend Foo\nif true; end" parses "extend Foo\nif true; end" - parses "n >> 2" parses "n >> 2" - parses "call @foo.bar" parses "call @foo.bar" - parses "foo%q" parses "foo%q" - parses "until true; end;" parses "until true; end;" - parses "macro foo=;end" parses "macro foo=;end" - says syntax error on "def foo(foo case); end" says syntax error on "def foo(foo case); end" - says syntax error on "def foo(foo with); end" says syntax error on "def foo(foo with); end" - says syntax error on "fun foo\nFoo = 1" says syntax error on "fun foo\nFoo = 1" - says syntax error on "def foo(until); end" says syntax error on "def foo(until); end" - parses "def ===(*args, **opts); end" parses "def ===(*args, **opts); end" - says syntax error on "def foo(foo struct); end" says syntax error on "def foo(foo struct); end" - parses "case {1}\nin {Int32}; 2; end" parses "case {1}\nin {Int32}; 2; end" - parses "def foo(@@def); end" parses "def foo(@@def); end" - says syntax error on "def foo(x x); 1; end" says syntax error on "def foo(x x); 1; end" - parses "`foo\#{1}bar`" parses "`foo\#{1}bar`" - parses "{\n{1}\n}" parses "{\n{1}\n}" - parses "(1; 2; 3)" parses "(1; 2; 3)" - parses "->Foo.foo=" parses "->Foo.foo=" - parses "a = uninitialized Foo; a" parses "a = uninitialized Foo; a" - parses "lib LibC\nfun getchar(a : Int, b : Float)\nend" parses "lib LibC\nfun getchar(a : Int, b : Float)\nend" - says syntax error on "def foo(foo offsetof); end" says syntax error on "def foo(foo offsetof); end" - says syntax error on "foo(foo(&.block)" says syntax error on "foo(foo(&.block)" - parses "{% begin %}%r{\\A}{% end %}" parses "{% begin %}%r{\\A}{% end %}" - parses "def foo(x @nil); end" parses "def foo(x @nil); end" - says syntax error on "*a == 1" says syntax error on "*a == 1" - parses "foo(z: 0, a: n / 2)" parses "foo(z: 0, a: n / 2)" - says syntax error on "lib Foo%end" says syntax error on "lib Foo%end" - says syntax error on "next ? 1 : 2" says syntax error on "next ? 1 : 2" - parses "foo 1, **bar, &block" parses "foo 1, **bar, &block" - says syntax error on "/foo)/" says syntax error on "/foo)/" - parses "lib LibC; fun foo(a : ::B, ::C -> ::D); end" parses "lib LibC; fun foo(a : ::B, ::C -> ::D); end" - says syntax error on "def self.responds_to?; end" says syntax error on "def self.responds_to?; end" - says syntax error on "{% unless 1; 2; elsif 3; 4; end %}" says syntax error on "{% unless 1; 2; elsif 3; 4; end %}" - parses "1 \\\n + 2" parses "1 \\\n + 2" - parses "{} of Int => Double" parses "{} of Int => Double" - says syntax error on "def foo(**args, *x); end" says syntax error on "def foo(**args, *x); end" - parses "[] of {String, ->}" parses "[] of {String, ->}" - parses "foo +1.0" parses "foo +1.0" - parses "a = 1; a /= 1" parses "a = 1; a /= 1" - says syntax error on "<<-FOO\n1\nFOO + 2" says syntax error on "<<-FOO\n1\nFOO + 2" - says syntax error on "foo &.||()" says syntax error on "foo &.||()" - parses "def foo(false foo); end" parses "def foo(false foo); end" - says syntax error on "def foo\ninclude\nend" says syntax error on "def foo\ninclude\nend" - parses "macro ==;end" parses "macro ==;end" - parses "{% begin %}%[ %s ]{% end %}" parses "{% begin %}%[ %s ]{% end %}" - parses "macro foo(@[Foo] *args);end" parses "macro foo(@[Foo] *args);end" - says syntax error on "def foo(foo out); end" says syntax error on "def foo(foo out); end" - says syntax error on "{\"x\": [] of Int32,\n}\n1.foo(" says syntax error on "{\"x\": [] of Int32,\n}\n1.foo(" - says syntax error on "next >= 1" says syntax error on "next >= 1" - parses "def foo(instance_sizeof foo); end" parses "def foo(instance_sizeof foo); end" - says syntax error on "def foo(def); end" says syntax error on "def foo(def); end" - says syntax error on "next - 1" says syntax error on "next - 1" - parses "def *(); end" parses "def *(); end" - parses "Foo.bar x.y do\nend" parses "Foo.bar x.y do\nend" - says syntax error on "macro foo(x y z); end" says syntax error on "macro foo(x y z); end" - says syntax error on "Foo(T, U V)" says syntax error on "Foo(T, U V)" - parses "fun : Int32" parses "fun : Int32" - parses "a.b <<=\n1" parses "a.b <<=\n1" - says syntax error on "return > 1" says syntax error on "return > 1" - parses "macro foo;bar{% begin %}body{% end %}baz;end" parses "macro foo;bar{% begin %}body{% end %}baz;end" - parses "foo(a: n &- 2)" parses "foo(a: n &- 2)" - parses "def foo; with a yield 1; end" parses "def foo; with a yield 1; end" - parses "@foo/2" parses "@foo/2" - parses "def foo(nil foo); end" parses "def foo(nil foo); end" - parses "def foo(@@true); end" parses "def foo(@@true); end" - says syntax error on "def foo(private); end" says syntax error on "def foo(private); end" - parses "foo x, *bar" parses "foo x, *bar" - parses "foo(a: n * 2)" parses "foo(a: n * 2)" - parses "{% begin %}%x[ %s ]{% end %}" parses "{% begin %}%x[ %s ]{% end %}" - parses "foo 1.bar do\nend" parses "foo 1.bar do\nend" - parses "def =~(); end" parses "def =~(); end" - parses "asm(\"nop\" \n)" parses "asm(\"nop\" \n)" - parses "foo.=== 1, 2" parses "foo.=== 1, 2" - parses "def self.%; end;" parses "def self.%; end;" - says syntax error on "foo { |next| }" says syntax error on "foo { |next| }" - parses "<<-HERE\nHERE" parses "<<-HERE\nHERE" - parses "case;end" parses "case;end" - parses "{% unless 1; 2; end %}" parses "{% unless 1; 2; end %}" - parses "def foo(@@end); end" parses "def foo(@@end); end" - parses "Foo({\"foo bar\": X})" parses "Foo({\"foo bar\": X})" - says syntax error on "def as; end" says syntax error on "def as; end" - says syntax error on "def foo; require \"bar\"; end" says syntax error on "def foo; require \"bar\"; end" - parses "b.c ||= 1" parses "b.c ||= 1" - parses "1 % 2" parses "1 % 2" - parses "foo(\n1)" parses "foo(\n1)" - parses "case :foo; when :bar; 2; end" parses "case :foo; when :bar; 2; end" - parses "Foo(T, U, 1)" parses "Foo(T, U, 1)" - parses "def foo(yield foo); end" parses "def foo(yield foo); end" - parses "asm(\"nop\" : : )" parses "asm(\"nop\" : : )" - parses "def /; end;" parses "def /; end;" - says syntax error on "next &+ 1" says syntax error on "next &+ 1" - parses "def foo(x)\n x\nend; foo = 1; b = 2; foo +b" parses "def foo(x)\n x\nend; foo = 1; b = 2; foo +b" - parses "lib LibC; fun foo : Int**; end" parses "lib LibC; fun foo : Int**; end" - says syntax error on "lib Foo; fun foo(x : Int32, x : Int64); end" says syntax error on "lib Foo; fun foo(x : Int32, x : Int64); end" - parses "<<-'EOF'.x\n foo\nEOF" parses "<<-'EOF'.x\n foo\nEOF" - parses "def foo(offsetof foo); end" parses "def foo(offsetof foo); end" - parses "qux \"foo\#{bar do end}baz\"" parses "qux \"foo\#{bar do end}baz\"" - parses "->::foo?" parses "->::foo?" - parses "1 !~ 2" parses "1 !~ 2" - parses "{% if x %}body{% end %}" parses "{% if x %}body{% end %}" - parses "private : Int32" parses "private : Int32" - parses "[] of ->;" parses "[] of ->;" - parses "foo &.block = 0" parses "foo &.block = 0" - parses "property rescue : Int32" parses "property rescue : Int32" - says syntax error on "+break" says syntax error on "+break" - parses "def foo(x, *args, y = 2, w, z = 3); 1; end" parses "def foo(x, *args, y = 2, w, z = 3); 1; end" - says syntax error on "return .. 1" says syntax error on "return .. 1" - parses "x = 1; foo x { }" parses "x = 1; foo x { }" - parses "def foo(x = __DIR__); end" parses "def foo(x = __DIR__); end" - parses "def &-(); end" parses "def &-(); end" - parses "1/2" parses "1/2" - parses "def foo(@@with); end" parses "def foo(@@with); end" - says syntax error on "require 1" says syntax error on "require 1" - parses "a ? 1 : b ? 2 : c ? 3 : 0" parses "a ? 1 : b ? 2 : c ? 3 : 0" - parses "foo.> 1, 2" parses "foo.> 1, 2" - says syntax error on "return >> 1" says syntax error on "return >> 1" - parses "{%\na = 1\n%}" parses "{%\na = 1\n%}" - parses "1 =~ 2" parses "1 =~ 2" - says syntax error on "next ** 1" says syntax error on "next ** 1" - says syntax error on "<<-HERE\n One\n \#{1}\n wrong\#{1}\n HERE" says syntax error on "<<-HERE\n One\n \#{1}\n wrong\#{1}\n HERE" - parses "a = 1; a rescue a" parses "a = 1; a rescue a" - parses "def /(); end;" parses "def /(); end;" - parses "foo = 1; ->foo.[]=(Int32)" parses "foo = 1; ->foo.[]=(Int32)" - parses "def self.-; end;" parses "def self.-; end;" - parses "\"foo\"" parses "\"foo\"" - parses "def &(); end;" parses "def &(); end;" - parses ":<=" parses ":<=" - parses "enum Foo; macro foo;end; end" parses "enum Foo; macro foo;end; end" - parses "foo = 1; ->foo.<(Int32)" parses "foo = 1; ->foo.<(Int32)" - says syntax error on "+next" says syntax error on "+next" - parses "foo(n * 2)" parses "foo(n * 2)" - parses "foo % i()" parses "foo % i()" - parses "n & 2" parses "n & 2" - parses "foo % q()" parses "foo % q()" - parses "x[a: 1, b: 2]" parses "x[a: 1, b: 2]" - parses "def >>(); end" parses "def >>(); end" - parses "foo(n &+ 2)" parses "foo(n &+ 2)" - parses "{\n1,\n2\n}" parses "{\n1,\n2\n}" - says syntax error on " (1, 2, 3 end" says syntax error on " (1, 2, 3 end" - parses "def foo(@var = 1); 1; end" parses "def foo(@var = 1); 1; end" - says syntax error on "foo { |(sizeof)| }" says syntax error on "foo { |(sizeof)| }" - parses "def foo(x @with); end" parses "def foo(x @with); end" - says syntax error on "def foo(foo break); end" says syntax error on "def foo(foo break); end" - parses "1 * 2" parses "1 * 2" - parses "foo &.block[0] = 1" parses "foo &.block[0] = 1" - says syntax error on "return <= 1" says syntax error on "return <= 1" - says syntax error on "foo { |(self)| }" says syntax error on "foo { |(self)| }" - parses "foo(0, n == 2)" parses "foo(0, n == 2)" - parses "{} of Int32 -> Int32 => Int32" parses "{} of Int32 -> Int32 => Int32" - says syntax error on "def foo(next); end" says syntax error on "def foo(next); end" - parses "enum Foo; @@foo = 1\n A \n end" parses "enum Foo; @@foo = 1\n A \n end" - parses "foo(0, n >= 2)" parses "foo(0, n >= 2)" - says syntax error on "enum Foo < UInt16; end" says syntax error on "enum Foo < UInt16; end" - says syntax error on "foo { |select| }" says syntax error on "foo { |select| }" - parses "a : Foo()[12]" parses "a : Foo()[12]" - parses "x[..2]" parses "x[..2]" - parses "{{ foo.nil? }}" parses "{{ foo.nil? }}" - parses "foo(1, **bar, &block)" parses "foo(1, **bar, &block)" - parses "foo(z: 0, a: n > 2)" parses "foo(z: 0, a: n > 2)" - parses "lib LibC\nfun getch = \"get.char\"(x : Int32)\nend" parses "lib LibC\nfun getch = \"get.char\"(x : Int32)\nend" - parses "def foo(@pointerof); end" parses "def foo(@pointerof); end" - parses "foo.=~(1, 2)" parses "foo.=~(1, 2)" - parses "n // 2" parses "n // 2" - parses "->::foo=" parses "->::foo=" - parses "1 &+ 2" parses "1 &+ 2" - parses "def //(); end" parses "def //(); end" - says syntax error on "def foo(with); end" says syntax error on "def foo(with); end" - parses "def foo(@@pointerof); end" parses "def foo(@@pointerof); end" - parses "a, b = 1, 2" parses "a, b = 1, 2" - says syntax error on "def self.nil?; end" says syntax error on "def self.nil?; end" - sets correct location of tuple type sets correct location of tuple type - says syntax error on "break < 1" says syntax error on "break < 1" - parses "{%\n1\n2\n3\n%}" parses "{%\n1\n2\n3\n%}" - parses "macro foo(a, @[Foo] var);end" parses "macro foo(a, @[Foo] var);end" - parses "n =~ 2" parses "n =~ 2" - parses "foo(0, n &+ 2)" parses "foo(0, n &+ 2)" - parses "lib LibC; type A = B**; end" parses "lib LibC; type A = B**; end" - parses "def foo(var : self); end" parses "def foo(var : self); end" - parses "instance_sizeof : Int32" parses "instance_sizeof : Int32" - parses "macro foo(x); 1 + 2; end" parses "macro foo(x); 1 + 2; end" - parses "def foo(@include); end" parses "def foo(@include); end" - parses "{% begin %}{% if true %}if true{% end %}\n{% if true %}end{% end %}{% end %}" parses "{% begin %}{% if true %}if true{% end %}\n{% if true %}end{% end %}{% end %}" - says syntax error on "break &- 1" says syntax error on "break &- 1" - parses "def foo(@@fun); end" parses "def foo(@@fun); end" - says syntax error on "foo { |(alias)| }" says syntax error on "foo { |(alias)| }" - parses "a = 1; a **= 1" parses "a = 1; a **= 1" - parses "lib LibC; struct Foo; end end" parses "lib LibC; struct Foo; end end" - says syntax error on "foo { |(out)| }" says syntax error on "foo { |(out)| }" - parses "a.b /2/" parses "a.b /2/" - says syntax error on "{\n\"foo\"\n\"bar\"\n}" says syntax error on "{\n\"foo\"\n\"bar\"\n}" - parses "->::Foo.foo=" parses "->::Foo.foo=" - parses "def <(); end" parses "def <(); end" - says syntax error on "def foo=(a,b); end" says syntax error on "def foo=(a,b); end" - parses "1 &- 2" parses "1 &- 2" - parses "/ /" parses "/ /" - parses "def <=(other, file = 1); end" parses "def <=(other, file = 1); end" - says syntax error on "foo { |(false)| }" says syntax error on "foo { |(false)| }" - global regex match data - parses "foo $1" parses "foo $1" - parses "$? = 1" parses "$? = 1" - parses "$?" parses "$?" - parses "$~ = 1" parses "$~ = 1" - parses "$1?" parses "$1?" - parses "$1" parses "$1" - says syntax error on "$2147483648" says syntax error on "$2147483648" - says syntax error on "$0, a = {1, 2}" says syntax error on "$0, a = {1, 2}" - parses "$~.foo" parses "$~.foo" - parses "$?.foo" parses "$?.foo" - says syntax error on "$0, $1 = [1, 2]" says syntax error on "$0, $1 = [1, 2]" - parses "$~" parses "$~" - parses "$0" parses "$0" - says syntax error on "$0 = 1" says syntax error on "$0 = 1" - says syntax error on "$99999999999999999999999?" says syntax error on "$99999999999999999999999?" - parses "foo $?" parses "foo $?" - says syntax error on "case 1\nin Int32; 2; when 2" says syntax error on "case 1\nin Int32; 2; when 2" - says syntax error on "def foo(foo asm); end" says syntax error on "def foo(foo asm); end" - parses "def self.foo=\n1\nend" parses "def self.foo=\n1\nend" - parses "foo a: 1, &block" parses "foo a: 1, &block" - parses "break if true" parses "break if true" - says syntax error on "A = begin; 1; rescue; B = 1; end" says syntax error on "A = begin; 1; rescue; B = 1; end" - parses "def >=(*args, **opts, &); end" parses "def >=(*args, **opts, &); end" - parses "case {1}\nin {_}; 2; end" parses "case {1}\nin {_}; 2; end" - parses "lib LibC\n$errno : B, C -> D\nend" parses "lib LibC\n$errno : B, C -> D\nend" - says syntax error on "def foo(return); end" says syntax error on "def foo(return); end" - parses "->(x) { x }" parses "->(x) { x }" - says syntax error on "def foo(extend); end" says syntax error on "def foo(extend); end" - parses "1.is_a?(\n Int32\n)" parses "1.is_a?(\n Int32\n)" - parses "@@a : Foo" parses "@@a : Foo" - parses "foo.bar=(*baz)" parses "foo.bar=(*baz)" - says syntax error on "fun foo(x : Int32, x : Int64); end" says syntax error on "fun foo(x : Int32, x : Int64); end" - parses "foo(&.bar.baz)" parses "foo(&.bar.baz)" - parses "1.nil?(\n)" parses "1.nil?(\n)" - says syntax error on "foo **bar, out x" says syntax error on "foo **bar, out x" - says syntax error on "yield return" says syntax error on "yield return" - says syntax error on "break * 1" says syntax error on "break * 1" - says syntax error on "def foo(var = x : Int); end" says syntax error on "def foo(var = x : Int); end" - parses "->foo=" parses "->foo=" - parses "next 1, 2" parses "next 1, 2" - says syntax error on "case 1 == 1; when 2 a; end" says syntax error on "case 1 == 1; when 2 a; end" - parses "def foo(x @typeof); end" parses "def foo(x @typeof); end" - parses "<<-HERE1; <<-HERE2\nhere1\nHERE1\nHERE2" parses "<<-HERE1; <<-HERE2\nhere1\nHERE1\nHERE2" - says syntax error on "def foo var\n end" says syntax error on "def foo var\n end" - says syntax error on "foo { |(fun)| }" says syntax error on "foo { |(fun)| }" - parses "foo(&.responds_to?(:foo))" parses "foo(&.responds_to?(:foo))" - parses "yield foo do\nend" parses "yield foo do\nend" - says syntax error on "x : String, a = 4" says syntax error on "x : String, a = 4" - says syntax error on "break .. 1" says syntax error on "break .. 1" - parses "def foo(@false); end" parses "def foo(@false); end" - parses "/ /\n/ /" parses "/ /\n/ /" - parses "foo &.@bar" parses "foo &.@bar" - parses "<<-HERE\r\n One\r\n Zero\r\n HERE\r\n" parses "<<-HERE\r\n One\r\n Zero\r\n HERE\r\n" - parses "def foo(@@instance_sizeof); end" parses "def foo(@@instance_sizeof); end" - parses "2 * (3 + 4)" parses "2 * (3 + 4)" - says syntax error on "asm(\"nop\" ::: \"\#{foo}\")" says syntax error on "asm(\"nop\" ::: \"\#{foo}\")" - parses "{{ foo }}" parses "{{ foo }}" - parses "2.3_f32" parses "2.3_f32" - sets correct location of annotation in lib sets correct location of annotation in lib - parses "{1 => 2 / 3}" parses "{1 => 2 / 3}" - parses "def foo(x @@instance_sizeof); end" parses "def foo(x @@instance_sizeof); end" - parses "{% begin %}%q[ %s ]{% end %}" parses "{% begin %}%q[ %s ]{% end %}" - parses "def foo; a = 1; a; end" parses "def foo; a = 1; a; end" - parses "->Foo.<(Int32)" parses "->Foo.<(Int32)" - says syntax error on "def foo(class); end" says syntax error on "def foo(class); end" - says syntax error on "def foo(instance_sizeof); end" says syntax error on "def foo(instance_sizeof); end" - parses "(/ /)" parses "(/ /)" - parses "def foo(x, *y); 1; end" parses "def foo(x, *y); 1; end" - parses "def +; end;" parses "def +; end;" - parses "@@a : Foo = 1" parses "@@a : Foo = 1" - parses "{% for _, x, _ in y %}body{% end %}" parses "{% for _, x, _ in y %}body{% end %}" - says syntax error on "def foo(alias); end" says syntax error on "def foo(alias); end" - parses "{% begin %}%w{ %s }{% end %}" parses "{% begin %}%w{ %s }{% end %}" - parses "f.x Foo.new" parses "f.x Foo.new" - parses "foo(a: n &* 2)" parses "foo(a: n &* 2)" - parses "def foo(return foo); end" parses "def foo(return foo); end" - says syntax error on "return ... 1" says syntax error on "return ... 1" - parses "foo.responds_to?(:foo)" parses "foo.responds_to?(:foo)" - parses "abstract struct Foo; end" parses "abstract struct Foo; end" - parses "property true : Int32" parses "property true : Int32" - parses "property false : Int32" parses "property false : Int32" - parses "f.x /= 2" parses "f.x /= 2" - parses "f.x |= 2" parses "f.x |= 2" - parses "puts ~1" parses "puts ~1" - parses "fun foo(x : Int32) : Int64\nx\nend" parses "fun foo(x : Int32) : Int64\nx\nend" - parses "alignof(\n Int32\n)" parses "alignof(\n Int32\n)" - parses "2 / 3 + 4 / 5" parses "2 / 3 + 4 / 5" - parses "<<-HERE\n \#{1}One\n \#{2}Zero\n HERE" parses "<<-HERE\n \#{1}One\n \#{2}Zero\n HERE" - parses "->::foo!" parses "->::foo!" - parses "a, b = 1, 2 if 3" parses "a, b = 1, 2 if 3" - parses "def foo(x @@def); end" parses "def foo(x @@def); end" - parses "def foo(x @instance_sizeof); end" parses "def foo(x @instance_sizeof); end" - says syntax error on "a = 1; a += break" says syntax error on "a = 1; a += break" - parses "*_ = 1, 2" parses "*_ = 1, 2" - says syntax error on "lib LibC\n$Errno : Int32\nend" says syntax error on "lib LibC\n$Errno : Int32\nend" - parses "def >(); end;" parses "def >(); end;" - parses "\u3042.\u3044, \u3046.\u3048.\u304A = 1, 2" parses "\u3042.\u3044, \u3046.\u3048.\u304A = 1, 2" - parses "lib LibC\nfun SomeFun\nend" parses "lib LibC\nfun SomeFun\nend" - parses "->Foo::Bar::Baz.foo" parses "->Foo::Bar::Baz.foo" - parses "foo 1, 2" parses "foo 1, 2" - says syntax error on "if return; end" says syntax error on "if return; end" - parses "def foo(extend foo); end" parses "def foo(extend foo); end" - parses "->Foo.==(Int32)" parses "->Foo.==(Int32)" - says syntax error on "def self.as; end" says syntax error on "def self.as; end" - says syntax error on "foo { |(module)| }" says syntax error on "foo { |(module)| }" - parses "1 + 2" parses "1 + 2" - parses "foo out _" parses "foo out _" - parses "property protected : Int32" parses "property protected : Int32" - parses "{% begin %}%w< %s >{% end %}" parses "{% begin %}%w< %s >{% end %}" - parses "def |(); end;" parses "def |(); end;" - says syntax error on "break | 1" says syntax error on "break | 1" - says syntax error on "def foo(var : Foo+); end" says syntax error on "def foo(var : Foo+); end" - parses "def []=(*args, **opts); end" parses "def []=(*args, **opts); end" - parses "def ~; end;" parses "def ~; end;" - parses "{{a = 1 if 2}}" parses "{{a = 1 if 2}}" - says syntax error on "@[Foo(\"\": 1)]" says syntax error on "@[Foo(\"\": 1)]" - parses "Foo({X, Y,})" parses "Foo({X, Y,})" - parses "asm(\"nop\" : \"a\"(0), \"b\"(1) : \"c\"(2), \"d\"(3))" parses "asm(\"nop\" : \"a\"(0), \"b\"(1) : \"c\"(2), \"d\"(3))" - parses "macro foo;unless var;true;end;end" parses "macro foo;unless var;true;end;end" - parses "f ->{ a do\n end\n }" parses "f ->{ a do\n end\n }" - says syntax error on "1 unless break" says syntax error on "1 unless break" - parses "Foo(\nT\n)" parses "Foo(\nT\n)" - parses "def **(); end;" parses "def **(); end;" - parses "::foo" parses "::foo" - says syntax error on "def foo(foo include); end" says syntax error on "def foo(foo include); end" - parses "foo + 1" parses "foo + 1" - parses "def foo; end" parses "def foo; end" - parses "Foo({x: X})" parses "Foo({x: X})" - says syntax error on "foo { |(true)| }" says syntax error on "foo { |(true)| }" - says syntax error on "foo { |include| }" says syntax error on "foo { |include| }" - parses "def foo(x @@require); end" parses "def foo(x @@require); end" - parses "def self.===(); end;" parses "def self.===(); end;" - parses "def foo(x @struct); end" parses "def foo(x @struct); end" - parses "x = 1; foo.bar x do\nend" parses "x = 1; foo.bar x do\nend" - parses "foo[\nfoo[\n1\n]\n]" parses "foo[\nfoo[\n1\n]\n]" - parses "{% for x in y %}body{% end %}" parses "{% for x in y %}body{% end %}" - says syntax error on "macro foo" says syntax error on "macro foo" - parses "<<-HERE1; <<-HERE2\nHERE1\nhere2\nHERE2" parses "<<-HERE1; <<-HERE2\nHERE1\nhere2\nHERE2" - parses "def foo(x : U) forall T, U; end" parses "def foo(x : U) forall T, U; end" - parses "def foo(@@if); end" parses "def foo(@@if); end" - parses "foo.-(1, 2) { 3 }" parses "foo.-(1, 2) { 3 }" - parses "foo *{1}" parses "foo *{1}" - parses "1 + 2" parses "1 + 2" - parses "begin; 1; end;" parses "begin; 1; end;" - parses "def foo(x @next); end" parses "def foo(x @next); end" - says syntax error on ":bar foo" says syntax error on ":bar foo" - says syntax error on "Foo({x: X, x: Y})" says syntax error on "Foo({x: X, x: Y})" - parses "module : Int32" parses "module : Int32" - says syntax error on "def foo(foo return); end" says syntax error on "def foo(foo return); end" - parses "return 1, 2" parses "return 1, 2" - says syntax error on " {1 => end" says syntax error on " {1 => end" - parses "def self.|(); end;" parses "def self.|(); end;" - parses "macro !=;end" parses "macro !=;end" - says syntax error on "next * 1" says syntax error on "next * 1" - says syntax error on "macro responds_to?; end" says syntax error on "macro responds_to?; end" - parses "foo./" parses "foo./" - parses "foo.%(1, 2) { 3 }" parses "foo.%(1, 2) { 3 }" - parses "def foo(@if); end" parses "def foo(@if); end" - parses "n << 2" parses "n << 2" - parses "foo = 1; ->foo.>=(Int32)" parses "foo = 1; ->foo.>=(Int32)" - parses "def foo(x : *T -> R); end" parses "def foo(x : *T -> R); end" - parses "Foo(_)" parses "Foo(_)" - parses "@[Foo(1, foo: 2)]" parses "@[Foo(1, foo: 2)]" - parses "->::Foo.foo" parses "->::Foo.foo" - parses "def foo(asm foo); end" parses "def foo(asm foo); end" - says syntax error on "case 1\nin .nil?; 2" says syntax error on "case 1\nin .nil?; 2" - parses "def foo(x @lib); end" parses "def foo(x @lib); end" - parses "a.foo, *a.bar = 1" parses "a.foo, *a.bar = 1" - parses "(bar {})" parses "(bar {})" - says syntax error on "return / 1" says syntax error on "return / 1" - parses "foo.!~(1, 2)" parses "foo.!~(1, 2)" - sets correct location of splat in multiple assignment sets correct location of splat in multiple assignment - parses "module Foo(*T); end" parses "module Foo(*T); end" - says syntax error on "offsetof(X, 'c')" says syntax error on "offsetof(X, 'c')" - parses "instance_sizeof(X)" parses "instance_sizeof(X)" - parses "def foo(bar = 1\n); 2; end" parses "def foo(bar = 1\n); 2; end" - parses "a.b **=\n1" parses "a.b **=\n1" - parses "offsetof(X, 1)" parses "offsetof(X, 1)" - parses "case {1, 2}\nwhen {3, 4}\n5\nend" parses "case {1, 2}\nwhen {3, 4}\n5\nend" - parses "Foo(Bar())" parses "Foo(Bar())" - parses "abstract class Foo; end" parses "abstract class Foo; end" - parses "return 1, *2" parses "return 1, *2" - says syntax error on "next &- 1" says syntax error on "next &- 1" - parses "lib LibC; struct Foo; x : Int; y : Float; end end" parses "lib LibC; struct Foo; x : Int; y : Float; end end" - says syntax error on "return >= 1" says syntax error on "return >= 1" - parses "enum Foo : UInt16; end" parses "enum Foo : UInt16; end" - parses "foo(1, **bar)" parses "foo(1, **bar)" - parses "asm(\"nop\" :: \"b\"(1), \"c\"(2) ::)" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2) ::)" - parses ":!~" parses ":!~" - parses "case 1\nwhen .!()\n2\nend" parses "case 1\nwhen .!()\n2\nend" - parses "foo %i()" parses "foo %i()" - says syntax error on "[\n\"foo\"\n\"bar\"\n]" says syntax error on "[\n\"foo\"\n\"bar\"\n]" - parses "n == 2" parses "n == 2" - parses "foo &.[0]" parses "foo &.[0]" - parses "T/1" parses "T/1" - parses "property instance_sizeof : Int32" parses "property instance_sizeof : Int32" - parses "def self.foo\n1\nend" parses "def self.foo\n1\nend" - says syntax error on "{1, 2 3}" says syntax error on "{1, 2 3}" - parses ":**" parses ":**" - parses "asm : Int32" parses "asm : Int32" - parses "foo.+ 1, 2" parses "foo.+ 1, 2" - parses "property asm : Int32" parses "property asm : Int32" - parses "A.new(\"x\", B.new(\"y\"))" parses "A.new(\"x\", B.new(\"y\"))" - parses ":[]=" parses ":[]=" - parses "\"hello \"\\\r\n\"world\"" parses "\"hello \"\\\r\n\"world\"" - parses "foo.bar [1]" parses "foo.bar [1]" - parses "property end : Int32" parses "property end : Int32" - says syntax error on "{1, ->{ |x| x } }" says syntax error on "{1, ->{ |x| x } }" - parses "n &** 2" parses "n &** 2" - parses "{{ foo &.nil? }}" parses "{{ foo &.nil? }}" - parses "macro &**;end" parses "macro &**;end" - parses "x[1, ..2]" parses "x[1, ..2]" - parses "foo = 1; ->foo.<<(Int32)" parses "foo = 1; ->foo.<<(Int32)" - parses "def foo(end foo); end" parses "def foo(end foo); end" - says syntax error on "def foo(offsetof); end" says syntax error on "def foo(offsetof); end" - says syntax error on "while next; end" says syntax error on "while next; end" - parses "foo do |a|; 1; end" parses "foo do |a|; 1; end" - parses "def <=(); end" parses "def <=(); end" - parses "<<-HERE\n foo\#{1}bar\n baz\n HERE" parses "<<-HERE\n foo\#{1}bar\n baz\n HERE" - says syntax error on "def foo &block ; end" says syntax error on "def foo &block ; end" - says syntax error on "break.foo" says syntax error on "break.foo" - parses "->Foo./(Int32)" parses "->Foo./(Int32)" - parses "macro foo\n'\\''\nend" parses "macro foo\n'\\''\nend" - parses "{% begin %}%w| %s |{% end %}" parses "{% begin %}%w| %s |{% end %}" - parses "_, *_, _, _ = 1, 2, 3" parses "_, *_, _, _ = 1, 2, 3" - parses "1 - 2" parses "1 - 2" - parses "def []=(value); end" parses "def []=(value); end" - parses "foo = 1; ->foo.-(Int32)" parses "foo = 1; ->foo.-(Int32)" - parses "foo **bar" parses "foo **bar" - parses "def foo; x { |_| 1 }; end" parses "def foo; x { |_| 1 }; end" - parses "begin\n1\nensure\n2\nend" parses "begin\n1\nensure\n2\nend" - says syntax error on "A = (B = 1)" says syntax error on "A = (B = 1)" - parses "def self.=~(); end;" parses "def self.=~(); end;" - parses "def foo : Int32\n1\nend" parses "def foo : Int32\n1\nend" - parses "def foo; a = 1; a {}; end" parses "def foo; a = 1; a {}; end" - parses "def foo(@@struct); end" parses "def foo(@@struct); end" - parses "def foo(x @@yield); end" parses "def foo(x @@yield); end" - parses "Foo(T, 1)" parses "Foo(T, 1)" - parses "a; if / /; / /; elsif / /; / /; end" parses "a; if / /; / /; elsif / /; / /; end" - parses "/foo/imximx" parses "/foo/imximx" - parses "%r(/)" parses "%r(/)" - parses "a, b, *c = 1" parses "a, b, *c = 1" - parses "4./(2)" parses "4./(2)" - says syntax error on "def foo(foo fun); end" says syntax error on "def foo(foo fun); end" - parses "foo[1] /2" parses "foo[1] /2" - parses "def foo;{{@type}};end" parses "def foo;{{@type}};end" - parses "def foo; x { |a, *b| b }; end" parses "def foo; x { |a, *b| b }; end" - parses "1.!" parses "1.!" - parses "abstract : Int32" parses "abstract : Int32" - says syntax error on "return | 1" says syntax error on "return | 1" - parses "Foo(X, alignof(Int32))" parses "Foo(X, alignof(Int32))" - says syntax error on "Hash{\"foo\": 1, \"bar\": 2}" says syntax error on "Hash{\"foo\": 1, \"bar\": 2}" - parses "foo(&.as(T).bar)" parses "foo(&.as(T).bar)" - parses "def foo(x : U) forall U; end" parses "def foo(x : U) forall U; end" - parses "def foo(var = 1); end" parses "def foo(var = 1); end" - parses "begin; 1; rescue ::Foo | ::Bar; 2; end" parses "begin; 1; rescue ::Foo | ::Bar; 2; end" - says syntax error on "class Foo(T, U V)" says syntax error on "class Foo(T, U V)" - says syntax error on "def foo() :String\nend" says syntax error on "def foo() :String\nend" - parses "->foo(Int32, Float64)" parses "->foo(Int32, Float64)" - parses "struct : Int32" parses "struct : Int32" - parses "def >; end;" parses "def >; end;" - parses "foo(&.as(T))" parses "foo(&.as(T))" - parses "break 1" parses "break 1" - parses "def !~(); end" parses "def !~(); end" - parses "1 | 2" parses "1 | 2" - parses "def foo(@nil); end" parses "def foo(@nil); end" - parses "foo\n\n .bar" parses "foo\n\n .bar" - parses "def foo(x @@macro); end" parses "def foo(x @@macro); end" - parses "@[Foo(\n1, foo: 2\n)]" parses "@[Foo(\n1, foo: 2\n)]" - parses "def foo(\nvar\n); end" parses "def foo(\nvar\n); end" - parses "1.responds_to?(\n :foo\n)" parses "1.responds_to?(\n :foo\n)" - parses "n === 2" parses "n === 2" - says syntax error on " {1, 2, 3 end" says syntax error on " {1, 2, 3 end" - parses "foo.*" parses "foo.*" - parses "a = 1\ncase 1\nwhen a then 1\nend" parses "a = 1\ncase 1\nwhen a then 1\nend" - says syntax error on "def foo(out); end" says syntax error on "def foo(out); end" - parses "def foo(a, &block : -> Double); end" parses "def foo(a, &block : -> Double); end" - parses "foo.^(1, 2)" parses "foo.^(1, 2)" - parses "def foo; a = 1; with a yield a; end" parses "def foo; a = 1; with a yield a; end" - parses "Foo(X, offsetof(Foo, @a))" parses "Foo(X, offsetof(Foo, @a))" - parses "a.b %=\n1" parses "a.b %=\n1" - parses "begin; / /; end" parses "begin; / /; end" - single splats inside container literals - says syntax error on "case {1}\nwhen {*2}; 3; end" says syntax error on "case {1}\nwhen {*2}; 3; end" - parses "[*1 ** 2]" parses "[*1 ** 2]" - parses "{1, *2, 3, *4, 5}" parses "{1, *2, 3, *4, 5}" - says syntax error on "{1 => 2, *3}" says syntax error on "{1 => 2, *3}" - says syntax error on "case {*1}\nwhen {2}; 3; end" says syntax error on "case {*1}\nwhen {2}; 3; end" - parses "Set {*{1} * 2}" parses "Set {*{1} * 2}" - parses "[*1, 2]" parses "[*1, 2]" - parses "{*1, *2}" parses "{*1, *2}" - parses "x = {*1}" parses "x = {*1}" - parses "case 1\nwhen {*2}; 3; end" parses "case 1\nwhen {*2}; 3; end" - parses "[*1]" parses "[*1]" - parses "[*[*[1]], *[2]]" parses "[*[*[1]], *[2]]" - says syntax error on "{a: 1, *2}" says syntax error on "{a: 1, *2}" - parses "{*1, 2}" parses "{*1, 2}" - parses "{1, *2}" parses "{1, *2}" - parses "Set {*1, 2, *3}" parses "Set {*1, 2, *3}" - parses "[1, *2]" parses "[1, *2]" - parses "{*1 * 2}" parses "{*1 * 2}" - says syntax error on "{*1 => 2}" says syntax error on "{*1 => 2}" - parses "[1, *2, 3, *4, 5]" parses "[1, *2, 3, *4, 5]" - parses "{*1}" parses "{*1}" - says syntax error on "{*a: 1}" says syntax error on "{*a: 1}" - parses "[*1, *2]" parses "[*1, *2]" - parses "yield" parses "yield" - parses "def foo(x, *, y); 1; end" parses "def foo(x, *, y); 1; end" - parses "case 1\nwhen .responds_to?(:foo)\n2\nend" parses "case 1\nwhen .responds_to?(:foo)\n2\nend" - says syntax error on "*a, *b = 1" says syntax error on "*a, *b = 1" - parses "foo.&(1, 2) { 3 }" parses "foo.&(1, 2) { 3 }" - says syntax error on "foo &.&&()" says syntax error on "foo &.&&()" - parses "foo.===(1, 2)" parses "foo.===(1, 2)" - parses "begin; 1; rescue; 2; else; 3; end" parses "begin; 1; rescue; 2; else; 3; end" - sets correct location of instance variable in proc pointer sets correct location of instance variable in proc pointer - parses "def |; end;" parses "def |; end;" - parses "a = 1; a -=\n1" parses "a = 1; a -=\n1" - parses "begin : Int32" parses "begin : Int32" - parses "1+0" parses "1+0" - parses "{% begin %}%i{ %s }{% end %}" parses "{% begin %}%i{ %s }{% end %}" - says syntax error on "[\n]" says syntax error on "[\n]" - says syntax error on "def foo(foo protected); end" says syntax error on "def foo(foo protected); end" - parses "foo(a: 1\n)" parses "foo(a: 1\n)" - parses "a.b >>=\n1" parses "a.b >>=\n1" - parses "foo.>=(1, 2)" parses "foo.>=(1, 2)" - parses "a = 1; a[2] &&= 3" parses "a = 1; a[2] &&= 3" - parses "property next : Int32" parses "property next : Int32" - parses "{/ / => / /, / / => / /}" parses "{/ / => / /, / / => / /}" - says syntax error on "macro !;end" says syntax error on "macro !;end" - parses "property break : Int32" parses "property break : Int32" - parses "[] of ->\n" parses "[] of ->\n" - parses "{% begin %}%r<\\A>{% end %}" parses "{% begin %}%r<\\A>{% end %}" - parses "def foo(@var); 1; end" parses "def foo(@var); 1; end" - parses "class : Int32" parses "class : Int32" - says syntax error on "def f end" says syntax error on "def f end" - parses "{[] of Foo, ::foo}" parses "{[] of Foo, ::foo}" - parses "def self.===; end;" parses "def self.===; end;" - says syntax error on "def foo(foo module); end" says syntax error on "def foo(foo module); end" - parses "->Foo.&-(Int32)" parses "->Foo.&-(Int32)" - parses "macro foo; 1 + 2 {{ foo }} 3 + 4; end" parses "macro foo; 1 + 2 {{ foo }} 3 + 4; end" - parses "a.b ^=\n1" parses "a.b ^=\n1" - parses "a = 1\nfoo - a" parses "a = 1\nfoo - a" - parses "macro foo;bar{% if x %}body{% else %}body2{%end%}baz;end" parses "macro foo;bar{% if x %}body{% else %}body2{%end%}baz;end" - parses "case {1, 2}\nwhen {.foo, .bar}\n5\nend" parses "case {1, 2}\nwhen {.foo, .bar}\n5\nend" - parses "lib LibC\nfun getch = \"get.char\"\nend" parses "lib LibC\nfun getch = \"get.char\"\nend" - says syntax error on "*a, b, c, d = 1, 2" says syntax error on "*a, b, c, d = 1, 2" - parses "def foo(a, &block : Int, self -> Double); end" parses "def foo(a, &block : Int, self -> Double); end" - says syntax error on "def foo(foo class); end" says syntax error on "def foo(foo class); end" - parses "\n class Foo\n def bar\n print as Foo\n end\n end\n " parses "\n class Foo\n def bar\n print as Foo\n end\n end\n " - says syntax error on "-> :Int32 { }" says syntax error on "-> :Int32 { }" - says syntax error on "{1 2}" says syntax error on "{1 2}" - says syntax error on "{foo: 1, bar: 2\nbaz: 3}" says syntax error on "{foo: 1, bar: 2\nbaz: 3}" - parses "foo(\n &.block\n)" parses "foo(\n &.block\n)" - parses "def foo(x = __LINE__); end" parses "def foo(x = __LINE__); end" - parses "%Q{hello \\n world}" parses "%Q{hello \\n world}" - parses "macro *;end" parses "macro *;end" - parses "1.[]?(2)" parses "1.[]?(2)" - parses "a ?\n b ? b1 : b2\n : c ? 3\n : 0" parses "a ?\n b ? b1 : b2\n : c ? 3\n : 0" - parses "property return : Int32" parses "property return : Int32" - says syntax error on "def self.is_a?; end" says syntax error on "def self.is_a?; end" - says syntax error on "next .. 1" says syntax error on "next .. 1" - parses "a = 1; a &-= 1" parses "a = 1; a &-= 1" - says syntax error on "while 1 == 1 a; end" says syntax error on "while 1 == 1 a; end" - parses "def foo(x @@private); end" parses "def foo(x @@private); end" - says syntax error on "def foo 1; end" says syntax error on "def foo 1; end" - parses "foo +1" parses "foo +1" - parses "return *1" parses "return *1" - says syntax error on "{a[]: 1}" says syntax error on "{a[]: 1}" - parses "[1] /2" parses "[1] /2" - parses "->Foo.-(Int32)" parses "->Foo.-(Int32)" - parses "extend self" parses "extend self" - says syntax error on "def foo(protected); end" says syntax error on "def foo(protected); end" - parses "1;+2" parses "1;+2" - parses "__DIR__" parses "__DIR__" - parses "1" parses "1" - parses "foo = 1; ->foo.==(Int32)" parses "foo = 1; ->foo.==(Int32)" - parses "foo\n .bar" parses "foo\n .bar" - parses "/\\ /" parses "/\\ /" - says syntax error on "foo { |(until)| }" says syntax error on "foo { |(until)| }" - parses "1 ensure 2 if 3" parses "1 ensure 2 if 3" - says syntax error on "def foo(x : U) forall U,; end" says syntax error on "def foo(x : U) forall U,; end" - parses "foo rescue 2" parses "foo rescue 2" - says syntax error on "def foo(foo macro); end" says syntax error on "def foo(foo macro); end" - parses "begin\n1\nend\nif true; end" parses "begin\n1\nend\nif true; end" - parses "macro &;end" parses "macro &;end" - says syntax error on "def foo(*x, **x); end" says syntax error on "def foo(*x, **x); end" - says syntax error on "foo { |(def)| }" says syntax error on "foo { |(def)| }" - parses "def ===(); end;" parses "def ===(); end;" - parses "def foo(@offsetof); end" parses "def foo(@offsetof); end" - parses "1 +\n2" parses "1 +\n2" - parses "/\\//" parses "/\\//" - parses "def foo(@end); end" parses "def foo(@end); end" - says syntax error on "def foo(*args = 1); end" says syntax error on "def foo(*args = 1); end" - parses "case 1; when x then 2; else; 3; end" parses "case 1; when x then 2; else; 3; end" - parses "{% begin %}%Q( %s ){% end %}" parses "{% begin %}%Q( %s ){% end %}" - parses "foo.<=" parses "foo.<=" - parses "lib LibC; enum Foo; A = 1; B; end end" parses "lib LibC; enum Foo; A = 1; B; end end" - says syntax error on "foo.&&()" says syntax error on "foo.&&()" - parses "{% begin %}%i| %s |{% end %}" parses "{% begin %}%i| %s |{% end %}" - parses "def &; end;" parses "def &; end;" - says syntax error on "*a if true = 2" says syntax error on "*a if true = 2" - parses "foo(z: 0, a: n % 2)" parses "foo(z: 0, a: n % 2)" - parses ":=~" parses ":=~" - parses "def foo(a, &block : Int -> Double); end" parses "def foo(a, &block : Int -> Double); end" - parses "foo.- do end" parses "foo.- do end" - parses "def foo(while foo); end" parses "def foo(while foo); end" - parses "return : Int32" parses "return : Int32" - parses "foo(n > 2)" parses "foo(n > 2)" - says syntax error on " [1, 2, 3 end" says syntax error on " [1, 2, 3 end" - parses "{foo:a, bar:b}" parses "{foo:a, bar:b}" - parses "module Foo; end" parses "module Foo; end" - says syntax error on "1 if next" says syntax error on "1 if next" - says syntax error on "case 1; when return; end; end" says syntax error on "case 1; when return; end; end" - parses "macro <<;end" parses "macro <<;end" - says syntax error on "def foo(x, x); end" says syntax error on "def foo(x, x); end" - parses "[\n1, 2]" parses "[\n1, 2]" - parses "def foo(@@begin); end" parses "def foo(@@begin); end" - parses "def foo(@next); end" parses "def foo(@next); end" - parses "a = 1; a /=\n1" parses "a = 1; a /=\n1" - parses "*a, b = 1, 2, 3, 4" parses "*a, b = 1, 2, 3, 4" - parses "<<-HERE\n \#{1} \\n \#{2}\n HERE" parses "<<-HERE\n \#{1} \\n \#{2}\n HERE" - parses ":\"\\a\\b\\n\\r\\t\\v\\f\\e\"" parses ":\"\\a\\b\\n\\r\\t\\v\\f\\e\"" - sets correct location of global path in annotation sets correct location of global path in annotation - says syntax error on "def foo(x, **x); end" says syntax error on "def foo(x, **x); end" - parses "nil?" parses "nil?" - says syntax error on "foo { |while| }" says syntax error on "foo { |while| }" - says syntax error on "foo(&block) {}" says syntax error on "foo(&block) {}" - parses "foo %Q()" parses "foo %Q()" - parses "property offsetof : Int32" parses "property offsetof : Int32" - parses "f.x %= 2" parses "f.x %= 2" - parses "f.x &-= 2" parses "f.x &-= 2" - parses "{% begin %}%r(\\A){% end %}" parses "{% begin %}%r(\\A){% end %}" - parses "foo &.each {\n}" parses "foo &.each {\n}" - parses "{% begin %}%< %s >{% end %}" parses "{% begin %}%< %s >{% end %}" - parses "->@foo.foo=" parses "->@foo.foo=" - parses "1 +2_i64" parses "1 +2_i64" - parses ":~" parses ":~" - parses "def foo(x @false); end" parses "def foo(x @false); end" - parses "break *1" parses "break *1" - parses "def self.**(); end;" parses "def self.**(); end;" - says syntax error on "foo { |(lib)| }" says syntax error on "foo { |(lib)| }" - parses "if foo\n1\nelse\n2\nend" parses "if foo\n1\nelse\n2\nend" - parses "@[Foo]" parses "@[Foo]" - parses "def foo(@typeof); end" parses "def foo(@typeof); end" - says syntax error on "def foo!=; end" says syntax error on "def foo!=; end" - parses "def foo(@var); end" parses "def foo(@var); end" - parses "&+ 1" parses "&+ 1" - says syntax error on "foo(next)" says syntax error on "foo(next)" - parses "macro foo;%var unless true;end" parses "macro foo;%var unless true;end" - parses "<<-HERE\r\n One\r\n Zero\r\n HERE" parses "<<-HERE\r\n One\r\n Zero\r\n HERE" - parses "lib LibC\nfun getchar(a : Int)\nend" parses "lib LibC\nfun getchar(a : Int)\nend" - parses "1\\\r\n + 2" parses "1\\\r\n + 2" - parses "foo.>= 1, 2" parses "foo.>= 1, 2" - parses "case 1\nin nil; 2; end" parses "case 1\nin nil; 2; end" - says syntax error on "break ? 1 : 2" says syntax error on "break ? 1 : 2" - parses "/fo\\so/" parses "/fo\\so/" - parses "/(fo\#{\"bar\"}\#{1}o)/" parses "/(fo\#{\"bar\"}\#{1}o)/" - parses "abstract def foo : Int32" parses "abstract def foo : Int32" - parses "def foo; x { |a| a }; end" parses "def foo; x { |a| a }; end" - parses "def foo(@@var); end" parses "def foo(@@var); end" - parses "1 == 2" parses "1 == 2" - parses "def !~; end;" parses "def !~; end;" - says syntax error on "1 then" says syntax error on "1 then" - says syntax error on "foo { |(a b)| }" says syntax error on "foo { |(a b)| }" - parses "foo(0, n & 2)" parses "foo(0, n & 2)" - says syntax error on "foo { |struct| }" says syntax error on "foo { |struct| }" - parses "lib LibC\nfun getch = \"get.char\" : Int32\nend" parses "lib LibC\nfun getch = \"get.char\" : Int32\nend" - parses "a = 1; a +=\n1" parses "a = 1; a +=\n1" - parses "def foo(fun foo); end" parses "def foo(fun foo); end" - parses "foo.bar = {} of Int32 => Int32" parses "foo.bar = {} of Int32 => Int32" - parses "Foo?" parses "Foo?" - parses "foo(&block)" parses "foo(&block)" - says syntax error on "def foo(foo begin); end" says syntax error on "def foo(foo begin); end" - says syntax error on "{1, ->{ |_| x } }" says syntax error on "{1, ->{ |_| x } }" - parses "{{ //.options }}" parses "{{ //.options }}" - parses "sizeof(X)" parses "sizeof(X)" - parses "<<-FOO\n\t 1\n\t FOO" parses "<<-FOO\n\t 1\n\t FOO" - parses "def foo(@out); end" parses "def foo(@out); end" - parses "case 1; when 0, 1; 2; else; 3; end" parses "case 1; when 0, 1; 2; else; 3; end" - parses "{% begin %}%x| %s |{% end %}" parses "{% begin %}%x| %s |{% end %}" - calls with blocks within index operator (#12818) - parses "foo[bar do; 1; end]" parses "foo[bar do; 1; end]" - parses "foo.[bar do; 1; end]" parses "foo.[bar do; 1; end]" - parses "foo[bar { 1 }]" parses "foo[bar { 1 }]" - parses "foo.[](bar do; 1; end)" parses "foo.[](bar do; 1; end)" - parses "foo.[](bar { 1 })" parses "foo.[](bar { 1 })" - parses "foo.[bar { 1 }]" parses "foo.[bar { 1 }]" - parses "def -; end;" parses "def -; end;" - parses "{foo:'a', bar:'b'}" parses "{foo:'a', bar:'b'}" - parses "->@@foo.foo" parses "->@@foo.foo" - parses "1..;" parses "1..;" - parses "property pointerof : Int32" parses "property pointerof : Int32" - parses "lib LibC\nend" parses "lib LibC\nend" - parses "instance_sizeof(\n Int32\n)" parses "instance_sizeof(\n Int32\n)" - parses "foo./ 1, 2" parses "foo./ 1, 2" - says syntax error on "def foo(while); end" says syntax error on "def foo(while); end" - parses "asm(\n\"nop\"\n:\n\"a\"(0),\n\"b\"(1)\n:\n\"c\"(2),\n\"d\"(3)\n)" parses "asm(\n\"nop\"\n:\n\"a\"(0),\n\"b\"(1)\n:\n\"c\"(2),\n\"d\"(3)\n)" - parses "foo(n =~ 2)" parses "foo(n =~ 2)" - parses "foo = 1; ->foo.*(Int32)" parses "foo = 1; ->foo.*(Int32)" - says syntax error on "{\n1 => 2, 3 => 4\n5 => 6}" says syntax error on "{\n1 => 2, 3 => 4\n5 => 6}" - says syntax error on "def foo(enum); end" says syntax error on "def foo(enum); end" - says syntax error on "foo { |pointerof| }" says syntax error on "foo { |pointerof| }" - parses "def self.^(); end;" parses "def self.^(); end;" - says syntax error on "def foo(require); end" says syntax error on "def foo(require); end" - parses "\"foo\#{\"bar\"}baz\"" parses "\"foo\#{\"bar\"}baz\"" - parses "case 1\nwhen .as(T)\n2\nend" parses "case 1\nwhen .as(T)\n2\nend" - parses "def []=(*args, **opts, &); end" parses "def []=(*args, **opts, &); end" - parses "x = 1 rescue 2" parses "x = 1 rescue 2" - parses "def self.[]?; end" parses "def self.[]?; end" - parses "def foo(x @require); end" parses "def foo(x @require); end" - parses "foo(z: 0, a: n - 2)" parses "foo(z: 0, a: n - 2)" - parses "foo = 1; ->foo.+(Int32)" parses "foo = 1; ->foo.+(Int32)" - says syntax error on "foo { |(pointerof)| }" says syntax error on "foo { |(pointerof)| }" - says syntax error on "def foo(include); end" says syntax error on "def foo(include); end" - says syntax error on "return & 1" says syntax error on "return & 1" - says syntax error on "*a, 1 = 2" says syntax error on "*a, 1 = 2" - parses "foo(bar { })" parses "foo(bar { })" - parses "def foo(x @@fun); end" parses "def foo(x @@fun); end" - says syntax error on "1 ... return" says syntax error on "1 ... return" - says syntax error on "foo { |(x, x)| }" says syntax error on "foo { |(x, x)| }" - says syntax error on "def nil?; end" says syntax error on "def nil?; end" - says syntax error on "return // 1" says syntax error on "return // 1" - parses "->foo!" parses "->foo!" - says syntax error on "return[]" says syntax error on "return[]" - parses "def foo(@@extend); end" parses "def foo(@@extend); end" - parses "property extend : Int32" parses "property extend : Int32" - parses "foo.**(1, 2)" parses "foo.**(1, 2)" - parses "def =~; end" parses "def =~; end" - says syntax error on "foo { |yield| }" says syntax error on "foo { |yield| }" - parses "a; if / /\n/ /\nelsif / /\n/ /\nend" parses "a; if / /\n/ /\nelsif / /\n/ /\nend" - parses "a, b = 1" parses "a, b = 1" - parses "@a : Foo" parses "@a : Foo" - parses "next {1, 2}" parses "next {1, 2}" - parses "foo(n | 2)" parses "foo(n | 2)" - parses "typeof(1)" parses "typeof(1)" - parses "::T/1" parses "::T/1" - parses "{A: 1, B: 2}" parses "{A: 1, B: 2}" - parses "return {1, 2}" parses "return {1, 2}" - says syntax error on "return === 1" says syntax error on "return === 1" - says syntax error on "break << 1" says syntax error on "break << 1" - parses "{\"foo\": 1, \"bar\": 2}" parses "{\"foo\": 1, \"bar\": 2}" - says syntax error on "foo &.&&" says syntax error on "foo &.&&" - parses "foo.bar.baz" parses "foo.bar.baz" - parses "def self.==; end;" parses "def self.==; end;" - says syntax error on "self, x = 1, 2" says syntax error on "self, x = 1, 2" - parses "macro foo;bar{% for x, y in z %}body{% end %}baz;end" parses "macro foo;bar{% for x, y in z %}body{% end %}baz;end" - says syntax error on "A = begin; 1; rescue; 1; else; B = 1; end" says syntax error on "A = begin; 1; rescue; 1; else; B = 1; end" - says syntax error on "next + 1" says syntax error on "next + 1" - parses "a.b -=\n1" parses "a.b -=\n1" - says syntax error on "@foo :: Foo" says syntax error on "@foo :: Foo" - says syntax error on "Set {1, 2, 3} of Int32" says syntax error on "Set {1, 2, 3} of Int32" - parses "def Foo.foo\n1\nend" parses "def Foo.foo\n1\nend" - parses "def foo(@@yield); end" parses "def foo(@@yield); end" - parses "case 1\nin Foo(Int32); 2; end" parses "case 1\nin Foo(Int32); 2; end" - parses "def self.|; end;" parses "def self.|; end;" - parses "break" parses "break" - says syntax error on "def Foo(Int32).bar;end" says syntax error on "def Foo(Int32).bar;end" - parses "def foo(@while); end" parses "def foo(@while); end" - parses "return *1, 2" parses "return *1, 2" - parses "[/ /, / /]" parses "[/ /, / /]" - parses "a = 1; a %= 1" parses "a = 1; a %= 1" - parses "Foo(T)?" parses "Foo(T)?" - parses "foo.+" parses "foo.+" - parses "Foo(\nT,\nU,\n)" parses "Foo(\nT,\nU,\n)" - parses "foo.>=" parses "foo.>=" - parses "macro +;end" parses "macro +;end" - says syntax error on "macro foo;{%end};end" says syntax error on "macro foo;{%end};end" - says syntax error on "def foo(module); end" says syntax error on "def foo(module); end" - says syntax error on "return * 1" says syntax error on "return * 1" - parses "1_i64" parses "1_i64" - parses "begin; 1; 2; 3; end;" parses "begin; 1; 2; 3; end;" - says syntax error on "@:Foo" says syntax error on "@:Foo" - parses "def ^(); end" parses "def ^(); end" - parses "{% unless 1; 2; else 3; end %}" parses "{% unless 1; 2; else 3; end %}" - says syntax error on "macro as?; end" says syntax error on "macro as?; end" - parses "abstract def foo; 1" parses "abstract def foo; 1" - parses "foo[0] = 1" parses "foo[0] = 1" - parses "def foo(x @@sizeof); end" parses "def foo(x @@sizeof); end" - parses "foo = 1; foo {}" parses "foo = 1; foo {}" - parses "macro foo; 1 + 2; end" parses "macro foo; 1 + 2; end" - parses "macro foo; 1 + 2 {{foo}} 3 + 4; end" parses "macro foo; 1 + 2 {{foo}} 3 + 4; end" - parses "1.x; foo do\nend" parses "1.x; foo do\nend" - parses "Foo(\nx:\nT,\ny:\nU,\n)" parses "Foo(\nx:\nT,\ny:\nU,\n)" - parses "foo = 1; foo(-1)" parses "foo = 1; foo(-1)" - parses "def foo(@@false); end" parses "def foo(@@false); end" - parses "foo &.each do\nend" parses "foo &.each do\nend" - parses "as(Bar)" parses "as(Bar)" - says syntax error on "foo { |(private)| }" says syntax error on "foo { |(private)| }" - parses "foo /;/" parses "foo /;/" - parses "lib LibC; struct Foo; x : Int**; end end" parses "lib LibC; struct Foo; x : Int**; end end" - parses "foo &.block=(0)" parses "foo &.block=(0)" - parses "macro foo\n <<-FOO, <<-BAR + \"\"\n FOO\n BAR\nend" parses "macro foo\n <<-FOO, <<-BAR + \"\"\n FOO\n BAR\nend" - says syntax error on "case 1\nin 1; 2" says syntax error on "case 1\nin 1; 2" - says syntax error on "*1, a = 2" says syntax error on "*1, a = 2" - parses "return if true" parses "return if true" - parses "{% a = 1 if 2 %}" parses "{% a = 1 if 2 %}" - says syntax error on "macro is_a?; end" says syntax error on "macro is_a?; end" - parses "def foo(x @@offsetof); end" parses "def foo(x @@offsetof); end" - parses "foo if 3" parses "foo if 3" - parses ":<=>" parses ":<=>" - parses "macro foo;bar{% if x %}body{% end %}baz;end" parses "macro foo;bar{% if x %}body{% end %}baz;end" - parses "%x(`which(foo)`)" parses "%x(`which(foo)`)" - parses "enum Foo; def foo; 1; end; end" parses "enum Foo; def foo; 1; end; end" - parses "foo.^(1, 2) { 3 }" parses "foo.^(1, 2) { 3 }" - says syntax error on "<<-HERE\n One\n \#{1}\n wrong\n HERE" says syntax error on "<<-HERE\n One\n \#{1}\n wrong\n HERE" - says syntax error on "a = 1, 2, 3" says syntax error on "a = 1, 2, 3" - parses "foo.!.!" parses "foo.!.!" - parses "var.@foo" parses "var.@foo" - parses "n | 2" parses "n | 2" - parses "a.b &-=\n1" parses "a.b &-=\n1" - parses "def foo(var : (Int, Float) -> Double); end" parses "def foo(var : (Int, Float) -> Double); end" - parses "foo.%" parses "foo.%" - parses "::Foo{\"x\" => \"y\"}" parses "::Foo{\"x\" => \"y\"}" - says syntax error on "foo { |x, (x)| }" says syntax error on "foo { |x, (x)| }" - says syntax error on "foo { |(while)| }" says syntax error on "foo { |(while)| }" - parses "def foo(@select); end" parses "def foo(@select); end" - parses "a = 1; a //=\n1" parses "a = 1; a //=\n1" - parses "def foo(a, &block); end" parses "def foo(a, &block); end" - parses "puts {{*1}}" parses "puts {{*1}}" - says syntax error on "{one: :two, three: :four} of Symbol => Symbol" says syntax error on "{one: :two, three: :four} of Symbol => Symbol" - parses "case 1; end" parses "case 1; end" - parses "foo +1_i64" parses "foo +1_i64" - parses "->(x : Int32) : Int32 { }" parses "->(x : Int32) : Int32 { }" - parses "foo(/ /)" parses "foo(/ /)" - parses "a = 1; a ^= 1" parses "a = 1; a ^= 1" - says syntax error on "macro foo x; 1 + 2; end" says syntax error on "macro foo x; 1 + 2; end" - parses "\"hello \"\\\n\"world\"" parses "\"hello \"\\\n\"world\"" - says syntax error on "next == 1" says syntax error on "next == 1" - parses "abstract def foo(x) : Int32" parses "abstract def foo(x) : Int32" - parses "foo(z: 0, a: n // 2)" parses "foo(z: 0, a: n // 2)" - says syntax error on "def foo(begin); end" says syntax error on "def foo(begin); end" - parses "def /(); end" parses "def /(); end" - parses "foo(z: 0, a: n &- 2)" parses "foo(z: 0, a: n &- 2)" - parses "foo &.as(T)" parses "foo &.as(T)" - parses "puts %w(one two)" parses "puts %w(one two)" - parses "x, y, z = <<-FOO, <<-BAR, <<-BAZ\nhello\nFOO\nworld\nBAR\n!\nBAZ" parses "x, y, z = <<-FOO, <<-BAR, <<-BAZ\nhello\nFOO\nworld\nBAR\n!\nBAZ" - parses "a/b" parses "a/b" - parses "def foo(**args : **Foo)\n1\nend" parses "def foo(**args : **Foo)\n1\nend" - parses "1 ** 2" parses "1 ** 2" - parses "def foo(@sizeof); end" parses "def foo(@sizeof); end" - parses "foo.<(1, 2) { 3 }" parses "foo.<(1, 2) { 3 }" - parses "foo %w()" parses "foo %w()" - parses "foo.>(1, 2)" parses "foo.>(1, 2)" - parses "macro foo; 1 + 2 {{foo}}\\ 3 + 4; end" parses "macro foo; 1 + 2 {{foo}}\\ 3 + 4; end" - parses "+1_i64" parses "+1_i64" - parses "next if true" parses "next if true" - parses "Foo({X, Y})" parses "Foo({X, Y})" - says syntax error on "asm(\"\" : 1)" says syntax error on "asm(\"\" : 1)" - parses "def foo(x, *y : Int32); 1; end" parses "def foo(x, *y : Int32); 1; end" - says syntax error on "while return; end" says syntax error on "while return; end" - parses "foo bar.baz(1) do\nend" parses "foo bar.baz(1) do\nend" - parses "def foo(&block); end" parses "def foo(&block); end" - parses "foo.[]=(1, 2)" parses "foo.[]=(1, 2)" - says syntax error on "->::foo.foo" says syntax error on "->::foo.foo" - parses ":|" parses ":|" - parses "foo(a: n ** 2)" parses "foo(a: n ** 2)" - says syntax error on "next.foo" says syntax error on "next.foo" - parses "def foo(var : Char[N]); end" parses "def foo(var : Char[N]); end" - parses "next {1 => 2}" parses "next {1 => 2}" - says syntax error on "module Foo; require \"bar\"; end" says syntax error on "module Foo; require \"bar\"; end" - parses "def []=(other, file = 1); end" parses "def []=(other, file = 1); end" - parses "foo = 1; b = 2; foo +b" parses "foo = 1; b = 2; foo +b" - parses "<<-'HERE'\n hello \\n world\n \#{1}\n HERE" parses "<<-'HERE'\n hello \\n world\n \#{1}\n HERE" - says syntax error on "return ? 1 : 2" says syntax error on "return ? 1 : 2" - says syntax error on "while break; end" says syntax error on "while break; end" - parses "alias : Int32" parses "alias : Int32" - parses "def foo(x @protected); end" parses "def foo(x @protected); end" - parses "macro !~;end" parses "macro !~;end" - parses "def >=(*args, **opts); end" parses "def >=(*args, **opts); end" - says syntax error on "def =\nend" says syntax error on "def =\nend" - parses "Foo::Bar" parses "Foo::Bar" - parses "foo.nil?( )" parses "foo.nil?( )" - parses "{% begin %}%{ %s }{% end %}" parses "{% begin %}%{ %s }{% end %}" - parses "yield : Int32" parses "yield : Int32" - parses "[\n1\n]" parses "[\n1\n]" - parses "def foo(x @@out); end" parses "def foo(x @@out); end" - parses "f.x &+= 2" parses "f.x &+= 2" - parses "def foo(var : Int*); end" parses "def foo(var : Int*); end" - parses "a.foo &block" parses "a.foo &block" - parses "while true; end;" parses "while true; end;" - parses "->Foo.foo" parses "->Foo.foo" - says syntax error on "return ^ 1" says syntax error on "return ^ 1" - parses "property lib : Int32" parses "property lib : Int32" - parses "pointerof(@a)" parses "pointerof(@a)" - says syntax error on "class Foo(T, T); end" says syntax error on "class Foo(T, T); end" - parses "enum Foo; @[Bar]; end" parses "enum Foo; @[Bar]; end" - parses "def ^(); end;" parses "def ^(); end;" - says syntax error on "1 foo" says syntax error on "1 foo" - parses "foo x, y do\nend" parses "foo x, y do\nend" - parses "foo(n == 2)" parses "foo(n == 2)" - parses "offsetof : Int32" parses "offsetof : Int32" - parses "next *{1, 2}" parses "next *{1, 2}" - parses "property elsif : Int32" parses "property elsif : Int32" - parses "break {1, 2}" parses "break {1, 2}" - parses "property private : Int32" parses "property private : Int32" - parses "def foo(true foo); end" parses "def foo(true foo); end" - parses "def foo(x @include); end" parses "def foo(x @include); end" - parses "foo(a: n + 2)" parses "foo(a: n + 2)" - parses "foo(z: 0, a: n =~ 2)" parses "foo(z: 0, a: n =~ 2)" - parses "def foo(@@typeof); end" parses "def foo(@@typeof); end" - says syntax error on "foo(break)" says syntax error on "foo(break)" - parses "foo.% 1, 2" parses "foo.% 1, 2" - says syntax error on "a.b {}, c = 1" says syntax error on "a.b {}, c = 1" - parses "{% begin %}%Q[ %s ]{% end %}" parses "{% begin %}%Q[ %s ]{% end %}" - parses "foo(0, n === 2)" parses "foo(0, n === 2)" - parses "case 1\nwhen 1\n2\nend" parses "case 1\nwhen 1\n2\nend" - parses "when : Int32" parses "when : Int32" - parses "def foo(protected foo); end" parses "def foo(protected foo); end" - parses "def foo(x, *, y, &); 1; end" parses "def foo(x, *, y, &); 1; end" - parses "def foo(x @self); end" parses "def foo(x @self); end" - parses "{% begin %}%i[ %s ]{% end %}" parses "{% begin %}%i[ %s ]{% end %}" - parses "begin; 1; rescue ex : Foo | Bar; 2; end" parses "begin; 1; rescue ex : Foo | Bar; 2; end" - says syntax error on "break &** 1" says syntax error on "break &** 1" - parses "n % 2" parses "n % 2" - says syntax error on "def foo(x @@x); 1; end" says syntax error on "def foo(x @@x); 1; end" - parses "foo(n >= 2)" parses "foo(n >= 2)" - parses "foo%Q" parses "foo%Q" - says syntax error on "def foo(**args = 1); end" says syntax error on "def foo(**args = 1); end" - parses "foo(x, *bar, *baz, y)" parses "foo(x, *bar, *baz, y)" - parses "@foo = 1" parses "@foo = 1" - parses "ensure : Int32" parses "ensure : Int32" - says syntax error on "foo.&&" says syntax error on "foo.&&" - parses "def foo(var : (Int, Float -> Double)); end" parses "def foo(var : (Int, Float -> Double)); end" - parses "foo(n !~ 2)" parses "foo(n !~ 2)" - says syntax error on "1 ... break" says syntax error on "1 ... break" - parses "a, b, *c = 1, 2" parses "a, b, *c = 1, 2" - parses "def foo(x @@module); end" parses "def foo(x @@module); end" - says syntax error on "def foo():String\nend" says syntax error on "def foo():String\nend" - parses "a = 1; a **=\n1" parses "a = 1; a **=\n1" - parses "def foo(@module); end" parses "def foo(@module); end" - parses "foo\n #comment\n .bar" parses "foo\n #comment\n .bar" - parses "def foo(abstract foo); end" parses "def foo(abstract foo); end" - says syntax error on "->(x y) { }" says syntax error on "->(x y) { }" - parses "Foo?" parses "Foo?" - parses "typeof(a = 1); a" parses "typeof(a = 1); a" - parses "Foo??" parses "Foo??" - parses "f.x //= 2" parses "f.x //= 2" - parses "if foo; 1; elsif bar; 2; else 3; end" parses "if foo; 1; elsif bar; 2; else 3; end" - parses "Foo(X, instance_sizeof(Int32))" parses "Foo(X, instance_sizeof(Int32))" - parses "foo = 1; ->foo.^(Int32)" parses "foo = 1; ->foo.^(Int32)" - says syntax error on "foo { |(yield)| }" says syntax error on "foo { |(yield)| }" - parses "select\nwhen foo\n2\nwhen bar\n4\nend" parses "select\nwhen foo\n2\nwhen bar\n4\nend" - parses "{{ nil?(foo) }}" parses "{{ nil?(foo) }}" - says syntax error on "def foo\nmodule\nend" says syntax error on "def foo\nmodule\nend" - parses "foo(n - 2)" parses "foo(n - 2)" - sets correct location of annotation in enum sets correct location of annotation in enum - parses "foo.== 1, 2" parses "foo.== 1, 2" - says syntax error on "a = next" says syntax error on "a = next" - parses "{[] of Foo, Bar::Baz * 2}" parses "{[] of Foo, Bar::Baz * 2}" - says syntax error on "def foo(select); end" says syntax error on "def foo(select); end" - says syntax error on "foo { |(typeof)| }" says syntax error on "foo { |(typeof)| }" - parses "case {1}\nin {Foo(Int32)}; 2; end" parses "case {1}\nin {Foo(Int32)}; 2; end" - parses "<<-FOO\n\t1\n\tFOO" parses "<<-FOO\n\t1\n\tFOO" - parses "def self.>=; end;" parses "def self.>=; end;" - parses "->Foo.!~(Int32)" parses "->Foo.!~(Int32)" - parses "a : Foo()*" parses "a : Foo()*" - parses "def foo(var); end" parses "def foo(var); end" - parses "{foo:\"a\", bar:\"b\"}" parses "{foo:\"a\", bar:\"b\"}" - parses "foo(n & 2)" parses "foo(n & 2)" - parses "foo = 1; foo -1" parses "foo = 1; foo -1" - parses "responds_to?(:foo)" parses "responds_to?(:foo)" - says syntax error on "def foo @@var, █ end" says syntax error on "def foo @@var, █ end" - says syntax error on "def foo(x: Int32); end" says syntax error on "def foo(x: Int32); end" - parses "foo.Bar" parses "foo.Bar" - parses "a = 1; a &+= 1" parses "a = 1; a &+= 1" - says syntax error on "(1, 2 3)" says syntax error on "(1, 2 3)" - parses "def foo(@@in); end" parses "def foo(@@in); end" - parses "foo = 1; ->foo.[](Int32)" parses "foo = 1; ->foo.[](Int32)" - parses "->foo" parses "->foo" - parses "module Foo\ndef foo; end; end" parses "module Foo\ndef foo; end; end" - parses "1 &** 2" parses "1 &** 2" - says syntax error on "foo { |(in)| }" says syntax error on "foo { |(in)| }" - says syntax error on "def foo :String\nend" says syntax error on "def foo :String\nend" - says syntax error on "1 ... next" says syntax error on "1 ... next" - parses "foo = 1; foo &x" parses "foo = 1; foo &x" - parses "enum : Int32" parses "enum : Int32" - parses "@[Foo::Bar]" parses "@[Foo::Bar]" - parses "foo.*(1, 2) { 3 }" parses "foo.*(1, 2) { 3 }" - says syntax error on "case 1 == 1 a; when 2; end" says syntax error on "case 1 == 1 a; when 2; end" - parses "nil" parses "nil" - parses "a = 1; a %=\n1" parses "a = 1; a %=\n1" - parses "def foo(x @@until); end" parses "def foo(x @@until); end" - says syntax error on "def foo(foo nil); end" says syntax error on "def foo(foo nil); end" - parses "a = 1; a -= 1" parses "a = 1; a -= 1" - says syntax error on "def foo(foo alias); end" says syntax error on "def foo(foo alias); end" - says syntax error on "foo { |(begin)| }" says syntax error on "foo { |(begin)| }" - parses "def foo(@[Foo] &@block); end" parses "def foo(@[Foo] &@block); end" - parses "def foo(@[Foo] var); end" parses "def foo(@[Foo] var); end" - parses "foo &->bar" parses "foo &->bar" - parses "def foo(macro foo); end" parses "def foo(macro foo); end" - says syntax error on "Foo(\"\": T)" says syntax error on "Foo(\"\": T)" - parses "def foo(@@private); end" parses "def foo(@@private); end" - parses "return 1 if true" parses "return 1 if true" - says syntax error on "case {1, 2}; when {3}; 4; end" says syntax error on "case {1, 2}; when {3}; 4; end" - parses "1.tap do |x|; 1; rescue; x; end" parses "1.tap do |x|; 1; rescue; x; end" - parses "def foo(@@until); end" parses "def foo(@@until); end" - parses " def foo(\n @[Foo]\n id : Int32,\n @[Bar] name : String\n ); end" parses " def foo(\n @[Foo]\n id : Int32,\n @[Bar] name : String\n ); end" - parses "foo = 1; ->foo.<=(Int32)" parses "foo = 1; ->foo.<=(Int32)" - parses "foo(0, n | 2)" parses "foo(0, n | 2)" - says syntax error on "class Foo(*T, *U); end" says syntax error on "class Foo(*T, *U); end" - parses "def foo(unless foo); end" parses "def foo(unless foo); end" - says syntax error on "macro foo&&;end" says syntax error on "macro foo&&;end" - parses "Foo(\n)" parses "Foo(\n)" - parses "macro //;end" parses "macro //;end" - parses "def `(cmd); 1; end" parses "def `(cmd); 1; end" - parses "next : Int32" parses "next : Int32" - says syntax error on "b, 1 == 2, a = 4" says syntax error on "b, 1 == 2, a = 4" - says syntax error on "enum Foo\n A, B, C\nend\n" says syntax error on "enum Foo\n A, B, C\nend\n" - says syntax error on "def foo var; end" says syntax error on "def foo var; end" - parses "def /; end;" parses "def /; end;" - parses "1 -2.0" parses "1 -2.0" - parses "->Foo.|(Int32)" parses "->Foo.|(Int32)" - parses "macro &*;end" parses "macro &*;end" - parses "/foo/i" parses "/foo/i" - says syntax error on "foo { |fun| }" says syntax error on "foo { |fun| }" - parses "foo 1, a: 1, b: 2" parses "foo 1, a: 1, b: 2" - parses "n - 2" parses "n - 2" - parses "def foo(x @pointerof); end" parses "def foo(x @pointerof); end" - parses "{a: 1}" parses "{a: 1}" - says syntax error on "def foo\nfun\nend" says syntax error on "def foo\nfun\nend" - parses "foo%w" parses "foo%w" - parses "def foo(@@nil); end" parses "def foo(@@nil); end" - parses "def foo(@private); end" parses "def foo(@private); end" - parses "a.b |=\n1" parses "a.b |=\n1" - parses "a ? 1\n : b ? 2\n : c ? 3\n : 0" parses "a ? 1\n : b ? 2\n : c ? 3\n : 0" - parses "def foo(case foo); end" parses "def foo(case foo); end" - parses "%q{hello \#{foo} world}" parses "%q{hello \#{foo} world}" - parses "def <(); end;" parses "def <(); end;" - parses "class Foo < Bar; end" parses "class Foo < Bar; end" - parses "def foo(x @@enum); end" parses "def foo(x @@enum); end" - says syntax error on "def foo(\"bar\");end" says syntax error on "def foo(\"bar\");end" - parses "def foo(@instance_sizeof); end" parses "def foo(@instance_sizeof); end" - parses "\"hello \" \\\r\n \"world\"" parses "\"hello \" \\\r\n \"world\"" - says syntax error on "Foo(x: T y: U)" says syntax error on "Foo(x: T y: U)" - parses "def =~(); end;" parses "def =~(); end;" - parses "Foo(Bar(T | U))" parses "Foo(Bar(T | U))" - parses ":[]=" parses ":[]=" - parses "foo(n &* 2)" parses "foo(n &* 2)" - parses "1.foo do; 1; end" parses "1.foo do; 1; end" - says syntax error on "def foo(foo extend); end" says syntax error on "def foo(foo extend); end" - parses "foo.=== do end" parses "foo.=== do end" - parses "foo z: out x; x" parses "foo z: out x; x" - parses "foo &.as?(T).bar" parses "foo &.as?(T).bar" - parses "macro foo(@[Foo] var);end" parses "macro foo(@[Foo] var);end" - parses "1 <=> 2" parses "1 <=> 2" - parses "Foo({*X, *{Y}})" parses "Foo({*X, *{Y}})" - parses "foo.as(Bar)" parses "foo.as(Bar)" - parses "foo%i" parses "foo%i" - says syntax error on "A = begin; 1; ensure; B = 1; end" says syntax error on "A = begin; 1; ensure; B = 1; end" - says syntax error on "foo { |(unless)| }" says syntax error on "foo { |(unless)| }" - says syntax error on "foo { |(case)| }" says syntax error on "foo { |(case)| }" - parses "1.=~(2)" parses "1.=~(2)" - parses "pointerof(\n foo\n)" parses "pointerof(\n foo\n)" - says syntax error on "->(x, y z) { }" says syntax error on "->(x, y z) { }" - parses "Foo(T)" parses "Foo(T)" - says syntax error on "return &- 1" says syntax error on "return &- 1" - parses "macro foo(@[Foo] var);end" parses "macro foo(@[Foo] var);end" - parses "case \nwhen 1\n2\nend" parses "case \nwhen 1\n2\nend" - parses "foo.*(1, 2)" parses "foo.*(1, 2)" - parses "{% begin %}%q< %s >{% end %}" parses "{% begin %}%q< %s >{% end %}" - parses "def foo; yield(1); end" parses "def foo; yield(1); end" - says syntax error on "foo { |typeof| }" says syntax error on "foo { |typeof| }" - parses "asm(\n\"nop\"\n:\n\"a\"(0)\n:\n\"b\"(1),\n\"c\"(2)\n)" parses "asm(\n\"nop\"\n:\n\"a\"(0)\n:\n\"b\"(1),\n\"c\"(2)\n)" - parses "call \"foo\"" parses "call \"foo\"" - parses "def foo(x @out); end" parses "def foo(x @out); end" - parses "<<-HERE\n One\n\n Zero\n HERE" parses "<<-HERE\n One\n\n Zero\n HERE" - parses "private def foo; end" parses "private def foo; end" - parses "as?(Bar)" parses "as?(Bar)" - parses "def self./; end;" parses "def self./; end;" - parses "foo.!~ do end" parses "foo.!~ do end" - says syntax error on "<<-HERE\n One\n \#{1}\n Zero\n HERE" says syntax error on "<<-HERE\n One\n \#{1}\n Zero\n HERE" - parses "foo do\n//\nend" parses "foo do\n//\nend" - says syntax error on "a += 1" says syntax error on "a += 1" - parses "fun foo : Int32; 1; end; 2" parses "fun foo : Int32; 1; end; 2" - parses "def foo(@[Foo] var); end" parses "def foo(@[Foo] var); end" - parses "lib LibFoo\nend\nif true\nend" parses "lib LibFoo\nend\nif true\nend" - parses "1 +2" parses "1 +2" - says syntax error on "foo :: Foo" says syntax error on "foo :: Foo" - says syntax error on "def foo(x = 1, y); end" says syntax error on "def foo(x = 1, y); end" - parses "case when 1\n2\nend" parses "case when 1\n2\nend" - parses "lib LibC; enum Foo; A\nB; C\nD = 1; end end" parses "lib LibC; enum Foo; A\nB; C\nD = 1; end end" - parses "def foo(if foo); end" parses "def foo(if foo); end" - parses "foo(&.as?(T))" parses "foo(&.as?(T))" - parses "foo = 1; foo +1" parses "foo = 1; foo +1" - parses ":\"\\\\foo\"" parses ":\"\\\\foo\"" - says syntax error on "asm(\"\" ::: \"\"(var))" says syntax error on "asm(\"\" ::: \"\"(var))" - parses ":&" parses ":&" - parses "begin\n/ /\nend" parses "begin\n/ /\nend" - says syntax error on "\"foo\" \"bar\"" says syntax error on "\"foo\" \"bar\"" - parses "asm(\"nop\" :: : :)" parses "asm(\"nop\" :: : :)" - parses "macro foo(a, @[Foo] &block);end" parses "macro foo(a, @[Foo] &block);end" - says syntax error on "def foo\nabstract\nend" says syntax error on "def foo\nabstract\nend" - parses "(bar do\nend)" parses "(bar do\nend)" - parses "{{ foo.nil?(foo) }}" parses "{{ foo.nil?(foo) }}" - parses "lib LibC; {{ 1 }}; end" parses "lib LibC; {{ 1 }}; end" - parses "def self./(); end;" parses "def self./(); end;" - parses "foo.<=(1, 2)" parses "foo.<=(1, 2)" - parses "def foo(@@enum); end" parses "def foo(@@enum); end" - parses "case 1; when 1 then 2; else; 3; end" parses "case 1; when 1 then 2; else; 3; end" - says syntax error on "foo { |out| }" says syntax error on "foo { |out| }" - parses "foo(n <= 2)" parses "foo(n <= 2)" - parses "{% begin %}%x< %s >{% end %}" parses "{% begin %}%x< %s >{% end %}" - parses "def foo(x @@return); end" parses "def foo(x @@return); end" - says syntax error on "def foo(\"\" y); y; end" says syntax error on "def foo(\"\" y); y; end" - says syntax error on "foo { |(extend)| }" says syntax error on "foo { |(extend)| }" - parses "f.x *= 2" parses "f.x *= 2" - says syntax error on "def foo(**args, x); end" says syntax error on "def foo(**args, x); end" - parses "foo(a: n !~ 2)" parses "foo(a: n !~ 2)" - parses "foo(n < 2)" parses "foo(n < 2)" - parses "a : Foo*" parses "a : Foo*" - parses "a = 1; (a)/b" parses "a = 1; (a)/b" - parses "1 <= 2 <= 3" parses "1 <= 2 <= 3" - says syntax error on "def foo(foo def); end" says syntax error on "def foo(foo def); end" - says syntax error on "break ^ 1" says syntax error on "break ^ 1" - parses "a = 1; yield a rescue a" parses "a = 1; yield a rescue a" - says syntax error on "case 1\nin _;" says syntax error on "case 1\nin _;" - parses "def foo(x @@if); end" parses "def foo(x @@if); end" - parses "{% begin %}%q| %s |{% end %}" parses "{% begin %}%q| %s |{% end %}" - parses "property begin : Int32" parses "property begin : Int32" - parses "case 1\nwhen 1\n2\nend\nif a\nend" parses "case 1\nwhen 1\n2\nend\nif a\nend" - says syntax error on "def foo(asm); end" says syntax error on "def foo(asm); end" - parses "next" parses "next" - says syntax error on "foo { |enum| }" says syntax error on "foo { |enum| }" - parses "a.b &+=\n1" parses "a.b &+=\n1" - parses "/foo/m" parses "/foo/m" - parses "foo begin\nbar do\nend\nend" parses "foo begin\nbar do\nend\nend" - parses "->Foo.^(Int32)" parses "->Foo.^(Int32)" - says syntax error on "class Foo(); end" says syntax error on "class Foo(); end" - parses "[] of Int" parses "[] of Int" - parses "@@a = uninitialized Foo" parses "@@a = uninitialized Foo" - says syntax error on "foo { |(nil)| }" says syntax error on "foo { |(nil)| }" - parses "1 * 2" parses "1 * 2" - says syntax error on "next[0]" says syntax error on "next[0]" - parses "property def : Int32" parses "property def : Int32" - parses "abstract def foo\n1" parses "abstract def foo\n1" - parses "\n\n__LINE__" parses "\n\n__LINE__" - says syntax error on "def foo(foo enum); end" says syntax error on "def foo(foo enum); end" - parses "def self.*; end;" parses "def self.*; end;" - parses "foo %q()" parses "foo %q()" - parses "def foo(&block : Int ->\n); end" parses "def foo(&block : Int ->\n); end" - says syntax error on "$foo :: Foo" says syntax error on "$foo :: Foo" - parses "false" parses "false" - says syntax error on "macro def foo : String; 1; end" says syntax error on "macro def foo : String; 1; end" - says syntax error on "a, B = 1, 2" says syntax error on "a, B = 1, 2" - parses "macro foo;{% verbatim do %}1{% foo %}2{% end %};end" parses "macro foo;{% verbatim do %}1{% foo %}2{% end %};end" - parses "foo = 1; ->foo.&**(Int32)" parses "foo = 1; ->foo.&**(Int32)" - parses "asm(\"nop\" :::: \"volatile\")" parses "asm(\"nop\" :::: \"volatile\")" - parses "Foo::Bar?" parses "Foo::Bar?" - says syntax error on "foo[1] = return" says syntax error on "foo[1] = return" - parses "def foo; / /; end" parses "def foo; / /; end" - parses "{1.. => 2};" parses "{1.. => 2};" - parses "Foo({String, ->})" parses "Foo({String, ->})" - parses "foo(0, n < 2)" parses "foo(0, n < 2)" - says syntax error on "'a' foo" says syntax error on "'a' foo" - parses "def foo(x @@extend); end" parses "def foo(x @@extend); end" - parses "<<-HERE\n One \\n Two\n Zero\n HERE" parses "<<-HERE\n One \\n Two\n Zero\n HERE" - parses "<<-FOO\n \t1\n \tFOO" parses "<<-FOO\n \t1\n \tFOO" - parses "def foo(var : Int | Double); end" parses "def foo(var : Int | Double); end" - parses "def ==(other, file = 1); end" parses "def ==(other, file = 1); end" - parses "def &*(); end" parses "def &*(); end" - parses "until : Int32" parses "until : Int32" - parses ":foo?" parses ":foo?" - says syntax error on "select\nwhen 1\n2\nend" says syntax error on "select\nwhen 1\n2\nend" - parses "{% if 1; 2; end %}" parses "{% if 1; 2; end %}" - parses "def ==; end;" parses "def ==; end;" - parses "typeof : Int32" parses "typeof : Int32" - parses "macro foo;bar{% if x %}body{% elsif y %}body2{%end%}baz;end" parses "macro foo;bar{% if x %}body{% elsif y %}body2{%end%}baz;end" - parses "foo(z: 0, a: n === 2)" parses "foo(z: 0, a: n === 2)" - parses "@a, b = 1, 2" parses "@a, b = 1, 2" - parses "`foo\\``" parses "`foo\\``" - parses "case 1; when 2 then /foo/; end" parses "case 1; when 2 then /foo/; end" - parses "asm(\"nop\" :: \"b\"(1), \"c\"(2) : \"eax\", \"ebx\"\n: \"volatile\", \"alignstack\"\n,\n\"intel\"\n)" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2) : \"eax\", \"ebx\"\n: \"volatile\", \"alignstack\"\n,\n\"intel\"\n)" - parses "foo.===" parses "foo.===" - parses "call(foo.as Bar, Baz)" parses "call(foo.as Bar, Baz)" - parses "def foo(x @if); end" parses "def foo(x @if); end" - parses "property class : Int32" parses "property class : Int32" - parses "def foo(@true); end" parses "def foo(@true); end" - parses "foo x do\n//\nend" parses "foo x do\n//\nend" - parses "macro **;end" parses "macro **;end" - parses "property abstract : Int32" parses "property abstract : Int32" - says syntax error on "next.as(Int32)" says syntax error on "next.as(Int32)" - says syntax error on "<<-HERE\n One\nwrong\n Zero\n HERE" says syntax error on "<<-HERE\n One\nwrong\n Zero\n HERE" - parses "foo..2" parses "foo..2" - parses "case {1, 2}\nwhen {3, 4}, {5, 6}\n7\nend" parses "case {1, 2}\nwhen {3, 4}, {5, 6}\n7\nend" - parses "-1.0" parses "-1.0" - parses "foo(0, n % 2)" parses "foo(0, n % 2)" - sets correct location of protected macro in enum sets correct location of protected macro in enum - parses "1 ** -x" parses "1 ** -x" - parses ":&**" parses ":&**" - parses "def foo(require foo); end" parses "def foo(require foo); end" - says syntax error on "break &* 1" says syntax error on "break &* 1" - says syntax error on "macro nil?; end" says syntax error on "macro nil?; end" - parses "puts ::foo" parses "puts ::foo" - says syntax error on "\"\#{<<-HERE}\"\nHERE" says syntax error on "\"\#{<<-HERE}\"\nHERE" - parses "1 -\n2" parses "1 -\n2" - says syntax error on "break // 1" says syntax error on "break // 1" - says syntax error on "1 == 2, a = 4" says syntax error on "1 == 2, a = 4" - parses "1.as? Bar" parses "1.as? Bar" - parses "property else : Int32" parses "property else : Int32" - parses "def foo(lib foo); end" parses "def foo(lib foo); end" - parses "lib Foo::Bar\nend" parses "lib Foo::Bar\nend" - parses "foo(z: 0, a: n ** 2)" parses "foo(z: 0, a: n ** 2)" - parses "def foo(x @until); end" parses "def foo(x @until); end" - parses "foo 1;" parses "foo 1;" - parses "class Foo\nend" parses "class Foo\nend" - parses "def foo(private foo); end" parses "def foo(private foo); end" - parses "return" parses "return" - says syntax error on "next % 1" says syntax error on "next % 1" - parses "a = 1\nfoo -a" parses "a = 1\nfoo -a" - parses "begin; 1; rescue ex : ::Foo | ::Bar; 2; end" parses "begin; 1; rescue ex : ::Foo | ::Bar; 2; end" - parses "def foo(@@require); end" parses "def foo(@@require); end" - says syntax error on "x, self = 1, 2" says syntax error on "x, self = 1, 2" - says syntax error on "break ** 1" says syntax error on "break ** 1" - parses "{1 =>\n2, 3 =>\n4}" parses "{1 =>\n2, 3 =>\n4}" - parses "foo.!~" parses "foo.!~" - parses "Foo(typeof(1), typeof(2))" parses "Foo(typeof(1), typeof(2))" - parses "->Foo.&+(Int32)" parses "->Foo.&+(Int32)" - parses "if foo\n1\nend" parses "if foo\n1\nend" - parses "foo.<= do end" parses "foo.<= do end" - parses "1.as(Bar)" parses "1.as(Bar)" - says syntax error on "a.b(), c.d = 1" says syntax error on "a.b(), c.d = 1" - parses "def self.*(); end;" parses "def self.*(); end;" - says syntax error on "def foo(nil); end" says syntax error on "def foo(nil); end" - parses "lib LibC\nalias Foo = Bar\nend" parses "lib LibC\nalias Foo = Bar\nend" - parses "r = 1; r.x += 2" parses "r = 1; r.x += 2" - parses "macro foo;%var if true;end" parses "macro foo;%var if true;end" - parses "foo &.as?(T)" parses "foo &.as?(T)" - parses "1 + /foo/" parses "1 + /foo/" - parses "def foo(x, *args, y = 2); 1; end" parses "def foo(x, *args, y = 2); 1; end" - parses "foo.==" parses "foo.==" - says syntax error on "foo { |(if)| }" says syntax error on "foo { |(if)| }" - parses "property when : Int32" parses "property when : Int32" - parses "[..2]" parses "[..2]" - parses "lib LibC\nfun getchar(a : Int, b : Float) : Int\nend" parses "lib LibC\nfun getchar(a : Int, b : Float) : Int\nend" - parses "foo(x:\n begin\n result : Int32 = 1\n result\n end\n )" parses "foo(x:\n begin\n result : Int32 = 1\n result\n end\n )" - says syntax error on "x { |*a, *b| }" says syntax error on "x { |*a, *b| }" - parses "foo.!( )" parses "foo.!( )" - parses "foo &.+(2)" parses "foo &.+(2)" - parses "{1}" parses "{1}" - parses "def self.<(); end;" parses "def self.<(); end;" - parses "macro foo;end" parses "macro foo;end" - parses "def foo(a, &block : Int, Float -> Double); end" parses "def foo(a, &block : Int, Float -> Double); end" - says syntax error on "{% unless 1 %} 2 {% elsif 3 %} 3 {% end %}" says syntax error on "{% unless 1 %} 2 {% elsif 3 %} 3 {% end %}" - says syntax error on "{foo: 1\nbar: 2}" says syntax error on "{foo: 1\nbar: 2}" - parses "Int[8, 4]" parses "Int[8, 4]" - parses "def foo(a, &block : *Int -> ); end" parses "def foo(a, &block : *Int -> ); end" - parses "def ===(*args, **opts, &); end" parses "def ===(*args, **opts, &); end" - parses "break *1, 2" parses "break *1, 2" - says syntax error on "def foo(foo false); end" says syntax error on "def foo(foo false); end" - parses "def downto(n)\n1\nend" parses "def downto(n)\n1\nend" - parses "def +(); end" parses "def +(); end" - parses "Int" parses "Int" - parses "<<-'HERE COMES HEREDOC'\n hello \\n world\n \#{1}\n HERE COMES HEREDOC" parses "<<-'HERE COMES HEREDOC'\n hello \\n world\n \#{1}\n HERE COMES HEREDOC" - parses "foo(&.block)" parses "foo(&.block)" - says syntax error on "foo { |(require)| }" says syntax error on "foo { |(require)| }" - parses "foo unless 3" parses "foo unless 3" - parses "def =~; end;" parses "def =~; end;" - parses "case {1}\nin {.bar?}; 2; end" parses "case {1}\nin {.bar?}; 2; end" - parses "a ? 1 :\n b ? 2 :\n c ? 3\n : 0" parses "a ? 1 :\n b ? 2 :\n c ? 3\n : 0" - parses "foo.| do end" parses "foo.| do end" - parses "a = 1" parses "a = 1" - says syntax error on "return << 1" says syntax error on "return << 1" - says syntax error on "def foo(foo typeof); end" says syntax error on "def foo(foo typeof); end" - parses ":%" parses ":%" - parses "property do : Int32" parses "property do : Int32" - parses "foo(a: n & 2)" parses "foo(a: n & 2)" - parses "else : Int32" parses "else : Int32" - parses "n < 2" parses "n < 2" - parses "foo.bar" parses "foo.bar" - says syntax error on "foo { |instance_sizeof| }" says syntax error on "foo { |instance_sizeof| }" - parses "/foo/" parses "/foo/" - parses "yield if true" parses "yield if true" - parses "->Foo.&(Int32)" parses "->Foo.&(Int32)" - parses "def foo(x @@nil); end" parses "def foo(x @@nil); end" - parses "case 1\nin .bar?; 2; end" parses "case 1\nin .bar?; 2; end" - parses "break *{1, 2}" parses "break *{1, 2}" - parses "unless foo; 1; end" parses "unless foo; 1; end" - parses "1 ? a : b" parses "1 ? a : b" - parses "Foo.foo(count: 3).bar { }" parses "Foo.foo(count: 3).bar { }" - parses "foo(n + 2)" parses "foo(n + 2)" - parses "{% begin %}%i( %s ){% end %}" parses "{% begin %}%i( %s ){% end %}" - says syntax error on "1 2" says syntax error on "1 2" - parses "foo = 1; ->foo.//(Int32)" parses "foo = 1; ->foo.//(Int32)" - parses "foo(1.., 2)" parses "foo(1.., 2)" - parses "a = 1; a &= 1" parses "a = 1; a &= 1" - parses "foo = 1; ->foo.=~(Int32)" parses "foo = 1; ->foo.=~(Int32)" - parses "n &* 2" parses "n &* 2" - parses "1 == 2 == 3 == 4" parses "1 == 2 == 3 == 4" - parses "x, y = <<-FOO, <<-BAR\nhello\nFOO\nworld\nBAR" parses "x, y = <<-FOO, <<-BAR\nhello\nFOO\nworld\nBAR" - parses "def foo(@enum); end" parses "def foo(@enum); end" - parses "f.x ^= 2" parses "f.x ^= 2" - says syntax error on "foo(**bar, *x)" says syntax error on "foo(**bar, *x)" - parses "'a'" parses "'a'" - parses "foo(n ** 2)" parses "foo(n ** 2)" - parses "foo.!" parses "foo.!" - parses "{% if true %}\n{% end %}\n{% if true %}\n{% end %}" parses "{% if true %}\n{% end %}\n{% if true %}\n{% end %}" - parses "foo.+(1, 2)" parses "foo.+(1, 2)" - says syntax error on "foo { |macro| }" says syntax error on "foo { |macro| }" - parses "alias Foo = Bar" parses "alias Foo = Bar" - parses "def foo(x @@in); end" parses "def foo(x @@in); end" - parses "foo(0, n > 2)" parses "foo(0, n > 2)" - parses "asm(\"nop\" : \"a\"(0) : \"b\"(1))" parses "asm(\"nop\" : \"a\"(0) : \"b\"(1))" - says syntax error on "macro foo x\n 1 + 2; end" says syntax error on "macro foo x\n 1 + 2; end" - says syntax error on "\n lib LibFoo\n fun foo(x : Int32\n y : Float64)\n end\n " says syntax error on "\n lib LibFoo\n fun foo(x : Int32\n y : Float64)\n end\n " - parses "{% begin %}%x( %s ){% end %}" parses "{% begin %}%x( %s ){% end %}" - parses "1 ... 2" parses "1 ... 2" - says syntax error on "a, b, *c, d = 1, 2" says syntax error on "a, b, *c, d = 1, 2" - parses "foo &./(1)" parses "foo &./(1)" - parses "def foo(@def); end" parses "def foo(@def); end" - parses "foo(z: 0, a: n << 2)" parses "foo(z: 0, a: n << 2)" - parses "enum Foo::Bar; A = 1; end" parses "enum Foo::Bar; A = 1; end" - parses "foo.bar= *baz" parses "foo.bar= *baz" - parses "foo(\n begin\n result : Int32 = 1\n result\n end\n )" parses "foo(\n begin\n result : Int32 = 1\n result\n end\n )" - parses "foo(z: 0, a: n & 2)" parses "foo(z: 0, a: n & 2)" - parses "class Foo(T, *U); end" parses "class Foo(T, *U); end" - parses "foo.&" parses "foo.&" - parses "macro &+;end" parses "macro &+;end" - parses "1 & 2" parses "1 & 2" - parses "def foo(select foo); end" parses "def foo(select foo); end" - parses "foo(//)" parses "foo(//)" - parses "class Foo\ndef foo; end; end" parses "class Foo\ndef foo; end; end" - says syntax error on "foo { |def| }" says syntax error on "foo { |def| }" - says syntax error on "def foo(\"bar \#{1} qux\" y); y; end" says syntax error on "def foo(\"bar \#{1} qux\" y); y; end" - says syntax error on "foo **bar, *x" says syntax error on "foo **bar, *x" - says syntax error on "def foo(pointerof); end" says syntax error on "def foo(pointerof); end" - parses "foo { |a| 1 }" parses "foo { |a| 1 }" - says syntax error on "def foo(x @x); 1; end" says syntax error on "def foo(x @x); 1; end" - parses "x[a: 1, b: 2,]" parses "x[a: 1, b: 2,]" - parses "foo(Bar) { 1 }" parses "foo(Bar) { 1 }" - parses "->Foo.=~(Int32)" parses "->Foo.=~(Int32)" - says syntax error on "def foo(true); end" says syntax error on "def foo(true); end" - says syntax error on "1 if return" says syntax error on "1 if return" - parses "def foo(@[Foo] outer inner); end" parses "def foo(@[Foo] outer inner); end" - parses "puts {{1}}" parses "puts {{1}}" - says syntax error on "foo { |nil| }" says syntax error on "foo { |nil| }" - parses "offsetof(\n Foo,\n @foo\n)" parses "offsetof(\n Foo,\n @foo\n)" - parses "macro foo;unless %var;true;end;end" parses "macro foo;unless %var;true;end;end" - says syntax error on "+return" says syntax error on "+return" - parses "Int[]" parses "Int[]" - parses "property require : Int32" parses "property require : Int32" - parses "enum Foo; A\nB; C\nD = 1; end" parses "enum Foo; A\nB; C\nD = 1; end" - parses "foo.[0]" parses "foo.[0]" - says syntax error on "foo {1, 2}" says syntax error on "foo {1, 2}" - says syntax error on "foo { |asm| }" says syntax error on "foo { |asm| }" - parses "1 rescue 2" parses "1 rescue 2" - parses "->(x : Int32) { x }" parses "->(x : Int32) { x }" - parses "lib LibC; struct Foo; {% if 1 %}2{% end %}; end; end" parses "lib LibC; struct Foo; {% if 1 %}2{% end %}; end; end" - parses "a = 1; a /b" parses "a = 1; a /b" - parses "a { |x| x } / b" parses "a { |x| x } / b" - parses "macro foo;var if true;end" parses "macro foo;var if true;end" - parses "def self.!~(); end;" parses "def self.!~(); end;" - parses "def %(); end;" parses "def %(); end;" - says syntax error on "1 .. next" says syntax error on "1 .. next" - parses ":!=" parses ":!=" - parses "foo.+(1, 2) { 3 }" parses "foo.+(1, 2) { 3 }" - parses "n + 2" parses "n + 2" - parses "protected def foo; end" parses "protected def foo; end" - parses "property struct : Int32" parses "property struct : Int32" - parses "lib LibC; struct Foo; {{ 1 }}; end; end" parses "lib LibC; struct Foo; {{ 1 }}; end; end" - parses "{a: 1, b: 2}" parses "{a: 1, b: 2}" - says syntax error on "def foo\nclass\nend" says syntax error on "def foo\nclass\nend" - says syntax error on "def foo(unless); end" says syntax error on "def foo(unless); end" - parses "lib LibC; union Foo; end end" parses "lib LibC; union Foo; end end" - parses "foo.>" parses "foo.>" - parses "def foo(x @unless); end" parses "def foo(x @unless); end" - parses "a.b &=\n1" parses "a.b &=\n1" - parses "1 unless 3" parses "1 unless 3" - parses "puts {{**1}}" parses "puts {{**1}}" - parses "def foo=(value); end" parses "def foo=(value); end" - parses "/=/" parses "/=/" - parses "-> : Int32 { }" parses "-> : Int32 { }" - parses "def foo(a, &block : Int -> ); end" parses "def foo(a, &block : Int -> ); end" - parses "foo.bar(1, 2) { 3 }" parses "foo.bar(1, 2) { 3 }" - parses "foo.==(1, 2) { 3 }" parses "foo.==(1, 2) { 3 }" - parses "puts {{\n1\n}}" parses "puts {{\n1\n}}" - parses ":\"\\\"foo\"" parses ":\"\\\"foo\"" - parses "def !~(); end;" parses "def !~(); end;" - parses "@[Foo(1)]" parses "@[Foo(1)]" - parses "case {1}\nin {Int32.class}; 2; end" parses "case {1}\nin {Int32.class}; 2; end" - parses "elsif : Int32" parses "elsif : Int32" - parses "def foo(until foo); end" parses "def foo(until foo); end" - parses "def foo; yield 1; end" parses "def foo; yield 1; end" - parses "def []?; end" parses "def []?; end" - parses "foo.nil?" parses "foo.nil?" - says syntax error on "break <= 1" says syntax error on "break <= 1" - parses "asm(\"nop\" : \"a\"(0))" parses "asm(\"nop\" : \"a\"(0))" - parses "include Foo\nif true; end" parses "include Foo\nif true; end" - parses "def !=(); end;" parses "def !=(); end;" - parses "foo(0, n * 2)" parses "foo(0, n * 2)" - parses "next 1 if true" parses "next 1 if true" - parses "struct Foo; end" parses "struct Foo; end" - parses "def foo(var : Int32 -> = 1); end" parses "def foo(var : Int32 -> = 1); end" - parses "abstract def foo" parses "abstract def foo" - parses "foo { |a, (b, c), (d, e)| a; b; c; d; e }" parses "foo { |a, (b, c), (d, e)| a; b; c; d; e }" - parses "a = 1; a *= 1" parses "a = 1; a *= 1" - says syntax error on "def foo; A = 1; end" says syntax error on "def foo; A = 1; end" - parses "yield 1" parses "yield 1" - parses "foo./(1, 2) { 3 }" parses "foo./(1, 2) { 3 }" - says syntax error on "foo { |(include)| }" says syntax error on "foo { |(include)| }" - parses "foo = 1; ->foo.**(Int32)" parses "foo = 1; ->foo.**(Int32)" - parses "def foo(x, **args, &block)\n1\nend" parses "def foo(x, **args, &block)\n1\nend" - parses "next 1, *2" parses "next 1, *2" - parses "Foo(X, instance_alignof(Int32))" parses "Foo(X, instance_alignof(Int32))" - says syntax error on "macro foo; {% foo = 1 }; end" says syntax error on "macro foo; {% foo = 1 }; end" - parses "foo.> do end" parses "foo.> do end" - parses "def : Int32" parses "def : Int32" - says syntax error on "def is_a?; end" says syntax error on "def is_a?; end" - parses "def self.~; end;" parses "def self.~; end;" - parses "foo.[]=(1, 2) { 3 }" parses "foo.[]=(1, 2) { 3 }" - parses "def self.foo()\n1\nend" parses "def self.foo()\n1\nend" - parses "foo.bar 1, 2" parses "foo.bar 1, 2" - parses "def foo; yield 1; yield; end" parses "def foo; yield 1; yield; end" - says syntax error on "<<-FOO\n1\nFOO.bar" says syntax error on "<<-FOO\n1\nFOO.bar" - parses "n &+ 2" parses "n &+ 2" - parses "macro foo(x = __LINE__);end" parses "macro foo(x = __LINE__);end" - says syntax error on "foo 1," says syntax error on "foo 1," - parses "nil?( )" parses "nil?( )" - parses "foo { |(a, (b, (c, d)))| }" parses "foo { |(a, (b, (c, d)))| }" - says syntax error on "case next; when 1; end; end" says syntax error on "case next; when 1; end; end" - parses "foo(n / 2)" parses "foo(n / 2)" - parses "def self./; end;" parses "def self./; end;" - says syntax error on "return ** 1" says syntax error on "return ** 1" - parses "Int[8]" parses "Int[8]" - parses "a = 1; a &&= 1" parses "a = 1; a &&= 1" - says syntax error on "def foo\nmacro\nend" says syntax error on "def foo\nmacro\nend" - parses "property sizeof : Int32" parses "property sizeof : Int32" - says syntax error on "def foo(&a foo); end" says syntax error on "def foo(&a foo); end" - says syntax error on "1 ? : 2 : 3" says syntax error on "1 ? : 2 : 3" - parses "foo.&(1, 2)" parses "foo.&(1, 2)" - parses "Int[8]?" parses "Int[8]?" - says syntax error on "foo.||" says syntax error on "foo.||" - says syntax error on "@@foo :: Foo" says syntax error on "@@foo :: Foo" - says syntax error on "def foo @var, █ end" says syntax error on "def foo @var, █ end" - parses "var.@foo.@bar" parses "var.@foo.@bar" - parses "<<-HERE1; <<-HERE2\nHERE1\nHERE2" parses "<<-HERE1; <<-HERE2\nHERE1\nHERE2" - parses "{% begin %}%Q| %s |{% end %}" parses "{% begin %}%Q| %s |{% end %}" - says syntax error on "def foo(**x, &x); end" says syntax error on "def foo(**x, &x); end" - parses "foo(regex: //)" parses "foo(regex: //)" - parses "Foo(x: U, y: V)" parses "Foo(x: U, y: V)" - parses "lib LibC; type A = B.class; end" parses "lib LibC; type A = B.class; end" - parses "macro foo;bar{% unless x %}body{% end %}baz;end" parses "macro foo;bar{% unless x %}body{% end %}baz;end" - parses "def foo(@@while); end" parses "def foo(@@while); end" - says syntax error on "foo(1, 2, 3 end" says syntax error on "foo(1, 2, 3 end" - parses "foo.[0] = 1" parses "foo.[0] = 1" - says syntax error on "macro as; end" says syntax error on "macro as; end" - parses "def foo(x @var); end" parses "def foo(x @var); end" - parses "def ==(); end;" parses "def ==(); end;" - parses "begin; 1; rescue ex; 2; end" parses "begin; 1; rescue ex; 2; end" - parses "1 // 2" parses "1 // 2" - parses "foo(\na: 1,\n)" parses "foo(\na: 1,\n)" - says syntax error on "case 1; when break; end; end" says syntax error on "case 1; when break; end; end" - parses "foo(a: n - 2)" parses "foo(a: n - 2)" - parses "1 if 3" parses "1 if 3" - parses "foo Bar { 1 }" parses "foo Bar { 1 }" - parses "puts %i(one two)" parses "puts %i(one two)" - says syntax error on "foo { |true| }" says syntax error on "foo { |true| }" - parses "property nil : Int32" parses "property nil : Int32" - parses "lib LibC; type A = B*; end" parses "lib LibC; type A = B*; end" - parses "property include : Int32" parses "property include : Int32" - parses "@[Foo()]" parses "@[Foo()]" - parses "foo(z: 0, a: n >> 2)" parses "foo(z: 0, a: n >> 2)" - parses "instance_alignof(X)" parses "instance_alignof(X)" - parses "{[] of Foo, Bar::Baz + 2}" parses "{[] of Foo, Bar::Baz + 2}" - says syntax error on "foo { |(next)| }" says syntax error on "foo { |(next)| }" - says syntax error on "next // 1" says syntax error on "next // 1" - parses "\"hello \" \\\n \"world\"" parses "\"hello \" \\\n \"world\"" - says syntax error on "x--" says syntax error on "x--" - parses "foo.=~ do end" parses "foo.=~ do end" - parses "a = 1; a[2] ||= 3" parses "a = 1; a[2] ||= 3" - says syntax error on "break[]" says syntax error on "break[]" - parses "macro : Int32" parses "macro : Int32" - parses "enum Foo; A = 1\ndef self.foo; 1; end\nend" parses "enum Foo; A = 1\ndef self.foo; 1; end\nend" - says syntax error on "return % 1" says syntax error on "return % 1" - parses "sizeof(\n Int32\n)" parses "sizeof(\n Int32\n)" - parses "1.as?(Bar)" parses "1.as?(Bar)" - says syntax error on "yield next" says syntax error on "yield next" - parses "1 || 2" parses "1 || 2" - parses "-1_i64" parses "-1_i64" - parses "foo(Foo: 1, Bar: 2)" parses "foo(Foo: 1, Bar: 2)" - parses "{% begin %}%( %s ){% end %}" parses "{% begin %}%( %s ){% end %}" - parses "def foo(var : Char[256]); end" parses "def foo(var : Char[256]); end" - parses ":+" parses ":+" - parses "Foo(typeof(1))" parses "Foo(typeof(1))" - parses "def ==(); end" parses "def ==(); end" - parses "extend : Int32" parses "extend : Int32" - says syntax error on "def foo=(**kwargs); end" says syntax error on "def foo=(**kwargs); end" - says syntax error on "{a: 1 b: 2}" says syntax error on "{a: 1 b: 2}" - parses "lib LibC\nfun getchar(Int, Float)\nend" parses "lib LibC\nfun getchar(Int, Float)\nend" - parses "foo(z: 0, a: n &** 2)" parses "foo(z: 0, a: n &** 2)" - parses "(foo bar do\nend)" parses "(foo bar do\nend)" - parses "def foo(@until); end" parses "def foo(@until); end" - parses "lib LibC\n$errno = Foo : Int32\nend" parses "lib LibC\n$errno = Foo : Int32\nend" - parses "asm(\"nop\" ::)" parses "asm(\"nop\" ::)" - parses "foo.|(1, 2) { 3 }" parses "foo.|(1, 2) { 3 }" - parses "case {1, 2}\nwhen foo\n5\nend" parses "case {1, 2}\nwhen foo\n5\nend" - parses "foo 1" parses "foo 1" - says syntax error on "return 1 foo" says syntax error on "return 1 foo" - says syntax error on "def foo(x, *); 1; end" says syntax error on "def foo(x, *); 1; end" - parses "require : Int32" parses "require : Int32" - parses "foo = 1; ->foo.&-(Int32)" parses "foo = 1; ->foo.&-(Int32)" - parses "next;" parses "next;" - parses "with : Int32" parses "with : Int32" - parses "1_u128" parses "1_u128" - parses "n * 2" parses "n * 2" - parses "class Foo(T); end" parses "class Foo(T); end" - parses "def self.>; end;" parses "def self.>; end;" - parses "->foo?" parses "->foo?" - parses "a = 1; a //= 1" parses "a = 1; a //= 1" - parses "foo(\"foo bar\": 1, \"baz\": 2)" parses "foo(\"foo bar\": 1, \"baz\": 2)" - says syntax error on "foo &.||" says syntax error on "foo &.||" - parses "def foo(a, &block : Foo); end" parses "def foo(a, &block : Foo); end" - says syntax error on "def foo=(a = 1, b = 2); end" says syntax error on "def foo=(a = 1, b = 2); end" - parses "foo = 1; ->foo.%(Int32)" parses "foo = 1; ->foo.%(Int32)" - parses "foo(a: n <= 2)" parses "foo(a: n <= 2)" - says syntax error on "return[0]" says syntax error on "return[0]" - parses "%q{hello \\n world}" parses "%q{hello \\n world}" - parses "foo %i" parses "foo %i" - parses "foo = 1; ->foo.>(Int32)" parses "foo = 1; ->foo.>(Int32)" - parses "case / /; when / /; / /; else; / /; end" parses "case / /; when / /; / /; else; / /; end" - parses "macro []?;end" parses "macro []?;end" - parses "yield;" parses "yield;" - parses "lib LibC\n@[Bar]; end" parses "lib LibC\n@[Bar]; end" - parses "foo[] /2" parses "foo[] /2" - parses "Foo(T | U)" parses "Foo(T | U)" - says syntax error on "def foo &block : Int -> Double ; end" says syntax error on "def foo &block : Int -> Double ; end" - says syntax error on "return + 1" says syntax error on "return + 1" - parses "abstract def foo(x)" parses "abstract def foo(x)" - parses "puts _" parses "puts _" - parses "::A::B" parses "::A::B" - parses "%r(\\ )" parses "%r(\\ )" - parses "begin 1 end / 2" parses "begin 1 end / 2" - parses "a[0], a[1] = 1, 2" parses "a[0], a[1] = 1, 2" - parses "foo.bar = (1).abs" parses "foo.bar = (1).abs" - parses "lib : Int32" parses "lib : Int32" - parses "1 !~ 2" parses "1 !~ 2" - parses "a() /3" parses "a() /3" - parses "x[{1}]" parses "x[{1}]" - parses "def foo(x @@with); end" parses "def foo(x @@with); end" - parses "asm(\"nop\" :: \"b\"(1), \"c\"(2) : \"eax\", \"ebx\" : \"volatile\", \"alignstack\", \"intel\")" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2) : \"eax\", \"ebx\" : \"volatile\", \"alignstack\", \"intel\")" - parses "foo.< do end" parses "foo.< do end" - says syntax error on "return[0]= 1" says syntax error on "return[0]= 1" - parses "foo(a: 1, &block)" parses "foo(a: 1, &block)" - parses "asm(\"nop\" ::::)" parses "asm(\"nop\" ::::)" - parses "foo(a: n >> 2)" parses "foo(a: n >> 2)" - parses "lib LibC\nfun getchar : Int\nend" parses "lib LibC\nfun getchar : Int\nend" - says syntax error on "break when true" says syntax error on "break when true" - parses "foo = 1; ->foo.===(Int32)" parses "foo = 1; ->foo.===(Int32)" - parses "def foo(x @return); end" parses "def foo(x @return); end" - parses "!1" parses "!1" - parses "a.foo, a.bar = 1, 2" parses "a.foo, a.bar = 1, 2" - parses "\"hello \#{1}\" \\\r\n \"\#{2} world\"" parses "\"hello \#{1}\" \\\r\n \"\#{2} world\"" - parses "foo(a: n >= 2)" parses "foo(a: n >= 2)" - says syntax error on "asm(\"nop\" :::: \"\#{volatile}\")" says syntax error on "asm(\"nop\" :::: \"\#{volatile}\")" - parses "1 / -2" parses "1 / -2" - parses "def foo(@class); end" parses "def foo(@class); end" - parses "foo.==(1, 2)" parses "foo.==(1, 2)" - parses "[] of ->\n1" parses "[] of ->\n1" - says syntax error on "def foo(foo self); end" says syntax error on "def foo(foo self); end" - parses "foo.=~ 1, 2" parses "foo.=~ 1, 2" - parses "def foo(var : Int?); end" parses "def foo(var : Int?); end" - parses "puts a if true" parses "puts a if true" - parses "if foo; 1; else; 2; end" parses "if foo; 1; else; 2; end" - parses "@a = uninitialized Foo" parses "@a = uninitialized Foo" - sets correct location of private method in enum sets correct location of private method in enum - says syntax error on "break > 1" says syntax error on "break > 1" - parses "foo(0, n + 2)" parses "foo(0, n + 2)" - parses "1.as(\n Int32\n)" parses "1.as(\n Int32\n)" - parses "def self.**; end;" parses "def self.**; end;" - parses "break 1, *2" parses "break 1, *2" - parses "a = b = 2" parses "a = b = 2" - parses "def foo; with a yield; end" parses "def foo; with a yield; end" - parses "n ^ 2" parses "n ^ 2" - parses "<<-HERE\n One\n \n Zero\n HERE" parses "<<-HERE\n One\n \n Zero\n HERE" - parses "foo.=~" parses "foo.=~" - parses "foo(bar do\nend)" parses "foo(bar do\nend)" - says syntax error on "Foo{one: :two, three: :four}" says syntax error on "Foo{one: :two, three: :four}" - parses "macro foo;bar{% for x in y %}\\ \n body{% end %}baz;end" parses "macro foo;bar{% for x in y %}\\ \n body{% end %}baz;end" - parses "a, *b = 1, 2" parses "a, *b = 1, 2" - parses "def foo(x = / /); end" parses "def foo(x = / /); end" - says syntax error on "case when .foo? then 1; end" says syntax error on "case when .foo? then 1; end" - says syntax error on "return.as(Int32)" says syntax error on "return.as(Int32)" - parses "def self.[]; end" parses "def self.[]; end" - parses "class Foo(T1); end" parses "class Foo(T1); end" - parses "foo ensure 2" parses "foo ensure 2" - parses "return *{1, 2}" parses "return *{1, 2}" - parses "def foo(x @@next); end" parses "def foo(x @@next); end" - parses "1..\n2.." parses "1..\n2.." - parses "/ hi /" parses "/ hi /" - parses "macro =~;end" parses "macro =~;end" - parses "+ 1" parses "+ 1" - parses "def foo(x @extend); end" parses "def foo(x @extend); end" - parses "def foo(&block :\n Int ->); end" parses "def foo(&block :\n Int ->); end" - parses "foo %Q" parses "foo %Q" - parses "def foo(x @abstract); end" parses "def foo(x @abstract); end" - parses "/ /" parses "/ /" - says syntax error on "macro foo *y;end" says syntax error on "macro foo *y;end" - parses "@@foo = 1" parses "@@foo = 1" - parses "foo.**(1, 2) { 3 }" parses "foo.**(1, 2) { 3 }" - parses "case\nwhen true\n1\nend" parses "case\nwhen true\n1\nend" - parses "{% begin %}%x{ %s }{% end %}" parses "{% begin %}%x{ %s }{% end %}" - parses "foo(0, n << 2)" parses "foo(0, n << 2)" - says syntax error on "a {}, b = 1" says syntax error on "a {}, b = 1" - parses "macro >=;end" parses "macro >=;end" - parses "macro foo;if %var;true;end;end" parses "macro foo;if %var;true;end;end" - parses "a b() {}" parses "a b() {}" - says syntax error on "def foo(self); end" says syntax error on "def foo(self); end" - parses "foo %w" parses "foo %w" - parses "1\\\n + 2" parses "1\\\n + 2" - parses "a = 1; a ensure a" parses "a = 1; a ensure a" - says syntax error on "foo { |if| }" says syntax error on "foo { |if| }" - says syntax error on "foo { |end| }" says syntax error on "foo { |end| }" - parses "def foo(begin foo); end" parses "def foo(begin foo); end" - parses "1_i128" parses "1_i128" - parses "def foo(with foo); end" parses "def foo(with foo); end" - parses "foo(n ^ 2)" parses "foo(n ^ 2)" - parses "a = 1; a &=\n1" parses "a = 1; a &=\n1" - parses "def foo(@require); end" parses "def foo(@require); end" - says syntax error on "foo { |(offsetof)| }" says syntax error on "foo { |(offsetof)| }" - parses "if : Int32" parses "if : Int32" - parses "a = 1; a >>=\n1" parses "a = 1; a >>=\n1" - parses "1 && 2" parses "1 && 2" - parses "macro -;end" parses "macro -;end" - parses "instance_alignof(\n Int32\n)" parses "instance_alignof(\n Int32\n)" - parses "foo &.!" parses "foo &.!" - parses "class Foo < self; end" parses "class Foo < self; end" - parses "foo(a: n | 2)" parses "foo(a: n | 2)" - parses "while : Int32" parses "while : Int32" - parses "foo(a: n // 2)" parses "foo(a: n // 2)" - parses "def foo(@@var); 1; end" parses "def foo(@@var); 1; end" - says syntax error on "alias Foo?" says syntax error on "alias Foo?" - parses "foo(a: n / 2)" parses "foo(a: n / 2)" - parses "macro []=;end" parses "macro []=;end" - says syntax error on "a = a" says syntax error on "a = a" - parses "1 rescue 2 if 3" parses "1 rescue 2 if 3" - parses "foo.responds_to? :foo" parses "foo.responds_to? :foo" - says syntax error on "A = foo(B = 1)" says syntax error on "A = foo(B = 1)" - parses "def foo(@in); end" parses "def foo(@in); end" - says syntax error on "foo { |until| }" says syntax error on "foo { |until| }" - parses "def foo(@alias); end" parses "def foo(@alias); end" - parses "foo(n &** 2)" parses "foo(n &** 2)" - says syntax error on "def foo(case); end" says syntax error on "def foo(case); end" - parses "def foo(@yield); end" parses "def foo(@yield); end" - parses "a = 1; a >>= 1" parses "a = 1; a >>= 1" - parses "x : Foo(A, *B, C)" parses "x : Foo(A, *B, C)" - parses "->\n:\nInt32\n{\n}" parses "->\n:\nInt32\n{\n}" - parses "foo(z: 0, a: n ^ 2)" parses "foo(z: 0, a: n ^ 2)" - says syntax error on "foo { |return| }" says syntax error on "foo { |return| }" - says syntax error on "break &+ 1" says syntax error on "break &+ 1" - says syntax error on "{a: 1, \"\": 2}" says syntax error on "{a: 1, \"\": 2}" - says syntax error on "next >> 1" says syntax error on "next >> 1" - says syntax error on "foo { |false| }" says syntax error on "foo { |false| }" - parses "foo(0, n &* 2)" parses "foo(0, n &* 2)" - parses "false : Int32" parses "false : Int32" - says syntax error on "foo(\"\": 1)" says syntax error on "foo(\"\": 1)" - parses "def foo(a); a; end" parses "def foo(a); a; end" - parses "pointerof(@a)" parses "pointerof(@a)" - parses "lib LibC; Foo = 1; end" parses "lib LibC; Foo = 1; end" - parses "a = 1; a ^=\n1" parses "a = 1; a ^=\n1" - parses ":foo" parses ":foo" - parses "n ** 2" parses "n ** 2" - parses "foo.- 1, 2" parses "foo.- 1, 2" - says syntax error on "next[0]= 1" says syntax error on "next[0]= 1" - says syntax error on "{\"\": 1}" says syntax error on "{\"\": 1}" - parses "def ==(*args, **opts); end" parses "def ==(*args, **opts); end" - parses "1 ? 2 : 3" parses "1 ? 2 : 3" - parses "macro foo\n{%\nif 1\n2\nelse\n3\nend\n%}end" parses "macro foo\n{%\nif 1\n2\nelse\n3\nend\n%}end" - parses "1 .. 2" parses "1 .. 2" - parses "foo = 1; b = 2; foo -b" parses "foo = 1; b = 2; foo -b" - parses "def foo\n1\nend\nif 1\nend" parses "def foo\n1\nend\nif 1\nend" - parses "def self.>=(); end;" parses "def self.>=(); end;" - parses "def >=(); end;" parses "def >=(); end;" - parses "def foo(x @@alias); end" parses "def foo(x @@alias); end" - says syntax error on "def foo(foo pointerof); end" says syntax error on "def foo(foo pointerof); end" - parses "macro <=;end" parses "macro <=;end" - says syntax error on "{a: 1, b: 2 c: 3}" says syntax error on "{a: 1, b: 2 c: 3}" - parses "def &**(); end" parses "def &**(); end" - parses "def foo(var : Int); end" parses "def foo(var : Int); end" - says syntax error on "if 1 == 1 a; end" says syntax error on "if 1 == 1 a; end" - says syntax error on "macro foo(x, *); 1; end" says syntax error on "macro foo(x, *); 1; end" - parses "foo = 1; ->foo.&(Int32)" parses "foo = 1; ->foo.&(Int32)" - parses "def foo(x = 1, *y); 1; end" parses "def foo(x = 1, *y); 1; end" - parses "def %(); end" parses "def %(); end" - parses "{[] of Foo, ::Bar::Baz.new}" parses "{[] of Foo, ::Bar::Baz.new}" - says syntax error on "def foo(foo yield); end" says syntax error on "def foo(foo yield); end" - parses "def self.foo=()\n1\nend" parses "def self.foo=()\n1\nend" - parses "n <= 2" parses "n <= 2" - parses "foo &.block[0]" parses "foo &.block[0]" - parses "->::Foo.foo?" parses "->::Foo.foo?" - parses "foo(1, a: 1, b: 2)" parses "foo(1, a: 1, b: 2)" - says syntax error on "foo { |class| }" says syntax error on "foo { |class| }" - parses "def foo(in foo); end" parses "def foo(in foo); end" - says syntax error on "def foo(*a foo); end" says syntax error on "def foo(*a foo); end" - parses "1 -2" parses "1 -2" - parses "def -(); end;" parses "def -(); end;" - parses "while true; 1; end;" parses "while true; 1; end;" - parses "def foo(x @@false); end" parses "def foo(x @@false); end" - says syntax error on "return == 1" says syntax error on "return == 1" - parses "{% begin %}%Q< %s >{% end %}" parses "{% begin %}%Q< %s >{% end %}" - says syntax error on "foo **bar, 1" says syntax error on "foo **bar, 1" - parses "foo(z: 0, a: n >= 2)" parses "foo(z: 0, a: n >= 2)" - parses "1 >= 2" parses "1 >= 2" - parses "def >=(other, file = 1); end" parses "def >=(other, file = 1); end" - parses "->Foo.&*(Int32)" parses "->Foo.&*(Int32)" - parses "a; unless / /; / /; else; / /; end" parses "a; unless / /; / /; else; / /; end" - parses "foo(z: 0, a: n <= 2)" parses "foo(z: 0, a: n <= 2)" - parses "protected : Int32" parses "protected : Int32" - parses "\"hello \\\r\n world\"" parses "\"hello \\\r\n world\"" - parses "def foo(x @in); end" parses "def foo(x @in); end" - parses "1 > 2" parses "1 > 2" - parses "def foo(x @offsetof); end" parses "def foo(x @offsetof); end" - parses "->Foo.[]=(Int32)" parses "->Foo.[]=(Int32)" - parses "lib LibC\nfun getchar : (->)?\nend" parses "lib LibC\nfun getchar : (->)?\nend" - parses "1.[]=(2, 3)" parses "1.[]=(2, 3)" - says syntax error on "foo { |(enum)| }" says syntax error on "foo { |(enum)| }" - parses "n >= 2" parses "n >= 2" - end locations - says syntax error on "%Q(" says syntax error on "%Q(" - gets corrects end location for "a = 123" gets corrects end location for "a = 123" - gets corrects end location for "unless 1; 2; end" gets corrects end location for "unless 1; 2; end" - gets corrects end location for "Int[8]?" gets corrects end location for "Int[8]?" - gets corrects end location for "foo.responds_to? :foo" gets corrects end location for "foo.responds_to? :foo" - gets corrects end location for "::foo" gets corrects end location for "::foo" - says syntax error on "def foo(x : Int32, Int32); end" says syntax error on "def foo(x : Int32, Int32); end" - sets correct location of `else` of unless statement sets correct location of `else` of unless statement - parses "%w{one\ttwo}" parses "%w{one\ttwo}" - gets corrects end location for "return" gets corrects end location for "return" - sets correct location of proc literal sets correct location of proc literal - gets corrects of ~ gets corrects of ~ - gets corrects end location for "Foo" gets corrects end location for "Foo" - parses "%w{one\ntwo}" parses "%w{one\ntwo}" - says syntax error on "{1 => 2\n,3 => 4}" says syntax error on "{1 => 2\n,3 => 4}" - gets corrects end location for "/foo/" gets corrects end location for "/foo/" - gets corrects end location for "yield 1" gets corrects end location for "yield 1" - says syntax error on "Foo(x: X\n,y: Y)" says syntax error on "Foo(x: X\n,y: Y)" - correctly computes line number after `\{% -` (#9857) correctly computes line number after `\{% -` (#9857) - gets corrects end location for "a, b = 1, 2 if 3" gets corrects end location for "a, b = 1, 2 if 3" - gets corrects end location for "foo" gets corrects end location for "foo" - sets correct location of trailing ensure sets correct location of trailing ensure - sets correct location of receiver var in method def sets correct location of receiver var in method def - gets corrects end location for "foo *bar" gets corrects end location for "foo *bar" - parses "%w{one two}" parses "%w{one two}" - gets corrects end location for "@@foo" gets corrects end location for "@@foo" - sets correct location and end location of parenthesized empty block sets correct location and end location of parenthesized empty block - parses "annotation Foo\n\nend" parses "annotation Foo\n\nend" - says syntax error on "{1\n,2}" says syntax error on "{1\n,2}" - sets correct location of call name sets correct location of call name - sets location of obj.x += as call sets location of obj.x += as call - says syntax error on "foo(1\n,2)" says syntax error on "foo(1\n,2)" - sets correct location for fun def with return type sets correct location for fun def with return type - gets corrects end location for "foo(\n &.block\n)" gets corrects end location for "foo(\n &.block\n)" - gets corrects end location for "include Foo" gets corrects end location for "include Foo" - gets corrects end location for "foo ->bar(Baz)" gets corrects end location for "foo ->bar(Baz)" - says syntax error on "def foo(x : (*Int32)); end" says syntax error on "def foo(x : (*Int32)); end" - sets correct location of `else` of if statement sets correct location of `else` of if statement - gets corrects end location for "macro foo;end" gets corrects end location for "macro foo;end" - gets corrects end location for "\"hello\"" gets corrects end location for "\"hello\"" - gets corrects end location for "macro foo; 123; end" gets corrects end location for "macro foo; 123; end" - sets correct location of vars in C struct sets correct location of vars in C struct - gets corrects end location for "if 1; else; 2; end" gets corrects end location for "if 1; else; 2; end" - gets corrects end location for "'a'" gets corrects end location for "'a'" - gets corrects end location for "%w(one two)" gets corrects end location for "%w(one two)" - gets corrects end location for "1..3" gets corrects end location for "1..3" - says syntax error on "macro foo(x\n,y); 1; end" says syntax error on "macro foo(x\n,y); 1; end" - parses "%w{\n}" parses "%w{\n}" - parses "%i(foo(bar) baz)" parses "%i(foo(bar) baz)" - sets correct location of element in array literal sets correct location of element in array literal - gets corrects end location for "foo.!" gets corrects end location for "foo.!" - says syntax error on "case x; when \"a\"; 2; when \"a\"; end" says syntax error on "case x; when \"a\"; 2; when \"a\"; end" - says syntax error on "case x; when {1, 2}; 2; when {1, 2}; end" says syntax error on "case x; when {1, 2}; 2; when {1, 2}; end" - says syntax error on "case x; when X; 2; when X; end" says syntax error on "case x; when X; 2; when X; end" - sets correct location of var in proc pointer sets correct location of var in proc pointer - says syntax error on "[1\n,2]" says syntax error on "[1\n,2]" - says syntax error on "case x; when _; end" says syntax error on "case x; when _; end" - gets corrects end location for "foo(1, 2)" gets corrects end location for "foo(1, 2)" - sets location of top-level fun name sets location of top-level fun name - gets corrects end location for "foo ->self.bar" gets corrects end location for "foo ->self.bar" - gets corrects end location for "pointerof(@foo)" gets corrects end location for "pointerof(@foo)" - gets corrects end location for "a, b = 1, 2" gets corrects end location for "a, b = 1, 2" - parses "%i((one two))" parses "%i((one two))" - gets corrects end location for "module Foo; end" gets corrects end location for "module Foo; end" - says syntax error on "def foo(x : Array({sizeof(Int32), 2})); end" says syntax error on "def foo(x : Array({sizeof(Int32), 2})); end" - sets correct location and end location of `begin` block sets correct location and end location of `begin` block - gets corrects end location for "Foo { 1 }" gets corrects end location for "Foo { 1 }" - gets corrects end location for "1 if 2" gets corrects end location for "1 if 2" - sets correct location of var in type declaration sets correct location of var in type declaration - gets corrects end location for "puts obj.foo" gets corrects end location for "puts obj.foo" - gets corrects end location for "f.x = foo" gets corrects end location for "f.x = foo" - gets corrects end location for "foo 1, 2" gets corrects end location for "foo 1, 2" - parses "%i(one\\ two)" parses "%i(one\\ two)" - says syntax error on "case x; when :a; 2; when :a; end" says syntax error on "case x; when :a; 2; when :a; end" - gets corrects end location for "123" gets corrects end location for "123" - gets corrects end location for "1 ensure 2" gets corrects end location for "1 ensure 2" - says syntax error on "{\"a\" : 1}" says syntax error on "{\"a\" : 1}" - says syntax error on "%r(" says syntax error on "%r(" - says syntax error on "%w(" says syntax error on "%w(" - gets corrects end location for "1.as(Int32)" gets corrects end location for "1.as(Int32)" - gets corrects end location for "{%\nif foo\n bar\n end\n%}" gets corrects end location for "{%\nif foo\n bar\n end\n%}" - gets corrects end location for "foo : Foo.class" gets corrects end location for "foo : Foo.class" - gets corrects end location for "foo ->@bar.baz" gets corrects end location for "foo ->@bar.baz" - parses "%w{one{} two}" parses "%w{one{} two}" - gets corrects end location for "{} of Int32 => String" gets corrects end location for "{} of Int32 => String" - sets correct location of call name in operator assignment sets correct location of call name in operator assignment - gets corrects end location for "a && b" gets corrects end location for "a && b" - gets corrects end location for "foo : Foo[42]" gets corrects end location for "foo : Foo[42]" - says syntax error on "case x; when 1, _; end" says syntax error on "case x; when 1, _; end" - sets correct location of `elsif` of if statement sets correct location of `elsif` of if statement - says syntax error on "%w{{one}" says syntax error on "%w{{one}" - sets location of enum method sets location of enum method - gets corrects end location for "begin; 1; end" gets corrects end location for "begin; 1; end" - gets corrects end location for "foo.!()" gets corrects end location for "foo.!()" - gets corrects end location for "abstract def foo" gets corrects end location for "abstract def foo" - says syntax error on "case x; when [1, 2]; 2; when [1, 2]; end" says syntax error on "case x; when [1, 2]; 2; when [1, 2]; end" - gets corrects end location for "foo ->Bar.baz=" gets corrects end location for "foo ->Bar.baz=" - says syntax error on "%q(" says syntax error on "%q(" - says syntax error on "def foo(x : Int32 | (Int32, Int32)); end" says syntax error on "def foo(x : Int32 | (Int32, Int32)); end" - gets corrects end location for "@@a = uninitialized Foo" gets corrects end location for "@@a = uninitialized Foo" - says syntax error on "{\"a\": 1, \"b\" : 2}" says syntax error on "{\"a\": 1, \"b\" : 2}" - gets corrects end location for "abstract def foo : Int32" gets corrects end location for "abstract def foo : Int32" - says syntax error on "def foo(x : 1); end" says syntax error on "def foo(x : 1); end" - gets corrects end location for "foo : Foo*" gets corrects end location for "foo : Foo*" - sets correct location for fun def sets correct location for fun def - gets corrects end location for "foo ->Bar.baz" gets corrects end location for "foo ->Bar.baz" - gets corrects end location for "foo.[0] = 1" gets corrects end location for "foo.[0] = 1" - gets corrects end location for "Foo(A)" gets corrects end location for "Foo(A)" - gets corrects end location for "if 1; elseif; 2; end" gets corrects end location for "if 1; elseif; 2; end" - gets corrects end location for "123.45" gets corrects end location for "123.45" - gets corrects end location for ":foo" gets corrects end location for ":foo" - says syntax error on "def foo(x : {Int32, (Int32, Int32)}); end" says syntax error on "def foo(x : {Int32, (Int32, Int32)}); end" - gets corrects end location for "foo ->bar=" gets corrects end location for "foo ->bar=" - says syntax error on "case x; when /x/; 2; when /x/; end" says syntax error on "case x; when /x/; 2; when /x/; end" - says syntax error on "<<-HEREDOC" says syntax error on "<<-HEREDOC" - gets corrects end location for "nil" gets corrects end location for "nil" - gets correct location after macro with yield gets correct location after macro with yield - gets corrects end location for "1 rescue 2" gets corrects end location for "1 rescue 2" - gets corrects end location for "f.x=(*foo)" gets corrects end location for "f.x=(*foo)" - says syntax error on "%x(" says syntax error on "%x(" - gets corrects end location for "foo.nil?" gets corrects end location for "foo.nil?" - gets corrects end location for "foo.responds_to?(:foo)" gets corrects end location for "foo.responds_to?(:foo)" - gets corrects end location for "[1, 2,]" gets corrects end location for "[1, 2,]" - parses "annotation Foo; end" parses "annotation Foo; end" - gets corrects end location for var gets corrects end location for var - gets corrects end location for "Foo?" gets corrects end location for "Foo?" - parses "annotation Foo\nend\nrequire \"bar\"" parses "annotation Foo\nend\nrequire \"bar\"" - parses "%w{\\{one}" parses "%w{\\{one}" - says syntax error on "<<-HEREDOC\n" says syntax error on "<<-HEREDOC\n" - says syntax error on "case x; when 1; 2; when 1; end" says syntax error on "case x; when 1; 2; when 1; end" - gets corrects end location for "false" gets corrects end location for "false" - sets correct location for fun def with body sets correct location for fun def with body - parses "%i{(one two)}" parses "%i{(one two)}" - says syntax error on "Foo(X\n,Y)" says syntax error on "Foo(X\n,Y)" - gets corrects end location for "foo **bar" gets corrects end location for "foo **bar" - says syntax error on "def foo(x : *Int32); end" says syntax error on "def foo(x : *Int32); end" - gets corrects end location for block with do ... end gets corrects end location for block with do ... end - gets corrects end location for "extend Foo" gets corrects end location for "extend Foo" - says syntax error on "def foo(x : (Int32, Int32)); end" says syntax error on "def foo(x : (Int32, Int32)); end" - gets corrects end location for "x : Foo(A, *B, C)" gets corrects end location for "x : Foo(A, *B, C)" - sets correct location for fun def on multiple lines sets correct location for fun def on multiple lines - gets corrects end location for "x : Foo -> Bar" gets corrects end location for "x : Foo -> Bar" - gets corrects end location for "return 1" gets corrects end location for "return 1" - says syntax error on "case x; when 'a'; 2; when 'a'; end" says syntax error on "case x; when 'a'; 2; when 'a'; end" - gets corrects end location for "foo.bar(x) do; end" gets corrects end location for "foo.bar(x) do; end" - gets corrects end location for "class Foo; end" gets corrects end location for "class Foo; end" - says syntax error on "%i(" says syntax error on "%i(" - gets corrects end location for "@foo" gets corrects end location for "@foo" - gets correct location after macro with yield gets correct location after macro with yield - gets corrects end location for "offsetof({X, Y}, 1)" gets corrects end location for "offsetof({X, Y}, 1)" - gets corrects end location for "foo ->@bar.baz=" gets corrects end location for "foo ->@bar.baz=" - gets corrects end location for "1.." gets corrects end location for "1.." - gets corrects end location for "a || b" gets corrects end location for "a || b" - says syntax error on "def foo(x\n,y); 1; end" says syntax error on "def foo(x\n,y); 1; end" - says syntax error on "def foo(x : (Int32, Int32) | Int32); end" says syntax error on "def foo(x : (Int32, Int32) | Int32); end" - gets correct location of empty exception handler inside def gets correct location of empty exception handler inside def - says syntax error on "case x; when true; 2; when true; end" says syntax error on "case x; when true; 2; when true; end" - gets corrects end location for "->{ }" gets corrects end location for "->{ }" - gets corrects end location for "require \"foo\"" gets corrects end location for "require \"foo\"" - gets corrects end location for "offsetof(Foo, @a)" gets corrects end location for "offsetof(Foo, @a)" - says syntax error on "foo(a: 1\n,b: 2)" says syntax error on "foo(a: 1\n,b: 2)" - gets corrects end location for "{a: 1}" gets corrects end location for "{a: 1}" - gets corrects end location for "foo ->@@bar.baz" gets corrects end location for "foo ->@@bar.baz" - gets corrects end location for "!foo" gets corrects end location for "!foo" - sets correct location and end location of parenthesized block sets correct location and end location of parenthesized block - gets corrects end location for "begin; 1; 2; 3; end" gets corrects end location for "begin; 1; 2; 3; end" - sets correct location of var in macro for loop sets correct location of var in macro for loop - parses "annotation Foo::Bar\n\nend" parses "annotation Foo::Bar\n\nend" - gets correct location with - (#1558) gets correct location with - (#1558) - gets corrects end location for "sizeof(Foo)" gets corrects end location for "sizeof(Foo)" - gets corrects end location for "foo ->bar" gets corrects end location for "foo ->bar" - gets corrects end location for "foo ->self.bar=" gets corrects end location for "foo ->self.bar=" - gets corrects end location for "[] of Int32" gets corrects end location for "[] of Int32" - sets correct locations of keywords of exception handler sets correct locations of keywords of exception handler - says syntax error on "{1, 2\n,3}" says syntax error on "{1, 2\n,3}" - doesn't override yield with macro yield doesn't override yield with macro yield - parses "%w{one\\ two}" parses "%w{one\\ two}" - says syntax error on "case x; when nil; 2; when nil; end" says syntax error on "case x; when nil; 2; when nil; end" - gets corrects end location for "x : Foo ->" gets corrects end location for "x : Foo ->" - gets corrects end location for "@a = uninitialized Foo" gets corrects end location for "@a = uninitialized Foo" - gets corrects end location for block with { ... } gets corrects end location for block with { ... } - gets corrects end location for "typeof(1)" gets corrects end location for "typeof(1)" - gets corrects end location for "while 1; end" gets corrects end location for "while 1; end" - gets corrects end location for "def foo; rescue ex; end" gets corrects end location for "def foo; rescue ex; end" - sets correct location of implicit tuple literal of multi-return sets correct location of implicit tuple literal of multi-return - parses "%w{one\\}}" parses "%w{one\\}}" - gets corrects end location for "f.x=(foo).bar" gets corrects end location for "f.x=(foo).bar" - gets corrects end location for "foo bar, out baz" gets corrects end location for "foo bar, out baz" - says syntax error on "case x; when 1..2; 2; when 1..2; end" says syntax error on "case x; when 1..2; 2; when 1..2; end" - says syntax error on "class Foo(X\n,Y); 1; end" says syntax error on "class Foo(X\n,Y); 1; end" - gets corrects end location for "[1, 2]" gets corrects end location for "[1, 2]" - gets corrects end location for "{1, 2}" gets corrects end location for "{1, 2}" - says syntax error on "%w{one}}" says syntax error on "%w{one}}" - gets corrects end location for "yield" gets corrects end location for "yield" - gets corrects end location for "alias Foo = Bar" gets corrects end location for "alias Foo = Bar" - parses "%i{foo\\nbar baz}" parses "%i{foo\\nbar baz}" - gets corrects end location for "def foo; end" gets corrects end location for "def foo; end" - says syntax error on "case x; when 1; when _; end" says syntax error on "case x; when 1; when _; end" - says syntax error on "def foo(x : {sizeof(Int32), 2}); end" says syntax error on "def foo(x : {sizeof(Int32), 2}); end" - gets corrects end location for var + var gets corrects end location for var + var - gets corrects end location for "foo ->@@bar.baz=" gets corrects end location for "foo ->@@bar.baz=" - gets corrects end location for "foo.bar= *baz" gets corrects end location for "foo.bar= *baz" - gets corrects end location for "struct Foo; end" gets corrects end location for "struct Foo; end" - gets corrects end location for "def foo; 1; end" gets corrects end location for "def foo; 1; end" - sets correct location of trailing rescue sets correct location of trailing rescue - sets location of lib fun name sets location of lib fun name - says syntax error on "%i{{one}" says syntax error on "%i{{one}" - gets corrects end location for "foo.@foo" gets corrects end location for "foo.@foo" - says syntax error on "%i{one}}" says syntax error on "%i{one}}" - gets corrects end location for "foo : Foo**" gets corrects end location for "foo : Foo**" - gets corrects end location for "foo.nil?( )" gets corrects end location for "foo.nil?( )" - sets location of += sets location of += - gets corrects end location for "abstract def foo(x)" gets corrects end location for "abstract def foo(x)" - gets corrects end location for "foo : Foo?" gets corrects end location for "foo : Foo?" - says syntax error on "return &* 1" says syntax error on "return &* 1" - parses "case;when true;1;end" parses "case;when true;1;end" - parses "def foo(module foo); end" parses "def foo(module foo); end" - says syntax error on "foo { |(macro)| }" says syntax error on "foo { |(macro)| }" - parses "foo.^ 1, 2" parses "foo.^ 1, 2" - parses "def foo(x @@asm); end" parses "def foo(x @@asm); end" - says syntax error on "until break; end" says syntax error on "until break; end" - parses "macro >;end" parses "macro >;end" - parses "def foo(var : Int**); end" parses "def foo(var : Int**); end" - parses "foo[0] = 1 if 2" parses "foo[0] = 1 if 2" - says syntax error on "1 if break" says syntax error on "1 if break" - says syntax error on "next === 1" says syntax error on "next === 1" - parses "\"hello \#{1}\" \\\n \"\#{2} world\"" parses "\"hello \#{1}\" \\\n \"\#{2} world\"" - says syntax error on "until next; end" says syntax error on "until next; end" - parses "macro foo\n\"\\\\\"\nend" parses "macro foo\n\"\\\\\"\nend" - parses "...2" parses "...2" - says syntax error on "if next; end" says syntax error on "if next; end" - parses "foo % x()" parses "foo % x()" - parses "def foo(**args)\n1\nend" parses "def foo(**args)\n1\nend" - parses ":-" parses ":-" - parses "{% begin %}%| %s |{% end %}" parses "{% begin %}%| %s |{% end %}" - says syntax error on "{{ {% begin %} }}" says syntax error on "{{ {% begin %} }}" - parses "extend Foo" parses "extend Foo" - parses "foo = 1; foo a: 1" parses "foo = 1; foo a: 1" - parses "macro foo(@[Foo] outer inner);end" parses "macro foo(@[Foo] outer inner);end" - parses "foo.%(1, 2)" parses "foo.%(1, 2)" - parses "foo = 1; ->foo.>>(Int32)" parses "foo = 1; ->foo.>>(Int32)" - parses "a = 1; b = 2; c = 3; a-b-c" parses "a = 1; b = 2; c = 3; a-b-c" - parses "property with : Int32" parses "property with : Int32" - parses "macro <;end" parses "macro <;end" - parses ":\u304B\u305F\u306A" parses ":\u304B\u305F\u306A" - parses "->Foo.[](Int32)" parses "->Foo.[](Int32)" - says syntax error on "'''" says syntax error on "'''" - parses "case\n1\nwhen 1\n2\nend\nif a\nend" parses "case\n1\nwhen 1\n2\nend\nif a\nend" - parses "Foo({x: X, y: Y})" parses "Foo({x: X, y: Y})" - says syntax error on "foo[next]" says syntax error on "foo[next]" - parses ":<<" parses ":<<" - parses "def foo(x)\n x\nend; foo = 1; b = 2; foo -b" parses "def foo(x)\n x\nend; foo = 1; b = 2; foo -b" - says syntax error on "x[1:-2]" says syntax error on "x[1:-2]" - parses ":[]?" parses ":[]?" - says syntax error on "foo(\"bar\" \"baz\")" says syntax error on "foo(\"bar\" \"baz\")" - parses "<<-FOO\n \t 1\n \t FOO" parses "<<-FOO\n \t 1\n \t FOO" - parses "def foo(x @@self); end" parses "def foo(x @@self); end" - parses "@a : Foo | Int32" parses "@a : Foo | Int32" - parses "def %; end;" parses "def %; end;" - parses ":*" parses ":*" - parses "property while : Int32" parses "property while : Int32" - parses "foo.** do end" parses "foo.** do end" - parses "def -(); end" parses "def -(); end" - parses "foo(Bar { 1 })" parses "foo(Bar { 1 })" - parses "foo.-(1, 2)" parses "foo.-(1, 2)" - says syntax error on "macro foo(\"\" y); end" says syntax error on "macro foo(\"\" y); end" - parses "foo.& 1, 2" parses "foo.& 1, 2" - says syntax error on "[1 1]" says syntax error on "[1 1]" - parses "def foo(@extend); end" parses "def foo(@extend); end" - parses "a\nunless / /\n/ /\nelse\n/ /\nend" parses "a\nunless / /\n/ /\nelse\n/ /\nend" - parses "case a\nwhen b\n/ /\n\nelse\n/ /\nend" parses "case a\nwhen b\n/ /\n\nelse\n/ /\nend" - parses "def foo(@self); end" parses "def foo(@self); end" - parses "foo.>=(1, 2) { 3 }" parses "foo.>=(1, 2) { 3 }" - parses "foo(/a/)" parses "foo(/a/)" - says syntax error on "a = 1; a += return" says syntax error on "a = 1; a += return" - parses "Foo(1)" parses "Foo(1)" - says syntax error on "break == 1" says syntax error on "break == 1" - parses "def foo(@[Foo] **args); end" parses "def foo(@[Foo] **args); end" - parses "foo = 1; ->foo.foo=" parses "foo = 1; ->foo.foo=" - parses "foo out x; x" parses "foo out x; x" - says syntax error on "foo { |self| }" says syntax error on "foo { |self| }" - parses "{%\nif 1; 2; end\n%}" parses "{%\nif 1; 2; end\n%}" - says syntax error on "class Foo; require \"bar\"; end" says syntax error on "class Foo; require \"bar\"; end" - parses "lib LibC; fun foo(a : Int**); end" parses "lib LibC; fun foo(a : Int**); end" - says syntax error on "def foo(foo sizeof); end" says syntax error on "def foo(foo sizeof); end" - parses "def foo(@@alias); end" parses "def foo(@@alias); end" - says syntax error on "break - 1" says syntax error on "break - 1" - parses "def foo(@@sizeof); end" parses "def foo(@@sizeof); end" - parses "(a;\nb)" parses "(a;\nb)" - says syntax error on "case 1\nwhen Int32; 2; in 2" says syntax error on "case 1\nwhen Int32; 2; in 2" - parses "enum Foo; A = 1\ndef foo; 1; end\ndef bar; 2; end\nend" parses "enum Foo; A = 1\ndef foo; 1; end\ndef bar; 2; end\nend" - parses "def self.<=; end;" parses "def self.<=; end;" - parses "->Foo.*(Int32)" parses "->Foo.*(Int32)" - says syntax error on "*a, b, c, d, e = 1, 2" says syntax error on "*a, b, c, d, e = 1, 2" - says syntax error on "def foo(fun); end" says syntax error on "def foo(fun); end" - says syntax error on "*a if true" says syntax error on "*a if true" - parses "foo(n &- 2)" parses "foo(n &- 2)" - sets correct location of named tuple type sets correct location of named tuple type - parses "foo &.nil?" parses "foo &.nil?" - parses "case {1}\nin {nil}; 2; end" parses "case {1}\nin {nil}; 2; end" - parses "foo.|" parses "foo.|" - parses "def +(); end;" parses "def +(); end;" - says syntax error on "$foo" says syntax error on "$foo" - parses "foo(z: 0, a: n * 2)" parses "foo(z: 0, a: n * 2)" - parses "a.b //=\n1" parses "a.b //=\n1" - parses "foo.>(1, 2) { 3 }" parses "foo.>(1, 2) { 3 }" - parses "{\"\".id}" parses "{\"\".id}" - parses "-@foo" parses "-@foo" - parses "foo(1)" parses "foo(1)" - parses "macro >>;end" parses "macro >>;end" - parses "macro foo;%var{1, x} = hello;end" parses "macro foo;%var{1, x} = hello;end" - parses "unless foo; 1; else; 2; end" parses "unless foo; 1; else; 2; end" - parses "def ===; end;" parses "def ===; end;" - says syntax error on "{1 => 2 3 => 4}" says syntax error on "{1 => 2 3 => 4}" - parses "foo 1\n" parses "foo 1\n" - parses "foo %x" parses "foo %x" - parses "def foo(x @@case); end" parses "def foo(x @@case); end" - parses "1 / 2" parses "1 / 2" - parses "{[] of Foo, Bar::Baz.new}" parses "{[] of Foo, Bar::Baz.new}" - parses "a.b *=\n1" parses "a.b *=\n1" - says syntax error on "foo { |begin| }" says syntax error on "foo { |begin| }" - parses "yield 1 if true" parses "yield 1 if true" - parses "@@foo/2" parses "@@foo/2" - parses "x = 0; a, b = x += 1" parses "x = 0; a, b = x += 1" - says syntax error on "foo { |require| }" says syntax error on "foo { |require| }" - says syntax error on "return &** 1" says syntax error on "return &** 1" - parses "foo = 1; ->foo.&+(Int32)" parses "foo = 1; ->foo.&+(Int32)" - parses "def foo(out foo); end" parses "def foo(out foo); end" - says syntax error on "def foo(x : U) forall U, U; end" says syntax error on "def foo(x : U) forall U, U; end" - parses "macro |;end" parses "macro |;end" - parses "macro /;end" parses "macro /;end" - parses ":[]?" parses ":[]?" - parses "b.c &&= 1" parses "b.c &&= 1" - parses "-> do end" parses "-> do end" - parses "foo.**" parses "foo.**" - parses "def foo(x @select); end" parses "def foo(x @select); end" - parses "property case : Int32" parses "property case : Int32" - says syntax error on "def foo(foo abstract); end" says syntax error on "def foo(foo abstract); end" - parses "def foo(x @@true); end" parses "def foo(x @@true); end" - says syntax error on "a = 1; a += next" says syntax error on "a = 1; a += next" - parses "foo { a = 1 }; a" parses "foo { a = 1 }; a" - parses "{..2}" parses "{..2}" - says syntax error on "def self.!; end" says syntax error on "def self.!; end" - parses "def foo(@@var = 1); 1; end" parses "def foo(@@var = 1); 1; end" - parses "macro %;end" parses "macro %;end" - parses "a = 1; a &-=\n1" parses "a = 1; a &-=\n1" - parses "def self.+; end;" parses "def self.+; end;" - parses "a = 1; a |= 1" parses "a = 1; a |= 1" - parses "foo(z: 0, a: n &* 2)" parses "foo(z: 0, a: n &* 2)" - parses "Foo(\"foo\": U, \"bar\": V)" parses "Foo(\"foo\": U, \"bar\": V)" - says syntax error on "foo x: 1, x: 1" says syntax error on "foo x: 1, x: 1" - says syntax error on "{a: 1, a: 2}" says syntax error on "{a: 1, a: 2}" - says syntax error on "if 1\n foo 1,\nend" says syntax error on "if 1\n foo 1,\nend" - says syntax error on "break / 1" says syntax error on "break / 1" - parses "def foo(x @enum); end" parses "def foo(x @enum); end" - parses "def foo(var : Int, Float -> Double); end" parses "def foo(var : Int, Float -> Double); end" - parses "def foo\n1\nend" parses "def foo\n1\nend" - says syntax error on "foo { |alias| }" says syntax error on "foo { |alias| }" - parses "a.b/2" parses "a.b/2" - says syntax error on "break[0]= 1" says syntax error on "break[0]= 1" - parses "1 &* 2" parses "1 &* 2" - parses "while true; end\nif true; end" parses "while true; end\nif true; end" - parses "foo.=~(1, 2) { 3 }" parses "foo.=~(1, 2) { 3 }" - parses "foo(0, n ^ 2)" parses "foo(0, n ^ 2)" - parses "def >=(); end" parses "def >=(); end" - parses "[1, 2]" parses "[1, 2]" - says syntax error on "{{ {{ 1 }} }}" says syntax error on "{{ {{ 1 }} }}" - parses "def foo(@lib); end" parses "def foo(@lib); end" - parses "f.x <<= 2" parses "f.x <<= 2" - says syntax error on "foo { |extend| }" says syntax error on "foo { |extend| }" - says syntax error on "pointerof(self)" says syntax error on "pointerof(self)" - parses "foo(**bar)" parses "foo(**bar)" - parses "macro &-;end" parses "macro &-;end" - parses "def foo(x @begin); end" parses "def foo(x @begin); end" - parses "n > 2" parses "n > 2" - parses "enum Foo; A = 1; B; end" parses "enum Foo; A = 1; B; end" - parses "1 << 2" parses "1 << 2" - says syntax error on "def foo(foo until); end" says syntax error on "def foo(foo until); end" - parses "begin; rescue; end" parses "begin; rescue; end" - parses "{% a = 1 %}" parses "{% a = 1 %}" - parses "foo &.%(1)" parses "foo &.%(1)" - parses "break {1 => 2}" parses "break {1 => 2}" - says syntax error on "def foo(foo in); end" says syntax error on "def foo(foo in); end" - says syntax error on "def foo(x :Int32); end" says syntax error on "def foo(x :Int32); end" - parses "call(foo : A, end : B)" parses "call(foo : A, end : B)" - parses "macro foo;var unless true;end" parses "macro foo;var unless true;end" - parses "foo(out @x); @x" parses "foo(out @x); @x" - parses "def **; end;" parses "def **; end;" - parses "macro foo;%var;end" parses "macro foo;%var;end" - parses "foo.& do end" parses "foo.& do end" - parses "- 1" parses "- 1" - parses "foo.** 1, 2" parses "foo.** 1, 2" - says syntax error on "def foo:String\nend" says syntax error on "def foo:String\nend" - says syntax error on "def foo(**args, **args2); end" says syntax error on "def foo(**args, **args2); end" - parses "macro <=>;end" parses "macro <=>;end" - parses "a = 1; a <<=\n1" parses "a = 1; a <<=\n1" - parses "1.!(\n)" parses "1.!(\n)" - says syntax error on "false foo" says syntax error on "false foo" - parses "def foo; a = 1; x { a }; end" parses "def foo; a = 1; x { a }; end" - parses "a : Foo = 1" parses "a : Foo = 1" - parses "foo 1, **bar" parses "foo 1, **bar" - parses "1 <= 2" parses "1 <= 2" - parses "A = 1" parses "A = 1" - says syntax error on "class Foo(T U)" says syntax error on "class Foo(T U)" - parses "foo.is_a?(Foo | Bar)" parses "foo.is_a?(Foo | Bar)" - parses "->@@foo.foo=" parses "->@@foo.foo=" - parses "x = 1; ->{ x }" parses "x = 1; ->{ x }" - parses "foo(*bar)" parses "foo(*bar)" - parses "def self.~(); end;" parses "def self.~(); end;" - says syntax error on "foo(return)" says syntax error on "foo(return)" - parses "foo { |(a, *b, c)| }" parses "foo { |(a, *b, c)| }" - parses "def foo(&@block); end" parses "def foo(&@block); end" - says syntax error on "a.b, c.d() = 1" says syntax error on "a.b, c.d() = 1" - parses "a = 1; pointerof(a)" parses "a = 1; pointerof(a)" - parses "Foo({x: X, typeof: Y})" parses "Foo({x: X, typeof: Y})" - says syntax error on "foo(**bar, out x)" says syntax error on "foo(**bar, out x)" - parses "{% begin %}%Q{ %s }{% end %}" parses "{% begin %}%Q{ %s }{% end %}" - parses "{% begin %}%q{ %s }{% end %}" parses "{% begin %}%q{ %s }{% end %}" - parses "typeof(\n 1\n)" parses "typeof(\n 1\n)" - parses "def foo(x @break); end" parses "def foo(x @break); end" - says syntax error on "1 unless next" says syntax error on "1 unless next" - parses "enum Foo; A = 1\ndef foo; 1; end; end" parses "enum Foo; A = 1\ndef foo; 1; end; end" - parses "a\nwhile / /; / /; end" parses "a\nwhile / /; / /; end" - parses "foo(bar:\"a\", baz:\"b\")" parses "foo(bar:\"a\", baz:\"b\")" - parses "next *1" parses "next *1" - says syntax error on "def foo(foo while); end" says syntax error on "def foo(foo while); end" - parses "def ===(other, file = 1); end" parses "def ===(other, file = 1); end" - parses "a = 1; a &*=\n1" parses "a = 1; a &*=\n1" - parses "lib LibC; type A = B; end" parses "lib LibC; type A = B; end" - parses "lib LibC; {% if 1 %}2{% end %}; end" parses "lib LibC; {% if 1 %}2{% end %}; end" - says syntax error on "def foo(foo instance_sizeof); end" says syntax error on "def foo(foo instance_sizeof); end" - parses "def !=(*args, **opts, &); end" parses "def !=(*args, **opts, &); end" - sets correct location of global path in class def sets correct location of global path in class def - says syntax error on "macro foo(**x, y)" says syntax error on "macro foo(**x, y)" - says syntax error on "def foo(end); end" says syntax error on "def foo(end); end" - says syntax error on "return false foo" says syntax error on "return false foo" - says syntax error on "def foo(abstract); end" says syntax error on "def foo(abstract); end" - parses "Int[8, 4,]" parses "Int[8, 4,]" - parses "<<-EOF.x\n foo\nEOF" parses "<<-EOF.x\n foo\nEOF" - parses "lib LibC; fun getchar(a : Int, b : Float) : Int; end" parses "lib LibC; fun getchar(a : Int, b : Float) : Int; end" - says syntax error on "macro foo.bar;end" says syntax error on "macro foo.bar;end" - says syntax error on "foo(1 2)" says syntax error on "foo(1 2)" - says syntax error on "def foo?=(x); end" says syntax error on "def foo?=(x); end" - parses "def foo(@[Foo] @[Bar] var : Int32); end" parses "def foo(@[Foo] @[Bar] var : Int32); end" - says syntax error on "1 while 3" says syntax error on "1 while 3" - parses "def foo(@[Foo] *args); end" parses "def foo(@[Foo] *args); end" - says syntax error on "if break; end" says syntax error on "if break; end" - says syntax error on "foo { |(protected)| }" says syntax error on "foo { |(protected)| }" - parses "def foo(x @fun); end" parses "def foo(x @fun); end" - parses "call ->foo" parses "call ->foo" - parses "->@@foo.foo!" parses "->@@foo.foo!" - says syntax error on "unless 1 == 1 a; end" says syntax error on "unless 1 == 1 a; end" - parses "->foo(Void*)" parses "->foo(Void*)" - parses "foo.!=(1, 2) { 3 }" parses "foo.!=(1, 2) { 3 }" - parses "def self.!=(); end;" parses "def self.!=(); end;" - parses "foo(0, n - 2)" parses "foo(0, n - 2)" - parses "foo &.baz.qux do\nend" parses "foo &.baz.qux do\nend" - parses "foo(0, n &- 2)" parses "foo(0, n &- 2)" - parses "begin; 1; ensure; 2; end" parses "begin; 1; ensure; 2; end" - says syntax error on "def foo(foo private); end" says syntax error on "def foo(foo private); end" - says syntax error on "foo { |(instance_sizeof)| }" says syntax error on "foo { |(instance_sizeof)| }" - parses "macro `;end" parses "macro `;end" - says syntax error on "def foo x y; end" says syntax error on "def foo x y; end" - parses "{1 => 2, 3 => 4}" parses "{1 => 2, 3 => 4}" - parses "Foo()" parses "Foo()" - parses "f.x &= 2" parses "f.x &= 2" - parses "foo 1, a: 1, b: 2\n1" parses "foo 1, a: 1, b: 2\n1" - parses "def foo(x @@typeof); end" parses "def foo(x @@typeof); end" - parses "asm(\"bl trap\" :::: \"unwind\")" parses "asm(\"bl trap\" :::: \"unwind\")" - parses "def foo(\n&block\n); end" parses "def foo(\n&block\n); end" - says syntax error on "break + 1" says syntax error on "break + 1" - says syntax error on "macro Foo;end" says syntax error on "macro Foo;end" - says syntax error on "break.as(Int32)" says syntax error on "break.as(Int32)" - parses "Foo(X, sizeof(Int32))" parses "Foo(X, sizeof(Int32))" - parses "->() : Int32 { }" parses "->() : Int32 { }" - parses "class Foo(*T); end" parses "class Foo(*T); end" - parses "->(x : Int32) { }" parses "->(x : Int32) { }" - parses "x[+ 1]" parses "x[+ 1]" - parses "def &+(); end" parses "def &+(); end" - says syntax error on "def foo *y; 1; end" says syntax error on "def foo *y; 1; end" - says syntax error on "a = break" says syntax error on "a = break" - parses "def foo(var1, var2); end" parses "def foo(var1, var2); end" - parses "x = 1 ensure 2" parses "x = 1 ensure 2" - says syntax error on "case 1; when next; end; end" says syntax error on "case 1; when next; end; end" - parses "def foo(@@unless); end" parses "def foo(@@unless); end" - parses "1 =~ 2" parses "1 =~ 2" - parses "*a, b = 1" parses "*a, b = 1" - parses "\"foo\#{bar}baz\"" parses "\"foo\#{bar}baz\"" - parses "foo % w()" parses "foo % w()" - parses "def foo(break foo); end" parses "def foo(break foo); end" - parses "return;" parses "return;" - says syntax error on "foo { |(abstract)| }" says syntax error on "foo { |(abstract)| }" - parses "module Foo(T); end" parses "module Foo(T); end" - says syntax error on "next ^ 1" says syntax error on "next ^ 1" - parses "foo(\n1\n)" parses "foo(\n1\n)" - parses "foo { |a, b| 1 }" parses "foo { |a, b| 1 }" - parses "my_def def foo\nloop do\nend\nend" parses "my_def def foo\nloop do\nend\nend" - parses "foo = 1; ->foo.foo?" parses "foo = 1; ->foo.foo?" - parses "property alias : Int32" parses "property alias : Int32" - sets correct location of annotation on method parameter sets correct location of annotation on method parameter - parses "macro foo\n <<-FOO\n \#{ %var }\n FOO\nend" parses "macro foo\n <<-FOO\n \#{ %var }\n FOO\nend" - parses "1 if /x/" parses "1 if /x/" - parses "foo = 1; ->foo.|(Int32)" parses "foo = 1; ->foo.|(Int32)" - says syntax error on "a = 1; b = 2; a, b += 1, 2" says syntax error on "a = 1; b = 2; a, b += 1, 2" - parses "foo(0, n ** 2)" parses "foo(0, n ** 2)" - parses "def foo(@break); end" parses "def foo(@break); end" - parses "lib LibC; struct Foo; x : Int*; end end" parses "lib LibC; struct Foo; x : Int*; end end" - says syntax error on "def foo(break); end" says syntax error on "def foo(break); end" - parses "1 ensure 2" parses "1 ensure 2" - parses "macro foo;bar{% for x in y %}\\ \n body{% end %}\\ baz;end" parses "macro foo;bar{% for x in y %}\\ \n body{% end %}\\ baz;end" - parses "n / 2" parses "n / 2" - says syntax error on "def foo(false); end" says syntax error on "def foo(false); end" - parses "macro foo(x, *y);end" parses "macro foo(x, *y);end" - parses "foo &.[0] = 1" parses "foo &.[0] = 1" - says syntax error on "def !; end" says syntax error on "def !; end" - parses "1 === 2" parses "1 === 2" - parses "f.x &*= 2" parses "f.x &*= 2" - says syntax error on "self += 1" says syntax error on "self += 1" - parses "def foo(enum foo); end" parses "def foo(enum foo); end" - parses "def foo(@[Foo] @var); end" parses "def foo(@[Foo] @var); end" - says syntax error on "return &+ 1" says syntax error on "return &+ 1" - says syntax error on "next / 1" says syntax error on "next / 1" - parses "foo.+ do end" parses "foo.+ do end" - parses "macro ===;end" parses "macro ===;end" - parses "alignof(X)" parses "alignof(X)" - parses "foo(x) do\n//\nend" parses "foo(x) do\n//\nend" - parses "a = / /" parses "a = / /" - sets correct location of argument in named tuple type sets correct location of argument in named tuple type - parses "def **(); end" parses "def **(); end" - says syntax error on "Hash {foo: 1} of Int32 => Int32" says syntax error on "Hash {foo: 1} of Int32 => Int32" - parses " macro foo(\n @[Foo]\n id,\n @[Bar] name\n );end" parses " macro foo(\n @[Foo]\n id,\n @[Bar] name\n );end" - parses "a[], a[] = 1, 2" parses "a[], a[] = 1, 2" - parses "Set(Int32) {1, 2, 3}" parses "Set(Int32) {1, 2, 3}" - parses "1 -2_i64" parses "1 -2_i64" - parses "def <=(); end;" parses "def <=(); end;" - parses "*a = 1" parses "*a = 1" - says syntax error on "foo { |unless| }" says syntax error on "foo { |unless| }" - parses "1 rescue 2" parses "1 rescue 2" - parses "foo &.as(T).bar" parses "foo &.as(T).bar" - says syntax error on "foo { |(asm)| }" says syntax error on "foo { |(asm)| }" - parses "def foo(@@self); end" parses "def foo(@@self); end" - parses "()" parses "()" - parses "def !=(*args, **opts); end" parses "def !=(*args, **opts); end" - parses "def foo(x @end); end" parses "def foo(x @end); end" - says syntax error on "case return; when 1; end; end" says syntax error on "case return; when 1; end; end" - parses "case 1\nin false; 2; end" parses "case 1\nin false; 2; end" - parses "asm(\"nop\" ::: :)" parses "asm(\"nop\" ::: :)" - parses "n !~ 2" parses "n !~ 2" - parses "->Foo.<<(Int32)" parses "->Foo.<<(Int32)" - says syntax error on "def as?; end" says syntax error on "def as?; end" - parses "foo(0, n =~ 2)" parses "foo(0, n =~ 2)" - parses "foo.* do end" parses "foo.* do end" - says syntax error on "def foo(sizeof); end" says syntax error on "def foo(sizeof); end" - says syntax error on "->::@foo.foo" says syntax error on "->::@foo.foo" - parses "foo *bar" parses "foo *bar" - parses "x.foo a: 1, b: 2 " parses "x.foo a: 1, b: 2 " - says syntax error on "macro Foo.bar;end" says syntax error on "macro Foo.bar;end" - parses "Foo{\"x\" => \"y\"}" parses "Foo{\"x\" => \"y\"}" - parses "x = 1; foo x {\n}" parses "x = 1; foo x {\n}" - says syntax error on "next[]" says syntax error on "next[]" - parses "begin; 1; rescue ::Foo; 2; end" parses "begin; 1; rescue ::Foo; 2; end" - parses "{[] of Foo, Bar::Baz ** 2}" parses "{[] of Foo, Bar::Baz ** 2}" - parses "@@foo" parses "@@foo" - parses "def <=(*args, **opts); end" parses "def <=(*args, **opts); end" - says syntax error on "def foo(foo unless); end" says syntax error on "def foo(foo unless); end" - parses "case 1\nwhen .is_a?(T)\n2\nend" parses "case 1\nwhen .is_a?(T)\n2\nend" - parses "def foo(*y : *T); 1; end" parses "def foo(*y : *T); 1; end" - says syntax error on "foo { |module| }" says syntax error on "foo { |module| }" - parses "foo = 1; ->foo./(Int32)" parses "foo = 1; ->foo./(Int32)" - parses "1.0" parses "1.0" - says syntax error on "a, b, c, d, *e = 1, 2, 3" says syntax error on "a, b, c, d, *e = 1, 2, 3" - parses "case 1\nin true; 2; end" parses "case 1\nin true; 2; end" - says syntax error on "fun Foo : Int64\nend" says syntax error on "fun Foo : Int64\nend" - parses "\"hello \\\n world\"" parses "\"hello \\\n world\"" - parses "macro ^;end" parses "macro ^;end" - says syntax error on "def foo(*x, &x); end" says syntax error on "def foo(*x, &x); end" - parses "foo.!= 1, 2" parses "foo.!= 1, 2" - says syntax error on "def foo(foo require); end" says syntax error on "def foo(foo require); end" - parses "def foo(@@select); end" parses "def foo(@@select); end" - parses "nil : Int32" parses "nil : Int32" - parses "foo(x: result : Int32); result" parses "foo(x: result : Int32); result" - parses "case 1\nin Int32.class; 2; end" parses "case 1\nin Int32.class; 2; end" - parses "def foo(class foo); end" parses "def foo(class foo); end" - parses "foo(0, n &** 2)" parses "foo(0, n &** 2)" - says syntax error on "def foo(in); end" says syntax error on "def foo(in); end" - says syntax error on "next > 1" says syntax error on "next > 1" - parses "def foo(x y); y; end" parses "def foo(x y); y; end" - parses "+1.0_f32" parses "+1.0_f32" - says syntax error on "def foo(foo end); end" says syntax error on "def foo(foo end); end" - parses "1 +2.0" parses "1 +2.0" - parses "x.y=(1).to_s" parses "x.y=(1).to_s" - parses "def foo; a; end" parses "def foo; a; end" - parses "def foo(x @@protected); end" parses "def foo(x @@protected); end" - parses "def self.<=(); end;" parses "def self.<=(); end;" - parses "def ==(*args, **opts, &); end" parses "def ==(*args, **opts, &); end" - says syntax error on "def foo(x y, x z); end" says syntax error on "def foo(x y, x z); end" - parses "foo (1 + 2), 3" parses "foo (1 + 2), 3" - parses "foo.is_a?(Const)" parses "foo.is_a?(Const)" - says syntax error on "def foo(if); end" says syntax error on "def foo(if); end" - parses "1.as Bar" parses "1.as Bar" - says syntax error on "return - 1" says syntax error on "return - 1" - parses "def ===(); end" parses "def ===(); end" - parses "def foo; 1; 2; end" parses "def foo; 1; 2; end" - parses "lib LibC; struct Foo; include Bar; end; end" parses "lib LibC; struct Foo; include Bar; end; end" - parses "foo[\n1\n]" parses "foo[\n1\n]" - parses "foo = 1; ->foo.foo!" parses "foo = 1; ->foo.foo!" - parses "foo(z: 0, a: n + 2)" parses "foo(z: 0, a: n + 2)" - parses "foo { |(_, c, )| c }" parses "foo { |(_, c, )| c }" - parses "pointerof : Int32" parses "pointerof : Int32" - says syntax error on "1 unless return" says syntax error on "1 unless return" - parses "def foo(next foo); end" parses "def foo(next foo); end" - parses "foo(a: n << 2)" parses "foo(a: n << 2)" - parses "lib LibC\nfun getchar\nend" parses "lib LibC\nfun getchar\nend" - parses "foo(n === 2)" parses "foo(n === 2)" - says syntax error on "nil foo" says syntax error on "nil foo" - parses "foo.% do end" parses "foo.% do end" - parses "foo x do\nend" parses "foo x do\nend" - parses "lib LibC; struct Foo; x, y, z : Int; end end" parses "lib LibC; struct Foo; x, y, z : Int; end end" - parses "->Foo.**(Int32)" parses "->Foo.**(Int32)" - sets correct location of instance variable in proc pointer sets correct location of instance variable in proc pointer - parses "until true; 1; end;" parses "until true; 1; end;" - says syntax error on "foo { |sizeof| }" says syntax error on "foo { |sizeof| }" - parses "def foo(x @module); end" parses "def foo(x @module); end" - parses "a = 1; a <<= 1" parses "a = 1; a <<= 1" - parses "def ^; end;" parses "def ^; end;" - parses "_ = 1" parses "_ = 1" - parses "f.x -= 2" parses "f.x -= 2" - parses "foo.[]= 1, 2" parses "foo.[]= 1, 2" - parses "puts __FILE__" parses "puts __FILE__" - parses "Foo(T?)" parses "Foo(T?)" - parses "*a = 1, 2" parses "*a = 1, 2" - parses "Foo(\"foo bar\": U)" parses "Foo(\"foo bar\": U)" - parses "foo.| 1, 2" parses "foo.| 1, 2" - parses "def foo(@@case); end" parses "def foo(@@case); end" - parses "%r(foo(bar))" parses "%r(foo(bar))" - parses "->Foo.foo!" parses "->Foo.foo!" - parses "*a.foo, a.bar = 1" parses "*a.foo, a.bar = 1" - parses "return 1" parses "return 1" - parses "foo \"foo bar\": 1, \"baz\": 2" parses "foo \"foo bar\": 1, \"baz\": 2" - parses "def foo(x @@unless); end" parses "def foo(x @@unless); end" - parses "self / number" parses "self / number" - says syntax error on "def foo(yield); end" says syntax error on "def foo(yield); end" - parses ":>=" parses ":>=" - parses "(baz; bar do\nend)" parses "(baz; bar do\nend)" - parses "def foo(@struct); end" parses "def foo(@struct); end" - says syntax error on "foo[return]" says syntax error on "foo[return]" - parses "def foo(@@include); end" parses "def foo(@@include); end" - parses "\"\"" parses "\"\"" - parses "macro foo\n'\\\\'\nend" parses "macro foo\n'\\\\'\nend" - parses "foo { |a, b, | 1 }" parses "foo { |a, b, | 1 }" - parses "def foo(@asm); end" parses "def foo(@asm); end" - parses "->Foo.foo?" parses "->Foo.foo?" - parses "{A::B => 1, C::D => 2}" parses "{A::B => 1, C::D => 2}" - parses "-1.0_f32" parses "-1.0_f32" - parses "foo(0, n // 2)" parses "foo(0, n // 2)" - parses "foo.!~ 1, 2" parses "foo.!~ 1, 2" - parses "def foo(a, & : Int -> Double); end" parses "def foo(a, & : Int -> Double); end" - parses "->Foo.>(Int32)" parses "->Foo.>(Int32)" - parses "foo%r" parses "foo%r" - parses "->::foo" parses "->::foo" - says syntax error on "foo { |lib| }" says syntax error on "foo { |lib| }" - says syntax error on "*a" says syntax error on "*a" - parses "property module : Int32" parses "property module : Int32" - parses "return 1.bar do\nend" parses "return 1.bar do\nend" - parses "->Foo.%(Int32)" parses "->Foo.%(Int32)" - parses "if foo.responds_to? :foo\nx = 1\nend" parses "if foo.responds_to? :foo\nx = 1\nend" - says syntax error on "break === 1" says syntax error on "break === 1" - says syntax error on "return do\nend" says syntax error on "return do\nend" - parses "property fun : Int32" parses "property fun : Int32" - parses "def self./(); end;" parses "def self./(); end;" - parses "foo(0, n <= 2)" parses "foo(0, n <= 2)" - parses "<<-HERE\nHello, mom! I am HERE.\nHER dress is beautiful.\nHE is OK.\n HERESY\nHERE" parses "<<-HERE\nHello, mom! I am HERE.\nHER dress is beautiful.\nHE is OK.\n HERESY\nHERE" - parses "foo &.block" parses "foo &.block" - parses "case : Int32" parses "case : Int32" - parses "foo(out x); x" parses "foo(out x); x" - parses "foo(a: n % 2)" parses "foo(a: n % 2)" - says syntax error on "def foo\nextend\nend" says syntax error on "def foo\nextend\nend" - parses "def foo(@@lib); end" parses "def foo(@@lib); end" - parses "def *(); end;" parses "def *(); end;" - says syntax error on "next &** 1" says syntax error on "next &** 1" - parses "{% begin %}%q( %s ){% end %}" parses "{% begin %}%q( %s ){% end %}" - parses "def self.+(); end;" parses "def self.+(); end;" - parses "foo(z: 0, a: n !~ 2)" parses "foo(z: 0, a: n !~ 2)" - says syntax error on "def foo(macro); end" says syntax error on "def foo(macro); end" - says syntax error on "<<-HERE\n One\n wrong\n Zero\n HERE" says syntax error on "<<-HERE\n One\n wrong\n Zero\n HERE" - parses "puts __DIR__" parses "puts __DIR__" - says syntax error on "macro foo(x : Int32); end" says syntax error on "macro foo(x : Int32); end" - parses "class Foo; end" parses "class Foo; end" - parses "foo(/ /, / /)" parses "foo(/ /, / /)" - says syntax error on "def foo=(&block); end" says syntax error on "def foo=(&block); end" - parses "Foo({\"foo\": X, \"bar\": Y})" parses "Foo({\"foo\": X, \"bar\": Y})" - parses "def foo(var : self?); end" parses "def foo(var : self?); end" - says syntax error on "def foo(typeof); end" says syntax error on "def foo(typeof); end" - parses "(1 ... )" parses "(1 ... )" - parses "&- 1" parses "&- 1" - parses "x([] of Foo, Bar.new)" parses "x([] of Foo, Bar.new)" - parses "Foo({->})" parses "Foo({->})" - says syntax error on "1 until 3" says syntax error on "1 until 3" - parses "foo.|(1, 2)" parses "foo.|(1, 2)" - parses "def foo(x @sizeof); end" parses "def foo(x @sizeof); end" - parses "a = 1; a *=\n1" parses "a = 1; a *=\n1" - parses "foo" parses "foo" - parses "case 1\nelse\n2\nend" parses "case 1\nelse\n2\nend" - parses "foo(a: 1, b: 2)" parses "foo(a: 1, b: 2)" - parses "def foo(sizeof foo); end" parses "def foo(sizeof foo); end" - says syntax error on "->(x : Int32, x : Int32) {}" says syntax error on "->(x : Int32, x : Int32) {}" - says syntax error on "break % 1" says syntax error on "break % 1" - parses "begin; 1; rescue Foo; 2; end" parses "begin; 1; rescue Foo; 2; end" - parses "@@a, b = 1, 2" parses "@@a, b = 1, 2" - parses "def foo(); 1; rescue; 2; end" parses "def foo(); 1; rescue; 2; end" - parses "1 \\\r\n + 2" parses "1 \\\r\n + 2" - parses "foo(&.is_a?(T))" parses "foo(&.is_a?(T))" - parses "macro x\n%{}\nend" parses "macro x\n%{}\nend" - parses "foo./(1, 2)" parses "foo./(1, 2)" - parses "~ 1" parses "~ 1" - parses "foo(0, n / 2)" parses "foo(0, n / 2)" - parses "def foo(@@protected); end" parses "def foo(@@protected); end" - parses "foo = 1; ->foo.bar(Int32)" parses "foo = 1; ->foo.bar(Int32)" - parses "def foo(@@break); end" parses "def foo(@@break); end" - parses "def [](x); end" parses "def [](x); end" - parses "foo %r" parses "foo %r" - parses "->() { }" parses "->() { }" - parses "a : Foo" parses "a : Foo" - parses "require \"foo\"" parses "require \"foo\"" - says syntax error on "x++" says syntax error on "x++" - parses "def foo(x) : Int32\n1\nend" parses "def foo(x) : Int32\n1\nend" - parses "lib LibC; fun foo : Int*; end" parses "lib LibC; fun foo : Int*; end" - parses "<<-SOME\n Sa\n Se\n SOME" parses "<<-SOME\n Sa\n Se\n SOME" - parses "case / /\nwhen / /\n/ /\nelse\n/ /\nend" parses "case / /\nwhen / /\n/ /\nelse\n/ /\nend" - parses "property unless : Int32" parses "property unless : Int32" - parses "property yield : Int32" parses "property yield : Int32" - parses "->@foo.foo!" parses "->@foo.foo!" - says syntax error on "Hash{\"foo\": 1}" says syntax error on "Hash{\"foo\": 1}" - parses "->@foo.foo?" parses "->@foo.foo?" - parses "def foo(x); end; x" parses "def foo(x); end; x" - parses "a = /=/" parses "a = /=/" - says syntax error on "def foo(foo select); end" says syntax error on "def foo(foo select); end" - says syntax error on "foo { |protected| }" says syntax error on "foo { |protected| }" - parses "<<-HERE\n \#{1} \#{2}\n HERE" parses "<<-HERE\n \#{1} \#{2}\n HERE" - parses "(1)\nif true; end" parses "(1)\nif true; end" - parses "def foo(x @class); end" parses "def foo(x @class); end" - says syntax error on "FOO, BAR = 1, 2" says syntax error on "FOO, BAR = 1, 2" - parses "def foo(\nvar); end" parses "def foo(\nvar); end" - parses "def foo(x @@break); end" parses "def foo(x @@break); end" - parses "-@@foo" parses "-@@foo" - parses "foo(..2)" parses "foo(..2)" - says syntax error on "offsetof(X, 1.0)" says syntax error on "offsetof(X, 1.0)" - parses "enum Foo; private def foo; 1; end; end" parses "enum Foo; private def foo; 1; end; end" - parses "def <=; end;" parses "def <=; end;" - parses "x = 2; foo do bar x end" parses "x = 2; foo do bar x end" - parses "{/ /, / /}" parses "{/ /, / /}" - parses "a : Foo | Int32" parses "a : Foo | Int32" - parses "foo\n.bar" parses "foo\n.bar" - says syntax error on "break >> 1" says syntax error on "break >> 1" - parses "def foo(x @@abstract); end" parses "def foo(x @@abstract); end" - parses "end : Int32" parses "end : Int32" - parses "a.b() /3" parses "a.b() /3" - says syntax error on "def foo(x : U) forall; end" says syntax error on "def foo(x : U) forall; end" - parses "def foo(@case); end" parses "def foo(@case); end" - says syntax error on "macro foo(*x, *y); end" says syntax error on "macro foo(*x, *y); end" - parses "->Foo.//(Int32)" parses "->Foo.//(Int32)" - parses "foo(a: n === 2)" parses "foo(a: n === 2)" - parses "def foo; yield; end" parses "def foo; yield; end" - parses "def foo(@@out); end" parses "def foo(@@out); end" - parses ":!" parses ":!" - parses "Foo({X: X, Y: Y})" parses "Foo({X: X, Y: Y})" - says syntax error on "foo { |(break)| }" says syntax error on "foo { |(break)| }" - parses "case 1\nwhen 1\n2\nelse\n3\nend" parses "case 1\nwhen 1\n2\nelse\n3\nend" - parses "def foo(x @true); end" parses "def foo(x @true); end" - says syntax error on "self = 1" says syntax error on "self = 1" - parses "break;" parses "break;" - says syntax error on "foo { |a b| }" says syntax error on "foo { |a b| }" - parses "foo { |(_, c)| c }" parses "foo { |(_, c)| c }" - parses "def foo(var : Int32 = 1); end" parses "def foo(var : Int32 = 1); end" - says syntax error on "A = foo { B = 1 }" says syntax error on "A = foo { B = 1 }" - parses "(bar do\nend)" parses "(bar do\nend)" - says syntax error on "1 .. return" says syntax error on "1 .. return" - parses "puts __LINE__" parses "puts __LINE__" - parses "foo./ do end" parses "foo./ do end" - parses "x[0] ? 1 : 0" parses "x[0] ? 1 : 0" - parses "macro foo;bar(end: 1);end" parses "macro foo;bar(end: 1);end" - parses "foo !false" parses "foo !false" - parses "call foo : A, end : B" parses "call foo : A, end : B" - says syntax error on "foo(**bar, 1)" says syntax error on "foo(**bar, 1)" - parses "foo.bar do end" parses "foo.bar do end" - parses "foo.* 1, 2" parses "foo.* 1, 2" - parses "foo(0, n !~ 2)" parses "foo(0, n !~ 2)" - parses "a.foo(&block)" parses "a.foo(&block)" - parses "a = 1; yield a ensure a" parses "a = 1; yield a ensure a" - parses "def foo; end; if false; 1; else; 2; end" parses "def foo; end; if false; 1; else; 2; end" - parses "{% begin %}%w[ %s ]{% end %}" parses "{% begin %}%w[ %s ]{% end %}" - parses "macro foo(x)\n 1 + 2; end" parses "macro foo(x)\n 1 + 2; end" - parses "foo %x()" parses "foo %x()" - parses "case 1\nwhen .as?(T)\n2\nend" parses "case 1\nwhen .as?(T)\n2\nend" - says syntax error on "def self.as?; end" says syntax error on "def self.as?; end" - parses "(1 .. )" parses "(1 .. )" - parses "a : Foo[12]" parses "a : Foo[12]" - says syntax error on "{\n}" says syntax error on "{\n}" - parses "foo(z: 0, a: n == 2)" parses "foo(z: 0, a: n == 2)" - parses "1.~" parses "1.~" - parses "def foo(alias foo); end" parses "def foo(alias foo); end" - parses "def foo(x, **args)\n1\nend" parses "def foo(x, **args)\n1\nend" - parses "case a\nwhen b\n1 / 2\nelse\n1 / 2\nend" parses "case a\nwhen b\n1 / 2\nelse\n1 / 2\nend" - parses "2 * 3 + 4 * 5" parses "2 * 3 + 4 * 5" - parses "def foo(x @asm); end" parses "def foo(x @asm); end" - sets correct location of parameter in proc literal sets correct location of parameter in proc literal - parses "def foo(include foo); end" parses "def foo(include foo); end" - parses "f.x **= 2" parses "f.x **= 2" - parses "{\"foo\": 1}" parses "{\"foo\": 1}" - says syntax error on "<<-'HERE\n" says syntax error on "<<-'HERE\n" - parses "foo = 1; ->foo.!~(Int32)" parses "foo = 1; ->foo.!~(Int32)" - says syntax error on "foo { |offsetof| }" says syntax error on "foo { |offsetof| }" - says syntax error on "A = B = 1" says syntax error on "A = B = 1" - parses "class Foo; end\nwhile true; end" parses "class Foo; end\nwhile true; end" - says syntax error on "case break; when 1; end; end" says syntax error on "case break; when 1; end; end" - says syntax error on "def foo\nlib\nend" says syntax error on "def foo\nlib\nend" - says syntax error on "1 .. break" says syntax error on "1 .. break" - parses "def foo(@fun); end" parses "def foo(@fun); end" - parses "foo(1 + 2)" parses "foo(1 + 2)" - parses "begin; 1; rescue Foo | Bar; 2; end" parses "begin; 1; rescue Foo | Bar; 2; end" - parses "a == / /" parses "a == / /" - parses "def foo(x @yield); end" parses "def foo(x @yield); end" - parses "case {1}\nin {false}; 2; end" parses "case {1}\nin {false}; 2; end" - parses "foo.[]=" parses "foo.[]=" - says syntax error on "foo { |(class)| }" says syntax error on "foo { |(class)| }" - parses "foo.^" parses "foo.^" - parses ":foo!" parses ":foo!" - parses "a = 1; a &*= 1" parses "a = 1; a &*= 1" - says syntax error on "{a[0]: 1}" says syntax error on "{a[0]: 1}" - parses "foo.[]= do end" parses "foo.[]= do end" - parses "macro foo(\na = 0\n)\nend" parses "macro foo(\na = 0\n)\nend" - parses "{% begin %}%w( %s ){% end %}" parses "{% begin %}%w( %s ){% end %}" - parses "def foo(x @@select); end" parses "def foo(x @@select); end" - parses "foo = 1; ->foo.foo" parses "foo = 1; ->foo.foo" - parses "def foo(n); foo(n -1); end" parses "def foo(n); foo(n -1); end" - parses "->Foo.>=(Int32)" parses "->Foo.>=(Int32)" - parses "enum Foo; protected def foo; 1; end; end" parses "enum Foo; protected def foo; 1; end; end" - parses "1 - 2" parses "1 - 2" - says syntax error on "yield break" says syntax error on "yield break" - says syntax error on "Foo(T U)" says syntax error on "Foo(T U)" - parses "def type(type); end" parses "def type(type); end" - parses "def self.==(); end;" parses "def self.==(); end;" - parses "foo %q" parses "foo %q" - parses "foo(a: n ^ 2)" parses "foo(a: n ^ 2)" - parses "def foo(x @@var); end" parses "def foo(x @@var); end" - parses "`foo`" parses "`foo`" - parses "{% begin %}%r[\\A]{% end %}" parses "{% begin %}%r[\\A]{% end %}" - parses "def foo(x @@struct); end" parses "def foo(x @@struct); end" - parses "macro foo(**args)\n1\nend" parses "macro foo(**args)\n1\nend" - parses "def >=; end;" parses "def >=; end;" - parses "->Foo.+(Int32)" parses "->Foo.+(Int32)" - says syntax error on "1 as Bar" says syntax error on "1 as Bar" - says syntax error on "foo { |with| }" says syntax error on "foo { |with| }" - parses "alias Foo::Bar = Baz" parses "alias Foo::Bar = Baz" - parses "if (\ntrue\n)\n1\nend" parses "if (\ntrue\n)\n1\nend" - says syntax error on "def foo(foo next); end" says syntax error on "def foo(foo next); end" - says syntax error on "b! = 1" says syntax error on "b! = 1" - parses "property until : Int32" parses "property until : Int32" - parses "def foo(x @def); end" parses "def foo(x @def); end" - parses "foo.bar(1, 2)" parses "foo.bar(1, 2)" - parses "def foo(@@abstract); end" parses "def foo(@@abstract); end" - parses "Foo(X: U, Y: V)" parses "Foo(X: U, Y: V)" - parses "foo(a: n &** 2)" parses "foo(a: n &** 2)" - parses "offsetof(X, @a)" parses "offsetof(X, @a)" - parses "def foo(a, b = a); end" parses "def foo(a, b = a); end" - parses "def foo(x @@pointerof); end" parses "def foo(x @@pointerof); end" - parses ":<" parses ":<" - says syntax error on "unless next; end" says syntax error on "unless next; end" - says syntax error on "fun foo\nclass" says syntax error on "fun foo\nclass" - parses "def foo(x = __FILE__); end" parses "def foo(x = __FILE__); end" - parses "[1, 2] of Int" parses "[1, 2] of Int" - parses "->Foo.&**(Int32)" parses "->Foo.&**(Int32)" - parses "foo[*baz] = 1" parses "foo[*baz] = 1" - parses "foo(a: n == 2)" parses "foo(a: n == 2)" - parses "asm(\"nop\" : \"a\"(0) : \"b\"(1), \"c\"(2))" parses "asm(\"nop\" : \"a\"(0) : \"b\"(1), \"c\"(2))" - says syntax error on "foo { |in| }" says syntax error on "foo { |in| }" - parses "macro foo\neenum\nend" parses "macro foo\neenum\nend" - says syntax error on "next <= 1" says syntax error on "next <= 1" - parses "foo ..2" parses "foo ..2" - parses "/fo\#{1}o/" parses "/fo\#{1}o/" - parses "foo &.block(1)" parses "foo &.block(1)" - parses "+1.0" parses "+1.0" - parses "def ~(); end;" parses "def ~(); end;" - parses "property macro : Int32" parses "property macro : Int32" - parses "macro foo;bar{% if x %}body{% elsif y %}body2{% else %}body3{%end%}baz;end" parses "macro foo;bar{% if x %}body{% elsif y %}body2{% else %}body3{%end%}baz;end" - parses "a = 1; a |=\n1" parses "a = 1; a |=\n1" - parses "1.as?(\n Int32\n)" parses "1.as?(\n Int32\n)" - parses "Foo()?" parses "Foo()?" - says syntax error on "->::@@foo.foo" says syntax error on "->::@@foo.foo" - parses "foo = 1; ->foo.&*(Int32)" parses "foo = 1; ->foo.&*(Int32)" - parses "def foo(@[Foo] var : Int32); end" parses "def foo(@[Foo] var : Int32); end" - parses "foo.!=(1, 2)" parses "foo.!=(1, 2)" - says syntax error on "foo { |case| }" says syntax error on "foo { |case| }" - parses "select\nwhen foo\n2\nend" parses "select\nwhen foo\n2\nend" - parses "return {1 => 2}" parses "return {1 => 2}" - parses "Foo(T, 1, U)" parses "Foo(T, 1, U)" -.validate_name - invalid character invalid character - underscores underscores - uppercase uppercase - dashes dashes - empty empty - length length - digits digits -Code gen: cast - casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int - casts to bigger union casts to bigger union - casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union - casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError - casts to module casts to module casts to module casts to module casts to module casts to module casts to module casts to module casts to module casts to module - sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment - casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError - allows casting nilable type to Void* (2) allows casting nilable type to Void* (2) - casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError - upcasts type to virtual (#3304) upcasts type to virtual (#3304) - upcasts from non-generic to generic upcasts from non-generic to generic - casts between union types, where union has a tuple type (#3377) casts between union types, where union has a tuple type (#3377) - can cast to metaclass (#11121) can cast to metaclass (#11121) - allows casting nil to Void* allows casting nil to Void* - casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil - casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) - allows casting nilable type to Void* (3) allows casting nilable type to Void* (3) - upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment - casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError - doesn't corrupt stack when downcasting union to union with different alignment (#14285) doesn't corrupt stack when downcasting union to union with different alignment (#14285) - casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type - can cast from Void* to virtual type (#3014) can cast from Void* to virtual type (#3014) - casts with block var that changes type (#3341) casts with block var that changes type (#3341) - codegens class method when type id is available but not a virtual type (#3490) codegens class method when type id is available but not a virtual type (#3490) - casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer - casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) - allows casting nilable type to Void* (1) allows casting nilable type to Void* (1) - downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment - upcasts type to virtual (2) (#3304) upcasts type to virtual (2) (#3304) - casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type - casts to base class making it virtual casts to base class making it virtual - cast virtual metaclass type to nilable virtual instance type (#12628) cast virtual metaclass type to nilable virtual instance type (#12628) - allows casting object to pointer and back allows casting object to pointer and back -Crystal::Repl::Interpreter - constants - interprets self inside constant inside class interprets self inside constant inside class - hoists constants hoists constants - interprets constant literal interprets constant literal - returns nil in the assignment returns nil in the assignment - interprets complex constant interprets complex constant - magic constants - does line number does line number -Crystal::Repl::Interpreter - command expansion - expands ldflags expands ldflags - variadic calls - promotes int promotes int - promotes float promotes float - promotes enum promotes enum -expand - expands macro expression inside private struct expands macro expression inside private struct - expands macro expression {{ ... }} with cursor inside it expands macro expression {{ ... }} with cursor inside it - expands macro expression {{ ... }} expands macro expression {{ ... }} - expands macro expression {% ... %} with cursor at end of it expands macro expression {% ... %} with cursor at end of it - expands macro control {% for %} expands macro control {% for %} - expands macro of module expands macro of module - expands macro expression inside def of nested module expands macro expression inside def of nested module - expands macro expression {% ... %} expands macro expression {% ... %} - doesn't expand normal call doesn't expand normal call - expands macro expression inside private module expands macro expression inside private module - doesn't expand macro expression doesn't expand macro expression - expands macro expression inside enum expands macro expression inside enum - expands simple macro expands simple macro - expands macro expression inside struct expands macro expression inside struct - expands macro control {% if %} with cursor inside it expands macro control {% if %} with cursor inside it - expands macro expression inside C union expands macro expression inside C union - expands macro expression inside C union of private lib expands macro expression inside C union of private lib - expands macro expression inside module expands macro expression inside module - expands macros with 2 level expands macros with 2 level - expands macro of module with cursor at dot expands macro of module with cursor at dot - expands macro with doc expands macro with doc - expands macro expression inside C struct of private lib expands macro expression inside C struct of private lib - expands macro expression inside def of private class expands macro expression inside def of private class - expands complex macro expands complex macro - expands macro expression inside private enum expands macro expression inside private enum - expands macro control {% for %} with cursor at end of it expands macro control {% for %} with cursor at end of it - doesn't expand macro expression doesn't expand macro expression - expands macro expression inside def of nested private module expands macro expression inside def of nested private module - expands macro expression inside def of private struct expands macro expression inside def of private struct - expands macro expression inside private def expands macro expression inside private def - expands macro control {% for %} with cursor inside it expands macro control {% for %} with cursor inside it - expands macro expression inside class expands macro expression inside class - expands macro control {% if %} with cursor at end of it expands macro control {% if %} with cursor at end of it - expands macro expression inside private class expands macro expression inside private class - expands macro expression {{ ... }} with cursor end of it expands macro expression {{ ... }} with cursor end of it - expands macro of module with cursor at module name expands macro of module with cursor at module name - expands simple macro with cursor inside it expands simple macro with cursor inside it - expands macro expression inside def expands macro expression inside def - expands macro expression inside private lib expands macro expression inside private lib - expands macro of module inside module expands macro of module inside module - expands macro expression inside fun expands macro expression inside fun - expands macro expression inside def of module expands macro expression inside def of module - expands macro expression inside def of private module expands macro expression inside def of private module - expands macro control {% if %} with indent expands macro control {% if %} with indent - doesn't expand macro expression with cursor out of end doesn't expand macro expression with cursor out of end - expands macro control {% if %} expands macro control {% if %} - expands macro expression inside lib expands macro expression inside lib - expands macros with 3 level expands macros with 3 level - expands macro expression inside C struct expands macro expression inside C struct - expands simple macro with cursor at end of it expands simple macro with cursor at end of it - expands macro expression inside def of private enum expands macro expression inside def of private enum - expands macro control {% for %} with indent expands macro control {% for %} with indent - expands macro expression inside def of private module expands macro expression inside def of private module -Semantic: initialize - errors if found matches for initialize but doesn't cover all (bug #204) errors if found matches for initialize but doesn't cover all (bug #204) - doesn't mark instance variable as nilable when using self.class in method doesn't mark instance variable as nilable when using self.class in method - types instance var as nilable if not always assigned types instance var as nilable if not always assigned - marks instance variable as nilable in initialize if assigning self marks instance variable as nilable in initialize if assigning self - doesn't type instance var as nilable if assigned before method call doesn't type instance var as nilable if assigned before method call - types instance var as nilable if used after method call that reads var (2) types instance var as nilable if used after method call that reads var (2) - doesn't type instance var as nilable if not used in method call doesn't type instance var as nilable if not used in method call - types instance vars as nilable if doesn't invoke super in initialize types instance vars as nilable if doesn't invoke super in initialize - types instance vars as nilable if doesn't invoke super in initialize with deep subclass types instance vars as nilable if doesn't invoke super in initialize with deep subclass - doesn't type instance var as nilable if used after global method call doesn't type instance var as nilable if used after global method call - doesn't type ivar as nilable if super call present and parent has already typed ivar (#4764) doesn't type ivar as nilable if super call present and parent has already typed ivar (#4764) - doesn't mark instance variable as nilable when using self.class doesn't mark instance variable as nilable when using self.class - errors on default new when using named arguments (#2245) errors on default new when using named arguments (#2245) - checks instance vars of included modules checks instance vars of included modules - doesn't type instance var as nilable if used after method call that assigns var doesn't type instance var as nilable if used after method call that assigns var - doesn't type instance var as nilable if out doesn't type instance var as nilable if out - types instance var as not-nilable if assigned in block but previously assigned types instance var as not-nilable if assigned in block but previously assigned - finishes when analyzing recursive calls finishes when analyzing recursive calls - marks instance variable as nilable in initialize if using self marks instance variable as nilable in initialize if using self - types instance vars as nilable if doesn't invoke super with default arguments types instance vars as nilable if doesn't invoke super with default arguments - doesn't type ivar having initializer as nilable even if it is used before assigned inside initialize (#5112) doesn't type ivar having initializer as nilable even if it is used before assigned inside initialize (#5112) - types instance var as nilable if used in first of two method calls types instance var as nilable if used in first of two method calls - types instance var as nilable if assigned in block types instance var as nilable if assigned in block - marks instance variable as nilable in initialize if using self in method marks instance variable as nilable in initialize if using self in method - types initializer of generic type after instantiated types initializer of generic type after instantiated - types instance var as non-nilable if calls super and super defines it, with one level of indirection types instance var as non-nilable if calls super and super defines it, with one level of indirection - types initializer of recursive generic type types initializer of recursive generic type - doesn't type instance var as nilable if used after method call that doesn't read var doesn't type instance var as nilable if used after method call that doesn't read var - doesn't type instance var as nilable if used after method call inside typeof doesn't type instance var as nilable if used after method call inside typeof - types instance var as non-nilable if calls super and super defines it types instance var as non-nilable if calls super and super defines it - marks instance variable as nilable when using self in super marks instance variable as nilable when using self in super - types instance var as nilable if used after method call that reads var through other calls types instance var as nilable if used after method call that reads var through other calls - types instance var as nilable if used before assignment types instance var as nilable if used before assignment - types instance var as nilable if used after method call that reads var types instance var as nilable if used after method call that reads var -Semantic: alias - overloads union type through alias overloads union type through alias - uses constant in alias with math (#3259) uses constant in alias with math (#3259) - errors if trying to use typeof in alias errors if trying to use typeof in alias - reopens struct through alias reopens struct through alias - errors if alias already defined errors if alias already defined - allows using alias type as generic type allows using alias type as generic type - reopens module through alias reopens module through alias - inherits class through alias inherits class through alias - allows defining recursive aliases allows defining recursive aliases - can use .class in alias (#2835) can use .class in alias (#2835) - uses constant in alias (#3259) uses constant in alias (#3259) - doesn't find type parameter in alias (#3502) doesn't find type parameter in alias (#3502) - allows recursive array with alias allows recursive array with alias - can pass recursive alias to proc can pass recursive alias to proc - works with alias type as restriction works with alias type as restriction - resolves type through alias (#563) resolves type through alias (#563) - doesn't crash by infinite recursion against type alias and generics (#5329) doesn't crash by infinite recursion against type alias and generics (#5329) - includes module through alias includes module through alias - errors if trying to resolve type of recursive alias errors if trying to resolve type of recursive alias - errors if defining infinite recursive alias errors if defining infinite recursive alias - allows using generic type of recursive alias as restriction (#488) allows using generic type of recursive alias as restriction (#488) - reopens class through alias reopens class through alias - resolves alias type resolves alias type - allows defining recursive fun aliases allows defining recursive fun aliases - inherits struct through alias inherits struct through alias - declares alias inside type declares alias inside type - errors if alias is already defined as another type errors if alias is already defined as another type - errors if defining infinite recursive alias in union errors if defining infinite recursive alias in union - errors if declares alias inside if errors if declares alias inside if - looks up alias for macro resolution (#3548) looks up alias for macro resolution (#3548) - finds type through alias (#4645) finds type through alias (#4645) -Normalize: multi assign - normalizes n to splat on left-hand side normalizes n to splat on left-hand side - normalizes 1 to n, with *_ on left-hand side (1) normalizes 1 to n, with *_ on left-hand side (1) - normalizes n to n normalizes n to n - strict_multi_assign - normalizes 1 to n with [] normalizes 1 to n with [] - normalizes 1 to n normalizes 1 to n - normalizes 1 to n with call normalizes 1 to n with call - normalizes m to n, with *_ on left-hand side (2) normalizes m to n, with *_ on left-hand side (2) - normalizes 1 to n, with splat on left-hand side normalizes 1 to n, with splat on left-hand side - normalizes n to *_ on left-hand side normalizes n to *_ on left-hand side - normalizes m to n, with *_ on left-hand side (1) normalizes m to n, with *_ on left-hand side (1) - normalizes 1 to *_ on left-hand side normalizes 1 to *_ on left-hand side - normalizes 1 to n, with splat on left-hand side, splat before other targets normalizes 1 to n, with splat on left-hand side, splat before other targets - normalizes n to n with [] normalizes n to n with [] - without strict_multi_assign - normalizes 1 to n with call normalizes 1 to n with call - normalizes 1 to n with [] normalizes 1 to n with [] - normalizes 1 to n normalizes 1 to n - normalizes m to n, with *_ on left-hand side (3) normalizes m to n, with *_ on left-hand side (3) - normalizes 1 to n, with splat on left-hand side, splat after other targets normalizes 1 to n, with splat on left-hand side, splat after other targets - normalizes m to n, with splat on left-hand side, splat is non-empty normalizes m to n, with splat on left-hand side, splat is non-empty - normalizes n to n with call normalizes n to n with call - normalizes m to n, with splat on left-hand side, splat is empty normalizes m to n, with splat on left-hand side, splat is empty - normalizes 1 to splat on left-hand side normalizes 1 to splat on left-hand side - normalizes 1 to n, with *_ on left-hand side (2) normalizes 1 to n, with *_ on left-hand side (2) - normalizes 1 to n, with *_ on left-hand side (3) normalizes 1 to n, with *_ on left-hand side (3) -Crystal::Repl::Interpreter - integration - does CSV does CSV - does some Hash methods does some Hash methods - does Range#to_a, Array#to_s does Range#to_a, Array#to_s - does JSON::Serializable does JSON::Serializable - does caller does caller - does YAML does YAML - does IO.pipe (checks that StaticArray is passed correctly to C calls) does IO.pipe (checks that StaticArray is passed correctly to C calls) - does Int32#to_s does Int32#to_s - does Float64#to_s (simple) does Float64#to_s (simple) - does String#includes? does String#includes? - does XML does XML - does Float64#to_s (complex) does Float64#to_s (complex) - does YAML::Serializable does YAML::Serializable - does JSON does JSON -Semantic: super - types super with named arguments, def has bare splat parameter (#8895) types super with named arguments, def has bare splat parameter (#8895) - types super with forwarded arguments, def has bare splat parameter (#8895) types super with forwarded arguments, def has bare splat parameter (#8895) - types super with forwarded arguments, def has double splat parameter (#8895) types super with forwarded arguments, def has double splat parameter (#8895) - finds super initialize if not explicitly defined in superclass, 2 (#273) finds super initialize if not explicitly defined in superclass, 2 (#273) - calls super in module method (2) (#556) calls super in module method (2) (#556) - types super when container method is defined in parent class two levels up types super when container method is defined in parent class two levels up - types super when container method is defined in parent class types super when container method is defined in parent class - types super when inside fun and forwards args types super when inside fun and forwards args - gives correct error when calling super and target is abstract method (#2675) gives correct error when calling super and target is abstract method (#2675) - errors no superclass method errors no superclass method - errors on super outside method (#4481) errors on super outside method (#4481) - errors no superclass method in top-level errors no superclass method in top-level - types super with named arguments, def has bare splat parameter (2) (#8895) types super with named arguments, def has bare splat parameter (2) (#8895) - invokes super inside macro (#6636) invokes super inside macro (#6636) - types super without arguments and instance variable types super without arguments and instance variable - calls super in module method (1) (#556) calls super in module method (1) (#556) - types super with forwarded arguments, different internal names (#8895) types super with forwarded arguments, different internal names (#8895) - errors on super where only target would be a top level method (#5201) errors on super where only target would be a top level method (#5201) - calls super in generic module method calls super in generic module method - errors no superclass method in top-level def errors no superclass method in top-level def - errors if calling super on module method and not found errors if calling super on module method and not found - calls super in module method (3) (#556) calls super in module method (3) (#556) - types super without arguments types super without arguments - doesn't error if invoking super and match isn't found in direct superclass (even though it's find in one superclass) doesn't error if invoking super and match isn't found in direct superclass (even though it's find in one superclass) - says correct error message when no overload matches in super call (#272) says correct error message when no overload matches in super call (#272) - finds super initialize if not explicitly defined in superclass, 1 (#273) finds super initialize if not explicitly defined in superclass, 1 (#273) - errors if invoking super and match isn't found in direct superclass in initialize (even though it's find in one superclass) errors if invoking super and match isn't found in direct superclass in initialize (even though it's find in one superclass) - types super with forwarded arguments, parent has parameters types super with forwarded arguments, parent has parameters - types super when inside fun types super when inside fun -Semantic: macro - uses bare *, doesn't let more args uses bare *, doesn't let more args - gives precise location info when doing yield inside macro gives precise location info when doing yield inside macro - allows named args after splat allows named args after splat - errors if requires inside class through macro expansion errors if requires inside class through macro expansion - declares variable for macro with out declares variable for macro with out - errors if declares macro inside if errors if declares macro inside if - solves macro expression arguments before macro expansion (constant) solves macro expression arguments before macro expansion (constant) - can't define new variables (#466) can't define new variables (#466) - solves named macro expression arguments before macro expansion (constant) (#2423) solves named macro expression arguments before macro expansion (constant) (#2423) - does macro verbatim outside macro does macro verbatim outside macro - allows specifying self as macro def return type (2) allows specifying self as macro def return type (2) - cannot lookup type defined in caller class cannot lookup type defined in caller class - expands macro with block and argument to yield expands macro with block and argument to yield - gets named arguments in double splat gets named arguments in double splat - errors when trying to define def inside def with macro expansion errors when trying to define def inside def with macro expansion - expands macro with block expands macro with block - works inside proc literal (#2984) works inside proc literal (#2984) - checks if macro expansion returns (#821) checks if macro expansion returns (#821) - errors if requires inside if through macro expansion errors if requires inside if through macro expansion - applies visibility modifier only to first level applies visibility modifier only to first level - expands macro with break inside while (#1852) expands macro with break inside while (#1852) - doesn't include parameters with default values in missing arguments error doesn't include parameters with default values in missing arguments error - doesn't die on && inside if (bug) doesn't die on && inside if (bug) - finds macro in included module at class level (#4639) finds macro in included module at class level (#4639) - finds metaclass instance of instance method (#4739) finds metaclass instance of instance method (#4739) - finds type for global path shared with free var finds type for global path shared with free var - finds var in proc for macros finds var in proc for macros - finds macro in module in Object finds macro in module in Object - expands multiline macro expression in verbatim (#6643) expands multiline macro expression in verbatim (#6643) - double splat and regular args double splat and regular args - finds macro in included module finds macro in included module - errors if non-existent named arg errors if non-existent named arg - skip_file macro directive - skips file inside an if macro expression skips file inside an if macro expression - skips expanding the rest of the current file skips expanding the rest of the current file - finds macro in included generic module finds macro in included generic module - uses splat and double splat uses splat and double splat - solves macro expression arguments before macro expansion (type) solves macro expression arguments before macro expansion (type) - doesn't error when adding macro call to constant (#2457) doesn't error when adding macro call to constant (#2457) - types macro def that calls another method inside a class types macro def that calls another method inside a class - finds macro and method at the same scope inside included module finds macro and method at the same scope inside included module - preserves correct self in restriction when macro def is to be instantiated in subtypes (#5044) preserves correct self in restriction when macro def is to be instantiated in subtypes (#5044) - types macro def types macro def - finds generic type argument of included module with self finds generic type argument of included module with self - unpacks block parameters inside macros (#13742) unpacks block parameters inside macros (#13742) - errors if named arg already specified errors if named arg already specified - uses uninitialized variable with macros uses uninitialized variable with macros - show macro trace in errors (2) show macro trace in errors (2) - errors if named arg matches single splat parameter errors if named arg matches single splat parameter - errors if macro def type not found errors if macro def type not found - can specify tuple as return type can specify tuple as return type - looks up argument types in macro owner, not in subclass (#2395) looks up argument types in macro owner, not in subclass (#2395) - shows correct error message in macro expansion (#7083) shows correct error message in macro expansion (#7083) - errors if missing one argument errors if missing one argument - executes MultiAssign executes MultiAssign - finds method before macro (#236) finds method before macro (#236) - allows generic return types for macro def allows generic return types for macro def - can return virtual class type in macro def can return virtual class type in macro def - raise - inside method - without node - renders both frames (#7147) renders both frames (#7147) - inside macro - without node - does not contain `expanding macro` does not contain `expanding macro` - renders both frames (#7147) renders both frames (#7147) - supports an empty message (#8631) supports an empty message (#8631) - with node - pointing at the correct node in complex/nested macro (#7147) pointing at the correct node in complex/nested macro (#7147) - renders both frames (#7147) renders both frames (#7147) - contains the message and not `expanding macro` (#5669) contains the message and not `expanding macro` (#5669) - points to caller when missing node location information (#7147) points to caller when missing node location information (#7147) - finds macro through alias (#2706) finds macro through alias (#2706) - can return class type in macro def can return class type in macro def - types macro def that calls another method inside a class types macro def that calls another method inside a class - errors if find macros but missing argument errors if find macros but missing argument - doesn't affect self restrictions outside the macro def being instantiated in subtypes doesn't affect self restrictions outside the macro def being instantiated in subtypes - allows return values that include the return type of the macro def allows return values that include the return type of the macro def - solves named macro expression arguments before macro expansion (type) (#2423) solves named macro expression arguments before macro expansion (type) (#2423) - errors if macro uses undefined variable errors if macro uses undefined variable - finds generic type argument of included module finds generic type argument of included module - can use macro in instance var initializer (just assignment) (#7666) can use macro in instance var initializer (just assignment) (#7666) - types macro def with argument types macro def with argument - evaluates yield expression (#2924) evaluates yield expression (#2924) - finds generic in macro code finds generic in macro code - errors if macro def type doesn't match found errors if macro def type doesn't match found - allows subclasses of return type for macro def allows subclasses of return type for macro def - types macro def that calls another method types macro def that calls another method - has correct location after expanding assignment after instance var has correct location after expanding assignment after instance var - can lookup type parameter when macro is called inside class (#5343) can lookup type parameter when macro is called inside class (#5343) - matches with default value after splat matches with default value after splat - finds macro in inherited generic class finds macro in inherited generic class - can use macro in instance var initializer (#7666) can use macro in instance var initializer (#7666) - show macro trace in errors (1) show macro trace in errors (1) - doesn't crash on syntax error inside macro (regression, #8038) doesn't crash on syntax error inside macro (regression, #8038) - finds macro and method at the same scope finds macro and method at the same scope - errors if named arg matches splat parameter errors if named arg matches splat parameter - executes OpAssign (#9356) executes OpAssign (#9356) - clones default value before expanding clones default value before expanding - allows declaring class with inline macro expression (#1333) allows declaring class with inline macro expression (#1333) - transforms with {{yield}} and call transforms with {{yield}} and call - does macro verbatim inside macro does macro verbatim inside macro - gives correct error when method is invoked but macro exists at the same scope gives correct error when method is invoked but macro exists at the same scope - allows specifying self as macro def return type allows specifying self as macro def return type - finds metaclass instance of instance method (#4639) finds metaclass instance of instance method (#4639) - errors if find macros but wrong arguments errors if find macros but wrong arguments - executes MultiAssign with ArrayLiteral value executes MultiAssign with ArrayLiteral value - uses bare *, doesn't let more args uses bare *, doesn't let more args - allows declaring class with macro if allows declaring class with macro if - can define constant via macro included can define constant via macro included - @caller - returns nil if no stack is available returns nil if no stack is available - provides access to the `Call` information provides access to the `Call` information - returns an array of each call returns an array of each call - errors if missing two arguments errors if missing two arguments - finds free type vars finds free type vars - types macro types macro - says missing argument because positional args don't match past splat says missing argument because positional args don't match past splat - allows union return types for macro def allows union return types for macro def - uses bare * uses bare * - errors if using macro that is defined later errors if using macro that is defined later - allows declaring class with macro for allows declaring class with macro for - can access variable inside macro expansion (#2057) can access variable inside macro expansion (#2057) - declares multi-assign vars for macro declares multi-assign vars for macro - can override macro (#2773) can override macro (#2773) - errors if applying protected modifier to macro errors if applying protected modifier to macro - declares rescue variable inside for macro declares rescue variable inside for macro - finds generic in macro code using free var finds generic in macro code using free var -Crystal::Repl::Interpreter - extern - sets struct field through pointer sets struct field through pointer - does automatic C cast does automatic C cast - sets extern struct proc field sets extern struct proc field - discards primitive struct_or_union_set because it's a copy discards primitive struct_or_union_set because it's a copy - interprets primitive struct_or_union_set and get (struct) interprets primitive struct_or_union_set and get (struct) - discards primitive struct_or_union_set and get (struct) discards primitive struct_or_union_set and get (struct) - interprets primitive struct_or_union_set and get (union) interprets primitive struct_or_union_set and get (union) -Semantic: private - doesn't find private macro defined through macro (#8715) doesn't find private macro defined through macro (#8715) - finds private macro in same file finds private macro in same file - doesn't define incorrect type in top-level namespace (#13511) doesn't define incorrect type in top-level namespace (#13511) - finds private type from inside namespace in subclass finds private type from inside namespace in subclass - doesn't find private thing defined through recursive macro (#8715) doesn't find private thing defined through recursive macro (#8715) - find module private macro inside the module find module private macro inside the module - doesn't find private lib from outside namespace, long name (#8831) doesn't find private lib from outside namespace, long name (#8831) - doesn't define private alias with global type name doesn't define private alias with global type name - doesn't define incorrect type in top-level namespace (#13511) doesn't define incorrect type in top-level namespace (#13511) - gives private constant error in macro gives private constant error in macro - doesn't define private class with global type name doesn't define private class with global type name - can use class var initializer in private type can use class var initializer in private type - finds private def when invoking from inside macro (#2082) finds private def when invoking from inside macro (#2082) - doesn't find private class defined through macro (#8715) doesn't find private class defined through macro (#8715) - doesn't define incorrect type in top-level namespace (#13511) doesn't define incorrect type in top-level namespace (#13511) - can use instance var initializer in private type can use instance var initializer in private type - doesn't find private lib from outside namespace doesn't find private lib from outside namespace - doesn't define private module with global type name doesn't define private module with global type name - doesn't find private macro in another file doesn't find private macro in another file - doesn't find private alias from outside namespace doesn't find private alias from outside namespace - finds private macro in same file, invoking from another macro (#1265) finds private macro in same file, invoking from another macro (#1265) - doesn't find private enum from outside namespace doesn't find private enum from outside namespace - doesn't find private module from outside namespace doesn't find private module from outside namespace - doesn't define incorrect type in top-level namespace (#13511) doesn't define incorrect type in top-level namespace (#13511) - finds private type in same file finds private type in same file - doesn't find private def defined in macro in another file (#7681) doesn't find private def defined in macro in another file (#7681) - doesn't find private enum from outside namespace, long name (#8831) doesn't find private enum from outside namespace, long name (#8831) - doesn't find private class from outside namespace, long name (#8831) doesn't find private class from outside namespace, long name (#8831) - doesn't define incorrect type in top-level namespace (#13511) doesn't define incorrect type in top-level namespace (#13511) - doesn't find private module from outside namespace, long name (#8831) doesn't find private module from outside namespace, long name (#8831) - can use types in private type can use types in private type - doesn't define private enum with global type name doesn't define private enum with global type name - types private def correctly types private def correctly - doesn't define incorrect type in top-level namespace (#13511) doesn't define incorrect type in top-level namespace (#13511) - doesn't find module private macro outside the module doesn't find module private macro outside the module - finds private class in macro expansion finds private class in macro expansion - finds private def in same file that invokes another def finds private def in same file that invokes another def - finds private type from inside namespace finds private type from inside namespace - doesn't find private alias from outside namespace, long name (#8831) doesn't find private alias from outside namespace, long name (#8831) - doesn't define private constant with global type name doesn't define private constant with global type name - doesn't inherit visibility from class node in macro hook (#8794) doesn't inherit visibility from class node in macro hook (#8794) - doesn't find private alias in another file doesn't find private alias in another file - doesn't find private class in another file doesn't find private class in another file - doesn't find private constant in another file (#7850) doesn't find private constant in another file (#7850) - doesn't find private constant from outside namespace doesn't find private constant from outside namespace - doesn't define private lib with global type name doesn't define private lib with global type name - doesn't find private def in another file doesn't find private def in another file - doesn't find private constant from outside namespace, long name (#8831) doesn't find private constant from outside namespace, long name (#8831) - find module private macro inside a module, which is inherited by the module find module private macro inside a module, which is inherited by the module - finds private def in same file finds private def in same file - doesn't find private class from outside namespace doesn't find private class from outside namespace - doesn't find private module defined through macro (#8715) doesn't find private module defined through macro (#8715) -read_file - with relative path - reads file (exists) reads file (exists) - reads file (doesn't exist) reads file (doesn't exist) - with absolute path - reads file (doesn't exist) reads file (doesn't exist) - reads file (exists) reads file (exists) -Semantic: struct - errors if includes and field already exists, the other way around errors if includes and field already exists, the other way around - errors if already defined errors if already defined - errors on struct setter if different type via new errors on struct setter if different type via new - errors if invoking to_i32! and got wrong type errors if invoking to_i32! and got wrong type - errors if already defined with another type (2) errors if already defined with another type (2) - errors if setting closure errors if setting closure - can access instance var from the outside (#1092) can access instance var from the outside (#1092) - errors if using void in struct field type errors if using void in struct field type - types struct types struct - errors if already defined with another type errors if already defined with another type - includes another struct includes another struct - types struct getter with keyword name types struct getter with keyword name - errors if using void via typedef in struct field type errors if using void via typedef in struct field type - errors on struct if no field errors on struct if no field - allows inline forward declaration allows inline forward declaration - automatically converts numeric type in struct field assignment automatically converts numeric type in struct field assignment - types Struct#new types Struct#new - errors on empty c struct (#633) errors on empty c struct (#633) - types struct getter multiple levels via new types struct getter multiple levels via new - types struct getter types struct getter - errors on struct setter if different type errors on struct setter if different type - errors if includes non-cstruct type errors if includes non-cstruct type - marks as packed marks as packed - errors if invoking to_i32! and got error in that call errors if invoking to_i32! and got error in that call - types struct setter types struct setter - errors if invoking to_unsafe and got error in that call errors if invoking to_unsafe and got error in that call - types struct getter to struct types struct getter to struct - errors if includes unknown type errors if includes unknown type - supports macro if inside struct supports macro if inside struct - errors if invoking to_unsafe and got different type errors if invoking to_unsafe and got different type - errors if includes and field already exists errors if includes and field already exists - types struct getter on pointer type types struct getter on pointer type -Normalize: block - normalizes nested unpacking normalizes nested unpacking - normalizes unpacking with empty body normalizes unpacking with empty body - normalizes multiple nested unpackings normalizes multiple nested unpackings - normalizes unpacking with splat normalizes unpacking with splat - normalizes unpacking with single expression body normalizes unpacking with single expression body - normalizes unpacking with multiple body expressions normalizes unpacking with multiple body expressions - normalizes unpacking with underscore normalizes unpacking with underscore -Code gen: c union - aligns to the member with biggest align requirements aligns to the member with biggest align requirements - reads union instance var reads union instance var - codegens struct inside union codegens struct inside union - fills union type to the max size fills union type to the max size - codegens assign c union to union codegens assign c union to union - codegens union property setter 2 codegens union property setter 2 - codegens union property default value codegens union property default value - automatically converts by invoking to_unsafe automatically converts by invoking to_unsafe - codegens union property default value 2 codegens union property default value 2 - automatically converts numeric type in field assignment automatically converts numeric type in field assignment - builds union setter with fun type builds union setter with fun type - does to_s does to_s does to_s does to_s does to_s does to_s does to_s does to_s does to_s does to_s - codegens union property setter 2 via pointer codegens union property setter 2 via pointer - automatically converts numeric union type in field assignment automatically converts numeric union type in field assignment - codegens union property setter 1 codegens union property setter 1 - moves unions around correctly (#12550) moves unions around correctly (#12550) moves unions around correctly (#12550) moves unions around correctly (#12550) moves unions around correctly (#12550) moves unions around correctly (#12550) moves unions around correctly (#12550) moves unions around correctly (#12550) moves unions around correctly (#12550) moves unions around correctly (#12550) - codegens union property setter 1 via pointer codegens union property setter 1 via pointer -immutability of returned container literals (#10818) - ProcPointer#args ProcPointer#args - Union#types Union#types - ProcNotation#inputs ProcNotation#inputs - StringInterpolation#expressions StringInterpolation#expressions - Generic#type_vars Generic#type_vars - MultiAssign#targets MultiAssign#targets - Annotation#args Annotation#args - MultiAssign#values MultiAssign#values - When#conds When#conds -Codegen: while - break with value, condition fails break with value, condition fails - doesn't crash on while true begin break rescue (#7786) doesn't crash on while true begin break rescue (#7786) - skip block with next skip block with next - endless break with value endless break with value - codegens endless while codegens endless while - codegens def with while codegens def with while - conditional break with value conditional break with value - conditional break without value conditional break without value - endless conditional break with value endless conditional break with value - doesn't crash on a = NoReturn doesn't crash on a = NoReturn - codegens while with declared var 2 codegens while with declared var 2 - codegens while with declared var 1 codegens while with declared var 1 - doesn't crash on #2767 (3) doesn't crash on #2767 (3) - codegens while with declared var 3 codegens while with declared var 3 - doesn't crash on #2767 (2) doesn't crash on #2767 (2) - doesn't crash on #2767 (4) doesn't crash on #2767 (4) - doesn't crash on #2767 doesn't crash on #2767 - break without value break without value - break with value break with value - codegens while with non-false condition codegens while with non-false condition - codegens while with false codegens while with false -Crystal::TextHierarchyPrinter - works works - shows correct total size of generic class if known shows correct total size of generic class if known - shows correct size for members with bound types shows correct size for members with bound types - shows correct size for Proc inside extern struct shows correct size for Proc inside extern struct - shows correct size for Bool member shows correct size for Bool member -Semantic: if - doesn't restrict || else in sub && (right) doesn't restrict || else in sub && (right) - types `if` with `&&` and assignment types `if` with `&&` and assignment - doesn't restrict with || on different vars doesn't restrict with || on different vars - restricts || else in sub || (left) restricts || else in sub || (left) - restricts with || (#2464) restricts with || (#2464) - doesn't fail on Expressions condition (1) doesn't fail on Expressions condition (1) - restricts type with !var.is_a?(...) and && restricts type with !var.is_a?(...) and && - includes pointer types in falsey branch includes pointer types in falsey branch - doesn't restrict || else in sub && (left) doesn't restrict || else in sub && (left) - correctly filters type of variable if there's a raise with an interpolation that can't be typed correctly filters type of variable if there's a raise with an interpolation that can't be typed - restricts and doesn't unify union types restricts and doesn't unify union types - doesn't filter and recombine when variables don't change in if doesn't filter and recombine when variables don't change in if - types an if without else types an if without else - doesn't fail on new variables inside typeof condition doesn't fail on new variables inside typeof condition - errors if requires inside if errors if requires inside if - restricts type with !var and || restricts type with !var and || - restricts || else in sub || (right) restricts || else in sub || (right) - restricts || else (2) (#3266) restricts || else (2) (#3266) - restricts the type of the right hand side of an || when using is_a? (#1728) restricts the type of the right hand side of an || when using is_a? (#1728) - restricts || else (3) (#3266) restricts || else (3) (#3266) - restricts && else in sub && (left) restricts && else in sub && (left) - types variable after unreachable else of && (#3360) types variable after unreachable else of && (#3360) - can invoke method on var that is declared on the right hand side of an and can invoke method on var that is declared on the right hand side of an and - restricts && else in sub && (right) restricts && else in sub && (right) - restricts with || but doesn't unify types to base class restricts with || but doesn't unify types to base class - doesn't fail on nested conditionals inside typeof condition doesn't fail on nested conditionals inside typeof condition - restricts type with !var.is_a?(...) and || restricts type with !var.is_a?(...) and || - doesn't fail on Expressions condition (2) doesn't fail on Expressions condition (2) - restricts with && always falsey restricts with && always falsey - passes bug (related to #1729) passes bug (related to #1729) - types an if with else of different type types an if with else of different type - doesn't restrict with || on var and non-restricting condition doesn't restrict with || on var and non-restricting condition - doesn't consider nil type in else branch with if with && (#7434) doesn't consider nil type in else branch with if with && (#7434) - restricts || else (1) (#3266) restricts || else (1) (#3266) - restricts || of more than 2 clauses (#8864) restricts || of more than 2 clauses (#8864) - restricts && of !var.is_a(...) restricts && of !var.is_a(...) - types an if with else of same type types an if with else of same type -Semantic: array - types array literal of int with splats types array literal of int with splats - types array literal of int types array literal of int - types array literal with splats (2) types array literal with splats (2) - types non-empty typed array literal of int types non-empty typed array literal of int - assignment in array literal works (#3195) assignment in array literal works (#3195) - types empty typed array literal of int32 types empty typed array literal of int32 - types non-empty typed array literal of int types non-empty typed array literal of int - types array literal size correctly types array literal size correctly - types array literal of union types array literal of union - types array literal with splats types array literal with splats -Crystal::FFI::CallInterface - .variadic - zero varargs zero varargs - validates args size validates args size - basic basic - .new - simple call simple call - array array - make struct make struct - sum struct sum struct - with args with args - all primitive arg types all primitive arg types -Semantic: uninitialized - declares as uninitialized and reads it declares as uninitialized and reads it - uses virtual type for uninitialized (#8216) uses virtual type for uninitialized (#8216) - can use uninitialized with class type (#2940) can use uninitialized with class type (#2940) - can uninitialize variable outside initialize, generic (#2828) can uninitialize variable outside initialize, generic (#2828) - disallows declaring var of type Object disallows declaring var of type Object - disallows declaring var of type Enum disallows declaring var of type Enum - disallows declaring var of type Reference disallows declaring var of type Reference - disallows declaring var of type Struct disallows declaring var of type Struct - has type (#3641) has type (#3641) - errors if declaring variable multiple times with different types (#917) errors if declaring variable multiple times with different types (#917) - errors if declares var and then assigns other type errors if declares var and then assigns other type - errors if declaring generic type without type vars (with class var) errors if declaring generic type without type vars (with class var) - errors if declaring generic type without type vars (with instance var) errors if declaring generic type without type vars (with instance var) - disallows declaring var of type Class disallows declaring var of type Class - disallows declaring var of type Int disallows declaring var of type Int - can uninitialize variable outside initialize (#2828) can uninitialize variable outside initialize (#2828) - disallows declaring var of type Value disallows declaring var of type Value - declares as uninitialized declares as uninitialized - disallows declaring var of type Number disallows declaring var of type Number - declares an instance variable in initialize as uninitialized declares an instance variable in initialize as uninitialized - disallows declaring var of type Float disallows declaring var of type Float - works with uninitialized NoReturn (#3314) works with uninitialized NoReturn (#3314) -Semantic: sizeof - types instance_sizeof types instance_sizeof - types instance_alignof NoReturn (missing type) (#5717) types instance_alignof NoReturn (missing type) (#5717) - gives error if using instance_sizeof on a module gives error if using instance_sizeof on a module - types alignof types alignof - types instance_alignof types instance_alignof - gives error if using instance_sizeof on something that's not a class gives error if using instance_sizeof on something that's not a class - gives error if using instance_sizeof on a metaclass gives error if using instance_sizeof on a metaclass - gives error if using instance_sizeof on an abstract struct with multiple subtypes (#11855) gives error if using instance_sizeof on an abstract struct with multiple subtypes (#11855) - errors on sizeof uninstantiated generic type (#6415) errors on sizeof uninstantiated generic type (#6415) - gives error if using instance_sizeof on a generic type without type vars gives error if using instance_sizeof on a generic type without type vars - types alignof NoReturn (missing type) (#5717) types alignof NoReturn (missing type) (#5717) - types sizeof types sizeof - types sizeof NoReturn (missing type) (#5717) types sizeof NoReturn (missing type) (#5717) - types instance_sizeof NoReturn (missing type) (#5717) types instance_sizeof NoReturn (missing type) (#5717) - gives error if using instance_sizeof on a union type (#8349) gives error if using instance_sizeof on a union type (#8349) - gives error if using instance_sizeof on an abstract struct (#11855) gives error if using instance_sizeof on an abstract struct (#11855) - gives error if using instance_sizeof on a struct gives error if using instance_sizeof on a struct -Parser doc - includes doc for class includes doc for class - includes doc for fun def includes doc for fun def - includes doc for def includes doc for def - includes doc for constant assign includes doc for constant assign - includes doc for macro includes doc for macro - includes doc for abstract def includes doc for abstract def - includes doc for enum def includes doc for enum def - includes doc for annotation includes doc for annotation - includes doc for module includes doc for module - includes doc for private def includes doc for private def - includes doc for alias includes doc for alias - includes doc for call without obj includes doc for call without obj - includes doc for struct includes doc for struct - includes doc for abstract class includes doc for abstract class - disables doc parsing inside defs disables doc parsing inside defs -Crystal::JSONHierarchyPrinter - works works -Code gen: primitives - uses built-in llvm function that returns a tuple uses built-in llvm function that returns a tuple - allows redefining a primitive method allows redefining a primitive method - codegens int codegens int - codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 - doesn't treat `(1 == 1) == true` as `1 == 1 == true` (#328) doesn't treat `(1 == 1) == true` as `1 == 1 == true` (#328) - atomicrmw - codegens atomicrmw with enums codegens atomicrmw with enums - codegens atomicrmw with enums codegens atomicrmw with enums - codegens atomicrmw with symbols codegens atomicrmw with symbols - codegens long codegens long - passes issue #328 passes issue #328 - va_arg - works with C code works with C code works with C code works with C code works with C code works with C code works with C code works with C code works with C code works with C code - uses llvm's va_arg instruction uses llvm's va_arg instruction - doesn't optimize away call whose obj is not passed as self (#2226) doesn't optimize away call whose obj is not passed as self (#2226) - codegens char codegens char - allows @[Primitive] on fun declarations allows @[Primitive] on fun declarations - codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 - codegens f64 codegens f64 - allows @[Primitive] on method that has body allows @[Primitive] on method that has body - sums two numbers out of an [] of Number sums two numbers out of an [] of Number - gets crystal class instance type id gets crystal class instance type id - codegens crystal_type_id for class codegens crystal_type_id for class - codegens __LINE__ codegens __LINE__ - defined method that calls primitive (bug) defined method that calls primitive (bug) - arithmetic primitives - codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 - codegens 1 &- 2 codegens 1 &- 2 - codegens 1.to_f! codegens 1.to_f! - skips bounds checking when to_i produces same type skips bounds checking when to_i produces same type - codegens 1.to_i16! codegens 1.to_i16! - codegens 2 &* 3 codegens 2 &* 3 - codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1.to_f - codegens 1 &+ 2 codegens 1 &+ 2 - codegens 1 - 2 codegens 1 - 2 codegens 1 - 2 codegens 1 - 2 codegens 1 - 2 codegens 1 - 2 codegens 1 - 2 codegens 1 - 2 codegens 1 - 2 codegens 1 - 2 - codegens 16.unsafe_shr 2 codegens 16.unsafe_shr 2 - codegens 8.unsafe_div 3 codegens 8.unsafe_div 3 - codegens 8.unsafe_mod 3 codegens 8.unsafe_mod 3 - codegens 1 + 2 codegens 1 + 2 codegens 1 + 2 codegens 1 + 2 codegens 1 + 2 codegens 1 + 2 codegens 1 + 2 codegens 1 + 2 codegens 1 + 2 codegens 1 + 2 - codegens 16.unsafe_shl 2 codegens 16.unsafe_shl 2 - codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 - codegens bool codegens bool - codegens pointer of int codegens pointer of int - codegens crystal_type_id with union type codegens crystal_type_id with union type - codegens string codegens string - codegens f32 codegens f32 - codegens char ord codegens char ord - can invoke binary on primitive typedef (#614) can invoke binary on primitive typedef (#614) - can invoke cast on primitive typedef (#614) can invoke cast on primitive typedef (#614) -Crystal::Command::FlagsVisitor - different flags different flags - only macro only macro - unique flags unique flags -Semantic: c union - errors if using void in union field type errors if using void in union field type - types union setter types union setter - types union getter via pointer types union getter via pointer - types union setter via pointer types union setter via pointer - errors if using void via typedef in union field type errors if using void via typedef in union field type - errors if setting closure errors if setting closure - types c union types c union - types union getter types union getter - types Union#new types Union#new - errors on empty c union (#633) errors on empty c union (#633) -Visibility modifiers - errors if invoking protected method from non-subclass errors if invoking protected method from non-subclass - allows setting visibility modifier to macro allows setting visibility modifier to macro - allows setting visibility modifier to macro that generates many methods (2) allows setting visibility modifier to macro that generates many methods (2) - allows calling protected method from nested generic class (1) allows calling protected method from nested generic class (1) - errors if applying visibility modifier to non-def or non-call errors if applying visibility modifier to non-def or non-call - allows invoking protected method from subclass allows invoking protected method from subclass - allows invoking protected method from virtual type allows invoking protected method from virtual type - allows invoking protected method from namespace to namespaced type allows invoking protected method from namespace to namespaced type - allows calling protected method from nested generic class (2) allows calling protected method from nested generic class (2) - allows setting visibility modifier to macro that generates many methods (1) allows setting visibility modifier to macro that generates many methods (1) - allows invoking protected method between types in the same namespace when inheriting allows invoking protected method between types in the same namespace when inheriting - allows invoking protected method from subclass (2) allows invoking protected method from subclass (2) - disallows invoking private method disallows invoking private method - allows invoking private setter with self allows invoking private setter with self - allows invoking protected method from namespaced type to namespace allows invoking protected method from namespaced type to namespace - automatically makes initialize be protected automatically makes initialize be protected - allows invoking protected method from the same class allows invoking protected method from the same class - allows invoking protected from instance to class allows invoking protected from instance to class - handles virtual types (#8561) handles virtual types (#8561) - errors if invoking protected method from non-subclass, generated with macro that generates a macro errors if invoking protected method from non-subclass, generated with macro that generates a macro - allows invoking protected method between types in the same namespace allows invoking protected method between types in the same namespace - allows invoking private method from the same class allows invoking private method from the same class - errors if invoking protected method from top-level errors if invoking protected method from top-level - defines protected initialize (#7501) defines protected initialize (#7501) - gives correct error on unknown call (#2838) gives correct error on unknown call (#2838) -Lexer string - lexes regex string with escaped space with %r(...) lexes regex string with escaped space with %r(...) - lexes simple string with nested %< lexes simple string with nested %< - says syntax error on "\"\\uFEDZ\"" says syntax error on "\"\\uFEDZ\"" - says syntax error on "\"\\u{DFFF}\"" says syntax error on "\"\\u{DFFF}\"" - lexes string with numeral lexes string with numeral - says syntax error on "\"\\uD800\"" says syntax error on "\"\\uD800\"" - lexes string with literal newline lexes string with literal newline - lexes regex string with special chars with /.../ lexes regex string with special chars with /.../ - raises when identifier doesn't start with a letter or number raises when identifier doesn't start with a letter or number - lexes string with unicode codepoint in curly lexes string with unicode codepoint in curly - lexes string with slash lexes string with slash - lexes simple string lexes simple string - assigns correct location after heredoc (#346) assigns correct location after heredoc (#346) - lexes slash with no-escape char lexes slash with no-escape char - says syntax error on "\"\\uDFFF\"" says syntax error on "\"\\uDFFF\"" - lexes string with unicode codepoint lexes string with unicode codepoint - lexes heredoc lexes heredoc - raises on unexpected EOF while lexing heredoc raises on unexpected EOF while lexing heredoc - lexes string with interpolation lexes string with interpolation - lexes heredoc with \r\n lexes heredoc with \r\n - lexes backtick string lexes backtick string - says syntax error on "\"\\u{}\"" says syntax error on "\"\\u{}\"" - lexes string with unicode codepoint in curly multiple times lexes string with unicode codepoint in curly multiple times - lexes string with slash t lexes string with slash t - lexes string with backslash lexes string with backslash - lexes simple string with nested %[ lexes simple string with nested %[ - lexes heredoc with spaces before close tag lexes heredoc with spaces before close tag - lexes regex string with escaped space with /.../ lexes regex string with escaped space with /.../ - lexes regex string with special chars with %r(...) lexes regex string with special chars with %r(...) - lexes simple string with nested %( lexes simple string with nested %( - lexes regex string lexes regex string - lexes regex string with escaped slash with /.../ lexes regex string with escaped slash with /.../ - lexes regex string with escaped slash with %r(...) lexes regex string with escaped slash with %r(...) - says syntax error on "\"\\u{110000}\"" says syntax error on "\"\\u{110000}\"" - lexes string with only newline lexes string with only newline - lexes simple string with nested %{ lexes simple string with nested %{ - lexes simple string with %| lexes simple string with %| - lexes interpolations in heredocs lexes interpolations in heredocs - says syntax error on "\"\\u{D800}\"" says syntax error on "\"\\u{D800}\"" - lexes string with slash quote lexes string with slash quote - raises on unterminated heredoc raises on unterminated heredoc - lexes simple string with %( lexes simple string with %( - lexes string with interpolation with double numeral lexes string with interpolation with double numeral - lexes heredoc with empty line lexes heredoc with empty line - lexes double numeral lexes double numeral - lexes string with newline lexes string with newline -Semantic: while - types while with assignment and && types while with assignment and && - finds while cond assign target in Not (#10345) finds while cond assign target in Not (#10345) - doesn't use type at end of endless while if variable is reassigned doesn't use type at end of endless while if variable is reassigned - doesn't fail on nested conditionals inside typeof condition doesn't fail on nested conditionals inside typeof condition - finds all while cond assign targets in expressions (2) finds all while cond assign targets in expressions (2) - types while with assignment types while with assignment - uses type at end of endless while if variable is reassigned, but not before first break (2) uses type at end of endless while if variable is reassigned, but not before first break (2) - finds all while cond assign targets in expressions (3) finds all while cond assign targets in expressions (3) - types while with multiple breaks with value types while with multiple breaks with value - finds all while cond assign targets in expressions (6) finds all while cond assign targets in expressions (6) - restricts type after `while` with `not` and `and` (#4242) restricts type after `while` with `not` and `and` (#4242) - doesn't use type at end of endless while if variable is reassigned (2) doesn't use type at end of endless while if variable is reassigned (2) - types while with break with value types while with break with value - types variable as nilable if raise before assign types variable as nilable if raise before assign - finds all while cond assign targets in expressions (4) finds all while cond assign targets in expressions (4) - types while with assignment and call types while with assignment and call - reports next cannot be used outside a while reports next cannot be used outside a while - uses type at end of endless while if variable is reassigned, but not before first break uses type at end of endless while if variable is reassigned, but not before first break - reports break cannot be used outside a while reports break cannot be used outside a while - doesn't type var as nilable after break inside rescue doesn't type var as nilable after break inside rescue - types while (true) as NoReturn types while (true) as NoReturn - doesn't restrict type after while if there's a break (#4242) doesn't restrict type after while if there's a break (#4242) - restricts type after while with not (#4242) restricts type after while with not (#4242) - uses var type inside while if endless loop uses var type inside while if endless loop - types while ((true)) as NoReturn types while ((true)) as NoReturn - uses var type inside while if endless loop (2) uses var type inside while if endless loop (2) - doesn't use type at end of endless while if variable is reassigned (3) doesn't use type at end of endless while if variable is reassigned (3) - rebinds condition variable after while body (#6158) rebinds condition variable after while body (#6158) - doesn't fail on Expressions condition (1) doesn't fail on Expressions condition (1) - doesn't modify var's type before while doesn't modify var's type before while - types while true as NoReturn types while true as NoReturn - types while with break without value types while with break without value - restricts type after while (#4242) restricts type after while (#4242) - doesn't fail on Expressions condition (2) doesn't fail on Expressions condition (2) - doesn't fail on new variables inside typeof condition doesn't fail on new variables inside typeof condition - types while types while - marks variable as nil if breaking before assigning to it in an endless loop marks variable as nil if breaking before assigning to it in an endless loop - marks variable as nil if breaking before assigning to it in an endless loop (2) marks variable as nil if breaking before assigning to it in an endless loop (2) - finds all while cond assign targets in expressions (#10350) finds all while cond assign targets in expressions (#10350) - types while with && (#1425) types while with && (#1425) - types endless while with break without value types endless while with break without value - types endless while with break with value types endless while with break with value - types endless while with multiple breaks with value types endless while with multiple breaks with value - finds all while cond assign targets in expressions (5) finds all while cond assign targets in expressions (5) -Semantic: instance var - obeys super module initialize (#456) obeys super module initialize (#456) - infers type to be nilable if self is used before assigning to a variable infers type to be nilable if self is used before assigning to a variable - infers type from offsetof infers type from offsetof - says can't infer type if only nil was assigned says can't infer type if only nil was assigned - declares instance var of generic type, with virtual metaclass declares instance var of generic type, with virtual metaclass - doesn't solve instance var initializer in instance context (3) (#5876) doesn't solve instance var initializer in instance context (3) (#5876) - uses virtual types in union uses virtual types in union - infers type from string literal infers type from string literal - doesn't infer unbound generic type on generic method called from generic's subclass, metaclass context doesn't infer unbound generic type on generic method called from generic's subclass, metaclass context - declares instance var of generic type, with splat inside Proc declares instance var of generic type, with splat inside Proc - infers from class method that invokes new infers from class method that invokes new - declares instance var of generic type, with metaclass declares instance var of generic type, with metaclass - doesn't complain if declared type is recursive alias that's nilable doesn't complain if declared type is recursive alias that's nilable - infers type from bool literal infers type from bool literal - infers type from hash literal with of infers type from hash literal with of - can guess the type from splat argument with splatted type can guess the type from splat argument with splatted type - errors if declaring var in Number errors if declaring var in Number - can guess the type from double-splat argument with double-splatted type variable can guess the type from double-splat argument with double-splatted type variable - infers type from self (#2575) infers type from self (#2575) - infers type from as infers type from as - says undefined instance variable on read says undefined instance variable on read - instance variables initializers are used in class variables initialized objects (#3988) instance variables initializers are used in class variables initialized objects (#3988) - infers type from custom generic hash literal infers type from custom generic hash literal - can't infer type of generic method that returns self (#5383) can't infer type of generic method that returns self (#5383) - infers type from ! infers type from ! - errors if declaring var in Proc(*T, R) errors if declaring var in Proc(*T, R) - errors if declaring var in Float errors if declaring var in Float - infers from Pointer.malloc with two arguments infers from Pointer.malloc with two arguments - infers from Pointer.malloc in generic type infers from Pointer.malloc in generic type - infers from method in generic type, with type annotation infers from method in generic type, with type annotation - can't infer type from initializer in generic module type can't infer type from initializer in generic module type - infers from Pointer.malloc with two arguments in generic type infers from Pointer.malloc with two arguments in generic type - declares instance var of generic type, with splat inside Tuple declares instance var of generic type, with splat inside Tuple - infers from another instance var in generic type with type declaration infers from another instance var in generic type with type declaration - guesses virtual array type (3) (#5342) guesses virtual array type (3) (#5342) - infers type from literal outside def with initialize and type restriction infers type from literal outside def with initialize and type restriction - infers from generic class method that has type annotation, without instantiating infers from generic class method that has type annotation, without instantiating - declares instance var in module, inherits to type declares instance var in module, inherits to type - infers from class method that has type annotation infers from class method that has type annotation - doesn't combine union of Number and Number subclass (#5073) doesn't combine union of Number and Number subclass (#5073) - errors if not initializing super variables (3) errors if not initializing super variables (3) - infers type from if infers type from if - declares instance var which appears in initialize declares instance var which appears in initialize - infers type to be non-nilable if initialized in all initialize infers type to be non-nilable if initialized in all initialize - infers type from all call matches infers type from all call matches - errors if declaring var in Value errors if declaring var in Value - is more permissive with macro def initialize, other initialize is more permissive with macro def initialize, other initialize - declares instance var in module, inherits to type recursively declares instance var in module, inherits to type recursively - guesses from as.(typeof(...)) guesses from as.(typeof(...)) - errors with macro def but another def doesn't initialize all errors with macro def but another def doesn't initialize all - errors if not initializing super variable in generic errors if not initializing super variable in generic - doesn't duplicate instance var in subclass doesn't duplicate instance var in subclass - errors when typing an instance variable inside a method errors when typing an instance variable inside a method - infers type from assign (1) infers type from assign (1) - infers type in multi assign infers type in multi assign - infers type to be nilable if not initialized infers type to be nilable if not initialized - doesn't error if not initializing variables but calling super doesn't error if not initializing variables but calling super - errors if declaring var in Int errors if declaring var in Int - infers type from assign (2) infers type from assign (2) - infers type from array literal with literals in generic type infers type from array literal with literals in generic type - infers from Pointer.null in generic type infers from Pointer.null in generic type - declares instance var of generic type, with static array declares instance var of generic type, with static array - infers type from redefined method if calls previous_def infers type from redefined method if calls previous_def - infers type from included module, outside def infers type from included module, outside def - guesses virtual array type (3) (#5342) guesses virtual array type (3) (#5342) - doesn't error if initializes via super in macro def doesn't error if initializes via super in macro def - types generic instance as virtual type if generic type has subclasses (#3805) types generic instance as virtual type if generic type has subclasses (#3805) - errors if declaring var in Int32 errors if declaring var in Int32 - ignores super module initialize (#456) ignores super module initialize (#456) - looks up return type restriction in defining type, not instantiated type (#11961) looks up return type restriction in defining type, not instantiated type (#11961) - infers type from included module infers type from included module - infers type from as? infers type from as? - cannot guess the type from double-splat argument with not double-splatted type cannot guess the type from double-splat argument with not double-splatted type - infers from new with return type in generic type infers from new with return type in generic type - declares instance var with self, on generic declares instance var with self, on generic - transfers initializer from generic module to class transfers initializer from generic module to class - doesn't error if initializing var in superclass, and then empty initialize doesn't error if initializing var in superclass, and then empty initialize - infers type for generic class, with && infers type for generic class, with && - infers type from hash literal from elements infers type from hash literal from elements - doesn't error when using Class but specifying type doesn't error when using Class but specifying type - errors if declaring var in Reference errors if declaring var in Reference - is more permissive with macro def initialize is more permissive with macro def initialize - errors if can't find lib call, before erroring on instance var (#2579) errors if can't find lib call, before erroring on instance var (#2579) - guesses virtual hash type (2) (#5342) guesses virtual hash type (2) (#5342) - infers type from argument with restriction, in generic infers type from argument with restriction, in generic - infers type from && infers type from && - declares instance var of generic module declares instance var of generic module - errors when assigning instance variable at top level control block errors when assigning instance variable at top level control block - says can't infer (#2536) says can't infer (#2536) - doesn't crash on recursive method call doesn't crash on recursive method call - infers type from argument default value infers type from argument default value - infers from class method that has type annotation, with multiple overloads matching, all with the same type infers from class method that has type annotation, with multiple overloads matching, all with the same type - can't infer type when using operation on const (#4054) can't infer type when using operation on const (#4054) - infers type from regex literal infers type from regex literal - infers type from ||= inside another assignment infers type from ||= inside another assignment - infers type from lib fun call infers type from lib fun call - infers type from array literal with of metaclass infers type from array literal with of metaclass - infers type from literal outside def infers type from literal outside def - infers type from char literal infers type from char literal - doesn't consider var as nilable if conditionally assigned inside initialize, but has initializer (#3669) doesn't consider var as nilable if conditionally assigned inside initialize, but has initializer (#3669) - guesses inside macro if guesses inside macro if - guesses from new on abstract class guesses from new on abstract class - can't infer type from initializer can't infer type from initializer - infers type from path that is a type infers type from path that is a type - infers type from argument restriction infers type from argument restriction - guesses from splat (#3149) guesses from splat (#3149) - looks up self restriction in instantiated type, not defined type looks up self restriction in instantiated type, not defined type - can declare type even if included module has a guessed var can declare type even if included module has a guessed var - declares instance var with union type with a virtual member declares instance var with union type with a virtual member - declares instance var declares instance var - errors on undefined instance var and subclass calling super errors on undefined instance var and subclass calling super - infers type from hash literal with literals in generic type infers type from hash literal with literals in generic type - guesses from splat (2) (#3149) guesses from splat (2) (#3149) - infers from assign to local var (#2467) infers from assign to local var (#2467) - declares with `self` declares with `self` - declares instance var of generic class declares instance var of generic class - infers type for generic class, with case infers type for generic class, with case - considers var as assigned in multi-assign considers var as assigned in multi-assign - errors when assigning instance variable inside nested expression errors when assigning instance variable inside nested expression - infers type from || infers type from || - infers type for generic class, with lib call infers type for generic class, with lib call - infers type for generic class, with T.new infers type for generic class, with T.new - infers type for generic class, with begin infers type for generic class, with begin - doesn't consider self.initialize as initializer (#3239) doesn't consider self.initialize as initializer (#3239) - infers type from two literals infers type from two literals - guesses from as.(typeof(...)) in generic type guesses from as.(typeof(...)) in generic type - declares instance var of generic type, with tuple declares instance var of generic type, with tuple - can guess the type from double-splat argument with double-splatted type can guess the type from double-splat argument with double-splatted type - doesn't error if not calling super but initializing all variables doesn't error if not calling super but initializing all variables - declares instance var of generic type through module declares instance var of generic type through module - infers from class method that has type annotation, in generic class infers from class method that has type annotation, in generic class - infers type from lib out (2) infers type from lib out (2) - can't infer type from initializer in generic class type can't infer type from initializer in generic class type - doesn't infer from class method with multiple statements and return, on non-easy return doesn't infer from class method with multiple statements and return, on non-easy return - declares instance var with initial value, with subclass declares instance var with initial value, with subclass - infers type from sizeof infers type from sizeof - doesn't crash when inferring from new without matches (#2538) doesn't crash when inferring from new without matches (#2538) - infers type from tuple literal infers type from tuple literal - errors if declaring var in Object errors if declaring var in Object - declares instance var of generic class after reopen declares instance var of generic class after reopen - errors if declaring var in Tuple(*T) errors if declaring var in Tuple(*T) - infer from class method with multiple statements and return infer from class method with multiple statements and return - infers type from case infers type from case - infers type from array literal in generic type infers type from array literal in generic type - doesn't infer unbound generic type on non-generic call (#6390) doesn't infer unbound generic type on non-generic call (#6390) - declares instance var with initial value declares instance var with initial value - cannot guess the type from splat argument with not splatted type cannot guess the type from splat argument with not splatted type - says can't infer type if only nil was assigned, in generic type says can't infer type if only nil was assigned, in generic type - errors if unknown ivar through macro (#4050) errors if unknown ivar through macro (#4050) - errors if adds instance variable to Object via guess via included module errors if adds instance variable to Object via guess via included module - infers type from instance_sizeof infers type from instance_sizeof - declares instance var of generic type, with union declares instance var of generic type, with union - doesn't find T in generic type that's not the current type (#4460) doesn't find T in generic type that's not the current type (#4460) - infers type for generic class, with assign (1) infers type for generic class, with assign (1) - ignores redefined initialize (#456) ignores redefined initialize (#456) - errors if declaring var in Enum errors if declaring var in Enum - doesn't consider instance var as nilable if assigned before self access (#4981) doesn't consider instance var as nilable if assigned before self access (#4981) - accepts overriding inherited instance variable with compatible type accepts overriding inherited instance variable with compatible type - infers type from enum member infers type from enum member - infers type for generic class, with assign (2) infers type for generic class, with assign (2) - guesses virtual array type (1) (#5342) guesses virtual array type (1) (#5342) - guesses virtual hash type (1) (#5342) guesses virtual hash type (1) (#5342) - declares instance var of generic type, with generic type declares instance var of generic type, with generic type - transfers initializer from module to generic class transfers initializer from module to generic class - infers from class method that has type annotation, with overload infers from class method that has type annotation, with overload - errors when using Class in generic type errors when using Class in generic type - allow usage of instance variable initializer from instance variable initializer allow usage of instance variable initializer from instance variable initializer - errors if declaring var in StaticArray(T, N) errors if declaring var in StaticArray(T, N) - errors if not initializing super variables errors if not initializing super variables - uses virtual types in fun uses virtual types in fun - guesses from hash literal with of, with subclass guesses from hash literal with of, with subclass - infers from another instance var infers from another instance var - declares instance var of generic type, with no type parameter declares instance var of generic type, with no type parameter - infers type from lib out (1) infers type from lib out (1) - errors if declaring instance var and turns out to be nilable, in generic module type in generic type errors if declaring instance var and turns out to be nilable, in generic module type in generic type - infers type from block argument without restriction infers type from block argument without restriction - infers type from path that is a constant infers type from path that is a constant - is more permissive with macro def initialize, multiple is more permissive with macro def initialize, multiple - infers from method on integer literal, with type annotation infers from method on integer literal, with type annotation - doesn't complain if not initialized in one initialize, but has initializer (#2465) doesn't complain if not initialized in one initialize, but has initializer (#2465) - can type ivar from class inherited by generic class (#5281) can type ivar from class inherited by generic class (#5281) - declares instance var of generic type subclass declares instance var of generic type subclass - declares instance var of generic type declares instance var of generic type - infers type from custom hash literal in generic infers type from custom hash literal in generic - solves instance var initializer in metaclass context (#5876) solves instance var initializer in metaclass context (#5876) - can type ivar from module included by generic class (#5281) can type ivar from module included by generic class (#5281) - doesn't solve instance var initializer in instance context (1) (#5876) doesn't solve instance var initializer in instance context (1) (#5876) - says undefined instance variable on assign says undefined instance variable on assign - allows nil instance var because it's a generic type allows nil instance var because it's a generic type - shouldn't error when accessing instance var in initialized that's always initialized (#2953) shouldn't error when accessing instance var in initialized that's always initialized (#2953) - infers type by removing nil from || left side infers type by removing nil from || left side - infers type from included module recursively infers type from included module recursively - infers type for generic class, with literal infers type for generic class, with literal - declares instance var of generic module from non-generic module declares instance var of generic module from non-generic module - infers type from custom generic array literal infers type from custom generic array literal - errors if finally not initialized in macro def errors if finally not initialized in macro def - infers in multiple assign for tuple type (1) infers in multiple assign for tuple type (1) - errors if adds instance variable to Object via guess errors if adds instance variable to Object via guess - infers type from is_a? infers type from is_a? - doesn't error when using generic in generic type because guessed elsewhere doesn't error when using generic in generic type because guessed elsewhere - doesn't infer type from redefined method doesn't infer type from redefined method - infers from new with return type infers from new with return type - infers type from block argument infers type from block argument - infers from another instance var in generic type infers from another instance var in generic type - errors if declaring variable with number errors if declaring variable with number - cannot guess type from argument assigned in body cannot guess type from argument assigned in body - doesn't infer for subclass if assigns another type (1) doesn't infer for subclass if assigns another type (1) - infers nilable instance var of generic type infers nilable instance var of generic type - doesn't error if not initializing variables but calling super in parent parent doesn't error if not initializing variables but calling super in parent parent - infers from Pointer.null infers from Pointer.null - guesses virtual array type (2) (#5342) guesses virtual array type (2) (#5342) - doesn't error if not initializing variables but calling super and previous_def doesn't error if not initializing variables but calling super and previous_def - doesn't error if not initializes in all initialize because declared as nilable doesn't error if not initializes in all initialize because declared as nilable - doesn't error if not initialized in macro def but outside it doesn't error if not initialized in macro def but outside it - doesn't complain in second part of #2575 doesn't complain in second part of #2575 - errors if declaring var in Class errors if declaring var in Class - doesn't infer from class method with multiple statements and return, on non-easy return (2) doesn't infer from class method with multiple statements and return, on non-easy return (2) - infers type from custom hash literal infers type from custom hash literal - infers type from self as virtual type (#2575) infers type from self as virtual type (#2575) - infers type from custom array literal in generic infers type from custom array literal in generic - can guess the type from splat argument with splatted type variable can guess the type from splat argument with splatted type variable - declares instance var of generic type, with splat declares instance var of generic type, with splat - doesn't infer type to be nilable if using self.class in call in assign doesn't infer type to be nilable if using self.class in call in assign - doesn't error if not initializing variables but calling super for generic module doesn't error if not initializing variables but calling super for generic module - guesses inside macro expression guesses inside macro expression - infers from restriction using virtual type infers from restriction using virtual type - errors when overriding inherited instance variable with incompatible type errors when overriding inherited instance variable with incompatible type - errors when assigning instance variable at top level block errors when assigning instance variable at top level block - doesn't error if calling initialize from another initialize (2) doesn't error if calling initialize from another initialize (2) - errors when redeclaring subclass variable with a different type errors when redeclaring subclass variable with a different type - can't infer type from initializer in non-generic module can't infer type from initializer in non-generic module - doesn't error if declaring instance var and doesn't out to be nilable, in generic module type doesn't error if declaring instance var and doesn't out to be nilable, in generic module type - infers type for non-generic class, with assign infers type for non-generic class, with assign - declares instance var multiple times, last one wins declares instance var multiple times, last one wins - doesn't if declaring nilable instance var and turns out to be nilable doesn't if declaring nilable instance var and turns out to be nilable - inferrs Proc(Void) to Proc(Nil) inferrs Proc(Void) to Proc(Nil) - guesses from array literal with of, with subclass guesses from array literal with of, with subclass - errors if declaring var in Union(*T) errors if declaring var in Union(*T) - infers from another instance var with type declaration infers from another instance var with type declaration - doesn't infer type to be nilable if using self.class doesn't infer type to be nilable if using self.class - declares instance var of generic module (2) declares instance var of generic module (2) - infers type to be nilable if self is used in same assign infers type to be nilable if self is used in same assign - infers type from begin infers type from begin - doesn't error if not initializing variables but calling super for module doesn't error if not initializing variables but calling super for module - infers type from regex literal with interpolation infers type from regex literal with interpolation - infers from class method that has number literal infers from class method that has number literal - infers type from lib variable infers type from lib variable - infers type from custom array literal infers type from custom array literal - infers type from responds_to? infers type from responds_to? - errors if declaring instance var and turns out to be nilable, in generic type errors if declaring instance var and turns out to be nilable, in generic type - infers from assign to local var in generic type (#2467) infers from assign to local var in generic type (#2467) - infers type from proc literal with return type infers type from proc literal with return type - infers nilable instance var of generic module infers nilable instance var of generic module - infers type from array literal from its literals infers type from array literal from its literals - doesn't solve instance var initializer in instance context (2) (#5876) doesn't solve instance var initializer in instance context (2) (#5876) - doesn't check call of non-self instance (#4830) doesn't check call of non-self instance (#4830) - infers type from unless infers type from unless - infers type from uninitialized infers type from uninitialized - infers type from range literal infers type from range literal - doesn't error if not initializing variables but calling previous_def (#3210) doesn't error if not initializing variables but calling previous_def (#3210) - infers from new with return type returning generic infers from new with return type returning generic - infers from Pointer.malloc infers from Pointer.malloc - infers type for generic class, with if infers type for generic class, with if - errors if declaring instance var and turns out to be nilable errors if declaring instance var and turns out to be nilable - doesn't crash on #3580 doesn't crash on #3580 - infers type from lib out (3) infers type from lib out (3) - gives correct error when trying to use Int as an instance variable type gives correct error when trying to use Int as an instance variable type - doesn't infer unbound generic type on generic method called from generic's subclass doesn't infer unbound generic type on generic method called from generic's subclass - doesn't crash on missing var on subclass, with superclass not specifying a type doesn't crash on missing var on subclass, with superclass not specifying a type - errors if declaring generic type without type vars errors if declaring generic type without type vars - doesn't error if not initializing variables but calling previous_def (2) (#3210) doesn't error if not initializing variables but calling previous_def (2) (#3210) - infers from generic class method that has type annotation infers from generic class method that has type annotation - is more permissive with macro def initialize, bug with named args is more permissive with macro def initialize, bug with named args - infers type from new expression infers type from new expression - doesn't error if calling initialize from another initialize (1) doesn't error if calling initialize from another initialize (1) - doesn't error if inheriting generic instance (#3635) doesn't error if inheriting generic instance (#3635) - infers type from hash literal in generic type infers type from hash literal in generic type - errors if declaring instance variable in module included in Object errors if declaring instance variable in module included in Object - infers type from number literal infers type from number literal - infers type from named tuple literal infers type from named tuple literal - infer from class method where new is redefined infer from class method where new is redefined - doesn't error if not initializing nilable var in subclass doesn't error if not initializing nilable var in subclass - declares instance var of generic type, with proc declares instance var of generic type, with proc - uses T.new (#4291) uses T.new (#4291) - infers type from array literal with of infers type from array literal with of - errors if not initialized in all initialize errors if not initialized in all initialize - errors when using Class (#2605) errors when using Class (#2605) - doesn't infer for subclass if assigns another type (2) doesn't infer for subclass if assigns another type (2) - errors if declaring var in Pointer(T) errors if declaring var in Pointer(T) - errors if not initializing super variables (2) errors if not initializing super variables (2) - guesses inside macro for guesses inside macro for - infers type from symbol literal infers type from symbol literal - doesn't error when redeclaring subclass variable with the same type doesn't error when redeclaring subclass variable with the same type - infers type for generic module infers type for generic module - infers type from ||= infers type from ||= - errors if declaring instance var and turns out to be nilable, in generic module type errors if declaring instance var and turns out to be nilable, in generic module type - uses virtual types in self uses virtual types in self - errors on undefined constant errors on undefined constant - doesn't error if uses typeof(@var) doesn't error if uses typeof(@var) - doesn't error when using generic because guessed elsewhere doesn't error when using generic because guessed elsewhere - infers from class method that refers to constant infers from class method that refers to constant - errors if declaring var in NamedTuple(T) errors if declaring var in NamedTuple(T) - infers type for generic class, with T.new and literal infers type for generic class, with T.new and literal - instance variable inherited from multiple parents - with compatible type - accepts module and module, with declarations accepts module and module, with declarations - module and class, with declarations (2) module and class, with declarations (2) - accepts module and module, with definitions accepts module and module, with definitions - module and class, with declarations (3) module and class, with declarations (3) - module and class, with declarations module and class, with declarations - module and class, with definitions module and class, with definitions - with incompatible type - errors module and module, with declarations errors module and module, with declarations - module and class, with declarations module and class, with declarations - errors module and module, with definitions errors module and module, with definitions - module and class, with definitions module and class, with definitions - infers type from string interpolation infers type from string interpolation - doesn't infer generic type without type argument inside generic doesn't infer generic type without type argument inside generic - declares as named tuple declares as named tuple -Crystal::Repl::Interpreter - autocast - autocasts symbol to enum autocasts symbol to enum - autocasts number literal to float autocasts number literal to float - autocasts float32 var to float64 (#12560) autocasts float32 var to float64 (#12560) - autocasts symbol to enum in multidispatch (#11782) autocasts symbol to enum in multidispatch (#11782) - autocasts integer var to float (#12560) autocasts integer var to float (#12560) - autocasts integer var to integer (#12560) autocasts integer var to integer (#12560) - autocasts symbol to enum in ivar initializer (#12216) autocasts symbol to enum in ivar initializer (#12216) - autocasts number literal to integer autocasts number literal to integer - autocasts int in multidispatch autocasts int in multidispatch -Semantic: ssa - types a var inside an if without previous definition types a var inside an if without previous definition - types a var inside an if without change in then types a var inside an if without change in then - types block with break doesn't infect initial vars types block with break doesn't infect initial vars - types if with return in else types if with return in else - types a var that is re-assigned in a while in next and used in condition types a var that is re-assigned in a while in next and used in condition - types a var that is declared in a while condition with break after re-assignment types a var that is declared in a while condition with break after re-assignment - types if with restricted type in then types if with restricted type in then - types if with restricted type in else types if with restricted type in else - types a var after begin ensure as having last type types a var after begin ensure as having last type - types block with break types block with break - doesn't error if same variable is used in multiple arguments of same typeof doesn't error if same variable is used in multiple arguments of same typeof - types a var that is re-assigned in a while condition types a var that is re-assigned in a while condition - errors if accessing variable declared inside typeof errors if accessing variable declared inside typeof - types a var inside an if with previous definition types a var inside an if with previous definition - types if with return in both branches types if with return in both branches - types if/else with var (bug) types if/else with var (bug) - types while with break types while with break - types while with break with new var types while with break with new var - types while with break doesn't infect initial vars types while with break doesn't infect initial vars - types a redefined variable types a redefined variable - types if with unreachable in then types if with unreachable in then - types if with break in then types if with break in then - types a var that is declared in a while with out types a var that is declared in a while with out - types while with next types while with next - types a var that is re-assigned in a while types a var that is re-assigned in a while - types a var that is re-assigned in a block types a var that is re-assigned in a block - types a var inside an if without definition in else types a var inside an if without definition in else - types re-assign inside while (bug) types re-assign inside while (bug) - types if with return in then types if with return in then - types re-assign inside if (bug) types re-assign inside if (bug) - doesn't change type to nilable inside if doesn't change type to nilable inside if - types a var inside an if without definition in then types a var inside an if without definition in then - types if with return in else with assign types if with return in else with assign - types a var that is re-assigned in a while and used in condition types a var that is re-assigned in a while and used in condition - types a var after begin ensure as having last type (2) types a var after begin ensure as having last type (2) - types a var with an if with nested if types a var with an if with nested if - types a var that is declared in a while types a var that is declared in a while - types a var that is declared in a while condition with break before re-assignment types a var that is declared in a while condition with break before re-assignment - doesn't error if same variable is declared in multiple typeofs doesn't error if same variable is declared in multiple typeofs - types if with return in then with assign types if with return in then with assign - types a var inside an if without change in else types a var inside an if without change in else - types block with next types block with next - types a var with an if but without change types a var with an if but without change - types if with next in then types if with next in then - types a var that is declared in a while condition types a var that is declared in a while condition - preserves type filters after block (bug) preserves type filters after block (bug) -Semantic: double splat - matches named args producing an empty double splat (#2678) matches named args producing an empty double splat (#2678) - errors missing argument with double splat errors missing argument with double splat - errors if duplicate keys on call side with two double splats errors if duplicate keys on call side with two double splats - double splats named argument into arguments (1) double splats named argument into arguments (1) - uses double splat restriction with concrete type uses double splat restriction with concrete type - uses restriction on double splat, doesn't match with empty named tuple uses restriction on double splat, doesn't match with empty named tuple - matches double splat with regular splat matches double splat with regular splat - uses double splat in new uses double splat in new - uses double splat restriction uses double splat restriction - uses restriction on double splat, doesn't match with empty named tuple (2) uses restriction on double splat, doesn't match with empty named tuple (2) - overloads based on double splat restriction overloads based on double splat restriction - uses restriction on double splat, means all types must be that type uses restriction on double splat, means all types must be that type - errors if duplicate keys on call side with double splat and named args errors if duplicate keys on call side with double splat and named args - matches double splat on method with named args matches double splat on method with named args - matches double splat on method with named args and regular args matches double splat on method with named args and regular args - double splats named argument into arguments (2) double splats named argument into arguments (2) - uses double splat restriction, matches empty uses double splat restriction, matches empty - matches double splat on method (empty) matches double splat on method (empty) -Code gen: class - reads other instance var reads other instance var - codegens recursive type codegens recursive type - codegens virtual class method codegens virtual class method - invokes class method inside instance method (#1119) invokes class method inside instance method (#1119) - uses number type var uses number type var - doesn't crash on #1216 doesn't crash on #1216 - notifies superclass recursively on inheritance (#576) notifies superclass recursively on inheritance (#576) - calls method on Class class calls method on Class class - runs instance variable initializer at the class level, for generic type runs instance variable initializer at the class level, for generic type - runs with nil instance var when inheriting runs with nil instance var when inheriting - reads a union type instance var (mixed union, first type) reads a union type instance var (mixed union, first type) - codegens singleton (#718) codegens singleton (#718) - reads a virtual type instance var reads a virtual type instance var - doesn't crash if not using undefined instance variable in superclass doesn't crash if not using undefined instance variable in superclass - assigns type to reference union type assigns type to reference union type - doesn't crash on instance variable assigned a proc, and never instantiated (#923) doesn't crash on instance variable assigned a proc, and never instantiated (#923) - makes .class always be a virtual type even if no subclasses makes .class always be a virtual type even if no subclasses - codegens instance var codegens instance var - can assign virtual metaclass to virtual metaclass (#3007) can assign virtual metaclass to virtual metaclass (#3007) - codegens method call of instance var codegens method call of instance var - builds generic class bug builds generic class bug - never considers read instance var as closure (#12181) never considers read instance var as closure (#12181) - codegens assignment of generic metaclasses, base is non-generic (1) (#10394) codegens assignment of generic metaclasses, base is non-generic (1) (#10394) - codegens class method codegens class method - does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) - gets class of virtual type gets class of virtual type - does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) - runs instance variable initializer at the class level runs instance variable initializer at the class level - reads a union type instance var (reference union, first type) reads a union type instance var (reference union, first type) - codegens virtual generic class instance metaclass (#3819) codegens virtual generic class instance metaclass (#3819) - resolves type declaration when accessing instance var (#348) resolves type declaration when accessing instance var (#348) - codegens class with recursive tuple to class (#4520) codegens class with recursive tuple to class (#4520) - transfers initializer from module to generic class transfers initializer from module to generic class - codegens virtual call that calls another method codegens virtual call that calls another method - doesn't crash on #1216 (reduced) doesn't crash on #1216 (reduced) - calls class method without self (2) calls class method without self (2) - codegens assignment of generic metaclasses (2) (#10394) codegens assignment of generic metaclasses (2) (#10394) - reads a union type instance var (mixed union, second type) reads a union type instance var (mixed union, second type) - codegens assignment of generic metaclasses (1) (#10394) codegens assignment of generic metaclasses (1) (#10394) - codegens assignment of generic metaclasses (3) (#10394) codegens assignment of generic metaclasses (3) (#10394) - does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) - works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) - transfers initializer from generic module to non-generic class transfers initializer from generic module to non-generic class - does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class - reads a union type instance var (reference union, second type) reads a union type instance var (reference union, second type) - doesn't skip false initializers (#3272) doesn't skip false initializers (#3272) - codegens initialize with instance var codegens initialize with instance var - calls class method without self calls class method without self - codegens call to same instance codegens call to same instance - allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope - runs with nilable instance var runs with nilable instance var - codegens method of class union including Int (#1476) codegens method of class union including Int (#1476) - codegens virtual method of generic class codegens virtual method of generic class - transfers initializer from generic module to generic class transfers initializer from generic module to generic class - doesn't skip zero initializers (#3272) doesn't skip zero initializers (#3272) - codegens virtual metaclass union bug (#2597) codegens virtual metaclass union bug (#2597) - allows initializing var with constant allows initializing var with constant - doesn't crash on abstract class never instantiated (#2840) doesn't crash on abstract class never instantiated (#2840) - can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) - allows using self in class scope allows using self in class scope - codegens bug #168 codegens bug #168 - codegens new which calls initialize codegens new which calls initialize - does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class - codegens method from another method without obj and accesses instance vars codegens method from another method without obj and accesses instance vars - works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) - codegens assignment of generic metaclasses, base is non-generic (2) (#10394) codegens assignment of generic metaclasses, base is non-generic (2) (#10394) - doesn't crash on #1216 with pointerof doesn't crash on #1216 with pointerof - codegens assignment of generic metaclasses (4) (#10394) codegens assignment of generic metaclasses (4) (#10394) - changes instance variable in method (ssa bug) changes instance variable in method (ssa bug) - allows fixing an instance variable's type allows fixing an instance variable's type -Code gen: magic constants - does __END_LINE__ in macro without block does __END_LINE__ in macro without block - does __DIR__ in macro does __DIR__ in macro - does __LINE__ in macro does __LINE__ in macro - does __FILE__ does __FILE__ - does __END_LINE__ without block does __END_LINE__ without block - does __FILE__ in macro does __FILE__ in macro - does __LINE__ when specifying one normal default arg does __LINE__ when specifying one normal default arg - does __LINE__ when specifying one middle argument does __LINE__ when specifying one middle argument - does __LINE__ when specifying one default arg with __FILE__ does __LINE__ when specifying one default arg with __FILE__ - does __LINE__ does __LINE__ - does __DIR__ does __DIR__ - does __END_LINE__ with block does __END_LINE__ with block - does __LINE__ with dispatch does __LINE__ with dispatch - does __END_LINE__ in macro with block does __END_LINE__ in macro with block -Crystal::Repl::Interpreter - blocks - interprets next inside block (union, through next) interprets next inside block (union, through next) - interprets yield return value interprets yield return value - yields different values to form a union yields different values to form a union - interprets break inside block (union, through normal flow) interprets break inside block (union, through normal flow) - interprets yield expressions interprets yield expressions - interprets next inside block interprets next inside block - interprets break inside block (union, through return) interprets break inside block (union, through return) - interprets simplest block interprets simplest block - interprets block with args that conflict with a local var interprets block with args that conflict with a local var - interprets yield inside def with arguments interprets yield inside def with arguments - interprets yield expression interprets yield expression - returns from block returns from block - caches method with captured block (#12276) caches method with captured block (#12276) - interprets yield with splat, less block arguments interprets yield with splat, less block arguments - interprets break inside block interprets break inside block - interprets yield with splat (1) interprets yield with splat (1) - clears block local variables when calling block clears block local variables when calling block - interprets yield with splat (2) interprets yield with splat (2) - interprets yield inside another block interprets yield inside another block - considers block arg without type as having NoReturn type (#12270) considers block arg without type as having NoReturn type (#12270) - interprets with ... yield interprets with ... yield - interprets block with args that conflict with a local var interprets block with args that conflict with a local var - interprets with ... yield with struct interprets with ... yield with struct - interprets next inside block (union, through normal exit) interprets next inside block (union, through normal exit) - clears block local variables when calling block (2) clears block local variables when calling block (2) - interprets block with splat interprets block with splat - discards yield expression discards yield expression - considers block arg without type as having NoReturn type (2) (#12270) considers block arg without type as having NoReturn type (2) (#12270) - counts with ... yield scope in block args bytesize (#12316) counts with ... yield scope in block args bytesize (#12316) - interprets yield with splat, block with splat interprets yield with splat, block with splat - captures non-closure block captures non-closure block - interprets with ... yield with extra arguments (#12296) interprets with ... yield with extra arguments (#12296) - casts yield expression to block var type (not block arg type) casts yield expression to block var type (not block arg type) - interprets break inside block (union, through break) interprets break inside block (union, through break) - interprets yield with splat, block with splat (#12227) interprets yield with splat, block with splat (#12227) - interprets block with multiple yields interprets block with multiple yields -Code gen: multi assign - supports 1 to n assignment, with splat on left-hand side (2) supports 1 to n assignment, with splat on left-hand side (2) - supports 1 to n assignment, splat is empty (3) supports 1 to n assignment, splat is empty (3) - supports 1 to n assignment, raises if out of bounds (1) supports 1 to n assignment, raises if out of bounds (1) supports 1 to n assignment, raises if out of bounds (1) supports 1 to n assignment, raises if out of bounds (1) supports 1 to n assignment, raises if out of bounds (1) supports 1 to n assignment, raises if out of bounds (1) supports 1 to n assignment, raises if out of bounds (1) supports 1 to n assignment, raises if out of bounds (1) supports 1 to n assignment, raises if out of bounds (1) supports 1 to n assignment, raises if out of bounds (1) - supports m to n assignment, with splat on left-hand side (3) supports m to n assignment, with splat on left-hand side (3) - without strict_multi_assign - doesn't raise if value size in 1 to n assignment doesn't match target count doesn't raise if value size in 1 to n assignment doesn't match target count doesn't raise if value size in 1 to n assignment doesn't match target count doesn't raise if value size in 1 to n assignment doesn't match target count doesn't raise if value size in 1 to n assignment doesn't match target count doesn't raise if value size in 1 to n assignment doesn't match target count doesn't raise if value size in 1 to n assignment doesn't match target count doesn't raise if value size in 1 to n assignment doesn't match target count doesn't raise if value size in 1 to n assignment doesn't match target count doesn't raise if value size in 1 to n assignment doesn't match target count - supports 1 to n assignment supports 1 to n assignment - supports m to n assignment, splat is empty tuple (1) supports m to n assignment, splat is empty tuple (1) - supports 1 to n assignment, with splat on left-hand side (3) supports 1 to n assignment, with splat on left-hand side (3) - strict_multi_assign - raises if value size in 1 to n assignment doesn't match target count raises if value size in 1 to n assignment doesn't match target count raises if value size in 1 to n assignment doesn't match target count raises if value size in 1 to n assignment doesn't match target count raises if value size in 1 to n assignment doesn't match target count raises if value size in 1 to n assignment doesn't match target count raises if value size in 1 to n assignment doesn't match target count raises if value size in 1 to n assignment doesn't match target count raises if value size in 1 to n assignment doesn't match target count raises if value size in 1 to n assignment doesn't match target count - supports 1 to n assignment supports 1 to n assignment supports 1 to n assignment supports 1 to n assignment supports 1 to n assignment supports 1 to n assignment supports 1 to n assignment supports 1 to n assignment supports 1 to n assignment supports 1 to n assignment - supports m to n assignment, splat is empty tuple (3) supports m to n assignment, splat is empty tuple (3) - supports m to n assignment, splat is empty tuple (2) supports m to n assignment, splat is empty tuple (2) - supports 1 to n assignment, splat is empty (1) supports 1 to n assignment, splat is empty (1) supports 1 to n assignment, splat is empty (1) supports 1 to n assignment, splat is empty (1) supports 1 to n assignment, splat is empty (1) supports 1 to n assignment, splat is empty (1) supports 1 to n assignment, splat is empty (1) supports 1 to n assignment, splat is empty (1) supports 1 to n assignment, splat is empty (1) supports 1 to n assignment, splat is empty (1) - supports m to n assignment, with splat on left-hand side (1) supports m to n assignment, with splat on left-hand side (1) - supports m to n assignment, with splat on left-hand side (2) supports m to n assignment, with splat on left-hand side (2) - supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) - supports 1 to n assignment, splat is empty (2) supports 1 to n assignment, splat is empty (2) - supports 1 to n assignment, raises if too short supports 1 to n assignment, raises if too short supports 1 to n assignment, raises if too short supports 1 to n assignment, raises if too short supports 1 to n assignment, raises if too short supports 1 to n assignment, raises if too short supports 1 to n assignment, raises if too short supports 1 to n assignment, raises if too short supports 1 to n assignment, raises if too short supports 1 to n assignment, raises if too short - supports n to n assignment supports n to n assignment - supports 1 to n assignment, with splat on left-hand side (1) supports 1 to n assignment, with splat on left-hand side (1) supports 1 to n assignment, with splat on left-hand side (1) supports 1 to n assignment, with splat on left-hand side (1) supports 1 to n assignment, with splat on left-hand side (1) supports 1 to n assignment, with splat on left-hand side (1) supports 1 to n assignment, with splat on left-hand side (1) supports 1 to n assignment, with splat on left-hand side (1) supports 1 to n assignment, with splat on left-hand side (1) supports 1 to n assignment, with splat on left-hand side (1) -Semantic: require - file not found - relative wildcard relative wildcard - wildcard wildcard - relative require relative require - require require -Crystal::Doc::Type - #class_methods - sorts operators first sorts operators first - doesn't show types for alias type doesn't show types for alias type - finds construct when searching class method (#8095) finds construct when searching class method (#8095) - ASTNode has no superclass ASTNode has no superclass - #instance_methods - sorts operators first sorts operators first - ASTNode has no ancestors ASTNode has no ancestors - #macros - sorts operators first sorts operators first - #node_to_html - shows generic path with unnecessary colons shows generic path with unnecessary colons - shows relative generic shows relative generic - shows relative path shows relative path - shows named tuples shows named tuples - shows generic path with necessary colons shows generic path with necessary colons - shows tuples shows tuples -Crystal::Doc::Generator - #must_include_toplevel? - returns true if program has macro returns true if program has macro - returns false if program has macro which is defined in other place returns false if program has macro which is defined in other place - returns false if program has constant which is defined in other place returns false if program has constant which is defined in other place - returns false if program has nothing returns false if program has nothing - returns true if program has method returns true if program has method - returns false if program has method which is defined in other place returns false if program has method which is defined in other place - returns true if program has constant returns true if program has constant - #formatted_summary - with a Experimental annotation, and no docs - should generate just the Experimental tag should generate just the Experimental tag - should generate the first line should generate the first line - with no annotation, and no docs - should generate nothing should generate nothing - should exclude whitespace before the summary line should exclude whitespace before the summary line - with a Deprecated annotation, and no docs - should generate just the Deprecated tag should generate just the Deprecated tag - with a Experimental annotation, and docs - should generate both the docs and Experimental tag should generate both the docs and Experimental tag - with a Deprecated annotation, and docs - should generate both the docs and Deprecated tag should generate both the docs and Deprecated tag - should generate the first sentence should generate the first sentence - generates sitemap generates sitemap - #formatted_doc - with a Experimental annotation, and docs - should generate both the docs and Experimental tag should generate both the docs and Experimental tag - with no annotation, and no docs - should generate nothing should generate nothing - with a Experimental annotation, and no docs - should generate just the Experimental tag should generate just the Experimental tag - should generate the full document should generate the full document - with a Deprecated annotation, and no docs - should generate just the Deprecated tag should generate just the Deprecated tag - with a Deprecated annotation, and docs - should generate both the docs and Deprecated tag should generate both the docs and Deprecated tag - should generate the full document should generate the full document - #collect_constants - returns empty array when constants are private returns empty array when constants are private - crystal repo - inserts pseudo methods inserts pseudo methods -Semantic: closure - does assign all types to metavar if closured but only assigned to once in a loop through block does assign all types to metavar if closured but only assigned to once in a loop through block - correctly captures type of closured block arg correctly captures type of closured block arg - marks method as self closured if instance var is read marks method as self closured if instance var is read - is considered as closure if assigned once but comes from a method arg is considered as closure if assigned once but comes from a method arg - says can't send closure to C with captured block says can't send closure to C with captured block - errors if sending closured proc pointer to C (2) errors if sending closured proc pointer to C (2) - doesn't mark var as closured if only used in two block doesn't mark var as closured if only used in two block - marks method as self closured if implicit self call is made marks method as self closured if implicit self call is made - does assign all types to metavar if closured but only assigned to once in a loop does assign all types to metavar if closured but only assigned to once in a loop - doesn't closure typeof local var doesn't closure typeof local var - does assign all types to metavar if closured but only assigned to once in a loop through captured block does assign all types to metavar if closured but only assigned to once in a loop through captured block - doesn't mark self var as closured, but marks method as self closured doesn't mark self var as closured, but marks method as self closured - errors if sending closured proc pointer to C (1.2) errors if sending closured proc pointer to C (1.2) - errors if forwarding block param doesn't match input type errors if forwarding block param doesn't match input type - correctly detects previous var as closured (#5609) correctly detects previous var as closured (#5609) - errors if giving more block args when transforming block to proc literal errors if giving more block args when transforming block to proc literal - marks variable as closured in block marks variable as closured in block - marks method as self closured if used inside a block marks method as self closured if used inside a block - gives error when doing yield inside proc literal gives error when doing yield inside proc literal - allows giving less block args when transforming block to proc literal allows giving less block args when transforming block to proc literal - gives error when doing yield inside proc literal gives error when doing yield inside proc literal - unifies types of closured var (2) unifies types of closured var (2) - marks outer fun as closured when using self marks outer fun as closured when using self - passes #227 passes #227 - transforms block to proc literal with void type transforms block to proc literal with void type - errors if sending closured proc pointer to C (3) errors if sending closured proc pointer to C (3) - marks variable as closured in program on assign marks variable as closured in program on assign - marks variable as closured in program marks variable as closured in program - marks variable as closured in def marks variable as closured in def - doesn't closure typeof instance var (#9479) doesn't closure typeof instance var (#9479) - marks outer fun inside a block as closured marks outer fun inside a block as closured - doesn't assign all types to metavar if closured but only assigned to once doesn't assign all types to metavar if closured but only assigned to once - unifies types of closured var (1) unifies types of closured var (1) - doesn't assign all types to metavar if closured but declared inside block and never re-assigned doesn't assign all types to metavar if closured but declared inside block and never re-assigned - doesn't assign all types to metavar if closured but declared inside block and re-assigned inside the same context before the closure doesn't assign all types to metavar if closured but declared inside block and re-assigned inside the same context before the closure - transforms block to proc literal with free var transforms block to proc literal with free var - errors when transforming block to proc literal if type mismatch errors when transforming block to proc literal if type mismatch - marks method as self closured if explicit self call is made marks method as self closured if explicit self call is made - errors if sending closured proc literal to C errors if sending closured proc literal to C - doesn't mark var as closured if only used in block doesn't mark var as closured if only used in block - marks method as self closured if instance var is written marks method as self closured if instance var is written - errors if forwarding block param doesn't match input type size errors if forwarding block param doesn't match input type size - says can't send closure to C with new notation says can't send closure to C with new notation - can use fun typedef as block type can use fun typedef as block type - errors if sending closured proc pointer to C (1) errors if sending closured proc pointer to C (1) - marks variable as closured inside block in fun marks variable as closured inside block in fun - lookups return type in correct scope lookups return type in correct scope - doesn't crash for non-existing variable (#3789) doesn't crash for non-existing variable (#3789) - transforms block to proc literal transforms block to proc literal - considers var as closure-readonly if it was assigned multiple times before it was closured considers var as closure-readonly if it was assigned multiple times before it was closured - transforms block to proc literal without parameters transforms block to proc literal without parameters - allows passing block as proc literal to new and to initialize allows passing block as proc literal to new and to initialize -Normalize: until - normalizes until normalizes until -Semantic: recursive struct check - errors on recursive struct through tuple errors on recursive struct through tuple - errors on recursive struct errors on recursive struct - errors on recursive generic struct inside module errors on recursive generic struct inside module - detects recursive struct through module detects recursive struct through module - errors on recursive struct inside module errors on recursive struct inside module - errors on private recursive type errors on private recursive type - detects recursive struct through inheritance (#3071) detects recursive struct through inheritance (#3071) - detects recursive generic struct through module (#4720) detects recursive generic struct through module (#4720) - detects recursive generic struct through generic module (#4720) detects recursive generic struct through generic module (#4720) - errors on recursive abstract struct through module (#11384) errors on recursive abstract struct through module (#11384) - errors on mutually recursive struct errors on mutually recursive struct - errors on recursive struct through recursive alias (#4454) (#4455) errors on recursive struct through recursive alias (#4454) (#4455) - errors on recursive struct through named tuple errors on recursive struct through named tuple + mutates through pointer (2) mutates through pointer (2) + does ReadInstanceVar with wants_struct_pointer does ReadInstanceVar with wants_struct_pointer + inlines call that returns self (2) inlines call that returns self (2) +Code gen: struct + builds struct setter with fun type (1) builds struct setter with fun type (1) + builds struct setter with fun type (2) builds struct setter with fun type (2) + automatically converts numeric union type in struct field assignment automatically converts numeric union type in struct field assignment + codegens struct property setter via pointer codegens struct property setter via pointer + codegens struct set inside struct codegens struct set inside struct + can access instance var from the outside (#1092) can access instance var from the outside (#1092) + sets instance var to proc sets instance var to proc sets instance var to proc sets instance var to proc sets instance var to proc sets instance var to proc sets instance var to proc sets instance var to proc sets instance var to proc sets instance var to proc + passes struct to method (2) passes struct to method (2) + codegens struct property default value codegens struct property default value + codegens passing pointerof(struct) to fun codegens passing pointerof(struct) to fun + automatically converts numeric type in struct field assignment automatically converts numeric type in struct field assignment + passes struct to method (1) passes struct to method (1) + yields struct via -> yields struct via -> + codegens struct get inside struct codegens struct get inside struct + does to_s does to_s does to_s does to_s does to_s does to_s does to_s does to_s does to_s does to_s + automatically converts nil to pointer automatically converts nil to pointer + codegens union inside struct codegens union inside struct + codegens set struct value with constant codegens set struct value with constant + codegens struct property setter via pointer codegens struct property setter via pointer + codegens assign struct to union codegens assign struct to union + codegens pointer malloc of struct codegens pointer malloc of struct + automatically converts by invoking to_unsafe automatically converts by invoking to_unsafe + codegens struct property setter codegens struct property setter + allows using named arguments for new allows using named arguments for new + codegens struct access with -> and then . codegens struct access with -> and then . + can access member of uninitialized struct behind type (#8774) can access member of uninitialized struct behind type (#8774) +Code gen: op assign + evaluates exps once (#3398) evaluates exps once (#3398) + evaluates exps once, [] (#3398) evaluates exps once, [] (#3398) +Semantic: offsetof + errors on offsetof element of uninstantiated generic type errors on offsetof element of uninstantiated generic type + gives error if using offsetof on non-Tuples with an index gives error if using offsetof on non-Tuples with an index + errors on typeof inside offsetof expression errors on typeof inside offsetof expression + errors on undefined instance variable errors on undefined instance variable + types offsetof types offsetof + gives error if using offsetof on something that can't have instance variables gives error if using offsetof on something that can't have instance variables + can be used with generic types can be used with generic types + can be used with classes can be used with classes + gives error if using offsetof on Tuples with instance variables gives error if using offsetof on Tuples with instance variables + gives error if using offsetof on something that's neither a class, a struct nor a Tuple gives error if using offsetof on something that's neither a class, a struct nor a Tuple + gives error if using offsetof on Tuples with indexes greater than tuple size gives error if using offsetof on Tuples with indexes greater than tuple size + gives error if using offsetof on Tuples with negative indexes gives error if using offsetof on Tuples with negative indexes Semantic: annotation - errors when annotate instance variable in subclass errors when annotate instance variable in subclass - #annotation - errors if annotation doesn't point to an annotation type errors if annotation doesn't point to an annotation type - finds annotation in class finds annotation in class - finds annotation on an restricted method block arg finds annotation on an restricted method block arg - errors if using invalid annotation on fun errors if using invalid annotation on fun - can't find annotation on def, when other annotations are present can't find annotation on def, when other annotations are present - uses annotation value, positional uses annotation value, positional - finds annotation in instance var (declaration) finds annotation in instance var (declaration) - finds annotation in module finds annotation in module - uses annotation value, keyword uses annotation value, keyword - finds annotation in generic parent (#7885) finds annotation in generic parent (#7885) - doesn't carry link annotation from lib to fun doesn't carry link annotation from lib to fun - finds annotation in instance var (declaration, generic) finds annotation in instance var (declaration, generic) - finds annotation on method arg finds annotation on method arg - can't find annotation on def can't find annotation on def - finds annotation in instance var (assignment) finds annotation in instance var (assignment) - finds annotation in struct finds annotation in struct - errors if using annotation other than ThreadLocal for class vars errors if using annotation other than ThreadLocal for class vars - can't find annotation in instance var can't find annotation in instance var - can't find annotation in module can't find annotation in module - finds annotation on method double splat arg finds annotation on method double splat arg - can't find annotation in instance var, when other annotations are present can't find annotation in instance var, when other annotations are present - finds annotation on method splat arg finds annotation on method splat arg - finds annotation in enum finds annotation in enum - overrides annotation value in type overrides annotation value in type - can't find annotation in module, when other annotations are present can't find annotation in module, when other annotations are present - adds annotation on def adds annotation on def - overrides annotation in instance var overrides annotation in instance var - finds annotation in lib finds annotation in lib - errors if annotation doesn't exist errors if annotation doesn't exist - errors if wanting to add type inside annotation (2) (#8614) errors if wanting to add type inside annotation (2) (#8614) - doesn't bleed annotation from class into class variable (#8314) doesn't bleed annotation from class into class variable (#8314) - errors if wanting to add type inside annotation (1) (#8614) errors if wanting to add type inside annotation (1) (#8614) #annotations all types finds annotations on a module finds annotations on a module - finds annotations on a class finds annotations on a class - finds annotations on a enum finds annotations on a enum - finds annotations in instance var (declaration) finds annotations in instance var (declaration) - returns an empty array if there are none defined returns an empty array if there are none defined - finds annotations on a struct finds annotations on a struct finds annotations on a lib finds annotations on a lib - find annotations on method parameters find annotations on method parameters + finds annotations on a struct finds annotations on a struct + finds annotations on a enum finds annotations on a enum finds annotations in generic parent (#7885) finds annotations in generic parent (#7885) adds annotations on def adds annotations on def finds annotations in instance var (declaration, generic) finds annotations in instance var (declaration, generic) - of a specific type - finds annotations in struct finds annotations in struct - can't find annotations in instance var, when other annotations are present can't find annotations in instance var, when other annotations are present - overrides annotations value in type overrides annotations value in type - uses annotations value, positional uses annotations value, positional find annotations on method parameters find annotations on method parameters - finds annotations in enum finds annotations in enum returns an empty array if there are none defined returns an empty array if there are none defined - adds annotations on def adds annotations on def + finds annotations on a class finds annotations on a class finds annotations in instance var (declaration) finds annotations in instance var (declaration) - finds annotations in instance var (declaration, generic) finds annotations in instance var (declaration, generic) - can't find annotations on def can't find annotations on def + of a specific type + returns an empty array if there are none defined returns an empty array if there are none defined + finds annotations in instance var (declaration) finds annotations in instance var (declaration) + overrides annotations value in type overrides annotations value in type + finds annotations on a module finds annotations on a module finds annotations in lib finds annotations in lib can't find annotations on def, when other annotations are present can't find annotations on def, when other annotations are present - can't find annotations in instance var can't find annotations in instance var - finds annotations in generic parent (#7885) finds annotations in generic parent (#7885) + finds annotations in instance var (declaration, generic) finds annotations in instance var (declaration, generic) collects annotations values in type collects annotations values in type + finds annotations in generic parent (#7885) finds annotations in generic parent (#7885) + adds annotations on def adds annotations on def + finds annotations in enum finds annotations in enum + uses annotations value, positional uses annotations value, positional uses annotations value, keyword uses annotations value, keyword finds annotations in class finds annotations in class - finds annotations on a module finds annotations on a module - declares annotation declares annotation + finds annotations in struct finds annotations in struct + can't find annotations in instance var can't find annotations in instance var + can't find annotations on def can't find annotations on def + can't find annotations in instance var, when other annotations are present can't find annotations in instance var, when other annotations are present + find annotations on method parameters find annotations on method parameters + errors when annotate instance variable in subclass errors when annotate instance variable in subclass arguments - #named_args - returns an empty NamedTupleLiteral if there are none defined returns an empty NamedTupleLiteral if there are none defined - returns a NamedTupleLiteral if there are named arguments defined returns a NamedTupleLiteral if there are named arguments defined - returns a correctly with named and positional args returns a correctly with named and positional args #args returns an empty TupleLiteral if there are none defined returns an empty TupleLiteral if there are none defined returns a TupleLiteral if there are positional arguments defined returns a TupleLiteral if there are positional arguments defined -Semantic: responds_to? - restricts virtual generic module to including types (#8334) restricts virtual generic module to including types (#8334) - restricts in assignment restricts in assignment - restricts type inside if scope 1 restricts type inside if scope 1 - restricts virtual generic superclass to subtypes restricts virtual generic superclass to subtypes - is bool is bool - restricts other types inside if else restricts other types inside if else -Semantic: abstract def - errors if implementation has more keyword arguments errors if implementation has more keyword arguments - doesn't error if implementation has more keyword arguments with default values doesn't error if implementation has more keyword arguments with default values - doesn't error if implements with parent module doesn't error if implements with parent module - doesn't error if abstract method is implemented by including class doesn't error if abstract method is implemented by including class - doesn't error with splat doesn't error with splat - errors if different return type errors if different return type - implements through extend (considers original type for generic lookup) (#8096) implements through extend (considers original type for generic lookup) (#8096) - doesn't error if abstract method with args is implemented by subclass (with one default arg) doesn't error if abstract method with args is implemented by subclass (with one default arg) - errors if abstract method with arguments is not implemented by subclass (block difference) errors if abstract method with arguments is not implemented by subclass (block difference) - doesn't error if implementation have default value doesn't error if implementation have default value - doesn't error if implements with included module doesn't error if implements with included module - gives correct error when no overload matches, when an abstract method is implemented (#1406) gives correct error when no overload matches, when an abstract method is implemented (#1406) - double splat must match keyword argument type double splat must match keyword argument type - allow splat instead of keyword argument allow splat instead of keyword argument - can return a more specific type can return a more specific type - doesn't error if implementation have keyword arguments in different order doesn't error if implementation have keyword arguments in different order - allow double splat when abstract doesn't have it allow double splat when abstract doesn't have it - errors if implementation doesn't have a splat errors if implementation doesn't have a splat - extra keyword arguments must have compatible type to double splat extra keyword arguments must have compatible type to double splat - works on abstract method on abstract class works on abstract method on abstract class - allow double splat argument allow double splat argument - matches instantiated generic module matches instantiated generic module - implementation is not inherited from supertype - generic module generic module - generic class generic class - nongeneric class nongeneric class - nongeneric module nongeneric module - matches generic types matches generic types - errors if abstract method with arguments is not implemented by subclass (wrong type) errors if abstract method with arguments is not implemented by subclass (wrong type) - implements through extend (considers original type for generic lookup) (2) (#8096) implements through extend (considers original type for generic lookup) (2) (#8096) - errors if implementation misses the double splat errors if implementation misses the double splat - errors if abstract method with arguments is not implemented by subclass (wrong number of arguments) errors if abstract method with arguments is not implemented by subclass (wrong number of arguments) - errors if missing return type errors if missing return type - errors if abstract method of private type is not implemented by including class errors if abstract method of private type is not implemented by including class - matches generic return type matches generic return type - errors if abstract method is not implemented by subclass errors if abstract method is not implemented by subclass - errors if abstract method of private type is not implemented by subclass errors if abstract method of private type is not implemented by subclass - errors if using abstract def on non-abstract class errors if using abstract def on non-abstract class - doesn't error if implements with generic parent class instance doesn't error if implements with generic parent class instance - error shows full signature of block parameter error shows full signature of block parameter - doesn't error if abstract method is not implemented by including module doesn't error if abstract method is not implemented by including module - doesn't error if free var in arg restriction shadows another type (#10153) doesn't error if free var in arg restriction shadows another type (#10153) - matches instantiated generic types matches instantiated generic types - can implement even if yield comes later in macro code can implement even if yield comes later in macro code - errors if double splat type doesn't match errors if double splat type doesn't match - errors if implementation adds type restriction errors if implementation adds type restriction - errors if implementation doesn't have keyword arguments errors if implementation doesn't have keyword arguments - doesn't error if implementation matches keyword argument doesn't error if implementation matches keyword argument - doesn't error if implements with parent class doesn't error if implements with parent class - errors if implementation doesn't have default value errors if implementation doesn't have default value - doesn't error if abstract method with args is implemented by subclass (restriction -> no restriction) doesn't error if abstract method with args is implemented by subclass (restriction -> no restriction) - matches generic module matches generic module - errors if implementation doesn't match keyword argument type errors if implementation doesn't match keyword argument type - errors if implementation doesn't have a keyword argument errors if implementation doesn't have a keyword argument - doesn't error if abstract method with args is implemented by subclass doesn't error if abstract method with args is implemented by subclass - errors if abstract method is not implemented by subclass (nested in module) errors if abstract method is not implemented by subclass (nested in module) - errors if abstract method is not implemented by including class errors if abstract method is not implemented by including class - errors if can't find child return type errors if can't find child return type - works on abstract def on sub-subclass works on abstract def on sub-subclass - errors if can't find parent return type errors if can't find parent return type - errors if implementation doesn't have the same default value errors if implementation doesn't have the same default value - matches generic module (a bit more complex) matches generic module (a bit more complex) - doesn't error if abstract method with args is implemented by subclass (don't check subclasses) doesn't error if abstract method with args is implemented by subclass (don't check subclasses) - errors if using abstract def on subclass that also defines it as abstract errors if using abstract def on subclass that also defines it as abstract - can implement by block signature even if yield comes later in macro code can implement by block signature even if yield comes later in macro code - errors if abstract method with arguments is not implemented by subclass errors if abstract method with arguments is not implemented by subclass - errors if keyword argument doesn't have the same default value errors if keyword argument doesn't have the same default value - finds implements in included module in disorder (#4052) finds implements in included module in disorder (#4052) - doesn't error with splat and args with default value doesn't error with splat and args with default value - errors if implementation doesn't match splat type errors if implementation doesn't match splat type - allows arguments to be collapsed into splat allows arguments to be collapsed into splat - doesn't error if abstract method is implemented by subclass doesn't error if abstract method is implemented by subclass - errors if missing a return type in subclass of generic subclass errors if missing a return type in subclass of generic subclass - errors if using abstract def on subclass errors if using abstract def on subclass - errors if abstract method is not implemented by subclass of subclass errors if abstract method is not implemented by subclass of subclass - doesn't error if implements a NoReturn param doesn't error if implements a NoReturn param - errors if using abstract def on metaclass errors if using abstract def on metaclass - doesn't error if implements with generic included module instance doesn't error if implements with generic included module instance - doesn't error if abstract method is implemented by subclass via module inclusion doesn't error if abstract method is implemented by subclass via module inclusion + #named_args + returns a NamedTupleLiteral if there are named arguments defined returns a NamedTupleLiteral if there are named arguments defined + returns an empty NamedTupleLiteral if there are none defined returns an empty NamedTupleLiteral if there are none defined + returns a correctly with named and positional args returns a correctly with named and positional args + declares annotation declares annotation + errors if wanting to add type inside annotation (2) (#8614) errors if wanting to add type inside annotation (2) (#8614) + doesn't bleed annotation from class into class variable (#8314) doesn't bleed annotation from class into class variable (#8314) + #annotation + finds annotation on method arg finds annotation on method arg + finds annotation in enum finds annotation in enum + finds annotation on method double splat arg finds annotation on method double splat arg + finds annotation in class finds annotation in class + finds annotation in generic parent (#7885) finds annotation in generic parent (#7885) + can't find annotation in instance var, when other annotations are present can't find annotation in instance var, when other annotations are present + finds annotation in module finds annotation in module + can't find annotation on def, when other annotations are present can't find annotation on def, when other annotations are present + can't find annotation in module can't find annotation in module + finds annotation in lib finds annotation in lib + errors if using annotation other than ThreadLocal for class vars errors if using annotation other than ThreadLocal for class vars + doesn't carry link annotation from lib to fun doesn't carry link annotation from lib to fun + finds annotation in instance var (assignment) finds annotation in instance var (assignment) + finds annotation in instance var (declaration, generic) finds annotation in instance var (declaration, generic) + adds annotation on def adds annotation on def + errors if annotation doesn't exist errors if annotation doesn't exist + errors if using invalid annotation on fun errors if using invalid annotation on fun + uses annotation value, positional uses annotation value, positional + finds annotation on an restricted method block arg finds annotation on an restricted method block arg + finds annotation in instance var (declaration) finds annotation in instance var (declaration) + finds annotation in struct finds annotation in struct + uses annotation value, keyword uses annotation value, keyword + overrides annotation value in type overrides annotation value in type + overrides annotation in instance var overrides annotation in instance var + can't find annotation in module, when other annotations are present can't find annotation in module, when other annotations are present + can't find annotation on def can't find annotation on def + errors if annotation doesn't point to an annotation type errors if annotation doesn't point to an annotation type + finds annotation on method splat arg finds annotation on method splat arg + can't find annotation in instance var can't find annotation in instance var + errors if wanting to add type inside annotation (1) (#8614) errors if wanting to add type inside annotation (1) (#8614) +Semantic: exception + types var as nilable if previously nilable (1) types var as nilable if previously nilable (1) + gets a non-nilable type if all rescue are unreachable (#8751) gets a non-nilable type if all rescue are unreachable (#8751) + correctly types #1988 correctly types #1988 + marks method calling method that raises as raises marks method calling method that raises as raises + says syntax error on "begin; else; 1; end" says syntax error on "begin; else; 1; end" + doesn't crash on break inside rescue, in while (#2441) doesn't crash on break inside rescue, in while (#2441) + can't use break inside block inside ensure (#4470) can't use break inside block inside ensure (#4470) + type union with empty main block type union with empty main block + types a var after begin rescue as having all possible types and nil in begin if read (2) types a var after begin rescue as having all possible types and nil in begin if read (2) + doesn't infect type to variable before handler (#4002) doesn't infect type to variable before handler (#4002) + marks method that calls another method that raises as raises, recursively marks method that calls another method that raises as raises, recursively + doesn't type instance variable as nilable if assigned inside an exception handler after being assigned doesn't type instance variable as nilable if assigned inside an exception handler after being assigned + transform nodes in else block transform nodes in else block + can't use break inside while inside ensure (#4470) can't use break inside while inside ensure (#4470) + errors if caught exception is not a subclass of Exception without var errors if caught exception is not a subclass of Exception without var + says syntax error on "begin; rescue ex; rescue ex : Foo; end; ex" says syntax error on "begin; rescue ex; rescue ex : Foo; end; ex" + assigns var inside ensure (2) (#3919) assigns var inside ensure (2) (#3919) + types var as nilable if previously nilable (2) types var as nilable if previously nilable (2) + types exception var with no types types exception var with no types + errors if caught exception is not a subclass of Exception errors if caught exception is not a subclass of Exception + marks fun as raises marks fun as raises + can't return from ensure (#4470) can't return from ensure (#4470) + shadows local variable (1) shadows local variable (1) + types a var after begin rescue as having all possible types in begin and rescue types a var after begin rescue as having all possible types in begin and rescue + types var as not nil if defined inside begin and defined inside rescue types var as not nil if defined inside begin and defined inside rescue + types a var after begin rescue as having all possible types in begin and rescue (2) types a var after begin rescue as having all possible types in begin and rescue (2) + types code with abstract exception that delegates method types code with abstract exception that delegates method + correctly types variables inside conditional inside exception handler with no-return rescue (#8012) correctly types variables inside conditional inside exception handler with no-return rescue (#8012) + doesn't consider vars as nilable inside else (#610) doesn't consider vars as nilable inside else (#610) + detects reading nil-if-read variable after exception handler (#4723) detects reading nil-if-read variable after exception handler (#4723) + can use break inside while inside ensure (#4470) can use break inside while inside ensure (#4470) + can't return from while inside ensure (#4470) can't return from while inside ensure (#4470) + marks proc literal as raises marks proc literal as raises + says syntax error on "begin; rescue ex; rescue; end; ex" says syntax error on "begin; rescue ex; rescue; end; ex" + marks def as raises marks def as raises + marks method calling lib fun that raises as raises marks method calling lib fun that raises as raises + can use break inside block inside ensure (#4470) can use break inside block inside ensure (#4470) + can't return from block inside ensure (#4470) can't return from block inside ensure (#4470) + types var as nilable inside ensure (1) types var as nilable inside ensure (1) + can use next inside block inside ensure (#4470) can use next inside block inside ensure (#4470) + assigns var inside ensure (1) (#3919) assigns var inside ensure (1) (#3919) + types var as nilable inside ensure (2) types var as nilable inside ensure (2) + types instance variable as nilable if assigned inside an exception handler (#1845) types instance variable as nilable if assigned inside an exception handler (#1845) + types a var after begin rescue with no-return in rescue types a var after begin rescue with no-return in rescue + can use next inside while inside ensure (#4470) can use next inside while inside ensure (#4470) + type for exception handler for explicit types type for exception handler for explicit types + type is union of main and rescue blocks type is union of main and rescue blocks + types a var after rescue as being nilable types a var after rescue as being nilable + remains nilable after rescue remains nilable after rescue + types exception with type types exception with type + type union with empty rescue block type union with empty rescue block + marks instance variable as nilable if assigned inside rescue inside initialize marks instance variable as nilable if assigned inside rescue inside initialize + correctly types variable assigned inside nested exception handler (#9769) correctly types variable assigned inside nested exception handler (#9769) + can't use next inside block inside ensure (#4470) can't use next inside block inside ensure (#4470) + types var assignment inside block inside exception handler (#3324) types var assignment inside block inside exception handler (#3324) + can't use next inside while inside ensure (#4470) can't use next inside while inside ensure (#4470) +Code gen: regex literal spec + works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) Crystal::Repl::Interpreter - pointers - interprets pointer realloc wrapper interprets pointer realloc wrapper - interprets pointer add interprets pointer add - pointerof class var pointerof class var - interprets pointer set and get (union type, setter value) interprets pointer set and get (union type, setter value) - discards pointer new discards pointer new - pointerof instance var pointerof instance var - interprets pointer realloc interprets pointer realloc - discards pointerof discards pointerof - discards pointer add discards pointer add - interprets pointer set and get (int) interprets pointer set and get (int) - discards pointer malloc discards pointer malloc - interprets pointer set and get (union type) interprets pointer set and get (union type) - discards pointer diff discards pointer diff - interprets pointerof, mutates pointer, read var interprets pointerof, mutates pointer, read var - interprets pointer diff interprets pointer diff - interprets pointerof, mutates var, read pointer interprets pointerof, mutates var, read pointer - discards pointer realloc discards pointer realloc - pointerof read `StaticArray#@buffer` (2) pointerof read `StaticArray#@buffer` (2) - interprets nilable pointer truthiness interprets nilable pointer truthiness - pointerof read `StaticArray#@buffer` (1) pointerof read `StaticArray#@buffer` (1) - interprets pointer diff, negative interprets pointer diff, negative - interprets pointer new and pointer address interprets pointer new and pointer address - discards pointer set discards pointer set - interprets pointerof and mutates memory (there are more variables) interprets pointerof and mutates memory (there are more variables) - interprets pointer set and get (bool) interprets pointer set and get (bool) - discards pointer get discards pointer get - pointerof read instance var pointerof read instance var - interprets pointer set and get (clear stack) interprets pointer set and get (clear stack) -Codegen: responds_to? - codegens responds_to? true for simple type codegens responds_to? true for simple type - codegens responds_to? with generic class (2) codegens responds_to? with generic class (2) - codegens responds_to? with union gives true codegens responds_to? with union gives true - works with generic virtual module (1) works with generic virtual module (1) - codegens responds_to? false for simple type codegens responds_to? false for simple type - works with generic virtual superclass (2) works with generic virtual superclass (2) - codegens responds_to? with nilable gives false because other type 2 codegens responds_to? with nilable gives false because other type 2 - works with two virtual types works with two virtual types - codegens responds_to? with union gives false codegens responds_to? with union gives false - codegens responds_to? with generic class (1) codegens responds_to? with generic class (1) - works with generic virtual module (2) (#8334) works with generic virtual module (2) (#8334) - codegens responds_to? with nilable gives false because other type 1 codegens responds_to? with nilable gives false because other type 1 - doesn't error if result is discarded (#14113) doesn't error if result is discarded (#14113) - codegens responds_to? with nilable gives true codegens responds_to? with nilable gives true - does for generic instance type metaclass (#4353) does for generic instance type metaclass (#4353) - works with virtual type works with virtual type - works with virtual class type (2) (#1926) works with virtual class type (2) (#1926) - works with virtual class type (1) (#1926) works with virtual class type (1) (#1926) - works with module works with module - works with generic virtual superclass (1) works with generic virtual superclass (1) + overflow + conversion + overlows on -1_i16.to_u16 overlows on -1_i16.to_u16 + overlows on -1_i64.to_u32 overlows on -1_i64.to_u32 + overlows on -1.to_u64 overlows on -1.to_u64 + overlows on -1_i8.to_u16 overlows on -1_i8.to_u16 + overlows on 2147483648_u64.to_i32 overlows on 2147483648_u64.to_i32 + overlows on -1_i16.to_u64 overlows on -1_i16.to_u64 + overlows on 128_f64.to_i8 overlows on 128_f64.to_i8 + overlows on 128_u32.to_i8 overlows on 128_u32.to_i8 + overlows on 128_u8.to_i8 overlows on 128_u8.to_i8 + overlows on 256_f64.to_u8 overlows on 256_f64.to_u8 + overlows on -1_i64.to_u64 overlows on -1_i64.to_u64 + overlows on 4294967296_f64.to_u32 overlows on 4294967296_f64.to_u32 + overlows on 32768_f32.to_i16 overlows on 32768_f32.to_i16 + overlows on 32768_f64.to_i16 overlows on 32768_f64.to_i16 + overlows on 65536_f64.to_u16 overlows on 65536_f64.to_u16 + overlows on -1_i8.to_u32 overlows on -1_i8.to_u32 + overlows on 256_f32.to_u8 overlows on 256_f32.to_u8 + overlows on -1_i64.to_u8 overlows on -1_i64.to_u8 + overlows on -1_i64.to_u16 overlows on -1_i64.to_u16 + overlows on -1.to_u16 overlows on -1.to_u16 + overlows on 65536_f32.to_u16 overlows on 65536_f32.to_u16 + overlows on 128_u64.to_i8 overlows on 128_u64.to_i8 + overlows on 32768_u16.to_i16 overlows on 32768_u16.to_i16 + overlows on -1.to_u8 overlows on -1.to_u8 + overlows on 9223372036854775808_u64.to_i64 overlows on 9223372036854775808_u64.to_i64 + overlows on 2147483648_f64.to_i32 overlows on 2147483648_f64.to_i32 + overlows on -1_i16.to_u32 overlows on -1_i16.to_u32 + overlows on -1.to_u32 overlows on -1.to_u32 + overlows on -1_i16.to_u8 overlows on -1_i16.to_u8 + overlows on 128_f32.to_i8 overlows on 128_f32.to_i8 + overlows on 2147483648_u32.to_i32 overlows on 2147483648_u32.to_i32 + overlows on 1.7976931348623157e+308.to_f32 overlows on 1.7976931348623157e+308.to_f32 + overlows on -1_i8.to_u64 overlows on -1_i8.to_u64 + overlows on 32768_u64.to_i16 overlows on 32768_u64.to_i16 + overlows on -1_i8.to_u8 overlows on -1_i8.to_u8 + overlows on 128_u16.to_i8 overlows on 128_u16.to_i8 + overlows on 32768_u32.to_i16 overlows on 32768_u32.to_i16 + + + overlows on 1_i16 + 32767 overlows on 1_i16 + 32767 + overlows on 1_i8 + 128 overlows on 1_i8 + 128 + overlows on 1_i64 + 9223372036854775807_i64 overlows on 1_i64 + 9223372036854775807_i64 + overlows on 1_u32 + 4294967295_i64 overlows on 1_u32 + 4294967295_i64 + overlows on 1_u64 + 18446744073709551615_u64 overlows on 1_u64 + 18446744073709551615_u64 + overlows on 1_u16 + 65535 overlows on 1_u16 + 65535 + overlows on 1 + 2147483647 overlows on 1 + 2147483647 + overlows on 1_u8 + 255 overlows on 1_u8 + 255 + - + overlows on 1_u64 - 2 overlows on 1_u64 - 2 + overlows on 1_i8 - 256 overlows on 1_i8 - 256 + overlows on 1_u8 - 2 overlows on 1_u8 - 2 + overlows on 1_i16 - 32770 overlows on 1_i16 - 32770 + overlows on 1_i64 - 9223372036854775810_u64 overlows on 1_i64 - 9223372036854775810_u64 + overlows on 1_u32 - 2 overlows on 1_u32 - 2 + overlows on 1 - 2147483650_i64 overlows on 1 - 2147483650_i64 + overlows on 1_u16 - 2 overlows on 1_u16 - 2 + * + overlows on 20_u64 * 1844674407370955161_i64 overlows on 20_u64 * 1844674407370955161_i64 + overlows on 10_u16 * 6600 overlows on 10_u16 * 6600 + overlows on 10_i16 * 3300 overlows on 10_i16 * 3300 + overlows on 20_u32 * 429496729 overlows on 20_u32 * 429496729 + overlows on 10_u8 * 26 overlows on 10_u8 * 26 + overlows on 10_i8 * 14 overlows on 10_i8 * 14 + overlows on 20_i64 * 922337203685477580_i64 overlows on 20_i64 * 922337203685477580_i64 + overlows on 20 * 214748364 overlows on 20 * 214748364 + literals + interprets a String literal interprets a String literal + interprets an Int64 interprets an Int64 + interprets a Float64 interprets a Float64 + interprets an Int32 interprets an Int32 + interprets an UInt128 interprets an UInt128 + uses a string pool uses a string pool + interprets an UInt64 interprets an UInt64 + precomputes string literal length precomputes string literal length + interprets an Int8 interprets an Int8 + interprets an UInt16 interprets an UInt16 + interprets nil interprets nil + interprets a Float32 interprets a Float32 + interprets an Int16 interprets an Int16 + interprets a bool (true) interprets a bool (true) + interprets a char interprets a char + interprets an UInt8 interprets an UInt8 + interprets an UInt32 interprets an UInt32 + interprets a bool (false) interprets a bool (false) + interprets an Int128 interprets an Int128 + local variables + doesn't declare variable with no type doesn't declare variable with no type + interprets variable set and get interprets variable set and get + doesn't discard underscore right hand side doesn't discard underscore right hand side + interprets variable set interprets variable set + interprets local variable declaration (#12229) interprets local variable declaration (#12229) + assigns to underscore assigns to underscore + interprets variable set and get with operations interprets variable set and get with operations + doesn't declare variable with no type inside method doesn't declare variable with no type inside method + interprets uninitialized interprets uninitialized + interprets at the class level interprets at the class level + interprets variable set and get, second local var interprets variable set and get, second local var + interprets variable set with type restriction (#13023) interprets variable set with type restriction (#13023) + math + interprets UInt64 & Int32 interprets UInt64 & Int32 + interprets Int32 &- Int32 interprets Int32 &- Int32 + interprets Int32 + Int32 interprets Int32 + Int32 + interprets Float32 + Float64 interprets Float32 + Float64 + interprets Int32 &+ Int32 interprets Int32 &+ Int32 + interprets Float64 + Float64 interprets Float64 + Float64 + interprets Int32 + Float64 interprets Int32 + Float64 + interprets Int128 + Int32 interprets Int128 + Int32 + interprets Int32 * Int32 interprets Int32 * Int32 + interprets Float64 - Float64 interprets Float64 - Float64 + interprets UInt64 | UInt32 interprets UInt64 | UInt32 + discards math discards math + interprets Int8 + Int8 interprets Int8 + Int8 + interprets UInt8 | Int32 interprets UInt8 | Int32 + interprets Int32 - Int32 interprets Int32 - Int32 + interprets UInt64 * Int32 interprets UInt64 * Int32 + interprets UInt32 - Int32 interprets UInt32 - Int32 + interprets Float64 + Int32 interprets Float64 + Int32 + interprets Float64 * Float64 interprets Float64 * Float64 + interprets Int32.unsafe_shl(Int32) with self interprets Int32.unsafe_shl(Int32) with self + interprets Int64 + Int64 interprets Int64 + Int64 + interprets Int32 &* Int32 interprets Int32 &* Int32 + comparisons + interprets Int32 < Float64 interprets Int32 < Float64 + interprets UInt64 == Int32 (true when Int32 >= 0) interprets UInt64 == Int32 (true when Int32 >= 0) + interprets UInt64 == Int32 (false when Int32 < 0) interprets UInt64 == Int32 (false when Int32 < 0) + interprets Bool != Bool (true) interprets Bool != Bool (true) + interprets Float64 < Float64 interprets Float64 < Float64 + interprets Int32 == Float64 (false) interprets Int32 == Float64 (false) + interprets UInt64.unsafe_mod(UInt64) interprets UInt64.unsafe_mod(UInt64) + interprets Char == Char (true) interprets Char == Char (true) + interprets UInt64 != Int32 (false) interprets UInt64 != Int32 (false) + interprets UInt32 < Int32 (false) interprets UInt32 < Int32 (false) + interprets Int32 != Int32 (true) interprets Int32 != Int32 (true) + interprets Float32 / Float32 interprets Float32 / Float32 + interprets UInt64 > UInt32 (true) interprets UInt64 > UInt32 (true) + interprets Int32 < Int32 interprets Int32 < Int32 + interprets UInt64 < Int32 (true, right is greater than zero) interprets UInt64 < Int32 (true, right is greater than zero) + interprets UInt8 < Int32 (false, right is less than zero) interprets UInt8 < Int32 (false, right is less than zero) + interprets Int32 != UInt64 (true) interprets Int32 != UInt64 (true) + interprets UInt8 < Int32 (false, right is greater than zero) interprets UInt8 < Int32 (false, right is greater than zero) + interprets Bool == Bool (true) interprets Bool == Bool (true) + interprets Int32 == Int32 (true) interprets Int32 == Int32 (true) + interprets UInt64 < Int32 (false, right is less than zero) interprets UInt64 < Int32 (false, right is less than zero) + interprets Char == Char (false) interprets Char == Char (false) + interprets UInt64 == Int32 (false when Int32 >= 0) interprets UInt64 == Int32 (false when Int32 >= 0) + interprets Int32 != UInt64 (false) interprets Int32 != UInt64 (false) + interprets UInt64 > UInt32 (false) interprets UInt64 > UInt32 (false) + interprets Int32 == Int32 (false) interprets Int32 == Int32 (false) + interprets Int32 > Float64 (true) interprets Int32 > Float64 (true) + interprets Float64 fdiv Float32 interprets Float64 fdiv Float32 + interprets Int32 == Float64 (true) interprets Int32 == Float64 (true) + interprets Float64 / Float64 interprets Float64 / Float64 + interprets Int32 > Float64 (false) interprets Int32 > Float64 (false) + interprets Float64 < Int32 interprets Float64 < Int32 + interprets UInt64 < Int32 (false, right is greater than zero) interprets UInt64 < Int32 (false, right is greater than zero) + interprets UInt64 != Int32 (true) interprets UInt64 != Int32 (true) + interprets Int32 == UInt64 (false) interprets Int32 == UInt64 (false) + interprets Bool != Bool (false) interprets Bool != Bool (false) + interprets Bool == Bool (false) interprets Bool == Bool (false) + interprets Int32 == UInt64 (true) interprets Int32 == UInt64 (true) + interprets Int32 != Int32 (false) interprets Int32 != Int32 (false) + interprets UInt32 < Int32 (true) interprets UInt32 < Int32 (true) + interprets Int128 == Int128 (false) interprets Int128 == Int128 (false) + interprets Float32 / Int32 interprets Float32 / Int32 + interprets Float32 fdiv Float64 interprets Float32 fdiv Float64 + discards comparison discards comparison + interprets Int128 == Int128 (true) interprets Int128 == Int128 (true) + interprets UInt8 < Int32 (true, right is greater than zero) interprets UInt8 < Int32 (true, right is greater than zero) + logical operations + interprets not for bool false interprets not for bool false + interprets not for generic class instance metaclass interprets not for generic class instance metaclass + interprets not for generic module metaclass interprets not for generic module metaclass + interprets not for mixed union (false) interprets not for mixed union (false) + interprets not for mixed union (nil) interprets not for mixed union (nil) + discards bool not discards bool not + interprets not for nilable type (true) interprets not for nilable type (true) + interprets not for nilable type (false) interprets not for nilable type (false) + interprets not for nilable proc type (true) interprets not for nilable proc type (true) + interprets not for nil type interprets not for nil type + interprets not for bool true interprets not for bool true + interprets not for nil interprets not for nil + interprets not for generic class instance type interprets not for generic class instance type + interprets not for nilable type (false) interprets not for nilable type (false) + interprets not for mixed union (other) interprets not for mixed union (other) + interprets not for nilable proc type (false) interprets not for nilable proc type (false) + interprets not for bool false interprets not for bool false + interprets not for mixed union (true) interprets not for mixed union (true) + does math convert on union does math convert on union + interprets not for generic module interprets not for generic module + discards nil not discards nil not + does math primitive on union does math primitive on union + interprets not for module (#12918) interprets not for module (#12918) + interprets not for nilable type (true) interprets not for nilable type (true) + conversion + interprets Int8::MAX#to_i8! interprets Int8::MAX#to_i8! + interprets Int64::MIN#to_i64! interprets Int64::MIN#to_i64! + interprets Int32::MIN#to_f32! interprets Int32::MIN#to_f32! + interprets UInt64::MAX#to_u8! interprets UInt64::MAX#to_u8! + interprets Int16::MIN#to_f64! interprets Int16::MIN#to_f64! + interprets Float64#to_i64! (negative) interprets Float64#to_i64! (negative) + interprets UInt8::MAX#to_i! interprets UInt8::MAX#to_i! + interprets UInt8::MAX#to_i16! interprets UInt8::MAX#to_i16! + interprets Int16::MAX#to_u64! interprets Int16::MAX#to_u64! + interprets Int16::MAX#to_i! interprets Int16::MAX#to_i! + interprets Float64#to_u! (positive) interprets Float64#to_u! (positive) + interprets Int32::MAX#to_u64! interprets Int32::MAX#to_u64! + interprets Int64::MIN#to_u16! interprets Int64::MIN#to_u16! + interprets UInt16::MAX#to_f32! interprets UInt16::MAX#to_f32! + interprets Int16::MAX#to_u8! interprets Int16::MAX#to_u8! + interprets UInt64::MAX#to_i64! interprets UInt64::MAX#to_i64! + interprets UInt16::MAX#to_i! interprets UInt16::MAX#to_i! + interprets Float32#to_i32! (negative) interprets Float32#to_i32! (negative) + interprets Int64::MIN#to_u32! interprets Int64::MIN#to_u32! + interprets Float32#to_f64! (positive) interprets Float32#to_f64! (positive) + interprets Float32#to_i16! (negative) interprets Float32#to_i16! (negative) + interprets UInt64::MAX#to_i32! interprets UInt64::MAX#to_i32! + interprets UInt32::MAX#to_f32! interprets UInt32::MAX#to_f32! + interprets UInt16::MAX#to_i64! interprets UInt16::MAX#to_i64! + interprets Float32#to_u8! (positive) interprets Float32#to_u8! (positive) + interprets Int32::MIN#to_f64! interprets Int32::MIN#to_f64! + interprets Float64#to_u64! (positive) interprets Float64#to_u64! (positive) + interprets Int64::MAX#to_u16! interprets Int64::MAX#to_u16! + interprets Int64::MIN#to_i8! interprets Int64::MIN#to_i8! + interprets Int8::MIN#to_f32! interprets Int8::MIN#to_f32! + interprets Float32#to_f32! (negative) interprets Float32#to_f32! (negative) + discards conversion with local var discards conversion with local var + interprets Float64#to_u32! (positive) interprets Float64#to_u32! (positive) + interprets Int64::MIN#to_u64! interprets Int64::MIN#to_u64! + interprets Int64::MIN#to_i16! interprets Int64::MIN#to_i16! + interprets Int16::MIN#to_i! interprets Int16::MIN#to_i! + interprets UInt8::MAX#to_u! interprets UInt8::MAX#to_u! + interprets Float32#to_u! (positive) interprets Float32#to_u! (positive) + interprets UInt16::MAX#to_u32! interprets UInt16::MAX#to_u32! + interprets UInt32::MAX#to_f64! interprets UInt32::MAX#to_f64! + interprets Int32::MAX#to_i16! interprets Int32::MAX#to_i16! + interprets Int64::MAX#to_u! interprets Int64::MAX#to_u! + interprets UInt32::MAX#to_u8! interprets UInt32::MAX#to_u8! + interprets Float64#to_i8! (negative) interprets Float64#to_i8! (negative) + interprets UInt16::MAX#to_i16! interprets UInt16::MAX#to_i16! + interprets Float64#to_f32! (negative) interprets Float64#to_f32! (negative) + interprets Int8::MIN#to_u64! interprets Int8::MIN#to_u64! + interprets UInt32::MAX#to_i8! interprets UInt32::MAX#to_i8! + interprets UInt32::MAX#to_i64! interprets UInt32::MAX#to_i64! + interprets Int16::MAX#to_i8! interprets Int16::MAX#to_i8! + interprets UInt16::MAX#to_u! interprets UInt16::MAX#to_u! + interprets Int64::MAX#to_f64! interprets Int64::MAX#to_f64! + interprets Float64#to_u8! (positive) interprets Float64#to_u8! (positive) + interprets Int32::MAX#to_u32! interprets Int32::MAX#to_u32! + interprets Int16::MIN#to_u! interprets Int16::MIN#to_u! + interprets UInt8::MAX#to_u32! interprets UInt8::MAX#to_u32! + interprets Float64#to_i32! (negative) interprets Float64#to_i32! (negative) + interprets Float32#to_u32! (positive) interprets Float32#to_u32! (positive) + interprets Float64#to_i16! (negative) interprets Float64#to_i16! (negative) + interprets Float64#to_f32! (positive) interprets Float64#to_f32! (positive) + interprets Int32::MAX#to_u! interprets Int32::MAX#to_u! + interprets Int8::MAX#to_u16! interprets Int8::MAX#to_u16! + interprets Int16::MIN#to_i8! interprets Int16::MIN#to_i8! + interprets Int64::MAX#to_u8! interprets Int64::MAX#to_u8! + interprets Int16::MIN#to_u16! interprets Int16::MIN#to_u16! + UInt8#unsafe_chr UInt8#unsafe_chr + interprets UInt16::MAX#to_u16! interprets UInt16::MAX#to_u16! + interprets Int64::MIN#to_u! interprets Int64::MIN#to_u! + interprets Int64::MAX#to_i! interprets Int64::MAX#to_i! + discards conversion discards conversion + interprets UInt8::MAX#to_f64! interprets UInt8::MAX#to_f64! + interprets Int16::MAX#to_f32! interprets Int16::MAX#to_f32! + interprets Float32#to_u16! (positive) interprets Float32#to_u16! (positive) + interprets Int16::MIN#to_u32! interprets Int16::MIN#to_u32! + interprets Float64#to_i! (positive) interprets Float64#to_i! (positive) + interprets UInt8::MAX#to_u8! interprets UInt8::MAX#to_u8! + interprets UInt16::MAX#to_i8! interprets UInt16::MAX#to_i8! + interprets Int8::MAX#to_f64! interprets Int8::MAX#to_f64! + interprets Int16::MAX#to_u! interprets Int16::MAX#to_u! + interprets Int8::MAX#to_i64! interprets Int8::MAX#to_i64! + interprets Int16::MIN#to_i64! interprets Int16::MIN#to_i64! + Int32#unsafe_chr Int32#unsafe_chr + interprets Int32::MIN#to_u64! interprets Int32::MIN#to_u64! + interprets Int16::MAX#to_u32! interprets Int16::MAX#to_u32! + interprets UInt16::MAX#to_f64! interprets UInt16::MAX#to_f64! + interprets Float32#to_i64! (negative) interprets Float32#to_i64! (negative) + interprets Int8::MIN#to_i16! interprets Int8::MIN#to_i16! + interprets Int32::MAX#to_u8! interprets Int32::MAX#to_u8! + interprets UInt8::MAX#to_f32! interprets UInt8::MAX#to_f32! + interprets UInt8::MAX#to_u64! interprets UInt8::MAX#to_u64! + interprets Int8::MAX#to_i32! interprets Int8::MAX#to_i32! + interprets Float32#to_f32! (positive) interprets Float32#to_f32! (positive) + interprets Int32::MIN#to_i! interprets Int32::MIN#to_i! + interprets Float64#to_i! (negative) interprets Float64#to_i! (negative) + interprets Int32::MIN#to_i16! interprets Int32::MIN#to_i16! + interprets Int16::MIN#to_u64! interprets Int16::MIN#to_u64! + interprets Int32::MIN#to_i32! interprets Int32::MIN#to_i32! + interprets Int8::MIN#to_u16! interprets Int8::MIN#to_u16! + interprets Int16::MAX#to_f64! interprets Int16::MAX#to_f64! + interprets Char#ord interprets Char#ord + interprets Float64#to_i32! (positive) interprets Float64#to_i32! (positive) + interprets UInt64::MAX#to_i8! interprets UInt64::MAX#to_i8! + interprets Int64::MAX#to_u64! interprets Int64::MAX#to_u64! + interprets UInt32::MAX#to_i32! interprets UInt32::MAX#to_i32! + interprets Int64::MIN#to_f64! interprets Int64::MIN#to_f64! + interprets Int8::MIN#to_u8! interprets Int8::MIN#to_u8! + interprets UInt64::MAX#to_i! interprets UInt64::MAX#to_i! + interprets UInt8::MAX#to_i8! interprets UInt8::MAX#to_i8! + interprets Int32::MAX#to_i! interprets Int32::MAX#to_i! + interprets UInt64::MAX#to_u64! interprets UInt64::MAX#to_u64! + interprets Int8::MIN#to_u32! interprets Int8::MIN#to_u32! + interprets Int32::MIN#to_i64! interprets Int32::MIN#to_i64! + interprets Int8::MIN#to_i64! interprets Int8::MIN#to_i64! + interprets Float64#to_i8! (positive) interprets Float64#to_i8! (positive) + interprets UInt32::MAX#to_u32! interprets UInt32::MAX#to_u32! + interprets Int64::MAX#to_f32! interprets Int64::MAX#to_f32! + interprets UInt64::MAX#to_f64! interprets UInt64::MAX#to_f64! + interprets Int8::MIN#to_i32! interprets Int8::MIN#to_i32! + interprets UInt64::MAX#to_f32! interprets UInt64::MAX#to_f32! + interprets Int8::MAX#to_u! interprets Int8::MAX#to_u! + interprets Int8::MAX#to_u32! interprets Int8::MAX#to_u32! + interprets UInt32::MAX#to_u64! interprets UInt32::MAX#to_u64! + interprets UInt32::MAX#to_i! interprets UInt32::MAX#to_i! + interprets Int16::MIN#to_f32! interprets Int16::MIN#to_f32! + interprets Int32::MIN#to_i8! interprets Int32::MIN#to_i8! + interprets Int16::MAX#to_i64! interprets Int16::MAX#to_i64! + interprets Float64#to_i64! (positive) interprets Float64#to_i64! (positive) + interprets Int8::MAX#to_u64! interprets Int8::MAX#to_u64! + interprets UInt16::MAX#to_u8! interprets UInt16::MAX#to_u8! + interprets Int32::MIN#to_u32! interprets Int32::MIN#to_u32! + interprets Int16::MIN#to_u8! interprets Int16::MIN#to_u8! + interprets Float64#to_f64! (negative) interprets Float64#to_f64! (negative) + interprets Int32::MAX#to_i32! interprets Int32::MAX#to_i32! + interprets Int16::MIN#to_i16! interprets Int16::MIN#to_i16! + interprets Int8::MIN#to_i8! interprets Int8::MIN#to_i8! + interprets Int64::MAX#to_i16! interprets Int64::MAX#to_i16! + interprets Int8::MAX#to_u8! interprets Int8::MAX#to_u8! + interprets UInt32::MAX#to_u16! interprets UInt32::MAX#to_u16! + interprets UInt32::MAX#to_u! interprets UInt32::MAX#to_u! + interprets Float64#to_u16! (positive) interprets Float64#to_u16! (positive) + interprets UInt16::MAX#to_i32! interprets UInt16::MAX#to_i32! + interprets UInt64::MAX#to_u16! interprets UInt64::MAX#to_u16! + interprets Int8::MIN#to_u! interprets Int8::MIN#to_u! + interprets Int8::MIN#to_i! interprets Int8::MIN#to_i! + interprets Int32::MIN#to_u8! interprets Int32::MIN#to_u8! + interprets Float32#to_i8! (positive) interprets Float32#to_i8! (positive) + interprets Int16::MAX#to_i16! interprets Int16::MAX#to_i16! + interprets Int64::MIN#to_i! interprets Int64::MIN#to_i! + interprets UInt8::MAX#to_i32! interprets UInt8::MAX#to_i32! + interprets Float32#to_i32! (positive) interprets Float32#to_i32! (positive) + interprets UInt64::MAX#to_i16! interprets UInt64::MAX#to_i16! + interprets Int64::MAX#to_i32! interprets Int64::MAX#to_i32! + interprets Float32#to_i! (negative) interprets Float32#to_i! (negative) + interprets Int64::MAX#to_u32! interprets Int64::MAX#to_u32! + interprets UInt8::MAX#to_u16! interprets UInt8::MAX#to_u16! + interprets Int8::MAX#to_f32! interprets Int8::MAX#to_f32! + interprets UInt16::MAX#to_u64! interprets UInt16::MAX#to_u64! + interprets Int32::MAX#to_i8! interprets Int32::MAX#to_i8! + interprets Int64::MIN#to_i32! interprets Int64::MIN#to_i32! + interprets UInt8::MAX#to_i64! interprets UInt8::MAX#to_i64! + interprets Int64::MIN#to_f32! interprets Int64::MIN#to_f32! + interprets Float32#to_f64! (negative) interprets Float32#to_f64! (negative) + interprets Int32::MAX#to_i64! interprets Int32::MAX#to_i64! + interprets Float32#to_i16! (positive) interprets Float32#to_i16! (positive) + interprets UInt32::MAX#to_i16! interprets UInt32::MAX#to_i16! + interprets Int64::MAX#to_i8! interprets Int64::MAX#to_i8! + interprets Int32::MIN#to_u16! interprets Int32::MIN#to_u16! + interprets Float64#to_i16! (positive) interprets Float64#to_i16! (positive) + interprets Float32#to_u64! (positive) interprets Float32#to_u64! (positive) + interprets Float32#to_i64! (positive) interprets Float32#to_i64! (positive) + interprets Int32::MAX#to_f64! interprets Int32::MAX#to_f64! + interprets UInt64::MAX#to_u! interprets UInt64::MAX#to_u! + interprets Int32::MIN#to_u! interprets Int32::MIN#to_u! + interprets Int8::MIN#to_f64! interprets Int8::MIN#to_f64! + interprets Int32::MAX#to_u16! interprets Int32::MAX#to_u16! + interprets Int64::MIN#to_u8! interprets Int64::MIN#to_u8! + interprets Int8::MAX#to_i16! interprets Int8::MAX#to_i16! + interprets Float32#to_i8! (negative) interprets Float32#to_i8! (negative) + interprets Float64#to_f64! (positive) interprets Float64#to_f64! (positive) + interprets Int32::MAX#to_f32! interprets Int32::MAX#to_f32! + interprets Int16::MAX#to_i32! interprets Int16::MAX#to_i32! + interprets Int64::MAX#to_i64! interprets Int64::MAX#to_i64! + interprets Int16::MAX#to_u16! interprets Int16::MAX#to_u16! + interprets Int16::MIN#to_i32! interprets Int16::MIN#to_i32! + interprets UInt64::MAX#to_u32! interprets UInt64::MAX#to_u32! + interprets Int8::MAX#to_i! interprets Int8::MAX#to_i! + interprets Float32#to_i! (positive) interprets Float32#to_i! (positive) +Code gen: and + codegens and with primitive type other than bool with union codegens and with primitive type other than bool with union + codegens and with bool and int 2 codegens and with bool and int 2 + codegens and with primitive type other than bool codegens and with primitive type other than bool + codegens and with bool false and false codegens and with bool false and false + codegens and with nilable as left node 1 codegens and with nilable as left node 1 + codegens and with bool union as left node 1 codegens and with bool union as left node 1 + codegens assign in right node, inside if must not be nil codegens assign in right node, inside if must not be nil + codegens and with bool union as left node 4 codegens and with bool union as left node 4 + codegens and with bool true and false codegens and with bool true and false + codegens and with bool false and true codegens and with bool false and true + codegens and with bool union as left node 1 codegens and with bool union as left node 1 + codegens and with bool and int 1 codegens and with bool and int 1 + codegens assign in right node, after must be nilable codegens assign in right node, after must be nilable + codegens and with non-false union as left node codegens and with non-false union as left node + codegens and with bool true and true codegens and with bool true and true + codegens and with primitive type other than bool codegens and with primitive type other than bool + codegens and with bool union as left node 3 codegens and with bool union as left node 3 + codegens and with nilable as left node 2 codegens and with nilable as left node 2 + codegens and with bool union as left node 3 codegens and with bool union as left node 3 + codegens and with nil union as left node 2 codegens and with nil union as left node 2 + codegens and with bool union as left node 2 codegens and with bool union as left node 2 + codegens and with nil union as left node 1 codegens and with nil union as left node 1 + codegens assign in right node, after if must be nilable codegens assign in right node, after if must be nilable + codegens and with bool union as left node 2 codegens and with bool union as left node 2 +Crystal::Repl::Interpreter + blocks + captures non-closure block captures non-closure block + interprets simplest block interprets simplest block + counts with ... yield scope in block args bytesize (#12316) counts with ... yield scope in block args bytesize (#12316) + interprets break inside block interprets break inside block + interprets break inside block (union, through normal flow) interprets break inside block (union, through normal flow) + interprets yield expression interprets yield expression + interprets next inside block interprets next inside block + interprets block with splat interprets block with splat + caches method with captured block (#12276) caches method with captured block (#12276) + interprets with ... yield with struct interprets with ... yield with struct + interprets yield with splat, block with splat interprets yield with splat, block with splat + interprets yield return value interprets yield return value + interprets yield with splat (1) interprets yield with splat (1) + interprets yield with splat, block with splat (#12227) interprets yield with splat, block with splat (#12227) + interprets next inside block (union, through next) interprets next inside block (union, through next) + considers block arg without type as having NoReturn type (#12270) considers block arg without type as having NoReturn type (#12270) + interprets with ... yield with extra arguments (#12296) interprets with ... yield with extra arguments (#12296) + interprets break inside block (union, through return) interprets break inside block (union, through return) + clears block local variables when calling block (2) clears block local variables when calling block (2) + returns from block returns from block + interprets yield inside another block interprets yield inside another block + interprets yield inside def with arguments interprets yield inside def with arguments + interprets block with multiple yields interprets block with multiple yields + casts yield expression to block var type (not block arg type) casts yield expression to block var type (not block arg type) + interprets break inside block (union, through break) interprets break inside block (union, through break) + interprets yield with splat (2) interprets yield with splat (2) + interprets block with args that conflict with a local var interprets block with args that conflict with a local var + interprets yield expressions interprets yield expressions + interprets yield with splat, less block arguments interprets yield with splat, less block arguments + interprets block with args that conflict with a local var interprets block with args that conflict with a local var + discards yield expression discards yield expression + interprets next inside block (union, through normal exit) interprets next inside block (union, through normal exit) + yields different values to form a union yields different values to form a union + interprets with ... yield interprets with ... yield + clears block local variables when calling block clears block local variables when calling block + considers block arg without type as having NoReturn type (2) (#12270) considers block arg without type as having NoReturn type (2) (#12270) +Semantic: const + errors on dynamic constant assignment inside block errors on dynamic constant assignment inside block + doesn't errors if constant depends on another one defined later through method, but constant is simple (1) doesn't errors if constant depends on another one defined later through method, but constant is simple (1) + errors if using return inside constant value (#5391) errors if using return inside constant value (#5391) + doesn't crash with const used in initialize (bug) doesn't crash with const used in initialize (bug) + errors on dynamic constant assignment inside if errors on dynamic constant assignment inside if + doesn't share variables with global scope doesn't share variables with global scope + finds current type first finds current type first + finds constant in class that extends class (#205) finds constant in class that extends class (#205) + types a global constant reference in static method types a global constant reference in static method + can use constant defined later (#2906) can use constant defined later (#2906) + doesn't errors if constant depends on another one defined later through method, but constant is simple ("foo") doesn't errors if constant depends on another one defined later through method, but constant is simple ("foo") + finds const from restriction finds const from restriction + errors if using const in uninitialized errors if using const in uninitialized + creates container module if not exist when using Path creates container module if not exist when using Path + doesn't errors if constant depends on another one defined later through method, but constant is simple (~ 2) doesn't errors if constant depends on another one defined later through method, but constant is simple (~ 2) + finds current type only for first path item (2) finds current type only for first path item (2) + types a constant types a constant + finds current type before parents (#4086) finds current type before parents (#4086) + doesn't errors if constant depends on another one defined later through method, but constant is simple (true) doesn't errors if constant depends on another one defined later through method, but constant is simple (true) + doesn't errors if constant depends on another one defined later through method, but constant is simple (nil) doesn't errors if constant depends on another one defined later through method, but constant is simple (nil) + types a global constant reference in method types a global constant reference in method + doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED &* 2) doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED &* 2) + errors if using const in proc notation parameter type errors if using const in proc notation parameter type + types a nested constant using Path types a nested constant using Path + doesn't errors if constant depends on another one defined later through method, but constant is simple (+ 1) doesn't errors if constant depends on another one defined later through method, but constant is simple (+ 1) + doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED // 2) doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED // 2) + errors if using const in var declaration errors if using const in var declaration + errors if can't infer constant type (#3240, #3948) errors if can't infer constant type (#3240, #3948) + finds constant in module that includes module (#205) finds constant in module that includes module (#205) + doesn't count parent types as current type doesn't count parent types as current type + doesn't errors if constant depends on another one defined later through method, but constant is simple (- 2) doesn't errors if constant depends on another one defined later through method, but constant is simple (- 2) + types a constant reference types a constant reference + types a constant inside a def types a constant inside a def + types a constant using Path types a constant using Path + types a nested constant types a nested constant + doesn't errors if constant depends on another one defined later through method, but constant is simple (1 &+ ZED) doesn't errors if constant depends on another one defined later through method, but constant is simple (1 &+ ZED) + doesn't error if using c enum doesn't error if using c enum + types a nested type with same name types a nested type with same name + errors if using constant as generic type (#3240) errors if using constant as generic type (#3240) + doesn't errors if constant depends on another one defined later through method, but constant is simple (1 + 2) doesn't errors if constant depends on another one defined later through method, but constant is simple (1 + 2) + keeps type of container when using Path keeps type of container when using Path + finds nearest constant first finds nearest constant first + finds current type only for first path item (1) finds current type only for first path item (1) + errors if using const in proc notation return type errors if using const in proc notation return type + errors if constant has NoReturn type (#6139) errors if constant has NoReturn type (#6139) + doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED &- 1) doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED &- 1) + errors if using const in type declaration errors if using const in type declaration + doesn't errors if constant depends on another one defined later through method, but constant is simple (1 + ZED) doesn't errors if constant depends on another one defined later through method, but constant is simple (1 + ZED) + errors if using const in restriction errors if using const in restriction + doesn't errors if constant depends on another one defined later through method, but constant is simple ('a') doesn't errors if constant depends on another one defined later through method, but constant is simple ('a') + doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED - 1) doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED - 1) + doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED * 2) doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED * 2) +Semantic: double splat + uses restriction on double splat, doesn't match with empty named tuple (2) uses restriction on double splat, doesn't match with empty named tuple (2) + matches named args producing an empty double splat (#2678) matches named args producing an empty double splat (#2678) + uses double splat restriction with concrete type uses double splat restriction with concrete type + errors missing argument with double splat errors missing argument with double splat + uses double splat in new uses double splat in new + matches double splat on method with named args and regular args matches double splat on method with named args and regular args + uses restriction on double splat, doesn't match with empty named tuple uses restriction on double splat, doesn't match with empty named tuple + errors if duplicate keys on call side with two double splats errors if duplicate keys on call side with two double splats + uses double splat restriction uses double splat restriction + double splats named argument into arguments (1) double splats named argument into arguments (1) + uses restriction on double splat, means all types must be that type uses restriction on double splat, means all types must be that type + errors if duplicate keys on call side with double splat and named args errors if duplicate keys on call side with double splat and named args + uses double splat restriction, matches empty uses double splat restriction, matches empty + matches double splat on method (empty) matches double splat on method (empty) + matches double splat on method with named args matches double splat on method with named args + overloads based on double splat restriction overloads based on double splat restriction + double splats named argument into arguments (2) double splats named argument into arguments (2) + matches double splat with regular splat matches double splat with regular splat +unreachable + finds initializer finds initializer + finds method with free variable finds method with free variable + finds method called from proc finds method called from proc + tallies calls tallies calls + finds instance methods finds instance methods + finds method with `super` finds method with `super` + finds class methods finds class methods + finds methods called from reachable code finds methods called from reachable code + finds yielding methods finds yielding methods + finds instance methods in nested types finds instance methods in nested types + finds method called from expanded macro finds method called from expanded macro + finds methods in generic type finds methods in generic type + finds methods with proc parameter finds methods with proc parameter + finds method with `previous_def` finds method with `previous_def` + finds method in abstract type finds method in abstract type + finds virtual method finds virtual method + finds shadowed method finds shadowed method + finds method called from instance variable initializer finds method called from instance variable initializer + ignores autogenerated enum predicates ignores autogenerated enum predicates + finds top level methods finds top level methods + finds abstract method finds abstract method + finds method called from block finds method called from block + finds method called from expanded macro expression finds method called from expanded macro expression +Code gen: if + codegens if without an else with false codegens if without an else with false + doesn't crash no NoReturn var (non-true left cond) (#1823) doesn't crash no NoReturn var (non-true left cond) (#1823) + codegens if inside def without an else with true codegens if inside def without an else with true + codegens if of nilable type in then 2 codegens if of nilable type in then 2 + codegens if with virtual codegens if with virtual + codegens #3104 codegens #3104 + codegens if with an else with false codegens if with an else with false + codegens bug #1729 codegens bug #1729 + codegens if with return in both branches codegens if with return in both branches + codegens if without an else with true codegens if without an else with true + codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter + restricts with || always falsey restricts with || always falsey + codegens if with int codegens if with int + codegens if with nil codegens if with nil + codegen if with union type and then without type codegen if with union type and then without type + codegen if with nested if that returns codegen if with nested if that returns + codegens if with nested if that raises codegens if with nested if that raises codegens if with nested if that raises codegens if with nested if that raises codegens if with nested if that raises codegens if with nested if that raises codegens if with nested if that raises codegens if with nested if that raises codegens if with nested if that raises codegens if with nested if that raises + doesn't crash no NoReturn var (true left cond) (#1823) doesn't crash no NoReturn var (true left cond) (#1823) + codegens nested if with var (ssa bug) codegens nested if with var (ssa bug) + codegens if of nilable type in else 3 codegens if of nilable type in else 3 + doesn't crash with if !is_a? using var in then doesn't crash with if !is_a? using var in then + codegens if value from then codegens if value from then + codegens if with return and no else codegens if with return and no else + codegens if with union codegens if with union + codegens if of nilable type in then codegens if of nilable type in then + codegens if with an else with true codegens if with an else with true + codes if with two whiles codes if with two whiles + codegen if inside if codegen if inside if + codegens if of nilable type in else codegens if of nilable type in else + considers or truthy/falsey right considers or truthy/falsey right + doesn't crash with if !var using var in else doesn't crash with if !var using var in else + codegens if with pointer 0x100000000 pointer codegens if with pointer 0x100000000 pointer + codegen if with union type and else without type codegen if with union type and else without type + doesn't generate truthy if branch if doesn't need value (bug) doesn't generate truthy if branch if doesn't need value (bug) +Crystal::Command::FormatCommand + formats stdin (bug + show-backtrace) formats stdin (bug + show-backtrace) + formats stdin (invalid byte sequence error) formats stdin (invalid byte sequence error) + formats files formats files + checks files format (excludes + includes) checks files format (excludes + includes) + formats stdin (formatted) formats stdin (formatted) + formats files (bug) formats files (bug) + formats stdin (bug) formats stdin (bug) + formats stdin formats stdin + formats files (dir) formats files (dir) + formats files (error) formats files (error) + checks files format checks files format + checks files format (excludes) checks files format (excludes) + formats files (bug + show-stacktrace) formats files (bug + show-stacktrace) + checks files format (ok) checks files format (ok) + formats stdin (syntax error) formats stdin (syntax error) +Semantic: struct + includes another struct includes another struct + errors if includes non-cstruct type errors if includes non-cstruct type + types struct getter types struct getter + errors if includes unknown type errors if includes unknown type + errors if invoking to_i32! and got wrong type errors if invoking to_i32! and got wrong type + errors if already defined with another type errors if already defined with another type + types struct getter to struct types struct getter to struct + types struct getter on pointer type types struct getter on pointer type + types struct getter multiple levels via new types struct getter multiple levels via new + errors on struct setter if different type via new errors on struct setter if different type via new + errors if setting closure errors if setting closure + errors if already defined errors if already defined + errors if using void in struct field type errors if using void in struct field type + errors if invoking to_unsafe and got error in that call errors if invoking to_unsafe and got error in that call + errors if invoking to_unsafe and got different type errors if invoking to_unsafe and got different type + errors on empty c struct (#633) errors on empty c struct (#633) + errors if includes and field already exists errors if includes and field already exists + allows inline forward declaration allows inline forward declaration + errors if includes and field already exists, the other way around errors if includes and field already exists, the other way around + types struct setter types struct setter + errors on struct if no field errors on struct if no field + errors if already defined with another type (2) errors if already defined with another type (2) + types Struct#new types Struct#new + errors on struct setter if different type errors on struct setter if different type + types struct getter with keyword name types struct getter with keyword name + can access instance var from the outside (#1092) can access instance var from the outside (#1092) + errors if using void via typedef in struct field type errors if using void via typedef in struct field type + marks as packed marks as packed + types struct types struct + supports macro if inside struct supports macro if inside struct + errors if invoking to_i32! and got error in that call errors if invoking to_i32! and got error in that call + automatically converts numeric type in struct field assignment automatically converts numeric type in struct field assignment +Crystal::Repl::Interpreter + tuple + interprets tuple literal of different types (1) interprets tuple literal of different types (1) + interprets tuple range indexer (2) interprets tuple range indexer (2) + extends sign when doing to_i32 extends sign when doing to_i32 + interprets tuple literal of different types (2) interprets tuple literal of different types (2) + interprets tuple metaclass range indexer interprets tuple metaclass range indexer + does tuple indexer on union does tuple indexer on union + interprets tuple literal and access by known index interprets tuple literal and access by known index + interprets tuple self interprets tuple self + interprets tuple range indexer interprets tuple range indexer + interprets tuple metaclass indexer interprets tuple metaclass indexer + discards tuple (#12383) discards tuple (#12383) + unpacks tuple in block arguments unpacks tuple in block arguments + discards tuple access discards tuple access +Code gen: type declaration + codegens initialize instance var with var declaration codegens initialize instance var with var declaration + codegens initialize instance var of superclass codegens initialize instance var of superclass + codegens initialize instance var codegens initialize instance var + declares and initializes declares and initializes + declares and initializes var declares and initializes var +Semantic: multi assign + strict_multi_assign + errors if assigning tuple to fewer targets errors if assigning tuple to fewer targets + errors if assigning union of tuples to fewer targets errors if assigning union of tuples to fewer targets + doesn't error if some type in union has no constant size doesn't error if some type in union has no constant size + errors if assigning tuple to more targets errors if assigning tuple to more targets + errors if assigning non-Indexable to splat (#11414) errors if assigning non-Indexable to splat (#11414) + doesn't error if some type in union matches target count doesn't error if some type in union matches target count + errors if assigning non-Indexable (#11414) errors if assigning non-Indexable (#11414) + can pass splat variable at top-level to macros (#11596) can pass splat variable at top-level to macros (#11596) + without strict_multi_assign + errors if assigning non-Indexable to splat (#11414) errors if assigning non-Indexable to splat (#11414) + doesn't error if assigning tuple to fewer targets doesn't error if assigning tuple to fewer targets + doesn't error if assigning non-Indexable (#11414) doesn't error if assigning non-Indexable (#11414) +Code gen: splat + splats with default value (3) splats with default value (3) + splats splats + splats with default value splats with default value + splats without args splats without args + splats with another arg splats with another arg + evaluates splat argument just once (#2677) evaluates splat argument just once (#2677) + splats on call splats on call + does #2407 does #2407 + splats in initialize splats in initialize + splats with default value (2) splats with default value (2) +Semantic: proc + disallows Number in proc pointer disallows Number in proc pointer + allows metaclass in procs allows metaclass in procs + can match *T in block argument can match *T in block argument + disallows Object in proc notation parameter type disallows Object in proc notation parameter type + says wrong number of block params in new on proc type says wrong number of block params in new on proc type + types proc type spec types proc type spec + disallows Number in proc notation parameter type disallows Number in proc notation parameter type + disallows Proc in proc notation parameter type disallows Proc in proc notation parameter type + disallows Value in proc pointer disallows Value in proc pointer + uses array argument of proc arg (1) uses array argument of proc arg (1) + disallows Value in proc notation parameter type disallows Value in proc notation parameter type + disallows Struct in proc notation return type disallows Struct in proc notation return type + disallows Int in proc return types disallows Int in proc return types + disallows StaticArray in proc pointer disallows StaticArray in proc pointer + finds method of object finds method of object + allows passing nil as proc callback if it is a lib alias allows passing nil as proc callback if it is a lib alias + types proc pointer types proc pointer + can assign proc that returns anything to proc that returns nil, with class var (#3655) can assign proc that returns anything to proc that returns nil, with class var (#3655) + disallows Class in proc notation parameter type disallows Class in proc notation parameter type + passes proc pointer as block with arguments passes proc pointer as block with arguments + casts to Proc(Nil) when specified in return type casts to Proc(Nil) when specified in return type + disallows Proc in proc pointer disallows Proc in proc pointer + doesn't let passing an non-covariant generic argument doesn't let passing an non-covariant generic argument + types proc literal hard type inference (1) types proc literal hard type inference (1) + types int proc literal types int proc literal + disallows Float in procs disallows Float in procs + types proc call with return type types proc call with return type + gives correct error message when proc return type is incorrect (#219) gives correct error message when proc return type is incorrect (#219) + *doesn't* merge Proc that returns Nil with another one that returns something else (#3655) (this was reverted) *doesn't* merge Proc that returns Nil with another one that returns something else (#3655) (this was reverted) + allows passing function to LibC without specifying types, using a global method allows passing function to LibC without specifying types, using a global method + disallows Object in proc pointer disallows Object in proc pointer + disallows Proc in proc notation return type disallows Proc in proc notation return type + errors when using local variable with proc argument name errors when using local variable with proc argument name + doesn't cause upcast bug (#8428) doesn't cause upcast bug (#8428) + allows implicit cast of proc to return void in LibC function allows implicit cast of proc to return void in LibC function + types proc pointer with a type that was never instantiated types proc pointer with a type that was never instantiated + disallows Tuple in proc pointer disallows Tuple in proc pointer + disallows casting a proc type to one accepting same size argument but different input disallows casting a proc type to one accepting same size argument but different input + disallows Enum in proc notation parameter type disallows Enum in proc notation parameter type + disallows Number in proc return types disallows Number in proc return types + allows passing union including module to proc allows passing union including module to proc + errors if missing argument type in proc literal errors if missing argument type in proc literal + can pass proc that returns T as Void with named args (#7523) can pass proc that returns T as Void with named args (#7523) + disallows Object in captured block disallows Object in captured block + can pass Proc(T) to Proc(Nil) in type restriction (#8964) can pass Proc(T) to Proc(Nil) in type restriction (#8964) + can pass Proc(X, T) to Proc(X, Nil) in type restriction (#8964) can pass Proc(X, T) to Proc(X, Nil) in type restriction (#8964) + types int -> int proc call types int -> int proc call + uses array argument of proc arg (3) uses array argument of proc arg (3) + allows metaclass in proc notation parameter type allows metaclass in proc notation parameter type + disallows Tuple in procs disallows Tuple in procs + allows new on proc type with less block params allows new on proc type with less block params + disallows StaticArray in procs disallows StaticArray in procs + types proc literal with return type (1) types proc literal with return type (1) + can use @ivar as pointer syntax receiver (#9239) can use @ivar as pointer syntax receiver (#9239) + uses array argument of proc arg (2) uses array argument of proc arg (2) + uses array argument of proc arg (4) uses array argument of proc arg (4) + allows casting a proc type to one with void argument allows casting a proc type to one with void argument + says wrong return type in new on proc type says wrong return type in new on proc type + disallows Enum in proc notation return type disallows Enum in proc notation return type + disallows Reference in proc return types disallows Reference in proc return types + disallows Value in proc notation return type disallows Value in proc notation return type + disallows Int in procs disallows Int in procs + allows passing proc type if it is typedef'd allows passing proc type if it is typedef'd + disallows Float in proc pointer disallows Float in proc pointer + has proc literal as restriction and errors if sizes are different has proc literal as restriction and errors if sizes are different + allows metaclass in proc return types allows metaclass in proc return types + errors when using macro as proc value (top-level with obj) (#7465) errors when using macro as proc value (top-level with obj) (#7465) + disallows Int in proc notation return type disallows Int in proc notation return type + disallows Reference in procs disallows Reference in procs + merges return type merges return type + doesn't capture closured var if using typeof doesn't capture closured var if using typeof + disallows Reference in proc pointer disallows Reference in proc pointer + says wrong number of arguments says wrong number of arguments + disallows StaticArray in proc return types disallows StaticArray in proc return types + disallows Pointer in procs disallows Pointer in procs + ... ... + disallows Struct in procs disallows Struct in procs + doesn't need to deduce type of block if return is void doesn't need to deduce type of block if return is void + disallows Enum in proc pointer disallows Enum in proc pointer + allows using Proc as restriction (1) allows using Proc as restriction (1) + disallows Value in captured block disallows Value in captured block + allows passing NoReturn type for any return type (1) allows passing NoReturn type for any return type (1) + disallows Object in procs disallows Object in procs + allows passing NoReturn type for any return type, with Proc notation (#12126) allows passing NoReturn type for any return type, with Proc notation (#12126) + accesses T and R accesses T and R + allows passing function to LibC without specifying types, using a class method allows passing function to LibC without specifying types, using a class method + disallows Struct in captured block disallows Struct in captured block + disallows Tuple in proc notation parameter type disallows Tuple in proc notation parameter type + types nil or proc type types nil or proc type + allows implicit cast of proc to return void in generic restriction allows implicit cast of proc to return void in generic restriction + disallows Enum in procs disallows Enum in procs + binds proc literal to arguments and body binds proc literal to arguments and body + disallows Pointer in proc notation parameter type disallows Pointer in proc notation parameter type + disallows casting a proc type to one accepting same size argument but different output disallows casting a proc type to one accepting same size argument but different output + disallows Enum in proc return types disallows Enum in proc return types + passes proc pointer as block passes proc pointer as block + sets proc type as void if explicitly told so, when using new sets proc type as void if explicitly told so, when using new + allows using Proc as restriction (2) allows using Proc as restriction (2) + disallows Struct in proc return types disallows Struct in proc return types + allows using Proc as restriction (3) allows using Proc as restriction (3) + disallows Float in proc notation return type disallows Float in proc notation return type + can assign NoReturn proc to other proc (#3032) can assign NoReturn proc to other proc (#3032) + has proc literal as restriction and works has proc literal as restriction and works + disallows Class in proc return types disallows Class in proc return types + disallows Pointer in proc return types disallows Pointer in proc return types + disallows Pointer in proc notation return type disallows Pointer in proc notation return type + errors when using macro as proc value (top-level) (#7465) errors when using macro as proc value (top-level) (#7465) + disallows Number in captured block disallows Number in captured block + allows implicit cast of proc to return void in non-generic restriction allows implicit cast of proc to return void in non-generic restriction + allows metaclass in proc pointer allows metaclass in proc pointer + disallows Int in captured block disallows Int in captured block + types proc literal with return type (2) types proc literal with return type (2) + has proc literal as restriction and works when output not specified has proc literal as restriction and works when output not specified + *doesn't* merge Proc that returns NoReturn with another one that returns something else (#9971) *doesn't* merge Proc that returns NoReturn with another one that returns something else (#9971) + types proc literal with a type that was never instantiated types proc literal with a type that was never instantiated + disallows Object in proc return types disallows Object in proc return types + allows passing function to LibC without specifying types allows passing function to LibC without specifying types + allows passing NoReturn type for any return type (2) allows passing NoReturn type for any return type (2) + disallows Value in procs disallows Value in procs + disallows Number in proc notation return type disallows Number in proc notation return type + allows invoking a function with a generic subtype (1) allows invoking a function with a generic subtype (1) + disallows casting a proc type to one accepting more arguments disallows casting a proc type to one accepting more arguments + disallows Float in captured block disallows Float in captured block + allows new on proc type that is a lib alias allows new on proc type that is a lib alias + disallows Reference in captured block disallows Reference in captured block + accesses T inside variadic generic (2) accesses T inside variadic generic (2) + accesses T inside variadic generic accesses T inside variadic generic + disallows Class in proc pointer disallows Class in proc pointer + disallows Int in proc notation parameter type disallows Int in proc notation parameter type + allows passing virtual type including module to proc allows passing virtual type including module to proc + disallows Class in proc notation return type disallows Class in proc notation return type + disallows Pointer in proc pointer disallows Pointer in proc pointer + declares an instance variable with splat in proc notation declares an instance variable with splat in proc notation + disallows Proc in captured block disallows Proc in captured block + disallows Proc in proc return types disallows Proc in proc return types + disallows Class in procs disallows Class in procs + types proc pointer to instance method types proc pointer to instance method + unpacks tuple but doesn't override local variables, when using new (#9813) unpacks tuple but doesn't override local variables, when using new (#9813) + disallows Value in proc return types disallows Value in proc return types + accesses T inside variadic generic, in proc notation accesses T inside variadic generic, in proc notation + disallows Object in proc notation return type disallows Object in proc notation return type + can use @@cvar as pointer syntax receiver (#9239) can use @@cvar as pointer syntax receiver (#9239) + disallows Number in procs disallows Number in procs + forwards block and computes correct type (bug) forwards block and computes correct type (bug) + disallows casting a proc type to one accepting less arguments disallows casting a proc type to one accepting less arguments + virtualizes proc type (#6789) virtualizes proc type (#6789) + allows metaclass in proc notation return type allows metaclass in proc notation return type + disallows Tuple in proc return types disallows Tuple in proc return types + types proc pointer with types types proc pointer with types + disallows Tuple in proc notation return type disallows Tuple in proc notation return type + can assign proc that returns anything to proc that returns nil, with local var (#3655) can assign proc that returns anything to proc that returns nil, with local var (#3655) + gets pointer to lib fun without specifying types gets pointer to lib fun without specifying types + allows metaclass in captured block allows metaclass in captured block + disallows Class in captured block disallows Class in captured block + has proc literal as restriction and errors if output is different has proc literal as restriction and errors if output is different + disallows Int in proc pointer disallows Int in proc pointer + errors if inferred return type doesn't match return type restriction (1) errors if inferred return type doesn't match return type restriction (1) + errors if inferred return type doesn't match return type restriction (2) errors if inferred return type doesn't match return type restriction (2) + allows invoking a function with a generic subtype (2) allows invoking a function with a generic subtype (2) + disallows Float in proc notation parameter type disallows Float in proc notation parameter type + types proc call types proc call + disallows Float in proc return types disallows Float in proc return types + allows passing proc type if it is a lib alias allows passing proc type if it is a lib alias + disallows Reference in proc notation parameter type disallows Reference in proc notation parameter type + disallows StaticArray in proc notation parameter type disallows StaticArray in proc notation parameter type + allows passing NoReturn type for any return type (3) allows passing NoReturn type for any return type (3) + allows new on proc type allows new on proc type + has proc literal as restriction and errors if input is different has proc literal as restriction and errors if input is different + disallows Tuple in captured block disallows Tuple in captured block + types empty proc literal types empty proc literal + disallows Proc in procs disallows Proc in procs + types int -> int proc literal types int -> int proc literal + disallows StaticArray in captured block disallows StaticArray in captured block + types Proc(*T, Void) as Proc(*T, Nil) types Proc(*T, Void) as Proc(*T, Nil) + virtualizes proc type with -> (#8730) virtualizes proc type with -> (#8730) + disallows StaticArray in proc notation return type disallows StaticArray in proc notation return type + allows writing a function type with Proc allows writing a function type with Proc + can assign proc that returns anything to proc that returns nil, with instance var (#3655) can assign proc that returns anything to proc that returns nil, with instance var (#3655) + doesn't crash on constant to proc pointer doesn't crash on constant to proc pointer + errors when using macro as proc value (inside method) (#7465) errors when using macro as proc value (inside method) (#7465) + disallows Enum in captured block disallows Enum in captured block + disallows Struct in proc pointer disallows Struct in proc pointer + allows using proc arg name shadowing local variable allows using proc arg name shadowing local variable + disallows Reference in proc notation return type disallows Reference in proc notation return type + disallows Struct in proc notation parameter type disallows Struct in proc notation parameter type + disallows Pointer in captured block disallows Pointer in captured block + types a proc pointer with generic types types a proc pointer with generic types +Crystal::Init::InitProject + has proper contents has proper contents + correctly uses git config correctly uses git config Crystal::Macro - number methods - executes >> executes >> - executes ** executes ** - executes ^ executes ^ - executes math operations using U/Int128 executes math operations using U/Int128 - executes < (false) executes < (false) - executes >= (false) executes >= (false) - executes * executes * - executes | executes | - executes & executes & - executes <=> (returns nil) executes <=> (returns nil) - preserves integer size (#10713) preserves integer size (#10713) - executes + and preserves type executes + and preserves type - executes <= (false) executes <= (false) - executes unary ~ executes unary ~ - executes >= (true) executes >= (true) - executes - executes - - executes kind executes kind - executes // executes // - executes <= (true) executes <= (true) - executes unary + executes unary + - executes unary - executes unary - - #to_number #to_number - executes + with float executes + with float - executes + executes + - executes <=> executes <=> - executes > (true) executes > (true) - executes > (false) executes > (false) - executes << executes << - executes < (true) executes < (true) - executes % executes % - compares versions compares versions - Crystal::HashLiteral - #each - without the value argument - builds the correct array builds the correct array - without the key argument - builds the correct array builds the correct array - with both arguments - builds the correct array builds the correct array - without either argument - builds the correct array builds the correct array - executes double splat executes double splat + control expression methods + executes exp (nop) executes exp (nop) + executes exp executes exp + unary expression methods executes is_a? executes is_a? - executes of_key (nop) executes of_key (nop) - executes type executes type - executes to_a executes to_a - executes double splat with arg executes double splat with arg - executes double splat executes double splat - executes []= executes []= - executes sort_by executes sort_by - executes of_value executes of_value - executes type (nop) executes type (nop) - creates a hash literal with a var creates a hash literal with a var - executes size executes size - executes map executes map - executes keys executes keys - executes values executes values - executes empty? executes empty? - executes [] not found executes [] not found - executes [] executes [] - executes of_key executes of_key - executes of_value (nop) executes of_value (nop) - metaclass methods - executes resolve executes resolve - executes resolve? executes resolve? - executes instance executes instance - executes assign without output executes assign without output - instancevar methods - executes name executes name - if methods - executes then executes then - executes cond executes cond - executes else executes else - executes else (nop) executes else (nop) + executes exp executes exp symbol methods - forwards methods to string forwards methods to string - executes symbol != symbol executes symbol != symbol executes symbol == symbol executes symbol == symbol - global methods - executes name executes name - path methods - executes names executes names - executes global? executes global? - executes resolve? executes resolve? - executes global executes global - executes resolve executes resolve - executes types executes types - case methods - when - executes when conds executes when conds - executes else executes else - executes whens executes whens - executes exhaustive? executes exhaustive? - executes when body executes when body - executes cond executes cond - executes when exhaustive? executes when exhaustive? - in - executes whens executes whens - executes exhaustive? executes exhaustive? - executes when exhaustive? executes when exhaustive? - Crystal::ExternalVar - executes name executes name + executes symbol != symbol executes symbol != symbol + forwards methods to string forwards methods to string + uninitialized var methods executes type executes type + executes var executes var + Crystal::ExternalVar executes real_name executes real_name - annotation methods - executes [] with other ASTNode, but raises an error executes [] with other ASTNode, but raises an error - executes [] with StringLiteral executes [] with StringLiteral + executes type executes type executes name executes name - executes [] with MacroId executes [] with MacroId - executes [] with NumberLiteral executes [] with NumberLiteral - executes [] with SymbolLiteral executes [] with SymbolLiteral - node methods - executes == on numbers (true) executes == on numbers (true) - id - expands macro with id call on symbol expands macro with id call on symbol - expands macro with id call on number expands macro with id call on number - expands macro with id call on call expands macro with id call on call - expands macro with id call on string expands macro with id call on string - expands macro with id call on char expands macro with id call on char - executes == on symbols (true) (#240) executes == on symbols (true) (#240) - executes == on numbers (false) executes == on numbers (false) - #nil? - NilLiteral NilLiteral - Nop Nop - NumberLiteral NumberLiteral - #doc - returns an empty string if there are no docs on the node (wants_doc = false) returns an empty string if there are no docs on the node (wants_doc = false) - returns the call's docs if present (wants_doc = true) returns the call's docs if present (wants_doc = true) - returns a multiline comment returns a multiline comment - executes == on symbols (false) (#240) executes == on symbols (false) (#240) - executes != on numbers (true) executes != on numbers (true) - symbolize - expands macro with symbolize call on id expands macro with symbolize call on id - expands macro with symbolize call on symbol expands macro with symbolize call on symbol - expands macro with symbolize call on string expands macro with symbolize call on string - class_name - executes class_name executes class_name - executes class_name executes class_name - executes class_name executes class_name - executes class_name executes class_name - executes class_name executes class_name - executes class_name executes class_name - location - end line_number end line_number - line_number line_number - end column number end column number - column number column number - filename filename - stringify - expands macro with stringify call on symbol expands macro with stringify call on symbol - expands macro with stringify call on number expands macro with stringify call on number - expands macro with stringify call on string expands macro with stringify call on string - expands macro with stringify call on call expands macro with stringify call on call - #doc_comment - returns an empty MacroId if there are no docs on the node (wants_doc = false) returns an empty MacroId if there are no docs on the node (wants_doc = false) - returns the call's docs if present as a MacroId (wants_doc = true) returns the call's docs if present as a MacroId (wants_doc = true) - ensures each newline has a `#` prefix ensures each newline has a `#` prefix - #is_a? - union argument, undefined types union argument, undefined types - union argument, contains NoReturn union argument, contains NoReturn - union argument union argument - union argument, mergeable union argument, mergeable - union argument, duplicate type union argument, duplicate type - union argument, unimplemented types union argument, unimplemented types - executes != on numbers (false) executes != on numbers (false) - regex methods - executes source executes source - executes options executes options + #warning + emits a top level warning emits a top level warning + Crystal::EnumDef + executes kind executes kind + executes name executes name + executes body executes body + executes base_type executes base_type + visibility modifier methods + executes visibility executes visibility + executes exp executes exp + macro methods + executes args executes args + executes double_splat executes double_splat + executes splat_index executes splat_index + executes body executes body + executes block_arg executes block_arg + executes name executes name + executes visibility executes visibility proc notation methods + gets single input gets single input gets empty output gets empty output executes resolve executes resolve - executes resolve? executes resolve? gets single output gets single output - gets single input gets single input gets multiple inputs gets multiple inputs - macro if methods - executes then executes then - executes cond executes cond - executes else executes else + executes resolve? executes resolve? + call methods + executes named args name executes named args name + executes receiver executes receiver + executes block executes block + executes args executes args + executes name executes name + executes global? executes global? + executes named args value executes named args value + executes block arg executes block arg + executes block arg (nop) executes block arg (nop) + executes named args executes named args + compares versions compares versions + printing + pp! pp! + puts puts + print print + p p + pp pp + p! p! #parse_type - raises on extra unparsed tokens before the type raises on extra unparsed tokens before the type + path path raises on extra unparsed tokens after the type raises on extra unparsed tokens after the type + union - | union - | + raises on extra unparsed tokens before the type raises on extra unparsed tokens before the type union - Union union - Union - path path exposes syntax warnings exposes syntax warnings - union - | union - | - raises on empty string raises on empty string union - in generic union - in generic + generic generic proc proc + raises on empty string raises on empty string raises on non StringLiteral arguments raises on non StringLiteral arguments metaclass metaclass - generic generic - def methods - executes name executes name - executes visibility executes visibility - executes return_type executes return_type - executes receiver executes receiver - executes body executes body - executes double_splat executes double_splat - executes block_arg executes block_arg - executes abstract? executes abstract? - executes accepts_block? executes accepts_block? - executes splat_index executes splat_index - executes args executes args - executes free_vars executes free_vars - macro methods - executes body executes body - executes double_splat executes double_splat - executes name executes name - executes visibility executes visibility - executes splat_index executes splat_index - executes args executes args - executes block_arg executes block_arg - executes assign executes assign - Crystal::ModuleDef + executes assign without output executes assign without output + expressions methods + executes expressions executes expressions + Crystal::TypeNode + executes class_vars on metaclass executes class_vars on metaclass + executes class vars (with inheritance) executes class vars (with inheritance) + executes >= executes >= + #id + does not include trailing + for virtual type does not include trailing + for virtual type + executes ancestors (with generic) executes ancestors (with generic) + executes != executes != + executes instance_vars on metaclass executes instance_vars on metaclass + executes instance_vars executes instance_vars + executes methods executes methods + executes size of tuple executes size of tuple + executes size of tuple metaclass executes size of tuple metaclass executes type_vars executes type_vars - executes splat_index executes splat_index - executes name executes name - executes kind executes kind - executes body executes body - responds_to methods - executes receiver executes receiver + #name + generic type + includes the generic_args of the type by default includes the generic_args of the type by default + includes the generic_args of the instantiated type by default includes the generic_args of the instantiated type by default + generic_args + false + does not include the generic_args of the instantiated type does not include the generic_args of the instantiated type + does not include the generic_args of the type does not include the generic_args of the type + true + includes the generic_args of the instantiated type includes the generic_args of the instantiated type + includes the generic_args of the type includes the generic_args of the type + with an invalid type argument + should raise the proper exception should raise the proper exception + generic instance + does not print extra commas for empty splat type var (3) does not print extra commas for empty splat type var (3) + prints empty splat type var prints empty splat type var + prints multiple arguments for splat type var prints multiple arguments for splat type var + does not print extra commas for empty splat type var (2) does not print extra commas for empty splat type var (2) + does not print extra commas for empty splat type var (1) does not print extra commas for empty splat type var (1) + prints generic type arguments prints generic type arguments + simple type + returns the name of the type returns the name of the type + namespaced type + should return the FQN of the type should return the FQN of the type + executes == executes == + executes instance_vars on symbol type executes instance_vars on symbol type + #warning + emits a warning at a specific node emits a warning at a specific node + executes union_types (union) executes union_types (union) + #union? + true true + false false + executes superclass executes superclass + executes union_types (non-union) executes union_types (non-union) + executes instance executes instance + executes class executes class + executes resolve executes resolve + executes ancestors executes ancestors + #class? + Crystal::NonGenericClassType + class class + struct struct + Crystal::NonGenericModuleType Crystal::NonGenericModuleType + Crystal::GenericClassType + struct struct + class class + Crystal::GenericModuleType Crystal::GenericModuleType + executes class_vars on symbol type executes class_vars on symbol type + executes class vars executes class vars + #includers + returns an array of types `self` is directly included in returns an array of types `self` is directly included in + #module? + Crystal::GenericModuleType Crystal::GenericModuleType + Crystal::NonGenericClassType + struct struct + class class + Crystal::GenericClassType + struct struct + class class + Crystal::NonGenericModuleType Crystal::NonGenericModuleType + executes resolve? executes resolve? + #struct? + Crystal::NonGenericModuleType Crystal::NonGenericModuleType + Crystal::GenericClassType + class class + struct struct + Crystal::GenericModuleType Crystal::GenericModuleType + Crystal::NonGenericClassType + struct struct + class class + == and != devirtualize generic type arguments (#10730) == and != devirtualize generic type arguments (#10730) + #abstract? + Crystal::NonGenericClassType + struct + abstract abstract + non-abstract non-abstract + class + non-abstract non-abstract + abstract abstract + Crystal::GenericClassType + struct + abstract abstract + non-abstract non-abstract + class + non-abstract non-abstract + abstract abstract + Crystal::GenericModuleType Crystal::GenericModuleType + Crystal::NonGenericModuleType Crystal::NonGenericModuleType + executes <= executes <= + executes > executes > + #nilable? + true true + false false + executes class methods executes class methods + executes < executes < + instancevar methods executes name executes name - Crystal::LibDef + require methods + executes path executes path + Crystal::AnnotationDef executes kind executes kind executes name executes name executes body executes body - yield methods - executes expressions executes expressions - executes scope executes scope - executes scope (nop) executes scope (nop) - arg methods - executes name executes name - executes restriction executes restriction - executes default_value executes default_value - executes internal_name executes internal_name - uninitialized var methods - executes var executes var - executes type executes type - instancevar methods - executes name executes name - generic methods - executes types executes types - executes named_args executes named_args - executes name executes name - executes resolve? executes resolve? - executes resolve executes resolve - executes type_vars executes type_vars - Crystal::AsmOperand - executes constraint executes constraint - executes exp executes exp - union methods - executes resolve? executes resolve? - executes resolve executes resolve - executes types executes types - Crystal::TypeOf - executes args executes args - type declaration methods - executes var executes var - executes type executes type - executes value executes value - executes var when instance var executes var when instance var + or methods + executes left executes left + executes right executes right + regex methods + executes source executes source + executes options executes options + env + has key has key + doesn't have key doesn't have key Crystal::Asm - executes volatile? executes volatile? executes alignstack? executes alignstack? - executes intel? executes intel? - executes inputs executes inputs + executes outputs executes outputs executes can_throw? executes can_throw? + executes inputs executes inputs + executes intel? executes intel? executes text executes text - executes outputs executes outputs + executes volatile? executes volatile? executes clobbers executes clobbers - Crystal::AnnotationDef - executes name executes name - executes body executes body - executes kind executes kind - Crystal::Alias - executes name executes name - executes type executes type - multi_assign methods - executes targets executes targets - executes values executes values - Crystal::Extend + generic methods + executes named_args executes named_args + executes resolve? executes resolve? + executes types executes types + executes type_vars executes type_vars + executes resolve executes resolve executes name executes name - call methods - executes args executes args - executes block executes block + readinstancevar methods executes name executes name - executes block arg (nop) executes block arg (nop) - executes global? executes global? - executes named args value executes named args value - executes receiver executes receiver - executes block arg executes block arg - executes named args executes named args - executes named args name executes named args name - expressions methods - executes expressions executes expressions - printing - pp pp - p! p! - pp! pp! - p p - puts puts - print print - Crystal::EnumDef - executes base_type executes base_type + executes obj executes obj + Crystal::ModuleDef executes body executes body executes name executes name + executes splat_index executes splat_index executes kind executes kind - metavar methods - executes id executes id - executes is_a? executes is_a? - executes nothing executes nothing + executes type_vars executes type_vars + proc literal methods + executes return_type executes return_type + executes args executes args + executes body executes body + case methods + in + executes whens executes whens + executes when exhaustive? executes when exhaustive? + executes exhaustive? executes exhaustive? + when + executes when exhaustive? executes when exhaustive? + executes whens executes whens + executes when body executes when body + executes else executes else + executes exhaustive? executes exhaustive? + executes when conds executes when conds + executes cond executes cond + Crystal::Primitive executes name executes name + block methods + executes body executes body + executes splat_index executes splat_index + executes args executes args while methods executes cond executes cond executes body executes body - proc pointer methods + yield methods + executes expressions executes expressions + executes scope executes scope + executes scope (nop) executes scope (nop) + offsetof methods + executes type executes type + executes offset executes offset + Crystal::AsmOperand + executes exp executes exp + executes constraint executes constraint + Crystal::Extend executes name executes name - executes args when empty executes args when empty - executes obj when absent executes obj when absent - executes global? executes global? - executes obj when present executes obj when present - executes args when not empty executes args when not empty + macro for methods + executes vars executes vars + executes exp executes exp + executes body executes body + is_a methods + executes receiver executes receiver + executes arg executes arg Crystal::NamedTupleLiteral - executes keys executes keys - executes [] not found executes [] not found - executes [] executes [] - executes double splat executes double splat - executes double splat executes double splat + executes double splat with arg executes double splat with arg + #each + without either argument + builds the correct array builds the correct array + with both arguments + builds the correct array builds the correct array + without the key argument + builds the correct array builds the correct array + without the value argument + builds the correct array builds the correct array executes is_a? executes is_a? + executes [] executes [] + executes map executes map + executes keys executes keys executes size executes size executes to_a executes to_a - creates a named tuple literal with a var creates a named tuple literal with a var + executes empty? executes empty? + executes double splat executes double splat executes values executes values + creates a named tuple literal with a var creates a named tuple literal with a var + executes double splat executes double splat + executes [] not found executes [] not found + executes [] with invalid key type executes [] with invalid key type + executes []= executes []= + Crystal::CStructOrUnionDef + executes body executes body + executes union? executes union? + executes kind executes kind + executes name executes name + Crystal::LibDef + executes name executes name + executes kind executes kind + executes body executes body + Crystal::HashLiteral + executes map executes map + executes empty? executes empty? + executes sort_by executes sort_by + executes of_key (nop) executes of_key (nop) + executes double splat executes double splat + executes is_a? executes is_a? + executes double splat executes double splat #each - without the value argument - builds the correct array builds the correct array without either argument builds the correct array builds the correct array with both arguments builds the correct array builds the correct array without the key argument builds the correct array builds the correct array - executes empty? executes empty? - executes [] with invalid key type executes [] with invalid key type + without the value argument + builds the correct array builds the correct array + executes to_a executes to_a + executes double splat with arg executes double splat with arg + executes of_key executes of_key executes []= executes []= + executes type (nop) executes type (nop) + executes size executes size + executes [] not found executes [] not found + executes type executes type + executes [] executes [] + creates a hash literal with a var creates a hash literal with a var + executes of_value executes of_value + executes of_value (nop) executes of_value (nop) + executes values executes values + executes keys executes keys + union methods + executes types executes types + executes resolve executes resolve + executes resolve? executes resolve? + responds_to methods + executes receiver executes receiver + executes name executes name + Crystal::RangeLiteral + executes to_a executes to_a + executes excludes_end? executes excludes_end? executes map executes map - executes double splat with arg executes double splat with arg - require methods - executes path executes path + executes end executes end + executes begin executes begin + #each #each + char methods + executes ord executes ord + classvar methods + executes name executes name + def methods + executes free_vars executes free_vars + executes name executes name + executes splat_index executes splat_index + executes receiver executes receiver + executes accepts_block? executes accepts_block? + executes abstract? executes abstract? + executes return_type executes return_type + executes body executes body + executes args executes args + executes block_arg executes block_arg + executes visibility executes visibility + executes double_splat executes double_splat + Crystal::FunDef + executes body executes body + executes name executes name + executes return_type executes return_type + executes args executes args + executes variadic? executes variadic? + executes has_body? executes has_body? + executes real_name executes real_name + Crystal::Alias + executes name executes name + executes type executes type + Crystal::Include + executes name executes name + splat methods + executes exp executes exp string methods - executes string + char executes string + char - executes string includes? char (true) executes string includes? char (true) - executes string =~ (true) executes string =~ (true) - executes string starts_with? char (false) executes string starts_with? char (false) - executes empty executes empty - executes underscore executes underscore - executes string < string executes string < string - executes string ends_with? char (true) executes string ends_with? char (true) executes camelcase executes camelcase - executes titleize executes titleize - executes string > string executes string > string - executes lines executes lines executes upcase executes upcase - executes string starts_with? string (true) executes string starts_with? string (true) - executes string includes? char (false) executes string includes? char (false) - executes string includes? string (true) executes string includes? string (true) - executes string + string executes string + string - executes [] with incomplete range executes [] with incomplete range - executes string starts_with? string (false) executes string starts_with? string (false) - executes string == string executes string == string - executes size executes size - executes tr executes tr - executes [] with exclusive range executes [] with exclusive range - executes split with char argument executes split with char argument - executes count executes count + executes to_i executes to_i + executes string includes? string (false) executes string includes? string (false) executes strip executes strip executes [] with computed range executes [] with computed range - executes string =~ (false) executes string =~ (false) - executes to_i(base) executes to_i(base) - executes string < macroid executes string < macroid + executes string includes? char (true) executes string includes? char (true) + executes empty executes empty executes split without arguments executes split without arguments - executes gsub executes gsub - executes downcase executes downcase - executes string starts_with? char (true) executes string starts_with? char (true) - executes to_i executes to_i - executes string != string executes string != string - executes string ends_with? string (true) executes string ends_with? string (true) + executes string == string executes string == string executes camelcase with lower executes camelcase with lower - executes string > macroid executes string > macroid + executes split with char argument executes split with char argument + executes [] with incomplete range executes [] with incomplete range executes capitalize executes capitalize - executes string includes? string (false) executes string includes? string (false) - executes camelcase with invalid lower arg type executes camelcase with invalid lower arg type - executes chars executes chars - executes [] with inclusive range executes [] with inclusive range - executes string ends_with? string (false) executes string ends_with? string (false) + executes titleize executes titleize executes string chomp executes string chomp - executes split with argument executes split with argument + executes count executes count + executes to_i(base) executes to_i(base) + executes string ends_with? string (false) executes string ends_with? string (false) executes string ends_with? char (false) executes string ends_with? char (false) - block methods - executes body executes body - executes splat_index executes splat_index - executes args executes args - Crystal::ArrayLiteral - executes unshift executes unshift - executes index 0 executes index 0 - executes empty? executes empty? - executes find (finds) executes find (finds) - executes splat with splat executes splat with splat - executes reduce with no initial value executes reduce with no initial value - executes join executes join - executes push executes push - executes map executes map - #map_with_index - without either argument - returns the resulting array returns the resulting array - with both arguments - returns the resulting array returns the resulting array - without the index argument - returns the resulting array returns the resulting array - without the element argument - returns the resulting array returns the resulting array - executes [] with range executes [] with range - executes identify executes identify - executes sort with numbers executes sort with numbers - executes splat with symbols and strings executes splat with symbols and strings - executes map with arg executes map with arg - #+ - with ArrayLiteral argument - concatenates the literals into an ArrayLiteral concatenates the literals into an ArrayLiteral - with TupleLiteral argument - concatenates the literals into an ArrayLiteral concatenates the literals into an ArrayLiteral - executes [] with computed range executes [] with computed range - executes sort with ids executes sort with ids - executes reject executes reject executes size executes size - executes join with strings executes join with strings - executes type (nop) executes type (nop) - executes is_a? executes is_a? - #- - with ArrayLiteral argument - removes the elements in RHS from LHS into an ArrayLiteral removes the elements in RHS from LHS into an ArrayLiteral - with TupleLiteral argument - removes the elements in RHS from LHS into an ArrayLiteral removes the elements in RHS from LHS into an ArrayLiteral - executes reduce with initial value executes reduce with initial value - executes []= executes []= - #each_with_index - with both arguments - builds the correct array builds the correct array - without the index argument - builds the correct array builds the correct array - without either argument - builds the correct array builds the correct array - without the element argument - builds the correct array builds the correct array - #each #each - executes index out of bounds executes index out of bounds + executes string includes? string (true) executes string includes? string (true) + executes string < string executes string < string + executes [] with inclusive range executes [] with inclusive range + executes string > macroid executes string > macroid + executes tr executes tr + executes string ends_with? string (true) executes string ends_with? string (true) + executes downcase executes downcase + executes string includes? char (false) executes string includes? char (false) + executes string > string executes string > string + executes string < macroid executes string < macroid + executes [] with exclusive range executes [] with exclusive range + executes string starts_with? char (false) executes string starts_with? char (false) + executes string ends_with? char (true) executes string ends_with? char (true) + executes split with argument executes split with argument + executes string starts_with? string (true) executes string starts_with? string (true) + executes string starts_with? char (true) executes string starts_with? char (true) + executes string starts_with? string (false) executes string starts_with? string (false) + executes camelcase with invalid lower arg type executes camelcase with invalid lower arg type + executes string =~ (true) executes string =~ (true) + executes string =~ (false) executes string =~ (false) + executes underscore executes underscore + executes string + string executes string + string + executes string != string executes string != string + executes lines executes lines + executes string + char executes string + char + executes chars executes chars + executes gsub executes gsub + arg methods + executes default_value executes default_value + executes restriction executes restriction + executes internal_name executes internal_name + executes name executes name + Crystal::TypeDef executes type executes type - executes any? (true) executes any? (true) - executes splat executes splat - executes [] with incomplete range executes [] with incomplete range - executes select executes select - executes first executes first - executes last executes last - executes includes? executes includes? - executes all? (false) executes all? (false) - executes index 1 executes index 1 - executes map with constants executes map with constants - executes all? (true) executes all? (true) - executes uniq executes uniq - executes any? (false) executes any? (false) - executes sort with strings executes sort with strings - executes of executes of - executes sort with ids and strings executes sort with ids and strings - executes [] with two numbers executes [] with two numbers - executes of (nop) executes of (nop) - creates an array literal with a var creates an array literal with a var - executes find (doesn't find) executes find (doesn't find) - Crystal::Primitive executes name executes name + cast methods + executes obj executes obj + executes to executes to + type declaration methods + executes var executes var + executes type executes type + executes value executes value + executes var when instance var executes var when instance var + metaclass methods + executes instance executes instance + executes resolve executes resolve + executes resolve? executes resolve? + and methods + executes left executes left + executes right executes right + path methods + executes global executes global + executes global? executes global? + executes resolve? executes resolve? + executes types executes types + executes names executes names + executes resolve executes resolve + proc pointer methods + executes global? executes global? + executes name executes name + executes obj when present executes obj when present + executes args when not empty executes args when not empty + executes args when empty executes args when empty + executes obj when absent executes obj when absent + executes assign executes assign + flag? + doesn't have flag doesn't have flag + has flag has flag + nilable cast methods + executes obj executes obj + executes to executes to + instancevar methods + executes name executes name + assign methods + executes target executes target + executes value executes value Crystal::TupleLiteral - executes first executes first - executes select executes select - executes last executes last + executes sort with ids and strings executes sort with ids and strings + executes find (finds) executes find (finds) + executes map with arg executes map with arg + #each #each #- with ArrayLiteral argument removes the elements in RHS from LHS into a TupleLiteral removes the elements in RHS from LHS into a TupleLiteral with TupleLiteral argument removes the elements in RHS from LHS into a TupleLiteral removes the elements in RHS from LHS into a TupleLiteral - #each #each - executes sort with ids executes sort with ids - executes join executes join - executes join with strings executes join with strings + executes size executes size executes find (doesn't find) executes find (doesn't find) - executes sort with ids and strings executes sort with ids and strings - executes sort with strings executes sort with strings + creates a tuple literal with a var creates a tuple literal with a var executes [] with range executes [] with range - executes splat with splat executes splat with splat - executes uniq executes uniq + executes select executes select + executes [] with 0 executes [] with 0 + executes [] with incomplete range executes [] with incomplete range + executes sort with numbers executes sort with numbers + executes any? (true) executes any? (true) + executes all? (false) executes all? (false) + executes any? (false) executes any? (false) + executes reject executes reject + #+ + with ArrayLiteral argument + concatenates the literals into a TupleLiteral concatenates the literals into a TupleLiteral + with TupleLiteral argument + concatenates the literals into a TupleLiteral concatenates the literals into a TupleLiteral + executes map with constants executes map with constants + executes empty? executes empty? executes [] with computed range executes [] with computed range #map_with_index - without either argument - returns the resulting tuple returns the resulting tuple with both arguments returns the resulting tuple returns the resulting tuple without the element argument returns the resulting tuple returns the resulting tuple + without either argument + returns the resulting tuple returns the resulting tuple without the index argument returns the resulting tuple returns the resulting tuple - executes map executes map + executes sort with strings executes sort with strings + executes unshift executes unshift executes is_a? executes is_a? - executes any? (false) executes any? (false) - executes [] with incomplete range executes [] with incomplete range - executes reject executes reject - executes [] out of bounds executes [] out of bounds executes push executes push - executes [] with 0 executes [] with 0 - executes all? (false) executes all? (false) - executes all? (true) executes all? (true) - executes empty? executes empty? - executes unshift executes unshift - creates a tuple literal with a var creates a tuple literal with a var - executes [] with 1 executes [] with 1 - executes map with arg executes map with arg - executes find (finds) executes find (finds) - executes map with constants executes map with constants - executes splat executes splat - executes splat with arg executes splat with arg - executes any? (true) executes any? (true) - executes includes? executes includes? - #+ - with TupleLiteral argument - concatenates the literals into a TupleLiteral concatenates the literals into a TupleLiteral - with ArrayLiteral argument - concatenates the literals into a TupleLiteral concatenates the literals into a TupleLiteral + executes join executes join + executes splat with splat executes splat with splat executes splat with symbols and strings executes splat with symbols and strings + executes first executes first + executes includes? executes includes? + executes uniq executes uniq #each_with_index - without the index argument - builds the correct array builds the correct array without either argument builds the correct array builds the correct array + without the index argument + builds the correct array builds the correct array with both arguments builds the correct array builds the correct array without the element argument builds the correct array builds the correct array - executes size executes size - executes sort with numbers executes sort with numbers - nilable cast methods - executes to executes to - executes obj executes obj - flag? - doesn't have flag doesn't have flag - has flag has flag - unary expression methods - executes exp executes exp - executes is_a? executes is_a? - splat methods - executes exp executes exp - Crystal::TypeNode - #class? - Crystal::GenericClassType - struct struct - class class - Crystal::NonGenericClassType - class class - struct struct - Crystal::GenericModuleType Crystal::GenericModuleType - Crystal::NonGenericModuleType Crystal::NonGenericModuleType - executes type_vars executes type_vars - executes union_types (non-union) executes union_types (non-union) - #abstract? - Crystal::NonGenericModuleType Crystal::NonGenericModuleType - Crystal::GenericClassType - struct - non-abstract non-abstract - abstract abstract - class - non-abstract non-abstract - abstract abstract - Crystal::NonGenericClassType - struct - non-abstract non-abstract - abstract abstract - class - abstract abstract - non-abstract non-abstract - Crystal::GenericModuleType Crystal::GenericModuleType - == and != devirtualize generic type arguments (#10730) == and != devirtualize generic type arguments (#10730) - executes == executes == - executes instance_vars executes instance_vars - #union? - true true - false false - executes < executes < - executes >= executes >= - executes != executes != - #nilable? - false false - true true - executes instance_vars on metaclass executes instance_vars on metaclass - executes size of tuple metaclass executes size of tuple metaclass - #includers - returns an array of types `self` is directly included in returns an array of types `self` is directly included in - executes instance_vars on symbol type executes instance_vars on symbol type - #warning - emits a warning at a specific node emits a warning at a specific node - executes <= executes <= - #struct? - Crystal::NonGenericClassType - struct struct - class class - Crystal::GenericClassType - class class - struct struct - Crystal::NonGenericModuleType Crystal::NonGenericModuleType - Crystal::GenericModuleType Crystal::GenericModuleType - executes methods executes methods - executes class_vars on metaclass executes class_vars on metaclass - executes ancestors executes ancestors - executes size of tuple executes size of tuple - #module? - Crystal::NonGenericModuleType Crystal::NonGenericModuleType - Crystal::GenericModuleType Crystal::GenericModuleType - Crystal::GenericClassType - class class - struct struct - Crystal::NonGenericClassType - class class - struct struct - #name - generic instance - does not print extra commas for empty splat type var (3) does not print extra commas for empty splat type var (3) - does not print extra commas for empty splat type var (2) does not print extra commas for empty splat type var (2) - prints generic type arguments prints generic type arguments - prints empty splat type var prints empty splat type var - does not print extra commas for empty splat type var (1) does not print extra commas for empty splat type var (1) - prints multiple arguments for splat type var prints multiple arguments for splat type var - generic_args - false - does not include the generic_args of the instantiated type does not include the generic_args of the instantiated type - does not include the generic_args of the type does not include the generic_args of the type - true - includes the generic_args of the type includes the generic_args of the type - includes the generic_args of the instantiated type includes the generic_args of the instantiated type - with an invalid type argument - should raise the proper exception should raise the proper exception - simple type - returns the name of the type returns the name of the type - namespaced type - should return the FQN of the type should return the FQN of the type - generic type - includes the generic_args of the type by default includes the generic_args of the type by default - includes the generic_args of the instantiated type by default includes the generic_args of the instantiated type by default - executes class vars executes class vars - executes class_vars on symbol type executes class_vars on symbol type - executes > executes > - executes class methods executes class methods - executes ancestors (with generic) executes ancestors (with generic) - #id - does not include trailing + for virtual type does not include trailing + for virtual type - executes class executes class - executes resolve? executes resolve? - executes superclass executes superclass - executes class vars (with inheritance) executes class vars (with inheritance) - executes union_types (union) executes union_types (union) - executes instance executes instance - executes resolve executes resolve - and methods - executes left executes left - executes right executes right - char methods - executes ord executes ord - Crystal::TypeDef - executes type executes type - executes name executes name - env - has key has key - doesn't have key doesn't have key - offsetof methods - executes type executes type - executes offset executes offset - cast methods - executes obj executes obj - executes to executes to - proc literal methods - executes return_type executes return_type - executes args executes args + executes splat with arg executes splat with arg + executes join with strings executes join with strings + executes last executes last + executes all? (true) executes all? (true) + executes [] with 1 executes [] with 1 + executes [] out of bounds executes [] out of bounds + executes splat executes splat + executes map executes map + executes sort with ids executes sort with ids + exception handler methods + executes ensure executes ensure + executes else (nop) executes else (nop) executes body executes body + executes rescues executes rescues + executes rescue types executes rescue types + executes rescue name executes rescue name + executes rescue body executes rescue body + executes ensure (nop) executes ensure (nop) + executes else executes else + Crystal::TypeOf + executes args executes args + multi_assign methods + executes targets executes targets + executes values executes values + macro if methods + executes cond executes cond + executes else executes else + executes then executes then Crystal::ClassDef + executes body executes body + executes abstract? executes abstract? + executes superclass executes superclass executes struct? executes struct? executes kind executes kind - executes splat_index executes splat_index - executes superclass executes superclass - executes body executes body executes type_vars executes type_vars executes name executes name - executes abstract? executes abstract? - control expression methods - executes exp (nop) executes exp (nop) - executes exp executes exp - assign methods - executes target executes target - executes value executes value - Crystal::FunDef - executes real_name executes real_name - executes has_body? executes has_body? - executes body executes body - executes name executes name - executes return_type executes return_type - executes args executes args - executes variadic? executes variadic? - classvar methods + executes splat_index executes splat_index + if methods + executes cond executes cond + executes else executes else + executes else (nop) executes else (nop) + executes then executes then + number methods + executes kind executes kind + executes // executes // + executes + with float executes + with float + executes & executes & + executes - executes - + executes + and preserves type executes + and preserves type + executes unary + executes unary + + executes <= (false) executes <= (false) + executes > (true) executes > (true) + executes ** executes ** + executes unary - executes unary - + executes math operations using U/Int128 executes math operations using U/Int128 + executes <=> (returns nil) executes <=> (returns nil) + executes > (false) executes > (false) + executes | executes | + executes << executes << + #to_number #to_number + executes < (true) executes < (true) + executes <= (true) executes <= (true) + executes >= (false) executes >= (false) + executes ^ executes ^ + preserves integer size (#10713) preserves integer size (#10713) + executes >= (true) executes >= (true) + executes < (false) executes < (false) + executes >> executes >> + executes unary ~ executes unary ~ + executes <=> executes <=> + executes + executes + + executes % executes % + executes * executes * + node methods + executes != on numbers (false) executes != on numbers (false) + #doc_comment + ensures each newline has a `#` prefix ensures each newline has a `#` prefix + returns an empty MacroId if there are no docs on the node (wants_doc = false) returns an empty MacroId if there are no docs on the node (wants_doc = false) + returns the call's docs if present as a MacroId (wants_doc = true) returns the call's docs if present as a MacroId (wants_doc = true) + executes != on numbers (true) executes != on numbers (true) + class_name + executes class_name executes class_name + executes class_name executes class_name + executes class_name executes class_name + executes class_name executes class_name + executes class_name executes class_name + executes class_name executes class_name + #nil? + Nop Nop + NumberLiteral NumberLiteral + NilLiteral NilLiteral + #doc + returns a multiline comment returns a multiline comment + returns the call's docs if present (wants_doc = true) returns the call's docs if present (wants_doc = true) + returns an empty string if there are no docs on the node (wants_doc = false) returns an empty string if there are no docs on the node (wants_doc = false) + executes == on symbols (false) (#240) executes == on symbols (false) (#240) + location + column number column number + filename filename + line_number line_number + end column number end column number + end line_number end line_number + executes == on numbers (false) executes == on numbers (false) + id + expands macro with id call on symbol expands macro with id call on symbol + expands macro with id call on string expands macro with id call on string + expands macro with id call on call expands macro with id call on call + expands macro with id call on number expands macro with id call on number + expands macro with id call on char expands macro with id call on char + executes == on numbers (true) executes == on numbers (true) + symbolize + expands macro with symbolize call on string expands macro with symbolize call on string + expands macro with symbolize call on symbol expands macro with symbolize call on symbol + expands macro with symbolize call on id expands macro with symbolize call on id + executes == on symbols (true) (#240) executes == on symbols (true) (#240) + #is_a? + union argument union argument + union argument, unimplemented types union argument, unimplemented types + union argument, duplicate type union argument, duplicate type + union argument, contains NoReturn union argument, contains NoReturn + union argument, undefined types union argument, undefined types + union argument, mergeable union argument, mergeable + stringify + expands macro with stringify call on number expands macro with stringify call on number + expands macro with stringify call on symbol expands macro with stringify call on symbol + expands macro with stringify call on string expands macro with stringify call on string + expands macro with stringify call on call expands macro with stringify call on call + metavar methods + executes nothing executes nothing + executes is_a? executes is_a? executes name executes name - readinstancevar methods + executes id executes id + annotation methods + executes [] with StringLiteral executes [] with StringLiteral executes name executes name - executes obj executes obj - or methods - executes right executes right - executes left executes left - visibility modifier methods - executes exp executes exp - executes visibility executes visibility - macro for methods - executes body executes body - executes vars executes vars - executes exp executes exp - Crystal::CStructOrUnionDef + executes [] with NumberLiteral executes [] with NumberLiteral + executes [] with other ASTNode, but raises an error executes [] with other ASTNode, but raises an error + executes [] with MacroId executes [] with MacroId + executes [] with SymbolLiteral executes [] with SymbolLiteral + global methods executes name executes name - executes union? executes union? - executes kind executes kind - executes body executes body - Crystal::RangeLiteral - executes map executes map - executes end executes end - #each #each - executes excludes_end? executes excludes_end? - executes to_a executes to_a - executes begin executes begin - is_a methods - executes arg executes arg - executes receiver executes receiver macro id methods forwards methods to string forwards methods to string compares with symbol compares with symbol compares with string compares with string - Crystal::Include - executes name executes name - exception handler methods - executes else (nop) executes else (nop) - executes body executes body - executes ensure (nop) executes ensure (nop) - executes rescues executes rescues - executes rescue name executes rescue name - executes rescue types executes rescue types - executes rescue body executes rescue body - executes ensure executes ensure - executes else executes else - #warning - emits a top level warning emits a top level warning -Semantic: new - inherits initialize and new methods if doesn't define new (#3238) inherits initialize and new methods if doesn't define new (#3238) - evaluates initialize default value at the instance scope (1) (#731) evaluates initialize default value at the instance scope (1) (#731) - evaluates initialize default value at the instance scope (5) (#731) evaluates initialize default value at the instance scope (5) (#731) - errors if using self call in default argument (3) errors if using self call in default argument (3) - evaluates initialize default value at the instance scope (4) (#731) evaluates initialize default value at the instance scope (4) (#731) - evaluates initialize default value at the instance scope (3) (#731) evaluates initialize default value at the instance scope (3) (#731) - doesn't have default new for inherited class from generic type doesn't have default new for inherited class from generic type - evaluates initialize default value at the instance scope (6) (#731) evaluates initialize default value at the instance scope (6) (#731) - errors if using self call in default argument (1) errors if using self call in default argument (1) - errors if using self call in default argument (2) errors if using self call in default argument (2) - uses correct receiver for `initialize` in namespaced generic classes (#4086) uses correct receiver for `initialize` in namespaced generic classes (#4086) - evaluates initialize default value at the instance scope (2) (#731) evaluates initialize default value at the instance scope (2) (#731) - doesn't incorrectly redefines new for generic class doesn't incorrectly redefines new for generic class -Code gen: def with default value - codegens def new with one default value codegens def new with one default value - considers first the one with more arguments considers first the one with more arguments - considers first the one with a restriction considers first the one with a restriction - codegens def with one default value codegens def with one default value - resolves expanded call to current type, not to virtual type resolves expanded call to current type, not to virtual type - doesn't mix types of instance vars with initialize and new doesn't mix types of instance vars with initialize and new -Parser warnings - warns on suffix-less UInt64 literals > Int64::MAX warns on suffix-less UInt64 literals > Int64::MAX - warns on missing space before colon - in return type restriction in return type restriction - in block param type restriction in block param type restriction - in type declaration in type declaration - in anonymous block param type restriction in anonymous block param type restriction -Codegen: private - codegens class vars of private types with same name (#11620) codegens class vars of private types with same name (#11620) - codegens overloaded private def in same file codegens overloaded private def in same file - codegens class var of private type with same name as public type (#11620) codegens class var of private type with same name as public type (#11620) - codegens private def in same file codegens private def in same file - doesn't include filename for private types doesn't include filename for private types -Crystal::Doc::MarkdDocRenderer - renders links - renders "[`Foo`](http://example.com/foo)" renders "[`Foo`](http://example.com/foo)" - renders "[filter](https://docs.celestine.dev/Celestine/Meta/Context.html#filter(&block:Celestine::Filter-%3ECelestine::Filter)-instance-method)" renders "[filter](https://docs.celestine.dev/Celestine/Meta/Context.html#filter(&block:Celestine::Filter-%3ECelestine::Filter)-instance-method)" - renders "[foo](http://example.com/foo)" renders "[foo](http://example.com/foo)" - renders html - renders "

Foo

" renders "

Foo

" - expand_code_links - doesn't find parents' methods doesn't find parents' methods - doesn't find parents' methods doesn't find parents' methods - finds methods of a type finds methods of a type - finds method with args finds method with args - does not break when referencing lib type (#9928) does not break when referencing lib type (#9928) - finds method with args even with empty brackets finds method with args even with empty brackets - finds method with unspecified args finds method with unspecified args - finds absolute type finds absolute type - finds sibling methods with self receiver finds sibling methods with self receiver - finds multiple methods with brackets finds multiple methods with brackets - finds nested type finds nested type - doesn't find substrings for methods doesn't find substrings for methods - matches methods on single-character class names matches methods on single-character class names - doesn't match with different separator doesn't match with different separator - doesn't find wrong kind of sibling methods doesn't find wrong kind of sibling methods - finds constant finds constant - finds method with zero args finds method with zero args - doesn't find method with wrong number of args doesn't find method with wrong number of args - finds method with question mark finds method with question mark - doesn't find wrong absolute type doesn't find wrong absolute type - doesn't find sibling methods of wrong type doesn't find sibling methods of wrong type - finds method with exclamation mark finds method with exclamation mark - finds multiple kinds of things finds multiple kinds of things - finds operator method with unspecified args finds operator method with unspecified args - doesn't find wrong kind of methods doesn't find wrong kind of methods - doesn't find sibling methods with fake receiver doesn't find sibling methods with fake receiver - finds method of an absolute type finds method of an absolute type - doesn't spuriously match range literals doesn't spuriously match range literals - doesn't find type not at word boundary doesn't find type not at word boundary - finds sibling methods finds sibling methods - doesn't find method with wrong number of args doesn't find method with wrong number of args - finds types from nested finds types from nested - finds types from base finds types from base - finds operator method finds operator method - finds sibling methods finds sibling methods - renders code blocks - renders "```\nHello\nWorld\n```" renders "```\nHello\nWorld\n```" - renders "```cr\nHello\nWorld\n```" renders "```cr\nHello\nWorld\n```" - renders "```crystal\nHello\nWorld\n```" renders "```crystal\nHello\nWorld\n```" - renders headline - renders "## Foo Bar\n### Sub\n## Bar Baz\n### Sub" renders "## Foo Bar\n### Sub\n## Bar Baz\n### Sub" - renders "## Foo Bar" renders "## Foo Bar" - renders code spans - renders "`